AutoGiveItem Boş Envanter Kontrolü

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
AutoGiveItem Boş Envanter Kontrolü


Kod:
#define ENABLE_AUTOGIVEITEM_CELL_CHECK                                        // AutoGiveItim Bos Envanter Kontrol


Kod:
//Arat LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool bMsg) {     TItemTable* p = ITEM_MANAGER::instance().GetTable(dwItemVnum);     if (!p)         return NULL; //Altına Ekle     [HASH=2]#ifdef[/HASH] ENABLE_AUTOGIVEITEM_CELL_CHECK     LPITEM itemCheck = ITEM_MANAGER::instance().CreateItem(dwItemVnum, bCount, 0, true, -1, true);     if (itemCheck)     {         int iEmptyCell = -1;         if (p->bType == ITEM_DS)             iEmptyCell = GetEmptyDragonSoulInventory(itemCheck); [HASH=2]#ifdef[/HASH] ENABLE_SPECIAL_STORAGE         else if (IsUpgradeItem(dwItemVnum))             iEmptyCell = GetEmptyUpgradeInventory(itemCheck);         else if (IsStoneSpecial(dwItemVnum, p->bType))             iEmptyCell = GetEmptyStoneInventory(itemCheck);         else if (ITEM_SKILLBOOK == p->bType)             iEmptyCell = GetEmptyBookInventory(itemCheck);         else if (IsFlowerItem(dwItemVnum))             iEmptyCell = GetEmptyFlowerInventory(itemCheck);         else if (IsAttrSpecial(dwItemVnum))             iEmptyCell = GetEmptyAttrInventory(itemCheck);         else if (IsChestItem(dwItemVnum))             iEmptyCell = GetEmptyChestInventory(itemCheck); [HASH=3]#endif[/HASH]         else             iEmptyCell = GetEmptyInventory(p->bSize);                  if (iEmptyCell == -1)         {             if (bMsg)                 ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanterinde yer yok autogiveitem!"));             return NULL;         }     } [HASH=3]#endif[/HASH]

AutoGiveItem Sistemi ve Boş Envanter Kontrolü Nedir?

Metin2 özel sunucularında geliştirilen sistemlerden biri olan AutoGiveItem, oyuncuya belirli bir zaman veya olay sonrası otomatik olarak envanterine eşya eklemeyi sağlar. Bu sistem genellikle login ödülü, görev tamamlama ödülü ya da PvP zafer ödülleri gibi durumlarda kullanılır. Ancak bu sistemin daha güvenli ve sorunsuz çalışması için önemli bir kontrol mekanizması gereklidir: Boş Envanter Kontrolü.

Neden Boş Envanter Kontrolü Gereklidir?

Otomatik eşya verme işlemi sırasında, oyuncunun envanterinde boş slot olmadığı takdirde eşyanın verilmesi başarısız olabilir. Bu durumda hem oyuncu memnuniyeti düşer hem de sunucu tarafında beklenmeyen hata durumları oluşabilir. Bu nedenle, AutoGiveItem sistemi geliştirilirken, oyuncunun envanterinde yeterli boş slot olup olmadığını kontrol eden bir fonksiyonun entegre edilmesi büyük önem taşır.

C++ Kaynak Kodlarda Uygulama Örneği

AutoGiveItem sistemi genellikle C++ ile yazılmış sunucu kaynak kodlarında yer alır. Oyuncunun envanterinde boş slot aramak için aşağıdaki gibi bir fonksiyon kullanılabilir:

int findEmptyInventorySlot(LPCHARACTER ch) {
for (int i = 0; i < INVENTORY_MAX_NUM; ++i) {
if (!ch->GetInventoryItem(i)) return i;
}
return -1; // Boş slot yok
}

Bu fonksiyon, oyuncunun envanterinde boş bir slot varsa onun indisini döner, aksi halde -1 döner. AutoGiveItem çağrısı yapılmadan önce bu kontrol yapılır.

Python Tarafında Envanter Kontrolü

Metin2 özel sunucularında Py Root dosyalarında da benzer kontroller yapılabilir. Python ile yazılmış GUI tabanlı sistemlerde, kullanıcıya eşya vermeden önce envanter kontrolü aşağıdaki gibi yapılabilir:

def check_inventory_empty_slots(character):
empty_count = 0
for slot in range(0, 45):
item = character.get_item_in_slot(slot)
if not item:
empty_count += 1
return empty_count

Bu fonksiyon, oyuncunun envanterinde kaç adet boş slot olduğunu döner. Eğer bu değer, verilecek eşya sayısından fazlaysa AutoGiveItem işlemi başlatılır.

Olası Sorunlar ve Çözüm Önerileri

Boş envanter kontrolü yapılmadığında aşağıdaki gibi sorunlarla karşılaşılabilir:

- Eşya verilemezse oyuncuya bilgi verilmemesi
- Eşyanın kaybolması
- Sunucuda loglama eksikliği

Bu sorunları çözmek için AutoGiveItem sisteminde loglama (logging), hata yakalama (error handling) ve kullanıcı bilgilendirme sistemleri entegre edilmelidir. Ayrıca, envanter doluysa eşya posta kutusuna yönlendirilerek oyuncunun daha sonra alabileceği bir sistem geliştirilebilir.

Sonuç

AutoGiveItem sisteminin güvenli ve kullanıcı dostu çalışması için boş envanter kontrolü şarttır. Bu kontrol, C++ veya Python seviyesinde uygulanabilir. Sistem geliştiricileri, bu kontrolü ihmal etmemeli ve her eşya verme işleminin ardından kullanıcıya geri bildirim sağlamalıdır.


What is AutoGiveItem and Empty Inventory Check?

The AutoGiveItem system, used in Metin2 private servers, automatically adds items to a player's inventory after a specific time or event. This system is commonly used for login rewards, quest completion rewards, or PvP victory rewards. However, for this system to work safely and without issues, an important control mechanism is required: Empty Inventory Check.

Why Is Empty Inventory Check Required?

If the player’s inventory has no empty slots during the automatic item-giving process, the item delivery may fail. In such cases, both player satisfaction decreases and unexpected errors may occur on the server side. Therefore, integrating a function that checks whether the player has sufficient empty slots in their inventory is crucial when developing the AutoGiveItem system.

Implementation Example in C++ Source Code

The AutoGiveItem system is generally implemented in C++ server source codes. To search for an empty slot in the player's inventory, a function like the following can be used:

int findEmptyInventorySlot(LPCHARACTER ch) {
for (int i = 0; i < INVENTORY_MAX_NUM; ++i) {
if (!ch->GetInventoryItem(i)) return i;
}
return -1; // No empty slot
}

This function returns the index of an empty slot if available, otherwise returns -1. This check is performed before calling the AutoGiveItem action.

Inventory Check with Python

Similar checks can also be performed in Py Root files of Metin2 private servers. In GUI-based systems written in Python, the inventory can be checked before giving items to the user as follows:

def check_inventory_empty_slots(character):
empty_count = 0
for slot in range(0, 45):
item = character.get_item_in_slot(slot)
if not item:
empty_count += 1
return empty_count

This function returns how many empty slots the player has in their inventory. If this value is greater than the number of items to be given, the AutoGiveItem operation begins.

Potential Issues and Solutions

Without checking for an empty inventory, the following issues may occur:

- No information provided to the player if the item cannot be delivered
- Item loss
- Lack of logging on the server

To solve these issues, logging, error handling, and user notification systems should be integrated into the AutoGiveItem system. Moreover, if the inventory is full, the item can be directed to the mail system so the player can retrieve it later.

Conclusion

An empty inventory check is essential for the safe and user-friendly operation of the AutoGiveItem system. This check can be implemented at either the C++ or Python level. System developers should not neglect this check and must provide feedback to users after each item-giving operation.
 

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

Benzer konular

Geri
Üst Alt