Metin2 Server Güncelleme: Proto, Quest ve Çekirdek Değişikliklerini Güvenle Yayınlama
Hazırlayan: Metin2VIP Editörleri Yayın: 7 dk okuma
İçindekiler
Çalışan bir Metin2 sunucusunda değişikliklerin çok azı yeniden başlatmadan uygulanır. /reload p eşya, canavar, beceri ve yasaklı kelime tablolarını bütün kanallarda, /reload a GM listesini yeniler; quest, cube, balıkçılık ve kanal durumu için olan /reload komutları ise yalnız komutun yazıldığı oyun çekirdeğinde çalışır. Drop ve kutu dosyaları, regen, CONFIG, market, artı basma ve efsun tabloları ile yeni çekirdek ikilisi yeniden başlatma ister. Güvenli yayın bu yüzden bir bakım düzeniyle yapılır: duyuru, düzgün kapatma, soğuk yedek, test sunucusunda denenmiş değişiklik ve hazır bir geri dönüş planı.
Hangi dosyanın ne zaman okunduğu oyun ve db çekirdeğinin kaynak kodundan, komut ve betik adları yaygın sunucu paketinden alındı; ek sistemler kuran sunucularda yeniden yükleme komutları farklı olabilir.
Bakım nasıl duyurulur, sunucu nasıl kapatılır?
- Bakımı sitede ve Discord'da başlama saati ve tahmini süresiyle önceden duyur.
- Oyunda
/noticeya da/big_noticeyaz; ikisi de P2P üzerinden bütün çekirdeklere gider. /shutdownyaz. Bütün oyun çekirdeklerinde 10 saniyelik bir sayım başlar: önce "Oyun 10 saniye sonra kapanacak.", sonra her saniye "%d saniye sonra oyun kapanacak." yazar. Sayım bitince GM olmayan oyuncular oyundan çıkarılır, 10 saniye sonra kalan bağlantılar da kapanır. Çekirdekler bundan sonra yeni giriş almaz ama süreçler açık kalır; auth bu komuttan etkilenmez.sh admin_panel.sh 2ilestop.py'yi çalıştır: önce auth ve oyun çekirdekleri, en son db kapanır. db syslog'undaMainLoop exited, Starting cache flushingsatırını ve sürecin çıktığını gör.- Soğuk yedeği al (yedekleme).
Sayım yalnız 10 saniye sürdüğü için asıl uyarıyı dakikalar önce duyurularla yap. Bakımdan sonra oyuncuları almadan ekibin girmesi gerekiyorsa auth'un CONFIG'ine SHUTDOWNED yazmak işe yaramaz, çünkü auth adımında GM ayrımı yoktur (giriş akışı). Bunun yerine güvenlik duvarında auth portunu bir süre yalnız ekibin adreslerine aç.
Hangi değişiklik /reload ile gelir, hangisi yeniden başlatma ister?
Bütün /reload komutları IMPLEMENTOR yetkisi ister (GM komutları rehberi). Argümansız /reload, u, p ve s'yi birlikte çalıştırır.
| Değişiklik | Nasıl geçer | Kapsam ve not |
|---|---|---|
| item_proto, mob_proto değerleri | /reload p |
Bütün kanallar; haritadaki canavarlar eski değerle kalır |
| item_proto, mob_proto satır ekleme ya da silme | Yeniden başlatma | /reload p bu durumda risklidir (aşağıda) |
| skill_proto, banword | /reload p |
Beceri formülünde hata varsa eski tablo kalır |
| shop, shop_item, refine_proto, item_attr, item_attr_rare | Oyun çekirdeklerini yeniden başlatma | /reload p bunları yalnız db'de yeniler |
| gmlist, gmhost | /reload a |
Bütün kanallar (GM yapma) |
| state_user_count | /reload u |
Yalnız komutun yazıldığı çekirdek |
| cube.txt | /reload c |
Yalnız o çekirdek (cube.txt) |
| fishing.txt | /reload f |
Yalnız o çekirdek |
| Quest | Derleme ve yeniden başlatma | /reload q yalnız o çekirdekte (aşağıda) |
| oxquiz.lua | Gerekmez | Her OX açılışında yeniden okunur |
| Drop ve kutu dosyaları, group.txt, group_group.txt, blend.txt, dragon_soul_table.txt, regen ve harita dosyaları | Oyun çekirdeklerini yeniden başlatma | Okunamayan drop, kutu ya da grup dosyası çekirdeği cannot load ... ile kapatır (drop dosyaları) |
| CONFIG, GENERAL_CONFIG, CMD, locale_string.txt, exp_table | İlgili çekirdekleri yeniden başlatma | Açılışta okunur |
| BANIP | auth'u yeniden başlatma | Yalnız auth okur |
| conf.txt | db'yi yeniden başlatma | En güvenlisi sunucunun tamamını yeniden açmak |
| mob_exp gibi oran bayrakları | /eventflag |
Anında ve kalıcı (oranlar ayarı) |
"Yalnız o çekirdek" yazan komutlar, GM'in o anda bulunduğu haritayı taşıyan oyun çekirdeğinde çalışır. Değişikliği bütün çekirdeklere geçirmenin pratik yolu yeniden başlatmadır.
/reload p ne yapar, nerede risklidir?
db çekirdeği bütün tabloları yeniden okur. Paketteki ayarla (PROTO_FROM_DB = 0, MIRROR2DB = 1) eşya ve canavar tabloları db klasöründeki txt dosyalarından gelir ve MySQL'e yeniden yansıtılır; sütunların anlamı item_proto yazısında. Ardından db, yalnız beceri, yasaklı kelime, eşya ve canavar tablolarını kanallı bütün çekirdeklere gönderir; çekirdekler de oyunculardaki değerleri yeniden hesaplar. Market, artı basma ve efsun tabloları db'nin belleğinde yenilenir ama çalışan çekirdeklere gitmez. Dosya okunamazsa db syserr'e QUERY_RELOAD_PROTO: cannot load tables yazar ve çekirdeklere hiçbir şey göndermez.
Risk eşya tablosundadır. Oyuncuların her eşyası, çekirdeğin bellekteki eşya tablosunda kendi satırını gösterir. Tablo yeniden kurulurken satır sayısı ve sırası aynı kalırsa eşyalar yeni değerleri görür. Satır eklenir ya da silinirse eşyalar başka satırları ya da artık geçersiz bir bellek alanını gösterebilir. Yeni eşya ve canavar bu yüzden bakımda yeniden başlatmayla yayınlanır. İstemcinin kendi item_proto ve mob_proto dosyası da aynı yamada güncellenmelidir (proto araçları).
/reload q neden canlıda risklidir?
/reload q, komutun yazıldığı çekirdeğin bütün quest ortamını kapatıp derlenmiş dosyalardan yeniden kurar. Öteki çekirdekler eski questle devam eder; aynı quest haritadan haritaya farklı davranır. O anda quest penceresi açık olan ya da bir seçim bekleyen oyuncuların konuşması kapatılan ortama bağlıdır. Kod bu konuşmaları kapatmadan ortamı sildiği için oyuncu konuşmayı sürdürdüğünde çekirdek çökebilir. Komutu test sunucusunda ya da oyuncu yokken kullan.
Quest güncellemesi: derleme ve kayıtlı ilerleme
Questler sh admin_panel.sh 777 ile derlenir; bu seçenek pre_qc.py -ac çalıştırır. Betik önce object klasörünü siler, sonra quest_list'teki questleri sırayla derler ve ilk hatada "Error occured on quest ..." yazıp durur. Hata olsa da çıkış kodu başarılıdır. Sonuçta object klasörü yarım kalır. Çalışan çekirdekler questleri açılışta belleğe aldığı için sorun hemen görünmez; çekirdekleri bu hâlde yeniden başlatırsan hatalı quest ve listede ondan sonra gelen questler eksik kalır.
Oyuncunun quest ilerlemesi player veritabanındaki quest tablosunda, quest adı (szName) ve bayrak adı (szState) ile tutulur; questin bulunduğu durum __status bayrağında bir sayıdır. Bu paketin derlenmiş dosyalarında start durumu 0'dır, öteki durumların numarası durumun adından türetilmiş büyük sayılardır (object/state/<quest> dosyasında görülür). Bunun iki sonucu var:
- Bir queste yeni durum eklemek mevcut numaraları kaydırmaz.
- Bir durumun ya da questin adını değiştirmek kayıtlı ilerlemeyi bağlantısız bırakır. Quest adını değiştirmen gerekiyorsa sunucu kapalıyken quest tablosundaki
szNamedeğerlerini de yeni adla güncelle.
Quest yazımının kendisi quest yazma yazısında.
Yeni game ve db ikilisi nasıl yayınlanır?
- Eski ikiliyi sakla. Makefile'daki
installhedefishare/bin/gamedosyasını silip yenisini kopyalar, eskisini saklamaz. Öncecp -p share/bin/game share/bin/game.eskigibi bir kopya al; db için de aynısı. - Bağları kontrol et. Çalışan süreçler eski dosyayla devam eder, yeni ikili çekirdekler yeniden başlayınca devreye girer. Çekirdek adları (
srv1-ch1-core1gibi)share/bin/game'e sembolik bağ olmalıdır. Dosyalar Windows üzerinden taşındıysa bağlar sabit bağa ya da ayrı kopyaya dönüşmüş olabilir; o zaman çekirdekler eski ikiliyi açmaya devam eder vegen.pyyeniden çalıştırılmalıdır (server dosyaları). - game ile db'yi birlikte derle. Oyun çekirdeği açılışta db'den gelen tabloların boyutunu kendi tanımlarıyla karşılaştırır; uyuşmazsa
mob table size errorya daitem table size erroryazıp kapanır. - İstemciyle eşleştir. Paket yapısını değiştiren bayraklar sunucuda ve istemcide birlikte değişmelidir; uyumsuzlukta istemci "Unknown packet header" ile kapanır (source derleme).
- Sürümü doğrula. Her çekirdek açılışta klasörüne
VERSION.txtyazar; yeniden başlatmadan sonra bütün çekirdeklerde yeni derleme numarasını gör.
Test sunucusu nasıl kurulur?
Test sunucusu canlı verinin kopyasıyla çalışmalıdır. En son yedeği ayrı bir MySQL'e yüklemek hem test verisini hazırlar hem yedeği denemiş olur. Ayrı veritabanları, ayrı portlar ve HOSTNAME'ler kullan; güvenlik duvarında yalnız ekibe aç; ekip için ayrı bir istemci serverinfo'su hazırla (serverinfo).
Test db çekirdeğini hiçbir zaman canlı MySQL'e bağlama. MIRROR2DB açıkken proto tablolarını yeniden yazar, önbelleğindeki karakterleri de canlı verinin üstüne kaydeder. TEST_SERVER'ı testte de 0 bırak: açıkken herkes en yüksek GM yetkisini alır, beceri kitabı bekleme süresi ve efsun sınırı kalkar, gördüğün davranış canlıdakiyle aynı olmaz. GM yetkisini gmlist'ten ver.
Testte en az şunları gör: bütün çekirdeklerin syserr'i temiz açılması, giriş ve karakter seçimi, değişen sistemlerin kendisi, ilgili questler ve tam bir kapatma ve açma döngüsü.
Geri dönüş planı ve oyuncu verisi
Yayından önce geri dönüşü hazırla:
- Bakımda alınan soğuk yedek;
shareklasörünün, CONFIG'lerin ve conf.txt'nin arşivi; eski game ve db ikilileri;object.eski. - Geri dönüş kararını neye göre vereceğini önceden yaz: art arda çöken çekirdek, bozuk oyuncu verisi, oynanamayan bir sistem.
- Geri dönüşte
stop.pyile kapat, dosyaları ve ikilileri eski hâline getir, yeniden aç ve kontrol et. Veritabanını yalnız yeni sürüm veriyi değiştirdiyse ya da tablo yapısı değiştiyse geri yükle; aksi hâlde bakımdan sonra oynanan saatler boşa gider. - İstemci yaması paket yapısını değiştirdiyse istemciyi de geri al.
Oyuncu verisini korumak için tablo yapısı değişikliklerini (ALTER TABLE) yalnız sunucu kapalıyken yap ve player'a eklenen her sütunu player_deleted'a da ekle. Sunucu açıkken karakter ve eşya satırlarını elle düzenleme; tazminatı item_award ile ver (Metin2 veritabanları). Değişiklikleri yamadan sonra oyunculara açık bir yama notuyla duyur.
Sık sorulan sorular
- Metin2'de /reload p neleri yeniler?
- db çekirdeği bütün proto ve oyun tablolarını yeniden okur, ama çalışan oyun çekirdeklerine yalnız eşya, canavar, beceri ve yasaklı kelime tablolarını gönderir; oyuncuların değerleri yeni tabloya göre yeniden hesaplanır. Haritada o anda bulunan canavarlar eski değerleriyle kalır. Market, artı basma ve efsun tablolarındaki değişiklikler oyun çekirdekleri yeniden başlayınca geçer.
- Quest değiştirince sunucuyu kapatmak gerekir mi?
- Quest derlendikten sonra /reload q yalnız komutun yazıldığı oyun çekirdeğinin quest ortamını baştan kurar; öteki çekirdekler eski questle devam eder, o anda quest penceresi açık olan oyuncuların konuşmaları da yarıda kalır. Bütün çekirdeklerin aynı questi çalıştırması için bakımda oyun çekirdeklerini yeniden başlatmak gerekir.
- Yeni eşya ekledim, /reload p yeter mi?
- Yetmez. Satır eklemek ya da silmek eşya tablosunun boyutunu değiştirir; çalışan çekirdekte oyuncuların eşyaları tablodaki eski konumları gösterdiği için bu durumda /reload p risklidir. Yeni eşya bakımda yeniden başlatmayla ve istemcinin item_proto'su da güncellenerek yayınlanır.
İlgili sayfalar
- Metin2 cube.txt Tarif Yazımı (Server kurma)
- Metin2 Drop Dosyaları: mob_drop_item ve special_item_group Biçimi (Server kurma)
- Metin2 Giriş Akışı: auth, db ve game; Giriş Hataları (Server kurma)
- Metin2 GM Komutları: En Çok Kullanılan Komutlar ve Yetki Seviyeleri (Server kurma)
- Metin2 GM Nasıl Yapılır? gmlist Tablosu ve GM Yetki Seviyeleri (Server kurma)
Kategori: Server Kurma Server Kurulumu quest proto güncelleme reload bakım
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?