Automata Mi is ez?Egy rendszer, amelyet a nyelv alapból magába foglal. Ennek segítségével egyszeruen kezelhetjük a függvényeinket aszerint, hogy ez az állapotjelzo milyen értéket kap.
Alakja / MuködéseUgyan a Pawno-ban nem színezõdik kékre a szó, de ettõl függetlenül( mint már említettem ), a PAWN nyelv támogatja ezt a kulcsszót, ami pedig a
state. Az értékadás a
state szóval kezdõdik, ami után megadjuk az
automatánk nevét, majd egy \'
:\'( kettõspont ) után az
értékét( állapotát ). Nézzünk egy példát!
public OnGameModeInit( ) {
//A \'ServerState\' állapotjelzo értékét \'On\'-ra állítjuk
state ServerState: On;
return 1;
}
public OnGameModeExit( ) {
//A \'ServerState\' állapotjelzo értékét \'Off\'-ra állítjuk
state ServerState: Off;
return 1;
}
Ugyan a fenti példának nincs sok értelme, de ezzel csak a mûködését, általános alakját akartam bemutatni. Most jöjjön egy konkrétabb példa.
Bonyolultabb példaEbben a mini játékmódban leteszünk egy pickup-ot, amit ha felveszünk, és
az automatánk értéke On, akkor pénzt kapunk, ellenkezo esetben hibaüzenetet. Plusz, írtam hozzá egy RCON adminok számára elérhetõ parancsot, amivel ki/be kapcsolhatják a pénzgyûjtést( az automata értékét ).
#include < a_samp >
#include < sscanf2 >
#include < zcmd >
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xFF0000AA
#define COLOR_YELLOW 0xFFFF00AA
new iPickup;
main( ) {
state CashboxState: Off;
iPickup = CreatePickup( 1238, 1, 120.3, 12.1, 2.1 );
}
CMD:cashbox( playerid, params[ ] ) {
new iType;
if( !IsPlayerAdmin( playerid ) ) {
SendClientMessage( playerid, COLOR_RED, \"Nem vagy adminisztrátor!\" );
} else if( sscanf( params, \"i\", iType ) ) {
SendClientMessage( playerid, COLOR_RED, \"Használat: /cashbox < Állapot > | 0 = ki | 1 = be\" );
} else if( iType < 0 || iType > 1 ) {
SendClientMessage( playerid, COLOR_RED, \"Érvénytelen érték!\" );
} else {
if( !iType ) {
state CashboxState: Off;
SendClientMessage( playerid, COLOR_YELLOW, \"Kikapcsoltad a pénzgyûjtést!\" );
} else {
state CashboxState: On;
SendClientMessage( playerid, COLOR_GREEN, \"Bekapcsoltad a pénzgyûjtést!\" );
}
}
return 1;
}
public OnPlayerPickUpPickup( playerid, pickupid ) < CashboxState: Off > {
#pragma unused pickupid
return SendClientMessage( playerid, COLOR_RED, \"Sajnálom, de a pénzgyûjtés ki van kapcsolva!\" );
}
public OnPlayerPickUpPickup( playerid, pickupid ) < CashboxState: On > {
#pragma unused pickupid
GivePlayerMoney( playerid, random( 30000 ) );
SendClientMessage( playerid, COLOR_GREEN, \"Pénzt kaptál. Zsíííííííír.\" );
return 1;
}
#pragma unused iPickup
Ez csak egy példa a sok közül, hogy mi mindenre lehet felhasználni. Remélem tudtam valami újat mutatni.
Gamestar írt egy makrót, ami megkönnyítheti az állapotváltást:
#define ChangeState(%1,%2) state %1: %2
Példa: ChangeState(valami, off);