Beiträge von Goldkiller

    Weist du denn auch irgendwann pID einen Wert zu ?
    In deinem Codeschnipsel ist dazu nämlich nichts zu sehen ( sscanf,strtok,strval o.Ä. zum umwandeln der ID ) ,daher ist pID immer 0.Ich nehmen daher auch an,dass du es als ID 0 immer testest. Daher wird auch immer dein eigener Name angezeigt, blöder Zufall da du nun mal ID 0 bist.

    public OnPlayerEnterCheckpoint(playerid)
    {
    if(Checkpoint[playerid] == 1)
    {
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,1061.3191,-1346.2826,13.2653,5.0);
    Checkpoint[playerid] = 2;
    }
    if(Checkpoint[playerid] == 2)
    {
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,1218.7820,-1162.5214,23.0928,5.0);
    Checkpoint[playerid] = 3;
    }
    if(Checkpoint[playerid] == 3)
    {
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,1202.6910,-878.2720,42.8365,5.0);
    Checkpoint[playerid] = 4;
    }
    return 1;
    }
    Der Code läuft auch in einem Rutsch durch
    Du gehst in die erste If Abfrage und setzt den Wert auf 2. Dann wird die If-Bedingung beendet.
    Jetzt wird geschaut ob der Wert 2 ist.Das stimmt natürlich,da du ihn zuvor in auf 2 gesetzt hast. Wir gehen rein in die 2. Bedingung und setzen den Wert auf 3.
    Jetzt läuft das immer so weiter ...
    Entweder du machst anstatt if,if if ein if,else if,else if usw oder machst am Ende jeder If-Bedingung ein return.
    Übrigens ist diese Methode der Checkpoint Erstellung eine Katastrophe.
    Versuch es mal lieber so:
    http://bit.ly/lj4FPX

    if(dialogid==DIALOG_DIENST)
    {
    if(response)
    {
    switch(dialogid) // <-- wozu ist das hier gut? Du fragst doch vorher bereits ob dialogid == DIALOG_DIENST ist
    {
    case 1: // <-- wozu ist das hier gut? Du fragst doch vorher bereits ob dialogid == DIALOG_DIENST ist
    {
    switch(listitem)
    {
    case 0://normal1
    Das erste switch für dialogid ist falsch. Es ist völlig unnötig und wird wahrscheinlich der Fehler sein ( Außer DIALOG_DIENST ist 1 ).

    Ist aber falsch,so einfach ist das ( lPrototypel ).


    Ich zeig dir mal wo der Fehler liegt:
    if(listitem==0)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 1)
    {
    IsAnyFarmerOnline = true;
    }
    }
    }
    if(!IsAnyFarmerOnline)
    {
    SendClientMessage(playerid, COLOR_GREY, "Kein Farmer online!");
    return 1;
    }
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: %d)\n", GetName(i), i, Spieler[i][pHandyNr]); // <-- wo kommt denn hier das i her ?
    strcat(str2, string); // <-- Muss mit der format() Zeile zusammen verschoben werden.
    ShowPlayerDialog(playerid, DIALOG_FARMLISTE, DIALOG_STYLE_MSGBOX,COLOR_HEX_ORANGE"Farmer-Liste", str2, "Schließen", "");
    }
    Die Zeilen die falsch sind,habe ich dir markiert.
    Wo machen sie denn am meisten Sinn ? Du willst ja die Spieler die du in der Schleife prüfst verarbeiten, dass machst du ja auch richtig mit dem i , nur an der falschen Stelle. Das i ist außerhalb der Schleife nicht vorhanden und du würdest dann sowieso immer nur einen Spieler verarbeiten können.
    Es muss also irgendwo wo hin verschoben werden,wo es direkt mit dem i aus der Schleife zusammen arbeiten kann, falls der Spieler ein Farmer ist.

    Wenigstens wurde hier nicht alles als "dynamisch" bezeichnet, denn es ist es definitiv nicht.
    Dem Quellcode nach zu Urteilen ist es eher eine Schlechte als eine Gute Arbeit :| .


    Um nur mal eine Sache zu nennen von Vielen:
    stock mysql_CheckVagos()
    {
    new Query[128];
    format(Query, sizeof(Query), "SELECT * FROM Gangfight WHERE Name = 'Vagos'");
    mysql_query(Query);
    mysql_store_result();
    return mysql_num_rows();

    Wozu brauch ich a) für jede Fraktion eine extra Funktion und b) wozu den String Query.

    Du machst in der Schleife return,sobald ein Spieler NICHT in einer bestimmten Fraktion ist ( Farmer , Busfahrer usw. ) wird bei dir davon ausgegangen,dass es KEINEN in dieser Fraktion gibt. Natürlich muss das nicht stimmen.
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 1)
    {
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);
    }
    else // Ist der Spieler kein <FARMER>,wird dieser Zweig durchgegangen.
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Farmer online.");
    return 1; // <-- Dieses return ist das Problem. Selbst wenn 99 Spieler <Farmer> sind und nur 1 nicht,dann wird hier durch return alles beendet. So als gäbe es 0 <Farmer>
    }
    }
    }
    Könntest es auf viele Weisen lösen. Einfach wäre es zB einfach eine neue Variable anzulegen und hochzuzählen,falls es <Farmer> gibt ( Einfach von false auf true setzen erfüllt die Gleichen Zweck ).
    Dann NACH der Schleife Abfragen,ob die Variable 0 / false ist und daraus ableiten,dass es keine <Farmer> gibt ( Nachricht absenden,dass es keine <Farmer> gibt ) . Ist die Variable > 0 oder true,dann gibt es <Farmer> und du kannst den Dialog anzeigen.
    Der else - Zweig ist natürlich dann komplett zu entfernen.

    Speicher doch bei OnPlayerClickPlayer die angeklickte ID ab und verarbeitet diese danach über den Dialog:



    new aiClickedPlayer[MAX_PLAYERS]; // Bei OnPlayerConnect auf INVALID_PLAYER_ID setzen.
    public OnPlayerClickPlayer(playerid, clickedplayerid, source)
    {
    aiClickedPlayer[playerid] = clickedplayerid;
    // Dialog 'DialogClickPlayer' öffnen ?
    return 1;
    }

    Jetzt könntest du bei OnDialogResponse mit der Variable arbeiten und wüsstest,welcher Spieler zuvor angeklickt wurde.

    Der Befehl hat auch nichts damit zu tun was passiert,wenn ein Spieler sich auf einen Roller setzt.
    Entweder bei OnPlayerEnterVehicle oder OnPlayerStateChange wären Möglichkeiten,wie du das direkte losfahren verhindern kannst. Gibt natürlich noch weitere Optionen.


    Hast du auch das gemacht ?
    Der Andere Teil des Beitrages waren nur weitere Fehler, nicht aber die Ursache deines Hauptproblemes.

    Der Befehl hat auch nichts damit zu tun was passiert,wenn ein Spieler sich auf einen Roller setzt.
    Entweder bei OnPlayerEnterVehicle oder OnPlayerStateChange wären Möglichkeiten,wie du das direkte losfahren verhindern kannst. Gibt natürlich noch weitere Optionen.
    if (strcmp("/rent", cmdtext, true, 10) == 0) // Hier 5 anstatt 10
    if(Money <= 300) // Nur < , nicht <=

    Da gibt es jetzt viele Wege,die Nachricht nicht abzusenden wenn der Spieler gekickt/gebannt wurde.
    Du kannst einfach abfragen,ob reason nicht 2 ist und dann die Nachricht per SendClientMessageToAll absenden.
    Denn ist reason 2,dann wurde der Spieler gekickt/gebannt.

    Ein leeren Text kannst sowieso nicht abschicken.
    Der Index 1 sollte auch existieren,da es ein String ist.
    Denn selbst wenn ich nur den Text "!" absende,sollte der String dazu trotzdem Intern so aussehen:
    text[0] = '1';
    text[1] = '\0'; // Null
    Der Null-Terminator für den String sollte trotzdem vorhanden sein.

    Zitat

    Der Server würde dann entweder crashen oder eine Meldung ala Arraysize ausspucken,


    Der würde niemals Crashen.Der würde nur die Funktion nicht weiter ausführen und von alleine sowieso keine Meldung ausgeben,dass es den Index nicht gibt.

    Am einfachsten ist es,wenn du direkt auf den Charakter zugreifst:
    if( text[0] == '!' ) {
    // zB. !hallo
    }



    [DgN]ReyDz, der Index 1 ist sowieso schon mal Quatsch.
    //Edit:
    Oder auch nicht.
    if( text[0] == '!' && text[1] == ' ' ) { }

    new bool:PreventExplosion[MAX_VEHICLES];
    Das ist eine Variable.


    PreventExplosion(vehicleid);
    Das ist eine Funktion.


    Die Beiden haben einen identischen Namen,klar das es Probleme gibt. Denn das ist nicht möglich in PAWN.

    Zitat

    er wurde schonmal gebannt.
    Dan entbannt


    jetzt ist er wieder entbannt


    Und schon in dem "alten" Thread habe ich geschrieben,dass er wegen zu vielen Verwarnungen gesperrt wurde. Jetzt ist es wieder das Gleiche, dein Thread macht daher auch wenig Sinn.

    Zitat

    ließ mal oben den letzen satz ;D


    Ließ du doch mal den alten Thread :| .
    Ich verlinke daher nochmal:
    http://forum.sa-mp.de/allgemei…-rainer-lernst-du-es-nie/


    Abschließend wird natürlich geschlossen.



    //Edit:
    Damit du beim nächsten mal sperren nicht wieder auf die Idee kommst,erneut so einen Thread zu erstellen, entfern ich die Begründung.