Kleine Frage zu Dialogen

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
  • Ich hätte da eine Kleine fragen bezüglich zu Dialogen.
    Und zwar geht es darum Ich habe ein Garagen System angefangen und Wollte das wenn man die Autos aus der Garage rausholt das die in einem Listen-Dialog untereinander mit Nummerierung aufgereiht sind
    z.B
    1. Fahrzeug 411
    2 Fahrzeug 560
    Nun ist meine Frage wie man dies umsetzen könnte.
    Ich habe so mit dem Code angefangen:
    if(listitem == 1)
    {
    if(PrivatCarInfo[playerid][pfStored] == 1)
    {
    for(new i; i < 5; i++)
    {
    format(string, sizeof(string), "{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", i, PrivatCarInfo[playerid][pfModel]);
    ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    }
    }
    nur glaube ich das die for schleife falsch ist weil nur ein Auto immer nur angezeigt wird.
    Hoffe mir kann das prinzip einer Erklären.


    MfG
    Jonny

  • Du musst den String immer wieder "mitnehmen":
    if(listitem == 1)
    {
    if(PrivatCarInfo[playerid][pfStored] == 1)
    {
    for(new i; i < 5; i++)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, i, PrivatCarInfo[playerid][pfModel][i]); //Ich habe das [i] hinzugefügt, ich nehme an das ist ein Array.
    }
    ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    }
    }

  • So sieht das komplette Dialog aus.
    if(dialogid == DIALOG_GARAGE)
    {
    if(response)
    {
    if(listitem == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist in keinem Fahrzeug!");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist nicht der Fahrer des Fahrzeuges!");
    if(HouseInfo[house][hgInside] >= HouseInfo[house][hgMaxAutos])
    {
    SendClientMessage(playerid, COLOR_RED, "[ERROR] Deine Garage ist voll!");
    }
    else
    {
    HouseInfo[house][hgInside] ++;
    PrivatCarInfo[playerid][pfStored] = 1;
    DestroyVehicle(PrivatCarInfo[playerid][pf_IDx]);
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich in der Garage abgestellt.");
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[playerid][pfStored], PrivatCarInfo[playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    }
    if(listitem == 1)
    {
    if(listitem == 1)
    {
    if(PrivatCarInfo[playerid][pfStored] == 1)
    {
    for(new i; i < 5; i++)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, i, PrivatCarInfo[playerid][pfModel]);
    }
    ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    }
    }
    }
    }
    }

  • Das System ist auf nur ein Fahrzeug ausgelegt.
    Um mehrere Fahrzeuge zu speichern, benötigt "PrivatCarInfo" eine weitere Dimension, sprich:
    new PrivatCarInfo[MAX_PLAYERS][MAX_MOEGLICHE_AUTOS][enumName];
    Die zweite ist neu.


    Dafür muss dann das ganze PrivatCarInfo-System angepasst werden.

  • So einfach geht das nicht.
    Die hinzuzufügende Dimension ist das MAX_MOEGLICHE_AUTOS.


    Und danach müssen alle Codes wie folgt angepasst werden:
    DestroyVehicle(PrivatCarInfo[playerid][pf_IDx]);
    zu:
    new idx = GetVehicleIdx(playerid, GetPlayerVehicleID(playerid));
    DestroyVehicle(PrivatCarInfo[playerid][idx][pf_IDx]);


    Dazu musst du eine Funktion erstellen, um über die ID des Fahrzeugs den Index herauszufinden.
    stock GetVehicleIdx(playerid, vehicleid)
    {
    for(new i; i < MAX_MOEGLICHE_AUTOS; i++)
    {
    if(PrivatCarInfo[playerid][i][pf_IDx] == vehicleid) return i;
    }
    return -1;
    }



    Und wie gesagt, es müssen alle Codes entsprechend angepasst werden.
    Das kann von Funktion zu Funktion anders aussehen, da musst du alle Fälle einzeln prüfen und anpassen. In 5 Minuten ist das nicht gemacht.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Ja, da die "1000" in deinem Fall für die playerid steht.
    Dort trägst du am besten "MAX_PLAYERS" ein, das ist besser, da 1000 nicht notwendig sein wird.
    Danach fehlt dann die zweite Dimension der maximal möglichen Fahrzeuge (5). Erst dann darf das enum kommen.


    #define MAX_MOEGLICHE_AUTOS 5
    new PrivatCarInfo[MAX_PLAYERS][MAX_MOEGLICHE_AUTOS][carEnum];


    Die Erweiterung von 2 auf 3 Dimensionen zieht damit nach sich, dass alles angepasst werden muss, was mit PrivatCarInfo zu tun hat, da alles um die eine Dimension erweitert werden muss.
    Das geht leider nicht anders.

  • Okay jetzt habe ich wirklich alles umgestellt.
    Aber es ist immer noch wie im oberen Screenshot das alle 5 Nummerierung die Fahrzeug ID 560 haben aber das dialog soll ja nur 2 fahrzeuge zeigen
    Einmal den Infernus 411 und dann den Sultan 560.

    Einmal editiert, zuletzt von JOK3R ()

  • Hab das System komplett mal umgeändert
    if(dialogid == DIALOG_GARAGE)
    {
    if(response)
    {
    if(listitem == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist in keinem Fahrzeug!");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist nicht der Fahrer des Fahrzeuges!");
    if(HouseInfo[house][hgInside] >= HouseInfo[house][hgMaxAutos])
    {
    SendClientMessage(playerid, COLOR_RED, "[ERROR] Deine Garage ist voll!");
    }
    else
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    HouseInfo[house][hgInside] ++;
    PrivatCarInfo[slot][playerid][pfStored] = 1;
    DestroyVehicle(PrivatCarInfo[slot][playerid][pf_IDx]);
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich in der Garage abgestellt.");
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[slot][playerid][pfStored], PrivatCarInfo[slot][playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    }
    }
    if(listitem == 1)
    {
    if(listitem == 1)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    if(PrivatCarInfo[slot][playerid][pfStored] == 1)
    {
    for(new i; i < HouseInfo[house][hgInside]; i++)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, i, PrivatCarInfo[slot][playerid][pfModel]);
    }
    ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    }
    }
    }
    }
    }
    }
    if(dialogid == DIALOG_GARAGE2)
    {
    if(response == 1)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    PrivatCarInfo[slot][playerid][pf_IDx] = CreateVehicle(PrivatCarInfo[slot][playerid][pfModel], HouseInfo[house][hgX], HouseInfo[house][hgY], HouseInfo[house][hgZ], PrivatCarInfo[slot][playerid][pfR], PrivatCarInfo[slot][playerid][pfCarColor1], PrivatCarInfo[slot][playerid][pfCarColor2], 0);
    Tankmenge[PrivatCarInfo[slot][playerid][pf_IDx]] = GasMax[GetVehicleModel(PrivatCarInfo[slot][playerid][pf_IDx])-400];
    format(string,sizeof(string),"%s", PrivatCarInfo[slot][playerid][pfKennzeichen]);
    SetVehicleNumberPlate(PrivatCarInfo[slot][playerid][pf_IDx], string);
    HouseInfo[house][hgInside] --;
    PrivatCarInfo[slot][playerid][pfStored] = 0;
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich aus der Garage rausgeholt.");
    PutPlayerInVehicle(playerid, PrivatCarInfo[slot][playerid][pf_IDx], 0);
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[slot][playerid][pfStored], PrivatCarInfo[slot][playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE, DIALOG_STYLE_TABLIST_HEADERS, "{FFFF00}Garagenmenü",
    "#\tOption\n\
    {FFFF00}1.\t{FFFFFF}Parken\n\
    {FFFF00}2.\t{FFFFFF}Rausnehmen", "Auswählen", "Abbrechen");
    }
    }
    Aber da es kommt immer noch das Dialog wo steht das ich keine Fahrzeuge in der Garage habe.

  • Der Code muss so aussehen:
    if(listitem == 1)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    if(PrivatCarInfo[slot][playerid][pfStored] == 1)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, slot, PrivatCarInfo[slot][playerid][pfModel]);
    }
    }
    if(!strlen(string)) ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    else ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }


    Außerdem lagerst du beim Ein- und Auslagern immer alle slots ein bzw. aus.
    Da musst du noch eine Abfrage einbauen, für welchen Slot das gemacht werden muss.

  • Beim Kauf musst du entsprechend prüfen, bei welchem slot die vehicleid 0 ist, sprich welcher leer ist.

    Hierfür ja.



    Mit der GetVehicleIdx Funktion aus Post #8. Die kannst du ja auch zu GetVehicleSlot umbenennen.

    Hierfür nein. Hier musst du prüfen, ob die vehicleid mit der aus dem Array passt.
    Funktion siehe Post #8 (habe das gerade nochmal angepasst, da ich die playerid vergessen hatte).
    Vom Prinzip her ähnlich wie deine Funktion, nur dass du nicht gegen 0 prüfst, sondern gegen die vehicleid:
    getCarID(playerid, vehicleid)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    if(PrivatCarInfo[slot][playerid][pf_IDx]==vehicleid)return slot;
    }
    return -1;
    }



    Achte außerdem darauf, dass du in beiden Funktionen nicht 0 am Ende zurück gibst. 0 ist auch ein slot, nämlich der erste.

  • Hab das mal so überarbeitet so sollte das eigentlich klappen so wie du mir das jetzt erklärt hast.
    if(dialogid == DIALOG_GARAGE)
    {
    if(response)
    {
    if(listitem == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist in keinem Fahrzeug!");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist nicht der Fahrer des Fahrzeuges!");
    if(HouseInfo[house][hgInside] >= HouseInfo[house][hgMaxAutos])
    {
    SendClientMessage(playerid, COLOR_RED, "[ERROR] Deine Garage ist voll!");
    }
    else
    {
    new idx = GetVehicleSlot(playerid, GetPlayerVehicleID(playerid));
    HouseInfo[house][hgInside] ++;
    PrivatCarInfo[idx][playerid][pfStored] = 1;
    DestroyVehicle(PrivatCarInfo[idx][playerid][pf_IDx]);
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich in der Garage abgestellt.");
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[idx][playerid][pfStored], PrivatCarInfo[idx][playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    }
    if(listitem == 1)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    if(PrivatCarInfo[slot][playerid][pfStored] == 1)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, slot, PrivatCarInfo[slot][playerid][pfModel]);
    }
    }
    if(!strlen(string)) ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    else ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }
    }
    }


    Nur ist jetzt halt das mit dem rausholen noch anders. Ich habe Zwei Autos in der Garage aber ich kann nur eins rausholen. Wenn ich das Dialog nochmal öffne kommt das Dialog mit Du hast kein Fahrzeug mehr in der Garage.
    Ich hab es auch mit GetVehicleSlot versucht aber ohne erfolgt denn dort passiert nichts.
    if(dialogid == DIALOG_GARAGE2)
    {
    if(response == 1)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    PrivatCarInfo[slot][playerid][pf_IDx] = CreateVehicle(PrivatCarInfo[slot][playerid][pfModel], HouseInfo[house][hgX], HouseInfo[house][hgY], HouseInfo[house][hgZ], PrivatCarInfo[slot][playerid][pfR], PrivatCarInfo[slot][playerid][pfCarColor1], PrivatCarInfo[slot][playerid][pfCarColor2], 0);
    Tankmenge[PrivatCarInfo[slot][playerid][pf_IDx]] = GasMax[GetVehicleModel(PrivatCarInfo[slot][playerid][pf_IDx])-400];
    format(string,sizeof(string),"%s", PrivatCarInfo[slot][playerid][pfKennzeichen]);
    SetVehicleNumberPlate(PrivatCarInfo[slot][playerid][pf_IDx], string);
    HouseInfo[house][hgInside] --;
    PrivatCarInfo[slot][playerid][pfStored] = 0;
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich aus der Garage rausgeholt.");
    PutPlayerInVehicle(playerid, PrivatCarInfo[slot][playerid][pf_IDx], 0);
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[slot][playerid][pfStored], PrivatCarInfo[slot][playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE, DIALOG_STYLE_TABLIST_HEADERS, "{FFFF00}Garagenmenü",
    "#\tOption\n\
    {FFFF00}1.\t{FFFFFF}Parken\n\
    {FFFF00}2.\t{FFFFFF}Rausnehmen", "Auswählen", "Abbrechen");
    }
    }

  • new idx = GetVehicleSlot(playerid, GetPlayerVehicleID(playerid));

    Beim Speichern in die Garage ist das hier falsch. Du darfst nicht dem dem Slot des Fahrzeugs suchen, sondern musst einen leeren Slot suchen.
    Sprich:
    new idx = GetVehicleSlot(playerid, 0);



    Ich habe Zwei Autos in der Garage aber ich kann nur eins rausholen.

    Dein Code holt immer alle Autos raus.
    Schreibe es so:
    if(dialogid == DIALOG_GARAGE2)
    {
    if(response == 1)
    {
    new slot, count;
    for(new i=0;i<MAX_PLAYER_VEHS;i++)
    {
    if(PrivatCarInfo[i][playerid][pfStored] == 1)
    {
    if(count == listitem)
    {
    slot = i;
    break;
    }
    }
    }
    PrivatCarInfo[slot][playerid][pf_IDx] = CreateVehicle(PrivatCarInfo[slot][playerid][pfModel], HouseInfo[house][hgX], HouseInfo[house][hgY], HouseInfo[house][hgZ], PrivatCarInfo[slot][playerid][pfR], PrivatCarInfo[slot][playerid][pfCarColor1], PrivatCarInfo[slot][playerid][pfCarColor2], 0);
    Tankmenge[PrivatCarInfo[slot][playerid][pf_IDx]] = GasMax[GetVehicleModel(PrivatCarInfo[slot][playerid][pf_IDx])-400];
    format(string,sizeof(string),"%s", PrivatCarInfo[slot][playerid][pfKennzeichen]);
    SetVehicleNumberPlate(PrivatCarInfo[slot][playerid][pf_IDx], string);
    HouseInfo[house][hgInside] --;
    PrivatCarInfo[slot][playerid][pfStored] = 0;
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich aus der Garage rausgeholt.");
    PutPlayerInVehicle(playerid, PrivatCarInfo[slot][playerid][pf_IDx], 0);
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[slot][playerid][pfStored], PrivatCarInfo[slot][playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE, DIALOG_STYLE_TABLIST_HEADERS, "{FFFF00}Garagenmenü",
    "#\tOption\n\
    {FFFF00}1.\t{FFFFFF}Parken\n\
    {FFFF00}2.\t{FFFFFF}Rausnehmen", "Auswählen", "Abbrechen");
    }
    }