Navi System mit enum

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
  • Hey Community,
    Da ich es schon selber länge so benutze und es viel einfacher ist wie die anderen wo man alles
    extra neu schreiben muss
    habe ich mir überlegt, das ich es mal mit Enum ausführe...
    nunja, es klappt Problemlos und wird auch perfekt angezeigt.
    vorab möchte ich euch darauf hinweise, das ich eine Rechtschreibschwäche habe daher Gramatik oder Rechtschreibung
    nicht so toll bewerten.
    nun beginne ich mal.
    ich schreibe nur die Codes und dahinter was es bringt und macht.


    Aller anfang machen wir einen Enum, indem wir auflisten,
    was in den darauf folgenden new stehen soll.
    dies sieht bei mir dan so aus

    enum NaviInfo //Benennung beliebig ändern
    {
    Ort[50],//Das ist der Name wie es dan im Navi steht
    Float:NX,//die X Position des Checkpoints
    Float:NY,//Die Y Position des Checkpoints
    Float:NZ//Und zu letzt die höhe also die Z position.
    };


    da ich es mit Dialog machen, muss ich noch den Dialog Definieren.
    #define DIALOG_NAVI 7864 //Zu euer Dialog Zahl ändern


    so nun kommt das new, damit unser Enum auch benutzt wird...
    dies müsste dan so aussehen
    new NaviList[][NaviInfo] = {//Das new, NaviInfo ist unser enum
    //{ "Namen z.B. LSPD",X Coords, Y Coords, Z Coords },
    { "{FF1E00}Checkpoint Löschen",1542.6882,-1675.3882,13.5550 },
    { "{689FFF}LSPD",1542.6882,-1675.3882,13.5550 },
    { "{00CADC}Kleidergeschäft",1458.4689,-1140.0231,24.0714 }
    };


    im ganzen würde es dan soweit so aussehen:

    #define DIALOG_NAVI 5000
    enum NaviInfo
    {
    Ort[50],
    Float:NX,
    Float:NY,
    Float:NZ
    };
    new NaviList[][NaviInfo] = {
    { "{FF1E00}Checkpoint Löschen",1542.6882,-1675.3882,13.5550 },
    { "{689FFF}LSPD",1542.6882,-1675.3882,13.5550 },
    { "{00CADC}Kleidergeschäft",1458.4689,-1140.0231,24.0714 },
    }


    nun möchte ich mit dem Befehl beginnen
    diesen werde ich mit einer For(new schleifen machen damit alle
    Orte aufgelistet werden, die man dan Auswählen kann.
    ich benutze einen List Dialog



    if(strcmp(cmdtext,"/navi",true) == 0)//der strcmp also der Befehlsname
    {
    new stringa[800];//Unser string wo wir es definieren
    for(new navi; navi < sizeof(NaviList); navi++)//Hier die for(new schleife
    {
    format(stringa,sizeof(stringa),"%s\n%s",stringa,NaviList[navi][Ort]);//nun formatieren wie das ganze stringa steht da weil
    //damit auch das darüber angezeigt ist, sonnst kommt es zu problemen
    }
    ShowPlayerDialog(playerid,DIALOG_NAVI,DIALOG_STYLE_LIST,"Navigation",stringa,"Auswählen","Abbrechen");//Hier lassen wir den Dialog anzeigen
    //WICHTIG! das Anzeigen des Dialogs darf nicht in die for(new schleife!!
    return 1;
    }


    und zu guterletzt komme ich noch
    zum OnDialogResponse...
    um hier die ID herraus zu bekommen benutzen wir listitem und
    lassen es dan einfach ausführen.

    if(dialogid == DIALOG_NAVI)
    {
    if(!response) return 1;//Wenn er den Abbrech Button drückt
    new stringa[300];//unser string
    new auswahl = listitem;//hier der ort den er ausgewählt hat
    if(auswahl == 0) return SendClientMessage(playerid,COLOR_RED,"Der Checkpoint wurde gelöscht!"),DisablePlayerCheckpoint(playerid);//wenn er auf Checkpoint Löschen geht wird checkpoint gelöscht
    format(stringa,300,"der Ort %s {FFFFFF} wurde ausgewählt, fahren sie zum Roten Marker!",NaviList[auswahl][Ort]);//hier formatieren wir den string
    SendClientMessage(playerid,COLOR_WHITE,stringa);//string wird abgesendet
    SetPlayerCheckpoint(playerid,NaviList[auswahl][NX],NaviList[auswahl][NY],NaviList[auswahl][NZ]);//checkpoint wurde gesetzt
    }


    So, das war der ganze Code für das Navi, wo man bei ein anderen Navi ewig braucht hat man hier in wenigen zeilen.
    wenn ihr noch ordner haben wollt müsst ihr den enum etwas umändern, zweiten dialog erstellen
    und dan halt immer abfragen und dan die jeweiligen orte setzten etc, eigentlich auch einfach
    ich werde dafür evtl. auch noch ein Tutorial machen.


    Pastebin: http://pastebin.com/KaxDSRGd


    Mfg. Dark_Leary

  • Ich finde es nicht gut erklärt und du nutzt eine falsche Wortwahl folgendes werte ich als total blöd erklärt:
    if(strcmp(cmdtext,"/navi",true) == 0)//der strcmp also der Befehlsname <- um genau zu sein strcmp string compare in diesem fall wird der eingegebene befehl mit /navi verglichen das true sagt das die groß&kleinschreibung ignoriert wird das ==0 sagt das folgendes passiert ... wenn die strings gleich sind
    {
    new stringa[800];//Unser string wo wir es definieren <- ach seit wann definiere ich denn variablen?
    for(new navi; navi < sizeof(NaviList); navi++)//Hier die for(new schleife <- lass das for(new weg
    {
    format(stringa,sizeof(stringa),"%s\n%s",stringa,NaviList[navi][Ort]);//nun formatieren wie das ganze stringa steht da weil
    //damit auch das darüber angezeigt ist, sonnst kommt es zu problemen <- hier wird einfach der vorhandere inhalt der variable string mit der variable NaviList[navi][Ort] formatiert
    }
    ShowPlayerDialog(playerid,DIALOG_NAVI,DIALOG_STYLE_LIST,"Navigation",stringa,"Auswählen","Abbrechen");//Hier lassen wir den Dialog anzeigen
    //WICHTIG! das Anzeigen des Dialogs darf nicht in die for(new schleife!! <- for(new kannst du dir sparen du könntest ja mal erklären wieso man das nicht machen sollte und im prinzip könnte man das sogar machen ohne buggs nur es ist nicht klug
    return 1;
    }

  • Ich würde den so machen:


    new stringa[800];//Unser string wo wir es definieren
    zu
    new stringa[52*sizeof(NaviList)];//Unser string wo wir es definieren
    Damit spart man enorm an den Head verbrauch


    Aber als Tutorial ist es nicht wertbar da man einfach Kopieren kann...

    All in all it's just another brick in the wall

  • Willst du echt 800 mit 52 multiplizieren?


    Schau es dir nochmal genau an
    Ich nehm 52 das mal Die Anzahl der einträge
    bsp.:


    new hans[][enum]=
    {
    {...},//1
    {...},//2
    {...},//3
    {...}//4
    };
    Dann mach ich es so
    new Horst[52*sizeof(hans)];
    Wenn man Mathe kann dann würde man es so rechnen: 52*4 ergibt 208
    Optimale länge

    All in all it's just another brick in the wall

  • Ähm irgendwie bin ich blind ich habe new string[52*sizeof(stringa)]; gelesen habe das erst vor einer Minute gemerkt

  • Sorry wenn es etwas Copy&Paste ist, ich wollte nur nicht für jeden Code eine extrazeile nehmen...
    ich wollte das man es versteht und nicht das man ewig lernt ^^
    man soll hier verstehen wie man es macht und nachdenken was man auch macht, wer Copy&Paste macht ist
    selberschuld das er nix kann sagens wir mal so ^^