-= PoÄetniÄke greÅ¡ke & Saveti za poÄetnike. =-
Pozdrav svima,
u ovom tutorialu ću vas provesti kroz neke najÄešće greÅ¡ke koje na Äesto nailazim kada piÅ¡em u pdf-u "Razgovor u vezi PAWN - Skriptanja".
1. Brinete za bezopasne warninge, a one najbitnije propuštate misleći " ma to su samo warninzi, može da radi i sa njima, ne bi compile mode da nešto neće da radi... ".
Na primer, ne brinete za warning
warning 225: unreachable codeÅ¡to znaÄi da jedan deo skripte ispod nekog returna (primer) uopÅ¡te nije u funkciji i da tom na tom mestu ne treba return, a brinete se za warning
warning 217: loose indentationkoji je skroz bezopasan ( loose indentation - neki deo koda nije "uredan" tj. nije poravnat, npr 2 tab-a odvojen a ostalo su 1 tab odvojeni ).
2. Ponavljate istu funkciju kroz celu skriptu, a mogli ste samo na jednom mestu da uradite tu funckiju što automatski štedi vreme i optimizuje sam kod.
Nepravilno:
new g_Anti_CMD_Spam; //Sa ovim cemo proveravati komande tj. anti spam komandi...
public OnPlayerConnect(playerid)
{
g_Anti_CMD_Spam = -1;
return 1;
}
CMD:cmd1(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam) return SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
CMD:cmd2(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam) return SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
CMD:cmd3(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam) return SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
CMD:cmd4(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam) return SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
//...
CMD:cmd500(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam) return SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}Jace, brze, bolje:
new g_Anti_CMD_Spam; //Sa ovim cemo proveravati komande tj. anti spam komandi...
public OnPlayerConnect(playerid) //Poziva se kada se igrac konektuje na server.
{
g_Anti_CMD_Spam = -1;
return 1;
}
public OnPlayerCommandReceived(playerid, cmd[], params[], flags) //Pawn.CMD
{
if(gettime() < g_Anti_CMD_Spam)
{
SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
return 0;
}
return 1;
}
CMD:cmd1(playerid, params[])
{
g_Anti_CMD_Spam = gettime() + 3; //Potpuno isto kao gore samo smo proveru prebacili na callback koji se poziva svaki put kada igrac izvrsi komandu...
return 1;
}
CMD:cmd2(playerid, params[])
{
g_Anti_CMD_Spam = gettime() + 3; //Potpuno isto kao gore samo smo proveru prebacili na callback koji se poziva svaki put kada igrac izvrsi komandu...
return 1;
}
CMD:cmd3(playerid, params[])
{
g_Anti_CMD_Spam = gettime() + 3; //Potpuno isto kao gore samo smo proveru prebacili na callback koji se poziva svaki put kada igrac izvrsi komandu...
return 1;
}
CMD:cmd4(playerid, params[])
{
g_Anti_CMD_Spam = gettime() + 3; //Potpuno isto kao gore samo smo proveru prebacili na callback koji se poziva svaki put kada igrac izvrsi komandu...
return 1;
}
//...
CMD:cmd500(playerid, params[])
{
g_Anti_CMD_Spam = gettime() + 3; //Potpuno isto kao gore samo smo proveru prebacili na callback koji se poziva svaki put kada igrac izvrsi komandu...
return 1;
}Ovo nije korisno samo u ovom sluÄaju, na primer neprofesionalni skripter Xunder proverava da li je igrac ulogovan na svakoj cmd a mogao je jednostavno staviti pod isti ovaj callback... ( razumem da zelite neke cmd za koje ne treba provera, zato postoji cmd[] da proverite koja se cmd izvrsava ako je potrebno u callbacku.
3. RaÄunaj!, Stani! Ne beži, i ja obiÄno odma pobegnem Äim nanjuÅ¡im matematiku ali sada je drugaÄije!
ÄŒesta greÅ¡ka koju sam primetio je da kreirate 256 stringove za SendClientMessage, maksimalna dužina poruke za SendClientMessage je 144 tako da koristite veliÄinu stringa 145 kada formatirate poruku!
I nemojte za boju u SendClientMessage stavljati -1 pa onda posle u poruci boju, već tamo stavite Hex boju jer se i ta boja koja na poÄetku stavite u poruci raÄuna kao string i automatski imate manje karaktera na raspolaganju!
4. Nemojte koristiti arraye tamo gde ne morate, evo zašto:
new Float:pos;
GetPlayerPos(playerid, pos, pos, pos);Compile speed test ( na 10 arraya ): 2444,2448,2473
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y , z);Compile speed test ( na 10 Non-Arraya ): 972,975,963
ZnaÄi duplo je brže!
5. Nemojte koristiti for loop da prodjete kroz sve konektovane igraÄe nego koristite YSI y_iterate!
Ako pak ne želite da koristite y_iterate (foreach), ovo je najefikasniji loop da proÄ‘ete kroz sve konektovane igraÄe:
for (new slots = GetMaxPlayers(), i; i < slots; i++)
{
if (!IsPlayerConnected(i))
continue;
//kod koji se izvrÅ¡ava za konektovane igraÄe
}6. Ukoliko igraÄu želite poslati poruku i da ga kikujete, pozivanje kika morate odložiti ili igraÄ neće videti poruku, mislim da je to do delay-a izmeÄ‘u servera i klijenta ( ping + joÅ¡ neÅ¡to malo zbog skripte, ne znam kako da napiÅ¡em to ).
7. KoriÅ¡tenje streamer-a kada ne morate, na primer imate malo objekata ili pak podloge, ako nemate podlogu u CreateObjectu, velika je Å¡ansa da će vozila prolaziti kroz nju jer će ona biti uniÅ¡tena Äim igraÄ izaÄ‘e iz stream distance COD objekta.
8. Nemojte koristiti PAWNO ! Sada oÄekujem mnogo osuda, razumem da svako radi kako hoće, no ovo je samo savet i objasnit ću vam detaljno sve (liÄno iskustvo)...
Na primer, imate pawno koji je veoma spor program i nema tzv. "Auto-Complete" f-ju, sada ćete misliti da sam lenj da kucam ceo kod? Ne, VI ste lenji...
U PAWNO je logiÄno da koristite skraćenice tipa SCM i SCMTA jer morate sve da piÅ¡ete dok na primer u Sublime Text 2/3 editoru ukucate SCM i automatski će Vam se pojaviti SendClientMessage i samo stisnete enter i eto, cela f-ja...
Zašto to?
Korištenje skraćenica za boje, skraćenice tipa SCM/SCMTA/SPD i tako dalje znatno usporavaju vreme compile-a dok u ST2/3 nema tih skraćenica a isto dobijete...
9. Ovo se suprostavlja svemu ovome što sam pisao jer ovo će jako malo "usporiti" ( ispravite me ako grešim ) vreme kompajla moda, treba da koristite macroe tipa
#define ERROR(%0,%1) SCMF(%0, 0xFF0000FF, "ERROR | {FFFFFF}"%1)ZaÅ¡to? Postoji mnogo razloga, prvi je da je brže nego da formatirate celu poruku ispoÄetka, drugo ne morate non-stop da piÅ¡ete iste boje, i treće Å¡to lako možete editovati PREFIX iz npr "BOJA"[MOD:RP] Poruka u "BOJA"| "BOJA"MOD:RP "BOJA"| - Poruka
10. Koristite enum-e za definisanje dialoga.
Ne znam da li je ovo brže, predpostavljam da jeste ( ne mora da znaÄi ), ali mnogo je olakÅ¡avajuće, vi u jedan enum možete spakovati sve dialoge koje imate u modu a ne za svaki dialog da imate poseban BROJ npr #define DIALOG (356)...
Primer:
enum
{
DIALOG_REGISTER,
DIALOG_LOGIN
//...
};* Ova lista nije poreÄ‘ana po redu ( od najÄešćih ka onim retkim i sliÄno tome! ).
* Ukoliko ste uoÄili greÅ¡ku, ispravite mi ili pak poÅ¡aljite VaÅ¡e miÅ¡ljenje.
* Ova lista će blagovremeno biti updateovana od strane mene uz Vašu pomoć ( ili ako šta zanimljivo nađem )...!