set & getElementData (Server&Client side)

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

  • set & getElementData (Server&Client side)

    Hallo, ich wollte mal fragen, ob es eine sehr gute alternative zu set&getElementData (Server&clientseitig) gibt? wenn ja bitte senden^^

    Habe gehört, das normales ser&getElementdata unsicher sei

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

  • Datenbanken halt.

    Jice schrieb:

    Habe gehört, das normales ser&getElementdata unsicher sei
    Man kann die Daten schon sichern, aber dafür braucht es schon bisschen mehr wissen (Token, Hash, Crypt uvm.) ;)
    https://one-gaming.homescript.de/

    Corbert schrieb:

    Kannst dich jetzt hinter deiner Mauer aus passiv aggressiven Klassikern wie "mimimi" oder "typisch Com" natürlich wie der Boss fühlen, weil du es jetzt allen mal so richtig gegeben hast
  • Der Post von meinem Vorposter ist leider nicht zutreffend.
    ElementDatas werden als flüchtiger Speicher (d.h. Speicher, der spätestens nach dem Neustart des Servers/Clients weg ist) benutzt, während Datenbanken einen permanenten Speicher darstellen, der auch nach dem Neustart noch vorhanden ist. Datenbanken sind aber langsam und daher nur geeignet, um ab und zu wichtige Spielerdaten zurückzuschreiben. Für alles andere und den "laufenden Betrieb" wird flüchtiger Speicher (Variablen, ElementDatas etc.) verwendet.

    Wenn davon die Rede ist, dass ElementDatas unsicher wären, ist damit nicht gemeint, dass sie nicht verschlüsselt sind o.ä., sondern, dass sie u.U. durch den Client manipuliert werden könenn - selbst wenn sie serverseitig gesetzt wurden. Das liegt daran, dass MTA versucht die Werte zwischen Server und Client immer synchron, also gleich, zu halten. Dieses Verhalten kann abgestellt werden, indem die Änderung in dem Event onElementDataChange serverseitig rückgängig gemacht wird (prüfen, ob die Variable client gesetzt ist und dann setElementData mit dem alten Wert aufrufen).

    Eine bessere Lösung ist für Fälle, in denen dieses Verhalten nicht explizit erwünscht ist, jedoch gänzlich auf ElementDatas zu verzichten und stattdessen eine eigene Lösung zu entwickeln. Über die Suchfunktion findest du verschiedene mehr und weniger gute Lösung.

    Eine einfache Lösung ist folgende:

    LUA-Quellcode

    1. local data = {}
    2. function setData(element, key, value)
    3. -- Wenn noch keine "Untertable" für das Element existiert
    4. -- neue erstellen
    5. if not data[element] then
    6. data[element] = {}
    7. end
    8. -- Wert in "Untertable" für Element setzen
    9. data[element][key] = value
    10. end
    11. function getData(element, key)
    12. if data[element] then
    13. return data[element][key]
    14. end
    15. end
    Alles anzeigen

    Diese Lösung lässt sich genau wie ElementDatas benutzen, tauscht die Werte zwischen Server und Client aber nicht aus. Schickere Lösungen wären Lösungen, die in Richtung Objektorientierung gehen. Die simd dann aber wirklich ein bisschen komplizierter in der Realisierung.
  • ronald drunk schrieb:

    Der Post von meinem Vorposter ist leider nicht zutreffend.
    Man kann doch überprüfen ob der Wert von dem Server gesetzt wurde, mit der Hilfe eines Tokens.
    Verstehe nicht was daran falsch ist..
    https://one-gaming.homescript.de/

    Corbert schrieb:

    Kannst dich jetzt hinter deiner Mauer aus passiv aggressiven Klassikern wie "mimimi" oder "typisch Com" natürlich wie der Boss fühlen, weil du es jetzt allen mal so richtig gegeben hast

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von The0ne ()

  • Jice schrieb:

    wie kann man dies ändern? also das die auf beiden seiten verfügbar sind?
    Die faule Variante wäre, zusätzlich ein ElementData zu setzen, das du serverseitig nur setzt, aber nicht verwendest.

    LUA-Quellcode

    1. function setData(element, key, value, syncToClient)
    2. -- Wenn noch keine "Untertable" für das Element existiert
    3. -- neue erstellen
    4. if not data[element] then
    5. data[element] = {}
    6. end
    7. -- Wert in "Untertable" für Element setzen
    8. data[element][key] = value
    9. -- wenn syncToClient gesetzt ist, wird das Ergebnis
    10. -- auch zum Client übertragen
    11. if syncToClient then
    12. setElementData(element, key, value)
    13. end
    14. end
    Alles anzeigen
    Heißt du kannst clientseitig per getElementData darauf zugreifen, serverseitig benutzt du aber ausschließlich getData. Eine längere, aber eigentlich schönere Alternative wäre, statt setElementData aufzurufen, ein Event an den Client zu triggern, das den Wert dort speichert (z.B. mit der clientseitigen setData Implementierung).

    Davon abgesehen ist es oft aber auch so, dass du den Wert clientseitig gar nicht brauchst. Um außerdem dem Leitsatz "Never trust a client" zu folgen, sollte Spiellogik grundsätzlich auf dem Server implementiert werden.


    The0ne schrieb:

    Man kann doch überprüfen ob der Wert von dem Server gesetzt wurde, mit der Hilfe eines Tokens.
    Verstehe nicht was daran falsch ist..
    Ich sehe nicht wie Token das Problem hier lösen. Wenn der Wert vom Server gesetzt wird, ist kein Token nötig, da der Server schon vertrauenswürdig ist und wenn der Client den Wert setzt, stimmt etwas am Konzept nicht.
    Ich lasse mich da aber gerne eines Besseren belehren. Dazu müsstest du jedoch ausführen, wie du dir das im Detail vorstellst.