İçeriğe geç

Metin2 Veritabanları: account, common, player ve log Tabloları

Hazırlayan: Metin2VIP Editörleri Yayın: 9 dk okuma

Kısaca: Metin2 sunucusu beş MySQL veritabanı kullanır: account hesapları, common ortak ayarları ve GM listesini, player karakterleri, eşyaları ve proto tablolarını, log oyun kayıtlarını tutar. hotbackup bağlantısı zorunludur ama varsayılan olarak boş kalır. Hesapları auth çekirdeği okur, karakter ve eşya verisini db çekirdeği önbellekte tutup aralıklarla MySQL'e yazar.
İçindekiler
  1. Metin2 hangi veritabanlarını kullanır?
  2. Hangi çekirdek hangi veritabanına bağlanır?
  3. account veritabanı
    1. account tablosu
    2. Hesap açmak, banlamak ve parola değiştirmek
    3. Diğer account tabloları
  4. common veritabanı
  5. player veritabanı
    1. Karakter ve hesap verisi
    2. Proto ve oyun tabloları
  6. item_proto ve mob_proto MySQL'den mi okunur, dosyadan mı?
  7. log veritabanı
  8. hotbackup veritabanı
  9. Sunucu açıkken tabloları düzenlemek neden tehlikeli?
  10. Şemaları yükleme sırası ve güncelleme dosyaları

Metin2 sunucusu beş MySQL veritabanı kullanır: account hesapları, common ortak ayarları ve GM listesini, player karakterleri, eşyaları ve proto tablolarını, log oyun içi kayıtları tutar. Beşinci veritabanı hotbackup'tır; db çekirdeği ona bağlanmadan açılmaz ama varsayılan ayarla içine hiçbir şey yazılmaz. Hesapları auth çekirdeği okur, karakter ve eşya verisini db çekirdeği önbellekte tutar ve aralıklarla MySQL'e yazar.

Şemalar sunucu paketinin sql klasöründen gelir. Aşağıdaki tablo ve sütun adları bu şemalara, hangi çekirdeğin neyi okuduğu ise kaynak koda dayanır; tabloları değiştirmemiş sunucularda yapı aynıdır.

Metin2 hangi veritabanlarını kullanır?

Veritabanı Ne tutar Önemli tablolar
account Hesaplar account, block_exception, iptocountry
common Bütün kanalların ortak ayarları locale, gmlist, gmhost, exp_table, priv_settings, spam_db
player Karakterler, eşyalar, loncalar, proto tabloları player, player_index, item, quest, affect, safebox, item_proto, mob_proto, shop, skill_proto
log Oyun içi kayıtlar log, command_log, loginlog, goldlog, refinelog, chat_log
hotbackup Saatlik oyuncu yedeği (kapalı) boş

Bütün tablolar MyISAM motoru ve latin1 karakter kümesiyle tanımlıdır.

Hangi çekirdek hangi veritabanına bağlanır?

Çekirdek Ayar dosyası Bağlandığı veritabanları
db conf.txt SQL_PLAYER (player), SQL_ACCOUNT (account), SQL_COMMON (common), SQL_HOTBACKUP (hotbackup)
auth CONFIG PLAYER_SQL (account), COMMON_SQL (common)
Oyun çekirdekleri CONFIG PLAYER_SQL (player), COMMON_SQL (common), LOG_SQL (log)

Auth çekirdeğinde PLAYER_SQL satırının account veritabanını göstermesi bilerek yapılır: auth giriş sorgularını bu bağlantıdan account tablosuna yollar. Auth log veritabanına bağlanmaz. db çekirdeği account veritabanını yalnız ülke engeli (iptocountry, block_exception) ve bakiye güncellemesi için kullanır; karakter verisinin hepsi player'dadır. conf.txt ve CONFIG'deki SQL satırlarının sırası farklıdır, ayrıntısı db conf.txt yazısında.

Paketin oluşturduğu mt2 kullanıcısı yalnız localhost'tan bağlanır ve beş veritabanında yalnız SELECT, INSERT, UPDATE ve DELETE yapabilir. Çekirdeklerin günlük işleyişi için bu yetkiler yeterlidir.

account veritabanı

account tablosu

Sütun Anlamı
id Hesap numarası; player_index.id ve depo eşyalarının sahibi bu numaradır
login Hesap adı (en fazla 16 karakter); girişte küçük harfe çevrilir
password MySQL PASSWORD() biçiminde özet: yıldız ve 40 onaltılık karakter
social_id Karakter silme kodu; son 7 karakteri karşılaştırılır
status OK değilse giriş reddedilir ve bu değer hata olarak gönderilir
availDt Bu tarihten önce hesap kullanılamaz (süreli kapatma)
create_time, last_play Oluşturma ve son giriş zamanı; last_play her girişte güncellenir
silver_expire, gold_expire, safebox_expire, autoloot_expire, fish_mind_expire, marriage_fast_expire, money_drop_rate_expire Hesaba bağlı süreli bonusların bitiş zamanları
email, real_name, question1... answer2, securitycode Web sitesi ve eski güvenlik sistemleri için alanlar
cash Bakiye; pc.charge_cash quest fonksiyonu bu sütunu artırır

Giriş sırasında kontroller şu sırayla yapılır: parola yanlışsa "Hesap ismi veya şifre yanlış.", availDt ileri bir tarihse "Bu hesap kullanılamıyor.", hesap zaten oyundaysa "Hesabın zaten bağlı.", status OK değilse o değere karşılık gelen ileti. BLOCK için istemci "Bu hesap engellendi." yazar.

Hesap açmak, banlamak ve parola değiştirmek

-- yeni hesap
INSERT INTO account.account (login, password, social_id, status)
VALUES ('hesapadi', CONCAT('*', UPPER(SHA1(UNHEX(SHA1('GucluBirParola'))))), '1234567', 'OK');

-- kalıcı engel
UPDATE account.account SET status = 'BLOCK' WHERE login = 'hesapadi';

-- 3 günlük kapatma
UPDATE account.account SET availDt = DATE_ADD(NOW(), INTERVAL 3 DAY) WHERE login = 'hesapadi';

-- parola değiştirme
UPDATE account.account SET password = CONCAT('*', UPPER(SHA1(UNHEX(SHA1('YeniParola'))))) WHERE login = 'hesapadi';

Parola özeti oyun çekirdeğinde hesaplanır, bu yüzden MySQL'in PASSWORD() fonksiyonunun bulunup bulunmaması fark etmez; yukarıdaki ifade aynı özeti verir. Auth çekirdeği parolanın yalnız ilk 16 karakterini kullanır.

Diğer account tabloları

GameTime, GameTimeIP ve GameTimeLog eski ücretli oyun süresi sistemine aittir. iptocountry ülke bazlı IP engeli için IP aralıklarını, block_exception bu engelden muaf hesapları tutar. string adlı tablo player veritabanında da bulunan anahtar ve metin tablosudur.

common veritabanı

Tablo Görevi
locale mKey ve mValue satırları. LOCALE (turkey) ve SKILL_POWER_BY_LEVEL satırları olmadan oyun çekirdeği açılmaz; ayrıca DB_NAME_COLUMN, sınıflara göre SKILL_POWER_BY_LEVEL_TYPE0-7
gmlist GM hesapları ve yetki seviyeleri
gmhost GM'lerin bağlanabileceği IP listesi (yalnız GM_HOST_CHECK açıkken)
exp_table Seviye başına gereken tecrübe puanı; bu kaynakta EXP tablosu buradan okunur
priv_settings Varsayılan krallık bonusları: tür 1 eşya düşme, 2 Yang düşme, 3 on kat Yang, 4 tecrübe; değer yüzde, bitiş tarihiyle
spam_db Spam sayılan kelimeler ve puanları

locale tablosundaki LOCALE değeri sunucunun hangi yerel ayarla çalışacağını belirler; turkey yazılıyken çekirdekler locale/turkey klasörünü ve locale_name sütununu kullanır. exp_table ve priv_settings paketin updates klasöründen gelir; priv_settings'te süresi geçmiş satırlar db çekirdeği açılırken silinir. Krallık bonuslarının ve tecrübe oranlarının ayarlanması oranlar ayarı yazısında. GM tablolarının kullanımı GM yapma yazısında.

player veritabanı

Karakter ve hesap verisi

Tablo Görevi
player Karakterin bütün kalıcı değerleri: ad, sınıf, seviye, tecrübe, Yang, statü, konum, beceri seviyeleri, derece puanı, at bilgisi
player_index Hesap numarasına bağlı karakterler (pid1-pid5) ve seçilen krallık
player_deleted Silinen karakterler; player ile aynı sütunlara sahip olmalıdır
item Bütün eşyalar: sahip, pencere, konum, adet, vnum, taşlar ve efsunlar
quest Quest bayrakları: oyuncu, quest adı, bayrak adı, değer
affect Süresi devam eden etkiler (iksirler, beceri etkileri)
safebox Depo boyutu, depo şifresi ve depodaki Yang
item_award Oyuncuya dışarıdan gönderilen eşyalar
guild, guild_member, guild_grade, guild_comment, guild_war* Loncalar ve lonca savaşları
marriage, messenger_list, horse_name, myshop_pricelist Evlilik, arkadaş listesi, at adı, pazar fiyat hafızası
land, object Lonca arsaları ve binaları
monarch, monarch_candidacy, monarch_election Kral sistemi

item.window eşyanın nerede olduğunu söyler: INVENTORY, EQUIPMENT, SAFEBOX, MALL, DRAGON_SOUL_INVENTORY, BELT_INVENTORY. Envanterdeki ve üstteki eşyalarda owner_id karakter numarasıdır; depo (SAFEBOX) ve Nesne Market deposu (MALL) eşyalarında ise hesap numarasıdır.

Karakter silinince satır player_deleted tablosuna SELECT * ile kopyalanır. Bu yüzden player'a sütun ekleyen her güncelleme aynı sütunu player_deleted'a da eklemelidir; paketteki kuşak sistemi betiği ikisine de part_acce ekler. Seviyesi conf.txt'deki PLAYER_DELETE_LEVEL_LIMIT (pakette 70) ya da üstünde olan karakter silinemez.

item_award web sitesinden ya da yönetim panelinden eşya göndermek için kullanılır. db çekirdeği taken_time boş olan kayıtları bu kaynakta 5 saniyede bir okur. mall 1 ise eşya Nesne Market deposuna, 0 ise normal depoya, oyuncu depoyu açtığında yerleşir:

INSERT INTO player.item_award (login, vnum, count, given_time, why, mall)
VALUES ('hesapadi', 27001, 200, NOW(), 'etkinlik odulu', 1);  -- 200 adet Kırmızı İksir(K)

Proto ve oyun tabloları

Tablo Görevi
item_proto, mob_proto Eşya ve canavar tabloları
refine_proto Artı basma tarifleri: malzemeler, ücret, başarı şansı
shop, shop_item NPC marketleri ve sattıkları eşyalar
skill_proto Beceri formülleri
item_attr, item_attr_rare Efsun havuzu ve 6-7. efsun havuzu
object_proto Lonca binası tarifleri
banword Yasaklı kelimeler

Bu tablolar db çekirdeği açılırken bir kez okunup bütün çekirdeklere gönderilir. Değişiklikten sonra db çekirdeği yeniden başlatılmalıdır; oyunda IMPLEMENTOR yetkisiyle yazılan /reload p eşya, canavar, beceri ve yasaklı kelime tablolarını sunucuyu kapatmadan yeniler. Sütunların ayrıntısı item_proto ve mob_proto yazılarında.

item_proto ve mob_proto MySQL'den mi okunur, dosyadan mı?

Orijinal Metin2 kodunda eşya ve canavar tabloları yalnız db klasöründeki item_proto.txt ve mob_proto.txt dosyalarından okunur. Bu kaynakta ENABLE_PROTO_FROM_DB tanımı açıktır ve seçimi conf.txt'deki iki satır yapar:

conf.txt Sonuç
PROTO_FROM_DB = 1 item_proto ve mob_proto MySQL'den okunur
PROTO_FROM_DB = 0 Tablolar db klasöründeki txt dosyalarından okunur
PROTO_FROM_DB = 0 ve MIRROR2DB = 1 txt'den okunan tablolar her açılışta MySQL'e yazılır

Paketteki conf.txt'de PROTO_FROM_DB 0 ve MIRROR2DB 1 yazılıdır. Bu durumda MySQL'deki item_proto yalnız bir yansıdır: orada yapılan değişiklik oyuna geçmez ve db çekirdeği bir sonraki açılışta tabloyu txt'deki değerlerle ezer. Değişiklik txt dosyasında yapılmalı ya da PROTO_FROM_DB 1'e çekilmelidir. Hangi yol seçilirse seçilsin istemcinin kendi proto dosyası ayrıca güncellenmelidir. shop, refine_proto, skill_proto, item_attr gibi diğer tablolar her durumda MySQL'den okunur.

log veritabanı

Grup Tablolar
Eşya ve karakter hareketleri log (eşya alma, düşürme, ticaret vb.), levellog, loginlog, loginlog2, change_name, change_empire
Ekonomi goldlog, money_log, refinelog, cube, acce, fish_log, quest_reward_log
Yönetim ve güvenlik command_log (GM komutları), hack_log, hack_crc_log, speed_hack
Sohbet shout_log, chat_log
Sistem bootlog (her çekirdek açılışı), dragon_slay_log
Eski bölgesel sistemler GameTimeLog, pcbang_loginlog, hackshield_log, vcard_log, invalid_server_log

Log tabloları hızla büyür. Bu kaynakta yazım miktarı CONFIG'deki DB_LOG_LEVEL satırıyla ayarlanır: 0 log veritabanına yazmayı kapatır, varsayılan 3'tür, paketin ortak ayar dosyasında 1 yazılıdır. Paketteki yedekleme betiği log veritabanının yalnız yapısını alır, içindeki kayıtları yedeklemez.

hotbackup veritabanı

db çekirdeği conf.txt'de SQL_HOTBACKUP satırı yoksa açılmaz, ama DISABLE_HOTBACKUP 1 iken bu veritabanına hiçbir şey yazmaz. Yedek açık olsaydı her saat için hb_ önekli yeni bir oyuncu tablosu oluşturulurdu; paketteki mt2 kullanıcısının tablo oluşturma yetkisi olmadığından bu özellik o kullanıcıyla çalışmaz. Boş da olsa veritabanı silinmemelidir.

Sunucu açıkken tabloları düzenlemek neden tehlikeli?

db çekirdeği karakterin player satırını ve eşyalarını MySQL'den bir kez okur, sonra önbellekteki kopya üzerinden çalışır. Değişen oyuncu verisini varsayılan ayarla yaklaşık 7 dakikada, eşyaları 5 dakikada bir MySQL'e yazar. Oyuncu oyundan çıktıktan sonra da önbellek 10 dakika daha tutulur; bu sürede oyuncu tekrar girerse veri MySQL'den değil önbellekten gelir, süre dolunca önbellekteki hali MySQL'e yazılır. quest ve affect satırları ise her girişte MySQL'den okunur, oyuncu oyundayken oyun çekirdeğinin belleğinde durur.

account, common ve log tabloları bu önbelleğe girmez. gmlist değişikliği için oyun çekirdeklerini yeniden başlatmak ya da oyunda /reload a yazmak, proto tablolarında db çekirdeğini yeniden başlatmak yeterlidir.

Şemaları yükleme sırası ve güncelleme dosyaları

Kurulum sırası sql/run.sh dosyasında yazılıdır: veritabanları ve kullanıcı, dört ana şema, updates klasörü (exp_table, priv_settings, chat_log, skill_proto, player güncellemeleri), en son kuşak sistemi tabloları. Adımların açıklaması server kurulumu yazısında.

  • updates/player__updates.sql: player_index'e beşinci karakter yuvası (pid5), efsun tablolarına Lycan efsunları ve kostüm sütunları, item.window'a GROUND ekler.
  • protos/: MySQL'e aktarılmış resmî protolardaki eksik değerleri (hasar çarpanı, Yang aralığı, binek kapasitesi vb.) düzelten UPDATE dosyaları; yalnız protolar MySQL'den okunacaksa gerekir.
  • updates/post/: eski kemer envanteri konumlarını yeni pencereye taşıyan sorgular. Dosyaların kendi notu, ne yaptığını bilmeden çalıştırılmamasını söyler.

Kodda kullanılan ama paketteki şemalarda bulunmayan iki tablo vardır: highscore (questlerde highscore.register ve highscore.show kullanılırsa) ve guild_invite_limit (CONFIG'de GUILD_INVITE_LIMIT: 1 ise). Bu özellikleri açmadan önce tabloların oluşturulması gerekir, aksi halde ilgili sorgular hata verir.

Sık sorulan sorular

Metin2'de hesap nasıl banlanır?
account tablosunda hesabın status değeri OK dışında bir değere, örneğin BLOCK'a çekilir; oyuncu girişte "Bu hesap engellendi." iletisini görür. Süreli kapatma için availDt sütununa ileri bir tarih yazılır, o tarihe kadar "Bu hesap kullanılamıyor." iletisi çıkar.
item_proto'yu MySQL'de değiştirdim ama oyunda değişmedi, neden?
Bu pakette conf.txt'de PROTO_FROM_DB 0 ve MIRROR2DB 1 yazılıdır. db çekirdeği protoları item_proto.txt'den okur ve her açılışta MySQL'deki tabloyu bu dosyayla ezer. Değişiklik txt dosyasında yapılmalı ya da PROTO_FROM_DB 1 yapılmalıdır.
Oyuncunun eşyasını veritabanından sunucu açıkken değiştirebilir miyim?
Önerilmez. db çekirdeği çevrimiçi oyuncunun ve oyundan çıktıktan sonraki 10 dakika boyunca o oyuncunun karakter ve eşya verisini önbellekte tutar ve önbellekteki haliyle MySQL'i ezer. Düzenleme sunucu kapalıyken ya da oyuncu çıktıktan 10 dakikadan fazla sonra yapılmalıdır.

İlgili sayfalar

Kategori: Server Kurma Server Kurulumu veritabanı server kurulumu mysql item_proto

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.