FANDOM


OnPlayerKeyStateChange Edit

Ovaj callback se poziva kada igrac pritisne zadano dugme. Na primer gore, dole, levo desno.


Parametri Edit

(playerid, newkeys, oldkeys)
playerid - ID igraca koji pritisne dugme
newkeys - Koje dugme igrac trenutno koristi
oldkeys - Koje dugme je koristio ranije
Return
1 - Omogucava da se dalje koristi u skripti
0 - Callback se nece pozivati dalje u skripti
Ovaj callback se uvek prvi odaziva, tako da ce stavljanje na 0 isti skloniti iz filterscripte.

Uvod Edit

Ovaj callback se uvek poziva kada igrac pritisne i pusti jedno dugme. Takodje registruje kombinacije dugmadi. Na primer bunny hop kombinacija space i key jump.

Kako ne treba proveravati dugmad u skripti Edit

Za primer uzimamo 'Fire button'

if (newkeys == KEY_FIRE)

Ovo ce biti pravilno pri testiranju IG ali nece biti pravilno ako testirate njegovu korisnost. POkusajte pritisnuti Crouch(cucanje) i ovo dugme u isto vreme. Vas code (skripta) ce prestati sa radom. Zato sto newkeys vise nije isti kao KEY_FIRE, on je sada isti kao if KEY_FIRE kombinovan sa KEY_CROUCH.

Kako pravilno ubaciti Newkey Edit

Ovo je primer pravilnog koristenja dugmadi odozgo:

if (newkeys & KEY_FIRE)

Sada nam ovo & oznacava da se Ovo dugme moze koristiti u kombinaciji sa drugim i tako cemo povecati funkcijonalnost istog.

Kako proveriti koje dugme je pritisnuto Edit

Ovde nastupa oldkeys

if ((newkeys & KEY_FIRE) && !(oldkeys & KEY_FIRE))

Dakle ovaj kod ce nam pokazati da ce se nesto sto smo stavili odazvati nasumicno odnosno po jednom pritisku na dugme.

Kako proveriti koje dugme je otpusteno Edit

Ako zelimo da proverimo kombinaciju ona dva dugmeta a da je pritom funkcija izvrsavanja ostala ista prilikom otpustanja dugmeta koristimo sledeci kod:

if ((newkeys & KEY_FIRE) && (newkeys & KEY_CROUCH))

Jednostavnije Edit

Detektovanje dugmadi u upotrebi Edit

Definicija:

// drzi(keys)
#define HOLDING(%0) \
	((newkeys & (%0)) == (%0))

Drzi jedno dugme:

if (HOLDING( KEY_FIRE ))

Drzi vise dugmadi:

if (HOLDING( KEY_FIRE | KEY_CROUCH ))

Detektovanje prvog koriscenog dugmeta Edit

Definicija:

#define PRESSED(%0) \
	(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))

Jedno dugme:

if (PRESSED( KEY_FIRE ))

Koriscenje vise dugmadi:

if (PRESSED( KEY_FIRE | KEY_CROUCH ))

Primeri Edit

Kacenje objekta na igraca prilikom koriscenja dugmeta

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	if (PRESSED(KEY_FIRE))
	{
		if (IsPlayerInAnyVehicle(playerid))
		{
			AddVehicleComponent(GetPlayerVehicleID(playerid), 1010);
		}
	}
	return 1;
}

Veliki skok

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	if (PRESSED(KEY_JUMP))
	{
		new
			Float:x,
			Float:y,
			Float:z;
		GetPlayerPos(playerid, x, y, z);
		SetPlayerPos(playerid, x, y, z + 10.0);
	}
	return 1;
}

God Mode koriscenjem dugmeta

new
	Float:gPlayerHealth[MAX_PLAYERS];
 
#if !defined INFINITY
	#define INFINITY (Float:0x7F800000)
#endif
 
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	if (PRESSED(KEY_ACTION))
	{
		// They just pressed the action key, save their
		// old health for restoration.
		GetPlayerHealth(playerid, gPlayerHealth[playerid]);
		SetPlayerHealth(playerid, INFINITY);
	}
	else if (RELEASED(KEY_ACTION))
	{
		// They just let go of action - restore
		// their old health again.
		SetPlayerHealth(playerid, gPlayerHealth[playerid]);
	}
	return 1;
}

Objasnjenje Edit

Razlog zasto ne treba da koristite za u ovom slucaju KEY_FIRE == vec & je to da ce se njegov kod ignorisati u kombinaciji sa drugim. Binarni kod od KEY_SPRINT JE:

0b00001000

A od KEY_JUMP je:

0b00100000

Ako samo koristimo & i OnPlayerKeyStateChange za onoga ko koristi dugme dobicemo ispravan kod:

newkeys = 0b00100000
wanted  = 0b00101000
ANDed   = 0b00100000

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.