İçeriğe geç

Metin2 Harita Ekleme: Sunucu ve Client Tarafı Adım Adım

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

Kısaca: Sunucuda harita için locale/turkey/map altında Setting.txt, Town.txt ve server_attr içeren bir klasör açılır, map/index dosyasına 'numara klasör' satırı eklenir ve numara bir çekirdeğin CONFIG'indeki MAP_ALLOW listesine yazılır. İstemcide harita klasörü maps paketine konur ve atlasinfo.txt'ye ad, başlangıç koordinatı ve boyut satırı eklenir. İstemci haritayı adından değil koordinattan bulduğu için Setting.txt'teki BasePosition ve MapSize ile atlasinfo satırı birebir aynı olmalıdır.
İçindekiler
  1. Önce numara ve koordinat seç
  2. Sunucu tarafı: harita klasörü
    1. Setting.txt
    2. Town.txt
    3. server_attr
    4. Regen dosyaları
  3. map/index dosyası
  4. CONFIG: MAP_ALLOW
  5. Oyuncuyu haritaya nasıl götürürsün?
  6. İstemci tarafı: harita klasörü
  7. İstemci tarafı: atlasinfo.txt ve ad tabloları
  8. Kontrol listesi
  9. Sık görülen hatalar

Metin2'ye yeni bir harita eklemek iki ayrı işten oluşur. Sunucuda haritanın klasörü (Setting.txt, Town.txt, server_attr ve isteğe bağlı regen dosyaları) açılır, map/index dosyasına bir satır eklenir ve harita numarası bir çekirdeğin CONFIG'indeki MAP_ALLOW listesine yazılır. İstemcide haritanın arazi klasörü pakete konur ve atlasinfo.txt'ye bir satır eklenir. İki taraf birbirini harita adıyla değil koordinatla tanır; en sık hata, sunucudaki başlangıç koordinatıyla istemcideki satırın uyuşmamasıdır.

Anlatılanlar game çekirdeğinin ve istemcinin kaynak kodundan çıkarıldı; resmî yapıdan türeyen sunucuların çok büyük çoğunluğunda aynı işler. Arazinin kendisini (yükseklik, doku, nesneler) hazırlamak harita düzenleyicinin işidir; burada hazır bir haritanın oyuna nasıl bağlandığı anlatılıyor.

Önce numara ve koordinat seç

Her haritanın iki kimliği vardır: sunucunun kullandığı harita numarası ve dünyadaki yerini belirleyen başlangıç koordinatı (BasePosition). Numara MAP_ALLOW'da, questlerde ve GM komutlarında geçer; koordinat ise ışınlanmada ve istemcinin haritayı seçmesinde kullanılır.

Numara seçerken şunlara dikkat et:

  • 1-20, 21-40 ve 41-60 (ayrıca 184-192) arası numaralar krallık haritası sayılır. Başka krallığın oyuncusu burada %10 az hasar verir, koruma modundaki oyuncuya kendi krallık haritasında saldırılamaz ve krallığı yazılmamış NPC'ler haritanın krallığını alır. Tarafsız bir harita için bu aralıkların dışında kal.
  • 10.000 ve üstü numaralar zindan kopyalarına ayrılmıştır; harita numarası bundan küçük olmalı.
  • Bazı numaraların kodda özel anlamı vardır: 113 OX haritasıdır ve girişte ayrı işlenir, 113 ile 200'de köye dönüş parşömeni çalışmaz, 114-117'de zindan ve etkinlik regen'i (d.regen_file gibi) hiçbir şey doğurmaz, 107-109'da açılabilecek zindan kopyası sayısı sınırlıdır. Kullanılmayan ve özel anlamı olmayan bir numara seç.

BasePosition ile MapSize birlikte haritanın dünyada kapladığı kutuyu belirler. Oyun birimi santimetredir; harita boyutu 25.600 birimlik (256 metre) alan sayısıyla yazılır. Kutu başka hiçbir haritanınkiyle çakışmamalıdır: sunucu bir koordinatın hangi haritada olduğunu index sırasıyla ilk eşleşen kutudan, istemci de atlasinfo.txt'deki ilk eşleşen satırdan bulur.

Var olan haritaların neredeyse hepsi 25.600'ün, birkaç küçük harita da 6.400'ün katı olan başlangıç noktaları kullanır. Sunucunun bölge ızgarası 64 metrelik (6.400 birim) olduğu için yeni haritayı da bu katlara oturt. Boş bir alan bulmak için bütün Setting.txt dosyalarındaki BasePosition ve MapSize değerlerini ya da istemcideki atlasinfo.txt'yi listeleyip kutuları karşılaştırmak yeterli; mevcut haritaların listesi haritalar sayfasında.

Sunucu tarafı: harita klasörü

Klasör share/locale/turkey/map/<harita adı>/ altında açılır. Klasör adı index dosyasında kullanılır; istemcideki klasörle aynı adı vermek düzeni korur, ama iki taraf birbirini bu adla bulmaz.

Setting.txt

Yongan Bölgesi'nin sunucudaki dosyası:

ScriptType	MapSetting
CellScale	200
HeightScale	0.500000
ViewRadius	128
MapSize	4	5
BasePosition	409600	896000
TextureSet	metin2_A1.txt
Environment	A1.msenv

Sunucu bu dosyadan yalnız MapSize, BasePosition ve CellScale satırlarını okur; TextureSet, Environment, HeightScale ve ViewRadius istemcinin işidir, ama dosya iki tarafta aynı tutulur. CellScale'i 200 bırak: istemci bu değeri okumaz, hücre boyunu sabit 200 kabul eder; farklı bir değer iki tarafın harita boyunu birbirinden ayırır. MapSize 0 0 ya da CellScale 0 yazılırsa çekirdek "Invalid Settings file" der.

Town.txt

İlk iki sayı haritanın köy noktasıdır (yerel metre). Ardından altı sayı daha yazılırsa bunlar sırasıyla Shinsoo, Chunjo ve Jinno oyuncularının noktası olur ve oyuncular kendi krallıklarının noktasına döner. Yongbi Çölü'nün dosyası, üç krallığı çölün üç ayrı köşesine koyar:

768 768
130 1408
171 163
1392 161

Bu noktalar "köyde yeniden başla" seçeneğinde, ölümden 3 dakika sonra otomatik dönüşte, köye dönüş parşömeninde ve oyuncu girişte yürünemez bir yerde kaldığında kullanılır.

Nokta küresel koordinata çevrilip ışınlanmayla kullanıldığı için harita dışına da taşabilir. İncelenen dosyalarda zindan haritaları bunu bilerek kullanıyor: Kırmızı Ejderha Kalesi'nin krallık noktaları -1282 924, haritanın başlangıcından geriye taşarak Ateş Diyarı'na düşüyor. Zindanda köyde yeniden başlayan oyuncu böylece girişin bulunduğu haritaya çıkıyor.

server_attr

server_attr, haritanın her yarım metrelik hücresi için bir öznitelik tutan ikili dosyadır: yürünemez (BLOCK), su (WATER), güvenli bölge (BANPK: PvP ve canavar doğuşu yok) ve nesne (OBJECT). Başında haritanın 64 metrelik bölge sayısı yazar, yani MapSize × 4; Yongan Bölgesi için 16 × 20.

  • Dosyanın boyutu Setting.txt'tekinden büyükse çekirdek "CHECK! 'Setting.txt' and 'server_attr' MAP_SIZE!!" yazıp açılışta durur.
  • Dosya yoksa günlüğe "cannot open" düşer ve harita öznitelik verisiz kalır. Bu yapıda çekirdek öznitelik okunan ilk anda (canavar doğurma ve dolaşma gibi) çöker; server_attr atlanamaz.

Dosya, istemcinin alan klasörlerindeki attr.atr verisinden üretilir. İkisi aynı kaynaktan gelmezse sunucunun yürünemez saydığı yerle istemcinin gösterdiği arazi ayrışır. Bu dosyayı haritayı hazırlayan araç çıkarır; incelenen sunucu kaynağında aynı dönüşümü yapan kod, varsayılan derlemeye girmeyen bir test aracında duruyor.

Regen dosyaları

regen.txt, npc.txt, boss.txt ve stone.txt isteğe bağlıdır; yoksa harita boş açılır. Biçimleri regen dosyaları yazısında.

map/index dosyası

share/locale/turkey/map/index her satırda bir haritayı numarasıyla ve klasör adıyla tutar:

1 metin2_map_a1
63 metin2_map_n_desert_01
351 metin2_map_n_flame_dungeon_01
  • // ya da # ile başlayan satır atlanır.
  • Satır sonu karakteri olmayan satır atlanır; son satır da tek bir Enter ile bitmeli.
  • Boş satır bırakma. Çekirdek boş satırı bir önceki satırın tekrarı gibi okur ve o haritayı ikinci kez yükler; harita o çekirdekte açıksa regen dosyaları da iki kez yüklenir ve canavarlar çift doğar. İncelenen sunucunun index dosyası tam olarak böyle, bir boş satırla bitiyor.
  • index'teki her haritanın Setting.txt ve Town.txt dosyası, harita o çekirdekte açık olmasa da okunur. Biri eksikse çekirdek "cannot load MapIndex" diyerek kapanır. server_attr ve regen dosyaları ise yalnız haritayı açan çekirdekte okunur.
  • Dosyayı UTF-8 BOM ile kaydetme; ilk satırın numarası okunamaz ve çekirdek aynı hatayla kapanır.

Bütün çekirdekler aynı index dosyasını kullanmalıdır. Bir çekirdek oyuncuyu başka haritaya ışınlarken hedefin hangi harita olduğunu koordinattan, index'teki kutulardan bulur; listesi eksik olan çekirdek hedefi tanıyamaz.

CONFIG: MAP_ALLOW

Harita, numarası bir çekirdeğin CONFIG'indeki MAP_ALLOW satırına yazılınca o çekirdekte açılır. İncelenen sunucuda ch1/core2'nin satırı:

MAP_ALLOW: 61 62 63 64 65 66 67 68 69 70 71 72 73 104 208 216 217 351 352
  • İki noktadan sonra tek boşluk bırak; okuyucu iki noktadan sonraki ilk karakteri atlar.
  • Uzun listeyi birden çok MAP_ALLOW satırına bölebilirsin, numaralar birikir. Aynı numara iki kez yazılırsa çekirdek "multiple MAP_ALLOW setting" diyerek kapanır.
  • Bir çekirdeğe en fazla 32 harita ver; db'ye ancak bu kadarı bildirilir.
  • index'te olmayan bir numara hata vermez ama hiçbir şey de açmaz; satırdaki 352 böyle.

Haritaya hangi kanaldan gidileceği de buradan belirlenir. db her çekirdeğe yalnız kendi kanalındaki ve 99. kanaldaki çekirdeklerin haritalarını bildirir. Yeni haritayı her kanalda bir çekirdeğe ver; bütün kanallar için ortak olacaksa ch99 çekirdeğine koy. Aynı kanalda iki çekirdek aynı haritayı açarsa ikisi de haritayı ayrı ayrı yükler ve canavarlar ikisinde de doğar; bundan kaçın. CONFIG'in diğer satırları CONFIG ayarları yazısında.

Haritayı açan çekirdek yoksa ışınlanma "cannot find map location" ile reddedilir. Oyuncu bir şekilde haritayı açmayan bir çekirdeğe düşerse bu yapıda köyüne gönderilir; orijinal kodda bağlantısı kesilir.

Oyuncuyu haritaya nasıl götürürsün?

Harita açıldıktan sonra oraya bir yol gerekir. Bütün yollar koordinatla çalışır, ama birimleri farklıdır:

Yol Koordinat
Quest: pc.warp(x, y) Küresel oyun birimi (metre × 100)
Quest: pc.warp_local(harita, x, y) Haritanın kendi başlangıcına göre oyun birimi
Işınlanma NPC'si (WARP türü, adı 'Ad X Y') Küresel metre
GM: /warp x y Küresel metre
GM: /goto x y Bulunulan haritada yerel metre
GM: /goto ad settings.lua'daki kayıt

/goto <ad> kısayolu share/locale/turkey/settings.lua dosyasındaki kayıtlardan gelir. Sunucunun dosyasında Yongan Bölgesi böyle kayıtlı:

add_goto_info("a1", 0, 1, 4693, 9642)
add_bgm_info(1, "enter_the_east.mp3", 0.5)

add_goto_info sırasıyla ad, krallık (0 herkes), harita numarası ve küresel metre koordinatını alır. add_bgm_info haritaya girişte çalacak müziği ve ses düzeyini belirler; müzik dosyası istemcinin BGM klasöründe bulunmalı. Işınlanma NPC'sinin adına koordinat yazma kuralı mob_proto yazısında, quest tarafı quest fonksiyonları yazısında.

İstemci tarafı: harita klasörü

İstemci haritayı maps paketindeki kendi klasöründen yükler. Yongan Bölgesi'nin klasörü:

metin2_map_a1/
  mapproperty.txt
  setting.txt
  000000/ ... 003004/        (her biri 256 × 256 metrelik bir alan)
    areaproperty.txt
    areadata.txt
    areaambiencedata.txt
    attr.atr
    height.raw
    tile.raw
    water.wtr
    shadowmap.dds
    shadowmap.raw
    minimap.dds
  • mapproperty.txt: ScriptType MapProperty ve MapType "Outdoor". Indoor türündeki harita bu istemcide yüklenmez ve istemci kendini kapatır.
  • setting.txt: sunucudakiyle aynı değerler. ScriptType, ViewRadius (0'dan büyük), CellScale, HeightScale, MapSize ve TextureSet zorunludur. Biri eksikse ya da doku seti textureset klasöründe bulunamazsa ayarlar yarıda kalır, syserr'e LoadSetting hatası düşer ve arazi eksik ya da dokusuz görünür.
  • Alan klasörleri: ad X × 1000 + Y biçiminde altı haneli yazılır; 4 × 5'lik haritada 000000'dan 003004'e kadar 20 klasör vardır. Her birinde areaproperty.txt (ScriptType AreaProperty ve AreaName satırlarıyla) zorunludur, yoksa o alanın arazisi yüklenmez.

Ortam dosyası (Environment) önce harita klasöründe, yoksa d:/ymir work/environment/ altında aranır. Haritanın kullandığı zemin dokuları, ağaç ve bina modelleri ile nesne özellikleri zone ve property paketlerinde bulunmalıdır; harita yalnız var olan dokuları ve nesneleri kullanıyorsa harita klasörü yeterlidir. İstemci regen dosyalarını okumaz; harita düzenleyicinin bıraktığı monsterareainfo.txt gibi dosyalar oyunda kullanılmaz.

Var olan bir haritanın aynısını yeni bir numarayla açıyorsan istemcide bütün veriyi kopyalamak zorunda değilsin: mapproperty.txt'ye ParentMapName satırı yazılırsa istemci arazi verisini, setting.txt dahil, o haritanın klasöründen okur. Sunucuda ise kopyanın kendi klasörü, kendi BasePosition değeri ve server_attr kopyası gerekir; atlasinfo.txt'de de kendi satırı olmalıdır.

Klasörün pakete nasıl konacağı pack dosyaları yazısında.

İstemci tarafı: atlasinfo.txt ve ad tabloları

İstemci bir ışınlanmada sunucudan yalnız koordinat alır ve haritayı atlasinfo.txt listesinden bulur. Bu istemcide dosya root paketindedir; bazı istemcilerde locale klasöründe durur.

metin2_map_a1	409600	896000	4	5

Sütunlar klasör adı, BasePosition X, BasePosition Y ve 25.600 birimlik alan cinsinden genişlik ile yüksekliktir; değerler sunucudaki Setting.txt ile birebir aynı olmalıdır. Satır yoksa istemci syserr dosyasına "NOT_FOUND_GLOBAL_POSITION" yazar ve haritayı yükleyemez. Koordinat yanlışsa istemci haritayı ya hiç bulamaz ya da kutusu çakıştığı başka bir haritayı yükler. Dosyada yorum desteği yoktur.

Geri kalanlar isteğe bağlıdır ama eksiklikleri göze batar:

Dosya Ne yapar Eksikse
d:/ymir work/ui/atlas/<ad>/atlas.sub ya da harita klasöründe atlas.sub Büyük harita görseli Büyük harita görselsiz kalır
root/uimapnameshower.py MAP_NAME_IMAGE ve locale/tr/ui/mapname/ görseli Girişte harita adı afişi Afiş çıkmaz
root/localeinfo.py MINIMAP_ZONE_NAME_DICT ve locale_game.txt anahtarı Hatıra kâğıdı ipucunda harita adı İpucunda "GPS ERROR" yazar
locale/common/map/<ad>_point.txt Büyük harita işaretleri Sunucunun NPC listesi varsa fark edilmez

Büyük haritadaki NPC işaretleri zaten sunucudan gelir: regen dosyalarına m satırıyla konan NPC'ler ve ışınlanma NPC'leri oyuncu haritaya girdiğinde istemciye yollanır. Bu dosyaların istemcideki yeri client yapısı yazısında.

Kontrol listesi

  1. Numara ve boş bir koordinat kutusu seç.
  2. Sunucuda klasörü aç: Setting.txt, Town.txt, server_attr, gerekiyorsa regen dosyaları.
  3. map/index'e satırı ekle; dosyanın sonunda boş satır bırakma.
  4. Numarayı her kanalda bir çekirdeğin MAP_ALLOW'una ya da ch99'a yaz, çekirdekleri yeniden başlat.
  5. İstemcide harita klasörünü pakete koy, atlasinfo.txt'ye satırı ekle, paketleri yeniden oluştur.
  6. Haritaya giden bir quest, ışınlanma NPC'si ya da settings.lua kaydı ekle.
  7. GM hesabıyla /warp ile gir, çekirdek günlüğünde server_attr, Setting.txt ya da regen hatası olup olmadığına bak.

Sık görülen hatalar

Belirti Neden
Çekirdek "cannot load MapIndex" ile kapanıyor index'teki bir haritanın Setting.txt ya da Town.txt dosyası yok, klasör adı yanlış ya da dosya BOM'lu
"CHECK! 'Setting.txt' and 'server_attr' MAP_SIZE!!" server_attr başka boyuttaki bir haritaya ait
Çekirdek harita yüklenirken çöküyor server_attr eksik
"multiple MAP_ALLOW setting" Aynı numara MAP_ALLOW'da iki kez
Işınlanma "cannot find map location" ile reddediliyor Haritayı o kanalda açan çekirdek yok
İstemci haritayı yüklemiyor, syserr'de NOT_FOUND_GLOBAL_POSITION atlasinfo.txt satırı eksik ya da koordinatı yanlış
Oyuncu başka bir haritanın arazisinde görünüyor Koordinat kutuları çakışıyor
Canavarlar iki kat doğuyor index dosyasında boş satır
Başka krallıkların oyuncuları haritada %10 az vuruyor Numara krallık aralığında (1-60)

Sık sorulan sorular

Yeni haritaya ışınlanınca istemci haritayı açmıyor. Neden?
İstemci haritayı atlasinfo.txt'deki koordinat kutularından bulur. Satır yoksa ya da koordinatı sunucudaki Setting.txt ile uyuşmuyorsa syserr dosyasına NOT_FOUND_GLOBAL_POSITION yazar ve haritayı yükleyemez. Satırın BasePosition ve MapSize değerlerini sunucudaki dosyayla karşılaştır.
Harita numarasını nasıl seçmeliyim?
1-20, 21-40 ve 41-60 arası numaralar krallık haritası sayılır: başka krallığın oyuncusu orada %10 az hasar verir ve krallığı yazılmamış NPC'ler o krallığa geçer. Tarafsız bir harita için bu aralıkların dışında, kullanılmayan ve 10.000'den küçük bir numara seç.
server_attr dosyası olmadan harita açılır mı?
Bu yapıda hayır. Dosya yoksa harita öznitelik verisiz kalır ve çekirdek öznitelik okunan ilk anda çöker. Boyutu Setting.txt ile uyuşmayan bir server_attr ise çekirdeği açılışta durdurur.
Haritayı bütün kanallarda açmak için ne yapmalıyım?
Her kanalda haritayı bir çekirdeğin MAP_ALLOW listesine yaz. 99. kanal ortak kanaldır: oradaki bir çekirdeğin açtığı haritaya bütün kanallardan gidilebilir.

İlgili sayfalar

Kategori: Server Kurma Proto ve Veri Dosyaları sunucu dosyaları harita ekleme map index map_allow atlasinfo

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.