Bir Metin2 sunucusunu açtığınızda dövüşten loncalara, envanterden lonca savaşlarına kadar her şey aslında MySQL'de saklanır. Metin2 MySQL tabloları oyun mantığının kalıcı hafızasıdır: oyun çekirdeği (db ve game süreçleri) bu tabloları okur, yazar ve önbelleğe alır. Standart Metin2 sunucu kaynağı veriyi genellikle iki ayrı veritabanına böler: kimlik doğrulamayı tutan account ve oyun içi her şeyi tutan player. Bu yazıda bu iki şemanın ana tablolarını ve hangi tablonun ne işe yaradığını net bir şekilde açıklıyorum.
İki veritabanı: account ve player
Metin2'de veriyi iki mantıksal alana ayırmak bilinçli bir tercihtir. Hesap/giriş bilgileri (login, şifre, ban durumu, e-posta) account veritabanında durur; karakterler, eşyalar, loncalar ve görevler ise player veritabanında durur. Bu ayrım, ileride birden fazla oyun dünyasını (kanal) aynı hesap sistemine bağlamayı ve yetki sınırlarını ayrı tutmayı kolaylaştırır.
- account — kimlik doğrulama, ödeme/cash, ban ve güvenlik kodları.
- player — oyun durumu: karakterler, item'lar, lonca, safebox, görevler, arkadaş listesi.
account veritabanı
En önemli tablo account tablosudur. Her satır bir oyuncu hesabını temsil eder. Tipik sütunlar şunlardır:
id— hesabın benzersiz birincil anahtarı;playertablosundakiaccount_idbuna bağlanır.login— kullanıcı adı (giriş için).password— MySQL'inPASSWORD()fonksiyonuyla hash'lenmiş şifre.social_id— ikinci güvenlik şifresi (depo/pin için).email— hesabın e-posta adresi.status— hesap durumu (OK,BLOCKgibi).securitycode,availDt— güvenlik kodu ve hesabın geçerlilik/premium bitiş tarihi.
Şifrenin nasıl saklandığını görmek için basit bir sorgu:
SELECT id, login, status FROM account.account WHERE login = 'oyuncu1';
Yeni hesap oluştururken şifre düz metin değil, hash olarak yazılır:
INSERT INTO account.account (login, password, social_id, email)
VALUES ('oyuncu1', PASSWORD('gizliSifre'), '7777', 'mail@ornek.com');
player veritabanının kalbi: player tablosu
player tablosu her karakteri bir satır olarak tutar. Oyuncunun seviyesinden konumuna, statlarından altınına kadar her şey buradadır. Sık kullanılan sütunlar:
id— karakterin birincil anahtarı (geneldepidolarak anılır).account_id— hangi hesaba ait olduğu (account.account.id).name— karakter adı (sunucuda benzersiz).job— sınıf (0 savaşçı, 1 ninja, 2 sura, 3 şaman).level,exp,level_step— seviye ve tecrübe.st,ht,dx,iq— sırasıyla kuvvet, vücut, çeviklik, zeka statları.gold— karakterin yang miktarı.hp,mp,stat_point,skill_point— can/mana ve dağıtılmamış puanlar.map_index,x,y— karakterin bulunduğu harita ve koordinatlar.part_main,part_hair— giyilen silah/zırh ve saç görünümü.skill_group,playtime— skill ağacı ve toplam oynama süresi.
Bir karakterin seviyesini ve altınını okumak için:
SELECT name, level, gold, map_index
FROM player.player
WHERE name = 'Kahraman';
Karakter slotları: player_index
Bir hesap birden fazla karakter taşıyabilir. player_index tablosu, hangi hesabın hangi karakter id'lerine sahip olduğunu tutar. Tipik olarak id (account_id) ile birlikte pid0, pid1, pid2, pid3 sütunları vardır; her biri bir karakter slotunu işaret eder. Karakter seçim ekranı bu tabloyu okur.
Eşyalar: item tablosu
item tablosu oyundaki tüm fiziksel eşyaları (envanter, donanım, depo) tek tabloda tutar. Önemli sütunlar:
id— eşyanın benzersiz id'si.owner_id— eşyanın sahibi karakterinpid'si.window— eşyanın bulunduğu yer (INVENTORY,EQUIPMENT,SAFEBOX,MALL).pos— pencere içindeki slot konumu.vnum— eşyanın proto numarası (hangi eşya olduğu;item_proto'ya bakar).count— adet (üst üste binebilen eşyalarda).socket0–socket2— takılı taşlar veya özel değerler.attrtype0–attrtype6veattrvalue0–attrvalue6— eşyanın bonus tipleri ve değerleri.
item_proto ve mob_proto ise "şablon" tablolarıdır: her eşyanın/canavarın temel özelliklerini (isim, tür, fiyat, saldırı) tanımlar. item tablosundaki vnum, item_proto'daki bir satıra karşılık gelir.
Lonca, depo ve diğer tablolar
Sosyal ve ilerleme sistemleri kendi tablolarında yaşar:
guild— lonca adı, lideri, seviyesi ve deneyimi.guild_member— hangi karakterin hangi loncada ve hangi rütbede olduğu.safebox— depo şifresi ve depo altını; eşyalar yineitemtablosundawindow=SAFEBOXile durur.quest— her karakterin görev bayrakları (görev ilerlemesi anahtar/değer olarak).affect— karakter çıkış yaptığında devam eden buff/efekt durumları.messenger_list— arkadaş listesi ilişkileri.
Bu tablolar birbirine pid (karakter id) üzerinden bağlanır; örneğin bir karakterin tüm eşyalarını item.owner_id = player.id ilişkisiyle çekersiniz. Şemayı bu mantıkla okuduğunuzda, görünürdeki dağınıklık aslında temiz bir ilişkisel yapıya dönüşür.
Tablolarla çalışırken dikkat edilmesi gerekenler
Önemli bir nokta: db süreci karakter ve eşya verisini bellekte önbelleğe alır. Oyuncu çevrimiçiyken doğrudan UPDATE çalıştırırsanız, çıkış sırasında çekirdeğin yazdığı veri sizinkini ezebilir. Bu yüzden veri düzenlemelerini oyuncu çevrimdışıyken yapın, her zaman önce yedek alın (mysqldump) ve test ortamında deneyin.
Sık Sorulan Sorular
account ve player veritabanları neden ayrı?
Kimlik doğrulama ile oyun verisini ayırmak güvenlik ve esneklik sağlar. Aynı hesap sistemine birden fazla oyun dünyası bağlanabilir, yetkiler ayrı tutulur ve giriş tablosu oyun yükünden etkilenmez.
Bir karakterin tüm eşyaları nerede?
player veritabanındaki item tablosunda. owner_id sütunu karakterin id'sine (pid) eşittir; window sütunu eşyanın envanterde mi depoda mı olduğunu söyler.
Oyuncu çevrimiçiyken altın eklemek güvenli mi?
Genellikle hayır. Çekirdek veriyi önbellekte tutar ve çıkışta tablonun üzerine yazar. Güvenli yol oyun içi komut kullanmak ya da oyuncu çevrimdışıyken güncellemektir.
Metin2 veritabanınızı düzenlemekte veya temiz bir şema kurmakta yardıma mı ihtiyacınız var? MySQL şeması, performans ve sunucu kurulumu konusunda destek için benimle iletişime geçin.