İçeriğe geç

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

Kısaca: Metin2'de çalışan sunucuya yalnız birkaç değişiklik 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ı yalnız komutun yazıldığı çekirdekte çalışır. Drop ve kutu dosyaları, regen, CONFIG, market, artı basma ve efsun tabloları ile yeni çekirdek ikilisi yeniden başlatma ister. Güvenli yol, değişikliği canlı verinin kopyasıyla çalışan bir test sunucusunda denemek, bakımda soğuk yedek alıp eski dosyaları geri dönüş için hazır tutmaktır.
İçindekiler
  1. Bakım nasıl duyurulur, sunucu nasıl kapatılır?
  2. Hangi değişiklik /reload ile gelir, hangisi yeniden başlatma ister?
    1. /reload p ne yapar, nerede risklidir?
    2. /reload q neden canlıda risklidir?
  3. Quest güncellemesi: derleme ve kayıtlı ilerleme
  4. Yeni game ve db ikilisi nasıl yayınlanır?
  5. Test sunucusu nasıl kurulur?
  6. Geri dönüş planı ve oyuncu verisi

Ç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?

  1. Bakımı sitede ve Discord'da başlama saati ve tahmini süresiyle önceden duyur.
  2. Oyunda /notice ya da /big_notice yaz; ikisi de P2P üzerinden bütün çekirdeklere gider.
  3. /shutdown yaz. 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.
  4. sh admin_panel.sh 2 ile stop.py'yi çalıştır: önce auth ve oyun çekirdekleri, en son db kapanır. db syslog'unda MainLoop exited, Starting cache flushing satırını ve sürecin çıktığını gör.
  5. 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 szName değ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 install hedefi share/bin/game dosyasını silip yenisini kopyalar, eskisini saklamaz. Önce cp -p share/bin/game share/bin/game.eski gibi 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-core1 gibi) 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 ve gen.py yeniden ç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 error ya da item table size error yazı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.txt yazar; 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:

  1. Bakımda alınan soğuk yedek; share klasörünün, CONFIG'lerin ve conf.txt'nin arşivi; eski game ve db ikilileri; object.eski.
  2. Geri dönüş kararını neye göre vereceğini önceden yaz: art arda çöken çekirdek, bozuk oyuncu verisi, oynanamayan bir sistem.
  3. Geri dönüşte stop.py ile 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.
  4. İ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

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?

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.