Guten Abend,
in diesem Tutorial werden wir uns damit befassen, wie man mithilfe eines Enums leicht & schnell Objekte, Autos, 3Dtextlabel oder Pickups erstellen kann.
Ich erkläre euch das mal an dem Beispiel "Pickups". Weiter unten werdet ihr das Beispiel "3DTextLabel" finden.
Fangen wir also an.
Pickups
Wir wollen Pickups erstellen, welche mit einer Schleife bei "OnGameModeInit" geladen werden.
-Extra Teil -> mit "N" kann man, während man in dem Pickup ist, ein Interior betreten
Was brauchen wir?
Wir brauchen einen Editor, Grundkenntnisse und logisches Denkvermögen.
Schritt 1 - Enum erstellen
Da wir die Pickups ja mithilfe eines Enums erstellen wollen, müssen wir erstmal ein Enum erstellen.
Dafür schauen wir uns mal die Parameter von CreatePickupan.
Diese sind
-Model
wie das Pickup aussehen soll
-Type
Die "Art" des Pickups
-x, y & z Koordinate
Damit das Script weiß, wo das Pickup erscheinen soll
-virtual world
In welcher Virtuellen Welt soll es createt werden? ( 0 = standart )
Diese Parameter tragen wir nun in unser Enum ein
enum e_pickup{
Float:exp,//x pos
Float:eyp,//y pos
Float:ezp,// z pos
vw// virtuelle welt
}
Nun müssen wir natürlich noch Werte irgendwie in das Script eintragen, damit man überhaupt Pickups erstellen kann.
Dafür verwenden wir static const
static
Wenn man etwas als "static" deaklariert, ist es, einfach gesagt, für andere Scripts & Plugins "unsichtbar"
const
const verwenden wir, da die Koordinaten & weitere Parameter des Pickups immer die selben sind & bleiben.
bsp:
const variable = 5;
variable = 4;
// Würde einen Fehler hervorrufen, da wir den Wert nicht ändern dürfen.( const =~ konstant )
Wir schreiben also
static const
e_PickupData[][e_pickup] = {
};
Darauf werde ich nicht weiter eingehen, sollte eigentlich alles klar sein.
Nun müssen wir das oben geschriebene noch mit Informationen füttern. (Model, Type, X - Y & Z-Achse, Virtuelle Welt)
static const
e_PickupData[][e_pickup] = {
{}//Schritt 1: Informationen werden innerhalb einer geschweiften Klammer geschrieben. Sollten mehrere Zeilen vorhahden sein, werden sie mit einem "," getrennt
};
static const
e_PickupData[][e_pickup] = {
{345.2345,215.2356,1235.2345}//Schritt 2: Eintragen der x,y & z Koordinaten
};
static const
e_PickupData[][e_pickup] = {
{345.2345,215.2356,1235.2345,0}//Schritt 3: Eintragen der virtuellen Welt
};
Nun hätten wir Teil 1 abgschlossen.
Wir haben die von uns vorgegebenen Parameter in dem Enum via static const mit Infos gefüttert
Wenn wir jetzt den Server starten würden, würden noch keine Pickups erscheinen, da wir diese erste erstellen müssen.
Dafür gehen wir zu "OnGameModeInit" und schreiben folgendes
new i;
for(; i < sizeof(e_PickupData); i++)
{
CreatePickup(1559, 23, e_PickupData[i][exp], e_PickupData[i][eyp], e_PickupData[i][ezp]);
}
Erklärung.
Wir gehen mit der Schleife die Daten in "static const ..." durch und lassen diese mithilfe von CreatePickupIn-Game laden & erstellen.
Somit hätten wir auch "Teil 2" abgeschlossen. Es folgt nun ein kleiner "Extra-Bereich", in dem wir die Pickups als Interior Enter & Exit punkte verwenden.
Pickups - Extra
Nun sollen die Pickups also als Enter & Exit Point fungieren.
Dafür brauchen wir noch ein paar andere Parameter in unserem Enum.
enum eLCoordVars{
Float:exp,
Float:eyp,
Float:ezp,
vw,
Float:eesx,//enter spawn pos
Float:eesy,
Float:eesz,
interior//interior
}
Soweit alles klar?
Natürlich müssen wir
static const dementsprechend anpassen.
static const
e_PickupData[][e_pickup] = {
{345.2345,215.2356,1235.2345,0,1245.2356,2345.234,1245.1245,1}//Wir haben nun die Daten um "spawnx,spawny, spawnz & interior erweitert"
};
Nun wollen wir mit der Taste "N" das Interior betreten.
Dazu gehen wir zu OnPlayerKeyStateChange
Hier fragen wir ab, ob der Spieler die Taste "N" gedrückt hat.
if(newkeys & KEY_NO)
Nun müssen wir überprüfen, ob er sich in der Nähe eines Pickups befindet.
for(new i; i < sizeof(e_PickupData); i++)
Sollte klar sein.
Nun müssen wir die Positionen des Spielers mit den Positionen des Pickups vergleichen
if(!IsPlayerInRangeOfPoint(playerid,0.5,e_PickupData[i][exp],e_PickupData[i][eyp],e_PickupData[i][ezp]))continue;
Erklärung.
if(istNichtSpielerInUmgebungVonPunkt(spieler,Radius,x-positionAusStaticConst,y-posistionAusStaticConst,z-positionAusStaticConst))
Nun müssen wir dem Spieler zu der richtigen Position porten.
Außerdem müssen wir ihn noch in das richtige Interior setzen.
SetPlayerInterior(playerid,g_CoordSets[i][interior]);
&
SetPlayerPos(playerid,e_PickupData[i][eesx],e_PickupData[i][eesy],e_PickupData[i][eesz]);
Das war der Erste Teil des Tutorials, ich werde im Laufe des Tages noch "3DTextLabel" hinzufügen.
Teil 2: 3DTextLabel
Nun kommen wir zu dem 2. Teil des Tutorials. Mithilfe eines Enums und einer Schleife ein 3DTextLabel erstellen.
Im Grund funktioniert dies genauso wie mit den Pickups.
Wir erstellen also wieder ein Enum für "static const".
enum e_3DLabels{ Erklärung Um die TextLabel zu laden, müssen wir wieder unter OnGameModeIniteine Schleife erstellen. Erklärung Ist, wie gesagt, genau das selber wie oben. Wollte nur nochmal ein weiteres Beispiel vorzeigen.
dtext[100],//ich weiß nicht genau, was das limit ist.
color,//farbe des textes
Float:tx,//pos x
Float:ty,//pos y
Float:tz,//pos z
dd,//draw distance
vw,//virtual world
los//line of sight -> durch objekte sehbar (1/0)
}
Nun geht es wieder mit static const weiter
static const
e_3DLabel[][e_3DLabels] = {
{"Hello World\nIch bin weiß & bin ein Textlabel",-1,1965.3351,1623.2197,12.8620,7,0,0},
};
{"Text",farbe,x,y,z,drawdistance,virtualworld,line of sight}
for(new i;i<sizeof(g_3DLabel); i++)
{
Create3DTextLabel(g_3DLabel[i][dtext],g_3DLabel[i][color],g_3DLabel[i][tx],g_3DLabel[i][ty],g_3DLabel[i][tz],g_3DLabel[i][dd],g_3DLabel[i][vw],g_3DLabel[i][los]);
}
Mit der Schleife holen wir die Daten aus static const. Mit der native Create3DTextLabel erstellen wir die Label(s?)
Ich hoffe ich habe alles richtig und verständlich erklärt &
ich freue mich auf Kritik, Feedback & Verbesserungsvorschläge.
Sollten Fehler vorhanden sein, bitte mich informieren, damit ich diese ausbessern kann.
MFG
Manniac
#edit 1 -> Fehler ausgebessert
#edit 2 -> Edit vergessen
#edit 3 -> Titel geändert
#edit 3 -> Titel geändert