-= 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
[pawn]warning 225: unreachable code[/pawn]
Å¡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
[pawn]warning 217: loose indentation[/pawn]
koji 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:
[pawn]new g_Anti_CMD_Spam[MAX_PLAYERS]; //Sa ovim cemo proveravati komande tj. anti spam komandi...
public OnPlayerConnect(playerid)
{
g_Anti_CMD_Spam[playerid] = -1;
return 1;
}
CMD:cmd1(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam[playerid]) return SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam[playerid] = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
CMD:cmd2(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam[playerid]) return SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam[playerid] = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
CMD:cmd3(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam[playerid]) return SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam[playerid] = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
CMD:cmd4(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam[playerid]) return SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam[playerid] = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}
//...
CMD:cmd500(playerid, params[])
{
if(gettime() < g_Anti_CMD_Spam[playerid]) return SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
{
g_Anti_CMD_Spam[playerid] = gettime() + 3; //Povecava ukupno vreme (int) za 3 tj. 3 sekunde.
}
return 1;
}[/pawn]
Jace, brze, bolje:
[pawn]new g_Anti_CMD_Spam[MAX_PLAYERS]; //Sa ovim cemo proveravati komande tj. anti spam komandi...
public OnPlayerConnect(playerid) //Poziva se kada se igrac konektuje na server.
{
g_Anti_CMD_Spam[playerid] = -1;
return 1;
}
public OnPlayerCommandReceived(playerid, cmd[], params[], flags) //Pawn.CMD
{
if(gettime() < g_Anti_CMD_Spam[playerid])
{
SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
return 0;
}
return 1;
}
CMD:cmd1(playerid, params[])
{
g_Anti_CMD_Spam[playerid] = 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[playerid] = 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[playerid] = 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[playerid] = 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[playerid] = gettime() + 3; //Potpuno isto kao gore samo smo proveru prebacili na callback koji se poziva svaki put kada igrac izvrsi komandu...
return 1;
}[/pawn]
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:
[pawn]new Float:pos[3];
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);[/pawn]
Compile speed test ( na 10 arraya ):
2444,2448,2473[pawn]new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y , z);[/pawn]
Compile speed test ( na 10 Non-Arraya ):
972,975,963ZnaÄ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:
[pawn]for (new slots = GetMaxPlayers(), i; i < slots; i++)
{
if (!IsPlayerConnected(i))
continue;
//kod koji se izvrÅ¡ava za konektovane igraÄe
}[/pawn]
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
[pawn]#define ERROR(%0,%1) SCMF(%0, 0xFF0000FF, "ERROR | {FFFFFF}"%1)[/pawn]
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"| - Poruka10. 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:
[pawn]enum
{
DIALOG_REGISTER,
DIALOG_LOGIN
//...
};[/pawn]
* 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 )...!
Nisam sve citao jer to znam,ali sam popratio nesto hah :P Oke je sve tutorial :P samo sto ja malo drugacije radim unutar enuma dialoge,ali gotovo je isto , sve u svemu dobro je :P
Nemate vi veze sa optimizacijom i ovim budalastinama, izuzetak Rade koga ne poznajem mnogo. Tjt..