Sandık İçgörü Sistemi

Doğukan Taydaş

Geliştirici
Geliştirici
Yardımsever Üye
Emekli Üye
Usta Üye
Mesaj
738
Çözümler
55
Beğeni
1.852
Puan
1.179
Ticaret Puanı
0
:mmt-videolar:




:mmt-resimler:

bandicam 2020-12-04 12-15-09-903.jpg


:mmt-indir:






:mmt-virus-tarama-sonuclari:




Hata:
Genişlet Daralt Kopyala
CurrentPageBack Hatası alanlar aşağıdaki linkte verdiklerimi uygulasın

:mmt-virus-tarama-sonuclari:



:mmt-indir:


 

Dosya Eklentileri

Son düzenleme:
Paylaşım için teşekkürler. Game src build sorunu mevcut.

Hata:
In file included from building.cpp:4:
item_manager.h:418: error: 'TChestDropInfoTable' was not declared in this scope
item_manager.h:418: error: template argument 1 is invalid
item_manager.h:418: error: template argument 2 is invalid

1607650491485.webp
 
#define’yi hangi dosyaya tanımladıysanız include edin
 
Merhaba, öncelikle paylaşım için teşekkürler :)
Henüz deneme fırsatım olmadı, hata aldığım için.
Hata veren
item_manager.cpp dosyasında şu hatayı alıyorum:
hata.webp
hatanin_devami.webp
 
Rica ederim. Sanırım biyerlerde hata yaptınız. Baştan kurmayı denermisiniz. Sorun devam ederse özelden yardimcı olurum.
 
Bence stdafx.h dosyasına commondaki service.h'ı dahil etmek daha iyi bir çözüm olabilir böylelikle stdafx.h tanımlanan bütün dosyalarda service.h taki veriyi okuyacaktır. Deneyin olmazsa packet.h içerisinde bunu kontrol edin TChestDropInfoTable. Ve sonuncu olarakta unique_ptr leri auto_ptr ye çevirin büyük ihtimalle normal gcc sürümü kullanmaktasınız kolay gelsin.
 
başarılı olarak sistemi eklemeyi başardım fakat sandıkların içleri boş gözüküyor sebebi nedir?
 
input_main.cpp aç ve arat;:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)


kod bloğu içersine ekle;



    if (!ch)
        return;

    if (!c_pData)
        return;
Eğer sorun devam ederse özelden yardımcı olurum, iyi çalışmalar.
 
yacaktır. Deneyin olmazsa packet.h içerisinde bunu kontrol edin TChestDropInfoTable. Ve sonuncu olarakta unique_ptr leri auto_ptr ye çevirin büyük ihtimalle normal gcc sürümü kullanmaktasınız kolay gelsin.

input_main.cpp aç ve arat;:
Genişlet Daralt Kopyala
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)


kod bloğu içersine ekle;



    if (!ch)
        return;

    if (!c_pData)
        return;
Eğer sorun devam ederse özelden yardımcı olurum, iyi çalışmalar.
hocam olmadı sorunum devam ediyor.
Bunları yazarken kopyala yapıştır yaptım tab ile değildi boşluk ile aralık verilmiş ama doğru bi şekilde build aldı yinede sandık içersindekinler gözükmüyor :(
if (!ch)
return;

if (!c_pData)
return;
 
hocam olmadı sorunum devam ediyor.
Bunları yazarken kopyala yapıştır yaptım tab ile değildi boşluk ile aralık verilmiş ama doğru bi şekilde build aldı yinede sandık içersindekinler gözükmüyor :(
if (!ch)
return;

if (!c_pData)
return;
special_item_group.txt içinden sandıklara ekleme yapmayi dene
 
Selam buna bazı fixler gerekli bilgisi olan varsa yardımcı olabilir mi?
1- Bazı sandıklarda iç görü sistemini açtığı gibi geri kapatıyor
2- En son hangi sayfada kalındıysa yeni sandıkta ilk sayfayı gösteriyor ama aşağıda yazan sayfa sayısı en son bıraktığınız sayı
3- Sandık açma sayısı yeni sandıkta en son ne seçildi ise onu yazıyor ama scrollu her zaman 0 da başlıyor
 
Belki sistemi kullanan bile yoktur.
Konun çok eski olduğunu biliyorum fakat sıkıntıdan bazı düzenlemeler yaptım kullanan olur diye buraya bırakayım. :ROFLMAO:

Game:
input_main:
Genişlet Daralt Kopyala
// Arat
int CInputMain::MyShop(LPCHARACTER ch, const char * c_pData, size_t uiBytes)
{
    TPacketCGMyShop * p = (TPacketCGMyShop *) c_pData;
    int iExtraLen = p->bCount * sizeof(TShopItemTable);
    [..]
    sys_log(0, "MyShop count %d", p->bCount);
    ch->OpenMyShop(p->szSign, (TShopItemTable *) (c_pData + sizeof(TPacketCGMyShop)), p->bCount);
    return (iExtraLen);
}

// Ekle
#ifdef ENABLE_SHOW_CHEST_DROP
void CInputMain::ChestDropInfo(LPCHARACTER ch, const char* c_pData)
{
    // FIXME@2: Güvenlik / stabilite
    // ch veya c_pData geçersizse (NULL) dereference edilip çökme oluşmasın diye
    // önce doğrulama yapılıyor, sonra packet parse ve item erişimi geliyor.
    if (!ch || !c_pData)
        return;

    TPacketCGChestDropInfo* p = (TPacketCGChestDropInfo*) c_pData;

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

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

    LPDESC pkDesc = ch->GetDesc();
    if (!pkDesc)
        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();

    pkDesc->BufferedPacket(&packet, sizeof(packet));

    // FIXME@3: Crash önleme
    // Drop listesi boşken vec_ItemList[0] erişimi geçersizdir ve server/client crash’e gider.
    // empty() kontrolü ile güvenli çıkış eklendi.
    if (!vec_ItemList.empty())
        pkDesc->Packet(&vec_ItemList[0], sizeof(TChestDropInfoTable) * vec_ItemList.size());
}
#endif


// Arat
        case HEADER_CG_MYSHOP:
            if ((iExtraLen = MyShop(ch, c_pData, m_iBufferLeft)) < 0)
                return -1;
            break;

        case HEADER_CG_REFINE:
            Refine(ch, c_pData);
            break;


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

item_manager:
Genişlet Daralt Kopyala
// En Alta Eklenir
#ifdef ENABLE_SHOW_CHEST_DROP
#include "../../libgame/include/grid.h"

void ITEM_MANAGER::GetChestItemList(DWORD dwChestVnum, std::vector<TChestDropInfoTable>& vec_item)
{
    TChestDropInfoTable kTempTab;

    const int dwChestDropPageCount = 5;

    CGrid* pGrids[dwChestDropPageCount];

    for (int i = 0; i < dwChestDropPageCount; ++i)
    {
        pGrids[i] = new CGrid(5, 8);
        pGrids[i]->Clear();
    }

    const CSpecialItemGroup* pGroup = GetSpecialItemGroup(dwChestVnum);

    if (pGroup)
    {
        for (int i = 0; i < pGroup->GetGroupSize(); ++i)
        {
            const TItemTable* itemTable = GetTable(pGroup->GetVnum(i));

            if (itemTable != NULL)
            {
                for (int iPage = 0; iPage < dwChestDropPageCount; ++iPage)
                {
                    int iPos = pGrids[iPage]->FindBlank(1, itemTable->bSize);

                    if (iPos >= 0)
                    {
                        pGrids[iPage]->Put(iPos, 1, itemTable->bSize);

                        kTempTab.bPageIndex = iPage + 1;
                        kTempTab.bSlotIndex = iPos;

                        kTempTab.bItemCount = pGroup->GetCount(i);
                        kTempTab.dwItemVnum = pGroup->GetVnum(i);

                        vec_item.push_back(kTempTab);
                        break;
                    }
                }
            }
        }
    }

    // FIXME@1: Bellek sizintisi
    // pGrids[i] new ile olusturuluyordu fakat hicbir yerde delete edilmiyordu.
    // Bu, uzun sureli calismada heap sismesine/fragmentasyona sebep olur.
    // Fonksiyon cikisinda delete ile temizlik yapildi.
    for (int i = 0; i < dwChestDropPageCount; ++i)
    {
        delete pGrids[i];
        pGrids[i] = NULL;
    }
}
#endif // ENABLE_SHOW_CHEST_DROP


UserInterface:
PythonNetworkStreamPhaseGame:
Genişlet Daralt Kopyala
// Arat
            case HEADER_GC_HYBRIDCRYPT_KEYS:
                RecvHybridCryptKeyPacket();
                return;
                break;

            case HEADER_GC_HYBRIDCRYPT_SDB:
                RecvHybridCryptSDBPacket();
                return;
                break;

// Ekle
#ifdef ENABLE_SHOW_CHEST_DROP
            case HEADER_GC_CHEST_DROP_INFO:
                ret = RecvChestDropInfo();
                break;
#endif

// En Alta Ekle
#ifdef ENABLE_SHOW_CHEST_DROP

bool CPythonNetworkStream::SendChestDropInfo(WORD wInventoryCell)
{
    TPacketCGChestDropInfo packet;
    packet.header = HEADER_CG_CHEST_DROP_INFO;
    packet.wInventoryCell = wInventoryCell;

    // FIXME@6: Gereksiz cagri
    // Bu fonksiyon tek paket gonderiyor.
    // Send() basariliysa ekstra SendSequence() gereksizdir.
    // Bazi core'larda gereksiz flush/overhead olusturabilir.
    return Send(sizeof(packet), &packet);
}

bool CPythonNetworkStream::RecvChestDropInfo()
{
    TPacketGCChestDropInfo packet;
    if (!Recv(sizeof(packet), &packet))
        return false;

    // FIXME@4: Guvenlik / stabilite
    // packet.wSize header boyutundan kucukse wSize -= sizeof(header) underflow yapar.
    // Bozuk/yarim packet senaryosunda overread ve crash uretir; bu yuzden erken cikis.
    if (packet.wSize < sizeof(packet))
        return false;

    packet.wSize -= sizeof(packet);
    while (packet.wSize >= sizeof(TChestDropInfoTable))  // FIXME@5: Crash onleme (yarim struct okuma yok)
    {
        TChestDropInfoTable kTab;
        if (!Recv(sizeof(kTab), &kTab))
            return false;

        PyCallClassMemberFunc(
            m_apoPhaseWnd[PHASE_WINDOW_GAME],
            "BINARY_AddChestDropInfo",
            Py_BuildValue("(iiiii)", packet.dwChestVnum, kTab.bPageIndex, kTab.bSlotIndex, kTab.dwItemVnum, kTab.bItemCount)
        );

        packet.wSize -= sizeof(kTab);
    }

    PyCallClassMemberFunc(
        m_apoPhaseWnd[PHASE_WINDOW_GAME],
        "BINARY_RefreshChestDropInfo",
        Py_BuildValue("(i)", packet.dwChestVnum)
    );

    return true;
}

#endif // ENABLE_SHOW_CHEST_DROP
 
Geri
Üst