İçeriğe geç

Metin2 Source Derleme: Server ve Client Kaynak Kodu Nasıl Derlenir?

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

Kısaca: Metin2 server kaynak kodu 32 bit FreeBSD üzerinde GNU make (gmake) ve GCC 9 ile, Serversrc/Server klasöründeki üst Makefile çalıştırılarak derlenir; çıktı game_r ve db_r ile başlayan, sonunda derleme numarası olan iki dosyadır. Client kaynak kodu Windows'ta Visual Studio 2022 ile Metin2Build.sln açılıp Release | Win32 yapılandırmasında derlenir ve TurkmmoSF_Release.exe üretir. Paket yapısını değiştiren özellik bayrakları sunucudaki service.h ile istemcideki Locale_inc.h dosyasında aynı olmalıdır.
İçindekiler
  1. Kaynak paketinde neler var?
  2. Server derlemek için ne gerekir?
  3. Server nasıl derlenir?
    1. Yeni ikili sunucuya nasıl konur?
  4. Özellik bayrakları: service.h ve Locale_inc.h
  5. Client derlemek için ne gerekir?
  6. Client nasıl derlenir?
  7. Sık görülen derleme hataları
  8. Windows'ta server derlenebilir mi?
  9. Proto araçları ve quest derleyicisi

Metin2 kaynak kodu iki ayrı ortamda derlenir. Server tarafı, yani oyun çekirdeği game ile veritabanı çekirdeği db, 32 bit FreeBSD üzerinde GNU make (gmake) ve GCC 9 ile derlenir: Serversrc/Server klasöründe tek bir gmake komutu kütüphaneleri ve iki programı sırayla üretir. Client tarafı Windows'ta Visual Studio 2022 ile derlenir: Metin2Build.sln açılır, Release | Win32 seçilir, çıktı TurkmmoSF_Release.exe olur.

İki tarafın özellik bayrakları ayrı dosyalarda durur ve paket yapısını değiştirenler birlikte açılıp kapanmalıdır. Aşağıdaki anlatım kaynak paketindeki Makefile'lara, Visual Studio proje dosyalarına ve paketle gelen hazır ikililere dayanır. Klasörlerin ve modüllerin ne yaptığı Metin2 source yapısı yazısında.

Kaynak paketinde neler var?

Source/
  Serversrc/
    Server/      game, db, common, libthecore, libsql, libgame, libpoly, liblua
                 Makefile, __REVISION__, TurkmmoSF.sln
    Extern/      include: boost, IL, cryptopp
                 lib: libIL.a, libcryptopp.a, libpng.a, libjpeg.a ...
  Clientsrc/
    Client/      UserInterface ve 15 kütüphane, Metin2Build.sln, bin/
    Extern/      include: Python2, d3d8, granny2, IL, MSS.H, boost, cryptopp, lzo ...
                 lib: python27.lib, d3d8.lib, granny2.11.8.0.lib, mss32.lib ...
  Tools/
    Proto/       dump_proto ve Mysql2Proto

Klasörlerin birbirine göre yeri önemlidir. Server Makefile'ları Extern'e ../../../Extern, istemci projeleri ../../extern yoluyla ulaşır; Server ya da Client klasörü kendi Extern klasörünün yanından ayrılırsa başlık ve kütüphane dosyaları bulunamaz.

Pakette önceki derlemelerden kalan dosyalar da var: kütüphane klasörlerinde .o ve .a dosyaları, Client/bin altında hazır bir TurkmmoSF_Release.exe. Üst Makefile her parçayı derlemeden önce temizlediği için bunlar sorun çıkarmaz.

Server derlemek için ne gerekir?

Gereksinim Makefile'da Not
İşletim sistemi -m32, FreeBSD kütüphane yolları Paketteki game ve db, FreeBSD 11.4 i386 üzerinde derlenmiş ikililerdir.
make GNU make sözdizimi (ifeq, $(shell ...)) FreeBSD'de gmake adıyla kurulur; kaynakla gelen c.sh de gmake çağırır. FreeBSD'nin kendi make'i bu dosyaları okuyamaz.
Derleyici CC = g++9, -std=c++2a Paketteki ikililer GCC 9.3.0 ile derlenmiş. Başka bir derleyici adı kullanılacaksa her Makefile'daki CC satırı değiştirilir.
MySQL istemcisi -I/usr/local/include/mysql, /usr/local/lib/mysql/libmysqlclient.a Statik kütüphane bu yolda ve 32 bit olmalı. Paketteki ikiliye 5.5.62 sürümlü istemci kütüphanesi gömülü.
Sistem kütüphaneleri /usr/lib/libz.a, /usr/lib/liblzma.a, -lssl -lcrypto, -lmd FreeBSD'nin temel sisteminde bulunur.
Extern Boost 1.68, DevIL 1.7.8, Crypto++ 7.0 Başlıklar ve hazır .a dosyaları pakette; .a dosyalarının hepsi 32 bit i386.
Lua liblua/5.0 Lua 5.0.3 kaynağın içinde gelir, ayrıca kurulmaz. 5.2 klasörü varsayılan derlemede kullanılmaz.

Bütün parçalar -m32 ile 32 bit derlenir ve statik bağlanır (-static). 64 bit bir FreeBSD'de /usr/lib ve /usr/local/lib/mysql altındaki kütüphaneler 64 bit olduğu için bağlama adımı bu yollarda hata verir; en az uğraştıran ortam 32 bit (i386) bir FreeBSD'dir. Statik bağlandığı için çıkan ikili, çalışacağı makinede ayrıca MySQL istemci kütüphanesi istemez.

Makefile'lar FreeBSD'ye göre yazılmıştır: GNU make sözdiziminin yanında BSD sed'in sed -i '' biçimini ve FreeBSD'deki kütüphane yollarını kullanır. Başka bir sistemde derlemek için bu satırların ve Extern'deki hazır kütüphanelerin o sisteme göre uyarlanması gerekir.

Server nasıl derlenir?

cd Source/Serversrc/Server
gmake

Varsayılan hedef parçaları şu sırayla derler: Lua 5.0, libsql, libgame, libpoly, libthecore, ardından game ve db. Her parça önce temizlenir, yani her çalıştırma baştan bir derlemedir; sonunda ekrana "Build Done" yazılır. Diğer hedefler:

Komut Ne yapar
gmake Beş kütüphane, game ve db; her biri önce temizlenir
gmake all Aynı işi yapar, önce __REVISION__ dosyasındaki sayıyı bir artırır
gmake libs Yalnız kütüphaneler
gmake strip game/game_r ve db/db_r adıyla hata ayıklama bilgisi atılmış kopyalar
gmake clean Bütün ara dosyaları ve çıktıları siler
gmake ver Derleyicinin sürümünü yazar

Kütüphaneler bir kez derlendikten sonra yalnız oyun çekirdeği için gmake -C game/src yeterlidir. Bu Makefile hangi dosyanın hangi başlığa bağlı olduğunu kendisi izler ve yalnız etkilenen dosyaları yeniden derler.

Çıktılar game/game_r41024 ile db/db_r41024 dosyalarıdır; yanlarına game_symlink ve db_symlink bağları kurulur. Sayı Server/__REVISION__ dosyasından gelir (bu pakette 41024). Çekirdek açılışta bulunduğu klasöre bir VERSION.txt yazar: ilk satırda bu sayı, ikinci satırda derleyen kullanıcı, makine adı ve derleme klasörü bulunur. Sunucuda hangi derlemenin çalıştığı bu dosyadan anlaşılır.

Paketteki ikililer hata ayıklama bilgisiyle (-g) derlenmiş ve strip edilmemiştir; game bu yüzden yaklaşık 86 MB, db 17 MB tutar. gmake strip bu bilgiyi atan kopyaları üretir: dosya küçülür, ama çökme dökümlerinde fonksiyon ve satır bilgisi kaybolur.

Yeni ikili sunucuya nasıl konur?

Sunucu dosyalarında auth ve bütün kanal çekirdekleri aynı share/bin/game dosyasını çalıştırır. srv1-auth, srv1-ch1-core1 gibi adlar gen.py'nin bu dosyaya kurduğu sembolik bağlardır; db için de share/bin/db geçerlidir. Bu yüzden yeni derlenen dosyayı yalnız share/bin/game adıyla koymak bütün çekirdekleri günceller. Çalışan süreçler eski dosyayla devam eder, değişiklik çekirdekler yeniden başlatılınca devreye girer.

Makefile'daki install hedefi bu kopyalamayı yapar, ancak sunucu yolunu SRVDIR = /usr/game/srv1 olarak sabit yazar. Sunucu başka bir klasördeyse bu satır değiştirilir ya da dosya elle kopyalanır. Klasör yapısı ve bağlar Metin2 server dosyaları yazısında, ilk kurulum Metin2 server kurulumu yazısında.

Özellik bayrakları: service.h ve Locale_inc.h

Kaynakta isteğe bağlı sistemler #define satırlarıyla açılıp kapanır. Sunucunun bayrakları Serversrc/Server/common/service.h, istemcininkiler Clientsrc/Client/UserInterface/Locale_inc.h dosyasındadır. Satırın başına // koymak o sistemi derlemeden çıkarır:

// common/service.h (sunucu)
#define ENABLE_PLAYER_PER_ACCOUNT5
#define ENABLE_EXTEND_INVEN_SYSTEM
#define ENABLE_ACCE_SYSTEM

// UserInterface/Locale_inc.h (istemci)
#define ENABLE_PLAYER_PER_ACCOUNT5
#define ENABLE_EXTEND_INVEN_SYSTEM
#define ENABLE_ACCE_SYSTEM

Bazı bayraklar istemciyle sunucu arasındaki paketlerin yapısını değiştirir; bunlar iki tarafta birlikte açılıp kapanmalıdır:

Bayrak Ne değiştirir
ENABLE_PLAYER_PER_ACCOUNT5 Hesap başına karakter sayısını 4'ten 5'e çıkarır, karakter listesi paketi büyür.
ENABLE_EXTEND_INVEN_SYSTEM Envanteri 2 sayfadan 4 sayfaya çıkarır. Ekipman yuvalarının numarası envanter boyutundan sonra başladığı için bir tarafta kapalıysa giyili eşyalar yanlış yuvalarda görünür.
ENABLE_ACCE_SYSTEM Karakter listesine ve karakter görünümü paketlerine kuşak parçasını ekler.
ENABLE_DICE_SYSTEM Sohbet türlerine zar sonucunu ekler.
_IMPROVED_PACKET_ENCRYPTION_ Bağlantı şifrelemesinin anahtar anlaşmasını belirler; istemcide EterBase/ServiceDefs.h dosyasındadır.

Genel kural basittir: iki dosyada aynı adla geçen bir bayrağı ikisinde birlikte değiştir. Bu kaynakta iki tarafta ortak olanlar arasında ENABLE_WOLFMAN_CHARACTER, ENABLE_MOUNT_COSTUME_SYSTEM, ENABLE_WEAPON_COSTUME_SYSTEM, ENABLE_CHANNEL_SWITCH_SYSTEM, ENABLE_DS_GRADE_MYTH ve ENABLE_QUEST_RENEWAL da var. Uyumsuzluğun belirtisi çoğu zaman girişte ya da karakter seçiminde istemcinin kapanması ve syserr.txt'deki "Unknown packet header" satırıdır; ayrıntı serverinfo.py ve bağlantı yazısında.

Bir bayrak değişince neyin yeniden derleneceği de önemlidir. service.h ortak başlıklar (length.h, item_length.h, tables.h) üzerinden hem game'e hem db'ye girer; ikisi birlikte yeniden derlenir. Locale_inc.h istemcideki kütüphanelerin hemen hepsinin ön derlenmiş başlığında (StdAfx.h) yer alır; değişiklikten sonra Visual Studio'da Build yerine Rebuild Solution kullanılır.

Client derlemek için ne gerekir?

İstemci çözümü Clientsrc/Client/Metin2Build.sln 16 proje içerir: exe'yi üreten UserInterface ve onun bağlandığı 15 statik kütüphane. Bütün projeler v143 araç takımını ve Windows 10 SDK'yı kullanır. v143, Visual Studio 2022'nin C++ araç takımıdır; çözüm dosyasının başında Visual Studio 2019 yazması projelerin istediği araç takımını değiştirmez. Kurulumda C++ masaüstü geliştirme iş yükü ve Windows 10 SDK seçilir; projeler MFC ya da ATL kullanmaz.

Üçüncü taraf kütüphanelerin hepsi Clientsrc/Extern altında hazırdır, ayrıca DirectX SDK ya da Python kurmak gerekmez:

Kütüphane Sürüm ya da dosya Ne için
Python 2.7.15, python27.lib Arayüz ve oyun akışı betikleri
Direct3D 8 d3d8.lib, d3dx8.lib Çizim
Granny 2.11.8.0 .gr2 modeller ve animasyonlar
DevIL 1.8.0 Görüntü dosyaları
Miles Sound System 6.5c Ses
SpeedTree SpeedTreeRT.lib Ağaçlar
Crypto++ 8.2 Şifreleme
LZO 2.10 Paket sıkıştırması
Boost 1.68 Yardımcı başlıklar
libjpeg libjpeg-MT.lib JPEG ekran görüntüsü

Client nasıl derlenir?

  1. Metin2Build.sln'i Visual Studio 2022 ile aç.
  2. Yapılandırmadan Release, platformdan Win32 seç. Çözümdeki x64 seçenekleri de Win32 projelerine bağlıdır; ayrı bir 64 bit derleme yoktur.
  3. Build Solution çalıştır. UserInterface, 15 kütüphaneye proje başvurusuyla bağlı olduğu için önce onlar derlenir.
  4. Çıktı Clientsrc/Client/bin/TurkmmoSF_Release.exe'dir. Dosya istemci klasörüne, DLL'lerin ve pack klasörünün yanına kopyalanır.
Yapılandırma Çıktı Fark
Release TurkmmoSF_Release.exe Dosyaları önce paketlerde arar; oyunculara dağıtılan derleme
Debug TurkmmoSF_Debug.exe Konsol açar, log.txt yazar, dosyaları önce diskte arar
Distribute Release ile aynı exe Kütüphanelerin ayrı bir yapılandırması; exe için Release kullanılır

UserInterface projesinin birkaç ayarı bilinmeye değer:

  • Exe adı: UserInterface.vcxproj içindeki TargetName (TurkmmoSF_Release). Kaynakta kalan izlere göre orijinal ad metin2client'tır.
  • Yönetici izni: Bağlayıcı ayarında UAC düzeyi RequireAdministrator; exe her açılışta yönetici izni ister.
  • Bellek: LargeAddressAware açık; 32 bit exe, 64 bit Windows'ta 2 GB'tan fazla bellek kullanabilir.
  • İyileştirme: Release yapılandırmasında UserInterface için derleyici iyileştirmesi kapalı (Optimization: Disabled), kütüphaneler ise hıza göre iyileştirilir.
  • Sürüm: Version.h'deki sayı (1.0.40999) yalnız exe'nin dosya sürümüdür, sunucuyla karşılaştırılmaz. Yanındaki Version.py, numarayı Perforce sürüm denetim sisteminden alan eski bir betiktir ve derlemede çalışmaz.

Paket listesi de bu projenin kodundadır; yeni bir pack adı eklemek exe'yi yeniden derlemeyi gerektirir. Ayrıntı Metin2 pack dosyaları yazısında.

Sık görülen derleme hataları

Belirti Olası neden
make, ifeq ya da ifneq satırlarında hata veriyor FreeBSD'nin kendi make'i çalıştırılmış; gmake kullanılmalı.
g++9 bulunamıyor GCC 9 kurulu değil ya da başka adla kurulu; Makefile'lardaki CC satırları düzeltilir.
libmysqlclient.a: No such file or directory MySQL istemci kütüphanesi /usr/local/lib/mysql altında değil.
Bağlamada "incompatible" ya da "wrong format" hataları 64 bit sistemde 32 bit derleme; mutlak yollardaki kütüphaneler 64 bit.
Visual Studio'da C1083, d3d8.h açılamıyor Client klasörü Extern'in yanından taşınmış; projeler ../../extern yolunu arar.
MSB8020, v143 araç takımı bulunamıyor Visual Studio 2022 C++ araç takımı kurulu değil.
Bayrak değişikliği istemcide etkisiz Çözüm Rebuild edilmemiş, eski ön derlenmiş başlık kullanılıyor.
Exe açılıyor, girişte "Unknown packet header" İstemci ile sunucu farklı bayraklarla derlenmiş.

Windows'ta server derlenebilir mi?

Serversrc/Server/TurkmmoSF.sln adlı bir Visual Studio çözümü de var; game, db, kütüphaneler ve quest derleyicisi qc için projeler içerir. Ancak game projesi pakette bulunmayan klasörleri ister (libmysql/6.0.2, libdevil, libserverkey, Extern/openssl), qc projesinin dosyaları da yoktur. Bu hâliyle derlenmez. Kodda Windows dalları (__WIN32__) bulunsa da paketle gelen canlı sunucu ikilileri FreeBSD derlemesidir; asıl yol Makefile'lardır.

Proto araçları ve quest derleyicisi

Tools/Proto altında iki Visual Studio çözümü bulunur: DumpProto.sln, sunucudaki item_proto.txt, mob_proto.txt ve isim dosyalarından istemcinin item_proto ve mob_proto dosyalarını üretir; Mysql2Proto.sln aynı işi veritabanındaki tablolardan yapar. Kullanımları proto araçları yazısında.

Quest derleyicisi qc'nin kaynağı bu pakette yok. Sunucu dosyalarıyla gelen qc, FreeBSD 9.3 için derlenmiş, dinamik bağlı 32 bit bir programdır; çalışması için sistemde 32 bit çalışma kütüphaneleri bulunmalıdır. Quest dosyalarının nasıl derlendiği quest yazma yazısında.

Sık sorulan sorular

Metin2 server Linux'ta derlenir mi?
Bu kaynak FreeBSD için hazırlanmıştır: Makefile'lar GNU make ile BSD sed biçimini ve FreeBSD kütüphane yollarını kullanır, Extern'deki hazır kütüphaneler 32 bit FreeBSD derlemesidir. Başka bir sistemde derlemek için en azından bu dosyaların ve kütüphanelerin uyarlanması gerekir.
Derleme sonunda neden game değil game_r41024 çıkıyor?
Makefile çıktının adına __REVISION__ dosyasındaki sayıyı ekler ve yanına game_symlink bağını kurar. Sunucuda çalışan dosya share/bin/game'dir; yeni ikili oraya bu adla kopyalanır.
Client derlemek için hangi Visual Studio sürümü gerekir?
Projeler v143 araç takımını kullanır; bu, Visual Studio 2022'nin C++ araç takımıdır. Yalnız 32 bit (Win32) yapılandırma vardır, çözümdeki x64 seçenekleri de Win32 projelerine bağlıdır.
Locale_inc.h'de bir bayrağı değiştirdim, istemci neden kapanıyor?
Bayrak paket yapısını değiştiriyorsa sunucudaki service.h'de de aynı bayrak açılıp game ile db yeniden derlenmelidir. İstemcide de bu dosya bütün kütüphanelerin ön derlenmiş başlığına girdiği için çözüm baştan derlenmelidir (Rebuild).

İlgili sayfalar

Kategori: Server Kurma Kaynak Kod geliştirici freebsd source derleme visual studio

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.