TC Offlineshop Efsun Bozulması Fix

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 40

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
4 taş ekledikten sonra yüksek ihtimalle yaşayacağınız bir sorundur sorundan kısaca bahsedecek olursak eğer ; 5 efsun 4 taş item offlineshop'a koyulduktan sonra reboot çekilir ardından oyuna giriş yapılır ve iteminizin efsunları bozulmuş şekilde geri alınır. sorun offlineshopun kaybolduktan sonraki geri alma fonksiyonunda değerlerin olağandan düşük olarak belirlenmesinden kaynaklıdır.

offlineshop_manager.cpp açılır ve bulunur​

Kod:
MYSQL_ROW row;     while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))     {         TPlayerItem item;         str_to_number(item.pos, row[0]);         str_to_number(item.count, row[1]);         str_to_number(item.vnum, row[2]);         for (int i = 0, n = 3; i < ITEM_SOCKET_MAX_NUM; ++i, n++)             str_to_number(item.alSockets[i], row[n]);         for (int i = 0, iStartAttributeType = 6, iStartAttributeValue = ITEM_ATTRIBUTE_MAX_NUM; i < ITEM_ATTRIBUTE_MAX_NUM; ++i, iStartAttributeType += 2, iStartAttributeValue += 2)         {             str_to_number(item.aAttr[i].bType, row[iStartAttributeType]);             str_to_number(item.aAttr[i].sValue, row[iStartAttributeValue]);         }         LPITEM pItem = ITEM_MANAGER::instance().CreateItem(item.vnum, item.count);         if (pItem)         {             pItem->SetSockets(item.alSockets);             pItem->SetAttributes(item.aAttr);             int cell;             cell = ch->GetEmptyInventory(pItem->GetSize());             if (cell != -1)             {                 pItem->AddToCharacter(ch, TItemPos(INVENTORY, cell));             }             else             {                 pItem->AddToGround(ch->GetMapIndex(), ch->GetXYZ());                 pItem->StartDestroyEvent();                 pItem->SetOwnership(ch, 60);             }             // release DB             DBManager::instance().DirectQuery("DELETE FROM %soffline_shop_item WHERE owner_id = %u AND pos = %d AND vnum = %d LIMIT 1", get_table_postfix(), ch->GetPlayerID(), item.pos, item.vnum);                        /* log for web */             LogManager::instance().OfflineShopLog(ch->GetDesc()->GetAccountTable().id, pItem->GetName(), "FETCH");             /* end log for web */         }     }

komple değiştirilir
Kod:
MYSQL_ROW row;     while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))     {         TPlayerItem item;         int cur = 0;         str_to_number(item.pos, row[cur++]);         str_to_number(item.count, row[cur++]);         str_to_number(item.vnum, row[cur++]);         for (BYTE a = 0; a < ITEM_SOCKET_MAX_NUM; a++)             str_to_number(item.alSockets[a], row[cur++]);         for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++)         {             str_to_number(item.aAttr[j].bType, row[cur++]);             str_to_number(item.aAttr[j].sValue, row[cur++]);         }         LPITEM pItem = ITEM_MANAGER::instance().CreateItem(item.vnum, item.count);         if (!pItem)         {             ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Su anda sistemde sorun var.Lutfen daha sonra tekrar deneyin."));             return;         }         pItem->SetAttributes(item.aAttr);         pItem->SetSockets(item.alSockets);         int iEmptyPos;         if (pItem->IsDragonSoul())             iEmptyPos = ch->GetEmptyDragonSoulInventory(pItem);         else             iEmptyPos = ch->GetEmptyInventory(pItem->GetSize());         if (iEmptyPos < 0)         {             ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Item icin yeterli alan yok."));             return;         }         if (pItem->IsDragonSoul())             pItem->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));         else             pItem->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));         DBManager::instance().DirectQuery("DELETE FROM %soffline_shop_item WHERE owner_id = %u AND pos = %d AND vnum = %d LIMIT 1", get_table_postfix(), ch->GetPlayerID(), item.pos, item.vnum);         LogManager::instance().OfflineShopLog(ch->GetDesc()->GetAccountTable().id, pItem->GetName(), "FETCH");         ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s itemini basariyla aldin."), pItem->GetName());     } }

lqb8AE.jpg

TC Offlineshop Efsun Bozulması Fix: Metin2 Sunucu Geliştirme Sürecinde Karşılaşılan Yaygın Bir Sorun

Metin2 özel sunucularında çalışan geliştiriciler, zaman zaman oyuncuların deneyimini olumsuz etkileyebilecek çeşitli hatalarla karşılaşabilir. Bunlardan birisi de TC Offlineshop modülünde meydana gelen efsun bozulması sorunudur. Bu yazıda, bu hatayı detaylıca inceleyip, çözüm önerileri sunacağız. Bu fix, C++ sistem üzerinde çalışan game server yapılarında oldukça yaygın olarak karşılaşılmaktadır.

TC Offlineshop Nedir?

TC Offlineshop, Metin2 özel sunucularında oyuncuların çevrimdışıyken bile eşya alıp satabilmelerini sağlayan bir özelliktir. Oyuncuların sunucudan uzaklaşmalarına rağmen ekonomik aktivitelerini sürdürebilmeleri için kritik öneme sahiptir. Ancak bu sistemde zaman zaman veri tutarsızlıkları yaşanabiliyor. Bunlardan birisi de efsun (enhancement) bilgilerinin bozulmasıdır. Yani oyuncunun eşyasının efsun seviyesi, veri tabanında farklı bir değerle kaydedilebilir veya hatalı okunabilir.

Sorunun Neden Kaynağı Olur?[/BR]

Bu sorun genellikle aşağıdaki nedenlerden dolayı ortaya çıkar:
- Veri tabanı güncellemelerinde eksiklikler,
- Game server ile auth server arasında senkronizasyon hataları,
- Client ve server arasında item verilerinin aktarımında eksiklikler,
- Python tarafında pack veya unpack işlemleri sırasında hatalar.

Fix Nasıl Uygulanır?

Öncelikle, efsun verilerinin doğru şekilde db_core üzerinden okunduğundan emin olunmalıdır. Game server tarafında C++ kaynak kod üzerinde şu adımlar izlenebilir:

1. Item verileri okunurken enhance değerlerinin doğruluğunu kontrol edin.
2. Offlineshop modülünde item verileri gönderilirken py_root üzerinden item paketlenirken efsun değerlerinin de doğru aktarıldığından emin olun.
3. Auth server üzerinden game server’a veri dönerken efsun değerlerinin değişmediğinden emin olun.

Python Tarafında Kontrol ve Onarım

Eğer offlineshop sisteminin bazı parçaları Python ile yazılmışsa, özellikle uiscript ve py gui üzerinden veri transferi yapılırken efsun değerlerinin korunup korunmadığı test edilmelidir. Bu süreçte Martysama gibi Metin2 development araçları da destek olabilir.

Önlem Almak İçin Ne Yapmalı?

Bu tarz hataların tekrar etmemesi için aşağıdaki önerileri dikkate alabilirsiniz:
- Database üzerinde trigger ile efsun değerlerinin değişip değişmediğini kontrol edin.
- Game server loglarında item transferlerini izleyin.
- Server compile işlemi sonrasında test aşamalarını eksiksiz yapın.

Sonuç

TC Offlineshop efsun bozulması, Metin2 özel sunucularında sıkça karşılaşılan ama çözülebilen bir hatadır. C++ sistem, Python, client src ve server src arasındaki veri akışını kontrol ederek bu sorunu kolayca çözebilirsiniz. Bu tür hatalar, Metin2 development sürecinde dikkat edilmesi gereken küçük detaylardır. Metin2Lobby olarak bu tür gelişmiş fix ve system paylaşımlarına devam edeceğiz.


TC Offlineshop Enchant Corruption Fix: A Common Issue in Metin2 Server Development

In Metin2 private servers, developers may encounter various bugs that can negatively affect player experience. One such issue is the enchant corruption problem occurring in the TC Offlineshop module. In this article, we will examine this bug in detail and provide solution proposals. This fix is very common in game server structures operating on C++ systems.

What is TC Offlineshop?

TC Offlineshop is a feature that allows players in Metin2 private servers to buy and sell items even while offline. It is crucial for players to maintain economic activity even when disconnected from the server. However, sometimes data inconsistencies can occur within this system, one of which is the corruption of enchant levels. This means the enchant level of a player's item might be saved with a different value in the database or read incorrectly.

What Causes This Problem?

This issue generally arises due to the following reasons:
- Inconsistencies during database updates,
- Synchronization errors between game server and auth server,
- Data transfer issues of item information between client and server,
- Errors during pack or unpack operations in Python.

How to Apply the Fix?

Firstly, ensure that enchant values are correctly retrieved via db_core. On the game server side, the following steps can be followed in C++ source code:

1. Check the correctness of enhance values when reading item data.
2. Ensure that enchant values are properly transferred when items are packaged through py_root in the Offlineshop module.
3. Verify that enchant values do not change when data is sent from auth server back to game server.

Checking and Repairing on Python Side

If parts of the offlineshop system are written in Python, especially during data transfers through uiscript and py gui, ensure that enchant values are preserved. Tools like Martysama can assist in Metin2 development processes.

What Should Be Done to Prevent This?

To prevent these types of errors from recurring, consider the following recommendations:
- Use triggers in database to check whether enchant values have changed.
- Monitor item transfers in game server logs.
- Perform thorough testing after server compile operations.

Conclusion

TC Offlineshop enchant corruption is a frequently encountered but solvable bug in Metin2 private servers. By controlling the data flow between C++ systems, Python, client src, and server src, you can easily resolve this issue. Such errors are minor details that must be paid attention to during Metin2 development. At Metin2Lobby, we will continue sharing advanced fixes and systems like this.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt