Detaylı Mob Target İnfo Tam Sistem - V1

taşlar gözükmesin isteyen arkadşlar item_manager.cppden TARGET INFORMATION içinde IsStone olan yeri kaldırsın taşlar gözükmüyor
Öyle yaparsan hiç görünmez, pack kısmında uitarget.pyden doğru satırları yorum satırına aldığınız zaman, taşları tek tek ekleyebilirsiniz.
Yinede tavsiyen için teşekkürler.
 
Bu sistemde oyuncularıda yaratık gibi algılayıp drop list açıyordu yani oyuncuyla duello yaptığında veya pk açtığında sanki mob gibi algılıyordu düzeldimi o ?
 
item_manager.cpp:770: error: prototype for 'bool ITEM_MANAGER::CreateDropItemVector(CHARACTER*, CHARACTER*, std::vector<CItem*, std::allocator<CItem*> >&)' does not match any in class 'ITEM_MANAGER'
item_manager.h:394: error: candidate is: bool ITEM_MANAGER::CreateDropItemVector(CHARACTER*, CHARACTER*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >&)
item_manager.cpp: In member function 'bool ITEM_MANAGER::CreateDropItemVector(CHARACTER*, CHARACTER*, std::vector<CItem*, std::allocator<CItem*> >&)':
item_manager.cpp:785: error: 'decltype' was not declared in this scope
item_manager.cpp:785: error: expected `;' before 'v'
item_manager.cpp:787: error: 'v' was not declared in this scope
item_manager.cpp:837: error: 'decltype' was not declared in this scope
item_manager.cpp:837: error: expected `;' before 'v'
item_manager.cpp:839: error: 'v' was not declared in this scope
item_manager.cpp:859: error: 'decltype' was not declared in this scope
item_manager.cpp:859: error: expected `;' before 'v'
item_manager.cpp:861: error: 'v' was not declared in this scope
compiling matrix_card.cpp
gmake: *** [.obj/item_manager.o] Error 1

bu hatayı eskiden çözmüştüm simdi unutum yardım edebilirmisiniz
 
item_manager.cpp:770: error: prototype for 'bool ITEM_MANAGER::CreateDropItemVector(CHARACTER*, CHARACTER*, std::vector<CItem*, std::allocator<CItem*> >&)' does not match any in class 'ITEM_MANAGER'
item_manager.h:394: error: candidate is: bool ITEM_MANAGER::CreateDropItemVector(CHARACTER*, CHARACTER*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >&)
item_manager.cpp: In member function 'bool ITEM_MANAGER::CreateDropItemVector(CHARACTER*, CHARACTER*, std::vector<CItem*, std::allocator<CItem*> >&)':
item_manager.cpp:785: error: 'decltype' was not declared in this scope
item_manager.cpp:785: error: expected `;' before 'v'
item_manager.cpp:787: error: 'v' was not declared in this scope
item_manager.cpp:837: error: 'decltype' was not declared in this scope
item_manager.cpp:837: error: expected `;' before 'v'
item_manager.cpp:839: error: 'v' was not declared in this scope
item_manager.cpp:859: error: 'decltype' was not declared in this scope
item_manager.cpp:859: error: expected `;' before 'v'
item_manager.cpp:861: error: 'v' was not declared in this scope
compiling matrix_card.cpp
gmake: *** [.obj/item_manager.o] Error 1

bu hatayı eskiden çözmüştüm simdi unutum yardım edebilirmisiniz
decltype tipi yalnızca C++11 ve üstü sürümlerde destekleniyor, kullandığınız derleyici eski olduğu için uyum sorunu yaşıyorsunuz.
 
burda görsel bi hata varda bunu nasıl çözebiliriz
1762696129340.webp
 
burda görsel bi hata varda bunu nasıl çözebiliriz
26773 eklentisini görüntüle
Merhaba arkadaşlar,
Olabildiğince sade anlatmaya çalışacağım.
Bu pencerenin pozisyon değerleri ;
uitarget.py:
Genişlet Daralt Kopyala
            def __UpdatePosition(self, targetBoard):
                self.SetPosition(targetBoard.GetLeft() + (targetBoard.GetWidth() - self.GetWidth()) / 2, targetBoard.GetBottom() - 17)
Buradaki SetPosition kısmından düzenleniyor. Kodda gördüğünüz gibi x değeri : targetBoard.GetLeft() + (targetBoard.GetWidth() - self.GetWidth()) / 2 değerini alırken, y değeri : targetBoard.GetBottom() - 17 değerini alıyor. Arkadaşta extradan
if app.ENABLE_TARGET_HP_SYSTEM:
sistemi var buda üst kısma yazı eklediği için, pencerede kaymaya sebep oluyor. Buradaki y değerine göre kendisi ayarladı ve pencere düzeldi. Bu şekilde kayma yaşayan olursa eklediğiniz sistemlere göre pencere yerini ayarlayabilirsiniz. Değeri -1 yaptı bu arada yapmak isteyen varsa.
 
Oyuna giriş yapıyorum. Ne oyundaki npclerin ismi gözüküyor ne mobların ne de oyuncuların. "?" işaretine basınca da oyundan atıyor. Nerede yanlış yaptım yardımcı olabilecek var mıdır? Ui.Py, Syserr ve oyundan görüntüyü bırakıyorum eke

Ui direkt eklenmediği için buraya ekledim:
 

Dosya Eklentileri

  • syserr.txt
    syserr.txt
    572 byte · Gösterim: 4
  • 1231_164206.webp
    1231_164206.webp
    389 KB · Gösterim: 254
Oyuna giriş yapıyorum. Ne oyundaki npclerin ismi gözüküyor ne mobların ne de oyuncuların. "?" işaretine basınca da oyundan atıyor. Nerede yanlış yaptım yardımcı olabilecek var mıdır? Ui.Py, Syserr ve oyundan görüntüyü bırakıyorum eke

Ui direkt eklenmediği için buraya ekledim:
Syserr de söylüyor zaten ThinBoard classında clickEvent fonksiyonu eksik.
 
Syserr de söylüyor zaten ThinBoard classında clickEvent fonksiyonu eksik.
Hocam konuda belirtildiği şekilde ekledim ama nerede yanlışlık yapmışım
Class:
Genişlet Daralt Kopyala
class ThinBoard(Window):

    CORNER_WIDTH = 16
    CORNER_HEIGHT = 16
    LINE_WIDTH = 16
    LINE_HEIGHT = 16
    BOARD_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.51)

    LT = 0
    LB = 1
    RT = 2
    RB = 3
    L = 0
    R = 1
    T = 2
    B = 3

    def __init__(self, layer = "UI"):
        Window.__init__(self, layer)

        CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
        LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]

        self.Corners = []
        for fileName in CornerFileNames:
            Corner = ExpandedImageBox()
            Corner.AddFlag("attach")
            Corner.AddFlag("not_pick")
            Corner.LoadImage(fileName)
            Corner.SetParent(self)
            Corner.SetPosition(0, 0)
            Corner.Show()
            self.Corners.append(Corner)

        self.Lines = []
        for fileName in LineFileNames:
            Line = ExpandedImageBox()
            Line.AddFlag("attach")
            Line.AddFlag("not_pick")
            Line.LoadImage(fileName)
            Line.SetParent(self)
            Line.SetPosition(0, 0)
            Line.Show()
            self.Lines.append(Line)

        Base = Bar()
        Base.SetParent(self)
        Base.AddFlag("attach")
        Base.AddFlag("not_pick")
        Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT)
        Base.SetColor(self.BOARD_COLOR)
        Base.Show()
        self.Base = Base

        self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT)
        self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0)

    def __del__(self):
        Window.__del__(self)

    if app.ENABLE_TARGET_INFORMATION_SYSTEM:
        def ShowCorner(self, corner):
            self.Corners[corner].Show()
            self.SetSize(self.GetWidth(), self.GetHeight())

        def HideCorners(self, corner):
            self.Corners[corner].Hide()
            self.SetSize(self.GetWidth(), self.GetHeight())

        def ShowLine(self, line):
            self.Lines[line].Show()
            self.SetSize(self.GetWidth(), self.GetHeight())

        def HideLine(self, line):
            self.Lines[line].Hide()
            self.SetSize(self.GetWidth(), self.GetHeight())

    def SetSize(self, width, height):

        width = max(self.CORNER_WIDTH*2, width)
        height = max(self.CORNER_HEIGHT*2, height)
        Window.SetSize(self, width, height)

        self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT)
        self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0)
        self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT)
        self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT)
        self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT)

        verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT
        horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH
        self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
        self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
        self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
        self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
        self.Base.SetSize(width - self.CORNER_WIDTH*2, height - self.CORNER_HEIGHT*2)

    def ShowInternal(self):
        self.Base.Show()
        for wnd in self.Lines:
            wnd.Show()
        for wnd in self.Corners:
            wnd.Show()

    def HideInternal(self):
        self.Base.Hide()
        for wnd in self.Lines:
            wnd.Hide()
        for wnd in self.Corners:
            wnd.Hide()
 
Hocam konuda belirtildiği şekilde ekledim ama nerede yanlışlık yapmışım
Class:
Genişlet Daralt Kopyala
class ThinBoard(Window):

    CORNER_WIDTH = 16
    CORNER_HEIGHT = 16
    LINE_WIDTH = 16
    LINE_HEIGHT = 16
    BOARD_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.51)

    LT = 0
    LB = 1
    RT = 2
    RB = 3
    L = 0
    R = 1
    T = 2
    B = 3

    def __init__(self, layer = "UI"):
        Window.__init__(self, layer)

        CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
        LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]

        self.Corners = []
        for fileName in CornerFileNames:
            Corner = ExpandedImageBox()
            Corner.AddFlag("attach")
            Corner.AddFlag("not_pick")
            Corner.LoadImage(fileName)
            Corner.SetParent(self)
            Corner.SetPosition(0, 0)
            Corner.Show()
            self.Corners.append(Corner)

        self.Lines = []
        for fileName in LineFileNames:
            Line = ExpandedImageBox()
            Line.AddFlag("attach")
            Line.AddFlag("not_pick")
            Line.LoadImage(fileName)
            Line.SetParent(self)
            Line.SetPosition(0, 0)
            Line.Show()
            self.Lines.append(Line)

        Base = Bar()
        Base.SetParent(self)
        Base.AddFlag("attach")
        Base.AddFlag("not_pick")
        Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT)
        Base.SetColor(self.BOARD_COLOR)
        Base.Show()
        self.Base = Base

        self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT)
        self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0)

    def __del__(self):
        Window.__del__(self)

    if app.ENABLE_TARGET_INFORMATION_SYSTEM:
        def ShowCorner(self, corner):
            self.Corners[corner].Show()
            self.SetSize(self.GetWidth(), self.GetHeight())

        def HideCorners(self, corner):
            self.Corners[corner].Hide()
            self.SetSize(self.GetWidth(), self.GetHeight())

        def ShowLine(self, line):
            self.Lines[line].Show()
            self.SetSize(self.GetWidth(), self.GetHeight())

        def HideLine(self, line):
            self.Lines[line].Hide()
            self.SetSize(self.GetWidth(), self.GetHeight())

    def SetSize(self, width, height):

        width = max(self.CORNER_WIDTH*2, width)
        height = max(self.CORNER_HEIGHT*2, height)
        Window.SetSize(self, width, height)

        self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT)
        self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0)
        self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT)
        self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT)
        self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT)

        verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT
        horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH
        self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
        self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
        self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
        self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
        self.Base.SetSize(width - self.CORNER_WIDTH*2, height - self.CORNER_HEIGHT*2)

    def ShowInternal(self):
        self.Base.Show()
        for wnd in self.Lines:
            wnd.Show()
        for wnd in self.Corners:
            wnd.Show()

    def HideInternal(self):
        self.Base.Hide()
        for wnd in self.Lines:
            wnd.Hide()
        for wnd in self.Corners:
            wnd.Hide()
knk sistemde click event ekleniyor. Sende daha önce eklemediğin için ufak bi yer eksik.
ui.py:
Genişlet Daralt Kopyala
class Window(object):
    def NoneMethod(cls):
        pass

    NoneMethod = classmethod(NoneMethod)

    def __init__(self, layer = "UI"):

Altına ekle

ui.py:
Genişlet Daralt Kopyala
        self.clickEvent = None
Muhtemelen çözülecektir. Başka yerde hatan yoksa.
 
Ekran Görüntüsü (428).webp

Babayiğitler burda mı:) sevgili arkadaşlar alanda yeniyim böyle bir sorunla karşılaştım. desteklerinizi bekliyorum.
 
kodda bellek sızıntısı mevcut paket gönderildikten sonra oluşturulan itemler bellekten silinmiyor. altta düzenlemeyi verdim ama denedim bir hata alırsanız iletin

Fonksiyonu bu şekilde değiştir:
Genişlet Daralt Kopyala
void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData;
    LPCHARACTER m_pkChrTarget = CHARACTER_MANAGER::instance().Find(p->dwVID);
    if (!ch || !m_pkChrTarget)
        return;
    if (!ch->GetDesc())
        return;
    if (!m_pkChrTarget->IsMonster() && !m_pkChrTarget->IsStone())
        return;

    static std::vector<LPITEM> s_vec_item;
    if (ITEM_MANAGER::instance().CreateDropItemVector(m_pkChrTarget, ch, s_vec_item))
    {
        TPacketGCTargetInfo pInfo;
        pInfo.header = HEADER_GC_TARGET_INFO;
        pInfo.dwVID = m_pkChrTarget->GetVID();
        pInfo.race = m_pkChrTarget->GetRaceNum();

        for (auto item_ptr : s_vec_item)
        {
            pInfo.dwVnum = item_ptr->GetVnum();
            pInfo.count = item_ptr->GetCount();
            ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));
            M2_DESTROY_ITEM(item_ptr);
        }

        s_vec_item.clear();
    }
}
 
kodda bellek sızıntısı mevcut paket gönderildikten sonra oluşturulan itemler bellekten silinmiyor. altta düzenlemeyi verdim ama denedim bir hata alırsanız iletin

Fonksiyonu bu şekilde değiştir:
Genişlet Daralt Kopyala
void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData;
    LPCHARACTER m_pkChrTarget = CHARACTER_MANAGER::instance().Find(p->dwVID);
    if (!ch || !m_pkChrTarget)
        return;
    if (!ch->GetDesc())
        return;
    if (!m_pkChrTarget->IsMonster() && !m_pkChrTarget->IsStone())
        return;

    static std::vector<LPITEM> s_vec_item;
    if (ITEM_MANAGER::instance().CreateDropItemVector(m_pkChrTarget, ch, s_vec_item))
    {
        TPacketGCTargetInfo pInfo;
        pInfo.header = HEADER_GC_TARGET_INFO;
        pInfo.dwVID = m_pkChrTarget->GetVID();
        pInfo.race = m_pkChrTarget->GetRaceNum();

        for (auto item_ptr : s_vec_item)
        {
            pInfo.dwVnum = item_ptr->GetVnum();
            pInfo.count = item_ptr->GetCount();
            ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));
            M2_DESTROY_ITEM(item_ptr);
        }

        s_vec_item.clear();
    }
}
Düzenlemen için teşekkür ederim. Burdaki yapıya göre değilde, CreateDropItemVector Fonksiyonuna göre düzenleme yapılsa daha doğru ve temiz sonuç alınır sanki. Bu düzenlemede çok güzel ellerinize sağlık. Konuda da düzenleme yapacağım aşağıdaki kısmı kullanacağım ben çünkü bu düzenlemeyi, CreateDropItemVector bu fonksiyona göre yapacağım. Fikir ve sorunu gösterdiğiniz için çok teşekkür ederim. <3

Neden böyle birşeye gerek var biraz anlatayım. Arkadaşta aynı ilk koddaki gibi static std::vector<LPITEM> s_vec_item; kullanarak statik vektör kullanmış bu durumda ne olur gelin açıkliyim;
Bu ne demek?
  • Bu vector fonksiyon çağrıları arasında RAM’de yaşamaya devam eder, kodda belirtildiği gibi destroy edilmez.
  • Aynı anda 2 oyuncu target info açarsa:
    • Aynı vector kullanılır.
    • Çakışma ihtimali yaşanabilir.
  • Core multithread değil ama network I/O paralel çalışabilir.
  • Static container risklidir.
Benim altda verdiğim kodlarda std::vector<LPITEM> vec_item; yapısını kullanmayı tercih ettim. Bunun sebebi Stack üzerinde olucak fonksiyon bitince yaşamaya devam etmiycek yok olucak, her çağrı için ayrı ayrı container oluşacak bu sayede %100 thread safe yaşanacak yani kim açarsa açsın yeniden container oluşacağı için çakışma vs söz konusu olmayacak.

/Src/Server/game/input_main.cpp:
Genişlet Daralt Kopyala
//Arat

#ifdef ENABLE_TARGET_INFORMATION_SYSTEM
void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData;
    TPacketGCTargetInfo pInfo;
    pInfo.header = HEADER_GC_TARGET_INFO;
    static std::vector<LPITEM> s_vec_item;
    s_vec_item.clear();
    LPITEM pkInfoItem;
    LPCHARACTER m_pkChrTarget = CHARACTER_MANAGER::instance().Find(p->dwVID);
    if (!ch || !m_pkChrTarget)
        return;
    if (!ch->GetDesc())
        return;
    if (ITEM_MANAGER::instance().CreateDropItemVector(m_pkChrTarget, ch, s_vec_item) && (m_pkChrTarget->IsMonster() || m_pkChrTarget->IsStone()))
    {
        if (s_vec_item.size() == 0);
        else if (s_vec_item.size() == 1)
        {
            pkInfoItem = s_vec_item[0];
            pInfo.dwVID = m_pkChrTarget->GetVID();
            pInfo.race = m_pkChrTarget->GetRaceNum();
            pInfo.dwVnum = pkInfoItem->GetVnum();
            pInfo.count = pkInfoItem->GetCount();
            ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));
        }
        else
        {
            int iItemIdx = s_vec_item.size() - 1;
            while (iItemIdx >= 0)
            {
                pkInfoItem = s_vec_item[iItemIdx--];
                if (!pkInfoItem)
                {
                    sys_err("pkInfoItem NULL in vector idx %d", iItemIdx + 1);
                    continue;
                }
                pInfo.dwVID = m_pkChrTarget->GetVID();
                pInfo.race = m_pkChrTarget->GetRaceNum();
                pInfo.dwVnum = pkInfoItem->GetVnum();
                pInfo.count = pkInfoItem->GetCount();
                ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));
            }
        }
    }
}
#endif


// Değiştir.

#ifdef ENABLE_TARGET_INFORMATION_SYSTEM
void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData)
{
    if (!ch || !ch->GetDesc())
        return;

    TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData;
    LPCHARACTER pkTarget = CHARACTER_MANAGER::instance().Find(p->dwVID);

    if (!pkTarget)
        return;

    if (!pkTarget->IsMonster() && !pkTarget->IsStone())
        return;

    std::vector<LPITEM> vec_item;

    if (!ITEM_MANAGER::instance().CreateDropItemVector(pkTarget, ch, vec_item))
        return;

    TPacketGCTargetInfo pInfo;
    pInfo.header = HEADER_GC_TARGET_INFO;
    pInfo.dwVID = pkTarget->GetVID();
    pInfo.race = pkTarget->GetRaceNum();

    for (LPITEM item : vec_item)
    {
        if (!item)
            continue;

        pInfo.dwVnum = item->GetVnum();
        pInfo.count = item->GetCount();

        ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));

        M2_DESTROY_ITEM(item);
    }
}
#endif
29474 eklentisini görüntüle

Şuan aktif olarak bu Target İnfo kurulu değiştirmeye korkuyorum nasıl yol izlemeliyim :D
Bunu benim konumdan mı ekledin yoksa, fileste varmıydı ?

Kodları biraz farklı src kısımları karşılaştırıp eksik fazlalık oranlarını dengelersin. Sonrada uitarget.py kısmında düzenleme yaparak bu konudaki görünümü elde edersin. Ama bence bu daha gelişmiş. İlla öbürü diyorsan sen bilirsin tabiki.
 
Son düzenleme:
Düzenlemen için teşekkür ederim. Burdaki yapıya göre değilde, CreateDropItemVector Fonksiyonuna göre düzenleme yapılsa daha doğru ve temiz sonuç alınır sanki. Bu düzenlemede çok güzel ellerinize sağlık. Konuda da düzenleme yapacağım aşağıdaki kısmı kullanacağım ben çünkü bu düzenlemeyi, CreateDropItemVector bu fonksiyona göre yapacağım. Fikir ve sorunu gösterdiğiniz için çok teşekkür ederim. <3

Neden böyle birşeye gerek var biraz anlatayım. Arkadaşta aynı ilk koddaki gibi static std::vector<LPITEM> s_vec_item; kullanarak statik vektör kullanmış bu durumda ne olur gelin açıkliyim;
Bu ne demek?
  • Bu vector fonksiyon çağrıları arasında RAM’de yaşamaya devam eder, kodda belirtildiği gibi destroy edilmez.
  • Aynı anda 2 oyuncu target info açarsa:
    • Aynı vector kullanılır.
    • Çakışma ihtimali yaşanabilir.
  • Core multithread değil ama network I/O paralel çalışabilir.
  • Static container risklidir.
Benim altda verdiğim kodlarda std::vector<LPITEM> vec_item; yapısını kullanmayı tercih ettim. Bunun sebebi Stack üzerinde olucak fonksiyon bitince yaşamaya devam etmiycek yok olucak, her çağrı için ayrı ayrı container oluşacak bu sayede %100 thread safe yaşanacak yani kim açarsa açsın yeniden container oluşacağı için çakışma vs söz konusu olmayacak.

/Src/Server/game/input_main.cpp:
Genişlet Daralt Kopyala
//Arat

#ifdef ENABLE_TARGET_INFORMATION_SYSTEM
void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData;
    TPacketGCTargetInfo pInfo;
    pInfo.header = HEADER_GC_TARGET_INFO;
    static std::vector<LPITEM> s_vec_item;
    s_vec_item.clear();
    LPITEM pkInfoItem;
    LPCHARACTER m_pkChrTarget = CHARACTER_MANAGER::instance().Find(p->dwVID);
    if (!ch || !m_pkChrTarget)
        return;
    if (!ch->GetDesc())
        return;
    if (ITEM_MANAGER::instance().CreateDropItemVector(m_pkChrTarget, ch, s_vec_item) && (m_pkChrTarget->IsMonster() || m_pkChrTarget->IsStone()))
    {
        if (s_vec_item.size() == 0);
        else if (s_vec_item.size() == 1)
        {
            pkInfoItem = s_vec_item[0];
            pInfo.dwVID = m_pkChrTarget->GetVID();
            pInfo.race = m_pkChrTarget->GetRaceNum();
            pInfo.dwVnum = pkInfoItem->GetVnum();
            pInfo.count = pkInfoItem->GetCount();
            ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));
        }
        else
        {
            int iItemIdx = s_vec_item.size() - 1;
            while (iItemIdx >= 0)
            {
                pkInfoItem = s_vec_item[iItemIdx--];
                if (!pkInfoItem)
                {
                    sys_err("pkInfoItem NULL in vector idx %d", iItemIdx + 1);
                    continue;
                }
                pInfo.dwVID = m_pkChrTarget->GetVID();
                pInfo.race = m_pkChrTarget->GetRaceNum();
                pInfo.dwVnum = pkInfoItem->GetVnum();
                pInfo.count = pkInfoItem->GetCount();
                ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));
            }
        }
    }
}
#endif


// Değiştir.

#ifdef ENABLE_TARGET_INFORMATION_SYSTEM
void CInputMain::TargetInfoLoad(LPCHARACTER ch, const char* c_pData)
{
    if (!ch || !ch->GetDesc())
        return;

    TPacketCGTargetInfoLoad* p = (TPacketCGTargetInfoLoad*)c_pData;
    LPCHARACTER pkTarget = CHARACTER_MANAGER::instance().Find(p->dwVID);

    if (!pkTarget)
        return;

    if (!pkTarget->IsMonster() && !pkTarget->IsStone())
        return;

    std::vector<LPITEM> vec_item;

    if (!ITEM_MANAGER::instance().CreateDropItemVector(pkTarget, ch, vec_item))
        return;

    TPacketGCTargetInfo pInfo;
    pInfo.header = HEADER_GC_TARGET_INFO;
    pInfo.dwVID = pkTarget->GetVID();
    pInfo.race = pkTarget->GetRaceNum();

    for (LPITEM item : vec_item)
    {
        if (!item)
            continue;

        pInfo.dwVnum = item->GetVnum();
        pInfo.count = item->GetCount();

        ch->GetDesc()->Packet(&pInfo, sizeof(TPacketGCTargetInfo));

        M2_DESTROY_ITEM(item);
    }
}
#endif

Bunu benim konumdan mı ekledin yoksa, fileste varmıydı ?

Kodları biraz farklı src kısımları karşılaştırıp eksik fazlalık oranlarını dengelersin. Sonrada uitarget.py kısmında düzenleme yaparak bu konudaki görünümü elde edersin. Ama bence bu daha gelişmiş. İlla öbürü diyorsan sen bilirsin tabiki.
Aslında evet bu gerçekten başarılı bir sistem ama görüntü olarak oyuncu sende ki tasarıma alışkın ordan ona tıklayımda droba bakıyımda gibi şeylere üşeniyorlar o yüzden değiştirmek istiyordum
 
Merhaba, Bir çok hata çözümlenmiş yorumlarda ancak benim aldığım hata aşağıdaki gibi.
Çok uğraştım dosyaları sürekli güncelledim. Ancak bir çözüm bulamadım.

Yardımcı olabilir misiniz?

1779141337734.webp
 
Geri
Üst