Metin2 Source Derleme: Server ve Client Kaynak Kodu Nasıl Derlenir?
Hazırlayan: Metin2VIP Editörleri Yayın: 9 dk okuma
İçindekiler
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?
Metin2Build.sln'i Visual Studio 2022 ile aç.- Yapılandırmadan
Release, platformdanWin32seç. Çözümdekix64seçenekleri de Win32 projelerine bağlıdır; ayrı bir 64 bit derleme yoktur. - Build Solution çalıştır. UserInterface, 15 kütüphaneye proje başvurusuyla bağlı olduğu için önce onlar derlenir.
- Çıktı
Clientsrc/Client/bin/TurkmmoSF_Release.exe'dir. Dosya istemci klasörüne, DLL'lerin vepackklasö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.vcxprojiçindekiTargetName(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:
LargeAddressAwareaçı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ındakiVersion.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
- Metin2 Pack Dosyaları: EPK ve EIX Nedir? (Server kurma)
- Metin2 Proto Dönüştürme: dump_proto ve Mysql2Proto Nasıl Kullanılır? (Server kurma)
- Metin2 Quest Nasıl Yazılır? Lua Quest Yapısı, State ve When Blokları (Server kurma)
- Metin2 Server Dosyaları: Klasör Yapısı ve Her Dosyanın Görevi (Server kurma)
- Metin2 Server Nasıl Kurulur? Adım Adım PvP Server Kurulumu (Server kurma)
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?