Fejlesztés9 perc olvasás

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.

Szerző METIN2.GG

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.

Metin2-harcos kék-ezüst páncélban, telefonon, amely számítógéphez csatlakozik.

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?

Csak akkor, ha az üzemeltető kompatibilis protokollt és adatokat biztosít, és engedélyezi ezt a klienst. Ez az útmutató az itt megnevezett Cemre/m2dev összeállításról szól, nem a többi szerver egyedi módosításairól. Az APK nem univerzális launcher-helyettesítő.

iPhone-ra is jó?

Nem. Az itt bemutatott projekt és eszközök Androidra készültek. Egy másik fórumbejegyzés iOS-említése nem bizonyít iOS-verziót ehhez a klienshez.

Nyilvánosan megoszthatom az APK-t és az adatokat?

A nyilvános kód és egy könyvtár licence nem tisztázza az egész kliens vagy az eredeti adatok jogait. Terjesztés előtt minden belefoglalt elem jogait ellenőrizd. Ez az írás nem ad ilyen engedélyt.

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.