Çözüldü Sandık Aynası Sistemi Sandık İçi Boş Olunca Game.Core

  • Konuyu açan Konuyu açan LethalStrikeR
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 15
  • Gösterim Gösterim 1K
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

LethalStrikeR

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
702
Çözümler
41
Beğeni
167
Puan
609
Ticaret Puanı
0
Merhaba;
Sandık aynası sistemi ekledim. Mesela içi boş bir sandığı açmaya çalıştığımda game.core veriyor. Coreyi açtım;
Kod:
Genişlet Daralt Kopyala
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) file game
game: No such file or directory.
(gdb) file ch1
Reading symbols from ch1...
(gdb) core game_r41024.core
[New LWP 100500]
[New LWP 100688]
[New LWP 100689]
[New LWP 100693]
Core was generated by `./ch1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x080ff300 in DESC::Packet (this=<optimized out>,
    c_pvData=<optimized out>, iSize=<optimized out>)
    at /usr/local/lib/gcc9/include/c++/bits/basic_string.h:2300
2300          c_str() const _GLIBCXX_NOEXCEPT
[Current thread is 1 (LWP 100500)]
(gdb) bt full
#0  0x080ff300 in DESC::Packet (this=<optimized out>,
    c_pvData=<optimized out>, iSize=<optimized out>)
    at /usr/local/lib/gcc9/include/c++/bits/basic_string.h:2300
        stName = {static npos = 4294967295,
          _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<cha                                                                                                                                                             r>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfbfad44 "Ata"},
          _M_string_length = 3, {
            _M_local_buf = "Ata\000\n\304\000\000\273y\024\b\220\070*b",
            _M_allocated_capacity = 6386753}}
#1  0x08138026 in CInputMain::ChestDropInfo (this=0x6232659c, ch=0x62393000,
    c_pData=0x623cb700 "\332\034") at input_main.cpp:3058
        p = 0x623cb700
        pkItem = 0x2af88660
        vec_ItemList = {<std::_Vector_base<SChestDropInfoTable, std::allocator<S                                                                                                                                                             ChestDropInfoTable> >> = {
            _M_impl = {<std::allocator<SChestDropInfoTable>> = {<__gnu_cxx::new_                                                                                                                                                             allocator<SChestDropInfoTable>> = {<No data fields>}, <No data fields>}, <std::_                                                                                                                                                             Vector_base<SChestDropInfoTable, std::allocator<SChestDropInfoTable> >::_Vector_                                                                                                                                                             impl_data> = {_M_start = 0x0, _M_finish = 0x0,
                _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}
        packet = {bHeader = 221 '\335', wSize = 7, dwChestVnum = 50186}
#2  0x0813b8c6 in CInputMain::Analyze (this=0x6232659c, d=0x62326500,
    bHeader=218 '\332', c_pData=0x623cb700 "\332\034") at input_main.cpp:3463
--Type <RET> for more, q to quit, c to continue without paging--

Hatanın bu kod bloğunda olduğunu söylüyor.
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_SHOW_CHEST_DROP
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*) c_pData;

    if(p->wInventoryCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
        return;

#ifdef __SPECIAL_INVENTORY_SYSTEM__
    LPITEM pkItem = ch->GetGiftBoxInventoryItem(p->wInventoryCell);
#else
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
#endif

    if (!pkItem)
        return;
  
    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();

    ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
#endif

Bide burayı vermiş;
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_SHOW_CHEST_DROP
    case HEADER_CG_CHEST_DROP_INFO:
        ChestDropInfo(ch, c_pData);
        break;
#endif

Bu sorunu nasıl çözebiliriz yardımlarınızı bekliyorum.
 
Son düzenleme:
Çözüm
yapı olarak bunu kullanmanızı öneririm
C++:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    if (!ch)
        return;
  
    if (!c_pData)
        return;
  
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*)c_pData;
  
    if (p->wInventoryCell >= INVENTORY_MAX_NUM)
        return;
  
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
  
    if (!pkItem)
        return;

    if (pkItem->GetType() != ITEM_GIFTBOX)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("drop_chest bu nesne sandik degil!.."));
        return;
    }

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    if (vec_ItemList.empty())
    {...
Denermisin

input_main.cpp:
Genişlet Daralt Kopyala
//DEĞİŞTİR :

#ifdef ENABLE_SHOW_CHEST_DROP
    case HEADER_CG_CHEST_DROP_INFO:
        ChestDropInfo(ch, c_pData);
        break;
#endif

#ifdef ENABLE_SHOW_CHEST_DROP
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*) c_pData;

    if(p->wInventoryCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
        return;

#ifdef __SPECIAL_INVENTORY_SYSTEM__
    LPITEM pkItem = ch->GetGiftBoxInventoryItem(p->wInventoryCell);
#else
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
#endif

    if (!pkItem)
        return;

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();

    ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
#endif

bunlar ne acaba
C++:
Genişlet Daralt Kopyala
[B]ChestDropInfo(ch, c_pData);
ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());[/B]
 
Denermisin

input_main.cpp:
Genişlet Daralt Kopyala
//DEĞİŞTİR :

#ifdef ENABLE_SHOW_CHEST_DROP
    case HEADER_CG_CHEST_DROP_INFO:
        ChestDropInfo(ch, c_pData);
        break;
#endif

#ifdef ENABLE_SHOW_CHEST_DROP
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*) c_pData;

    if(p->wInventoryCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
        return;

#ifdef __SPECIAL_INVENTORY_SYSTEM__
    LPITEM pkItem = ch->GetGiftBoxInventoryItem(p->wInventoryCell);
#else
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
#endif

    if (!pkItem)
        return;

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();

    ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
#endif

bunlar ne acaba
C++:
Genişlet Daralt Kopyala
[B]ChestDropInfo(ch, c_pData);
ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());[/B]
Onları kalın puntoyla yazmak istemiştim olmadı kod içerisine aldığım için. Konuyu tekrar düzenledim.
 
yapı olarak bunu kullanmanızı öneririm
C++:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    if (!ch)
        return;
  
    if (!c_pData)
        return;
  
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*)c_pData;
  
    if (p->wInventoryCell >= INVENTORY_MAX_NUM)
        return;
  
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
  
    if (!pkItem)
        return;

    if (pkItem->GetType() != ITEM_GIFTBOX)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("drop_chest bu nesne sandik degil!.."));
        return;
    }

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    if (vec_ItemList.empty())
    {
        return;
    }
    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();
  
    ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
 
En son bir moderatör tarafından düzenlenmiş:
Çözüm
yapı olarak bunu kullanmanızı öneririm
C++:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    if (!ch)
        return;
  
    if (!c_pData)
        return;
  
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*)c_pData;
  
    if (p->wInventoryCell >= INVENTORY_MAX_NUM)
        return;
  
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
  
    if (!pkItem)
        return;

    if (pkItem->GetType() != ITEM_GIFTBOX)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("drop_chest bu nesne sandik degil!.."));
        return;
    }

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);
  
    if (vec_ItemList.size() == 0)
        return;

    if (vec_ItemList.empty())
        return;

    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();
  
    if (vec_ItemList.size())
    {
        ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
        ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
    }
    else
    {
        ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    }
      
}
Bu kod bloğunu nereye yerleştireceğim.
 
Sistemin çalışma mantığı chest drop içindeki itemleri tek tek vectore atıyor. Vektörün boyutunun boş olup olmadığını kontrol edip return verdirtebilirsin.
 
yapı olarak bunu kullanmanızı öneririm
C++:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    if (!ch)
        return;
  
    if (!c_pData)
        return;
  
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*)c_pData;
  
    if (p->wInventoryCell >= INVENTORY_MAX_NUM)
        return;
  
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
  
    if (!pkItem)
        return;

    if (pkItem->GetType() != ITEM_GIFTBOX)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("drop_chest bu nesne sandik degil!.."));
        return;
    }

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);
  
    if (vec_ItemList.size() == 0)
        return;

    if (vec_ItemList.empty())
        return;

    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();
  
    if (vec_ItemList.size())
    {
        ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
        ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
    }
    else
    {
        ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    }
      
}
Arkadaş burda paylaşmış ama vector size'ının 0 olup olmadığını kontrol etmekle empty() sorgusu aynı şey aslında, şu yeterli olur

C++:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    if (!ch)
        return;
  
    if (!c_pData)
        return;
  
    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*)c_pData;
  
    if (p->wInventoryCell >= INVENTORY_MAX_NUM)
        return;
  
    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);
  
    if (!pkItem)
        return;

    if (pkItem->GetType() != ITEM_GIFTBOX)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("drop_chest bu nesne sandik degil!.."));
        return;
    }

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    if (vec_ItemList.empty())
    {
        return;
    }
    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();
  
    ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
 
Arkadaş burda paylaşmış ama vector size'ının 0 olup olmadığını kontrol etmekle empty() sorgusu aynı şey aslında, şu yeterli olur

C++:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    if (!ch)
        return;

    if (!c_pData)
        return;

    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*)c_pData;

    if (p->wInventoryCell >= INVENTORY_MAX_NUM)
        return;

    LPITEM pkItem = ch->GetInventoryItem(p->wInventoryCell);

    if (!pkItem)
        return;

    if (pkItem->GetType() != ITEM_GIFTBOX)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("drop_chest bu nesne sandik degil!.."));
        return;
    }

    std::vector<TChestDropInfoTable> vec_ItemList;
    ITEM_MANAGER::instance().GetChestItemList(pkItem->GetVnum(), vec_ItemList);

    if (vec_ItemList.empty())
    {
        return;
    }
    TPacketGCChestDropInfo packet;
    packet.bHeader = HEADER_GC_CHEST_DROP_INFO;
    packet.wSize = sizeof(packet) + sizeof(TChestDropInfoTable) * vec_ItemList.size();
    packet.dwChestVnum = pkItem->GetVnum();

    ch->GetDesc()->BufferedPacket(&packet, sizeof(packet));
    ch->GetDesc()->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
Sorun çözüldü teşekkürler.
 
Son düzenleme:
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst