Metin2 istemcisinin arayüzü baştan sona Python ile yazılmıştır ve bu pencereleri kendi sunucuna göre şekillendirmek istiyorsan işin başladığı yer metin2 root python dosyalarıdır. Envanterin yerini değiştirmek, sohbet penceresini büyütmek ya da yeni bir buton eklemek için motoru kurcalamana gerek yok; doğru .py dosyasını bulup mantıklı bir düzenleme yapman yeterli. Bu yazıda root paketinin nasıl çalıştığını, dosyaları nasıl açıp düzenleyeceğini ve değişiklikleri istemcide nasıl test edeceğini sırayla anlatıyorum.
Root paketi ve arayüz mimarisi
İstemci, arayüzü üç ayrı parçadan birleştirir ve bu ayrımı anlamadan dosya kalabalığında kaybolursun:
- root — Asıl Python mantığı burada.
ui.pyarayüz çatısını (Window, Board, Button, TextLine gibi sınıfları) tanımlar;uiInventory.py,uiCharacter.py,uiChat.py,interfaceModule.pygibi dosyalar ise her pencerenin davranışını yönetir. - uiscript — Pencerelerin yerleşimi burada tutulur.
inventorywindow.pygibi dosyalar HTML değil, Python sözlüğü (dict) biçiminde geometriyi tarif eder: koordinatlar, genişlik, yükseklik ve alt elemanlar. - locale — Metinler ve dile bağlı ayarlar (
locale_string.txt,uiscriptiçindeki bazı etiketler) burada bulunur.
Yani bir pencerenin nasıl göründüğü büyük ölçüde uiscript'te, nasıl davrandığı ise root'tadır. Çoğu görsel düzenleme için yalnızca uiscript'e dokunman yeterli olur.
Paketleri açıp düzenleme ortamı kurma
İstemci bu dosyaları root.epk / root.eix ve uiscript.epk / uiscript.eix şeklinde şifreli paketlerde saklar. Düzenlemek için önce açman gerekir:
- Paketleri açıp tekrar paketlemek için EterNexus gibi bir araç kullan.
.eixdosyasını açtığında içindeki klasör yapısını dışarı çıkarabilirsin. - Dosyalar çoğunlukla derlenmiş
.pychâlinde gelir. Eğer kaynak.pyelinde yoksa, Python 2 için bir decompiler (örneğinuncompyle2) ile geri çevirmen gerekir. İstemci Python 2.2 tabanlı olduğu için modern Python 3 araçları çoğu zaman uymaz. - Birçok özel sunucu, geliştirme kolaylığı için istemciyi paketler yerine açık klasörlerden okuyacak şekilde ayarlar. Bu mümkünse, root ve uiscript klasörlerini doğrudan düzenleyip paketleme adımını atlayabilirsin.
Düzenleme için söz dizimi vurgulu herhangi bir editör (VS Code, Notepad++) işini görür. Dosyaları her zaman UTF-8 değil, istemcinin beklediği kodlamada kaydet ve girintilerde sekme/boşluk karışımından kaçın — Python girintiye duyarlıdır.
uiscript ile pencere yerleşimini değiştirmek
En sık yapılan iş bir pencerenin yerini ya da boyutunu değiştirmektir. uiscript/inventorywindow.py dosyası kabaca şöyle bir yapıdadır:
window = {
"name" : "InventoryWindow",
"x" : SCREEN_WIDTH - 176,
"y" : SCREEN_HEIGHT - 37 - 565,
"style" : ("movable", "float",),
"width" : 176,
"height" : 565,
"children" : (
{
"name" : "board",
"type" : "board",
"x" : 0,
"y" : 0,
"width" : 176,
"height" : 565,
"children" : (
# başlık, sekmeler, slotlar...
),
},
),
}
Pencereyi sola kaydırmak için "x" değerini, daha geniş yapmak için "width" değerini değiştirirsin. Unutma: dış pencerenin genişliğini büyütürsen içindeki board elemanının genişliğini de uyumlu hâle getirmen gerekir, yoksa arka plan grafiği taşar. Koordinatlarda SCREEN_WIDTH ve SCREEN_HEIGHT sabitleri pencereyi ekran köşesine sabitlemeni sağlar; sabit sayı yerine bunları kullanmak farklı çözünürlüklerde düzgün durur.
root içindeki mantığı düzenlemek
Yerleşim yetmediğinde, davranışı root tarafında değiştirirsin. Örneğin uiInventory.py, layout dosyasını şu mantıkla yükler:
import ui
import uiScriptLocale
class InventoryWindow(ui.ScriptWindow):
def __LoadWindow(self):
pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self, "uiscript/inventorywindow.py")
self.wndItem = self.GetChild("ItemSlot")
# ... elemanlara referanslar
GetChild çağrısındaki isim, uiscript dosyasındaki "name" alanıyla birebir eşleşmek zorundadır. Yeni bir buton eklediysen önce uiscript'te tanımlar, sonra root tarafında GetChild("YeniButon") ile yakalar ve SetEvent ile bir fonksiyona bağlarsın. İsim uyuşmazsa istemci None döndürür ve genelde 'NoneType' object has no attribute ... hatasıyla çöker.
ui.py dosyasına dokunmak ileri seviye bir iştir: tüm pencereler bu çatıyı paylaştığı için buradaki bir hata her arayüzü etkiler. Yeni bir bileşen türü gerekmedikçe ui.py'ı olduğu gibi bırak.
Paketleme, önbellek ve hata ayıklama
Düzenlemeyi bitirince dosyaları geri paketle (ya da açık klasör modundaysan doğrudan kaydet) ve istemciyi yeniden başlat. Birkaç pratik nokta:
- İstemci eski paketleri önbelleğe alabilir; emin olmak için hem
.epkhem.eixdosyalarını birlikte güncelle. - Bir şey çalışmazsa ilk bakacağın yer istemci klasöründeki
syserr.txtdosyasıdır. Python istisnaları, hatalı satır numarasıyla birlikte buraya yazılır. - Sık görülen hata: girinti uyuşmazlığı (
IndentationError), kapatılmamış parantez ya da uiscript dict'inde eksik virgül. Python sözlüklerinde her elemanın sonundaki virgülü unutma.
Yaygın hatalar ve ipuçları
- Orijinali yedekle. Düzenlemeye başlamadan root ve uiscript paketlerinin bir kopyasını al; geri dönmek dakikalar değil saniyeler sürsün.
- Tek seferde tek değişiklik yap. On dosyayı birden değiştirip test etme; hata aramak işkenceye döner.
- İsim tutarlılığı her şeydir. uiscript'teki
"name"ile root'takiGetChildaynı yazılmalı; büyük/küçük harf bile önemlidir. - Çözünürlüğü düşün. Sabit koordinatlar yerine
SCREEN_WIDTH/SCREEN_HEIGHTkullan ki pencere geniş ekranda da yerinde dursun.
Sık Sorulan Sorular
Root dosyaları .pyc olarak geliyor, kaynağı nasıl bulurum?
Birçok dosya derlenmiş .pyc hâlinde dağıtılır. Python 2 için bir decompiler (örneğin uncompyle2) ile okunabilir .py hâline getirebilirsin. Bazı topluluk sürümlerinde temiz kaynak zaten paylaşılmıştır; mümkünse derlenmişi çözmek yerine doğrudan kaynakla çalış.
Sadece pencerenin yerini değiştireceğim, root'a dokunmam gerekir mi?
Hayır. Yer, boyut ve alt eleman düzeni tamamen uiscript tarafındadır. Buton davranışı, olay bağlama veya yeni mantık eklemiyorsan root dosyalarına hiç girmen gerekmez.
Değişiklik istemcide görünmüyor, sebebi ne olabilir?
Genellikle ya paket güncellenmemiştir (.eix/.epk çiftini birlikte yenile), ya bir Python hatası vardır. İlk olarak syserr.txt dosyasına bak; çoğu zaman sorunu satır numarasıyla birlikte orada bulursun.
Arayüzü kendi sunucuna göre baştan tasarlamak mı istiyorsun? Metin2 istemci özelleştirmesi, root düzenlemesi ve özel UI tasarımı konusunda yardıma ihtiyacın varsa benimle iletişime geç — projeni birlikte hayata geçirelim.