3 Dimensionales Array - Busstrecken mit verschiedenen Routen

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
  • Hallo zusammen


    wir werden heute ein 3Dimensionales Array bauen
    bezogen wird das ganze auf Busstrecken


    Es ist eine Erweiterung von dem Tutorial von Goldkiller *klick mich*


    Um diesem Tutorial zu folgen müsst ihr folgende Vorraussetzungen erfüllen :)



    1. Erfahrung mit Enums
    2. 1-3 Busstrecken die ihr Ingame schon gesaved habt
    3. das OCMD Include
    3. SpielerEnum und ggf eine MYSQL Verbindung da ich dies auf MYSQL schreibe bzgl des Jobsystems



    ich werde dieses System direkt so umschreiben, dass es ein direktes JobSystem ist.


    Solltet ihr bereits eins haben so müsst ihr nicht Alle schritte befolgen und lediglich anpassen


    Bei Fehlern und Problemen
    Ich werde die 1. Zeit immer in einem Livestream auf Twitch zur Verfügung stehen um dort Probleme und ähnlichem genau zu erklären

    Bei Fehlern und Problemen
    Ein Ausführliches Live Tutorial gibts hier auch



    Nun wir teilen dieses Tutorial in 3 Schritte


    1. Vorbereitungen
    2. Das Grundgerüst
    3. Anpassung auf das JobSystem



    Die Vorbereitungen


    Also zuerst werden wir nun die Enums erstellen die wir benöigen
    In Diesem Fall sind es 3
    1. Das SpielerEnum, welches ihr sowieso zu Anfang erstellt um die Daten aus der DB zu laden



    Bei dem Spielerenum brauchen wir nun folgende Dinge


    Checkpoints,
    r_id,
    bool:aktiv //Entweder True oder False



    beim letzten wird das Komma weggelassen


    Anschließend erstellen wir 2 weitere Enums


    enum busroutenEnum{ //brroutes
    Float:b_x,
    Float:b_y,
    Float:b_z,
    Float:b_rad,
    win

    }
    enum busstartsenum{ //brInfo

    Float:b_x,
    Float:b_y,
    Float:b_z,
    b_cps
    }


    im 1. Enum davon werden die Routen festgelegt also die Checkpoints etc. Auch habe ich mir gedacht dass wir hier den Gewinn einfügen


    beim 2. Enum werden die Startcheckpoints festgelegt + die Anzahl der Checkpoints


    --------------------------------------------------------------------


    Nun wollen wir das ganze ja auch verwenden also erstellen wir uns news



    new brInfo[][busstartsenum] = {
    // X Y Z ANZAHL DER CHECKPOINTS
    {2221.6140,1866.6394,10.3858, 10},
    {1243.3254,-1847.2728,13.1883,7},
    //{},


    };
    //brInfo[playerid][b_x]
    //brroutes[playerid][b_x]
    new brroutes[][][busroutenEnum] = {
    // X Y Z Radius Gewinn,RoutenID


    { //LV nach LS
    {2154.9355,1961.0078,10.2405,5.0,250},
    {2178.5608,2349.9243,10.2335,5.0,250},
    {2119.5234,2061.8625,10.2251,5.0,250},
    {2039.7462,1005.9709,10.2359,5.0,250},
    {1789.3076,801.3461,10.6779,5.0,250},
    {1673.3729,-785.5421,54.4621,5.0,250},
    {1186.4357,-934.5354,42.2987,5.0,250},
    {958.2468,-1080.1121,24.5061,5.0,250},
    {1028.4401,-1331.0526,12.9473,5.0,250},
    {1151.0576,-1409.2263,13.0779,5.0,250}
    },
    { //LS nach SF
    {1243.3254,-1847.2728,13.1883,5.0,250},
    {670.6043,-1735.1041,13.2707,5.0,250},
    {278.9674,-1513.9545,32.1741,5.0,250},
    {-130.4320,-1230.6105,2.5817,5.0,250},
    {-1787.2384,-571.1826,16.1349,5.0,250},
    {-1986.4297,151.1903,27.3380,5.0,250},
    {-1950.5823,576.5387,34.8990,5.0,250},
    {0.0, 0.0, 0.0, 0.0, 0},
    {0.0, 0.0, 0.0, 0.0, 0},
    {0.0, 0.0, 0.0, 0.0, 0}
    //{}
    //{}
    }




    };
    Im Ersten ist wie oben beschrieben die Startpoints festgelegt
    Wichtig dabei ist dass die Anzhal der Checkpoints hinten festgelegt wird


    da wir sonst ein Problem bekommen, wenn wir weniger als 10 Chckpoints haben verwenden wir sogenannte "Platzhalter"


    die sehen so aus {0.0, 0.0, 0.0, 0.0, 0}


    haben wir bei einer Strecke jetzt nur 8 von 10 Points so geben wir oben beim definieren der Startpunkte nur 8 an und die leeren Checkpoints werden nicht aufgerufen!






    Schritt 2, Das Grundgerüst


    Nun erstellen wir einen Befehl für die Jobauswahl


    ocmd:startjobs(playerid,params[])
    {
    ShowPlayerDialog(playerid,ANMELDUNGEN,DIALOG_STYLE_LIST,"Anmeldestellen","Busfahrer/in Los Santos \nBusfahrer Las Venturas","Anmeldung","Abbrechen");
    return 1;
    }

    ich hab den Busfaher in LS und LV getrent


    Nun werden wir dafür den Dialog oben erstellen


    entweder


    #define ANMELDUNEN 5213
    oder ihr macht es in einem Enum wo ihr die Zahlen dann nicht braucht


    enum {
    ANMELDUNGEN
    //WEITERES
    }; 
    Anschließend gehen wir zu
    OnDialogResponse


    und fügt dort die DialogID mit den Listitems ein


    also so
    if(dialogid == ANMELDUNGEN)
    {
    if(!response) return 1;
    if (listitem == 0)
    {


    SendClientMessage(playerid,CL_HBLUE,"Du hast den Busfahrer/innen-Job gestartet -> Fahre nun zur Anmeldestelle von Bus - Los Santos GmbH!");
    Roads[playerid] = 1;
    SetPlayerCheckpoint(playerid,1268.6335,-1816.1614,13.1145,7.0); //Annahme Stelle

    return 1;
    }
    if (listitem == 1)//Busfahrer LV
    {

    SendClientMessage(playerid,CL_HBLUE,"Du hast den Busfahrer/innen-Job gestartet -> Fahre nun zur Anmeldestelle von Bus - Las Venturas GmbH!");
    Roads[playerid] = 2;
    SetPlayerCheckpoint(playerid,2221.6140,1866.6394,10.3858,7.0); //Annahme Stelle

    return 1;
    }

    }
    Das ganze habe ich dann noch mit Roads getrennt
    wofür ihr oben
    new Roads[MAX_PLAYERS];
    erstellen müsst
    es ist eine Abfrage welche Busfahrerjob jetzt gewählt wurde damit ihr den Spieler zur annahme stelle Schicken könnt


    Wir haben den Spieler ja jetzt einen festen Checkpoint gesetzt


    daher gehen wir jetzt zu
    OnPlayerEnterCheckpoint


    wo wir unser Roads benutzen werden


    public OnPlayerEnterCheckpoint(playerid)
    {


    if(sInfo[playerid][aktiv])
    {
    DisablePlayerCheckpoint(playerid);
    new playercp = sInfo[playerid][Checkpoints],string[256];
    if(playercp >= brInfo[sInfo[playerid][r_id]][b_cps])

    }


    zuerst machen wir eine Abfrage ob er einen aktivien Job haben. Dis wird in der Regel dann gesetzt nachdem er den Job angenommen hat


    anschließend


    wird folgendes gemacht{
    sInfo[playerid][aktiv] = false;
    SendClientMessage(playerid,RED,"Du hast deine Strecke abgeschlossen. Du erhälst als Belohnung einen Geldbündel mit einer Rechnung");
    SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
    new gewinn;
    for(new i=0; i<brInfo[sInfo[playerid][r_id]][b_cps]; i++)
    {
    gewinn+=brroutes[sInfo[playerid][r_id]][i][win];
    }
    gewinn+=win_city_change;
    format(string,sizeof(string),"Verdienst $%i + $%i Euro Stadtwechsel = %i",gewinn-win_city_change, win_city_change, gewinn);
    SendClientMessage(playerid,CL_GREEEN,string);
    GivePlayerMoney(playerid,gewinn);
    SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
    }

    Wir setzen dem Spieler noch den Gewinn für jeden Checkpoint und addieren ihn
    Er wird ihm dann als Gewinn gutgeschrieben


    zum Schluss brauchen wir hier noch ein else damit wir wissen was passiert wenn er einen aktiven Job hat


    else
    {
    SetPlayerCheckpoint(playerid,brroutes[sInfo[playerid][r_id]][playercp][b_x],brroutes[sInfo[playerid][r_id]][playercp][b_y],brroutes[sInfo[playerid][r_id]][playercp][b_z],10);
    sInfo[playerid][Checkpoints] ++; // ++ ist das gleiche wie +1
    }


    sodass der befehl dann so aussieht if(sInfo[playerid][aktiv])
    {
    DisablePlayerCheckpoint(playerid);
    new playercp = sInfo[playerid][Checkpoints],string[256];
    if(playercp >= brInfo[sInfo[playerid][r_id]][b_cps])
    {
    sInfo[playerid][aktiv] = false;
    SendClientMessage(playerid,RED,"Du hast deine Strecke abgeschlossen. Du erhälst als Belohnung einen Geldbündel mit einer Rechnung");
    SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
    new gewinn;
    for(new i=0; i<brInfo[sInfo[playerid][r_id]][b_cps]; i++)
    {
    gewinn+=brroutes[sInfo[playerid][r_id]][i][win];
    }
    gewinn+=win_city_change;
    format(string,sizeof(string),"Verdienst $%i + $%i Euro Stadtwechsel = %i",gewinn-win_city_change, win_city_change, gewinn);
    SendClientMessage(playerid,CL_GREEEN,string);
    GivePlayerMoney(playerid,gewinn);
    SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
    }
    else
    {
    SetPlayerCheckpoint(playerid,brroutes[sInfo[playerid][r_id]][playercp][b_x],brroutes[sInfo[playerid][r_id]][playercp][b_y],brroutes[sInfo[playerid][r_id]][playercp][b_z],10);
    sInfo[playerid][Checkpoints] ++; // ++ ist das gleiche wie +1
    }
    }



    Nun unser aktueller Stand ist, dass der Spieler nun einen Startpunkt bekommt bzw die folgenden Checkpoints bekommt


    Ich werde im OnPlayerEnterCheckpoint nun auf folgendes eingehen,
    SetPlayerCheckpoint(playerid,brroutes[sInfo[playerid][r_id]][playercp][b_x],brroutes[sInfo[playerid][r_id]][playercp][b_y],brroutes[sInfo[playerid][r_id]][playercp][b_z],10);
    denn dies ist unser 3Dimensionales Array was wir nun benötigen


    brroutes[sInfo[playerid][r_id]][playercp][b_x]
    fragt die X Koordinate der R_id ab also die RoutenID


    d.h wir brauchen bei jeder Checkpoint abfrage die R_id!
    if(playercp >= brInfo[sInfo[playerid][r_id]][b_cps])


    fragt ab ob der Spieler die Maximale Anzahl der Checkpioints erreicht also in dem Falle 10, bzw die angegebene Zahl!
    wenn ja wird der Checkpoint disabled und der Gewinn verteilt



    Nun haben wir folgenden Standpunkt:


    Spieler startet Job mit /startjobs und wählt Busfahrer aus
    Spieler bekommt anmeldepunkt
    Spieler bekommt die Checkpoints
    Spieler bekommt Gewinn bei Abschluss


    ich hoffe ich habe nix vergessen,
    werde das ganze von der Größe anpassen und fertig editieren


    LG


    Stormi25


    Handy Vertrag?
    Hier kannst du was gutes Finden!


    Klick mich an!

    Einmal editiert, zuletzt von [RG]Stormi25 () aus folgendem Grund: Verlinkung auf das Tutorial von Goldkiller

  • Wenn ich fragen darf, wo ist der 3 Dimensionale Array?
    ich sehe nur ein 2 Dimensionalen Array

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Das Tutorial ist echt schwach.

    • Im Titel des Tutorials steht etwas von Busstrecken. Wo wird denn wirklich geprüft, ob der Spieler in einem Bus sitzt?
    • Wo kommt "win_city_change" her?
    • "beim letzten wird das Komma weggelassen" - Sagst du. Es geht aber auch mit Komma (,).
    • "da wir sonst ein Problem bekommen, wenn wir weniger als 10 Chckpoints haben verwenden wir sogenannte "Platzhalter"" - Ungenutzer Speicher, braucht man nicht denn es geht auch ohne. Zusätzlich in Checkpoints der Rechtschreibfehler.
    • /startjobs - Hat es einen Grund, weshalb du die Namen der Routen nicht in "brInfo" ablegst und zB in dem Befehl ausließt und direkt in den Dialog einfliesen lässt? Achtung: "Dynamisch"
    • "oder ihr macht es in einem Enum wo ihr die Zahlen dann nicht braucht" - Ist nicht unbedingt wahr.
    • Hast du mal ausprobiert, zwei Routen nacheinander zu fahren? Probier es mal aus, es wird nicht funktionieren. Du setzt nirgendwo die Variablen sinnvoll auf ungültig (Inaktiver Busfahrer o.Ä.).
    • Darf ich als Busfahrer also auch die Checkpoints ohne Fahrzeug durchlaufen? Cool. (Zugegeben, es fehlt bei meinem Tutorial auch. Heisst aber nicht,dass du es auch auslassen solltest)
    • Mmn halten die meisten Busse auch an Bushaltestellen an. Wenn man einfach nur durch fahren soll, ist es doch nur ein Rennen ¯\_(ツ)_/¯.
    • Du deklariest die Variable Roads in deinem Tutorial nachdem sie im Code aufgeführt wird. Find ich persönlich nicht hilfreich.
    • Was bringt die Variable Roads? Sie wird nur bei ANMELDUNGEN mal benutzt, sonst nirgendwo.
    • Der Wert r_id bei sInfo ist immer 0. Ich kann also (wenn überhaupt) nur Route 1 fahren (Siehe nachfolgenden Punkt)
    • Der Wert aktiv bei sInfo ist immer false. Ich kann also nie gültig durch einen Checkpoint fahren.
    • Was hat es mit der "Annahmestelle" auf sich? Was ist dort? Wieso muss man dahin ? Wieso lege ich die Koordinaten nicht bei busstartsenum fest sondern in OnDialogResponse?
    • Glaubst du es ist nicht verwirrend, dass es sowohl bei busroutenEnum als auch bei busstartsenum,Werte hinter den Namen b_x,b_y und b_z abgelegt werden?
    • Darf die 2. Route (Las Venturas) nur ein männlicher Busfahrer fahren, oder wieso steht nur bei der 1. Route (Los Santos) auch für Busfahrer/in?


    Dazu kommt mMn noch die Sache hinzu, dass es nicht gerade wie eine wirkliche Anleitung beschrieben ist. Es gibt unterschiedliche Schriftgrößen, die Überschrift "Anpassung auf das JobSystem" wird nirgendwo im Text erwähnt außer im Inhaltsverzeichnis und mal schreibst du "Schritt {2}" und mal lässt du es weg (Schritt {X}). Allgemein ist der Schreibstil nicht hilfreich. Satzzeichen oder Groß/Kleinschreibung fehlt sehr häufig.


    TL;DR
    Hier hast du eine Umfangreiche Kritik, bevor hier noch die 10/10 Wertungen reingeflogen kommen. Das Tutorial funktioniert so wie du es gepostet hast NICHT, es gibt Fehler beim kompilieren und selbst wenn man die behebt (sollte NIEMALS vorkommen in einer Anleitung, dass ich Fehler beheben muss), klappt es trotzdem nicht einwandfrei und schon gar nicht auf Dauer. Welche Punktewertung man dafür geben sollte, kannst dir ja selbst ausmalen.