The best there is[/center]
Informatii
ZCMD a fost creat de Zeex si este cel mai rapid pocesor de informatii, proceseaza multi mai rapid decat DCMD, YCMD, sau vechea metoda strcmp.
SSCANF a fost creat de cel mai bun scripter, si aici nu glumesc, este cel mai bun scripter in domeniul SA-MPului, a creat acest system pentru a facilita folosirea parametriilor de catre utilizator, are isnull, IsPlayerConnected, are strval are stringuri, are tot ce iti trebuie, si formateaza totul fara ca tu sa dai strval ca sa afli ceva. Are ceva foarte frumos de exemplu, sa gasesti numele playerului, ID, ETC.
Ai nevoie de urmatoarele
ZCMD trebe pus in > Server/Pawno/Includes
SSCANF <-Copy + Paste in GM, FS.
FormMessage, FormMessageForAllEx Trebuie adaugate undeva sub #include <ZCMD>
foreach by Y_Less <- pawno/includes
Sa incepem...
Deci, noi vrem sa facem o comanda GOTO, care salase jucatorul respectiv sa se duca la unu sau sa lase sa vine el la el.
Pasul 1:
Trebuie sa includem ZCMD.Acest cod vine sus de tot, dedesupt de #include <a_samp>
Code: Select all
#include < ZCMD >
Acuma sa creem variabila cu care vom verifica GOTO Activat sau dezactivat.Acest cod vine pus undeva dedesupt de #include <a_samp> NU VINE PUS INTRUN PUBLIC!(ADICA public OnGameModeInit() ) de exemplu.
Code: Select all
new pGoto[ MAX_PLAYERS] ;
Intreaga comanda:
Aceasta este comanda intreaga.O voi explica linie cu linie.
Code: Select all
CMD:goto(playerid, params[])
{
new string[256];
if ( sscanf( params, "u", params[ 0 ]) )return SendClientMessage(playerid, COLOR_ORANGE, "You can use /pgoto <on/off> to disable enable people to come to you"),SendUsage( playerid, "/goto <id>" );
if (pGoto[ params[ 0 ] ] == 0 && IsPlayerAdmin( playerid ) ) return format(string,sizeof( string ), "%s has the goto turned off.", PlayerName2( params[ 0 ])),SendClientMessage(playerid, COLOR_RED, string );
new Float:ParamX, Float:ParamY, Float:ParamZ, Float:ParamVX, Float:ParamVY, Float:ParamVZ;
if (IsPlayerInAnyVehicle( playerid ) )
{
SetCameraBehindPlayer( playerid );
GetVehiclePos( GetPlayerVehicleID( params[ 0 ] ), ParamVX, ParamVY, ParamVZ );
SetVehiclePos( GetPlayerVehicleID( playerid ), ParamVX+2, ParamVY+2, ParamVZ );
LinkVehicleToInterior( GetPlayerVehicleID( playerid ), GetPlayerInterior( params[ 0 ] ));
}
else
{
SetCameraBehindPlayer( playerid );
GetPlayerPos( params[ 0 ], ParamX, ParamY, ParamZ );
SetPlayerPos( playerid, ParamX+2, ParamY+2, ParamZ );
SetPlayerInterior( playerid, GetPlayerInterior( params[ 0 ] ));
}
FormMessageForAllEx(playerid,COLOR_GREEN, "%s went to %s!",PlayerName2( playerid ), PlayerName2( params[ 0 ] ));
FormMessage( params[ 0 ], COLOR_GREEN, "%s came to you!",PlayerName2( playerid ));
FormMessage( playerid, COLOR_GREEN, "You went to %s!",PlayerName2( params[ 0 ] ));
return 1;
}
Codul de mai jos este sa verifice automat daca playerul este conectat si daca a scris bine numele lui sau nu. "u" inseamna ID Playerului sau Numele lui si daca nu scrie bine va da mesajul: USAGE: /goto <id>.
params[ 0 ] se va folosi daca vrem sa luam numele la player, sau sai facem ceva la cel care sa teleportat.
Code: Select all
if ( sscanf( params, "u", params[ 0 ]) )return SendClientMessage(playerid, COLOR_ORANGE, "You can use /pgoto <on/off> to disable enable people to come to you"),SendUsage( playerid, "/goto <id>" );
Codul de mai jos va verifica daca playerul are /pgoto on sau off, daca are OFF nu te vei puteas teleporta la el doar daca esti logat ca admin de RCON.
Code: Select all
f (pGoto[ params[ 0 ] ] == 0 && IsPlayerAdmin( playerid ) ) return format(string,sizeof( string ), "%s has the goto turned off.", PlayerName2( params[ 0 ])),SendClientMessage(playerid, COLOR_RED, string );
De aceea am pus && IsPlayerAdmin( playerid ) pentru ca && verifica daca are cel la care vrei sa te teleportezi are /pgoto off SI verifica si daca esti admin.Si daca esti admin va sari peste acel "check" si te va teleporta instat

Code: Select all
if (pGoto[ params[ 0 ] ] == 0 && IsPlayerAdmin( playerid ) )
Cu acestea vom lua coordonatele lui player si ma voi teleporta la el!
Code: Select all
new Float:ParamX, Float:ParamY, Float:ParamZ, Float:ParamVX, Float:ParamVY, Float:ParamVZ;
Codul de mai jos verifica daca sunt intr-un vehicul eu ca sa ma duc cu tot cu vehicol la player.
Code: Select all
if (IsPlayerInAnyVehicle( playerid ) )
{
SetCameraBehindPlayer( playerid );
GetVehiclePos( GetPlayerVehicleID( params[ 0 ] ), ParamVX, ParamVY, ParamVZ );
SetVehiclePos( GetPlayerVehicleID( playerid ), ParamVX+2, ParamVY+2, ParamVZ );
LinkVehicleToInterior( GetPlayerVehicleID( playerid ), GetPlayerInterior( params[ 0 ] ));
}
else
{
SetCameraBehindPlayer( playerid );
GetPlayerPos( params[ 0 ], ParamX, ParamY, ParamZ );
SetPlayerPos( playerid, ParamX+2, ParamY+2, ParamZ );
SetPlayerInterior( playerid, GetPlayerInterior( params[ 0 ] ));
}
Dupa cum vedeti am pus un if (IsPlayerInAnyVehicle( playerid ) ) Acesta verifica daca este in masina iar acel }else{
verifica daca este in picioare, adica e opusul la if (IsPlayerInAnyVehicle( playerid ) )
Cu codurile de mai jos vom trimite mesaj la cel ce a fost teleportat, la cel la care s-a teleportat si la toti adminii RCON cu exceptia TA, ca sa nu vezi doua mesaje.
Code: Select all
FormMessageForAllEx(playerid,COLOR_GREEN, "%s went to %s!",PlayerName2( playerid ), PlayerName2( params[ 0 ] ));
FormMessage( params[ 0 ], COLOR_GREEN, "%s came to you!",PlayerName2( playerid ));
FormMessage( playerid, COLOR_GREEN, "You went to %s!",PlayerName2( params[ 0 ] ));
Codul de mai jos va trimite un mesaj catre toti adminii de pe server, DOAR CEI LOGATI CA RCON DACA VREI SA SCHIMBATI CU PROPRIUL VOSTRU SISTEM DE ADMIN SCHIMBAT IsPlayerAdmin( playerid ) cu ce aveti voi gen PlayerInfo[ playerid ][ Level ].
Code: Select all
FormMessageForAllEx(playerid,COLOR_GREEN, "%s went to %s!",PlayerName2( playerid ), PlayerName2( params[ 0 ] ));
Codul de mai jos va trimite un mesaj la cel la care te-ai teleportat, care il va instiinta ca te-ai teleportat la el.
Dupa cum vedeti nu este ( playerid, ci este ( params[ 0 ] cea ce vam expliat mai sus ca vom folosi params[ 0 ] pentru a trimite mesaje id care a fost insertat la /goto <id>.
Code: Select all
FormMessage( params[ 0 ], COLOR_GREEN, "%s came to you!",PlayerName2( playerid ));
Iar codul de mai jos pur si simply iti va da de stire ca te-ai teleportat la acel player...
Code: Select all
FormMessage( playerid, COLOR_GREEN, "You went to %s!",PlayerName2( params[ 0 ] ));
Sa nu uitam de comanda /pgoto.Comanda este mai jos si este explicata!
COMANDA:
Code: Select all
CMD:pgoto(playerid, params[])
{
if ( sscanf( params, "s", params[ 0 ]) )return SendUsage( playerid, "/pgoto <on/off> ");
if ( strcmp( params[ 0 ], "ON", true) == 0 )
{
if (pGoto[ playerid ] == 1)return SendError(playerid, "Goto already turned ON!");
pGoto[ playerid ] = 1;
SendClientMessage(playerid, COLOR_GREEN, "Goto turned ON, players can now come to you!");
}
else if ( strcmp( params[ 0 ], "OFF", true) == 0 )
{
if (pGoto[ playerid ] == 0)return SendError(playerid, "Goto already turned OFF!");
pGoto[ playerid ] = 0;
SendClientMessage(playerid, COLOR_GREEN, "Goto turned OFF, players cannot come to you anymore");
}
else SendUsage( playerid, "/pgoto <on/off> ");
return 1;
}
Deci dupa cum vedeti de data asta am folosit "s" nu "u".Deoarece vrem sa verificam daca a insertat un string adica un On Off si daca a insertat altceva inafara de On Off va primit mesajul "USAGE: /pgoto [on/off].
Nu vom folosi "u" deoarece nu avem de ce ....ce sa verificam? care player? Niciunu. :)Iar de data asta cu params[ 0 ] nu mai verificam daca player bla bla, ci sa verifiam daca a insertat ON sau OFF, explicatia este mai jos.
Code: Select all
if ( sscanf( params, "s", params[ 0 ]) )return SendUsage( playerid, "/pgoto <on/off> ");
Codul de mai jos va verifica daca a scris ON sau OFF, daca a scris ON va seta pGoto la 1, cea ce insemana ca va fi Activat ca sa lase playerii sa vina.Si daca scri OFF nu va lasa pe nimeni sa vina la tine!
Code: Select all
if ( strcmp( params[ 0 ], "ON", true) == 0 )
{
if (pGoto[ playerid ] == 1)return SendError(playerid, "Goto already turned ON!");
pGoto[ playerid ] = 1;
SendClientMessage(playerid, COLOR_GREEN, "Goto turned ON, players can now come to you!");
}
else if ( strcmp( params[ 0 ], "OFF", true) == 0 )
{
if (pGoto[ playerid ] == 0)return SendError(playerid, "Goto already turned OFF!");
pGoto[ playerid ] = 0;
SendClientMessage(playerid, COLOR_GREEN, "Goto turned OFF, players cannot come to you anymore");
}
Iar utima bucatica de cod de mai jos, va da "USAGE: /pgoto [ on/ off ]" deoarece a insertat altceva inafara de ON sau OFF!
Code: Select all
else SendUsage( playerid, "/pgoto <on/off> ");
Si am cam terminat, va rog sa-mi scuzati scrisul incorect dar am folosit o tastatura cu butoane groase si eu eram obisnuit pe plata gen de la laptop.Sper ca v-am ajutat!!!
Totul a fost facut de mine inafara de ZCMD si SSCANF au fost facute de ZeeX si Y_Less, comenzile au fost super usoare de facut, am facut si FormMessageForAllEx tot eu dar cu ideea pornita de la FormMessage al lui Y_Less in subiectul Code Optimizations, care ma ajutat enorm.
Dupa cum vedeti ZCMD este mult mai usor de folosit, decat DCMD sau STRTOK, variantele vechi.
Astept pareri si daca aveti erori, greseli raportati aici va rog!
Uitati aici alte tipuri de folosit a SSCANF si ZCMD, erori vor fi daca postati aceste comenzi in gamemodul vostru deoarece nu aveti definit P_DATA etc..