Autor: KronoS # GG
Contribuitori: -
1. Informatii de baza
Code:
Pluginurile AmxModX sunt realizate folosind limbajul de programare Pawn (cunoscut ca si Small).Codul este scris intr-un editor de text (precum Notepad, Notepad++, AMXX Studio etc.) si salvat ca fisier cu extensia .sma (fisier sursa de plugin AmxModX).Acesta trebuie compilat pentru a se obtine un fisier cu extensia .amxx (pluginul in sine).
Programarea pluginurilor in limbajul Pawn este relativ usoara deoarece nu exista unele notiuni care se gasesc in limbajele de programare mai avansate.
2. Compilarea unui plugin
Code:
Compilarea reprezinta procesul prin care codul sursa scris intr-un limbaj de programare (in cazul nostru Small sau Pawn) este tradus in cod obiect, ce poate fi apoi executat.
In cazul surselor de pluginuri amxmodx, compilarea se poate face online sau local (aceasta fiind metoda recomandata).Compilarea online se face accesand link-ul http://www.amxmodx.org/webcompiler.cgi .Aici puteti posta codul in casuta de text special amenajata, precum si numele care doriti sa-l atribuiti fisierului, sau, puteti selecta sursa direct din calculator.Dupa apasarea butonului Compile va incepe compilarea pluginului, urmata de link-ul de descarcare al pluginului (cu extensia .amxx) sau de erori si avertismente in cazul in care sunt gasite greseli la nivelul codului.Compilarea locala se poate face daca aveti instalat modul AmxModX in calculator.Va duceti in folderul addons/amxmodx/scripting
si puneti acolo fisierul sursa (exemplu: plugin.sma), apoi trageti iconita acestuia peste fisierul compile.exe tinand apasat Click stanga.Astfel, o sa apara o consola ce o sa returneze erorile si avertismentele sau va informeaza ca a decurs cu succes compilarea.Pluginul compilat il gasiti in folderul addons/amxmodx/scripting/compiled
3. Notatii si vocabular in limbajul Pawn
Code:
Vocabularul limbajului Pawn este format din simboluri de baza, clasificate in trei mari categorii:
literele alfabetului englez
cifre arabe: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
simboluri speciale (operatori si delimitatori): . ; , : ? " ( ) [ ] { } < > ! | / _ # % & ^ + - * =
Tot in categoria simbolurilor speciale se incadreaza si cuvintele rezervate, numite si cuvinte-cheie, care au un inteles bine stabilit si nu pot fi folosite de catre scripteri decat in contextul permis de catre sintaxa limbajului Pawn.Din lista cuvintelor-cheie fac parte urmatoarele: case, const, else, enum, float, for, if, return, sizeof, static, switch, while, public, iar lista poate continua.
Scrierea unui plugin cu ajutorul limbajului Pawn este similara scrierii de fraze in limbaj natural.Se folosesc combinatii de cuvinte si separatori.Cuvintele pot fi:
simboluri speciale
identificatori obisnuiti sau predefiniti
constante
Separatorii se incadreaza in una din urmatoarele categorii:
spatiu
comentariu
sfarsit de linie
Identificatorii reprezinta modalitatea de denumire a constantelor, tipurilor de date, variabilelor si functiilor.Constantele reprezinta date ale caror valori nu se modifica pe parcursul rularii pluginului.Prin contrast, variabilele reprezinta date ale caror valori pot fi modificate.
4. Structura unui plugin (de refacut!)
Code:
Un plugin AmxModX are, in principiu, urmatoarea structura:
Directive preprocesor/de includere
Definitii de variabile globale/constante
Definitii de functii
Directivele preprocesor/de includere reprezinta primele linii dintr-un program.Prin aceste directive compilatorul este anuntat sa foloseasca anumite biblioteci care contin descrierea unor functii folosite in plugin.Sintaxa directivei de includere este: #include < numele_bibliotecii >
5. Includerea fisierelor/bibliotecilor
Code:
Un plugin AmxModX are, in principiu, urmatoarea structura:
Directive preprocesor/de includere
Definitii de variabile globale/constante
Definitii de functii
Directivele preprocesor/de includere reprezinta primele linii dintr-un program.Prin aceste directive compilatorul este anuntat sa foloseasca anumite biblioteci care contin descrierea unor functii folosite in plugin.Sintaxa directivei de includere este:
#include < numele_bibliotecii >
Includerea fisierelor/bibliotecilor
Code:
Includerea fisierelor/bibliotecilor se realizeaza prin doua cai:
#include < fisierul >
#include "fisierul"
Folosind prima cale, fisierul este cautat in directorul standard (In cazul AMXX directorul standard este include).
Folosind a doua cale, fisierul este cautat in directorul curent, apoi in cel standard (In cazul AMXX directorul curent este scripting).Aceasta forma
Atunci cand facem un plugin AMXX, va trebui sa includem mereu biblioteca amxmodx:
#include < amxmodx >
Daca pluginul contine si comenzi pentru admini, atunci va trebui sa includem si biblioteca amxmisc:
#include < amxmisc >
6. Comentarii
Code:
Daca doriti sa folositi prima forma, iar comentariul se intinde pe mai multe randuri, trebuie sa adaugati // in fata fiecarui rand de comentariu:
// Comentariul asta
// se intinde pe mai multe
// randuri
A doua forma este recomandata deoarece la inceputul comentariului se pune /* iar la sfarsit se pune */
Avantajul este ca nu mai trebuie sa puneti simbolurile in fata fiecarui rand:
/* Comentariul asta
se intinde pe mai multe
randuri */
ATENTIE: Comentariile din sursa nu sunt citite de catre compilator
7.Optimizarea consumului de memorie al variabilelor
Code:
Aceste lucruri sunt valabile si pentru vectori si siruri!
Pentru ca un plugin sa consume cat mai putina memorie RAM, sunt recomandate:
folosirea unui numar cat mai mic de variabile globale
declararea cat mai exacta a numarului de pozitii (in cazul vectorilor si al sirurilor)(Exemplu: stocarea numelui unui jucator intr-o variabila poate ocupa maxim 32 de pozitii, de aceea variabila va fi declarata ca avand 32 de pozitii, si nu un alt numar mai mare decat valoarea recomandata)
8. Vectori
Code:
Un vector este un tip simplu de date agregate.Asta inseamna ca puteti stoca multiple valori intr-o singura variabila.Un vector are aceleasi reguli si tipuri ca si o variabila normala.Diferenta intre cele doua este ca primul contine valori multiple.Un vector se defineste cu paranteze drepte, intre care se afla numarul de valori pe care acesta poate sa-l contina.
new Players[ 32 ]; // Declararea vectorului "Players" ce are 32 de pozitii
Puteti stoca valori in oricare din cele 32 de pozitii ale vectorului.Pozitiile sunt numerotate de la 0 la n-1 (in cazul de mai sus 32-1, adica 31).Orice pozitie are implicit valoarea 0.
Players[ 1 ] = 7; // Se atribuie pozitiei 1 a vectorului "Players" valoarea 7
Players[ 2 ] = Players[ 1 ]; // Se atribuie pozitiei 2 valoarea care se afla pe pozitia 1 a vectorului
// Linia de cod de mai jos este incorecta.Desi vectorul are 32 de pozitii declarate, ultima pozitie este 31, numerotarea incepand de la 0
Players[ 32 ] = 15;
// Linia de cod de mai jos este incorecte.Pozitiile sunt numerotate de la 0 in sus.
Players[ -1 ] = 13;
// Codul de mai jos este incorect deoarece a trebuie sa fie un numar constant.
new a = 5;
new Array[ a ]
// Codul de mai jos reprezinta varianta corecta a celui de mai sus
const a = 5;
new Array[ a ];
// Vectorii pot fi declarati cu date implicite
new Array[ 4 ] = { 0, 1, 2, 3 };
// Puteti folosi si constante simbolice
#define POZITII 4
new Array[ POZITII ];
// Puteti folosi si celelalte doua tipuri de date: float si boolean
new Float:numere[ 4 ] = { 0.0, 1.3, 2.5, 5.6 };
new bool:codat[ 2 ] = { true, false };
9. Siruri
Code:
Cei care au experienta probabil au remarcat ca lipseste un tip de date important, caracterele.Acestea se numesc siruri si in limbajul Pawn sunt, tehnic vorbind, numere.Un sir este un vector de numere care sunt traduse in simboluri ASCII (caractere).
// Declararea sirului "SirComunitate" ce contine cuvantul ALPHACS
// Acest sir are 10 pozitii, 9 din ele fiind reprezentate de literele ce alcatuiesc
// cuvantul alphacs iar ultima pozitie este rezervata numarului 0, care spune
// compilatorului ca acesta este un sir
new SirComunitate[ ] = "ALphaCs";
10. Operatori si expresii
Code:
Limbajul Pawn permite folosirea unui numar mare de operatori.Un operator se reprezinta cu ajutorul unuia sau a doua caractere speciale alaturate, numite operanzi (exemple: = sau != etc.).
Tipuri de operatori:
unari - folosesc un singur operand
binari - folosesc doi operanzi
O expresie este o combinatie de operanzi si operatori scrisa astfel incat, respectand regulile limbajului de programare, sa conduca la calcularea unei valori unice.La fel ca si in matematica, ordinea efectuarii operatiilor in cadrul unei expresii este stabilita de prioritatea operatorilor, care poate fi modificata prin utilizarea parantezelor rotunde pe oricat de multe niveluri este necesar.Spre deosebire de matematica, nu este permisa folosirea in expresii a parantezelor drepte sau a acoladelor pentru modificarea ordinii de efectuare a operatiilor.
Atunci cand intr-o expresie apar operatori cu aceeasi prioritate, ordinea de efectuare a operatiilor este impusa de ordinea de asociere a operatorilor.In general, aceasta este de la stanga la dreapta dar exista si doua exceptii, operatorii unari si operatorii de atribuire, in cazul carora ordinea de asociere este de la dreapta la stanga.
11. Constante simbolice
Code:
Definirea constantelor simbolice se face astfel:
#define Numele_Constantei Valoarea_Constantei
Acest lucru face ca in toata sursa, constanta definita mai sus sa fie inlocuita cu valoarea atribuita (exceptie comentariile).
Scopul acestora este de a usura editarea surselor.
Exemplu:
#define Nume_Comunitate eXtreamCS
12. Functia plugin_init( )
Code:
Functia plugin_init( ) reprezinta functia principala a pluginului, in care se inregistreaza pluginul, comenzile, eventurile folosite etc.Ea este apelata imediat dupa schimbarea hartii.
Functia este de tip public, fara parametrii si se declara astfel:
public plugin_init( )