Eine schöne und nützliche Funktion, die ich gerne mal vorstellen wollte, weil ich extrem selten sehe, dass es Leute benutzen.
Ein kurzes Beispiel, wie man es verwenden kann:
Wie ihr es normal benutzt:
#include <a_samp>
forward change();
new Type = 0;
main()
{
SetTimer("change", 10000, 0);
}
public OnGameModeExit()
{
if(Type == 0)
{
printf("Mode ausgeschaltet");
}
if(Type == 1)
{
printf("Mode durch Timer ausgeschaltet");
}
return 1;
}
public change()
{
Type = 1;
GameModeExit();
}
Und wie man es mit Automata macht:
#include <a_samp>
forward change();
main()
{
state exitType:normal;
SetTimer("change", 10000, 0);
}
public OnGameModeExit() <Type:normal>
{
printf("Mode hat normal geendet");
}
public OnGameModeExit() <Type:gmx>
{
printf("Mode durch Timer geendet");
}
public change()
{
state Type:gmx;
GameModeExit();
}
Erklärung:
public OnGameModeExit() <Type:normal>
OnGameModeExit wird hier nur aufgerufen, wenn Type = normal ist.
Die Vorteile:
- Weniger Code
- Weniger globale Variablen
- Weniger Ressourcenverbrauch
Mit if Abfragen arbeiten. Dies ist natürlich auch möglich. Hier ein kleines Beispiel:
public OnPlayerCommandText(playerid, cmdtext[]) <Status:Eins>
{
state (!strcmp(cmdtext, "/status")) Status:Zwei;
}
public OnPlayerCommandText(playerid, cmdtext[]) <Status:Zwei>
{
state (!strcmp(cmdtext, "/status")) Status:Eins;
}
Erklärung:
state (Bedingung) NeuerStatus
In diesem Fall:
Wenn die Bedingung erfüllt ist (Man hat /status eingegeben) wird der Status gesetzt. Ein weiteres Beispiel:
state (x == 2) Status:Wahr;
In der normalen Form wäre dies
if (x == 2)
{
state Status:Wahr;
}
Verschiedene Staten:
public OnPlayerDisconnect(playerid)
{
= Wird immer ausgeführt
public OnPlayerDisconnect(playerid) <Status:Ein>
{
= Wird ausgeführt, wenn Status = EIn ist
public OnPlayerDisconnect(playerid) <Status:Ein,Status:Aus>
{
= Wird ausgeführt, wenn Status = Ein oder Status = Aus ist
entry()
entry() wird immer ausgeführt, wenn ein Status verändert wird. Also wenn man
stats x:An;
verwendet wird entry() aufgerufen. Hier ein Beispiel
main()
{
print("Das");
state State:xD;
print(" Breadfish");
}
entry() <State:xD>
{
print(" ist");
}
Es gibt folgendes aus: "Das ist Breadfish");
Playerstatus
Meines Wissens ist es nicht möglich einen Status für eine bestimmte playerid zu setzen. Außerdem darf der Status nicht mit einer Zahl beginnen.
Edit: Rechtschreibfehler ausgebessert