Zaključano

Početničke greške & Saveti za početnike [ i neke "ozbiljne" "skriptere" ]

Započeo Makenzi
pre 7 godina
2,053
pregleda
10
postova
Ova tema je zaključana. Samo moderatori i administratori mogu odgovarati.
Makenzi
Hustler
pre 7 godina
-= 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 indentation

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:
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 )...!
Purda121
OG Legend
pre 7 godina
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 😛
Nikola-.-
Kingpin
pre 7 godina
Ovo treba staviti na sticky
Roby Maper
OG Legend
pre 7 godina
Lepo objasnjeno pohvale
Rax_King
Godfather
pre 7 godina
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?
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:
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? 🙄 )
DeitY
Shot Caller
pre 7 godina
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 😄
James_SmithXDl
OG Legend
pre 7 godina
// 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 ?
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? 🙄 )
tooo + tacnije GetPlayerPoolSize() se ne mora ni koristit mislim jeste posluzna ali se i koristi isplayerconnected jer izbacuje 0 iako ima konektovan igrac 1 ( a i iako nema) "The highest playerid currently in use on the server or 0 if there are no connected players." , moze se napraviti npr po mom misljenju ovako
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
James_SmithXDl
OG Legend
pre 7 godina
i onda samo provjeru kod timera stavit npr
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
TerzaScripting
Underboss
pre 7 godina
Nemate vi veze sa optimizacijom i ovim budalastinama, izuzetak Rade koga ne poznajem mnogo. Tjt..
omcho
Enforcer
pre 7 godina
Hmm procitaj komentare

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