Pickups dynamisch Ingame erstellen[Erweiterung zu dem anderen Tutorial]

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.


    Da zu einem guten Script auch die Dynamische Flexibilität gehört, möchte ich heute anhand eines kleines Beispiels erklären, wie man Ingame - ohne dass man das Pickup manuell (statisch) ins Script einfügt - erstellen kann.


    Ziel
    Ziel ist, wie oben schon gesagt, das dynamische Erstellen eines Pickups. Wir verwenden dazu den Befehl '/createpickup <pickupid> <pickuptype>'.


    Was wir brauchen
    Ich werde in diesem Tutorial mit MySQL arbeiten, da man so ganz einfach Ingame die Pickups in der Datenbank verwalten kann.
    Ein Tutorial, wie man MySQL installiert, gibt es hier
    Des Weitern werde ich mit 'ocmd' & 'sscanf' arbeiten (-> sowohl beim speichern & laden, als auch bei dem command ).
    Beide Plugins gibt es public zum downloaden.
    Außerdem verwende ich zum Verwalten der Datenbank "XAMPP & phpmyadmin"


    Dann fangen wir mal an..


    Einrichten der Tabelle


    Zuallerst müssen wir eine neue Tabelle in unserer MySQL Datenbank anlegen. Ich nenne sie mal "Pickups".
    Nun müssen wir die Anzahl der Spalten angeben.
    Dazu schauen wir uns die native 'CreatePickup' an.
    CreatePickup(model, type, Float:X, Float:Y, Float:Z, Virtualworld)
    Wir brauchen also 6 Spalten, richtig? Nein. Wir brauchen noch eine weitere, da wir später auf die einzelnen Pickups in der DB zugreifen wollen und somit für jedes Pickup eine eigene ID brauchen.


    Das ganze sieht nach dem Erstellen dann so aus.

    Nun müssen wir die Zeilen füllen.
    In die 1. Zeile kommt die eindeutige ID (meinetwegen auch Identität), die wir mit 'AI'(=Auto-increment) autmatisch hochzählen lassen.
    D.h : Wenn pro Eintrag wird die ID erhöht, sodass jedes Pickup eine eigene ID hat.

    ID ist ein Integer, deswegen stellen wir bei 'TYP' 'INT' ein.

    Bei Länge/Werte schreiben wir eine 3 rein. Diese steht für die einzelnen Ziffern. (123 = 3 Ziffern, 12 = 2 Ziffern usw)
    Da diese Var immer automatisch hochgezählt werden wollen, setzen wir noch einen Haken bei 'A_I'

    Nun müssen wir die verbleibenden Zeilen füllen. Dafür tragen wir einfach die Paramter, die in der native 'CreatePickup' gefordert werden, in die einzelnen Zeilen ein.
    Hier dürfen wir nicht mehr 'A_I' verwenden.
    Zudem sollte man bei der X, Y & Z Achse den Typ auf "Float" umstellen.
    Sollte dann ungefähr so aussehen.


    Nun ist die Tabelle vollständig erstellt & wir können uns dem Scripte widmen.


    Scripting


    Dafür erstellen wir uns das Grundgerüst des Commands

    Spoiler anzeigen
    ocmd:createpickup(playerid,params[])
    {


    Soweit, so gut. Nun müssen wir ein paar Variablen deklarieren.
    Spoiler anzeigen
    ocmd:createpickup(playerid,params[])
    {
    new modelid,//Modelid des Pickups. 1240 ist z.b ein Herz
    Float:pos[3],//damit wir wissen, wo das Pickup erstellt werden soll
    ptype;//Pickuptype. 1 ist z.b 'immer sichtbar', 0 'nicht sichtbar'


    Jetzt kommt die gewohnte sscanf-Abfrage, ob alle Parameter angegeben wurden.
    Spoiler anzeigen
    if(sscanf(params,"dd",modelid,ptype))return SendClientMessage(playerid,-1," '/createpickup <modelid> <pickuptype>");


    Nun werden wir das Pickup erstellen. Dazu brauchen wir die Position des Spielers.

    Spoiler anzeigen
    GetPlayerPos(playerid,pos[0],pos[1],pos[2]);

    Jetzt wird das Pickup erstellt
    Spoiler anzeigen
    CreatePickup(modelid,ptype,pos[0],pos[1],pos[2],GetPlayerVirtualWorld(playerid));

    Das Pickup sollte nun sichtbar sein.
    Jetzt müssen wir es in unsere Tabelle eintragen.
    Dazu verwenden wir 'INSERT INTO'
    Spoiler anzeigen
    new query[500];
    format(query,sizeof(query),"INSERT INTO Pickups(`model`,`type`,`x`,`y`,`z`,`vw`) VALUES ('%d','%d','%f','%f','%f')",modelid,ptype,pos[0],pos[1],pos[2],GetPlayerVirtualWorld(playerid));

    Erklärung dazu sollte in dem oben genannten Thread sein.
    Nun müssen wir den Query noch abschicken.
    Spoiler anzeigen
    mysql_query(query);

    Die Daten sollten nun in unsere Tabelle eingetragen worden sein.
    Somit hätten wir den ersten Teil des Tutorial abgeschlossen. Der 2. Teil - das Laden des Pickups - wird im Laufe des nächsten Tages folgen.


    Bis dahin
    Beste Grüße
    Manniac


    p.s: ich habe versucht, das ganze so übersichtlich wie möglich zu gestalten. Sollte es Verbesserungsvorschläge geben, immer her damit. Ich freue mich auf konstruktive Kritik