[Tutorial] Kako dodati cooldown kod komandi?

Započeo Đ J Ø ₥ Ⱡ ₳, Mart 01, 2025, 15:03:35 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Kako dodati cooldown na neku komandu? (Na primer: /ad)

- Na primer, zelimo da dodamo cooldown na komandu /kupiarmor, sa cime ogranicavamo igracu koriscenje komande na svakih 15 sekundi.

1. Moramo prikljuciti include koji se zove "zcmd" (Potraziti detaljan tutorijal na internetu).

#include <zcmd>

2. Zatim moramo napraviti komandu:

CMD:kupiarmor(playerid, params[]) // kreiramo komandu /kupiarmor
{
	new Float:sadasnjiArmor; // kreiramo varijablu koja ce sadrzati armour naseg igraca
	GetPlayerArmour(playerid, sadasnjiArmor); // uzimamo armour i stavljamo u varijablu

	if(sadasnjiArmor >= 99.0)
		return SendClientMessage(playerid, -1, "Vec imate pun armour."); // proveravamo da li igrac ima pun pancir

	SetPlayerArmour(playerid, sadasnjiArmor + 50.0); // postavljamo igracu armor na +50

	SendClientMessage(playerid, -1, "Uspesno ste kupili armor! +50.0");
	SendClientMessage(playerid, -1, "Sledecu kupovinu mozete izvrsiti nakon 15 sekundi.");

	return true;
}
Imamo sjajnu komandu, ali nam fali cooldown (osim poruke).
To cemo uraditi tako sto cemo dodati varijablu za igrace iznad komande:

new coolDown[MAX_PLAYERS];

Zatim implementirati (staviti/primeniti) cooldown funkciju u komandu:

CMD:kupiarmor(playerid, params[]) // kreiramo komandu /kupiarmor
{
	if(gettime() - coolDown[playerid] < 15)
		return SendClientMessage(playerid, -1, "Svakih 15 sekundi mozete koristiti ovu komandu!"); // proveravamo da li je proslo 15 sekundi od zadnjeg koriscenja komande

	new Float:sadasnjiArmor; // kreiramo varijablu koja ce sadrzati armour naseg igraca
	GetPlayerArmour(playerid, sadasnjiArmor); // uzimamo armour i stavljamo u varijablu

	if(sadasnjiArmor >= 99.0)
		return SendClientMessage(playerid, -1, "Vec imate pun armour."); // proveravamo da li igrac ima pun pancir

	SetPlayerArmour(playerid, sadasnjiArmor + 50.0); // postavljamo igracu armor na +50

	SendClientMessage(playerid, -1, "Uspesno ste kupili armor! +50.0");
	SendClientMessage(playerid, -1, "Sledecu kupovinu mozete izvrsiti nakon 15 sekundi.");

	coolDown[playerid] = gettime(); // postavljamo trenutno vreme na varijablu

	return true;
}
Nasa komanda je sada gotova!
Sada igrac ne moze da kupuje armour na svakih 5 sekundi ili kada on hoce, vec na svakih 15 sekundi!

Nadam se da ste nesto naucili iz ovog tutorijala.
first tutorial made by Djomla.
Poslednja Izmena: Mart 01, 2025, 15:13:56 POSLE PODNE od 𓆩đɉꝋᵯłⱥ𓆪

Lepo, cestitam na trudu i vremenu koje si proveo da napises ovaj tutorial, ali imam par zamerki. Nemoj da me shvatis pogresno, vec prijateljski. Znam da ti je prvi tutorial i to vrlo postujem.

  • Nije bas narocito jasan tutorial, trebalo je da citam sve kako bih dosao do onoga sto trazim
  • Fali objasnjenja vise, sta koji deo koda izvrsava jer korostis posebnu logiku za cooldown

Sta sam uradio/poboljsao:
  • Promenio sam ime varijable za sadasnji armor. Uvek je bolje engleske nazive koristiti za te stvarcice.
  • Poboljasnja struktura koda, jasniji komentari.
  • Dodao sam logiku provere armora, dodatnu, da se armor ne moze povecati iznad 99.0.

Objasnjenje cooldowna:
Kada igrac koristi komandu /kupiarmor, trenutni timestamp se cuva u promenljivoj (u tvom slucaju, armorCooldown[playerid]). Ova promenljiva se koristi za pracenje kada je igrac poslednji put koristio komandu.

Kada igrac pokusa da ponovo koristi komandu, sistem proverava razliku izmedju trenutnog vremena (dobijenog pomocu gettime()) i vremena kada je poslednji put koriscena komanda (tj. armorCooldown[playerId]).

Ako je razlika manja od definisanog cooldown-a (15 sekundi), igracu se salje poruka da mora sacekati pre nego sto ponovo koristi komandu.

Ako je proslo dovoljno vremena (15 sekundi), igrac moze koristiti komandu, a trenutni timestamp se ponovo postavlja na armorCooldown[playerid], cime se resetuje cooldown.

Kako to izgleda u kodu:
// Proveravamo cooldown
    if (gettime() - armorCooldown[playerid] < 15)
    {
        new message[55]; // Deklaracija niza za poruku
        new remainingTime = 15 - (gettime() - armorCooldown[playerid]); // Izracunavamo preostalo vreme
        format(message, sizeof(message), "Sledecu kupovinu mozete izvrsiti za %d sekundi.", remainingTime); // Formiramo poruku
        return SendClientMessage(playerid, -1, message); // Saljemo poruku igracu
    }
  • gettime(): Ova funkcija vraca trenutni Unix Timestamp
  • armorCooldown[playerid]: Ovo je vreme (Timestamp) kada je igrac poslednji put koristio komandu.
  • gettime() - armorCooldown[playerId] < 15: Ova provera utvrdjuje da li je proslo manje od 15 sekundi od poslednjeg koriscenja komande.
  • remainingTime: Ako je proslo manje od 15 sekundi, izracunava se preostalo vreme do sledece upotrebe komande i salje se poruka igracu.

Moj nacin kodiranja ove komande i sistema:
CMD:kupiarmor(playerid, params[]) // Kreiramo komandu /kupiArmor
{
    // Proveravamo cooldown
    if (gettime() - armorCooldown[playerid] < 15)
    {
        new message[55]; // Deklaracija niza za poruku
        new remainingTime = 15 - (gettime() - armorCooldown[playerid]); // Izracunavamo preostalo vreme
        format(message, sizeof(message), "Sledecu kupovinu mozete izvrsiti za %d sekundi.", remainingTime); // Formiramo poruku
        return SendClientMessage(playerid, -1, message); // Saljemo poruku igracu
    }

    new Float:currentArmor; // Varijabla koja sadrzi trenutni armor igraca
    GetPlayerArmour(playerid, currentArmor); // Uzimamo trenutni armor i smestamo ga u varijablu

    // Proveravamo da li igrac vec ima pun armor
    if (currentArmor >= 99.0) return SendClientMessage(playerid, -1, "Vec imate pun armor."); // Poruka za pun armor

    // Povecavamo armor i osiguravamo da ne predje maksimalnu vrednost
    currentArmor += 50.0; // Povecavamo trenutni armor za 50
    if (currentArmor > 99.0) currentArmor = 99.0; // Postavljamo na maksimalnu vrednost

    SetPlayerArmour(playerid, currentArmor); // Postavljamo igracu novi armor

    // Slanje poruka igracu
    SendClientMessage(playerid, -1, "Uspesno ste kupili armor! +50.0"); // Potvrda o kupovini
    SendClientMessage(playerid, -1, "Sledecu kupovinu mozete izvrsiti nakon 15 sekundi."); // Informacija o cooldown-u

    armorCooldown[playerid] = gettime(); // Postavljamo trenutno vreme na varijablu cooldown

    return 1; // Izadji ovde
}

Nadam se da si razumeo o cemu govorim i opet kazem nemoj da me shvatis pogresno da sad ja odmah kritikujem, ovo, ono... Ovako opsirno ti niko ne bi napisao i ukazao na sitne propuste. Ja zaista cenim i postujem to sto si odvojio vreme i napravio tutorial.

Puno ti hvala sto cenis moje vreme i trud za tutorijal, prvi mi je pa sad tako je kako je. Hvala ti mnogo na kritikama, ja to obozavam jer uvek mogu da se poboljsam : D

Citat: 𓆩đɉꝋᵯłⱥ𓆪 poslato Mart 01, 2025, 16:25:15 POSLE PODNEPuno ti hvala sto cenis moje vreme i trud za tutorijal, prvi mi je pa sad tako je kako je. Hvala ti mnogo na kritikama, ja to obozavam jer uvek mogu da se poboljsam : D

Lepo. Molim i drugi put. Drago mi je što si razuman čovek i nisi odmah "aaa, džaaa, buuu, odmah me kritikuje"...

Smatrao sam da si okej i da ćeš prihvatiti to što govorim, zato sam i napisao. Bilo kome da pišem, ljudi treba da shvate da ja nemam ništa protiv njih, meni je drago kad neko napiše neki tutorial, objašnjenje, pomogne nekome. Tako i ja želim svojim iskustvom ili nekom konstruktivnom kritikom, komentarom, bilo čime pomoći tom nekome. Jer da ne komentarišemo, čemu bi služio ovaj forum. Treba da delimo svoja mišljenja na lep i civilizovan način, prijateljski.  8)

Citat: Dragi poslato Mart 01, 2025, 16:29:40 POSLE PODNELepo. Molim i drugi put. Drago mi je što si razuman čovek i nisi odmah "aaa, džaaa, buuu, odmah me kritikuje"...

Smatrao sam da si okej i da ćeš prihvatiti to što govorim, zato sam i napisao. Bilo kome da pišem, ljudi treba da shvate da ja nemam ništa protiv njih, meni je drago kad neko napiše neki tutorial, objašnjenje, pomogne nekome. Tako i ja želim svojim iskustvom ili nekom konstruktivnom kritikom, komentarom, bilo čime pomoći tom nekome. Jer da ne komentarišemo, čemu bi služio ovaj forum. Treba da delimo svoja mišljenja na lep i civilizovan način, prijateljski.  8)
naravno, uvek ali bas uvek treba biti otvorenog uma : D

Not bad, posvetite se vise detaljima.
HTML / CSS / Javascript / Inspect : Entry Masterclass.
ReactJS / Tailwind CSS / PWA / Axios / SCSS / Redux, ViteJS : Entry Masterclass.
C / C++ / C# / C-objective - kroz Pawn Lang : Entry Masterclass
Grupisano Pravljenje Objekata : Filterscript.


Sta je to web development?
To je nesto ono kao, kako bih to rekao, izgubis volju za zivotom i zelis da se ubijes, ali to je okej.
Onda jednostavno shvatis da si bio glup i resis problem, das sam sebi lajk,
skuvas NES 3u1 i pripremis se za sledeci projekat.