What's new

Expandable_inventory

T0gy3R

Member
Sziasztok.!

Game fordítást követően ezt a hibaüzenetet kapom:
Névtelen.png


Exchange.cpp erre vonatkozó sorai:

Code:
#ifdef ENABLE_EXTEND_INVEN_SYSTEM
bool CExchange::CheckSpace()
{
    std::array<std::unique_ptr<CGrid>, static_cast<const int>(INVENTORY_PAGE_COUNT)> s_grid;
    static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
    LPITEM item;
    bool bDSInitialized = false;
    int new_size, invenpoint = GetCompany()->GetOwner()->Inven_Point();

    for (size_t i = 0; i < s_grid.size(); i++) {
        if (i < INVENTORY_OPEN_PAGE_COUNT) {
            s_grid[i] = std::make_unique<CGrid>(INVENTORY_WIDTH,INVENTORY_HEIGHT);
            continue;
        }
        if (invenpoint > 0 && invenpoint <= INVENTORY_HEIGHT)
            new_size = invenpoint;
        else if (invenpoint >= INVENTORY_HEIGHT)
            new_size = INVENTORY_HEIGHT;
        else
            new_size = 0;
        s_grid[i] = std::make_unique<CGrid>(INVENTORY_WIDTH,new_size);
        invenpoint -= INVENTORY_HEIGHT;
    }
    for (size_t j = 0; j < s_grid.size(); j++) {
        s_grid[j]->Clear();
        for (auto i = INVENTORY_PAGE_SIZE * j; i < INVENTORY_PAGE_SIZE * (j+1); ++i) {
            if (!(item = GetCompany()->GetOwner()->GetInventoryItem(i)))
                continue;
            s_grid[j]->Put(i - INVENTORY_PAGE_SIZE * j, 1, item->GetSize());
        }
    }
    for (auto i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i) {
        if (!(item = m_apItems[i])) continue;
        if (item->IsDragonSoul()) {
            if (!GetCompany()->GetOwner()->DragonSoul_IsQualified()) return false;
            if (!bDSInitialized) {
                bDSInitialized = true;
                GetCompany()->GetOwner()->CopyDragonSoulItemGrid(s_vDSGrid);
            }
            bool bExistEmptySpace = false;
            WORD wBasePos = DSManager::instance().GetBasePosition(item);    
            if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM) return false;
            for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++) {
                WORD wPos = wBasePos + i;
                if (0 == s_vDSGrid[wBasePos]) {
                    bool bEmpty = true;
                    for (int j = 1; j < item->GetSize(); j++)    {
                        if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM]) {
                            bEmpty = false;
                            break;
                    }} if (bEmpty)    {
                        for (int j = 0; j < item->GetSize(); j++)
                            s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] =  wPos + 1;
                        bExistEmptySpace = true;
                        break;
                    }} if (bExistEmptySpace) break;
            } if (!bExistEmptySpace) return false;
        }
        else {
            bool existspace = false;
            for (size_t i = 0; i < s_grid.size(); i++) {
                int iPos = s_grid[i]->FindBlank(1, item->GetSize());
                if (iPos >= 0) {
                    s_grid[i]->Put(iPos, 1, item->GetSize());
                    existspace = true;
                    break;
                }
                else
                    if (i == s_grid.size() -1)
                        return false;
            }
            if (existspace)
                continue;
        }}
    return true;
}
#else
bool CExchange::CheckSpace()
{
    static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 2); // inven page 1
    static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 2); // inven page 2

    s_grid1.Clear();
    s_grid2.Clear();

    LPCHARACTER    victim = GetCompany()->GetOwner();
    LPITEM item;

    int i;

    for (i = 0; i < INVENTORY_MAX_NUM / 2; ++i)
    {
        if (!(item = victim->GetInventoryItem(i)))
            continue;

        s_grid1.Put(i, 1, item->GetSize());
    }
    for (i = INVENTORY_MAX_NUM / 2; i < INVENTORY_MAX_NUM; ++i)
    {
        if (!(item = victim->GetInventoryItem(i)))
            continue;

        s_grid2.Put(i - INVENTORY_MAX_NUM / 2, 1, item->GetSize());
    }

    // 아... 뭔가 개병신 같지만... 용혼석 인벤을 노멀 인벤 보고 따라 만든 내 잘못이다 ㅠㅠ
    static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
 
    // 일단 용혼석을 교환하지 않을 가능성이 크므로, 용혼석 인벤 복사는 용혼석이 있을 때 하도록 한다.
    bool bDSInitialized = false;
 
    for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
    {
        if (!(item = m_apItems[i]))
            continue;

        if (item->IsDragonSoul())
        {
            if (!victim->DragonSoul_IsQualified())
            {
                return false;
            }

            if (!bDSInitialized)
            {
                bDSInitialized = true;
                victim->CopyDragonSoulItemGrid(s_vDSGrid);
            }

            bool bExistEmptySpace = false;
            WORD wBasePos = DSManager::instance().GetBasePosition(item);
            if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)
                return false;
         
            for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)
            {
                WORD wPos = wBasePos + i;
                if (0 == s_vDSGrid[wBasePos])
                {
                    bool bEmpty = true;
                    for (int j = 1; j < item->GetSize(); j++)
                    {
                        if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])
                        {
                            bEmpty = false;
                            break;
                        }
                    }
                    if (bEmpty)
                    {
                        for (int j = 0; j < item->GetSize(); j++)
                        {
                            s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] =  wPos + 1;
                        }
                        bExistEmptySpace = true;
                        break;
                    }
                }
                if (bExistEmptySpace)
                    break;
            }
            if (!bExistEmptySpace)
                return false;
        }
        else
        {
            int iPos = s_grid1.FindBlank(1, item->GetSize());

            if (iPos >= 0)
            {
                s_grid1.Put(iPos, 1, item->GetSize());
            }
            else
            {
                iPos = s_grid2.FindBlank(1, item->GetSize());

                if (iPos >= 0)
                {
                    s_grid2.Put(iPos, 1, item->GetSize());
                }
                else
                {
                    return false;
                }
            }
        }
    }

    return true;
}
#endif
Névtelen.png

Gondolom, hogy a s_grid deklarálása nem jó, mert mindenhol azzal van gond.
Illetve for ciklusban nem értem miért van "auto i.." (nem kéne deklarálni azt az i változót?)
Ezzel kapcsolatban tudna nekem valaki valami segítséget nyújtani?

EDIT:
Némi google használat után rájöttem, hogy a 9.2-es forrásos BSD-n nem a megfelelő c++ compiler van.
Ahhoz, hogy ilyen tömböket használjak minimum c++11 kéne. (Ha jól értelmezem ezt)

Most keresem azt, hogyan lehet frissíteni, a .vdi-n. Addig ha valaki tud segíteni ne tartsa magában :D
 
Last edited:

T0gy3R

Member
Frissíts gcc-t és megoldja a problémát.
Megtaláltam közben azt ami ITTlett publikálva.
De én jobb szeretném magam csinálni. Ellenben viszont amit találtam leírást. Rengetegen panaszkodnak rá. Esetleg valami irányt tudnál nekem ezzel kapcsolatban mutatni?
Gondolok itt arra, hogy a "BSD 9.2 gcc update" "Metin2 gcc update" és ehhez hasonló google-s keresésekkel nem nagyon jutottal előrébb. :\
 

ScriptMan

ImMortaL
Staff member
Mert a 9.2 re már nem működnek a gcc updatek.
Frissítsd le a bsd-d et pl 12 re(Ha engedi), vagy a neten találsz.
Azért panaszkodnak, mert nem értenek hozzá így nem tudják beüzemelni.
 

T0gy3R

Member
Én magam sem értem, de szerintem áttörést értem el. xd

Ugye vanitt a forumon egy DB start fix. Abban van egy pont ahol a AsyncSQL.cpp-t kell szerkesztenui, mégpedig ezeket a sorokat:

Code:
void CAsyncSQL2::SetLocale(const std::string & stLocale)
{
          m_stLocale = stLocale;
          QueryLocaleSet();
}
Itt ugye ugyan az az std::-s "izé" van. (szakmegnevés. Én értem, és te is, szóval működik :D )

Ezen felbuzdulva az inlcude-k közül ezeket:

Code:
#include <cstdlib>
#include <cstring>
Beillesztettem. És láss csodát. Lefordult az exchange.cpp.
Nem tudom most a maradékot leellenőrizni. Majd még szerkesztem a topic-ot, ha bármi váratlan felütötte a fejét. De szerintem ezzel ez a topicot késznek tekintem. :)


Mert a 9.2 re már nem működnek a gcc updatek.
Frissítsd le a bsd-d et pl 12 re(Ha engedi), vagy a neten találsz.
Azért panaszkodnak, mert nem értenek hozzá így nem tudják beüzemelni.
Megpróbáltam, de nekem ez sajna nagyon magas (még..) Így más alternatívát kellett keresnem. :)
 
Top