Anti SpawnKill (15 Linija)

Započeo PabloK, Maj 08, 2020, 23:13:36 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Anti SpawnKill


Šta ćemo da naučimo u ovom tutorialu?
Naučićemo kako da napravimo efikasnu Anti SpawnKill zaštitu.


Da li ova zaštita čini igrača besmrtnim?
Ne, ovo je Anti SpawnKill a ne Anti SpawnDeath zaštita, ovo znači da drugi igrač ne može ubiti drugog igrača oružjem, igrač normalno može da umre ako padne sa velike visine i slično.


Kako ćemo to da uradimo?
Jednostavno, objašnjenje je na dnu :)
[pawn]new AntiSpawnKill[MAX_PLAYERS];

// Koliko dugo igrac ne sme da primi damage (milisekunde)
#define ANTI_SPAWN_KILL_TIME (3000)

public OnPlayerSpawn(playerid)
{
   // -> Dodaj vrednost ANTI_SPAWN_KILL_TIME na GetTickCount()
   AntiSpawnKill[playerid] = GetTickCount() + ANTI_SPAWN_KILL_TIME;
   return 1;
}

public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
   // Blokiraj damage ako SpawnKill vreme nije proslo
   if(hittype == BULLET_HIT_TYPE_PLAYER) {
      if(GetTickCount() < AntiSpawnKill[hitid]) return 0;
   }
   return 1;
}

//
// Šta smo tačno uradili?
//
// Definisali smo vreme u toku kog igrac ne moze biti ubijen (milisekunde)
// #define ANTI_SPAWN_KILL_TIME (3000)
//
// GetTickCount() uzima broj Tickova, znaci 1 tick po 1 milisekundi,
// ...sto znaci da ako dodamo 3000ms na GetTickCount() da ce igrac,
// ...tek za 3 sekunde moci da bude ranjen od strane drugog igraca.
// AntiSpawnKill[playerid] = GetTickCount() + ANTI_SPAWN_KILL_TIME;
//
// Proverili smo da li je meta igrač a ne vozilo i slično
// if(hittype == BULLET_HIT_TYPE_PLAYER)
//
// Proverili smo da li je trenutni GetTickCount() veći od zbira
// ...starog GetTickCount()-a i zbira ANTI_SPAWN_KILL_TIME
// Ako nije, blokiraj damage tako što ćemo poslati return 0;
//[/pawn]


Zašto ovako?
Kao što vidite, nema niti jedan tajmer niti postavljanje HP-a na cellmin, prosto igrač može da umre prirodno ali ne može biti ubijen što i jeste poenta ove zaštite na RolePlay serverima, uživajte!
Poslednja Izmena: Maj 08, 2020, 23:16:11 POSLE PODNE od PabloK
Dok ne prestanete da gledate front i zapravo malo pogledate svoj back-end od vas skriptera nikada neće biti niti bilo čega drugoga.


Citat: Galardo poslato Maj 09, 2020, 00:13:13 PRE PODNE
ne mogu ti dati vise od dvice.
Mnogo'e :D
Dok ne prestanete da gledate front i zapravo malo pogledate svoj back-end od vas skriptera nikada neće biti niti bilo čega drugoga.

mnogo korisno ako radi fino

volio bih da razumijem to sto pises i kako si dosao do toga, cini se komplikovano mnogo

Citat: Kova_Maps1 poslato Maj 10, 2020, 20:29:49 POSLE PODNE
mnogo korisno ako radi fino

volio bih da razumijem to sto pises i kako si dosao do toga, cini se komplikovano mnogo
citas sa razumijevanjem,a ne kao sto vecina uci napamet...

Citat: Kova_Maps1 poslato Maj 10, 2020, 20:29:49 POSLE PODNE
mnogo korisno ako radi fino

volio bih da razumijem to sto pises i kako si dosao do toga, cini se komplikovano mnogo

[pawn]GetTickCount();[/pawn]
Ta funkcija vraća vreme u milisekundama od onog trenutka kada je računar upaljen.

Znači, hajde da kažemo da si upalio računar pre 10 minuta, GetTickCount() bi vratio (10 * 60000 (minut u ms))

I sada, logično je da ako varijabli dodelimo GetTickCount() i onda posle recimo 5 sekundi pozovemo if uslov za GetTickCount() pod OnPlayerWeaonShot - on bi imao vrednost veću za 5000 nego što je imao tada a kao što znaš (valjda), varijabla čuva vrednosti, znači varijabla se ne menja sama od sebe.

A recimo, da smo pozvali taj if posle 2 sekunde, GetTickCount() bi vratio vrednost manju 1000ms nego što si dodelio varijabli jer u ovom slučaju smo dodali 3000 na prethodni GetTickCount:
[pawn]ntiSpawnKill[playerid] = GetTickCount() + ANTI_SPAWN_KILL_TIME; // Varijabla sada ima vrednost ( 15 (minuta) * 60000 (minut u ms) )[/pawn]

Najbolje je da sam isprobaš kako GetTickCount(); funkcionise tako sto ces uraditi ovo:
[pawn]printf("Vrednost je %dms", GetTickCount());[/pawn]

https://wiki.sa-mp.com/wiki/GetTickCount
Dok ne prestanete da gledate front i zapravo malo pogledate svoj back-end od vas skriptera nikada neće biti niti bilo čega drugoga.

Ja bih preporučio UNIX timestamp bolje, zato što:
https://wiki.sa-mp.com/wiki/GetTickCount
Ali ovako, u redu je i može pomoći mnogima jer danas skoro svi nažalost copy-pasteaju  :'(
Citat: CheezItFollow your heart and own style.
Citat: PottusThat is perfectly fine, I'm just pointing out where you made mistakes what does hearing "good job" get you? Absolutely nothing. You need to hear the problems otherwise you'll keep making the same mistakes :)

Citat: Shadow. poslato Maj 17, 2020, 17:03:11 POSLE PODNE
Ja bih preporučio UNIX timestamp bolje, zato što:
https://wiki.sa-mp.com/wiki/GetTickCount
Ali ovako, u redu je i može pomoći mnogima jer danas skoro svi nažalost copy-pasteaju  :'(
Brate, iz razloga sam stavio GetTickCount, gettime ce na 4.4 (mozda i na 4.9, ne drzi me za rec, nisam siguran) zaokruziti na 4 i onda je igrac automatski izgubio pola sekunde (ili sekundu) zbog toga

Postoji i tickcount funkcija koja broji vreme od startovanja servera, svejedno je meni jer koristim fixes i svoju razliku za GetTickCount tako da nemam problema :D

https://wiki.sa-mp.com/wiki/Tickcount

Drago mi je da neko cita tutoriale, bar to, hvala :D


Paaa, korisno pocetnicima
Balkan Moon v1.0 by Foxy

Owner // Scripter Balkan Moon

u Potpisu Foxy.

Ne pipaj lava Foxy, radi na BM-u :D :D :D
[4.7.2019] Respect For: Purda | Basovski | Mister Naithan | BICEL KO MI BUNTA | 7.9: Vasic[/b]

* Server [5.1.2019 Created]
* Scripter on Power Gaming
* Scripter on Night Life
* Scripter on Arena Gaming
* Scripter on duty (Balkan Moon)

[23.5.2k19] Messi u skriptanju hehe ;)
[7.8.2k19]OLD Minecraft Developer & Player (2016-2018)

#FOXYSCRIPT[/b]
MAPPER U POKUŠAJU :/[/b]

ODlican tutorijal, pomocice ce Skripterima koji oce da otvor svoj RP server  :)