Balkan SA:MP

San Andreas Multiplayer - www.sa-mp.com => Tutorijali u vezi SA-MPa => Temu započeo: PabloK poslato Maj 08, 2020, 23:13:36 POSLE PODNE

Naslov: Anti SpawnKill (15 Linija)
Poruka od: PabloK poslato Maj 08, 2020, 23:13:36 POSLE PODNE
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!
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: Galardo poslato Maj 09, 2020, 00:13:13 PRE PODNE
ne mogu ti dati vise od dvice.
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: PabloK poslato Maj 09, 2020, 00:54:24 PRE PODNE
Citat: Galardo poslato Maj 09, 2020, 00:13:13 PRE PODNE
ne mogu ti dati vise od dvice.
Mnogo'e :D
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: 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
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: Galardo poslato Maj 10, 2020, 20:32:52 POSLE PODNE
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...
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: PabloK poslato Maj 10, 2020, 20:46:58 POSLE PODNE
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
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: 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  :'(
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: Makenzi Dosao Da Kaze Nes poslato Maj 23, 2020, 12:16:05 POSLE PODNE
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
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: m4trix poslato Jun 14, 2020, 17:00:15 POSLE PODNE
Dosta dobro,pomocice novajlijama ;)
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: [][] Foxy 2k19 [][] poslato Jun 14, 2020, 17:31:47 POSLE PODNE
Paaa, korisno pocetnicima
Naslov: Odg: Anti SpawnKill (15 Linija)
Poruka od: Simić poslato Jun 17, 2020, 15:48:54 POSLE PODNE
ODlican tutorijal, pomocice ce Skripterima koji oce da otvor svoj RP server  :)