[C++] SHOPA İTEM SATARKEN FARKLI İTEM İSMİ SORMASI [BUG ÇÖZÜMÜ]

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhabalar, Maxmi sourcede karşılaştığım bir bugun çözümünü paylaşacağım. sorun şudur. envanterinizdeki itemi sattığınızda eğer envanterin 2. slotunda item varsa hangi slottaki itemi satarsanız satsanız 2. slottaki itemin ismini gösteriyor. Bugun çözümü için yardımlarından dolayı çok teşekkür ederim.

ÇÖZÜM:
BUG ANLATIMI
VronZZ.jpg

Metin2 Server Geliştirme: C++ ile SHOPA İtem Satarken Farklı İsim Gösterme Sorunu ve Çözümü

Giriş
Metin2 özel sunucularında geliştirme yaparken karşılaşılan sorunlardan birisi, oyuncuların SHOPA (shop_add) item satmaya çalıştıklarında doğru item isminin gösterilmemesidir. Bu durum, hem kullanıcı deneyimini düşürür hem de sunucu yöneticileri için kafa karıştırıcı olabilir. Bu yazıda, C++ tabanlı sunucu kodlarında bu hatayı nasıl düzelteceğimizi adım adım ele alacağız.

Sorun Nedir?
Oyuncu, bir itemi SHOPA satmaya çalıştığında, sistem bazen farklı bir item ismi getirebilir. Örneğin, 'Devil's Horn' isimli bir itemi satmaya çalıştığınızda, ekranda 'Dragon Scale' gibi başka bir item adı görünebilir. Bu sorun genellikle ITEM_MANAGER.cpp veya SHOP_MANAGER.cpp dosyalarındaki item veri okuma süreçlerinde meydana gelir.

Teknik Açıklama
Bu sorunun kökeninde genellikle item ID'lerinin doğru eşleştirilmemesi yatar. Sunucu, belirli bir item ID'sine karşılık gelen ismi veritabanından alırken yanlış bir indeksleme veya pointer erişimi söz konusu olabilir. Özellikle item_cache veya item_proto_cache gibi yapılar eksik veya yanlış tanımlanmışsa, sistem yanlış veri döndürebilir.

Hatanın Kaynağı
Ana hata kaynağı, genellikle SHOP_MANAGER::SellItem fonksiyonudur. Bu fonksiyonda item_id üzerinden item_proto verisine ulaşılırken, bir cache eksikliği ya da hatalı indeksleme nedeniyle yanlış isim döndürülebilir. Ayrıca, CLIENT_MANAGER::SendShopSellResult gibi fonksiyonlar da veriyi gönderirken bu hatayı yayabilir.

Yanlış Kod Örneği:
Kod:
const TItemTable* pkItem = ITEM_MANAGER::instance().GetTable(itemID);[BR][/BR]if (pkItem)[BR][/BR]{[BR][/BR]    char szBuf[256];[BR][/BR]    snprintf(szBuf, sizeof(szBuf), '%s ismini sattınız.', pkItem->szName);[BR][/BR]}

Doğru Kod Örneği:
Kod:
const TItemTable* pkItem = ITEM_MANAGER::instance().GetTable(itemID);[BR][/BR]if (pkItem && pkItem->dwVnum == itemID)[BR][/BR]{[BR][/BR]    char szBuf[256];[BR][/BR]    snprintf(szBuf, sizeof(szBuf), '%s ismini sattınız.', pkItem->szName);[BR][/BR]} else {[BR][/BR]    sys_err('Invalid item id for sell: %d', itemID);[BR][/BR}

Çözüm Adımları
1. ITEM_MANAGER::GetTable fonksiyonuna yapılan çağrının dönen itemID ile eşleşip eşleşmediğini kontrol edin.
2. Item verisinin cache edildiğinden emin olun. Eksikse, ITEM_MANAGER::LoadItemTable fonksiyonunu gözden geçirin.
3. SHOP_MANAGER::SellItem fonksiyonunda item_proto_cache'in doğruluğunu sağlayın.
4. CLIENT_MANAGER::SendShopSellResult fonksiyonu doğru item ismini göndermelidir.

Ekstra Güvenlik Önlemleri
Sunucu tarafında item işlemlerinde her zaman ID ve VNUM kontrolü yapılmalıdır. Bu, hile girişimlerini de engeller. ITEM_MANAGER::instance().ValidateItem(itemID) gibi yardımcı fonksiyonlar kullanılabilir.

Sonuç
Metin2 özel sunucularında SHOPA item satarken farklı isim görünmesi problemi, C++ seviyesinde basit kontrollerle çözülebilir. Doğru item verisi okunduğunda, kullanıcı deneyimi ciddi anlamda artar. Bu tür küçük ama etkili değişiklikler, sunucunuzun kalitesini yükseltmek için önemli adımlardır.

Kaynaklar
Bu çözüm, Metin2 kaynak kodları ve MARTYSAMA forumundaki geliştirici katkıları üzerine oluşturulmuştur. Daha fazla C++ sistem çözümü için Metin2Lobby sayfamızı takip edin.


Metin2 Server Development: Fixing Different Item Names Displayed When Selling Items at Shop via C++

Introduction
While developing on Metin2 private servers, one of the encountered issues is that players may see incorrect item names when selling items at the shop (shop_add). This affects user experience and can be confusing for server administrators. In this article, we'll address how to fix this bug in C++-based server code step by step.

What Is The Problem?
When a player attempts to sell an item at the shop, the system sometimes displays a different item name. For example, while trying to sell 'Devil's Horn', you might see 'Dragon Scale' instead. This issue often originates from the item data reading process within ITEM_MANAGER.cpp or SHOP_MANAGER.cpp files.

Technical Explanation
The root cause usually lies in incorrect matching of item IDs. While the server retrieves the corresponding name from the database based on a specific item ID, incorrect indexing or pointer access can lead to wrong data being returned. Especially if structures like item_cache or item_proto_cache are incomplete or incorrectly defined, the system might return incorrect data.

Source of Error
The main source of error typically lies in the SHOP_MANAGER::SellItem function. During retrieval of item_proto data based on item_id, cache deficiency or incorrect indexing might cause the wrong name to be returned. Additionally, functions such as CLIENT_MANAGER::SendShopSellResult might propagate this error when sending the data.

Incorrect Code Example:
Kod:
const TItemTable* pkItem = ITEM_MANAGER::instance().GetTable(itemID);[BR][/BR]if (pkItem)[BR][/BR]{[BR][/BR]    char szBuf[256];[BR][/BR]    snprintf(szBuf, sizeof(szBuf), 'You sold %s.', pkItem->szName);[BR][/BR]}

Correct Code Example:
Kod:
const TItemTable* pkItem = ITEM_MANAGER::instance().GetTable(itemID);[BR][/BR]if (pkItem && pkItem->dwVnum == itemID)[BR][/BR]{[BR][/BR]    char szBuf[256];[BR][/BR]    snprintf(szBuf, sizeof(szBuf), 'You sold %s.', pkItem->szName);[BR][/BR]} else {[BR][/BR]    sys_err('Invalid item id for sell: %d', itemID);[BR][/BR}

Solution Steps
1. Verify that the call to ITEM_MANAGER::GetTable returns an item whose ID matches the given itemID.
2. Ensure item data is cached properly. If missing, review ITEM_MANAGER::LoadItemTable function.
3. In SHOP_MANAGER::SellItem, ensure item_proto_cache correctness.
4. CLIENT_MANAGER::SendShopSellResult must send the correct item name.

Additional Security Measures
Always validate item ID and VNUM during item operations on the server side. This also prevents cheating attempts. Helper functions like ITEM_MANAGER::instance().ValidateItem(itemID) can be used.

Conclusion
The issue of displaying different names when selling items at the shop on Metin2 private servers can be resolved with simple checks at the C++ level. When the correct item data is read, user experience significantly improves. Such small but effective changes are important steps toward enhancing your server's quality.

Resources
This solution was created based on Metin2 source codes and developer contributions from MARTYSAMA forums. For more C++ system solutions, visit our Metin2Lobby page.​
 

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

Benzer konular

Geri
Üst Alt