Yardım Çark sistemi game.core sorunu

  • Konuyu açan Konuyu açan Tugian2Mt2shop
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 10
  • Gösterim Gösterim 245
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Tugian2Mt2shop

Tugian2-Modern PVP
MT Üye
Mesaj
576
Çözümler
6
Beğeni
469
Puan
839
Ticaret Puanı
0
Dostlar Selamün aleyküm derdime derman olacak varmı sorun ne tam olarak

1760828595491.webp
 
Çözüm
C++:
Genişlet Daralt Kopyala
// Bul;

ACMD (do_wheel_of_fortune)

    
// Komple değiştir;

ACMD (do_wheel_of_fortune)
{
    std::vector<std::string> vecArgs;
    split_argument (argument, vecArgs);
    if (vecArgs.size() < 2)
    {
        return;
    }
    else if (vecArgs[1] == "spin")
    {
        if (ch->GetProtectTime("WheelWorking") != 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Wheel already is working!");
            return;
        }
        else if (quest::CQuestManager::instance().GetEventFlag("whell_event") != 1)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Event is not active!");
            return;
        }

        if (vecArgs.size() < 3)
        {
            return;
        }

        DWORD dwWhellIdx = 0;
        if...
Sanırsam buradan veriyor coreyi @enes turan Cano Çark sisteminde çarkta en az 16 item olması gerekiyor listede yoksa core yiyoruz haberin ola


game.core:
Genişlet Daralt Kopyala
No symbol table info available.
#7  0x007bff2f in do_wheel_of_fortune (ch=0x381df000, argument=0xffbfb18f " spin 49", cmd=224, subcmd=0) at cmd_general.cpp:3483
        randomItem = {dwItemVnum = 70024, iCount = 1, iRarePct = 1}
        dwWhellIdx = 49
        whellDataMap = 0xffbfc774
        itemVector = 0x37a9c7b0
        bLuckyIdx = 255 '\377'
        it = {__i_ = {__ptr_ = 0x37a9c7c0}}
        m_send_items = std::vector of length 1 = {{<std::__1::__non_trivially_copyable_base<unsigned int, int>> = {<No data fields>}, first = 70024, second = 1}}
        cmd_wheel = Python Exception <class 'gdb.error'>: There is no member or method named __short_mask.

        vecArgs = std::vector of length 3 = {Python Exception <class 'gdb.error'>: There is no member or method named __short_mask.
, Python Exception <class 'gdb.error'>: There is no member or method named __short_mask.
, Python Exception <class 'gdb.error'>: There is no member or method named __short_mask.
 
C++:
Genişlet Daralt Kopyala
// Bul;

ACMD (do_wheel_of_fortune)

    
// Komple değiştir;

ACMD (do_wheel_of_fortune)
{
    std::vector<std::string> vecArgs;
    split_argument (argument, vecArgs);
    if (vecArgs.size() < 2)
    {
        return;
    }
    else if (vecArgs[1] == "spin")
    {
        if (ch->GetProtectTime("WheelWorking") != 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Wheel already is working!");
            return;
        }
        else if (quest::CQuestManager::instance().GetEventFlag("whell_event") != 1)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Event is not active!");
            return;
        }

        if (vecArgs.size() < 3)
        {
            return;
        }

        DWORD dwWhellIdx = 0;
        if (!str_to_number(dwWhellIdx, vecArgs[2].c_str()))
        {
            return;
        }

        if (ch->GetExchange())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "You can't do it with exchange!");
            return;
        }

        const std::map<DWORD, CWhellItemGroup*>* whellDataMap = ITEM_MANAGER::Instance().GetWhellItemsData();
        if (!whellDataMap)
        {
            sys_err ("Wheel: whellDataMap is NULL!");
            return;
        }

        const auto it = whellDataMap->find(dwWhellIdx);
        if (it == whellDataMap->end())
        {
            sys_err("unknown wheel request! player: %s whellidx: %u", ch->GetName(), dwWhellIdx);
            return;
        }

        if (dwWhellIdx == 0)  // Premium cark itemi
        {
            if (ch->CountSpecifyItem(900009) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900009, 1);
        }
        else if (dwWhellIdx == 19)
        {
            if (ch->CountSpecifyItem(900011) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900011, 1);
        }
        else if (dwWhellIdx == 29)
        {
            if (ch->CountSpecifyItem(900012) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900012, 1);
        }
        else if (dwWhellIdx == 39)
        {
            if (ch->CountSpecifyItem(900010) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900010, 1);
        }
        else if (dwWhellIdx == 49)
        {
            if (ch->CountSpecifyItem(900013) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900013, 1);
        }
        else
        {
            if (dwWhellIdx < 10 || (dwWhellIdx != 19 && dwWhellIdx != 29 && dwWhellIdx != 39 && dwWhellIdx != 49))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "Invalid wheel index!");
                return;
            }

            if (ch->CountSpecifyItem(dwWhellIdx) < 1)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "You don't have enough item for spin!");
                return;
            }
            ch->RemoveSpecifyItem(dwWhellIdx, 1);
        }

        std::vector<std::pair<DWORD,int>> m_send_items;
        std::string cmd_wheel;
        constexpr int kTarget = 10;
        constexpr int kMaxTries = 1000;

        const auto groupsmh = it->second;
        if (!groupsmh)
        {
            sys_err ("Wheel: groupsmh is NULL!");
            return;
        }

        int tries = 0;
        while (static_cast<int>(m_send_items.size()) < kTarget && tries++ < kMaxTries)
        {
            const auto randomItem = groupsmh->GetOne();
            if (randomItem.iRarePct < number(1, 100))
            {
                continue;
            }

            auto p = std::make_pair(randomItem.dwItemVnum, randomItem.iCount);
            if (std::find(m_send_items.begin(), m_send_items.end(), p) != m_send_items.end())
            {
                continue;
            }

            m_send_items.emplace_back(p);

            if (!cmd_wheel.empty())
            {
                cmd_wheel += "#";
            }

            char tmpBuf[64];
            snprintf(tmpBuf, sizeof(tmpBuf), "%u|%d", randomItem.dwItemVnum, randomItem.iCount);
            cmd_wheel += tmpBuf;
        }

        if (m_send_items.empty())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Wheel has no eligible items!");
            return;
        }

        const BYTE bLuckyIdx = static_cast<BYTE>(number(0, static_cast<int>(m_send_items.size()) - 1));
        ch->SetProtectTime("WheelIndex", dwWhellIdx);
        ch->SetProtectTime("WheelLuckyIndex", bLuckyIdx);
        ch->SetProtectTime("WheelLuckyItemVnum",  m_send_items[bLuckyIdx].first);
        ch->SetProtectTime("WheelLuckyItemCount", m_send_items[bLuckyIdx].second);
        ch->SetProtectTime("WheelWorking", 1);
        ch->ChatPacket(CHAT_TYPE_COMMAND, "SetWhellData %u %s", bLuckyIdx, cmd_wheel.c_str());
    }
    else if (vecArgs[1] == "loaditem")
    {
        if (vecArgs.size() < 3)
        {
            return;
        }

        DWORD dwWhellIdx = 0;
        if (!str_to_number(dwWhellIdx, vecArgs[2].c_str()))
        {
            return;
        }

        const std::map<DWORD, CWhellItemGroup*>* whellDataMap = ITEM_MANAGER::Instance().GetWhellItemsData();
        if (!whellDataMap)
        {
            sys_err ("Wheel: whelldatamap2 is NULL!");
            return;
        }

        const auto it = whellDataMap->find(dwWhellIdx);
        if (it == whellDataMap->end())
        {
            sys_err("unknown wheel request! player: %s whellidx: %u", ch->GetName(), dwWhellIdx);
            return;
        }

        const auto groupsmhh = it->second;
        if (!groupsmhh)
        {
            sys_err ("Wheel: groupsmhh is NULL!");
            return;
        }

        const auto itemVector = groupsmhh->GetVector();
        if (!itemVector)
        {
            sys_err ("Wheel: itemVector is NULL!");
            return;
        }

        std::string cmd_wheel("");
        for (auto itItem = itemVector->begin(); itItem != itemVector->end(); ++itItem)
        {
            if (cmd_wheel.length())
            {
                cmd_wheel += "#";
            }

            char tmpBuf[64];
            snprintf(tmpBuf, sizeof(tmpBuf), "%u|%d", itItem->dwItemVnum, itItem->iCount);
            cmd_wheel += tmpBuf;

            if (cmd_wheel.length() > 200)
            {
                ch->ChatPacket(CHAT_TYPE_COMMAND, "SetLoadWhellData %u %s", dwWhellIdx, cmd_wheel.c_str());
                cmd_wheel.clear();
            }
        }

        if (cmd_wheel.length())
        {
            ch->ChatPacket(CHAT_TYPE_COMMAND, "SetLoadWhellData %u %s", dwWhellIdx, cmd_wheel.c_str());
        }
    }
    else if (vecArgs[1] == "done")
    {
        if (ch->GetProtectTime("WheelWorking") != 0)
        {
            DWORD v = ch->GetProtectTime("WheelLuckyItemVnum");
            DWORD c = ch->GetProtectTime("WheelLuckyItemCount");
            if (v == 0 || c == 0)
            {
                sys_err("wheel: invalid reward state");
            }
            else
            {
                ch->AutoGiveItem(v, c);
                ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowWhellReward %u %u", v, c);
            }
        }
        ch->SetProtectTime("WheelIndex", 0);
        ch->SetProtectTime("WheelLuckyIndex", 0);
        ch->SetProtectTime("WheelLuckyItemVnum", 0);
        ch->SetProtectTime("WheelLuckyItemCount", 0);
        ch->SetProtectTime("WheelWorking", 0);
    }
    else if (vecArgs[1] == "event")
    {
        if (!ch->IsGM())
        {
            return;
        }

        if (vecArgs.size() < 3)
        {
            return;
        }

        if (vecArgs[2] == "active")
        {
            BroadcastNotice("Wheel event is started.");
            quest::CQuestManager::instance().RequestSetEventFlag("whell_event", 1);
        }
        else if (vecArgs[2] == "deactive")
        {
            BroadcastNotice("Wheel event is done.");
            quest::CQuestManager::instance().RequestSetEventFlag("whell_event", 0);
        }
    }
}


Sadece cmd kısmındaki kodlamayı gördüm ama gördüğüm kadarıyla oldukça sıkıntılı kodlanmış bir sistem, dikkatli kullanmanızı öneririm. Bu kod core sorununu çözer büyük ihtimalle, sevgiler.
 
Çözüm
C++:
Genişlet Daralt Kopyala
// Bul;

ACMD (do_wheel_of_fortune)

   
// Komple değiştir;

ACMD (do_wheel_of_fortune)
{
    std::vector<std::string> vecArgs;
    split_argument (argument, vecArgs);
    if (vecArgs.size() < 2)
    {
        return;
    }
    else if (vecArgs[1] == "spin")
    {
        if (ch->GetProtectTime("WheelWorking") != 0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Wheel already is working!");
            return;
        }
        else if (quest::CQuestManager::instance().GetEventFlag("whell_event") != 1)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Event is not active!");
            return;
        }

        if (vecArgs.size() < 3)
        {
            return;
        }

        DWORD dwWhellIdx = 0;
        if (!str_to_number(dwWhellIdx, vecArgs[2].c_str()))
        {
            return;
        }

        if (ch->GetExchange())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "You can't do it with exchange!");
            return;
        }

        const std::map<DWORD, CWhellItemGroup*>* whellDataMap = ITEM_MANAGER::Instance().GetWhellItemsData();
        if (!whellDataMap)
        {
            sys_err ("Wheel: whellDataMap is NULL!");
            return;
        }

        const auto it = whellDataMap->find(dwWhellIdx);
        if (it == whellDataMap->end())
        {
            sys_err("unknown wheel request! player: %s whellidx: %u", ch->GetName(), dwWhellIdx);
            return;
        }

        if (dwWhellIdx == 0)  // Premium cark itemi
        {
            if (ch->CountSpecifyItem(900009) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900009, 1);
        }
        else if (dwWhellIdx == 19)
        {
            if (ch->CountSpecifyItem(900011) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900011, 1);
        }
        else if (dwWhellIdx == 29)
        {
            if (ch->CountSpecifyItem(900012) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900012, 1);
        }
        else if (dwWhellIdx == 39)
        {
            if (ch->CountSpecifyItem(900010) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900010, 1);
        }
        else if (dwWhellIdx == 49)
        {
            if (ch->CountSpecifyItem(900013) <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Yeterli Malzeme Yok !"));
                return;
            }
            ch->RemoveSpecifyItem(900013, 1);
        }
        else
        {
            if (dwWhellIdx < 10 || (dwWhellIdx != 19 && dwWhellIdx != 29 && dwWhellIdx != 39 && dwWhellIdx != 49))
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "Invalid wheel index!");
                return;
            }

            if (ch->CountSpecifyItem(dwWhellIdx) < 1)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "You don't have enough item for spin!");
                return;
            }
            ch->RemoveSpecifyItem(dwWhellIdx, 1);
        }

        std::vector<std::pair<DWORD,int>> m_send_items;
        std::string cmd_wheel;
        constexpr int kTarget = 10;
        constexpr int kMaxTries = 1000;

        const auto groupsmh = it->second;
        if (!groupsmh)
        {
            sys_err ("Wheel: groupsmh is NULL!");
            return;
        }

        int tries = 0;
        while (static_cast<int>(m_send_items.size()) < kTarget && tries++ < kMaxTries)
        {
            const auto randomItem = groupsmh->GetOne();
            if (randomItem.iRarePct < number(1, 100))
            {
                continue;
            }

            auto p = std::make_pair(randomItem.dwItemVnum, randomItem.iCount);
            if (std::find(m_send_items.begin(), m_send_items.end(), p) != m_send_items.end())
            {
                continue;
            }

            m_send_items.emplace_back(p);

            if (!cmd_wheel.empty())
            {
                cmd_wheel += "#";
            }

            char tmpBuf[64];
            snprintf(tmpBuf, sizeof(tmpBuf), "%u|%d", randomItem.dwItemVnum, randomItem.iCount);
            cmd_wheel += tmpBuf;
        }

        if (m_send_items.empty())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Wheel has no eligible items!");
            return;
        }

        const BYTE bLuckyIdx = static_cast<BYTE>(number(0, static_cast<int>(m_send_items.size()) - 1));
        ch->SetProtectTime("WheelIndex", dwWhellIdx);
        ch->SetProtectTime("WheelLuckyIndex", bLuckyIdx);
        ch->SetProtectTime("WheelLuckyItemVnum",  m_send_items[bLuckyIdx].first);
        ch->SetProtectTime("WheelLuckyItemCount", m_send_items[bLuckyIdx].second);
        ch->SetProtectTime("WheelWorking", 1);
        ch->ChatPacket(CHAT_TYPE_COMMAND, "SetWhellData %u %s", bLuckyIdx, cmd_wheel.c_str());
    }
    else if (vecArgs[1] == "loaditem")
    {
        if (vecArgs.size() < 3)
        {
            return;
        }

        DWORD dwWhellIdx = 0;
        if (!str_to_number(dwWhellIdx, vecArgs[2].c_str()))
        {
            return;
        }

        const std::map<DWORD, CWhellItemGroup*>* whellDataMap = ITEM_MANAGER::Instance().GetWhellItemsData();
        if (!whellDataMap)
        {
            sys_err ("Wheel: whelldatamap2 is NULL!");
            return;
        }

        const auto it = whellDataMap->find(dwWhellIdx);
        if (it == whellDataMap->end())
        {
            sys_err("unknown wheel request! player: %s whellidx: %u", ch->GetName(), dwWhellIdx);
            return;
        }

        const auto groupsmhh = it->second;
        if (!groupsmhh)
        {
            sys_err ("Wheel: groupsmhh is NULL!");
            return;
        }

        const auto itemVector = groupsmhh->GetVector();
        if (!itemVector)
        {
            sys_err ("Wheel: itemVector is NULL!");
            return;
        }

        std::string cmd_wheel("");
        for (auto itItem = itemVector->begin(); itItem != itemVector->end(); ++itItem)
        {
            if (cmd_wheel.length())
            {
                cmd_wheel += "#";
            }

            char tmpBuf[64];
            snprintf(tmpBuf, sizeof(tmpBuf), "%u|%d", itItem->dwItemVnum, itItem->iCount);
            cmd_wheel += tmpBuf;

            if (cmd_wheel.length() > 200)
            {
                ch->ChatPacket(CHAT_TYPE_COMMAND, "SetLoadWhellData %u %s", dwWhellIdx, cmd_wheel.c_str());
                cmd_wheel.clear();
            }
        }

        if (cmd_wheel.length())
        {
            ch->ChatPacket(CHAT_TYPE_COMMAND, "SetLoadWhellData %u %s", dwWhellIdx, cmd_wheel.c_str());
        }
    }
    else if (vecArgs[1] == "done")
    {
        if (ch->GetProtectTime("WheelWorking") != 0)
        {
            DWORD v = ch->GetProtectTime("WheelLuckyItemVnum");
            DWORD c = ch->GetProtectTime("WheelLuckyItemCount");
            if (v == 0 || c == 0)
            {
                sys_err("wheel: invalid reward state");
            }
            else
            {
                ch->AutoGiveItem(v, c);
                ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowWhellReward %u %u", v, c);
            }
        }
        ch->SetProtectTime("WheelIndex", 0);
        ch->SetProtectTime("WheelLuckyIndex", 0);
        ch->SetProtectTime("WheelLuckyItemVnum", 0);
        ch->SetProtectTime("WheelLuckyItemCount", 0);
        ch->SetProtectTime("WheelWorking", 0);
    }
    else if (vecArgs[1] == "event")
    {
        if (!ch->IsGM())
        {
            return;
        }

        if (vecArgs.size() < 3)
        {
            return;
        }

        if (vecArgs[2] == "active")
        {
            BroadcastNotice("Wheel event is started.");
            quest::CQuestManager::instance().RequestSetEventFlag("whell_event", 1);
        }
        else if (vecArgs[2] == "deactive")
        {
            BroadcastNotice("Wheel event is done.");
            quest::CQuestManager::instance().RequestSetEventFlag("whell_event", 0);
        }
    }
}


Sadece cmd kısmındaki kodlamayı gördüm ama gördüğüm kadarıyla oldukça sıkıntılı kodlanmış bir sistem, dikkatli kullanmanızı öneririm. Bu kod core sorununu çözer büyük ihtimalle, sevgiler.
Core Sorununu @MT2Dev 'in düzeltmesi ile çözüme kavuşturdum fakat altta atacağım video da nedense hala 1 itemi 1 er tane eklememe rağmen bu sefer de sadece çarkın 1 slotunda saymakta çokça eklediğimde problem olmuyor fakat garip kısmı hala 1 er tane ürünü çokça eklemede

 
Geri
Üst