Yardım İkarus Offline Shop K Envanter Uyarlaması

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

LethalStrikeR

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
702
Çözümler
41
Beğeni
170
Puan
609
Ticaret Puanı
0
Herkese Merhaba;

İkarus Offline shop kullanıyorum. Fakat K envanter uyarlamasını bir türlü yapamadım. Python taraflı uyarlama yaptım sandıklar hariç diğer tüm itemleri offline shopa ekleyebiliyorum.(Sandıkları daha halledemedim)Fakat offline shoptan item alırken, offline shoptaki depodan itemi aldığımda item kayboluyor ve game syserra böyle bir şey yazıyor;

Kod:
Genişlet Daralt Kopyala
SYSERR: May 11 16:05:16 :: SetItem: Invalid Inventory type 7
SYSERR: May 11 16:05:19 :: SetItem: Invalid Inventory type 8
SYSERR: May 11 16:05:23 :: SetItem: Invalid Inventory type 9
SYSERR: May 11 16:05:25 :: SetItem: Invalid Inventory type 11

Şimdi ilk syserri basmasının sebebi Bk alınca, diğeri + basma itemi alınca diğeri taş alınca diğeri se efsun alınca basılıyor. Ben src tabanlı uyarlamayı denedim ama çözemedim yardım bekliyorum. Şimdiden teşekkürler.
 
Hataya bakılırsa iteme tanımlanan envanter türünün bulunmadığını söylüyor. Kodlarınızı kontrol etmelisiniz. Nasıl bi düzenleme yaptığınızı bilemediğimiz için şunları şöyle değiştirin gibi bir şey diyemiyorum maalesef.
 
Hataya bakılırsa iteme tanımlanan envanter türünün bulunmadığını söylüyor. Kodlarınızı kontrol etmelisiniz.
Buda set item fonksiyonundan oluyor olabilir mi ? Mesela örnek kod bu;

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_HIGHLIGHT_NEW_ITEM
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem, bool bWereMine)
#else
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
#endif
{
    WORD wCell = Cell.cell;
    BYTE window_type = Cell.window_type;
    if ((unsigned long)((CItem*)pItem) == 0xff || (unsigned long)((CItem*)pItem) == 0xffffffff)
    {
        sys_err("!!! FATAL ERROR !!! item == 0xff (char: %s cell: %u)", GetName(), wCell);
        core_dump();
        return;
    }

    if (pItem && pItem->GetOwner())
    {
        assert(!"GetOwner exist");
        return;
    }
    // 기본 인벤토리
    switch (window_type)
    {
    case INVENTORY:
    case EQUIPMENT:
    {
        if (wCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
        {
            sys_err("CHARACTER::SetItem: invalid item cell %d", wCell);
            return;
        }

        LPITEM pOld = m_pointsInstant.pItems[wCell];

        if (pOld)
        {
            if (wCell < INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pOld->GetSize(); ++i)
                {
                    int p = wCell + (i * 5);

                    if (p >= INVENTORY_MAX_NUM)
                        continue;

                    if (m_pointsInstant.pItems[p] && m_pointsInstant.pItems[p] != pOld)
                        continue;

                    m_pointsInstant.bItemGrid[p] = 0;
                }
            }
            else
                m_pointsInstant.bItemGrid[wCell] = 0;
        }

        if (pItem)
        {
            if (wCell < INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pItem->GetSize(); ++i)
                {
                    int p = wCell + (i * 5);

                    if (p >= INVENTORY_MAX_NUM)
                        continue;

                    // wCell + 1 로 하는 것은 빈곳을 체크할 때 같은
                    // 아이템은 예외처리하기 위함
                    m_pointsInstant.bItemGrid[p] = wCell + 1;
                }
            }
            else
                m_pointsInstant.bItemGrid[wCell] = wCell + 1;
        }

        m_pointsInstant.pItems[wCell] = pItem;
    }
    break;
    // 용혼석 인벤토리
    case DRAGON_SOUL_INVENTORY:
    {
        LPITEM pOld = m_pointsInstant.pDSItems[wCell];

        if (pOld)
        {
            if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pOld->GetSize(); ++i)
                {
                    int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);

                    if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
                        continue;

                    if (m_pointsInstant.pDSItems[p] && m_pointsInstant.pDSItems[p] != pOld)
                        continue;

                    m_pointsInstant.wDSItemGrid[p] = 0;
                }
            }
            else
                m_pointsInstant.wDSItemGrid[wCell] = 0;
        }

        if (pItem)
        {
            if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
            {
                sys_err("CHARACTER::SetItem: invalid DS item cell %d", wCell);
                return;
            }

            if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pItem->GetSize(); ++i)
                {
                    int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);

                    if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
                        continue;

                    // wCell + 1 로 하는 것은 빈곳을 체크할 때 같은
                    // 아이템은 예외처리하기 위함
                    m_pointsInstant.wDSItemGrid[p] = wCell + 1;
                }
            }
            else
                m_pointsInstant.wDSItemGrid[wCell] = wCell + 1;
        }

        m_pointsInstant.pDSItems[wCell] = pItem;
    }
    break;
    default:
        sys_err("Invalid Inventory type %d", window_type);
        return;
    }

    if (GetDesc())
    {
        // 확장 아이템: 서버에서 아이템 플래그 정보를 보낸다
        if (pItem)
        {
            TPacketGCItemSet pack;
            pack.header = HEADER_GC_ITEM_SET;
            pack.Cell = Cell;

            pack.count = pItem->GetCount();
            pack.vnum = pItem->GetVnum();
            pack.flags = pItem->GetFlag();
            pack.anti_flags = pItem->GetAntiFlag();
#ifdef ENABLE_HIGHLIGHT_NEW_ITEM
            pack.highlight = !bWereMine || (Cell.window_type == DRAGON_SOUL_INVENTORY); (Cell.window_type == DRAGON_SOUL_INVENTORY);
#else
            pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);
#endif

            thecore_memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));
            thecore_memcpy(pack.aAttr, pItem->GetAttributes(), sizeof(pack.aAttr));

            GetDesc()->Packet(&pack, sizeof(TPacketGCItemSet));
        }
        else
        {
            TPacketGCItemDelDeprecated pack;
            pack.header = HEADER_GC_ITEM_DEL;
            pack.Cell = Cell;
            pack.count = 0;
            pack.vnum = 0;
            memset(pack.alSockets, 0, sizeof(pack.alSockets));
            memset(pack.aAttr, 0, sizeof(pack.aAttr));

            GetDesc()->Packet(&pack, sizeof(TPacketGCItemDelDeprecated));
        }
    }

    if (pItem)
    {
        pItem->SetCell(this, wCell);
        switch (window_type)
        {
        case INVENTORY:
        case EQUIPMENT:
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
            if ((wCell < INVENTORY_MAX_NUM) || (BELT_INVENTORY_SLOT_START <= wCell && BELT_INVENTORY_SLOT_END > wCell) || (SKILL_BOOK_INVENTORY_SLOT_START <= wCell && SKILL_BOOK_INVENTORY_SLOT_END > wCell) || (UPGRADE_ITEMS_INVENTORY_SLOT_START <= wCell && UPGRADE_ITEMS_INVENTORY_SLOT_END > wCell) || (STONE_INVENTORY_SLOT_START <= wCell && STONE_INVENTORY_SLOT_END > wCell) || (BOX_INVENTORY_SLOT_START <= wCell && BOX_INVENTORY_SLOT_END > wCell) || (EFSUN_INVENTORY_SLOT_START <= wCell && EFSUN_INVENTORY_SLOT_END > wCell) || (CICEK_INVENTORY_SLOT_START <= wCell && CICEK_INVENTORY_SLOT_END > wCell))
                pItem->SetWindow(INVENTORY);
#else
            if ((wCell < INVENTORY_MAX_NUM) || (BELT_INVENTORY_SLOT_START <= wCell && BELT_INVENTORY_SLOT_END > wCell))
                pItem->SetWindow(INVENTORY);
#endif
            else
                pItem->SetWindow(EQUIPMENT);
            break;
        case DRAGON_SOUL_INVENTORY:
            pItem->SetWindow(DRAGON_SOUL_INVENTORY);
            break;
        }
    }
}

Offlineshoun.cpp dosyasında ise böyle bir kod var.
C++:
Genişlet Daralt Kopyala
    void CShop::SetItems(VECSHOPITEM * pVec)
    {
        CopyContainer(m_vecItems, *pVec);
        for(DWORD i=0; i < m_vecItems.size(); i++)
        {
            m_vecItems[i].SetWindow(NEW_OFFSHOP);
        }
        if (!m_listGuests.empty())
        {
            __RefreshItems();
        }
    }
 
Buda set item fonksiyonundan oluyor olabilir mi ? Mesela örnek kod bu;

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_HIGHLIGHT_NEW_ITEM
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem, bool bWereMine)
#else
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)
#endif
{
    WORD wCell = Cell.cell;
    BYTE window_type = Cell.window_type;
    if ((unsigned long)((CItem*)pItem) == 0xff || (unsigned long)((CItem*)pItem) == 0xffffffff)
    {
        sys_err("!!! FATAL ERROR !!! item == 0xff (char: %s cell: %u)", GetName(), wCell);
        core_dump();
        return;
    }

    if (pItem && pItem->GetOwner())
    {
        assert(!"GetOwner exist");
        return;
    }
    // 기본 인벤토리
    switch (window_type)
    {
    case INVENTORY:
    case EQUIPMENT:
    {
        if (wCell >= INVENTORY_AND_EQUIP_SLOT_MAX)
        {
            sys_err("CHARACTER::SetItem: invalid item cell %d", wCell);
            return;
        }

        LPITEM pOld = m_pointsInstant.pItems[wCell];

        if (pOld)
        {
            if (wCell < INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pOld->GetSize(); ++i)
                {
                    int p = wCell + (i * 5);

                    if (p >= INVENTORY_MAX_NUM)
                        continue;

                    if (m_pointsInstant.pItems[p] && m_pointsInstant.pItems[p] != pOld)
                        continue;

                    m_pointsInstant.bItemGrid[p] = 0;
                }
            }
            else
                m_pointsInstant.bItemGrid[wCell] = 0;
        }

        if (pItem)
        {
            if (wCell < INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pItem->GetSize(); ++i)
                {
                    int p = wCell + (i * 5);

                    if (p >= INVENTORY_MAX_NUM)
                        continue;

                    // wCell + 1 로 하는 것은 빈곳을 체크할 때 같은
                    // 아이템은 예외처리하기 위함
                    m_pointsInstant.bItemGrid[p] = wCell + 1;
                }
            }
            else
                m_pointsInstant.bItemGrid[wCell] = wCell + 1;
        }

        m_pointsInstant.pItems[wCell] = pItem;
    }
    break;
    // 용혼석 인벤토리
    case DRAGON_SOUL_INVENTORY:
    {
        LPITEM pOld = m_pointsInstant.pDSItems[wCell];

        if (pOld)
        {
            if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pOld->GetSize(); ++i)
                {
                    int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);

                    if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
                        continue;

                    if (m_pointsInstant.pDSItems[p] && m_pointsInstant.pDSItems[p] != pOld)
                        continue;

                    m_pointsInstant.wDSItemGrid[p] = 0;
                }
            }
            else
                m_pointsInstant.wDSItemGrid[wCell] = 0;
        }

        if (pItem)
        {
            if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)
            {
                sys_err("CHARACTER::SetItem: invalid DS item cell %d", wCell);
                return;
            }

            if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)
            {
                for (int i = 0; i < pItem->GetSize(); ++i)
                {
                    int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);

                    if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)
                        continue;

                    // wCell + 1 로 하는 것은 빈곳을 체크할 때 같은
                    // 아이템은 예외처리하기 위함
                    m_pointsInstant.wDSItemGrid[p] = wCell + 1;
                }
            }
            else
                m_pointsInstant.wDSItemGrid[wCell] = wCell + 1;
        }

        m_pointsInstant.pDSItems[wCell] = pItem;
    }
    break;
    default:
        sys_err("Invalid Inventory type %d", window_type);
        return;
    }

    if (GetDesc())
    {
        // 확장 아이템: 서버에서 아이템 플래그 정보를 보낸다
        if (pItem)
        {
            TPacketGCItemSet pack;
            pack.header = HEADER_GC_ITEM_SET;
            pack.Cell = Cell;

            pack.count = pItem->GetCount();
            pack.vnum = pItem->GetVnum();
            pack.flags = pItem->GetFlag();
            pack.anti_flags = pItem->GetAntiFlag();
#ifdef ENABLE_HIGHLIGHT_NEW_ITEM
            pack.highlight = !bWereMine || (Cell.window_type == DRAGON_SOUL_INVENTORY); (Cell.window_type == DRAGON_SOUL_INVENTORY);
#else
            pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);
#endif

            thecore_memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));
            thecore_memcpy(pack.aAttr, pItem->GetAttributes(), sizeof(pack.aAttr));

            GetDesc()->Packet(&pack, sizeof(TPacketGCItemSet));
        }
        else
        {
            TPacketGCItemDelDeprecated pack;
            pack.header = HEADER_GC_ITEM_DEL;
            pack.Cell = Cell;
            pack.count = 0;
            pack.vnum = 0;
            memset(pack.alSockets, 0, sizeof(pack.alSockets));
            memset(pack.aAttr, 0, sizeof(pack.aAttr));

            GetDesc()->Packet(&pack, sizeof(TPacketGCItemDelDeprecated));
        }
    }

    if (pItem)
    {
        pItem->SetCell(this, wCell);
        switch (window_type)
        {
        case INVENTORY:
        case EQUIPMENT:
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
            if ((wCell < INVENTORY_MAX_NUM) || (BELT_INVENTORY_SLOT_START <= wCell && BELT_INVENTORY_SLOT_END > wCell) || (SKILL_BOOK_INVENTORY_SLOT_START <= wCell && SKILL_BOOK_INVENTORY_SLOT_END > wCell) || (UPGRADE_ITEMS_INVENTORY_SLOT_START <= wCell && UPGRADE_ITEMS_INVENTORY_SLOT_END > wCell) || (STONE_INVENTORY_SLOT_START <= wCell && STONE_INVENTORY_SLOT_END > wCell) || (BOX_INVENTORY_SLOT_START <= wCell && BOX_INVENTORY_SLOT_END > wCell) || (EFSUN_INVENTORY_SLOT_START <= wCell && EFSUN_INVENTORY_SLOT_END > wCell) || (CICEK_INVENTORY_SLOT_START <= wCell && CICEK_INVENTORY_SLOT_END > wCell))
                pItem->SetWindow(INVENTORY);
#else
            if ((wCell < INVENTORY_MAX_NUM) || (BELT_INVENTORY_SLOT_START <= wCell && BELT_INVENTORY_SLOT_END > wCell))
                pItem->SetWindow(INVENTORY);
#endif
            else
                pItem->SetWindow(EQUIPMENT);
            break;
        case DRAGON_SOUL_INVENTORY:
            pItem->SetWindow(DRAGON_SOUL_INVENTORY);
            break;
        }
    }
}

Offlineshoun.cpp dosyasında ise böyle bir kod var.
C++:
Genişlet Daralt Kopyala
    void CShop::SetItems(VECSHOPITEM * pVec)
    {
        CopyContainer(m_vecItems, *pVec);
        for(DWORD i=0; i < m_vecItems.size(); i++)
        {
            m_vecItems[i].SetWindow(NEW_OFFSHOP);
        }
        if (!m_listGuests.empty())
        {
            __RefreshItems();
        }
    }
SetItem fonk. zaten orada bulunuyor onunla ilgili bir düzenleme mi yapıcaz acaba?
 
Güncellemek için yorum atmaya gerek yok. Konuyu yukarı taşıyabilirsiniz. Üst yorumda kendi yorumunuz var ise yine forum kurallarımızı ihlal etmiş oluyorsunuz.
Konu güncel @Whistle yardımcı olabilir misin ?
 
Güncellemek için yorum atmaya gerek yok. Konuyu yukarı taşıyabilirsiniz
Soruna gelirsek bu tarz durumlarda kodlarla uğraşmak gerekiyor. Adım adım şöyle yapın diyebileceğim türden konu değil bu
 
Geri
Üst