Spieler Protokoll ~ 10 Einträge pro Dialog Seite

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

  • Spieler Protokoll ~ 10 Einträge pro Dialog Seite

    Leider führt er den Code nicht ordnungsgemäß aus.
    Auch wenn ich einen fehlenden Datensatz suchen möchte, gibt er mir die Fehlermeldung nicht aus.
    Ich möchte dass das System mir pro Seite im Dialog, 10-20 Einträge Zeigt vom Spieler.
    Ich habe auch gemerkt, das der Code ziemlich Recourcenfressend ist, die Dateigröße wurde auf einen Schwung viel größer.

    Quellcode:

    PAWN-Quellcode

    1. ocmd:pp(playerid, params[])
    2. {
    3. if(pInfo[playerid][pAdmin] < 6)return 1;
    4. new query[256];
    5. if(sscanf(params, "s", query))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
    6. mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e'", query),
    7. mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
    8. return 1;
    9. }
    10. case PLAYER_QUERY_PPROTOCOL:
    11. {
    12. if(!rows)return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
    13. SetPVarInt(playerid, "ProtocolStep", rows);
    14. new str[1024];
    15. str = "Datum\tUhrzeut\tInhalt\n";
    16. for(new i;i<rows;i++)
    17. {
    18. cache_get_value_name(i, "Datum", ProtocolRead[playerid][i][0], 600),
    19. cache_get_value_name(i, "Uhrzeit", ProtocolRead[playerid][i][1], 600),
    20. cache_get_value_name(i, "Inhalt", ProtocolRead[playerid][i][2], 600);
    21. if(i <= 9)
    22. {
    23. if(strlen(ProtocolRead[playerid][i][2]) > 0)
    24. {
    25. format(str, sizeof str, "%s%s\t%s\t%s\n", str, ProtocolRead[playerid][i][0], ProtocolRead[playerid][i][1], ProtocolRead[playerid][i][2]);
    26. }
    27. }
    28. }
    29. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", "");
    30. }
    31. case D_PP:
    32. {
    33. if(!response || listitem || GetPVarInt(playerid, "ProtocolStep") >= countProtoStep(playerid))
    34. {
    35. SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
    36. return 1;
    37. }
    38. query = "Datum\tUhrzeit\tInhalt\n";
    39. for(new k = GetPVarInt(playerid, "ProtocolStep"), i; i<k+10;i++)
    40. {
    41. format(query, sizeof query, "%s%s\t%s\t%s", ProtocolRead[playerid][i][0], ProtocolRead[playerid][i][1], ProtocolRead[playerid][i][2]),
    42. SetPVarInt(playerid, "ProtocolStep", GetPVarInt(playerid, "ProtocolStep") + 1);
    43. }
    44. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", query, "Schließen", "");
    45. }
    46. stock countProtoStep(playerid)
    47. {
    48. new counter;
    49. for(new i;i<sizeof ProtocolRead;i++)
    50. {
    51. if(strlen(ProtocolRead[playerid][i][2]) > 0)counter ++;
    52. }
    53. return counter;
    54. }
    Alles anzeigen
    Рыба лично :rolleyes:
  • Mal 2 ganz blöde Fragen.

    1. Nutzt du ProtocolRead nur in diesen Codes?
    2. Wie hast du das deklariert?
    3. Mal ein paar Hinweise generell wegen der Performanz.
      1. Nutze LIMIT in deinen SQL Abfragen. Das ist hier auch der Schlüssel, wie du das elegant hier alles lösen kannst. Dann brauchst du keine komischen if-Abfragen wie in Zeile 22. (Wenn du schon sowas nutzt, dann auch ein break, sonst läuft die Schleife ja sinnlos weiter xD)
      2. Deine String-größen sind nicht wirklich optimal gewählt...allein bei deinem CMD kannst du 64, statt 256 verwenden.


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Ja, nutze ProtocolRead nur in diesen Codes.
    Ich habe noch nicht mit LIMIT gearbeitet und daher ist es mir noch nicht im Begriff, wie ich es umsetzen soll.
    Ja ich habe es beim Abschicken auch gemerkt, ich optimiere meine Array Größen dann immer mal wieder im Laufe der Woche an eine ordentliche ausreichende Größe an.

    ProtocolRead[P_MAX][600][3] | So habe ich es deklariert.
    Рыба лично :rolleyes:
  • Also ich bin lange raus, aber ja, sowas tut in meinen Augen weh :D

    PAWN-Quellcode

    1. ocmd:pp(playerid, params[])
    2. {
    3. if(pInfo[playerid][pAdmin] < 6)return 1;
    4. new query[MAX_PLAYERS_NAME+1];//Warum 256 statt der maximal zulässigen Länge eines Namen
    5. if(sscanf(params, "s", query))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
    6. mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e' LIMIT 10", query),//mit LIMIT kannst du schon im MySQL-Query angeben wie viel Einträge geladen werden sollen
    7. mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
    8. return 1;
    9. }

    Quellcode

    1. case PLAYER_QUERY_PPROTOCOL:
    2. {
    3. if(!rows)return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
    4. SetPVarInt(playerid, "ProtocolStep", 1);//Statt "rows" machen wir hier jetzt 1, Also die Seiten (1, 2, 3 4 etc).
    5. query = "Datum\tUhrzeut\tInhalt\n";//Ich sehe bei D_PP kein "new query" also denke ich mal das du query global definiert hast, warum also nen neuen 1024er string?
    6. for(new i;i<rows;i++)
    7. {
    8. cache_get_value_name(i, "Datum", ProtocolRead[playerid][i][0], 12),//600 Zeichen dürfte das Datum wohl nicht lang sein
    9. cache_get_value_name(i, "Uhrzeit", ProtocolRead[playerid][i][1], 12),//genau so wie bei der Uhrzeit - ich weis nicht wie du abspeicherst, deswegen mal 12
    10. cache_get_value_name(i, "Inhalt", ProtocolRead[playerid][i][2], 600);//hier solltest du auch mal schauen ob gespeicherte Nachrichten wirklich 600 Zeichen lang sein werden
    11. format(query, sizeof query, "%s%s\t%s\t%s\n", query, ProtocolRead[playerid][i][0], ProtocolRead[playerid][i][1], ProtocolRead[playerid][i][2]);
    12. //Da du eh nur 10 lädst, brauchst du keine Abfrage mehr
    13. }
    14. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", "");
    15. }
    Alles anzeigen

    PAWN-Quellcode

    1. case D_PP:
    2. {
    3. if(!response || listitem)
    4. {
    5. SCM(playerid, COLOR_GREY, "Dialog geschlossen.");//Wir sagen es ihm/ihr gleich, wenn es keine Einträge mehr gibt :)
    6. return 1;
    7. }
    8. query = "Datum\tUhrzeit\tInhalt\n";
    9. SetPVarInt(playerid, "ProtocolStep", GetPVarInt(playerid, "ProtocolStep") + 1);//Wir zählen die zeiten. 1, 2, 3 usw.
    10. new newsite = GetPVarInt(playerid, "ProtocolStep") * 10); //Wäre es z.b 2, dann würde die var jetzt 20 sein, bei drei 30 etc.
    11. mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e' LIMIT 10, 20", query),
    12. mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
    13. if(cache_num_rows() < 1)
    14. {
    15. SCM(playerid, COLOR_GREY, "Es sind keine weiteren Einträge verfügbar.");
    16. return 1;
    17. }
    18. for(new i;i<10;i++)
    19. {
    20. cache_get_value_name(i, "Datum", ProtocolRead[playerid][i+newsite][0], 12),
    21. cache_get_value_name(i, "Uhrzeit", ProtocolRead[playerid][i+newsite][1], 12),
    22. cache_get_value_name(i, "Inhalt", ProtocolRead[playerid][i+newsite][2], 600);
    23. format(query, sizeof query, "%s%s\t%s\t%s\n", query, ProtocolRead[playerid][i][0], ProtocolRead[playerid][i][1], ProtocolRead[playerid][i][2]);
    24. }
    25. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", query, "Schließen", "");
    26. }
    Alles anzeigen

    Du scheinst aber ein wenig Ahnung zu haben, deswegen bin ich mir sicher das du darauf aufbauen kannst. Wenn, du möchtest. :)

    Aus dem Kopf - Ungetestet - Keine Garantie
  • @Talykos Jetzt übertreiben wir mal nicht, zumal new query[MAX_PLAYERS_NAME+1]; das auch nicht geht, da der Rest des Querys ja noch drum rum muss.


    Kasakow schrieb:

    ProtocolRead[P_MAX][600][3]
    Das frisst deine Ressourcen.
    Lösche es, du kannst das alles schöner schreiben.

    Versuche es mal so:


    C-Quellcode

    1. ocmd:pp(playerid, params[])
    2. {
    3. if(pInfo[playerid][pAdmin] < 6)return 1;
    4. if(IsNull(params))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
    5. SetPVarString(playerid,"ProtocolName",params);
    6. ShowPlayerProtocol(playerid,0);
    7. return 1;
    8. }
    9. case PLAYER_QUERY_PPROTOCOL:
    10. {
    11. if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
    12. SetPVarInt(playerid,"ProtocolRows",rows);
    13. new str[(128+11+6)*10] = "Datum\tUhrzeit\tInhalt\n";
    14. for(new i,date[11],time[6],data[128]; i<rows; i++)
    15. {
    16. cache_get_value_name(i, "Datum", date, sizeof(date)),
    17. cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
    18. cache_get_value_name(i, "Inhalt", data, sizeof(data));
    19. if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
    20. }
    21. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", "");
    22. }
    23. case D_PP:
    24. {
    25. new step = GetPVarInt(playerid, "ProtocolRows"), end = GetPVarInt(playerid,"ProtocolEnd");
    26. DeletePVar(playerid,"ProtocolRows"),DeletePVar(playerid,"ProtocolEnd");
    27. if(!response || listitem || step%10 != 0)
    28. {
    29. DeletePVar(playerid,"ProtocolName");
    30. return SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
    31. }
    32. ShowPlayerProtocol(playerid,end+10);
    33. }
    34. stock ShowPlayerProtocol(playerid,start)
    35. {
    36. new query[64 + MAX_PLAYER_NAME];
    37. GetPVarString(playerid,"ProtocolName",query,MAX_PLAYER_NAME);
    38. mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e' LIMIT %d,10", query,start),
    39. mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
    40. return SetPVarInt(playerid, "ProtocolEnd", start),1;
    41. }
    Alles anzeigen
    Das scheint mir ein eleganter Weg zu sein! :)

    Schlaf schön ;)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • @Kaliber
    Ich konnte mich Relativ okay in deinen Code hineinversetzen.
    Aktuell funktioniert er, so aber auch nicht, also es passiert nach Eingabe des Commands immer noch nichts.
    Ich bekomme in meiner LogCore eine Meldung.

    SQL-Abfrage

    1. [11:52:47] [ERROR] signal 2 (SIGINT) catched; shutting log-core down (errno: 0, signal code: 128, exit status: 141512)
    Рыба лично :rolleyes:
  • Pack mal crashdetect rein und zeig mal deine Tabellen Struktur :)

    Und hast du mal Beispieldaten? Also mich interessiert die Länge der einzelnen Felder...

    //Edit:

    PS: Zeile 21 mal so schreiben:

    PAWN-Quellcode

    1. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/

  • Ahhh du speicherst die Sekunden :D

    Daran habe ich nicht gedacht, schreibe mal den Mittleren Teil so:

    C-Quellcode

    1. case PLAYER_QUERY_PPROTOCOL:
    2. {
    3. if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
    4. SetPVarInt(playerid,"ProtocolRows",rows);
    5. new str[(128+11+9)*10] = "Datum\tUhrzeit\tInhalt\n";
    6. for(new i,date[11],time[9],data[128]; i<rows; i++)
    7. {
    8. cache_get_value_name(i, "Datum", date, sizeof(date)),
    9. cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
    10. cache_get_value_name(i, "Inhalt", data, sizeof(data));
    11. if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
    12. }
    13. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
    14. }
    Alles anzeigen


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Hmmm, dann schreib es mal so:


    C-Quellcode

    1. case PLAYER_QUERY_PPROTOCOL:
    2. {
    3. if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
    4. SetPVarInt(playerid,"ProtocolRows",rows);
    5. new str[2000] = "Datum\tUhrzeit\tInhalt\n";
    6. for(new i,date[11],time[9],data[512]; i<rows; i++)
    7. {
    8. cache_get_value_name(i, "Datum", date, sizeof(date)),
    9. cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
    10. cache_get_value_name(i, "Inhalt", data, sizeof(data));
    11. if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
    12. }
    13. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
    14. }
    Alles anzeigen
    Ich bin mir ziemlich sicher, dass es ein Größen Problem ist.


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Dann setze mal prints und schau, wo er sich aufhängt :o
    Und aktivier evtl mal den Mysql Log

    //Edit:
    Habe es mal bei mir lokal getestet und es funzt einwandfrei.
    Bekomme keine Fehler oder dergleichen und habe exakt deine Datenstruktur gewählt.

    Das war der Code, den ich verwendet habe:


    C-Quellcode

    1. ocmd:pp(playerid, params[])
    2. {
    3. if(pInfo[playerid][pAdmin] < 6)return 1;
    4. if(IsNull(params))return SCM(playerid, COLOR_GREY, "Befehl: /pp [Name]");
    5. SetPVarString(playerid,"ProtocolName",params);
    6. ShowPlayerProtocol(playerid,0);
    7. return 1;
    8. }
    9. case PLAYER_QUERY_PPROTOCOL:
    10. {
    11. if(!rows) return SCM(playerid, COLOR_LESSRED, "Es wurde kein Eintrag gefunden.");
    12. new str[1024] = "Datum\tUhrzeit\tInhalt\n";
    13. for(new i,date[11],time[9],data[128]; i<rows; i++)
    14. {
    15. cache_get_value_name(i, "Datum", date, sizeof(date)),
    16. cache_get_value_name(i, "Uhrzeit", time, sizeof(time)),
    17. cache_get_value_name(i, "Inhalt", data, sizeof(data));
    18. if(data[0] != EOS) format(str, sizeof str, "%s%s\t%s\t%s\n", str, date, time, data);
    19. }
    20. ShowPlayerDialog(playerid, D_PP, DIALOG_STYLE_TABLIST_HEADERS, "Spielerprotokoll", str, "Schließen", ((rows%10 == 0)?("Weiter"):("")));
    21. }
    22. case D_PP:
    23. {
    24. new end = GetPVarInt(playerid,"ProtocolEnd");
    25. DeletePVar(playerid,"ProtocolEnd");
    26. if(response) return DeletePVar(playerid,"ProtocolName"), SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
    27. ShowPlayerProtocol(playerid,end+10);
    28. }
    29. stock ShowPlayerProtocol(playerid,start)
    30. {
    31. new query[64 + MAX_PLAYER_NAME];
    32. GetPVarString(playerid,"ProtocolName",query,MAX_PLAYER_NAME);
    33. mysql_format(handle, query, sizeof query, "SELECT * FROM playerprotocol WHERE Name='%e' LIMIT %d,10", query,start),
    34. mysql_pquery(handle, query, "PlayerQuery", "d", PLAYER_QUERY_PPROTOCOL);
    35. return SetPVarInt(playerid, "ProtocolEnd", start),1;
    36. }
    Alles anzeigen
    Aber mir ist schleierhaft wie du die playerid an das PlayerQuery übergibst (Zeile 36)

    und wie fragst du die rows ab?

    Ich kenne halt nicht all deinen Code.

    An dem Stück Code liegt der Fehler zumindest nicht :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Kaliber ()

  • @Kaliber
    So ein leichtsinnsfehler.. bei dir hat es gleich funktioniert .. weil du ID 0 bist und dein Enumfeld auch das erste ist.
    Ich hab halt einfach die playerid nicht mit angegeben.
    Aktuell funktioniert es, aber rückwärts. Sprich, wenn ich auf weiter klicke & es sind noch Einträge vorhanden, dann sagt er ist nichts mehr da.
    Wenn aber noch was zu lesen da ist & ich auf Schließen/Zurück gehe.. dann zeigt er mir die nächsten Einträge.
    Рыба лично :rolleyes: