Beiträge von Jeffry

    Geht sowas noch ?

    Ja, es würde noch gehen, aber wie wie schon von den Vorrednern gesagt, ist es nicht zu empfehlen, außer man weiß zu 100% was man macht.
    Gehen würde es mit mysql_query.
    https://wiki.sa-mp.com/wiki/MySQL/R40#mysql_query


    Daher, wenn, dann nur mit Bedacht nutzen.
    Wenn in deinem Fall die Funktion nur aus einem (oder mehreren) Befehlen heraus, immer nur für einen Name verwendet wird, dann könnte man das durchgehen lassen, weil es den Aufbau vom Code natürlich deutlich einfacher und übersichtlicher macht, als wenn man bei 20 Befehlen 20 unterschiedliche Callbacks macht, oder alles in eins mit switch packt.
    Wichtig ist auf jeden Fall, cache_delete() danach zu nutzen.

    Du sprengst das Array, da [pInfo[playerid][pTicketID] INVALID_PLAYER_ID ist, wenn du noch nicht im Live-Chat bist.
    Schreibe es so:
    ocmd:closeticket(playerid)
    {
    if(pInfo[playerid][pTicketCreate] == 0 && pInfo[playerid][pTicketID] == INVALID_PLAYER_ID)return 1;
    if(pInfo[playerid][pTicketID] != INVALID_PLAYER_ID)
    {
    SCM(pInfo[playerid][pTicketID], COLOR_TICKET, "Deine Ticket Verbindung wurde unterbrochen, Grund: Partner hat den Reportmodus verlassen.");
    pInfo[pInfo[playerid][pTicketID]][pTicketID] = INVALID_PLAYER_ID;
    }
    pInfo[playerid][pTicketID] = INVALID_PLAYER_ID;
    pInfo[playerid][pTicketCreate] = 0;
    SCM(playerid, COLOR_TICKET, "Du hast das Ticket geschlossen/gelöscht.");
    return 1;
    }

    Einfach ist immer relativ. Deine Variante ist auch eine mögliche Lösung, die durchaus vom Code her einfach gehalten ist, dafür durch das Array mehr Speicher benötigt.
    Das kannst du problemlos so umsetzen (meinen Hinweis beim format noch beachten).


    Also um deine eigentliche Frage zu beantworten: Ja, die Methode macht Sinn und kann so genutzt werden.

    dass diese Methode nicht mehr funktioniert, wenn jemand in der Zeit wo der Dialog offen ist disconnected oder ein Ticket schließt, was zuvor offen war.

    Ja, daher:

    so habe ich es damals auf meinem Server gemacht, über die Funktion ShowPlayerDialog (Hook oder eigene Funktion, die dann ShowPlayerDialog aufruft, ist egal), die Dialog-ID in eine Spieler-Variable speichern, und wenn dann jemand ein Ticket aufmacht, automatisch prüfen, ob ein Spieler den Ticket-Dialog offen hat, wenn ja, ihm den Dialog neu anzeigen, damit die Einträge aktualisiert werden, sobald ein neues Ticket kommt, bzw. sobald jemand anderes ein Ticket angenommen hat.

    Das kann natürlich für jeden Fall gemacht werden, ob Disconnect, Beenden des Tickets, Annahme, Eröffnung, Update, etc.


    Alternativ, ist aber nicht so schön, könnte man auch über den inputtext den Name auslesen und mit dem Name der "gefundenen" playerid "i" gegenprüfen, ob das noch passt, wenn nicht, eine Meldung ausgeben und den Dialog neu anzeigen.
    Ich würde aber die automatisch aktualisierende Methode wie beschrieben empfehlen.

    Macht mein aktueller Code Sinn? War auf jeden Fall eine Idee von mir, das so zu gestalten.

    Du kannst es auch ganz ohne Variable machen.
    if(!strcmp(call, "sticket", true))
    {
    for(new i, j = GetMaxPlayers(); i<j; i++)
    {
    if(LoggedIn(i) == false) continue;
    if(pInfo[i][pTicketCreate] == 0) continue;
    format(string, sizeof string, "%s%s - Datum: %s\n", string, getName(i), pInfo[i][pTicketDate]); //Angepasst, in deinem Code würde es nur das letzte Ticket anzeigen
    }
    ShowPlayerDialog(playerid, D_STICKET, DIALOG_STYLE_LIST, "Offene Tickets.", string, "Wählen", "Schließen");

    Und bei OnDialogResponse:
    new count;
    for(new i, j = GetMaxPlayers(); i<j; i++)
    {
    if(LoggedIn(i) == false) continue;
    if(pInfo[i][pTicketCreate] == 0) continue;
    if(count == listitem)
    {
    //Ticket von playerid "i" wird bearbeitet.
    return 1;
    }
    count++;
    }


    Zusätzlich könntest du, so habe ich es damals auf meinem Server gemacht, über die Funktion ShowPlayerDialog (Hook oder eigene Funktion, die dann ShowPlayerDialog aufruft, ist egal), die Dialog-ID in eine Spieler-Variable speichern, und wenn dann jemand ein Ticket aufmacht, automatisch prüfen, ob ein Spieler den Ticket-Dialog offen hat, wenn ja, ihm den Dialog neu anzeigen, damit die Einträge aktualisiert werden, sobald ein neues Ticket kommt, bzw. sobald jemand anderes ein Ticket angenommen hat.

    Musste leider nen Screenshot machen:

    Der Define von MAX_GWZONES muss entweder exakt der Anzahl an GW-Zonen entsprechen, oder du machst das einfach raus.
    new GangwarZones[][gangwar_daten] =


    Den Define könntest du dann, falls du diesen woanders noch nutzt, auch so schreiben:
    #define MAX_GWZONES sizeof(GangwarZones)


    Dann musst du nirgends einen festen Wert angeben.

    Ja, das ist klar. Ich verstehe das Prinzip dahinter schon.
    Nur was soll die Funktion denn dann zurück geben, wenn nicht wie benannt die HouseID? Den Index aus dem Haus Array? Welchen Wert erwartest du zurück?

    Das macht aber keinen Sinn, die Funktion heißt doch, dass die Haus ID zurück gegeben wird.
    Hast du den Code mal so geändert wie ich es dir gesagt habe, und dann ausprobiert?

    Da ich ja in der Funktion wirklich den Index Integer ausgeben möchte.

    GetMyGroupHouseID soll doch aber nicht den Index der Gruppe ausgeben, sondern die ID des Hauses.
    Ansonsten macht die Bezeichnung der Funktion keinen Sinn, oder?



    ((WIESO SCHREIBT ER BEI MIR ALLES KURSIV ?))

    Weil du einen Code zitiert hast, der [i] enthält, das ist der Start für "kursiv-schreiben".

    Probier mal so

    Die Apostrophen werden benötigt, wenn ein String übergeben wird, bei Integern ist es nicht zwingend notwendig.
    UPDATE users SET name = 'Max Mustermann' WHERE id = %i


    sprich anstelle des Apostroph ein Backtick

    Die Backticks werden nur bei Spalten-Namen benötigt, die z.B. eine SQL-Funktion darstellen.
    Beispiel: alter
    Dann wäre folgendes nötig: UPDATE users SET `alter` = 18 WHERE id = %i


    Backticks beim Wert sind syntaktisch nicht möglich.



    Hat niemand eine Idee ?

    Deine GetMyGroupHouseID gibt einen falschen Wert zurück, und zwar den Index der Gruppe im Array (i).
    Ändere dort
    if(Group[i][gSQL] != 0 && Group[i][gHouse] == pInfo[playerid][pGHouse])return i;
    zu:
    if(Group[i][gSQL] != 0 && Group[i][gSQL] == pInfo[playerid][pGroup]) return Group[i][gHouse];

    Vielen Dank, wiedermal!
    Kannst du mir noch kurz erklären, wieso "id" dazu führte, dass das erste aber sonst keins funktioniert hat?


    Gerne!
    Das Problem mit "id" ist, dass das der Index des Arrays cInfo ist, aber nicht unbedingt auch die Zeile aus dem Datenbank Ergebnis. Wenn du zuvor schon zwei Fahrzeuge erstellt hast, steht id auf 2, i jedoch erst auf 0. Damit kommt eine Abweichung zu Stande, die dann irgendwelche oder in deinem Fall keine Werte mehr ausgibt.


    Also grob gesagt: id hat nicht zwingend den gleichen Wert wie i. Es kann die gleichen Werte haben, Voraussetzung ist dann aber, dass (in diesem Beispiel) noch kein Fahrzeug in cInfo steht, wenn die Daten eingelesen werden.

    Jetzt stehe ich allerdings vor folgendem Problem und zwar werden alle Werte wie Geld, Kills etc. nach jedem ausloggen auf 0 gesetzt & dementsprechend mit 0 wieder geladen beim Connecten.

    Nach dem Login sollten die Daten wieder geladen werden, vor dem Login steht natürlich alles auf 0.
    Wenn du kein serverside-Money hast, dann kannst du auch bei SaveUserStats das PlayerInfo[playerid][pMoney] durch ein GetPlayerMoney(playerid) ersetzen, dann sollte das Standardgeld gespeichert und geladen werden.



    Laut Tutorial wir bei jedem einloggen alles auf 0 gesetzt

    Das stimmt nicht. Die Daten werden nach dem Login unter OnUserLogin aus der Datenbank geladen.

    Das MySQL Plugin erfordert unter Umständen noch folgende Runtime: https://www.microsoft.com/en-us/download/details.aspx?id=22


    Außerdem passt dein Streamer nicht zum Code, da muss eventuell noch so manches angepasst werden.


    Grundsätzlich ist es nicht zu empfehlen, irgendwelche Gamemodes zu nutzen, die man zugesendet bekommen hat, und von denen man keinerlei Ahnung hat.
    Setze dich mit dem Ersteller des Gamemodes in Verbindung und frage nach, welche Plugin Version benötigt wird, bzw. er soll dir die Plugins zur Verfügung stellen.

    Das kann man auch mit dem gespeicherten Cache machen, wie es in dem anderen Tutorial beschrieben ist. Von der Performance her wäre das was die Abfrage an die Datenbank angeht besser, da nur eine anstatt zwei gemacht wird, dafür muss der Cache gespeichert und geladen werden. Bei einer einzelnen Abfrage macht das keinen merklichen Unterschied.


    Beide Varianten kannst du ohne Bedenken nutzen.