Beiträge von Goldkiller


    Quelle: http://forum.sa-mp.com/showpost.php?p=3342927&postcount=1

    Das ist aber nicht richtig.
    Mal als Beispiel:


    Zitat

    PartInfo[0][ParteiCreatet] = 0
    PartInfo[1][ParteiCreatet] = 0
    PartInfo[2][ParteiCreatet] = 1
    PartInfo[3][ParteiCreatet] = 1


    Jetzt klickst du im Dialog zwar auf PartInfo[2], in listitem ist es aber 0 bzw durch deine +1 Rechnung 1. 1 ist aber nicht richtig, der Index wäre 2.
    Gleiches für PartInfo[3]. Für diesen Wert ist listitem 1, dann +1 und wir haben 2 als Index. Richtig wäre aber 3.


    Die Schleife ist daher nicht unbedingt falsch. Man sollte schon eine benutzen, um vom listitem auf den korrekten Index zu schließen.

    Die Schleife mit p bei DIALOG_PARTEIWAEHLEN ist nicht richtig.
    Du drückst doch die Partei, die sich in listitem befindet. Also musst du zumindest schon mal damit arbeiten, nicht mit irgendeiner Schleife ohne Bezug auf listitem.
    Ist listitem = 2, dann brauchst du die 3 Partei aus der folgenden Schleife (von deinem Code kopiert):
    for(new p=1;p<MAX_PARTEI;p++)
    {
    if(PartInfo[p][ParteiCreatet] != 0 && PartInfo[p][ParteiAusgeschlossen] == 0)
    {
    // wenn listitem = count, haben wir mit p die gewählte Partei. Mit if prüfen, in Variable speichern (außerhalb der Schleife) und mit break raus.
    /* Hier muss dein Code rein :] */
    // count muss jetzt erst kommen
    count++;
    }
    }


    Warum immer Partei 1:
    Die 1. Partei wird immer gewählt, weil du in der Schleife unter DIALOG_PARTEIWAEHLEN am Ende ein return hast und somit nur der erste Wert der Schleife (p=1) durchläuft.


    Die Bedingung bzw Aufmachung des Codes passt nicht zu dem,was du möchtest.


    Du musst durch alle Werte von BetaServerTester gehen und prüfen, ob der Spielername irgendwo in dem Array vorhanden ist (zB Variable gefunden=true setzen). Nachdem du alle BetaServerTester durchgegangen bist, prüfst du anschließend, ob gefunden true oder false ist. Ist gefunden false, dann kickst du den Spieler. Denn der Name kam nicht in BetaServerTester vor. Ist gefunden true, dann war der Name in BetaServerTester vor.


    Spoiler anzeigen
    Hoffentlich keine Copy und Paste Lösung.

    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.

    Ist es ein Filterscript oder Gamemode?
    Du veröffentlichst es im Filterscripts Bereich, der Code lässt aber auf ein Gamemode schließen. Zwar steht oben im Kommentar wiederrum etwas von einem Filterscriot, aber so nur weil es als Kommentar irgendwo steht, muss es ja nicht zwangsläufig genau so sein:



    #if defined FILTERSCRIPT


    public OnFilterScriptInit()
    {
    print("\n--------------------------------------");
    print(" PNS-System by ExTaZZe");
    print(" Alle Rechte liegen bei www.extazze.com");
    print(" Die nutzung dieses Filterscriptes ist jedem gestatet");
    print("--------------------------------------\n");
    return 1;
    }


    public OnFilterScriptExit()
    {
    return 1;
    }
    #endif


    public OnGameModeInit()
    {
    //Tore
    PNS1 = CreateObject(980, 1024.75427, -1029.43445, 32.50388, 0.00000, 0.00000, 0.00000); //LS-Norden
    PNS2 = CreateObject(980, 488.49481, -1735.63440, 12.85534, 0.00000, 0.00000, 352.07697); //LS-Westen
    PNS3 = CreateObject(980, -1903.50757, 277.70166, 42.80104, 0.00000, 0.00000, 0.00000); //SF
    PNS4 = CreateObject(980, 1968.67200, 2162.57275, 11.66726, 0.00000, 0.00000, 270.13461); //LV
    //3D-Texte
    Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, 1027.3616,-1030.1299,32.0721,15.0,0); //LS-Norden
    Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, 485.3574,-1733.5873,11.0950,15.0,0); //LS-Westen
    Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, -1908.8955,276.5127,41.0469,15.0,0); //SF
    Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, 1967.5160,2166.6807,10.8203,15.0,0); //LV
    return 1;
    }
    Hast du dich denn beim Testen denn nie gefragt, wieso OnFilterScriptInit nie aufgerufen wurde? Vorausgesetzt, du hast es natürlich auch mal als eigenständiges Filterscript getestet. Das Problem liegt an o.g. Code in Zeile 1.
    Außerdem ist es nicht gerade logisch (bin mir nicht mal sicher ob es überhaupt funktioniert), in einem Filterscript OnGameModeInit aufzurufen.

    Selbst ich hab dir schon mal geschrieben, dass du den Output des MySQL Plugins erhöhen musst.
    hier
    Man kann immer nur die ersten 64 Zeichen sehen des SQL Befehls, was in den meisten deiner Fälle einfach viel zu wenig ist.

    Könnte teilweise richtig sind, Fehler sind aber trotzdem drin.


    if(playercp == sizeof(brroutes))
    Wird nicht klappen, außer es gibt nur 1 Route. Ich hatte im vorherigen Post dazu geschrieben, dass man ebend manuell durchzählen muss wann die Route endet oder wie viele CPs man durchfahren muss bei Route X.


    SetPlayerCheckpoint(playerid,brroutes[playerid][b_x],brroutes[playerid][b_y],brroutes[playerid][b_z],brroutes[playerid][b_rad]);
    playerid als Index schon mal gar nicht. Als Index muss der in CP gewählt werden, der in der Route als nächstes folgt. Im ursprünglichen Tutorial ist das Muellmann[playerid][pmi_Checkpoint] gewesen.


    Sehe außerdem nicht, wo du die aktuelle Route des Spielers in einer Variable speicherst.


    Zitat

    hallo Goldkiller


    Ist deaktiviert, bekomme bewusst keine Benachrichtigung.

    Nur funktioniert sizeof bei dem Zugriff auf ein enum nicht. Liegt einfach daran, wie die enums wirklich (Variablen) funktionieren.
    Ist ja nicht so, als würde dieses Problem nicht in der Dokumentation angemerkt werden.


    Zitat

    You have to provide the size (max_len) by yourself if you use an enum-array as destination.

    Rein von der Logik ist der Teil am eine deines SQL Statements auch Quatsch:

    Zitat

    ,UID = %d WHERE UID = '%d'


    Heisst: Mach bei dem User, der die User ID 10 hat, den Wert der User ID auf 10.
    Mach keinen Sinn. Denn der User mit der User ID 10 hat bereits den Wert der User ID auf 10 :wacko:.


    Ansonsten solltest du die Länge des Debug Ausgabe im MySQL Plugin erhöhen oder direkt den String query per print ausgeben und hier posten.


    Zitat

    for(new i = 0; i <= rows; i++)


    Ist übrigens mit <= auch nicht richtig.
    Angenommen du hast 1 Zeile, gehst du mir der schleife i = 0, i <= 1 gleich 2x durch. Mit dem Wert 0 und dem Wert 1.


    //Edit:
    Wenn UID wirklich dein Primärschlüssel ist,ist der Name auch schlecht gewählt. UID würde ich als UserID lesen. Wenn es um Garagen geht, würde ich wahrscheinlich GaragenID nehmen oder nur ID.