Pickups mithilfe eines Enums & einer Schleife erstellen & laden

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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{
    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},
    };


    Erklärung
    {"Text",farbe,x,y,z,drawdistance,virtualworld,line of sight}


    Um die TextLabel zu laden, müssen wir wieder unter OnGameModeIniteine Schleife erstellen.
    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]);
    }


    Erklärung
    Mit der Schleife holen wir die Daten aus static const. Mit der native Create3DTextLabel erstellen wir die Label(s?)


    Ist, wie gesagt, genau das selber wie oben. Wollte nur nochmal ein weiteres Beispiel vorzeigen.


    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