Wahlsystem - Bei Parteiauswahl wird nur ID 1 genommen

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, ich bin gerade dabei ein Wahlsystem für Parteien zu machen.
    Leider ist mir ein Fehler unterlaufen:
    Im Dialog, wenn ich eine Partei wählen möchte, kann ich immer nur die Partei mit der ID 1 wählen. Und das ist egal, welches ich anklicke.
    Jeffry: :love:
    Befehl:



    COMMAND:wahl(playerid,params[])
    {
    #pragma unused params
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,WRONGCMD,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,WRONGCMD,"BENUTZE: /back");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,GRAU,"Du bist im Prison.");
    if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,GRAU,"Du bist Tot.");
    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,GRAU,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,GRAU,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,GRAU,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,GRAU,"Du bist gefesselt.");
    if(WahlenOffen == 0)return SendClientMessage(playerid, GRAU, "Es sind keine Wahlen offen.");
    new string[612],count;
    for(new p=1;p<MAX_PARTEI;p++)
    {
    if(PartInfo[p][ParteiCreatet] != 0 && PartInfo[p][ParteiAusgeschlossen] == 0)
    {
    format(string,sizeof(string),"Partei: %s | Gründer: %s\n%s",PartInfo[p][ParteiName],PartInfo[p][ParteiOwner],string);
    ShowPlayerDialog(playerid,DIALOG_PARTEIWAEHLEN,DIALOG_STYLE_LIST,""#SERVERFARBE""#SERVERNAME"{FFFFFF}: Parteien",string,"Verlassen","");
    count++;
    }
    }
    if(count == 0)return SendClientMessage(playerid, GRAU, "Es existieren keine Parteien zum wählen.");
    return 1;
    }



    Dialog:

    case DIALOG_PARTEIWAEHLEN:
    {
    new string[128], query[128];
    if(response == 0)
    {
    return 1;
    }
    else
    {
    for(new p=1;p<MAX_PARTEI;p++)
    {
    if(Spieler[playerid][pParteiGewaehlt] == 1)return SendClientMessage(playerid, GRAU, "Du hast bereits eine Partei gewählt.");
    Spieler[playerid][pParteiGewaehlt] = 1;
    PartInfo[p][ParteiStimmen]++;
    format(string,sizeof(string),"Du hast für die Partei '%s' gewählt.",PartInfo[p][ParteiName]);
    SendClientMessage(playerid,WEISS,string);
    format(query,sizeof(query),"UPDATE "#SQL_TAG"_partei SET ParteiStimmen = %d WHERE ParteiName= '%s'",PartInfo[p][ParteiStimmen],PartInfo[p][ParteiName]);
    mysql_function_query(MySqlConnection,query,false,"","");
    return 1;
    }
    }
    return 1;
    }

  • format(string,sizeof(string),"Partei: %s | Gründer: %s\n%s",PartInfo[p][ParteiName],PartInfo[p][ParteiOwner],string);

    Der alte string muss an den Anfang. Es müsste also so aussehen:format(string,sizeof(string),"%s\nPartei: %s | Gründer: %s",string,PartInfo[p][ParteiName],PartInfo[p][ParteiOwner]);


    Nachtrag:
    Ups, erst im Nachhinein gemerkt, dass das gar nicht der Fehler war..
    Kannste aber trotzdem so machen :P

    Einmal editiert, zuletzt von FineTime ()

  • 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.

  • So in etwa. Ich verstehe es nicht, was er meint.
    Ich habe bereits das return entfernt. Ich weiß jetzt nur nicht, wie ich das mit den listitem einfügen soll. Ich versuche aber gerade was, gerade am compilen.
    EDIT: hat nicht funktioniert..

    Einmal editiert, zuletzt von aytef ()

  • Du musst das return weg machen damit er die Schleife weiter gehen kann.


    Er muss die Schleife mit break abbrechen, nachdem er gewählt hat oder täusch ich mich da bei dem, was Goldkiller schrieb? ?(



    for(new p=1;p<MAX_PARTEI;p++)
    {
    if(Spieler[playerid][pParteiGewaehlt] == 1)return SendClientMessage(playerid, GRAU, "Du hast bereits eine Partei gewählt.");
    Spieler[playerid][pParteiGewaehlt] = 1;
    PartInfo[p][ParteiStimmen]++;
    format(string,sizeof(string),"Du hast für die Partei '%s' gewählt.",PartInfo[p][ParteiName]);
    SendClientMessage(playerid,WEISS,string);
    format(query,sizeof(query),"UPDATE "#SQL_TAG"_partei SET ParteiStimmen = %d WHERE ParteiName= '%s'",PartInfo[p][ParteiStimmen],PartInfo[p][ParteiName]);
    mysql_function_query(MySqlConnection,query,false,"","");
    break;
    }
    }


    So ungefähr sollte das ganze ausschauen.

  • Ich finde es iwie sinnlos eine for Schleife zu machen und diese dann in der letzten Ausgabefolge abzubrechen. Dann kann man gleich die schleife weglassen, da sie eh nur 1x durchläuft.
    Man benutzt break, wenn man sie unter bestimmten Bedingungen abbrechen will, zB if( p = 8 ) break; oder so, doofes Beispiel aber dann würde es abgebrochen, wenn p = 8 ist, also die 8. Partei erreicht ist ^^


    Also kurz: Unnötige Schleife wie du ebend gerade selbst gepostet hast :D


    //edit: Das problem was ich nun sehe ist folgendes: in dem /wahl CMD hast du eine for schleife die in abhängigkeit der Parteianzahl funktioniert. Nun wird aber bei jeder Partei die es gibt ein Dialog angezeigt, also wenn es 16Fraktionen gibt wird am ende nur der 16. Dialog angezeigt.
    Ich weiss nicht ob das auch in PAWN geht, ich benutze Shoebill/Java, aber vielleicht kann man ja einen listdialog erstellen und dann jedes mal Items hinzufügen, halt als eintragungen diese Fraktionen. Andernseits einfach in der for schleife den String immer zusammenfügen und vor dem zusammenfügen mit \n trennen und am ende ausgeben/zum Dialog hinzufügen (das heißt Dialog erst nach der for - Schleife), keine Ahnung ob das auch für nen Dialog klappt ^^

  • Ich versuche das mal. Danke schon mal :)
    EDIT: Also, das Problem bleibt wie sonst auch. Egal welche Partei ich anklicke, es wird immer die erste Partei ausgewählt..
    Ich habe das jetzt mit ListItem ausprobiert, hat aber auch nicht funktioniert.

    Einmal editiert, zuletzt von aytef ()

  • Falls bis morgen (bzw in ein paar Stunden^^) noch niemand etwas hier gemacht hat werde ich gerne mir das richtig anschauen, ist schon 2 ^^
    Poste dann bitte mal deinen Code mit Listdialog, vielleicht hast du die Items falsch geaddet oder den Dialog schon in der for schleife ausgegeben..

  • So ich habe das Problem gefunden, aber nicht gelöst.
    Ich habe jetzt über die Datenbank eine weitere Partei erstellt. Im Spiel habe ich dann die angeklickt und habe dann die Nachricht bekommen, dass ich die Partei mit der ID 2 augewählt habe.
    Heißt: Die ListItems sind "verruscht"
    Beispiel: Klickt man das erste ListItem an, wähle ich keins aus (ID NULL). Klickt man auf das zweite ListItem wähle ich nochmal die 1 aus (ID 1). Klickt man aber das dritte Item an, wähle ich 2 aus (ID 3).



    case DIALOG_PARTEIWAEHLEN:
    {
    new string[128], query[128];
    if(response == 0)return 1;
    else
    {
    if(Spieler[playerid][pParteiGewaehlt] == 1)return SendClientMessage(playerid, GRAU, "Du hast bereits eine Partei gewählt.");
    Spieler[playerid][pParteiGewaehlt] = 1;
    PartInfo[listitem][ParteiStimmen]++;
    format(string,sizeof(string),"Du hast für die Partei '%s' gewählt.",PartInfo[listitem][ParteiName]);
    SendClientMessage(playerid,WEISS,string);
    format(query,sizeof(query),"UPDATE "#SQL_TAG"_partei SET ParteiStimmen = %d WHERE ParteiName= '%s'",PartInfo[listitem][ParteiStimmen],PartInfo[listitem][ParteiName]);
    mysql_function_query(MySqlConnection,query,false,"","");
    }
    return 1;
    }



    COMMAND:wahl(playerid,params[])
    {
    #pragma unused params
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,WRONGCMD,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,WRONGCMD,"BENUTZE: /back");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,GRAU,"Du bist im Prison.");
    if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,GRAU,"Du bist Tot.");
    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,GRAU,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,GRAU,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,GRAU,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,GRAU,"Du bist gefesselt.");
    if(WahlenOffen == 0)return SendClientMessage(playerid, GRAU, "Es sind keine Wahlen offen.");
    new string[612],count;
    for(new p=1;p<MAX_PARTEI;p++)
    {
    if(PartInfo[p][ParteiCreatet] != 0 && PartInfo[p][ParteiAusgeschlossen] == 0)
    {
    format(string,sizeof(string),"%s\nPartei: %s | Gründer: %s",string,PartInfo[p][ParteiName],PartInfo[p][ParteiOwner]);
    count++;
    }
    }
    ShowPlayerDialog(playerid,DIALOG_PARTEIWAEHLEN,DIALOG_STYLE_LIST,""#SERVERFARBE""#SERVERNAME"{FFFFFF}: Parteien",string,"Verlassen","");
    if(count == 0)return SendClientMessage(playerid, GRAU, "Es existieren keine Parteien zum wählen.");
    return 1;
    }



    EDIT: Ich habe den Fehler behoben, in dem ich einfach bei z.b. PartInfo[listitem][ParteiName] ein listitem+1 gemacht habe. Ich bedanke mich dennoch herzlich, bei jedem Hilfeversuch. :)

  • Schön dass du es gelöst hast, sogar am Ende noch alleine :) Doch eines wundert mich die ganze Zeit:


    Du hast das in der for-Schleife zu stehen:

    Code
    for(new p=1;p<MAX_PARTEI;p++)


    Wie kannst du eine Partei 0 bekommen, wenn die Schleife bei 1 startet und sich linear erhöht? :D


    Und dein Lösungsweg ist logisch ^^
    Deine Parteien starten bei 1, das listitem bei 0, deshalb listitem + 1 :D

  • 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.

  • Goldkiller:
    Ich hätte jetzt gedacht, dass wenn ich das listitem 2 auswähle der Wert 3 ist, da der Wert von listitem (zB 2) mit 1 addiert wird -> 1 + 2 = 3 --> Partei 3 für das 3. Listitem mit Wert 2 (0,1,2) ? :D