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!
ne mogu ti dati vise od dvice.
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
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: 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
Dosta dobro,pomocice novajlijama ;)
Paaa, korisno pocetnicima
ODlican tutorijal, pomocice ce Skripterima koji oce da otvor svoj RP server :)