Cooldown za komande

Započeo ShadowGod, Jul 17, 2019, 22:10:32 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Cooldown Tutorial By: Shadow

U ovome tutorijalu cu vam pokazati kako igracu mozete prikazati koliko sekundi mora cekati prije nego li moze ponovno koristiti neku komandu.
Za ovaj tutorial cu koristiti zcmd include, link mozete naci ispod:
> https://forum.sa-mp.com/showthread.php?t=91354

[pawn]#include < a_samp >
#include < zcmd >
new GlobalnaVarijabla[ MAX_PLAYERS ];[/pawn]

Prvo napravimo globalnu varijablu, ona ce nam trebati za kasnije
Ja sam je nazvao "GlobalnaVarijabla", vi ju mozete nazvati bilokako, npr. "HelpCooldown", svejedno je
Kada smo napravili globalnu varijablu, idemo napraviti komandu, ja cu je nazvati cooldownkomanda

[pawn]CMD:cooldownkomanda( playerid ) [/pawn]
Ovo gore je prvi set-up za komandu, definirate playerid, ( params[ ] ) < ne mora se u slucaju ako ne koristite sscanf ili slicno
[pawn]new now = gettime( ); [/pawn]
Napravimo lokalnu varijablu u kojoj uzmemo vrijeme kada je igrac koristio komandu, trebat ce za kasnije
[pawn]SendClientMessage( playerid, -1, "Komanda uspjesno iskoristena." ); [/pawn]
Posalje igracu koji je napisao /cooldownkomanda poruku "Komanda uspjesno iskoristena"
[pawn]GlobalnaVarijabla[ playerid ] = now; [/pawn]
Spremimo sekunde od kada je igrac iskoristio komandu u globalnu varijablu koju smo napravili maloprije
[pawn]if( now < ( GlobalnaVarijabla[ playerid ] + 20 ) ) [/pawn]
Uzme vrijeme od kada je igrac iskoristio komandu i provjerava da li je proslo dvadeset sekundi od tada
[pawn]SendClientMessageEx( playerid, -1, "Morate pricekati jos %d sekundi kako bi ste mogli koristiti ovu komandu!", ( GlobalnaVarijabla[ playerid ] + 20 ) - now ) [/pawn]
Provjera koliko je sekundi proslo od kako je igrac iskoristio komandu, i prikazuje koliko jos mora cekati
SendClientMessageEx automacki formira string za vas tako da ne morate koristiti format(...) sendclientmessage(...)
SendClientMessageEx mozete naci ispod:

[pawn]stock SendClientMessageEx( playerid, color, const text[], {Float, _}:... )
{
    static
        args,
        str[144];

   
    if( ( args = numargs( ) ) == 3)
    {
        SendClientMessage( playerid, color, text );
    }
    else
    {
        while (--args >= 3)
        {
            #emit LCTRL 5
            #emit LOAD.alt args
            #emit SHL.C.alt 2
            #emit ADD.C 12
            #emit ADD
            #emit LOAD.I
            #emit PUSH.pri
        }
        #emit PUSH.S text
        #emit PUSH.C 144
        #emit PUSH.C str
        #emit PUSH.S 8
        #emit SYSREQ.C format
        #emit LCTRL 5
        #emit SCTRL 4

        SendClientMessage( playerid, color, str );

        #emit RETN
    }
    return 1;
}[/pawn]
Cijela komanda bi trebala izgledati ovako:
[pawn]
#include < a_samp >
#include < zcmd >
new GlobalnaVarijabla[ MAX_PLAYERS ];
CMD:cooldownkomanda( playerid ){
   new now = gettime( );
   if( now < ( GlobalnaVarijabla[ playerid ] + 20 ) ) SendClientMessageEx( playerid, -1, "Morate pricekati jos %d sekundi kako bi ste mogli koristiti ovu komandu!", ( GlobalnaVarijabla[ playerid ] + 20 ) - now );
        else
        {
           SendClientMessage( playerid, -1, "Komanda uspjesno iskoristena." );
           GlobalnaVarijabla[ playerid ] = now;
        }
        return 1;
}
[/pawn]
Poslednja Izmena: Jul 17, 2019, 22:13:10 POSLE PODNE od ShadowGod

Ako vec radis neki cooldown na komande onda je logicnije da to bude za sve komande ne na jednoj komandi al haj nek ovo bude tut ako hoce da ne moze jednu komandu koristiti odmah.

Ovaj nacin koji si naveo:


if( now < ( GlobalnaVarijabla[ playerid ] + 20 ) ) SendClientMessageEx( playerid, -1, "Morate pricekati jos %d sekundi kako bi ste mogli koristiti ovu komandu!", ( GlobalnaVarijabla[ playerid ] + 20 ) - now );
        else
        {
        SendClientMessage( playerid, -1, "Komanda uspjesno iskoristena." );
        GlobalnaVarijabla[ playerid ] = now;
        }


je jednostavnije i pravilnije uraditi ovako barem po mom misljenju i iskustvu


if( now < ( GlobalnaVarijabla[ playerid ] + 20 ) )  return SendClientMessageEx( playerid, -1, "Morate pricekati jos %d sekundi kako bi ste mogli koristiti ovu komandu!", ( GlobalnaVarijabla[ playerid ] + 20 ) - now );
       
        SendClientMessage( playerid, -1, "Komanda uspjesno iskoristena." );
        GlobalnaVarijabla[ playerid ] = now;
       

Da ti budem iskren, ja inace nisam bas bio scripter na Balkanu, ja dolazim sa Engleskih servera.
Radio sam sa ljudima sto su IRL programeri i tako to. Oni recimo kada previse koristis "returns" ce te zvati "return whore", ili ti "return kurvo" ovaj dio je 'kompliciraniji' ali djeluje isto.
Primjer
[pawn]CMD:komanda( playerid )
{
     new varijabla = 5;
     if( varijabla == 5 ) SendClientMessage( playerid, -1, "Bok!" );
     else SendClientMessage( playerid, -1, "Ne bok!" ); <- Nece biti uopce pozvano vec ce samo return 1;
     return 1;
}[/pawn]
EDIT:
Al cuj, tko sam ja da sudim, dosao sam da naucim druge a i sebe :D
Poslednja Izmena: Jul 17, 2019, 22:31:54 POSLE PODNE od ShadowGod