OnPlayerKeyStateChange

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

if( newkeys == 1 || newkeys == 9 || newkeys == 33 && oldkeys != 1 || oldkeys != 9 || oldkeys != 33)//Нитро

{

new Car = GetPlayerVehicleID(playerid), Model = GetVehicleModel(Car);

switch(Model)

{

case 446,432,448,452,424,453,454,461,462,463,468,471,430,472,449,473,481,484,493,495,509,510,521,538,522,523,532,537,570,581,586,590,569,595,604,611: return 0;

}

AddVehicleComponent(GetPlayerVehicleID(playerid), 1010);

Uvod
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
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
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
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
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))

Detektovanje dugmadi u upotrebi
Definicija: // drzi(keys) ((newkeys & (%0)) == (%0))
 * 1) define HOLDING(%0) \

Drzi jedno dugme: if (HOLDING( KEY_FIRE ))

Drzi vise dugmadi: if (HOLDING( KEY_FIRE | KEY_CROUCH ))

Detektovanje prvog koriscenog dugmeta
Definicija: (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
 * 1) define PRESSED(%0) \

Jedno dugme: if (PRESSED( KEY_FIRE ))

Koriscenje vise dugmadi: if (PRESSED( KEY_FIRE | KEY_CROUCH ))

Primeri
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]; #define INFINITY (Float:0x7F800000) 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; }
 * 1) if !defined INFINITY
 * 1) endif

Objasnjenje
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