aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 Envanter Genişletme: Çanta Slotları ve Sayfa Ekleme

Metin2 envanter genişletme, oyuncuların en sık istediği server özelliklerinden biridir: standart çanta dolduğunda farm, drop ve depo yönetimi sancılı hale gelir. İşin püf noktası, envanterin tek bir yerde tanımlanmadığını anlamaktır — slot sayısı hem server source'da hem de client tarafında ayrı ayrı tutulur ve bu iki değerin birebir aynı olması gerekir. Bu rehberde çanta slotlarını ve sayfa sayısını adım adım, güvenli şekilde nasıl artıracağını anlatıyorum.

Envanter nasıl çalışır: slot, sayfa ve paylaşılan sabit

Metin2'de envanter bir slot dizisidir. Klasik yapıda her sayfa 45 slottan oluşur (9 sütun × 5 satır) ve toplam slot sayısı sayfa boyutunun katı olmak zorundadır. Varsayılan değer çoğu source'ta 90'dır, yani iki sayfa. Dört sayfa istiyorsan toplamı 180 yaparsın.

  • Toplam slot = sayfa sayısı × sayfa boyutu (45).
  • Slotların pozisyonu (pos) 0'dan başlar; equipment slotları bu aralığın üstünde ayrı bir blokta durur.
  • Server ve client aynı sabiti paylaşmazsa item pozisyonları kayar, eşya kaybı ve çökme yaşanır.

Server tarafı: length.h ve INVENTORY_MAX_NUM

Genişletmenin kalbi common/length.h dosyasındaki sabittir. Burada toplam slot sayısını ve sayfa boyutunu görürsün:

// common/length.h
enum EInventoryConstants
{
    INVENTORY_MAX_NUM   = 90,   // 2 sayfa × 45  ->  180 yaparsan 4 sayfa
    INVENTORY_PAGE_SIZE = 45,
};

INVENTORY_MAX_NUM değerini değiştirip değerin 45'in tam katı kaldığından emin ol. Sonra game binary'sini yeniden derle:

cd Server/game/src
make clean && make -j$(nproc)

Bu sabit, item kontrolü yapan birçok yerde kullanılır: char_item.cpp içindeki IsValidItemPosition ve eşya taşıma/koyma fonksiyonları, ayrıca input_main.cpp içindeki paket doğrulamaları. Hepsi INVENTORY_MAX_NUM'a göre çalıştığı için tek noktayı değiştirmen yeterli; ekstra if aramana gerek yok.

Veritabanı: item tablosu ve pozisyon kontrolü

Eşyalar oyuncuya değil, ayrı bir item tablosuna kayıtlıdır; her satır window (envanter/equipment) ve pos kolonlarıyla yerini belirtir. Genişletmede şemayı değiştirmen gerekmez çünkü pos zaten yeni, daha büyük değerleri tutabilecek bir tam sayı alanıdır. Yine de iki şeyi kontrol et:

  • Yedek al: player ve item tablolarının dump'ını çek. Pozisyon uyuşmazlığı eşya kaybına yol açabilir.
  • Test hesabıyla dene: yeni sayfalara eşya koyup karakteri relog'la; item tablosunda yeni pos değerlerinin (örn. 90–179) doğru yazıldığını gör.

DB cache'ini de yeniden derlemen iyi olur, çünkü db ve game aynı protokol başlıklarını paylaşır.

Client source: sabiti senkron tutmak

En kritik kural: client de aynı toplam slot sayısını bilmeli. Client source'unda envanter dizileri ve paket yapıları UserInterface projesindeki kendi sabitiyle boyutlanır. Server'da 90'dan 180'e çıktıysan, client'ta da aynı değeri güncelleyip UserInterface'i yeniden derle:

// Client UserInterface (ör. Packet.h / Locale_inc.h)
#define INVENTORY_MAX_NUM   180
#define INVENTORY_PAGE_SIZE 45

Eğer client source'un yoksa sadece python ile UI'ı büyütmek yetmez: binary hâlâ eski slot sayısıyla derlenmiştir, fazladan sayfaya konan eşya görünmez kalır veya bağlantı koparılır. Bu yüzden envanter genişletme için client source şart.

Client python: uiInventory.py ile yeni sayfalar

Binary doğru boyutta derlendikten sonra sıra görsel arayüzde. root/uiInventory.py içinde envanter penceresi sayfa düğmeleri ve slot ızgarasıyla çizilir. Burada yapılması gerekenler:

  • Sayfa sayısını arttır: pencere ek sayfa düğmesi/sekmesi gösterecek şekilde döngüyü ve GetInventoryPageCount mantığını güncelle.
  • Slot konumlarını player.INVENTORY_PAGE_SIZE sabitine göre hesapla; sabit kodlanmış 90 gibi sayıları temizle.
  • Pencere boyutu yetmezse .py içindeki genişlik/yükseklik veya ilgili .sub resimlerini düzenle.

Python tarafı yalnızca çizim yapar; gerçek slot sınırını binary belirler. Bu yüzden python'da gösterdiğin sayfa sayısı, derlenmiş INVENTORY_MAX_NUM ile uyumlu olmalı — fazlasını gösterirsen tıklamalar boşa düşer.

Test ve sık yapılan hatalar

Değişiklik sonrası mutlaka uçtan uca test et:

  • Server/client uyuşmazlığı: en yaygın hata. İki taraf farklı INVENTORY_MAX_NUM derlenmişse eşya pozisyonları kayar. İkisini de aynı anda güncelle ve derle.
  • 45'in katı olmayan değer: sayfa yarım kalır, son satırlar tıklanamaz. Toplamı her zaman 45 ile bölünebilir tut.
  • Exploit kontrolü: pet/dragon soul gibi ayrı pencereler de pozisyon kullanır; envanter sabitini büyütürken bu pencerelerin pos aralıklarıyla çakışmadığını doğrula.
  • Stabil yedek: canlıya geçmeden önce DB dump'ı ve eski binary'leri sakla; geri dönüş yolun açık olsun.

Sık Sorulan Sorular

Client source olmadan envanteri genişletebilir miyim?

Hayır. Python ile sadece görseli büyütürsün ama binary eski slot sayısıyla derlidir; fazladan slotlar çalışmaz ve sunucuyla uyuşmazlık çökmeye yol açar. Hem server hem client source gerekir.

Mevcut oyuncuların eşyaları kaybolur mu?

Toplam slot sayısını artırırsan mevcut pozisyonlar (0–89) yerinde kalır, yalnızca yeni boş slotlar eklenir; eşya kaybı olmaz. Ama yanlış sabit veya küçültme eşya kaybına yol açabilir, bu yüzden önce DB yedeği al.

Neden 45'in katı olmak zorunda?

Bir envanter sayfası 9×5 = 45 slottan oluşur. Toplam bunun katı değilse son sayfa eksik çizilir ve UI ile binary arasındaki slot indeksleri uyuşmaz.

Server projende temiz, exploit'siz bir envanter genişletme mi istiyorsun? Metin2 source ve client tarafında sistem geliştirme konusunda yardımcı olabilirim — projeni birlikte konuşalım: benimle iletişime geç.

Bu kategorideki tüm yazılar →

Devamı için