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

Započeo Makenzi, Decembar 05, 2018, 22:08:26 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

-= 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,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:
[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"| - 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:
[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 )...!
Poslednja Izmena: Decembar 05, 2018, 22:10:30 POSLE PODNE od Makenzi
Pomogao sam ti?
- Zahvali se!





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

Ovo treba staviti na sticky

Mnogo imaš ti još da jedeš kačamak.
skrr
Moj tutorijali: Bazilion indent warninga
WORK? : Smart Project 1.2 , Leskovacki Detmec, Rodjendanski  server


Penzionisani balkanski samp kripter



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?
Citat: Makenzi poslato Decembar 05, 2018, 22:08:26 POSLE PODNE
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]

Ponavljas ovo u svakoj komandi ?
g_Anti_CMD_Spam[playerid] = gettime() + 3;
Covjek napravio callback 'OnPlayerCommandPerformed', zar ti nije lakse da tu stavis ovo tvoje silno ponavljanje koda?


Citat: Makenzi poslato Decembar 05, 2018, 22:08:26 POSLE PODNE
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]
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
[code]
new buff[64];
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? ::) )

hahahah uterali ti xunder realno :D

"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 :D

Citat: // xunder poslato Decembar 25, 2018, 17:05:56 POSLE PODNE
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[playerid] = 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
[code]
new buff[64];
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
[pawn]new Prijavljeni;
// OnGameModeInit
Prijavljeni = 0;
// Kad se prijavi npr
Prijavljeni++;
// Kad se disconnecta i ak je prijavljen
if(Prijavljen[playerid] == 1)
{
   Prijavljeni--;
}
[/pawn]
i onda samo
[pawn] for(new i = 0; i < Prijavljeni; i++)
    {
      SendClientMessage(i,-1,"Test 123");
    }
[/pawn]
dao sam samo primjer i taj primjer sam testao (radi),nemam nista protiv :D
P.S. Edit sam post jer slucajno sam TAB stisnuo i postao pola teksta
Poslednja Izmena: Decembar 25, 2018, 22:27:34 POSLE PODNE od youngdeal
69


i onda samo provjeru kod timera stavit npr
[pawn]if(Prijavljeni == 0)
{
   print(" Timer za sve igrace nema funkcije trenutno, 0 prijavljenih igraca... ");
   return 1;
}[/pawn]
te moze se i sa GetPlayerPoolSize npr
[pawn]
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;
        
   }[/pawn]
samo sam primjer dao,i moze se na vise nacina :D
P.S. sry za dp
69

Nemate vi veze sa optimizacijom i ovim budalastinama, izuzetak Rade koga ne poznajem mnogo. Tjt..

Hmm procitaj komentare

[pawn]
new g_Anti_CMD_Spam[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
g_Anti_CMD_Spam[playerid] = -1;
return 1;
}

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
    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;
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[playerid])
    {
    SendClientMessage(playerid, -1, "[AC] Komande mozete koristiti svake 3 sekunde!");
        return 0;
    }
    g_Anti_CMD_Spam[playerid] = gettime() + 3;
    return 1;
}

[/pawn]

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
Poslednja Izmena: Decembar 26, 2018, 02:48:39 PRE PODNE od omcho