Vývoj10 min čtení

Metin2 na Androidu: sestavení klienta a připojení k vlastnímu serveru

Podrobný návod k portu cemreefe/metin2-android: APK, herní data, kompatibilní server, porty a řešení chyb. Srovnání zdrojů z Turkmmo a M2Dev.

Od METIN2.GG

Vybraný klient a rozsah návodu

Pro vlastní pokus s celým klientem Metin2 na Androidu je z prověřených veřejných projektů nejpoužitelnější cemreefe/metin2-android. Má původní C++ klient, Android launcher, dotykové ovládání, připravené nativní knihovny a popsané připojení ke kompatibilnímu serveru. Níže postupujeme podle konkrétní revize 4ac33651d49000de95e520e6de4373213dc54405. Není to univerzální APK pro libovolný privát: musí si rozumět klient, herní data i server.

Důležitá výhrada k označení „open source“: hlavní repozitář při kontrole 25. října 2026 neuváděl licenci pro celý klient. Kód je veřejně dostupný; tím ale nevzniká automatické oprávnění k jeho dalšímu šíření. Komponenta OpenGr2ndma má MPL-2.0, zatímco původní herní data mají vlastní práva. Návod proto neobsahuje balík dat ani hotové APK s nimi. Zdrojový kód vybrané revize, licence OpenGr2ndma.

Postava Metin2 ve stříbrnomodré zbroji na telefonu propojeném s vývojovým notebookem

Ilustrace: rozpoznatelná postava Metin2 na telefonu při přípravě vlastního klienta. Nejde o screenshot sestavení ani běhu hry.

Proč právě tento klient a co jsme našli na fórech

Ve vlákně Metin2 Mobile & PC Cross Platform Source na Turkmmo jsou po přihlášení dostupné varianty BGFX/OpenGL. Zkontrolovaný archiv opengl.zip opravdu obsahuje Android projekt a C++ klienta. Současně mu ale chybějí Android .a/.so knihovny, které jeho sestavení potřebuje; přiložená Windows knihovna Granny je nenahrazuje. Nenalezli jsme v něm hotové APK, plný Gradle wrapper ani licenci pro celý klient. Obsah jsme četli, přibalené programy jsme nespouštěli.

Novější vlákno označené „Mobile Source … Full“ zase v textu popisuje Unity prototyp a mobilní ovládání i Android/iOS řadí mezi další plánované práce. Obsah jeho samostatného velkého archivu zde nehodnotíme. Název příspěvku sám nestačí jako důkaz hotového mobilního klienta.

Projekt Co je veřejně doloženo Pro tento návod
Cemre Android port C++/Java, knihovny pro dvě ABI, profily, instalace dat, dotykové UI a zdroj lokálního serveru Nejsilnější dostupný podklad z posouzených kandidátů; licence hlavního klienta zůstává nevyjasněná
Sdílený OpenGL archiv na Turkmmo Android kostra a rozsáhlý klientský kód, chybějící Android knihovny Vyžaduje další portování a doplnění závislostí
Metin2ToUnity na M2Dev Nástroje a převod herních podkladů Importér není kompletní síťový klient
metin2-godot MIT pro vlastní kód, popsané otevřené vývojové milníky Zajímavý základ vývoje, ne náhrada hotového Android portu

Autor portu popisuje přihlášení, vstup do světa, boj, inventář a ukládání. Jeho hlavní důkazy pocházejí z emulátoru x86_64; fyzický telefon arm64 a dlouhé hraní vyžadují vlastní ověření. Širší kontext jednotlivých projektů najdeš v přehledu mobilních klientů Metin2.

Nejdřív zvol jednu ověřitelnou kombinaci

Základní postup níže používá Android klienta připojeného k vlastnímu testovacímu serveru v LAN. Server běží na samostatném Linuxu nebo ve vlastní VM, telefon na stejné Wi-Fi. Druhá možnost, server vložený do APK, je popsaná zvlášť na konci.

Část Revize / verze pro tento postup
Android klient 4ac33651d49000de95e520e6de4373213dc54405
m2dev-server-src 66068c1
m2dev-server: konfigurace, mapy serveru, SQL, questy ad30738
Očekávaná struktura klientských dat m2dev-client 98d2c1af; potřebuješ oprávnění k použitým datům
Java / Gradle JDK 17 / Gradle 8.1.1
Android nástroje platforma 33, Build Tools 33.0.1, NDK 25.2.9519653, CMake 3.22.1
Cílová ABI arm64-v8a pro odpovídající telefon, x86_64 pro odpovídající emulátor

Build Tools 33.0.1 vychází přímo z app/build.gradle; instalační příklad v upstream návodu uvádí jiné podčíslo. Nenahrazuj připnuté verze automaticky nejnovějšími.

1. Připrav nástroje a získej přesnou revizi

Následující příkazy jsou pro Bash na Linuxu. Doplň skutečné umístění svého Android SDK a samostatného Gradle 8.1.1. JDK 17 musí být aktivní v JAVA_HOME. SDK instaluj z oficiálních Android nástrojů; případné nové licenční podmínky si přečti a přijmi sám. Dokumentace správce SDK.

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"

Submodul OpenGr2ndma má v této revizi commit 210f5c326531297495c24e7bb1e24dc1b1a77833. Vynechaný submodul vede k chybě CMake; stažený ZIP z GitHubu jeho obsah automaticky nedoplní. U dlouhé cesty r10dev.net OPENGL-ITJA zachovej uvozovky.

2. Vytvoř vlastní profil a vypni cizí katalog

Do profiles/home.properties vlož tento obsah. Adresu 192.168.1.50 nahraď LAN adresou svého Linuxového serveru. 127.0.0.1 v telefonu označuje telefon samotný; pro server na počítači ji nepoužívej.

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=

Do servers/servers.json dej pouze vlastní testovací server:

{
  "version": 1,
  "servers": [
    {
      "name": "Home Lab",
      "host": "192.168.1.50",
      "authPort": 11000,
      "channelPort": 11011
    }
  ]
}

Prázdné m2.serverListUrl= je záměrné: bez této položky sestavení použije výchozí vzdálený katalog autora. Prázdné m2.devUrl= vypíná jeho volitelné odesílání diagnostiky a kontrolu aktualizací. Vlastní laboratoř tak nezačne nabízet cizí vývojový server. Chování je v ServerCatalog.java a DevReporter.java.

3. Nejdřív sestav APK bez herních dat

Tím oddělíš chyby nástrojů a nativních knihoven od chyb dat či serveru. Samotné sestavení ještě neznamená, že lze vstoupit do světa.

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

Pro emulátor x86_64 změň poslední parametr na -Pm2abi=x86_64. Zvolená ABI musí odpovídat cílovému zařízení. Repozitář při této kontrole neposkytoval hotové veřejné APK; tento postup vytváří vlastní debug sestavení.

Konkrétní výsledek kontroly sestavení

Při naší kontrole na Windows se neupravená revize zastavila při kompilaci C++: herní UserInterface/Locale.h zastínil systémové <locale.h>. V samostatné pracovní kopii jsme z clientsource/CMakeLists.txt odstranili řádek ${CMAKE_CURRENT_SOURCE_DIR}/UserInterface ze seznamu include_directories(...) a hned za tento seznam přidali:

add_compile_options("-iquote${CMAKE_CURRENT_SOURCE_DIR}/UserInterface")

Tím zůstává herní adresář dostupný pro uvozované include a přestane zasahovat do hledání systémových hlaviček. Po této úpravě prošlo assembleDebug pro x86_64 i arm64-v8a. Závěrečné společné sestavení obsahuje obě nativní knihovny v jednom APK; katalog nabízí jen vlastní testovací adresu a vzdálený katalog i diagnostika jsou vypnuté. Je to ověření kompilace a balení pracovní kopie, ne tvrzení, že neupravený upstream úspěšně sestavíš na každém Windows. Linuxové kroky výše vycházejí z kódu a postupu autora. Vlastní instalaci na zařízení, vstup do světa, výkon ani offline server jsme touto kontrolou neověřili.

4. Připrav data přes dodaný staging, ne prostým kopírováním packů

Připrav si oprávněně získaný checkout dat s kompatibilní strukturou uvedenou výše do ~/metin2-lab/client-data. Návod nepřenáší licenci ani oprávnění k původním modelům, mapám či hudbě. Náhodný pack z jiného privátu není ověřená náhrada: může mít jiné protos, Python UI i formáty souborů.

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

stage_client_data.sh sloučí jednotlivé packy ve stanoveném pořadí, položí root navrch, převede item_proto/mob_proto a doplní kompatibilní skripty, škálování i dotykový HUD. Proto se vyplatí hledat chybu ve stagingu dřív než v rendereru. Názvy korejských souborů hromadně nepřejmenovávej na malá písmena.

Klient očekává také standardní knihovnu Pythonu 2.7.18. Potřebuješ její adresář Lib, nikoli hostitelský Python 3. Z oficiálního zdrojového balíku Python 2.7.18 jej rozbal do samostatné pracovní složky a nastav například M2_PYLIB=~/metin2-lab/python-2.7.18/Lib. Python 2 není podporovaný hostitelský runtime pro běžné služby; zde jde o závislost starého vloženého klienta.

Pro balení změň v home.properties m2.dataBundled=true, pak:

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

Výstup bude ~/metin2-lab/bundle/metin2-home-1.apk a verzovaný datový ZIP. Pro tento krok potřebuješ dostatek místa pro rozbalená data, ZIP i APK. Pokud později data změníš, zvyš m2.dataVersion; samotné smazání starého ZIPu nepřiměje již instalovanou aplikaci ke znovurozbalení stejné datové verze. Číslo sestavení APK je samostatný parametr. Podrobnosti ukazuje make_bundle.sh.

5. Připrav kompatibilní server a správné adresy jader

Tato část vychází ze self-hosting postupu autora. Použij samostatnou testovací Linux VM; neupravuj tím existující produkční server. Upstream uvádí Ubuntu 22.04, g++ 11, CMake 3.22 a MariaDB 10.6.

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)

Před startem připrav databáze a omezeného uživatele. Následující SQL je pro novou oddělenou VM bez existujících databází tohoto jména. V sudo mariadb nejdřív nahraď obě položky DOPLN_VLASTNI_HESLO stejným vlastním silným heslem; SQL s tímto doslovným zástupným textem nespouštěj.

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';

Potom importuj čtyři přiložená schémata; hotbackup má podle runtime zůstat na začátku prázdný:

cd "$HOME/metin2-lab/m2srv"
for db in account common player log; do
  sudo mariadb "$db" < "sql/$db.sql"
done

V share/conf/db.txt změň v řádcích SQL_ACCOUNT, SQL_PLAYER, SQL_COMMON a SQL_HOTBACKUP dvojici uživatel/heslo na vlastní m2lab a zvolené heslo. V share/conf/game.txt udělej totéž u ACCOUNT_SQL, PLAYER_SQL, COMMON_SQL a LOG_SQL. Zachovej ostatní hodnoty i rozdílné pořadí polí obou souborů. Skutečné údaje neukládej do veřejného Git repozitáře. Konfigurace DB, konfigurace game.

MariaDB nech poslouchat pouze na 127.0.0.1; telefon se k ní nepřipojuje. V této VM nastav pod [mysqld] v samostatném souboru /etc/mysql/mariadb.conf.d/99-metin2-lab.cnf:

[mysqld]
bind-address=127.0.0.1
sql_mode=NO_ENGINE_SUBSTITUTION

Po sudo systemctl restart mariadb ověř spojení mariadb -h 127.0.0.1 -u m2lab -p account. Heslo zadávej až do výzvy. Omezení SQL režimu vyžaduje tento starý runtime; nepřenášej je do sdílené databáze jiného projektu.

Pro herní účet použij v této databázi nové vlastní testovací údaje; dump obsahuje i předpřipravené účty. Příklad po nahrazení obou zástupných hodnot:

INSERT INTO account.account (login, password, social_id, status)
VALUES ('VLASTNI_TEST_LOGIN', PASSWORD('VLASTNI_TEST_HESLO'), '1234567', 'OK');

Po přípravě databází spusť python3 install.py v m2srv. Vygeneruje konfigurace; do každého herního channels/channel1/coreN/CONFIG pak nastav adresu dosažitelnou telefonem:

BIND_IP: 192.168.1.50

Výchozí detekce serveru může LAN adresu přeskočit. Každé jádro navíc oznamuje klientovi vlastní adresu. Po opětovném spuštění install.py úpravu ověř znovu: generované soubory se přepíšou.

Spojení Výchozí TCP port Co má být dosažitelné z telefonu
Přihlášení 11000 Ano, pouze v testovací LAN
Herní jádra kanálu 1 11011, 11012, 11013 Všechna tři, protože výběr mapy může klienta přesměrovat
DB proces 9000 Interní serverová komunikace
P2P mezi jádry 12000 a další Interní serverová komunikace

V m2srv spustíš kanál příkazem python3 start.py 1 a zastavíš jej python3 stop.py. Zkontroluj logy auth i všech tří jader. Pokud projde přihlášení, ale po výběru postavy přijde návrat do seznamu serverů, prověř nejprve adresu a port cílového jádra. Funkční auth port sám nestačí.

Neaktualizuj server naslepo. Od serverového commitu 0cc595bf097dcf89ddba60615e56fe790823cd22 se mění handshake na 0xf8 s libsodium/XChaCha20. Vybraný klient očekává starší 0xfb/0xfa. Pro novější server musíš protokol klienta skutečně doplnit; změna IP nebo hesla to nevyřeší.

6. Instalace do telefonu a první diagnostika

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

Spusť aplikaci na telefonu, vyber vlastní Home Lab a přihlas se výhradně testovacím účtem svého serveru. Pro tento profil je balíček com.metin2.client.lab; jeho externí data tedy obvykle najdeš zde:

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

Základní balíček používá com.metin2.client, upstream offline profil com.metin2.client.offline. Cesty mezi nimi nezaměňuj. Kód odvozuje umístění z getExternalFilesDir(null), takže na konkrétním zařízení je rozhodující skutečné aplikační úložiště. Při potížích s aktualizací nejdřív ověř ABI, package ID a podpis APK; bezmyšlenkovitá odinstalace může smazat lokální postavy offline režimu.

Projev Co zkontrolovat jako první
CMake nenajde OpenGr2ndma Inicializaci submodulu a jeho připnutý commit
Nelze nainstalovat APK pro danou ABI ro.product.cpu.abilist proti -Pm2abi
Odpojení těsně po loginu Konkrétní verzi serverového handshaku, pak logy
Návrat po výběru postavy Přesměrovanou IP, BIND_IP a porty všech jader
Chybějící UI nebo černá scéna Výsledek stagingu, protos, Python Lib a syserr.txt
Po aktualizaci zůstala stará data Vyšší m2.dataVersion, správný profil a datový ZIP

Co navíc vyžaduje celý server uvnitř APK

Upstream má i profil bundled: kompiluje Android serverové procesy, přidává SQLite vrstvu místo MySQL a serverová data přibalí ke klientovi. Telefon pak nepotřebuje vzdálený server. Je to další sestavení s vlastním datovým balíkem, nikoli automatická vlastnost APK z kroku 3.

Před sestavením offline režimu nahraď obsah servers/servers.json tímto lokálním katalogem:

{
  "version": 2,
  "servers": [
    { "name": "Single Player", "embedded": true }
  ]
}

Jinak po předchozím LAN postupu zůstane v nabídce pouze vzdálený Home Lab. Do profiles/bundled.properties přidej prázdné m2.serverListUrl=, m2.devUrl= a m2.updateChannel=, zachovej m2.serverMode=embedded, m2.dataBundled=true a příponu .offline. Pro nový datový balík zvyš jeho m2.dataVersion. S vlastními připravenými source/runtime checkouty má balicí skript tento skutečný tvar:

"$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

Ještě před tím zkontroluj bundled.properties, vlastní katalog, dataVersion a testovací účet v seed databázi. make-server-pack.sh očekává runtime checkout, source checkout a výstupní složku; odlišný příklad ve webové části upstream dokumentace sem nepřenášej. Gradle pro embedded server obsahuje linuxovou cestu k NDK nástrojům, proto tento postup nepředkládáme jako ověřené offline sestavení na Windows.

Úspěšný build, spuštěná aplikace, přihlášení a souvislé hraní jsou různé výsledky. Vlastní funkční test dokonči vytvořením postavy, vstupem do mapy, bojem, přechodem mezi jádry a novým spuštěním s kontrolou uloženého inventáře. Bez těchto kroků nelze prohlásit konkrétní telefon a server za ověřenou sestavu.

Často Kladené Otázky

Připojí se tento klient na můj oblíbený privátní server?

Pouze pokud jeho provozovatel zajistí kompatibilní protokol, data a přístup klienta. Tento návod se týká uvedené kombinace Cemre/m2dev, ne cizích serverů s vlastními změnami. APK není univerzální náhrada jejich launcherů.

Je to také návod pro iPhone?

Ne. Popsaný projekt a nástroje zde cílí na Android. Vývojová zmínka o iOS v jiném vlákně nepotvrzuje existenci iOS vydání tohoto klienta.

Mohu výsledné APK s daty veřejně sdílet?

Veřejný zdrojový kód ani licence jedné knihovny neřeší práva k celému klientovi a původním herním datům. Před distribucí potřebuješ vyjasnit oprávnění ke všem zahrnutým částem. Tento článek žádné takové oprávnění neposkytuje.

Související Stránky

Najdi svůj perfektní server

Procházej nejlépe hodnocené Metin2 privátní servery na METIN2.GG nebo přidej svůj vlastní server do žebříčku.