Započeo Makenzi
•5. Dec. 2018.• ZaključanoPoÄetniÄke greÅ¡ke & Saveti za poÄetnike [ i neke "ozbiljne" "skriptere" ]
2,115
pregleda
10
postova
Hustler
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosNovi Član
40 / 100 XP
Početnik(0)
86
Postovi:
4
Teme:
Pridružio se:Nov. 2018
5. Dec. 2018.
-= 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 )...!
OG Legend
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosAktivan Član
0 / 250 XP
Početnik(0)
3,314
Postovi:
92
Teme:
Pridružio se:Jun 2016
5. Dec. 2018.
Nisam sve citao jer to znam,ali sam popratio nesto hah 😛 Oke je sve tutorial 😛 samo sto ja malo drugacije radim unutar enuma dialoge,ali gotovo je isto , sve u svemu dobro je 😛
OG Legend
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosNovi Član
243 / 250 XP
Početnik(0)
3,533
Postovi:
129
Teme:
Pridružio se:Jul 2016
Godfather
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosAktivan Član
9 / 250 XP
Početnik(1)
2,044
Postovi:
55
Teme:
Pridružio se:Sep. 2013
25. Dec. 2018.
A ko si ti Bgt?
Poznajemo se? haha Niko nema niti ce imati SA modove posle mog dolaska pa i ne moze da prica o nacinu pisanja koda.
Svakako to sto pises tu glupost da sam neprofesionalan, djela govore a ne rijeci.
Ae da vidimo kako si ti profesionalan?
Ponavljas ovo u svakoj komandi ?
Covjek napravio callback 'OnPlayerCommandPerformed', zar ti nije lakse da tu stavis ovo tvoje silno ponavljanje koda?
Ajde kada se vec pravis tako pametan mogao bi napisati i brzu petlju. GetMaxPlayes ? stvarno haha
Da koriste enum za dialoge? To ti smatras greskom? Vau
Da koriste makro definicije kako bi ispisivali poruke?
Ne znas sta pricas druze
Ocigledno da nisi tako da ovo tvoje palamudjenje u prazno ne pije vodu a kamo li da se moze nazvati "GRESKAMA" pocetnickim
Nzm sta imas biti toliko ljubomoran na mene, i ja sam covjek kao ti jedino sto ti ovde palamudis po random forumu za skriptere a ja radim na najboljoj gaming zajednici na Balkanu. ( nije velika razlika ha? 🙄 )
Poznajemo se? haha Niko nema niti ce imati SA modove posle mog dolaska pa i ne moze da prica o nacinu pisanja koda.
Svakako to sto pises tu glupost da sam neprofesionalan, djela govore a ne rijeci.
Ae da vidimo kako si ti profesionalan?
Makenzi wrote on December 5, 2018, 9:08 pm:
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;
}Ponavljas ovo u svakoj komandi ?
g_Anti_CMD_Spam = gettime() + 3;Covjek napravio callback 'OnPlayerCommandPerformed', zar ti nije lakse da tu stavis ovo tvoje silno ponavljanje koda?
Makenzi wrote on December 5, 2018, 9:08 pm:
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:
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
}Ajde kada se vec pravis tako pametan mogao bi napisati i brzu petlju. GetMaxPlayes ? stvarno haha
for(new i = GetPlayerPoolSize(); i >= 0; i --) if (IsPlayerConnected(i)) {
//Kod
}Da koriste enum za dialoge? To ti smatras greskom? Vau
Da koriste makro definicije kako bi ispisivali poruke?
Ne znas sta pricas druze
#define ERROR(%0,%1) SCM(%0, boja, "Error "%1)
[/code
Jesi mozda testirao sta ce biti sa ovim divnim kodom ako uradimo ovo
new buff;
format(buff, sizeof buff, "Ovo je random error %d", 12);
ERROR(playerid, buff);Ocigledno da nisi tako da ovo tvoje palamudjenje u prazno ne pije vodu a kamo li da se moze nazvati "GRESKAMA" pocetnickim
Nzm sta imas biti toliko ljubomoran na mene, i ja sam covjek kao ti jedino sto ti ovde palamudis po random forumu za skriptere a ja radim na najboljoj gaming zajednici na Balkanu. ( nije velika razlika ha? 🙄 )
Shot Caller
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosNovi Član
40 / 100 XP
Početnik(0)
111
Postovi:
4
Teme:
Pridružio se:Avg. 2011
25. Dec. 2018.
hahahah uterali ti xunder realno 😄
"na primer neprofesionalni skripter Xunder" ljubomora too much? od svih ljudi na Bsamp bas xundera nasao, eh sta ti je zivot, bas se vidi ljubomora da te izjeda ono "decay" fazon 😄
"na primer neprofesionalni skripter Xunder" ljubomora too much? od svih ljudi na Bsamp bas xundera nasao, eh sta ti je zivot, bas se vidi ljubomora da te izjeda ono "decay" fazon 😄
OG Legend
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosAktivan Član
23 / 250 XP
Početnik(2)
3,748
Postovi:
73
Teme:
Pridružio se:Jan. 2012
25. Dec. 2018.
// xunder wrote on December 25, 2018, 4:05 pm:
A ko si ti Bgt?
Poznajemo se? haha Niko nema niti ce imati SA modove posle mog dolaska pa i ne moze da prica o nacinu pisanja koda.
Svakako to sto pises tu glupost da sam neprofesionalan, djela govore a ne rijeci.
Ae da vidimo kako si ti profesionalan?Ponavljas ovo u svakoj komandi ?
Covjek napravio callback 'OnPlayerCommandPerformed', zar ti nije lakse da tu stavis ovo tvoje silno ponavljanje koda?
Ajde kada se vec pravis tako pametan mogao bi napisati i brzu petlju. GetMaxPlayes ? stvarno haha
Da koriste enum za dialoge? To ti smatras greskom? Vau
Da koriste makro definicije kako bi ispisivali poruke?
Ne znas sta pricas druze
Ocigledno da nisi tako da ovo tvoje palamudjenje u prazno ne pije vodu a kamo li da se moze nazvati "GRESKAMA" pocetnickim
Nzm sta imas biti toliko ljubomoran na mene, i ja sam covjek kao ti jedino sto ti ovde palamudis po random forumu za skriptere a ja radim na najboljoj gaming zajednici na Balkanu. ( nije velika razlika ha? 🙄 )
Poznajemo se? haha Niko nema niti ce imati SA modove posle mog dolaska pa i ne moze da prica o nacinu pisanja koda.
Svakako to sto pises tu glupost da sam neprofesionalan, djela govore a ne rijeci.
Ae da vidimo kako si ti profesionalan?Ponavljas ovo u svakoj komandi ?
g_Anti_CMD_Spam = gettime() + 3;Covjek napravio callback 'OnPlayerCommandPerformed', zar ti nije lakse da tu stavis ovo tvoje silno ponavljanje koda?
Ajde kada se vec pravis tako pametan mogao bi napisati i brzu petlju. GetMaxPlayes ? stvarno haha
for(new i = GetPlayerPoolSize(); i >= 0; i --) if (IsPlayerConnected(i)) {
//Kod
}Da koriste enum za dialoge? To ti smatras greskom? Vau
Da koriste makro definicije kako bi ispisivali poruke?
Ne znas sta pricas druze
#define ERROR(%0,%1) SCM(%0, boja, "Error "%1)
[/code
Jesi mozda testirao sta ce biti sa ovim divnim kodom ako uradimo ovo
new buff;
format(buff, sizeof buff, "Ovo je random error %d", 12);
ERROR(playerid, buff);Ocigledno da nisi tako da ovo tvoje palamudjenje u prazno ne pije vodu a kamo li da se moze nazvati "GRESKAMA" pocetnickim
Nzm sta imas biti toliko ljubomoran na mene, i ja sam covjek kao ti jedino sto ti ovde palamudis po random forumu za skriptere a ja radim na najboljoj gaming zajednici na Balkanu. ( nije velika razlika ha? 🙄 )
new Prijavljeni;
// OnGameModeInit
Prijavljeni = 0;
// Kad se prijavi npr
Prijavljeni++;
// Kad se disconnecta i ak je prijavljen
if(Prijavljen == 1)
{
Prijavljeni--;
}
i onda samo
for(new i = 0; i < Prijavljeni; i++)
{
SendClientMessage(i,-1,"Test 123");
}
dao sam samo primjer i taj primjer sam testao (radi),nemam nista protiv 😄
P.S. Edit sam post jer slucajno sam TAB stisnuo i postao pola teksta
OG Legend
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosAktivan Član
23 / 250 XP
Početnik(2)
3,748
Postovi:
73
Teme:
Pridružio se:Jan. 2012
25. Dec. 2018.
i onda samo provjeru kod timera stavit npr
te moze se i sa GetPlayerPoolSize npr
samo sam primjer dao,i moze se na vise nacina 😄
P.S. sry za dp
if(Prijavljeni == 0)
{
print(" Timer za sve igrace nema funkcije trenutno, 0 prijavljenih igraca... ");
return 1;
}te moze se i sa GetPlayerPoolSize npr
forward ImaIgraca();
public ImaIgraca()
{
new koliko = GetPlayerPoolSize();
if(koliko==0&&!IsPlayerConnected(koliko))
{
return 0;
}
return 1;
}
if(!ImaIgraca())
{
print(" Timer za sve igrace nema funkcije trenutno, 0 online igraca... ");
return 1;
}
for(new i= 0 ,j = GetPlayerPoolSize(); i<= j; i++)
{
if(!Prijavljen) continue;
}samo sam primjer dao,i moze se na vise nacina 😄
P.S. sry za dp
Underboss
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosNovi Član
240 / 250 XP
Početnik(0)
731
Postovi:
29
Teme:
Pridružio se:Nov. 2016
25. Dec. 2018.
Nemate vi veze sa optimizacijom i ovim budalastinama, izuzetak Rade koga ne poznajem mnogo. Tjt..
Enforcer
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosNovi Član
40 / 100 XP
Početnik(0)
345
Postovi:
8
Teme:
Pridružio se:Okt. 2017
26. Dec. 2018.
Hmm procitaj komentare
A ovo za Xundera i SA nemate sta da pricate ni za njega ni za Deity-a mogu da vas (nas) uce oko ovog pawn-a, nijma server radi 24/7 sa 1000 igraca dok vecina balkana ne moze ni 500 da podrzi kako treba tako da ono nemas sta da kazes za SA 🙂
EDIT: Evo i on ti je ukazo na ovoj gresci taj isti lik kojeg zoves neprofesionalanim
new g_Anti_CMD_Spam;
public OnPlayerConnect(playerid)
{
g_Anti_CMD_Spam = -1;
return 1;
}
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
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;
return 1;
// Zasto na komandi da dodjes ti opet ces morati da dodajes na svakoj komandi zar nije lakse pod ovim callback-om?
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if(gettime() < g_Anti_CMD_Spam)
{
SendClientMessage(playerid, -1, " Komande mozete koristiti svake 3 sekunde!");
return 0;
}
g_Anti_CMD_Spam = gettime() + 3;
return 1;
}
A ovo za Xundera i SA nemate sta da pricate ni za njega ni za Deity-a mogu da vas (nas) uce oko ovog pawn-a, nijma server radi 24/7 sa 1000 igraca dok vecina balkana ne moze ni 500 da podrzi kako treba tako da ono nemas sta da kazes za SA 🙂
EDIT: Evo i on ti je ukazo na ovoj gresci taj isti lik kojeg zoves neprofesionalanim
Morate biti prijavljeni da biste odgovorili na ovu temu.
Prijava