Guten Morgen liebe Breadfishler,
dieses Tutorial ist eigentlich nur aus Langweile entstanden, aber ich hoffe trotzdem, dass ich einigen von euch noch etwas zeigen kann.
Das was ich hier nutze, gilt eigentlich nur als Code Optimierung und man muss es nicht zwingend nutzen, aber dennoch zeige ich es euch, einfach damit ihr sowas mal gesehen habt und grob wisst was es macht
Allgemeines:
Also state ist eigentlich eine Funktion, mit der man gleiche Funktionen mehrmals definieren kann, um sie in verschiedenen Situationen zu nutzen.
Machen wir mal eine Gegenüberstellung, normal nutzt man ja Variablen, sprich das sähe so aus:
//Alter Code
#include <a_samp>
new var = 0; //Hier deklarieren wir die neue Variable
main()
{
var = 1; //Hier setzen wir den Wert auf 1
SetTimer("Test", 1000*5, 0);
}
forward Test();
public Test()
{
switch(var)
{
case 0: print("Falsch !"); //Da der Wert 1 ist und nicht 0 wird das nicht aufgerufen
case 1: print("Richtig !"); //Das hier wird aufgerufen, da der Wert 1 ist
}
}
Das würde jetzt nach 5 Sekunden "Richtig !" printen
Mit unserem state Statement, würde es so aussehen:
//Neuer Code
#include <a_samp>
main()
{
state call:test; //Hier setzten wie den state "call" auf "test"
SetTimer("Test", 1000*5, 0);
}
forward Test();
public Test() <call:test1> //Wird nicht aufgerufen, da call nicht "test1" ist sondern "test"
{
print("Falsch !");
}
public Test() <call:test> //Wird aufgerufen, da call auf "test" ist
{
print("Richtig !");
}
Hier würde auch nach 5 Sekunden gerpintet werden "Richtig !".
Grund für die Nutzung:
Der Grund warum man dies nutzen sollte, ist eigentlich nur die Übersicht
Der extra Callback:
Ein großes Feature hat dieses Statement noch, es hat nämlich einen eigenen Callback:
//Nutzung dieses Callbacks
#include <a_samp>
main()
{
state call:me; //setzten "call" auf "me"
}
entry() <call:me> //Erklärung wieso das aufgerufen wird, steht unten drunter:
{
print("hi");
}
Das würde jetzt sobald "main()" geladen wird "hi" printen, da immer "entry()" aufgerufen wird, sobald man state bla:bla; schreibt und es an das entry anhängt
Mehrere Definierungen:
Man kann auch folgendes tun:
#include <a_samp>
main()
{
state call:Level1; //Setzen "call" auf "Level1"
state call:Level2; //Setzen "call" jetzt auf "Level2"
state call:Level3; //Setzen "call" und jetzt auf "Level3"
}
public OnGameModeInit() <call:Level1, call:Level2> //Wird nur aufgerufen wenn call Level1 oder Level 2 wäre
{
print("Wird leider nicht gerpintet, da call:Level 3 ist und nicht 1 oder 2 !");
return 1;
}
public OnGameModeInit() <call:Level3> //Da call: als letztes Level 3 war/ist, wird das hier aufgerufen:
{
print("Juhuuu !");
return 1;
}
Alltags Beispiele:
Zu guter letzt noch ein paar Beispiele wo man es gebrauchen kann
Allgemein kann man es nur für Globale Sachen nutzen:
//Hier ein Beispiel zu dem ooc-Chat
#include <a_samp>
#include <ocmd>
main() {
state oState:none; //Setzen "oState" auf "none"
}
ocmd:oooc(playerid, params[]) <oState:none> //Wird zuerst aufgerufen, da "oState" auf "none" ist
{
#pragma unused params
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,-1,"Du bist kein Admin !");
oState:aktiv; //Setzen "oState" auf "aktiv"
SendClientMessageToAll(-1,"Ein Admin hat den ooc-Chat aktiviert !");
return 1;
}
ocmd:oooc(playerid, params[]) <oState:aktiv> //Wird absofort aufgerufen, da "oState" auf "aktiv" ja ist
{
#pragma unused params
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,-1,"Du bist kein Admin !");
oState:none;
SendClientMessageToAll(-1,"Ein Admin hat den ooc-Chat deaktiviert !");
return 1;
}
ocmd:o(playerid, params[]) <oState:none> return SendClientMessage(playerid,-1,"Der ooc-Chat ist momentan deaktiviert !"); // Wenn "oState" auf "none" ist
ocmd:o(playerid, params[]) <oState:aktiv> //Wenn "oState" auf "aktiv" ist
{
new string[128];
if(sscanf(params,"s",string)) return SendClientMessage(playerid,-1,"/o [text]");
return SendClientMessageToAll(-1,string);
}
Ich hoffe euch hat es ein wenig geholfen und gefallen, würde mich über ein paar Kommentare freuen
mfg.