Până acum ai lucrat cu fișiere text, questuri și baza de date. Pe forumuri vei auzi însă des: „trebuie să modifici în sursă și să recompilezi”. Sună complicat, iar mulți încep să schimbe lucruri la întâmplare. Lecția aceasta îți face ordine în cap: ce piese are un server Metin2, din ce sunt construite și când ai nevoie de compilare (de cele mai multe ori, nu ai).
game și db sunt programe gata construite din cod sursă C++. Fișierele TXT, questurile și baza de date le dau „datele”. Clientul e alt program, pe Windows. Recompilezi doar când schimbi comportamentul programului, nu datele lui.Nivel: Avansat. Ce trebuie să știi înainte: structura serverfiles, conectarea prin SSH și WinSCP și să ai un server de test. Nu ai nevoie să știi programare pentru lecția asta.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Cod sursă | Textul programului, scris de programatori (fișiere .cpp și .h). Calculatorul nu îl poate rula direct. |
| Compilare | Transformarea codului sursă într-un program care rulează. Ca o rețetă transformată în prăjitură. |
| Binar (executabil) | Programul rezultat după compilare. De exemplu fișierul game. |
| Librărie (bibliotecă) | O bucată de cod gata compilată, folosită de mai multe programe. Fișiere .a. |
| Core | Un proces game pornit, cu propriul CONFIG (un canal, auth, game99). |
Piesele serverului, pe rând
Gândește-te la un restaurant. Bucătarul e game, cămara e db plus MySQL, iar chelnerul care vorbește cu clienții e clientul jocului.
| Piesă | Ce face | Unde o găsești (în pachetul verificat) |
|---|---|---|
game | Toată logica jocului: monștri, lupte, drop, questuri, hărți. Același program rulează ca auth, ca fiecare canal și ca game99. | share/bin/game, iar fiecare core are un link spre el |
db | Intermediarul dintre game și MySQL. Ține datele personajelor în memorie și le salvează. | share/bin/db, cu link în folderul db/ |
| Clientul | Programul de pe Windows: grafică, interfață, sunete. Trimite și primește mesaje de la game. | Pe calculatorul jucătorului (de exemplu Metin2Distribute.exe) |
| Sursa serverului | Codul C++ din care se construiesc game și db. | Un folder separat, nu pe serverul live |
| Sursa clientului | Codul C++ al clientului, deschis cu Visual Studio. | Pe calculatorul tău Windows |
În pachetul pe care l-am verificat, auth, fiecare canal și game99 sunt de fapt același fișier game, folosit prin legături (link-uri) din folderele lor. De aceea, când înlocuiești share/bin/game, schimbi toate core-urile deodată. Ținem minte asta pentru lecția despre pus binarele pe server.
Cum arată sursa serverului
Sursa pe care am verificat-o are această structură:
server-src/
Makefile <- „rețeta generală” care le construiește pe toate
libthecore/ <- funcții de bază: rețea, jurnale (log), timp
libpoly/ <- calcule de geometrie pentru hărți
libgame/ <- bucăți comune de logică
libsql/ <- legătura cu MySQL
liblua/ <- limbajul Lua, pentru questuri (Lua 5.0.3)
libserverkey/ <- verificare de cheie (specific pachetului)
common/ <- fișiere comune game și db (tables.h, length.h)
game/src/ <- codul programului game
db/src/ <- codul programului db
etc/ <- librării externe: boost, cryptopp, mysqlBucata game/src/quest/ conține și sursa compilatorului de questuri qc. Alte pachete pot avea foldere în plus sau în minus, ori pot folosi alt sistem de construcție (CMake în loc de Makefile). Uită-te la ce ai tu.
Ca să afli singur ce sistem folosește sursa ta, caută „rețetele” de construcție:
find /usr/home/sursa -maxdepth 3 \( -name Makefile -o -name CMakeLists.txt \)/usr/home/sursa e un exemplu: pune calea unde ai copiat sursa. Dacă vezi Makefile, sursa se construiește cu gmake (despre asta în lecțiile următoare).
Când NU ai nevoie de compilare
Aceasta e partea cea mai importantă. Majoritatea modificărilor de pe un server nu cer compilare:
| Vrei să schimbi | Ce modifici | Compilezi? |
|---|---|---|
| Dropul unui monstru sau cufăr | Fișierele TXT de drop | Nu |
| HP, EXP, prețul unui item | mob_proto, item_proto | Nu (restart sau reîncărcare) |
| Un quest nou | Fișierul .quest | Doar questul, cu qc |
| Iconițe, texte în client | Fișierele din pack-urile clientului | Nu, faci update de client |
| Canale, porturi | CONFIG | Nu |
| O formulă din joc (de exemplu cum se calculează daunele) | Codul C++ din game/src | Da, compilezi game |
| Un sistem nou care trimite date noi la client | C++ în game și în client | Da, pe amândouă |
Regula simplă: dacă poți face ceva din fișiere sau questuri, fă-l acolo. Codul C++ e ultima soluție, nu prima.
Ce ai nevoie ca să compilezi
- Sursa exactă din care s-a construit
game-ul tău. O sursă „asemănătoare” de pe un forum poate produce un program care nu se înțelege cu clientul sau cu baza ta de date. - Un server de test, separat. Nu compila și nu testa niciodată direct pe serverul cu jucători.
- Un sistem potrivit cu binarele pe care le ai deja (vezi mai jos).
Binarele din pachetul verificat sunt pe 32 de biți (i386), construite pentru FreeBSD 13.0. Verifici la tine cu:
file /usr/home/game/share/bin/gameCe ar trebui să vezi: ceva de forma ELF 32-bit LSB executable, Intel i386 ... for FreeBSD 13.0. Notează rezultatul. Vei avea nevoie de el în lecția despre mediul de compilare.
Greșeli des întâlnite
- Recompilezi pentru o schimbare de drop. Pierzi timp și riști să strici ceva. Dropul e în fișiere TXT.
- Descarci „o sursă” de pe internet și o pui peste serverul tău. Dacă nu e exact sursa pachetului tău, structurile de date pot fi diferite și poți strica personaje.
- Crezi că
authe alt program. În multe pachete e acelașigame, pornit cu altCONFIG. - Schimbi serverul și uiți de client. Dacă modificarea schimbă ce se trimite între ele, trebuie compilate amândouă.
Întrebări frecvente
Pachetul meu nu are sursă. Pot totuși să-l administrez?
Da. Poți face aproape tot din fișiere, questuri și baza de date. Fără sursă nu poți schimba doar logica internă a programului.
Sursa trebuie să stea pe serverul live?
Nu e nevoie. E mai sigur s-o ții pe serverul de test, unde compilezi. Pe live ajunge doar binarul verificat.
Ce e fișierul .sln pe care l-am găsit?
E o „soluție” Visual Studio, de pe Windows. Poate fi pentru client sau pentru unelte. În sursa verificată există și un m2server.2008.sln, vechi, pentru Windows; pe FreeBSD folosești Makefile-urile.
Ce urmează
Mergi mai departe cu pregătirea mediului de compilare pe FreeBSD. Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.