Învață programare
Primul tău gamemode SA-MP / open.mp în Pawn
Scrii un gamemode minimal în Pawn, îl compilezi în .amx, îl activezi în configurația serverului și îl testezi cu clientul de joc.
San Andreas Multiplayer (SA-MP) și open.mp sunt două servere pentru modul multiplayer al jocului GTA San Andreas. Regulile jocului, adică ce se întâmplă când intri, ce comenzi ai și ce primești, stau într-un program numit gamemode. Gamemode-urile se scriu în Pawn, un limbaj mic, apropiat de C.
Presupunem că ai citit „Ce este programarea” și ai pregătit calculatorul cu „Mediu de lucru pe Windows”. Pentru testare ai nevoie de GTA San Andreas și de clientul multiplayer corespunzător serverului pe care îl folosești.
Pawn în cinci minute
- Variabilele se declară cu new: new viata = 100; sau cu tip: new Float:viteza = 1.5;. Fiecare instrucțiune se termină cu punct și virgulă.
- Textul este un tablou de caractere: new nume[24];. La declarare poți scrie new nume[24] = "Alex"; după declarare nu poți atribui un șir cu =, ci folosești funcții precum format, strcat sau strmid.
- if, else, for și while arată ca în C. Comparația este ==, iar diferit este !=.
- Un callback (apelat de server) se declară cu public: public OnPlayerConnect(playerid). Serverul le cheamă singur când se întâmplă ceva.
- playerid este numărul jucătorului pe server. Aproape toate funcțiile de joc îl primesc ca primul argument.
- Valoarea întoarsă contează: return 1 înseamnă de regulă „am tratat evenimentul”, iar return 0 „nu l-am tratat”. La comenzi, return 0 face serverul să spună că nu există comanda.
SA-MP și open.mp, pe scurt. SA-MP este serverul original, cu programarea în Pawn. open.mp este un proiect deschis care își propune să rămână compatibil cu gamemode-urile și cu clientul SA-MP, adăugând îmbunătățiri și o configurare mai nouă. Pentru un gamemode simplu ca cel de aici, codul este același; diferențele se văd în câteva locuri.
- Fișierul de include: la SA-MP scrii #include <a_samp>, iar la open.mp scrii #include <open.mp>. Include-urile open.mp păstrează compatibilitatea cu codul vechi, dar verifică în documentația proiectului ce versiune folosești.
- Configurarea serverului: SA-MP citește un fișier text server.cfg. open.mp folosește în mod obișnuit un fișier config.json.
- Compilatorul și editorul: SA-MP vine, pentru Windows, cu un editor simplu (Pawno) și compilatorul pawncc. Pentru open.mp îți alegi compilatorul și editorul recomandate în documentația proiectului.
- Ce alegi depinde de proiectul tău. Întrebarea bună este ce server rulează hostingul tău și ce documentație urmezi.
Detaliile despre open.mp se schimbă în timp. Citește documentația oficială (www.open.mp/docs) înainte să copiezi o configurare și tratează informațiile de aici ca pe o hartă generală.
Structura proiectului. Un server are, între altele, folderul gamemodes (aici stau programele compilate .amx) și fișierul de configurare. Codul sursă .pwn îl poți ține lângă ele sau într-un folder separat al proiectului tău.
server/
server.cfg (SA-MP) sau config.json (open.mp)
gamemodes/
salut.pwn codul tău
salut.amx rezultatul compilării
pawno/include/ fișierele include, de exemplu a_sampUn gamemode minimal
Salvează fișierul ca salut.pwn. Mesajele sunt scrise fără diacritice, intenționat: jocul folosește o codare veche pentru text, iar caracterele cu diacritice pot apărea greșit pe ecran.
#include <a_samp>
main()
{
print("[salut] gamemode incarcat");
}
public OnGameModeInit()
{
SetGameModeText("Salut Gamemode");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
print("[salut] OnGameModeInit a rulat");
return 1;
}
public OnPlayerConnect(playerid)
{
new nume[MAX_PLAYER_NAME];
new mesaj[64];
GetPlayerName(playerid, nume, sizeof(nume));
format(mesaj, sizeof(mesaj), "Bun venit, %s!", nume);
SendClientMessage(playerid, 0x00FF00FF, mesaj);
return 1;
}
public OnPlayerSpawn(playerid)
{
GivePlayerMoney(playerid, 1000);
SendClientMessage(playerid, -1, "Ai aparut in lume cu 1000 de dolari.");
return 1;
}Ce face fiecare parte:
- OnGameModeInit rulează o singură dată, când pornește gamemode-ul. Aici setezi numele modului și adaugi clase de jucători.
- AddPlayerClass stabilește cine poți fi la intrare: modelul personajului (0), coordonatele locului în care apari, unghiul și până la trei arme. Fără nicio clasă, jucătorii nu pot intra în joc.
- OnPlayerConnect rulează când un jucător se conectează. Citim numele cu GetPlayerName și compunem un mesaj cu format. %s se înlocuiește cu textul, iar sizeof dă mărimea tabloului, ca să nu scriem peste limită.
- SendClientMessage trimite un mesaj în chat unui singur jucător. Culoarea este un număr hexazecimal de forma RRGGBBAA; 0x00FF00FF este verde, iar -1 este alb.
- OnPlayerSpawn rulează când jucătorul apare în lume, după ce alege clasa. Îi dăm bani cu GivePlayerMoney. OnPlayerSpawn se rulează la fiecare reapariție, deci jucătorul primește banii de fiecare dată; într-un gamemode real ai ține evidența într-o variabilă.
Acest ghid nu a putut rula compilatorul Pawn în momentul scrierii. Codul urmează exemplele clasice SA-MP, dar compilează-l tu și vezi mesajele compilatorului; dacă ceva diferă la versiunea ta, documentația oficială este autoritatea.
O comandă simplă
Fără biblioteci suplimentare, comenzile se prind în callbackul OnPlayerCommandText. Primești tot ce a scris jucătorul în cmdtext și îl compari cu strcmp. Ultimul argument true ignoră diferența dintre litere mari și mici.
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/salut", cmdtext, true) == 0)
{
SendClientMessage(playerid, 0xFFFF00FF, "Salut din gamemode!");
return 1;
}
if (strcmp("/viata", cmdtext, true) == 0)
{
SetPlayerHealth(playerid, 100.0);
SendClientMessage(playerid, 0xFFFF00FF, "Viata ta a fost refacuta.");
return 1;
}
return 0;
}strcmp întoarce 0 când cele două texte sunt egale, de aceea compari cu == 0. Dacă o comandă a fost tratată, întorci 1. Dacă nu o recunoști, întorci 0, iar serverul îi spune jucătorului că nu există.
Pentru comenzi cu argumente și cod mai curat, comunitatea folosește biblioteci precum zcmd sau Pawn.CMD. Sunt includeri externe, pe care le instalezi separat. Pentru început, OnPlayerCommandText îți ajunge și nu cere nimic în plus.
Compilarea cu pawncc
Calculatorul nu înțelege fișierul .pwn. Compilatorul pawncc îl transformă în .amx, fișierul pe care serverul îl încarcă. Același .amx rulează pe serverul de Windows și pe cel de Linux, deci îl poți compila pe PC-ul tău și îl poți urca pe server.
- Cu editorul Pawno din pachetul SA-MP: deschide salut.pwn și apasă butonul Compile (sau F5). Dacă nu apar erori, lângă fișier apare salut.amx.
- Din linia de comandă: rulează pawncc cu fișierul sursă ca argument, dintr-un folder în care compilatorul găsește folderul include. Cu opțiunea -i poți indica singur folderul include; sintaxa nu are spațiu între opțiune și cale, de exemplu pawncc salut.pwn -i"pawno/include".
- Citește rezultatul. Linia de final cu numărul de erori trebuie să fie zero. Avertismentele (warning) nu opresc compilarea, dar merită citite.
- Copiază salut.amx în folderul gamemodes al serverului.
Activarea gamemode-ului în configurație
La SA-MP, fișierul server.cfg conține o linie gamemode0 urmată de numele fișierului fără extensia .amx și de numărul de rulări. Valoarea 1 înseamnă o singură rundă.
hostname Serverul meu de test
gamemode0 salut 1
port 7777
maxplayers 20
rcon_password SCHIMBA_ACEASTA_PAROLALa open.mp, aceeași informație stă în config.json, la secțiunea pawn, în lista main_scripts, cu aceeași formă: numele fișierului fără extensie, urmat de numărul de rulări. Verifică forma exactă în documentația open.mp, pentru că structura fișierului a evoluat.
Nu lăsa o parolă rcon simplă sau cea din exemplu. Cine are parola rcon poate controla serverul. Folosește o parolă lungă, unică, și nu o publica.
Pe un server SA-MP din GamePanel
Catalogul GamePanel are SA-MP printre jocurile instalabile pe un nod (la crearea unui server alegi „Alt joc”). Catalogul îl instalează prin LinuxGSM și îi dă portul implicit 7777. Pentru open.mp nu există o intrare separată în catalog.
Managerul de fișiere al panoului listează, citește, salvează, șterge și descarcă fișiere, deci poți edita server.cfg direct acolo, iar consola live arată jurnalul serverului. Cum ajunge fișierul .amx în folderul gamemodes depinde de cum este configurat serverul tău; folosește metoda pe care ți-o dă găzduirea, apoi repornește serverul din panou.
Testarea
- Pornește serverul și citește jurnalul. Ar trebui să vezi mesajele tale: gamemode incarcat și OnGameModeInit a rulat.
- Pornește clientul multiplayer și conectează-te la adresa serverului, pe portul din configurație.
- Alege clasa și apari în lume. Ar trebui să primești mesajul de bun venit și apoi pe cel cu 1000 de dolari.
- Scrie /salut și /viata în chat. O comandă necunoscută trebuie să primească răspunsul implicit al serverului.
- Modifici codul? Recompilează, înlocuiește .amx și repornește serverul. Serverul nu citește sursa .pwn.
Erori frecvente
- error 017: undefined symbol: ai scris greșit numele unei funcții sau variabile, sau lipsește un #include.
- error 001: expected token ";": lipsește punctul și virgula sau o paranteză. Uită-te și la linia dinaintea celei raportate.
- error 035: argument type mismatch: ai dat un argument de alt tip, de exemplu un număr în loc de text.
- cannot read from file a_samp: compilatorul nu găsește folderul include. Verifică folderul pawno/include sau opțiunea -i.
- Serverul nu găsește gamemode-ul: numele din server.cfg nu se potrivește cu fișierul .amx din gamemodes, sau ai scris extensia în configurație.
- Mesajele cu diacritice apar cu simboluri ciudate: scrie textul din joc fără diacritice.
- Comanda nu merge: ai uitat return 1 și serverul răspunde că nu o cunoaște.
Pașii următori
- Salvează date despre jucători într-un fișier sau într-o bază de date și citește-le la conectare.
- Folosește mesaje către toți jucătorii, cu SendClientMessageToAll.
- Adaugă mașini, locuri de apariție și echipe.
- Învață callbackurile OnPlayerDeath, OnPlayerText și OnPlayerEnterVehicle.
- Împarte codul pe fișiere cu #include când gamemode-ul crește.