[Include] Dialoge wieder anzeigen

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
  • Du meinst ja, dass du für die MySQL Datenbank gegen eine ungewollte Injection die " ' " entfernst.


    Nur der Vollständigkeithalber.


    Es handelt sich hier im eine SQLite Datenbank, das ist keine MySQL Datenbank.
    Im Grunde müsste er sich um die Injection gar nicht kümmern, es würde dazu eigentlich in keinem Fall kommen.


    Es werden schließlich nur statische Daten geholt.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Achso, naja habe halt nur den einen Text gelesen in der Präsentation, worauf man verzichten muss, sorry, bin an meinem kleinem Handy mit schlechtem Internet und da will ich mir nicht den Quellcode antun ^^ Dann danke für die Info/Ergänzung @BlackAce :p

  • Im Grunde müsste er sich um die Injection gar nicht kümmern, es würde dazu eigentlich in keinem Fall kommen.


    Naja...man weiß nie...was für Spezialisten es verwenden...deshalb wollte ich sicher gehen, dass es nicht zu komischen resultaten kommt.


    #Handy

    ast2ufdyxkb1.png


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

  • Meiner Meinung nach nicht so sinnvoll, da man die Nachrichten ja scheinbar überhaupt nicht verändern kann.
    Was genau bringt mir das? Wenn ich dem Benutzer anzeigen will das er ?/500kg Stroh geladen habt bringt mir diese Include überhaupt gar nichts, da ich keinen Einfluss auf die Nachricht mehr habe.
    Außerdem finde ich es unnötig die Dialoge aus einer SQLite Datenbank zu laden. Man kann sie auch einfach in eine eigene Datei packen und alle einfach in den Speicher laden wenn der Server startet.
    Das wäre deutlich einfacher, und man braucht nicht irgendeinen SQLite-Client mit dem man die Werte umändern kann.



    Mein Verbesserrungsvorschlag an dich / deine Include:
    - Die ReShow Funktion erweitern, so wie die Format Funktion. Wenn der String in der Datenbank wie folgt aus sieht: "Du hast aktuell %s/500kg Stroh geladen.", dann sollte man eventuell so etwas machen können: ReShow(dialogid, "15"), damit später dann "Du hast aktuell 15/500kg Stroh geladen." erscheint.

  • Meiner Meinung nach nicht so sinnvoll, da man die Nachrichten ja scheinbar überhaupt nicht verändern kann.


    Genau das ist ja der "Sinn" hinter dieser Include, man soll schnell und einfach statische Dialoge laden bzw. anzeigen lassen können.


    Ob das so sinnig, ist sei mal dahin gestellt, vor allem, weil der Dialog erst einmal angezeigt werden muss bevor er geladen werden kann, DAU Safe ist das nicht :D
    Da fand ich meine Methode "schöner" ^^
    Dialoge haben ja leider ihre Limits.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • @BlackAce: Hmm, wenn es wirklich nur für statische Dialoge ist sehe ich noch weniger einen Sinn darin sich die Mühe zu machen extra eine Datenbank dafür anzulegen.
    Man könnte das auch genauso gut einfach direkt in Pawn machen.

  • Ich bin dann mal wieder den Spielverderber, aber diese Include ist (und das ist leider ungelogen so) die sinnfreieste Include die ich in letzter Zeit gesehen habe. Verwenden sollte das niemand, weil der einzige Zweck dahinter ist der, dass mehr Ressourcen verwendet werden als ohne (was anscheinend nur 123marvin123: wirklich verstanden hat).


    Warum?
    Es wird ein String (bzw. gleich mehrere) in einer Datenbank gespeichert, die man 1:1 so im Code stehen hat. Wo ist denn da der Sinn? Theoretisch kann man jeden String und jeden sonstigen Wert den man im Code stehen hat in eine Datenbank schreiben lassen, wenn der Code ausgeführt wird, aber wo ist der praktische Sinn dahinter, außer dass man am Ende 1000 Includes hat? Der einzig für mich erkennbare Sinn ist der, dass man der CPU unnötig Arbeit macht und dass man die Festplatte zumüllt.
    Somit wird also genau das gespeichert was ohnehin schon im Code steht. Warum sollte ich das (nochmal!) speichern wollen? Dafür gibt es keinen Grund.


    An sich zeigt der Code ja nur das an, was bereits angezeigt wurde. Das kann man aber ohne solche Umstände mit einem einzigen Funktionsaufruf realisieren, der zudem so gut wie keine Ressourcen benötigt.
    Ich zeige kurz und knapp auf wie das geht (sollte ich eigentlich nicht müssen, denn das sind wirklich Basics). Ich nenne die Funktion zur Verdeutlichung ebenfalls ReShow, auch wenn es da nicht wirklich passt.


    forward ReShow(playerid, dialogid);
    public ReShow(playerid, dialogid)
    {
    switch(dialogid)
    {
    case 1: ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,"Caption","Text","Ok","Close");
    case 2: ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,"Bla","Blub","Ok","Close");
    case 3:
    {
    new Float:a;
    GetPlayerFacingAngle(playerid, a);
    new str[32];
    format(str, sizeof(str), "Angle: %f", a);
    ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,"Angle-Info",str,"Ok","Close");
    }
    }
    return 1;
    }


    Prinzip dahinter?
    Man schreibt einfach alle seine Dialoge in eine Funktion, die per switch über die dialogid den Dialog anzeigt. So kann man, wie in case 3 auch formatierte Texte anzeigen. Im Endeffekt kann diese Funktion sogar mehr als die ganze Include, und das bei so gut wie keiner Belastung der Ressourcen.



    Zu der Ersetzung des '-Zeichens:
    Das kann man wesentlich geschickter lösen, indem man beim speichern nicht das ' mit einem Leerzeichen ersetzt, sondern einfach ein zweites ' anfügt, sprich:
    ' wird zu '' im Query und wird als ' gespeichert.
    Das ist heutzutage eigentlich Standard.



    Zu den Limits, die angesprochen worden sind:
    Die Include umgeht kein Dialog-Limit, da die dialogid 1:1 verwendet wird.


    Ich denke zum Rest muss man nichts mehr sagen, dass die Plug&Play Lösung nicht wirklich toll ist, ist da schon Nebensache.