Din cate am observat multi ati inceput sa va bagati nasul in limbajul AMXMODX (PAWN) ceea ce este un lucru foarte bun si foarte folositor . Am gasit acest tutorial care este foarte folositor si foarte bine explicat si cei care doresc sa invete sau macar sa cunoasca cat de cat despre ce este vorba ar putea sa arunce un ochi mai jos . Bafta celor care vor sa invete acest limbaj , cine a facut la scoala C sau C++ ii va fi usor si acest limbaj !

TUTORIAL :


Code:
// LIBRARII( urmatoarele 2 randuri ):
#include 
#include 

// Pentru a fi mai usor de inteles pentru necunascatori, lui "define" ii voi spune tot "FUNCTIE"
// Deci, cu ajutorul functiei "define" putem atribui unui cuvant/abreviere/simbol o valoare
// Valoarea putand fi atat text cat si numerar ( cifre ) !
// "De ce am face asa ceva?"; Raspuns: Pentru a folosi aceeasi valoare in repetate randuri fara a fi nevoie sa se scrie mult si pentru a putea schimba cu usurinta valoarea peste tot !
#define PLUGIN "Plugin?!"
#define VERSION "1.1"
#define AUTHOR "Mr.2peu"
// Ca de exemplu pe randul 17, in functia register_plugin

public plugin_init() {

   // linia de mai jos face ca pluginul sa apara la amx_plugins cu datele de mai sus
   register_plugin( PLUGIN , VERSION , AUTHOR )
   //Aceasta comanda merge scrisa si asa: register_plugin( "Nume_Plug-in" , "Versiune" , "Nume_Autor" )
   
   // pe linia de mai jos, voi "inregistra" comanda propiu-zisa si felul in care va actiona
   // Prin "modul in care v-a actiona" ma refer la target, flag necesar, comanda trimisa servarului (cmd_hp) si comanda scrisa de admin (amx_hp) ( in ordine inversa )
   register_concmd("amx_hp", "cmd_hp", ADMIN_SLAY, " ")
   
}

// Acum voi scrie functia cmd_hp si modul in care v-a actiona aceasta

// Functia mea v-a primi 3 parametrii foarte IMPORTANTI !
// Primul parametru, respectiv "id", v-a primi id-ul jucatorului care foloseste comanda
// Cel de-al doilea, "level", v-a retine nivelul necesar ( flagul ) pentru a fi accesata comanda ( Grija! Verificarea trebuie facuta manual, nu se face automat )
// Iar cel de-al treilea, "cid", va retine numarul de ordine al comenzii
public cmd_hp( id , level , cid )
{   
   // Acum verific daca utilizatorul are acces la comanda.
   // Verificarea se face cu ajutorul functiei cmd_access care este integrata in librariile mai sus mentionate si nu e nevoie sa o creeam noi !
   // Aceasta functie va primi 4 parametrii ( pe care ii va lua automat din functia cmd_hp ), prima data id-ul celui ce doreste sa foloseasca comanda
   // A doua oara flagurile acestuia, a treia oara numarul de ordine,
   // Si cel mai important, ca metoda de siguranta, numarul minim de parametrii primiti, in cazul nostru "3", veti vedea in exemplul de mai jos
      if( !cmd_access( id , level , cid , 3 ) )    // Semnul exclamarii ( "!" ), in limbaj de programe insemna "diferit". Pe scurt comanda noastra se traduce "Daca raspunsul e diferit de cmd_access". Luand in considerare ca cmd_acces va furniza pt. leval: "ADMIN_SLAY" !
      return PLUGIN_HANDLE     // TINETI MINTE !: Odata folosita functia "return" in interiorul altei functii ( in cazul nostru "public cmd_hp.." )
                         // Aceasta va iesi din functie si nu va mai executa nimic sub ea, pana la sfarsitul functiei ! 
                         // Mai multe detalii despre functia "return" gasiti la sfarsitul functiei "cmd_hp" !   
   // DACA VALIDAREA ESTE FACUTA ( adica daca Mr2peu care are toate comenzile, inclusiv ADMIN_SLAY, va da comanda ) SE VA CONTINUA CU URMATOAREA PORTIUNE DE COD:

   
   // ACUM AVEM PARTE DE UNA DIN CELE MAI IMPORTANTE PORTIUNI DE COD ( de care veti avea nevoie ca de ochii din cap ! )
   // Este vorba despre 2 lucruri foarte importante: 1. Cantitatea folosita ( de ex. nr. "99": "amx_slap Mr2peu 99" ) si 2. "Target"-ul ( tinta )
   // Care poate fi de 3 feluri: 1. "@CT sau @T" ( ex.: "amx_slayteam @CT" ) ; 2. "@ALL" ( ex.: "amx_slayteam @ALL" ) ; 3. "" ( ex.: "amx_slay "Mr2peu" )
   
   //declararea a doua string-uri ( siruri de caractere )
   new Arg1[24]
   new Arg2[4]
   
   //introducerea datelor scrise in consola, IN ACESTE STRING-URI
   read_argv( 1 , Arg1 , 23 ) // 1 - "1" primul parametru ; 2 - sirul Arg1 ; 3 - "Arg1[numar]" unde vom trece "numar-1" pentru ca e sir de caractere si pe ultima pozitie avem 0
   read_argv( 2 , Arg2 , 3 )  //  1 - "2" al doilea parametru ; 2 - sirul Arg2 ; 3 - a Acelasi lucru ca mai sus, insa de scos in evidenta ca Arg1 va primi "target" iar Arg2 va primi "amount"
   
   // IMPORTANT: "1. Cantitatea folosita " !
   //deoarece lucram cu siruri de caractere, iar noi pentru "amount"( cantitate ) avem nevoie de cifre, trebuie sa convertim caracterele in cifre
   new Health = str_to_num( Arg2 ) // "str_to_num" face conversia automat, aceasta de asemenea este o functie din librarii !

   // IMPORTANT: "2. Target-ul" !
   //aici va trebui sa verificam cu ce fel de actiune ne vom bate capul, respectiv punctele 2.1, 2.2 si 2.3 ( ref. randul 43 )
   //Vom incepe prin a verifica daca este vorba de o comanda data pe mai multi utilizatori ( comanda ce incepe cu "@" )
   //sau mai jos in cod, daca este vorba de o comanda data pe un singur utilizator ( "" )
   if( Arg[0] == '@' )
   {
      //creem o variabila temporala pe care o vom folosi in mai multe moduri, vedeti mai jos
      new Team = 0
      // Acum trebuie sa verificam daca vrem sa folosim comanda pe "CT" sau pe "T"
      if( equali( Arg1[1], "CT" ) )
      {
         Team = 2  // Daca comanda a fost data ca si "target" pe @CT vom atribui variabilei temp. valoarea 2
      }
      else if ( equali( Arg1[1], "T" ) )  // "equali" este o alta functie din librarii, aceasta verifica daca doua siruri de caractere sunt egale ( in cazul nostru )
      {   
         Team = 1  // Iar daca a fost data pentru @T ii vom atribui valoarea 1
                 // Valori pe care le vom folosi in continuare. Facem asta pentru a nu fi nevoie sa verificam mereu despre ce echipa este vorba !
      }
      
      //din moment ce este vorba de o comanda data la "scala larga" ( pe mai multi jucatori ), vom avea nevoie de o variabila temporala in care sa retinem jucatorii respectivi si de inca una pentru a retine numarul jucatorilor
      new players[32], num
      
      // Acum vom folosi alta functie din librarii ! Respectiv "get_players", care imi va returna in cei 2 parametrii pe care-i folosesc, numele si numarul jucatorilor, ex.:
      get_players( players , num )  // daca pe servar, sunt 20 de jucatori, num va retine numarul "20" iar players, va retine cele 20 de nume ale jucatorilor !
      
      // Se va folosi o repetitiva pentru a parcurge jucatorii si pentru a se aplica comanda pe fiecare in parte ! Vom Folosi Repetitiva "FOR" !
      //pentru a parcurge jucatorii, si a fi siguri ca nu dam comenzi in plus pe servar, vom folosi o variabila pe post de contor 
      new i // i va fi contorul meu
      for( i = 0 ; i < num ; i++ )
      {
         if( !Team ) // Aceasta conditie este foarte importanta, Aceasta verifica daca variabila temporala "Team" este initializata
         {         // Noi am initializat variabila "Team" cu 1 pentru @T si cu 2 pentru @CT !
         //Deci, daca Team nu este initializat, vom considera ca este vorba despre "@ALL" si vom aplica comanda pe toti jucatorii !         
            set_user_health( players[i], Health ) //aceasta functie este tot din librarii !
         }
         else         // Daca Team este initializat, trebuie sa verific despre ce echipa este vorba, ca sa stiu carei echipe ii aplic comanda !
         {
            if( get_user_team( players[i] ) == Team ) // "get_user_team" alta functie din librarie, aceasta returneaza 1 pentru T sau 2 pentru CT !
               {
                  set_user_health( players[i], Health )
               }
         }
      }
      
   } else 
      {
      // Daca s-a ajuns in acest punct, inseamna ca comanda nu a inceput cu "@", deci e vorba despre o singura persoana ( "" )
      // Dupa cum stiti, comenzile se pot da si pe nickname-uri partiale, deci si plug-in-ul vostru se va comporta la fel ( ex. pentru nick-ul "Mr2peu": "amx_kick Mr2" )
      // Asa ca vom incepe prin a cauta respectivul jucator !
      //va trebui acum sa folosim o alta variabila temporala pentru a retine numele jucatorului cu ajutorul altei functii incorporate in librarie ( cmd_target )
      new player = cmd_target( id , Arg1 , 1 )  // 1. id ; 2. Arg1 - va retine numele ; 3. "1" inseamna ca utilizatorul are imunitate si comanda nu-l va "tinti"
                                      // IMPORTANT!: Iar daca nu-l va tinti, deci repet!, daca utilizatorul are imunitate, variabila player nu va fi initializata !
      if( !player )
      {
         // ACESTA ESTE CAZUL IN CARE UTILIZATORUL ARE IMUNITATE ! CITITI ATENTI !
         // Aici vom scrie in consola ca utilizatorul are imunitate, deci nu poate fi "tintit" !
         // Insa pentru a fi foarte exacti, trebuie sa folosim anumiti parametrii, parametrii ce va trebui sa ii tineti minte !
         // Voi enumera mai jos acesti parametrii, cu tot cu exemple !
         // 1. "%s" inseamna string, adica TEXT, o propozitie, un cuvant, etc.
         // 2. "%d" sau "%i" inseamna intreg, adica UN NUMAR INTREG ! ( ex.: "1" )
         // 3/ "%f" inseamna numar in virgula mobila, DECI NU INTREG! ( ex.: "1.23" )
         // EXEMPLU CONCRET!: "Salut %s, eu am % ani". Acest "cod" va avea nevoie de un sir de carectere ( un nume pentru "%s" si un numar intreg pentru "%d" )
         // Iar acum, functia pentru AFISARE IN CONSOLA ! ( de asemenea, functie incorporata in librarii ! ) ( "console_print" )
         console_print( id , "Imi pare rau, jucatorul %s nu a fost gasit ori nu l-am putut tinti!", Arg1 )
                       // Acum ca sa intelegeti, console_print(id , ... , .. ) ii va afisa celui ce a dat comanda orice ii este dat sa afiseze
                    // Iar, console_print( .. , "text %s" , .. ) va fi textul afisat, insa mare atentie la "%s", acesta este unul din parametrii de care vorbeam
                    // Acesta va primi valoarea pusa in: "console_print( ... , ... , Arg1 ) !
                    
         // Iar acum, terminarea acestei functii
         return PLUGIN_HANDLED
      } else
         {
            // Daca am ajuns in acest punct, inseamna ca utilizatorul NU ARE IMUNITATE !
            // Deci vom putea executa comanda pe el !
            
            set_user_health( player , Health )
         }
                                     
      
      }
      

   
   // Mai jos se va "iesi" din aceasta functie folosind functia return
   // Insa MARE ATENTIE ! Aceasta functie, "return" ( pentru ce aveti voi nevoie ), poate returna valoarea in doua moduri
   // Prin "PLUGIN_HANDLED" ( ex.: "return PLUGIN_HANDLED" ), care v-a returna rezultatul odata, ca punct de referinta, comanda amx_kick, o dai odata, doar odata este executata
   // Sau prin "PLUGIN_CONTINUE" ( ex.: "return PLUGIN_CONTINUE" ), care va returna fara oprire acelasi rezultat, ca punct de referinta, comanda amx_godmode, care returneaza valoarea de 100 pentru viata fara oprire
   return PLUGIN_HANDLED