Imas vise varijabli nego specifikatora u cmd 🙄
Prevuci gore ili dole za pozicioniranje
Makenzi
Poslednja aktivnost
pre 7 godina
postova
86
Kreiranih tema
4
XP
240
Pridružio se
nov. 2018
Trenutna aktivnost
Izgleda da Makenzi trenutno ne radi ništa
• Shomy • wrote on December 5, 2018, 8:41 pm:
Aloe! Jel treba da upotrebljavam visu silu?!
Ma zajebavam se, nisi shvatio, kida 😄
Odgovorio na
Dec 05, 2018
PoÄetniÄke greÅ¡ke & Saveti za poÄetnike [ i neke "ozbiljne" "skriptere" ]
GTA San Andreas Multiplayer / Tutorijali
-= 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 )...!
rizla wrote on December 5, 2018, 8:37 pm:
e to me interesuje, gledam da smanjim maksimalno upotrebu tajmer sto je vise moguce. Hvala u svakom slucaju
Hvala tebi! :-*
Ne svidja nam se, mi bi tebe...
If you know what i mean... 😄 😛
If you know what i mean... 😄 😛
Izvol'te:
new g_LoginTimer;
public OnPlayerDisconnect(playerid, reason)
{
KillTimer(g_LoginTimer);
return 1;
}
forward Ucitano(playerid);
public Ucitano(playerid)
{
ClearChat(playerid, 25);
SendClientMessage(playerid, -1, "SERVER LOADED...");
if(fexist(UserPath(playerid)))
{
SetPlayerVirtualWorld(playerid, 0); SetPlayerInterior(playerid, 0);
InterpolateCameraPos(playerid, -996.689, 869.492, 41.923, -1265.562, 666.918, 42.151, 7000);
InterpolateCameraLookAt(playerid, -1112.462, 867.032, 36.464, -1252.443, 765.840, 35.994, 7000);
ClearChat(playerid, 25);
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
SPD(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,""BELA"LOGIN..",""BELA"Hello and welcome back to Insanity DeathMatch!\nYour account has been found in our database.\n\nHINT: Type your password in 60 seconds or you will get kicked.","Login","Exit");
Uneo_Pass = 1;
nekickaj = 0; OVO
g_LoginTimer = SetTimerEx("g_Kick", 30000, false, "d", playerid);
}
else
{
SetPlayerVirtualWorld(playerid, 0); SetPlayerInterior(playerid, 0);
InterpolateCameraPos(playerid,-996.689, 869.492, 41.923, -1265.562, 666.918, 42.151, 7000);
InterpolateCameraLookAt(playerid, -1112.462, 867.032, 36.464, -1252.443, 765.840, 35.994, 7000);
ClearChat(playerid, 25);
SPD(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"REGISTRATION..","Hello and welcome to Insanity DeathMatch SA-MP server!\nIn the blank spot bellow you should type your password.\n\nHINT: It shouldn`t be more than 24 characters or less than 6.","Register","Exit");
}
}
forward g_Kick(playerid);
public g_Kick(playerid)
{
SendClientMessage(playerid, -1, "You are kicked from the server because you didn't logged in on time!");
SetTimerEx("Kick", 465, false, "d", playerid); //Mora ovako ili mu nece pokazati poruku ^.
return 1;
}
//sada ovo dodas ako se uspesno loginao:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_LOGIN)
{
if(!response) return Kick(playerid);
if(response)
{
//Ako je logged in:
KillTimer(g_LoginTimer);
}
}
return 1;
}
rizla wrote on December 5, 2018, 8:09 pm:
koliko sam razumeo, da taj nacin ne moze posle nekog vremena da pozove funkciju? kao obican tajmer
Buraz, gettime() uzima neki int od nzm kojeg datuma, za svaki datum od npr 1990 ( lupam, ne znam taÄno ) ja na integet dodalo po 1 sekundu i sve tako do momenta kada pozoveÅ¡ f-ju...
U prevodu, ne može, ali možeš da koristiš y_timers ili PawnPlus
Daj celu funkciju gde mu pokazuješ dialog pa ću fixati.
Балша. wrote on December 5, 2018, 5:34 pm:
Vljd je tacno s tela pisem
// ovo nedje na vrh
new nekickaj;
//ovo nedje na kraj mos
Forward loginkick(playerid);
public loginkick(playerid);
{
if(nekickaj == 0)
{
Kick(playerid);
}
return 1;
}
//ovo kod toga dje ti se pojavljuje dijalog za login
nekickaj = 0;
SetTimerEx("loginkick", 30000, false, "i", playerid); //1000 = 1 sekund
//ovo kod tog sto se pojavi kad ukuca sifru
nekickaj = 1;
Imas dosta greškica, najviše pravopisnih...
public loginkick(playerid);u
public loginkick(playerid)di
else { return 1; }može i:
else return 1;
Odgovorio na
Dec 05, 2018
Kako koristiti "gettime()" kao tajmer?
GTA San Andreas Multiplayer / Tutorijali
gettime() funkcija kao tajmer!
Pozdrav svima,
danas ću vas nauÄiti kako da kreirate tajmer pomoću gettime() funkcije.
Ovde ću Vam pokazati nešto kao Anti Spam, ako ovo želite za komande ( anti cmd spam ) nikako to nemojte raditi ispod svake komande, no više o tome u sledećem tutorialu!
Koraci
1. Prvo kreirate pvar ( player variable ):new g_EngineSpam;2. Sada kada se igrac konektuje, refreshujte taj pvar na -1:
public OnPlayerConnect(playerid)
{
g_EngineSpam = -1;
return 1;
}3. Sada kreiramo komandu ( tj. samo onaj deo koji nam trenutno treba )
CMD:engine(playerid, params[])
{
if(gettime() < g_EngineSpam) return SendClientMessage(playerid, -1, "[Anti:Spam] Motor vozila mozete paliti na svake 3 sekunde!");
{
g_EngineSpam = gettime() + 3; // podesava pvar na 3 sekunde od trenutnog vremena.
//kod
}
}Prošli tutorial: KLIK
Sledeći tutorial: ÄŒeste greÅ¡ke poÄetnika. [ Uskoro... ]
3
Novi Član
Nivo 3
Iskustvo
40 / 100 XP
Ukupno XP: 240
60 XP do sledećeg nivoa
6
Dostignuća
240
Ukupno XP
0
Trenutni Niz
0
Najduži Niz
Sva Dostignuća
6 / 20 otključano
🎯
Početak
Početak
Napišite 10 postova na forumu
+25 XP
⚡
Aktivni Saradnik
Aktivni Saradnik
Napišite 50 postova na forumu
+50 XP
🏅
Klub Stotina
Klub Stotina
Napišite 100 postova na forumu
+100 XP
🏆
Legenda Foruma
Legenda Foruma
Napišite 500 postova na forumu
+250 XP
👥
Vođa Diskusija
Vođa Diskusija
Kreirajte 10 tema na forumu
+50 XP
🛡️
Uzoran Građanin
Uzoran Građanin
30 dana bez ikakvih upozorenja
+40 XP
🔰
Primerni Član
Primerni Član
90 dana bez ikakvih upozorenja
+100 XP
🚩
Čuvar Zajednice
Čuvar Zajednice
Pošaljite 5 korisnih prijava
+75 XP
📅
Nedeljni Ratnik
Nedeljni Ratnik
Prijavite se 7 dana zaredom
+35 XP
🔥
Posvećeni Fan
Posvećeni Fan
Prijavite se 30 dana zaredom
+150 XP
💬
Prvi Post
Prvi Post
Napišite svoj prvi post na forumu
+10 XP
📝
Pokretač Tema
Pokretač Tema
Kreirajte svoju prvu temu
+15 XP
❤️
Poštovalac
Poštovalac
Dajte svoj prvi lajk na post
+5 XP
👍
Prvo Priznanje
Prvo Priznanje
Primite svoj prvi lajk na post
+5 XP
👤
Identitet Otkriven
Identitet Otkriven
Popunite profil sa avatarom i biografijom
+20 XP
Nedavna XP Aktivnost
+100
Otključano: Primerni Član
pre 1 nedelju
+40
Otključano: Uzoran Građanin
pre 1 nedelju
+50
Otključano: Aktivni Saradnik
pre 1 nedelju
+25
Otključano: Početak
pre 1 nedelju
+15
Otključano: Pokretač Tema
pre 1 nedelju
+10
Otključano: Prvi Post
pre 1 nedelju