Çözüldü invalid literal for int() with base 10:

  • Konuyu açan Konuyu açan ezentere
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 23
  • Gösterim Gösterim 2K
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ı.

ezentere

Üye
Üye
Mesaj
92
Çözümler
3
Beğeni
28
Puan
429
Ticaret Puanı
0
Syserr.TXT:
Genişlet Daralt Kopyala
1113 07:14:28805 ::   File "game.py", line 1936, in BINARY_ServerCommand_Run


1113 07:14:28807 ::   File "stringCommander.py", line 63, in Run


1113 07:14:28807 ::   File "stringCommander.py", line 31, in __call__


1113 07:14:28808 ::   File "stringCommander.py", line 20, in __call__


1113 07:14:28808 ::   File "game.py", line 2229, in PrivateShopSaleResult


1113 07:14:28808 :: ValueError

1113 07:14:28808 :: :

1113 07:14:28809 :: invalid literal for int() with base 10: '\xddksir(B)'

1113 07:14:28810 ::


1113 07:14:28810 :: Unknown Server Command ShopSaleResult 1 Mavi İksir(B) 111111111111 46 | ShopSaleResult

game.py 2229:
Genişlet Daralt Kopyala
    if app.ENABLE_OFFLINE_SHOP_SYSTEM:
        def PrivateShopSaleResult(self, itemCount, itemName, gold, pos):
            if not pos in constInfo.ALREADY_SALE_LIST:
                self.newPopup = uiCommon.NewPopup()
                self.newPopup.SetUserName(localeInfo.SHOP_SALE_RESULT % (itemCount, itemName, localeInfo.PrettyNumber(int(gold))), "d:/ymir work/ui/game/windows/money_icon.sub")
                self.newPopup.SlideIn()

                constInfo.ALREADY_SALE_LIST.append(pos)

Linkleri görebilmek için giriş yap veya kayıt ol.

Linkleri görebilmek için giriş yap veya kayıt ol.

Linkleri görebilmek için giriş yap veya kayıt ol.

Linkleri görebilmek için giriş yap veya kayıt ol.
 
Son düzenleme:
Çözüm
Estağfurullah ne cahilliği. Sormak ayıp değil. İş c++'ya gelince biraz karışık olabiliyor.

Mesela bir örnek vereyim. Başka türlü de olabilir.
C++:
Genişlet Daralt Kopyala
    char buf[256];
    snprintf(buf, sizeof(buf), "ShopSaleResult %d %s %lld %d", amount, itemTable->szLocaleName, gold, pos);
    ChatPacket(CHAT_TYPE_COMMAND, buf);

Yukarıdaki kodu şu şekilde değiştirebilirsiniz;
C++:
Genişlet Daralt Kopyala
    for(int i = 0; i < strlen(itemTable->szLocaleName); ++i)
    {
        if(itemTable->szLocaleName[i] == ' ')
            itemTable->szLocaleName[i] = '_';
    }

    char buf[256];
    snprintf(buf, sizeof(buf), "ShopSaleResult %d %s %lld %d", amount, itemTable->szLocaleName, gold, pos);
    ChatPacket(CHAT_TYPE_COMMAND, buf);


Metin2'de deneyemedim ancak sizin için bir...
Tüm dosyaları eklemek yerine sadece hata satırında belirtilen bölgeye ait kodları sitemizin kod editörüne eklerseniz daha iyi olur. :)
 
gold değerinin nasıl geldiğine bakmamız gerekiyor. Tam sayıya çevirirken hata veriyor.
localeInfo.PrettyNumber(int(gold))) => localeInfo.PrettyNumber(float(gold))) böyle değiştirip deneyin bi
 
gold değerinin nasıl geldiğine bakmamız gerekiyor. Tam sayıya çevirirken hata veriyor.
localeInfo.PrettyNumber(int(gold))) => localeInfo.PrettyNumber(float(gold))) böyle değiştirip deneyin bi

Linkleri görebilmek için giriş yap veya kayıt ol.

oldu ama gold yazısı gelmiyor item ismi de kaymış durumda

pardon ben direk localeInfo.PrettyNumber(gold)) olarak düzenlemişim, float yaptığımda
could not convert string to float: İksir(B) olarak syserr veriyor.
 
Son düzenleme:
İlk önce gold'a gelen verileri görmemiz gerekiyor. İsterseniz direk olarak şu şekilde değiştirip gelen değere bi bakın
Python:
Genişlet Daralt Kopyala
                self.newPopup.SetUserName(localeInfo.SHOP_SALE_RESULT % (itemCount, itemName, gold, "d:/ymir work/ui/game/windows/money_icon.sub")

Eğer debug mod ile oyuna giriyorsanız print ile bakabilirsiniz.
Python:
Genişlet Daralt Kopyala
print(gold)
 
İlk önce gold'a gelen verileri görmemiz gerekiyor. İsterseniz direk olarak şu şekilde değiştirip gelen değere bi bakın
Python:
Genişlet Daralt Kopyala
                self.newPopup.SetUserName(localeInfo.SHOP_SALE_RESULT % (itemCount, itemName, gold, "d:/ymir work/ui/game/windows/money_icon.sub")

Eğer debug mod ile oyuna giriyorsanız print ile bakabilirsiniz.
Python:
Genişlet Daralt Kopyala
print(gold)
Mavi İksir(B) üzerinden örnek verirsem,
itemName'e -> Mavi
gold'a -> İksir(B)
yazdırıyor.
 
O zaman sistemden kaynaklı bir sorun var. Lua'dan mı gönderiyor veriyi acaba. gold kısmına ne kadar satın alındığı yazması gerekiyor. Sisteme bağlı olan lua kodlarınızı paylaşabilir misiniz?
 
O zaman sistemden kaynaklı bir sorun var. Lua'dan mı gönderiyor veriyi acaba. gold kısmına ne kadar satın alındığı yazması gerekiyor. Sisteme bağlı olan lua kodlarınızı paylaşabilir misiniz?
lua derken quest den mi bahsediyorsunuz. questten bahsediyorsanız söktüğüm files te offshop ile ilgili bir quest göremedim
 
Bu verileri quest ile gönderiyor. Fakat boşluk’u ayrı bir argument olarak gördüğü için gold yazan yere itemin diğer adı yazıyor. Bana quest kodlarını verin nasıl düzelteceğinizi anlatayım..
 
Benim verdiğim dosyalarda yok böyle bir şey. Ticaret kayıdını eklediğiniz sistemi gözden geçirin.
ShopSaleResult bu ya questlerden ya da kaynak kodlarından gönderiliyor. Verileri gönderen kodlar lazım..
 
Benim verdiğim dosyalarda yok böyle bir şey. Ticaret kayıdını eklediğiniz sistemi gözden geçirin.
ShopSaleResult bu ya questlerden ya da kaynak kodlarından gönderiliyor. Verileri gönderen kodlar lazım..

input_db.cpp:
Genişlet Daralt Kopyala
void CInputDB::ReceiveShopSaleInfo(const char * c_pData)
{
    DWORD pid = *(DWORD*)c_pData;
    c_pData += sizeof(DWORD);

    TPacketShopSaleResult* p = (TPacketShopSaleResult*)c_pData;
    c_pData += sizeof(TPacketShopSaleResult);

    //The princess is not in this castle
    LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(pid);
    if (!ch)
    {
        sys_err("Character by pid %lu could not be delivered a shop sale info", pid);
        return;
    }

    ch->ShopSellResult(p->itemVnum, p->amount, p->gold, p->pos);
}
char.cpp:
Genişlet Daralt Kopyala
    char buf[256];
    snprintf(buf, sizeof(buf), "ShopSaleResult %d %s %lld %d", amount, itemTable->szLocaleName, gold, pos);
    ChatPacket(CHAT_TYPE_COMMAND, buf);
tables.h:
Genişlet Daralt Kopyala
typedef struct
{
    DWORD itemVnum;
    int amount;
    unsigned long long gold;
    BYTE pos;
} TPacketShopSaleResult;
ClientManager.cpp:
Genişlet Daralt Kopyala
#ifdef ENABLE_OFFLINE_SHOP_SYSTEM
    void        ShopSaleResult(const char * data);
    void        ShopRemove(const char * data);
#endif


ClientManagerShop.cpp:
Genişlet Daralt Kopyala
void CClientManager::ProcessShopPacket(CPeer* peer, DWORD dwHandle, const char * data)
{
    BYTE subHeader = *(BYTE*)data;
    data += sizeof(BYTE);

    switch (subHeader)
    {
        case SHOP_SUBHEADER_GD_SAVE:
            SaveShop(peer, (TPlayerShopTable*)data);
            break;

        case SHOP_SUBHEADER_GD_BUY:
            ShopSaleResult(data);
            break;

        case SHOP_SUBHEADER_GD_REMOVE:
            ShopRemove(data);
            break;

        case SHOP_SUBHEADER_GD_WITHDRAW:
            WithdrawShopGold(peer, dwHandle, data);
            break;

        case SHOP_SUBHEADER_GD_WITHDRAW_ROLLBACK:
            RollbackWithdrawShopGold(peer, dwHandle, data);
            break;

        case SHOP_SUBHEADER_GD_UPDATE_OFFLINE:
            UpdateOfflineTime(data);
            break;

        case SHOP_SUBHEADER_GD_ADD_PREMIUM_TIME:
            AddShopPremiumTime(data);
            break;

        case SHOP_SUBHEADER_GD_CLOSE_REQUEST:
            RequestCloseShop(data);
            break;

        case SHOP_SUBHEADER_GD_RENAME:
            RenameShop(data);
            break;

        case SHOP_SUBHEADER_GD_REQUEST_PREMIUM_TIME_SYNC:
            SynchronizePremiumTime(data);
            break;

        default:
            sys_err("UNKNOWN SHOP SUBHEADER: %d", subHeader);
    }
}

void CClientManager::ShopSaleResult(const char* data)
{
    DWORD playerID = *(DWORD *)data;
    data += sizeof(DWORD);

    BYTE displayPos = *(BYTE *)data;
    data += sizeof(BYTE);

    spShop shop = GetShop(playerID);
    if (!shop)
    {
        sys_err("Shop sale result for player %lu on an apparently non-existing shop.", playerID);
        return;
    }

    if (shop->IsClosed())
    {
        sys_log(1, "Closed shops do not process ShopSaleResult.");
        return;
    }

    //Let's see what we sold
    TPlayerShopTable* shopTable = shop->GetTable();
    int arrIndex = shop->FindItem(displayPos);

    if (arrIndex >= 0) //Valid position
    {
        TShopItemTable sold = shopTable->items[arrIndex];

        //Add gold to the stash
        shop->AlterGoldStash(sold.price, true);
                
        //(Try to) notify the player
        CLoginData * pkLD = GetLoginDataByPID(playerID);
        if (pkLD && pkLD->IsPlay() && pkLD->GetConnectedPeerHandle())
        {
            for (const auto peer : m_peerList)
            {
                if (!peer->GetChannel() || peer->GetHandle() != pkLD->GetConnectedPeerHandle())
                    continue;
                TPacketShopSaleResult ssr;
                ssr.amount = sold.count;
                ssr.gold = sold.price;
                ssr.itemVnum = sold.vnum;
                ssr.pos = sold.display_pos;

                peer->EncodeHeader(HEADER_DG_SHOP_SALE_INFO, 0, sizeof(ssr) + sizeof(DWORD));
                peer->Encode(&playerID, sizeof(DWORD));
                peer->Encode(&ssr, sizeof(ssr));
                break;
            }
        }
                
        //Remove the item from the shop
        shop->RemoveItem(displayPos);

        //If we have ran out of items, close the shop
        if (!shop->HasItems())
        {
            sys_log(0, "Closing player %lu's shop due to lack of any more items to sell.", playerID);
            shop->SetClosed(true);
        }
        
        //Save
        PutShopCache(shop->GetCacheTable());
    }
}
 
Sorun buradan kaynaklanıyor.

C++:
Genişlet Daralt Kopyala
    char buf[256];
    snprintf(buf, sizeof(buf), "ShopSaleResult %d %s %lld %d", amount, itemTable->szLocaleName, gold, pos);
    ChatPacket(CHAT_TYPE_COMMAND, buf);

CHAT_TYPE_COMMAND her boşluğu ayrı argument olarak algılar. itemTable->szLocaleName değişkeninde boşlukları _ ile değiştirip gönderebilirsiniz.
 
str replace ile itemTable->szLocaleName bu değişkende yazan yazıda yer alan boşlukları _ olacak şekilde değiştirin.
Mesela “Mavi İksir” => “Mavi_İksir” şeklinde. Bunu yaparsanız syserr hatası çözülmüş olur. Önceki mesajımda da söylediğim gibi CHAT_TYPE_COMMAND ile gönderilen verilerde her boşluk ayrı argument olarak algılanıyor.

Şu kısımı eski haline getirebilirsiniz sonra
Python:
Genişlet Daralt Kopyala
                self.newPopup.SetUserName(localeInfo.SHOP_SALE_RESULT % (itemCount, itemName, localeInfo.PrettyNumber(int(gold))), "d:/ymir work/ui/game/windows/money_icon.sub")
 
Cahilliğimi maruz görün ama eklemem veya değiştirmem gerekenn kodu size zahmet yazabilir misiniz ?
 
Son düzenleme:
Estağfurullah ne cahilliği. Sormak ayıp değil. İş c++'ya gelince biraz karışık olabiliyor.

Mesela bir örnek vereyim. Başka türlü de olabilir.
C++:
Genişlet Daralt Kopyala
    char buf[256];
    snprintf(buf, sizeof(buf), "ShopSaleResult %d %s %lld %d", amount, itemTable->szLocaleName, gold, pos);
    ChatPacket(CHAT_TYPE_COMMAND, buf);

Yukarıdaki kodu şu şekilde değiştirebilirsiniz;
C++:
Genişlet Daralt Kopyala
    for(int i = 0; i < strlen(itemTable->szLocaleName); ++i)
    {
        if(itemTable->szLocaleName[i] == ' ')
            itemTable->szLocaleName[i] = '_';
    }

    char buf[256];
    snprintf(buf, sizeof(buf), "ShopSaleResult %d %s %lld %d", amount, itemTable->szLocaleName, gold, pos);
    ChatPacket(CHAT_TYPE_COMMAND, buf);


Metin2'de deneyemedim ancak sizin için bir tane cpp projesinde test ettim. Büyük ihtimal çalışması lazım. Bu değişimi sağlayan c++ fonksiyonu var mı bulamadım. Bende böyle bir mantık yürüttüm. :D
cpp yazidan bosluk degistirme algoritmasi.png

Python tarafına veri geldikten sonra string.replace() fonksiyonu ile _ olanları tekrardan boşluk ile değiştirebilirsiniz. Şu video işinizi görebilir hatta. Burada da sizin sorunla benzer sorunla karşılaşmıştım.
 
Çözüm
C++:
Genişlet Daralt Kopyala
    std::string itemName = "";
    int sortPrice = pinfo->sortPrice;

    if (bName)
    {
        itemName = pinfo->ItemName;
        std::replace(itemName.begin(), itemName.end(), '_', ' ');
    }
Suky2020 filesinde böyle bir kod bloğu buldum
 
Evet buda bir çözüm. İstediğiniz yöntemi kullanabilirsiniz. Sorunun temel kaynağını önceki mesajımda anlatmıştım. CHAT_TYPE_COMMAND ile gönderilen verilerde boşluk karakterleri ayrı argüman olarak görüyor. Örnek videoyu izleyin daha net anlaşılacaktır. :)
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst