Metin2 Android-kliens fordítása és kapcsolódás tesztszerverhez
Útmutató a Cemre Metin2 Android-kliens fordításához, kompatibilis adatok előkészítéséhez és LAN-tesztszerverhez csatlakozáshoz.
A kiválasztott kliens és az útmutató hatóköre
Az átnézett nyilvános projektek közül a cemreefe/metin2-android a legjobban használható alap ahhoz, hogy Androidon kipróbáld a teljes Metin2-klienst. C++ klienst, Androidos indítót, érintésvezérlést, natív könyvtárakat és kompatibilis szerverhez szóló útmutatót tartalmaz. Ez az útmutató a konkrét 4ac33651d49000de95e520e6de4373213dc54405 revíziót követi. Nem univerzális APK bármely privát szerverhez: a kliensnek, a játékadatoknak és a szervernek kompatibilisnek kell lennie.
Fontos pontosítás az „open source” kifejezéshez: 2026. október 25-i ellenőrzéskor a fő repository nem jelölt meg az egész kliensre vonatkozó licencet. A nyilvános kód önmagában nem ad jogot az újraterjesztésre. Az OpenGr2ndma komponens MPL-2.0 licencű, az eredeti játékadatok jogai külön kezelendők. Ez az útmutató nem ad játékadat-csomagot vagy azokat tartalmazó kész APK-t. Forráskód, OpenGr2ndma-licenc.

Illusztráció: felismerhető Metin2-karakter telefonon, saját kliens előkészítése közben. Nem a build vagy a játék képernyőképe.
Miért ez a kliens, és mit találtunk a fórumokon?
A Turkmmo Metin2 Mobile & PC Cross Platform Source témájában bejelentkezés után BGFX és OpenGL változatok érhetők el. Az átnézett opengl.zip valóban Android-projektet és C++ klienskódot tartalmaz. A fordításhoz szükséges Android .a/.so könyvtárak azonban hiányoznak; a Windowsos Granny-könyvtár nem helyettesíti őket. Nem találtunk kész APK-t, teljes Gradle wrappert vagy az egész kliensre érvényes licencet. A fájlokat elolvastuk, a csomagban található programokat nem futtattuk.
Egy újabb, „Mobile Source … Full” című téma Unity-prototípust ír le, az érintésvezérlést és az Android/iOS támogatást pedig jövőbeli munkaként sorolja fel. A különálló nagy archívumát nem vizsgáltuk. A téma címe önmagában nem bizonyít kész mobilklienst.
| Projekt | Nyilvánosan ellenőrzött tények | Hasznosság ehhez az útmutatóhoz |
|---|---|---|
| Cemre Android-port | C++/Java, két ABI-hoz könyvtárak, profilok, adattelepítés, érintős felület, helyi szerver | A legerősebb vizsgált jelölt; a fő kliens licence nincs tisztázva |
| Turkmmo OpenGL-archívum | Android-váz és klienskód, Android-könyvtárak nélkül | További portolás és függőségek kellenek |
| Metin2ToUnity az M2Deven | Eszközök és játékforrás-konverzió | Importálóeszköz, nem teljes hálózati kliens |
| metin2-godot | A saját kódra MIT licenc, ismertetett fejlesztési mérföldkövek | Érdekes fejlesztési alap, nem kész Android-port |
A port szerzője beszámol bejelentkezés, világba lépés, harc, leltár és mentés teszteléséről. A fő bizonyítékai x86_64 emulátorról származnak; fizikai arm64 telefonon és hosszabb játékmenetben külön ellenőrzés kell. Tágabb háttérért lásd a Metin2 mobilkliensekről szóló áttekintést.
Először válassz ellenőrizhető összeállítást
Az alapeljárásban az Android-kliens LAN-on csatlakozik a saját tesztszerveredhez. A szerver külön Linux-gépen vagy virtuális gépen fut, a telefon ugyanarra a Wi-Fi-hálózatra csatlakozik. A szervert APK-ba ágyazó megoldás a végén szerepel.
| Összetevő | Revízió / verzió |
|---|---|
| Android-kliens | 4ac33651d49000de95e520e6de4373213dc54405 |
| m2dev-server-src | 66068c1 |
| m2dev-server: konfiguráció, térképek, SQL, küldetések | ad30738 |
| Az m2dev-client várt adatstruktúrája | 98d2c1af; legyen jogosultságod az adatok használatára |
| Java / Gradle | JDK 17 / Gradle 8.1.1 |
| Android-eszközök | platform 33, Build Tools 33.0.1, NDK 25.2.9519653, CMake 3.22.1 |
| Cél-ABI | arm64-v8a a megfelelő telefonhoz, x86_64 a megfelelő emulátorhoz |
A Build Tools 33.0.1 az app/build.gradle fájlban szerepel; a forrásdokumentáció telepítési példája más alverziót ír. Ne cseréld automatikusan a rögzített változatokat a legújabbakra.
1. Telepítsd az eszközöket és töltsd le a pontos revíziót
Az alábbi parancsok Linux alatti Bashhoz készültek. Add meg a tényleges Android SDK és Gradle 8.1.1 útvonalát. A JDK 17 legyen aktív a JAVA_HOME változóban. Az SDK-t hivatalos Android-eszközökkel telepítsd; minden új licencet olvass el és fogadj el te magad. SDK-dokumentáció.
java -version
gradle --version
sdkmanager "platforms;android-33" "build-tools;33.0.1" \
"ndk;25.2.9519653" "cmake;3.22.1" "platform-tools"
mkdir -p "$HOME/metin2-lab"
cd "$HOME/metin2-lab"
git clone https://github.com/cemreefe/metin2-android.git
cd metin2-android
git checkout --detach 4ac33651d49000de95e520e6de4373213dc54405
git submodule update --init --recursive
git submodule status
export M2_REPO="$PWD"
export M2_ANDROID="$M2_REPO/r10dev.net OPENGL-ITJA/android"
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export GRADLE="/opt/gradle-8.1.1/bin/gradle"
printf 'sdk.dir=%s\n' "$ANDROID_SDK_ROOT" > "$M2_ANDROID/local.properties"
Az OpenGr2ndma almodul ehhez a revízióhoz a 210f5c326531297495c24e7bb1e24dc1b1a77833 commiton van rögzítve. Ha kihagyod, a CMake hibázik; egy GitHub ZIP letöltése nem inicializálja. Az r10dev.net OPENGL-ITJA útvonalon hagyd meg az idézőjeleket.
2. Hozd létre a profilt és kapcsold ki a külső katalógust
Az alábbi tartalmat tedd a profiles/home.properties fájlba. A 192.168.1.50 helyére a Linux-szerver LAN-címét írd. A telefonon a 127.0.0.1 saját magát jelenti, nem a számítógépes szervert.
m2.abi=arm64-v8a
m2.serverMode=remote
m2.serverHost=192.168.1.50
m2.authPort=11000
m2.channelPort=11011
m2.gamePortOffset=0
m2.applicationIdSuffix=.lab
m2.appLabel=Metin2 Local Lab
m2.versionName=home
m2.dataBundled=false
m2.dataUrl=
m2.dataVersion=1
m2.serverListUrl=
m2.devUrl=
m2.updateChannel=
A servers/servers.json fájlban csak a saját tesztszervered szerepeljen:
{
"version": 1,
"servers": [
{
"name": "Home Lab",
"host": "192.168.1.50",
"authPort": 11000,
"channelPort": 11011
}
]
}
Szándékosan üres a m2.serverListUrl=: ha ez a tulajdonság hiányzik, a build a szerző alapértelmezett távoli katalógusát használja. Az üres m2.devUrl= kikapcsolja a diagnosztika opcionális elküldését és a frissítésellenőrzést. Így a labor nem kínál fel külső fejlesztőszervert. Lásd ServerCatalog.java és DevReporter.java.
3. Először játékadatok nélkül fordítsd le az APK-t
Így különválaszthatók az eszközök és natív könyvtárak hibái az adat- vagy szerverproblémáktól. A sikeres fordítás még nem bizonyítja, hogy be lehet lépni a játékvilágba.
cd "$M2_ANDROID"
"$GRADLE" --no-daemon --max-workers=4 assembleDebug \
-Pm2profile=home -Pm2abi=arm64-v8a
ls -lh app/build/outputs/apk/debug/app-debug.apk
x86_64 emulátornál az utolsó paraméter legyen -Pm2abi=x86_64. Az ABI illeszkedjen az eszközhöz. Az ellenőrzéskor a repository nem kínált kész, nyilvános APK-t; ezzel az eljárással debug build készül.
A build ellenőrzésének konkrét eredménye
Windows alatt az érintetlen revízió a C++ fordításánál megállt: a UserInterface/Locale.h elfedte a rendszer locale.h fejlécét. Egy elkülönített munkapéldányban eltávolítottuk a UserInterface útvonalat az include_directories(...) listából a clientsource/CMakeLists.txt fájlban, majd a lista után hozzáadtuk:
add_compile_options("-iquote${CMAKE_CURRENT_SOURCE_DIR}/UserInterface")
A játékkliens mappája továbbra is elérhető az idézőjeles include-okhoz, és már nem zavar a rendszerfejlécek keresésében. A módosítással az assembleDebug x86_64 és arm64-v8a célra is lefutott, közös APK-t készítve. Ez a saját munkapéldányunk buildjét igazolja, nem az érintetlen upstream kódét minden Windows rendszeren. A Linux-lépések a szerző kódján és útmutatóján alapulnak. Így nem teszteltük a játékvilágba lépést, fizikai telefont, teljesítményt vagy az offline szervert.
4. Készítsd elő az adatokat a staging scripttel
A ~/metin2-lab/client-data könyvtárba olyan adat-checkout kerüljön, amelyet jogosult vagy használni, és amely megfelel a leírt struktúrának. Ez az útmutató nem ad jogot az eredeti modellekhez, térképekhez vagy zenékhez. Egy másik privát szerver tetszőleges packja nem ellenőrzött helyettesítő: a protók, Python UI és fájlformátumok eltérhetnek.
sudo apt install rsync patch python3-pil libsodium23 liblzo2-2 zip imagemagick ninja-build
export M2_DATA="$HOME/metin2-lab/client-data"
export M2_STAGE="$HOME/metin2-lab/staged-data"
test -d "$M2_DATA/assets/root"
"$M2_ANDROID/tools/stage_client_data.sh" "$M2_DATA" "$M2_STAGE" en
A stage_client_data.sh az elvárt sorrendben egyesíti a packokat, a root mappát teszi felülre, átalakítja az item_proto/mob_proto fájlokat, és kompatibilitási scripteket, skálázást és érintős HUD-ot ad hozzá. Hiba esetén a grafikus motor előtt ellenőrizd ezt a staging lépést. Ne nevezd át tömegesen kisbetűsre a koreai fájlneveket.
A kliensnek Python 2.7.18 szabványkönyvtár is kell, annak Lib könyvtára, nem a gépen levő Python 3. Töltsd le a hivatalos Python 2.7.18 forráscsomagot, bontsd ki külön munkakönyvtárba, majd például állítsd be: M2_PYLIB=~/metin2-lab/python-2.7.18/Lib. A Python 2 nem támogatott mai szerveroldali runtime általános szolgáltatásokhoz; itt egy régi beágyazott kliens függősége.
Az adatok APK-ba csomagolásához állítsd m2.dataBundled=true értékre a home.properties fájlban, majd:
export M2_PYLIB="$HOME/metin2-lab/python-2.7.18/Lib"
test -f "$M2_PYLIB/os.py"
M2_CLIENT_DATA="$M2_STAGE" M2_PYLIB="$M2_PYLIB" \
M2_BUNDLE_OUT="$HOME/metin2-lab/bundle" GRADLE="$GRADLE" \
"$M2_ANDROID/tools/make_bundle.sh" home 1
A kimenet a ~/metin2-lab/bundle/metin2-home-1.apk fájl és egy verziózott adat-ZIP. Hagyj helyet a kicsomagolt adatoknak, ZIP-nek és APK-nak. Adatmódosításkor növeld a m2.dataVersion értékét: a régi ZIP törlése önmagában nem kényszeríti az installált appot az azonos adatverzió újracsomagolására. Az APK buildszáma ettől különálló. Lásd make_bundle.sh.
5. Készíts kompatibilis szervert és állítsd be a core-ok címeit
Ez a rész a szerző self-hosting útmutatóját követi. Használj külön Linux teszt-VM-et; ne módosíts éles szervert. Az upstream dokumentáció Ubuntu 22.04-et, g++ 11-et, CMake 3.22-t és MariaDB 10.6-ot jelöl meg.
sudo apt install build-essential cmake git mariadb-server python3
cd "$HOME/metin2-lab"
git clone https://github.com/d1str4ught/m2dev-server-src.git
git -C m2dev-server-src checkout --detach 66068c1
git -C m2dev-server-src apply "$M2_REPO/server/m2dev-server-src-linux.patch"
cmake -S m2dev-server-src -B m2dev-server-src/build -DCMAKE_BUILD_TYPE=Release
cmake --build m2dev-server-src/build -j4
git clone https://github.com/d1str4ught/m2dev-server.git m2srv
git -C m2srv checkout --detach ad30738
cp m2dev-server-src/build/bin/{db,game,qc} m2srv/share/bin/
cp m2srv/share/bin/qc m2srv/share/locale/english/quest/qc
(cd m2srv/share/locale/english/quest && python3 make.py)
Indítás előtt hozd létre az adatbázisokat és egy korlátozott SQL-felhasználót. Ez az SQL új, elkülönített VM-re szól, ahol még nincsenek ilyen nevű adatbázisok. A sudo mariadb alatt mindkét DOPLN_VLASTNI_HESLO értéket cseréld ugyanarra az erős jelszóra. Ne futtasd a szöveget szó szerint.
CREATE DATABASE account;
CREATE DATABASE common;
CREATE DATABASE player;
CREATE DATABASE log;
CREATE DATABASE hotbackup;
CREATE USER 'm2lab'@'127.0.0.1' IDENTIFIED BY 'DOPLN_VLASTNI_HESLO';
CREATE USER 'm2lab'@'localhost' IDENTIFIED BY 'DOPLN_VLASTNI_HESLO';
GRANT ALL ON account.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON common.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON player.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON log.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
GRANT ALL ON hotbackup.* TO 'm2lab'@'127.0.0.1', 'm2lab'@'localhost';
Ezután töltsd be a négy mellékelt sémát; a runtime szerint a hotbackup adatbázis maradjon kezdetben üres:
cd "$HOME/metin2-lab/m2srv"
for db in account common player log; do
sudo mariadb "$db" < "sql/$db.sql"
done
A share/conf/db.txt fájl SQL_ACCOUNT, SQL_PLAYER, SQL_COMMON és SQL_HOTBACKUP sorainál módosítsd a felhasználót/jelszót a saját m2lab adataira. A share/conf/game.txt fájlban ugyanezt tedd az ACCOUNT_SQL, PLAYER_SQL, COMMON_SQL és LOG_SQL sorokkal. Őrizd meg a többi értéket és a fájlok eltérő mezősorrendjét. Valódi belépési adat ne kerüljön nyilvános Gitbe. DB-konfiguráció, game-konfiguráció.
A MariaDB csak a 127.0.0.1 címen figyeljen; a telefon nem csatlakozik hozzá. A VM-en hozz létre egy külön /etc/mysql/mariadb.conf.d/99-metin2-lab.cnf fájlt a [mysqld] szekcióval:
[mysqld]
bind-address=127.0.0.1
sql_mode=NO_ENGINE_SUBSTITUTION
A sudo systemctl restart mariadb után ellenőrizd a kapcsolatot: mariadb -h 127.0.0.1 -u m2lab -p account. A jelszót a promptban add meg. A régi runtime igényli ezt az SQL-módot; ne alkalmazd más projektek megosztott adatbázisára.
Új tesztbelépést készíts a játékhoz; a dump már tartalmaz előre elkészített felhasználókat. Az alábbi mintában cseréld ki a példaértékeket:
INSERT INTO account.account (login, password, social_id, status)
VALUES ('VLASTNI_TEST_LOGIN', PASSWORD('VLASTNI_TEST_HESLO'), '1234567', 'OK');
Az adatbázisok előkészítése után futtasd a python3 install.py parancsot az m2srv alatt. A konfigurációk újragenerálódnak. A játék minden channels/channel1/coreN/CONFIG fájljába állíts be a telefonról elérhető IP-címet:
BIND_IP: 192.168.1.50
Az automatikus címfelismerés kihagyhatja a LAN-címet. Minden core a saját címét jelenti a kliensnek. Ha újra futtatod az install.py-t, ellenőrizd ismét a beállítást: a generált fájlok felülíródnak.
| Kapcsolat | Alapértelmezett TCP-port | Telefonról elérhető |
|---|---|---|
| Hitelesítés | 11000 | Igen, csak a teszt-LAN-on |
| 1. csatorna core-jai | 11011, 11012, 11013 | Mindhárom; térképváltás átirányíthatja a klienst |
| DB-folyamat | 9000 | Belső szerverkommunikáció |
| Core-ok közti P2P | 12000 és további portok | Belső szerverkommunikáció |
Az m2srv alatt indítsd a csatornát: python3 start.py 1; leállítás: python3 stop.py. Nézd meg az auth és mindhárom core naplóit. Ha a bejelentkezés sikerül, de karakterválasztás után visszakerülsz a szerverlistához, először a térképet futtató core címét és portját ellenőrizd. Az auth-port önmagában kevés.
Ne frissítsd vakon a szervert. A 0cc595bf097dcf89ddba60615e56fe790823cd22 szerver-commit óta a handshake 0xf8 formátumra váltott libsodium/XChaCha20 használatával. A kiválasztott kliens a régi 0xfb/0xfa handshake-et várja. Újabb szerverhez a protokollt ténylegesen át kell portolni a kliensbe; IP- vagy jelszócsere nem oldja meg.
6. Telepítsd a telefonra és vizsgáld meg az első indítást
adb devices
adb shell getprop ro.product.cpu.abilist
adb install -r "$HOME/metin2-lab/bundle/metin2-home-1.apk"
adb shell pm path com.metin2.client.lab
Indítsd el az appot, válaszd ki a saját Home Lab szervered, és kizárólag a saját tesztfiókoddal jelentkezz be. Ennél a profilnál a csomagazonosító com.metin2.client.lab; a külső adatok általában itt találhatók:
adb shell ls /sdcard/Android/data/com.metin2.client.lab/files/
adb shell cat /sdcard/Android/data/com.metin2.client.lab/files/syserr.txt
adb logcat -d > metin2-android-logcat.txt
Az alapcsomag azonosítója com.metin2.client, az upstream offline profilé com.metin2.client.offline. Ne keverd össze az útvonalakat. A kód a getExternalFilesDir(null) függvényt használja, tehát az eszköz tényleges app-tárhelye az irányadó. Frissítési hiba esetén először az ABI-t, package ID-t és APK-aláírást ellenőrizd; az elhamarkodott eltávolítás törölheti az offline karaktereket.
| Tünet | Első ellenőrzés |
|---|---|
| CMake nem találja az OpenGr2ndma-t | Almodul inicializálása és rögzített commit |
| APK ABI inkompatibilis | ro.product.cpu.abilist összevetése a -Pm2abi értékével |
| Kapcsolat bont login után | Szerver-handshake verziója, majd naplók |
| Visszalépés karakterválasztás után | Átirányított IP, BIND_IP és minden core portja |
| Hiányzó UI vagy fekete képernyő | Staging, protók, Python Lib, syserr.txt |
| Frissítés után régi adatok | m2.dataVersion, profil, adat-ZIP |
A teljes szerver beágyazása az APK-ba
Az upstream projekt bundled profilt is tartalmaz: Androidra fordítja a szerverfolyamatokat, MySQL helyett SQLite-réteget ad hozzá, és a szerveradatokat is becsomagolja. Így a telefonnak nem kell távoli szerver. Ez külön fordítás és adatcsomag, nem a 3. lépésben létrejött APK automatikus funkciója.
A servers/servers.json fájlban add meg a beágyazott példányt:
{
"version": 2,
"servers": [
{ "name": "Single Player", "embedded": true }
]
}
A profiles/bundled.properties fájlban hagyd üresen a m2.serverListUrl=, m2.devUrl= és m2.updateChannel= értékeket. Tartsd meg a m2.serverMode=embedded, m2.dataBundled=true beállításokat és a .offline utótagot. Minden új adatcsomaghoz növeld a m2.dataVersion értékét.
Ha a runtime és a forrás checkoutja készen áll, a csomagoló script így használható:
"$M2_REPO/r10dev.net OPENGL-ITJA/server/tools/make-server-pack.sh" \
"$HOME/metin2-lab/m2srv" \
"$HOME/metin2-lab/m2dev-server-src" \
"$HOME/metin2-lab/server-pack"
M2_SERVER_PACK="$HOME/metin2-lab/server-pack" \
M2_CLIENT_DATA="$M2_STAGE" M2_PYLIB="$M2_PYLIB" \
M2_BUNDLE_OUT="$HOME/metin2-lab/bundle" GRADLE="$GRADLE" \
"$M2_ANDROID/tools/make_bundle.sh" bundled 1
Futtatás előtt ellenőrizd a bundled.properties fájlt, saját szerverkatalógust, dataVersiont és a seed adatbázis tesztfiókját. A make-server-pack.sh először runtime checkoutot, utána forrás checkoutot, végül kimeneti könyvtárat vár. Ne használd helyette az upstream dokumentáció Web szakaszának eltérő példáját. A beágyazott szerver Gradle buildjében Linux-specifikus NDK-útvonal van; ezt nem állítjuk ellenőrzött Windows offline buildnek.
A sikeres fordítás, az elindított app, a bejelentkezés és a tartós játékmenet külön eredmények. Az összeállítás ellenőrzéséhez hozz létre karaktert, lépj térképre, harcolj, válts core-t, indítsd újra a klienst, és nézd meg, mentődött-e a leltár. E lépések nélkül nem állítható, hogy egy konkrét telefont és szervert együtt ellenőriztek.
Gyakran Ismételt Kérdések
Működik ez a kedvenc privát szerveremen?
iPhone-ra is jó?
Nyilvánosan megoszthatom az APK-t és az adatokat?
Kapcsolódó Oldalak
Találd meg a tökéletes szervered
Böngéssz a legjobban rangsorolt Metin2 privát szerverek között a METIN2.GG-n vagy küldd be a saját szervered a ranglistára.

