Beiträge von Dj EKI

    Mit Create Widget sparsam umgehen. Nur nutzen wenn damit ein widget erstellt werden soll, weil es noch nicht existiert. Danach den Widget in eine Variable setzen um diesen Widget zu bearbeiten.

    Mit AddToViewport anzeigen lassen und RemoveFromParent vom Bildschirm entfernen lassen.

    Man muss bedenken, man kann kein Widget einzeln entfernen, oder zerstören. RemoveFromParent ist nur das entfernen von VIewport. Es ist immer noch vorhanden. Nur RemoveAllWidgets zerstört die Widgets und können nicht mehr angesprochen werden.

    Das bedeutet, Sehr viel mit Hide, oder visible arbeiten. Weis jetzt nicht welches davon relevant ist. Wenn ein Widget sich mit vielen schnickschnack sich aufbaut, kann das Spiel auch schon mal kurz einfriehren. Damit nicht permanent sich alles wieder neu aufbauen muss, muss das Widget vorhanden sein. Mit einer Variable findet man diesen Widget schnell wieder, desswegen immer in eine Variable setzen.

    Noch ein Beispiel ist, manche bauen ihr Widget mit html auf. html kann sehr langsam aufbauen, wenn diese vom Internet abgerufen wird. Damit das nicht immer wieder so langsam aufbaut, wird das Widget versteckt, oder sichtbar gemacht, anstatt immer wieder create widget zu nutzen.

    Automatisches rebuild sollte funktionieren.

    Projektsettings->NavMesh

    Ist jetzt nur eine Vermutung, Force Rebuild wird angewendet, wenn die Map geladen ist.

    Runtime Generation auf Dynamic stellen für permanentes Rebuild. Dynamic Modifier ist mir noch unklar. Das hier sind aber nur vermutungen die ich noch nie getestet habe.


    Hier aber noch ein Video vom alten Stand. Deswegen bin ich darauf gekommen.

    Es ist die normale verschlüsselung. Es wird kein tag und iv generiert. Es wird durch ein Schlüssel die aes cipher generiert. Somit bleibt der cipher immer der selbe.

    UE4 hat evtl nur diesen Modus bereitgestellt, aber ich finde keine richtige Doku dazu. gcm Modus hätte ich gerne. In der PHP sprache ist das alles so simple gemacht, aber in c++ ist das wieder mal ein total Krampf. OpenSSL ist zum glück in der ue4 integriert, aber lässt sich nur bedingt nutzen...

    Hier ist der ganze Script, habe lange danach gesucht, und war sehr erfreut, dass er diesen script geschrieben hat. Plugin habe ich daraus fpür die 4.24 version erstellt, den kann ich per pn schicken. https://kelheor.space/2018/11/…data-with-aes-256-in-ue4/

    VaRest ist auch nur, wenn du dich entscheidest, den php und mysql weg zu gehen. Habs grad selber angewendet und es funktioniert auf jedenfall. Das wichtigste ist, die Daten müssen in aes verschlüsselt versendet werden, damit man den Trafficverlauf nicht manipulieren kann. Dafür habe ich auch noch selber schnell ein Plugin geschrieben, falls da jemand bedarf hat.

    ue4 4.24 , evtl auch frühere versionen haben sqlite plugin integriert. Ich habe dazu noch kein HowTo gesehen, aber könnte doch interessant sein. Hat jemand davon schon gehört? Ist es eine relativ gute alternativ zu mysql?


    Ansonsten soll sich Exaran das hier mal anschauen.

    Exaran, Ich bin grad etwas schockiert über deine Beurteilung über mysql. Alles was du darüber geschrieben hast, kannst du gleich mal umkehren.

    Um an Mysql ran zu kommen, muss man entweder die Einloggdaten haben von Mysql, oder man müsste dein Server gehackt haben, oder man hat deine Einloggdaten vom Server. Anders geht das nicht. Ich werde aber auch nicht weiter darauf eingehen.


    Mit der Datenbank und der ID, da gebe ich auf. Ich habe das Gefühl, dass du etwas in den Kopf gesetzt hast und somit vieles von uns in Frage stellst.


    Um dir noch ein Tip mitzugeben, da die mysql nur Local angesprochen werden darf, zwecks hack versuche, könntest du einen ue4 server auf dem Server laufen lassen, der mit mysql plugin ausgestattet ist und zusammen mit mysql auf ein Server läuft. Der Server holt die Daten und sendet es dem Spieler. Wie es andere Spiele machen, die einen Server auf Amazon haben, weis ich nicht, da die Datenbank immer local sein sollte und die Datenbank sicherlich nicht bei Amazon ist.

    Auch wenn der Weg zu Mysql schwer ist, es bleibt trotzdem noch die einfachste beste Lösung.

    So könnte die Datenbank aussehen in mysql:

    Diese ist die Logintabelle:

    IndexSpielerIDNamePasswortLevelRasseLeben
    0112Exaran***121100
    1150EKI***11055


    Dies ist die Inventartabelle:

    EinmaligeID(Automatischer Increment)SpielerIDGegenstandKategorieIDGegenstandIDModifizierungString
    12015001544Verstärkung=12,Gift=20
    1301122120Gift=55,Verzauberung=100,Rüstung=55
    133112155
    134150188Nährwert=30
    1351502120Gift=30,Verzauberung=150,Rüstung=55


    Der Spieler Loggt sich ein, die Mysql wird gelesen und fängt bei der Logintabelle an.

    Durch Name weis das Spiel wie der Charakter heißt. Und alle anderen Werte die wichtig sind, damit das Spiel weis, wie der Charakter aussehen sollte und was für Werte es hat.

    Danach wird das Inventar geladen. Es durchforstet die Mysql die komplette InventarTabelle nach der SpielerID und holt sich die GegenstandKategorieID, GegenstandsID mit deren modifzierung.

    Das Spiel vergleicht die GegenstandKategorieID mit der ue4 Datenbank ab und weis schon mal, um welche Kategorie es geht, sowas wie Rüstung, Waffen usw. Dann gehts weiter mit der GegenstandID, die wird dann auch aus der ue4 Datenbank geholt, somit weis das Spiel um was für ein Gegenstand es sich handelt. Dann wird ModifizierungString formatiert und die Werte für diesen Gegenstand verändert, die von Den originalen abweichen. Die EinmaligeID muss auch hinterlegt sein zu dem Item.

    Hier muss also nix in irgendeinen Array geladen werden. Der Spieler selbst erhält alle Daten, die natürlich zuerst auf dem Server verteilt wurden.

    Hat der Spieler etws aufgenommen, oder hergestellt, dann wird in die Mysql geschrieben. Die Mysql hat ein automatischen increment und zählt automatisch Hoch. Dieser Gegenstand wird eingetragen und das wars.

    Wird dieser gegenstand gelöscht, dann wird nach der EinmaligenID gesucht. Die wird dann entfernt. Ich weise gleich darauf hin, das der auto_increment nicht dort weiter zählt wo die Letzte Zahl in der Tabelle ist, sondern es ist ein eigenständiger Zähler und in der Tabelle sieht es so aus, als hätte es ein paar Zahlen übersprungen.

    Wenn ein Wert verändert wurde, dann sucht es nach der EinmaligenID und verändert den ModifizierungString.


    Wenn man einmal mit der Mysql datenbank gearbeitet hat, also zb paar Tutorials, dann weis man auch sofort bescheid, denn es ist sehr simpel. Mysql Server gibt es viele, manche sogar auch kostenlos. Such aber nicht nur nach ein Mysql server, sondern ein Webspace. oder richte dir mit XAMPP dein eigenen Mysql und PHP Server ein.

    Wenn du den plugin nutzen möchtest, dann nutze nur mysql. Mir ist das schnuppe, ob dein mysql server mit leichtigkeit gehackt wird. Ansonsten lege ich dir ans Herz den PHP Server mitzunutzen. Mysql und PHP müssen auf den selben server liegen und ue4 greift mit html auf den PHP Server zu und der PHP Server gibt die Befehle an Mysql weiter.

    Alle Daten können im Arbeitsspeicher abgefangen werden. So arbeiten die Hacker. Das bedeutet deine Daten die gesendet werden, werden in den Arbeitsspeicher abgelegt und verarbeitet. So wie ich damals nach ein Wert gesucht habe, war das ziemlich einfach den Speicher auszulesen. http könnnen sogar von normalen tools die ein und ausgänge vom Programm ausgelesen werden und alles angezeigt werden was im Netzwerk so los ist. Sogar da wird alles schön in Textform angezeigt.


    Dein Inventarsystem kannst du gerne so weiter führen. Du musst nur jetzt irgendwie deine Daten speichern können, ab da kannst du dann das Inventarsystem anpassen.

    Savegame wäre ja auch möglich, aber es ist nicht zu empfehlen. Ich habe mit savegame nur einmal gearbeit. Ich glaube, wenn du etwas speichern möchtest, da muss sogar immer der gesamte savegame gelesen werden und dann das hinzugefügt werden was zusätzlich gespeichert werden soll und dann wird alles gespeichert. Stell dir das 1000 Mal vor. Da wird alles schon länger dauern.


    Das wäre auch noch interessant für dich für Objekte.

    https://wiki.unrealengine.com/SaveGame_Pointers_and_Structs

    In Deutschland ist ja der Datenschutz so extrem geworden, dass du da dich auch sehr gut absichern solltest.

    Du musst gewährleisten können, dass keiner so einfach hacken kann. Die einzige Möglichkeit, die kyodai erwähnt hatte ist webbassiert. JSON ist in der Art einfacher. Das bedeutet, du musst einen Webserver haben, der mit JSON und PHP umgehen kann. Dein Spiel greift auf dein PHP Server zu mit Kunden login und der Server gibt JSON wieder aus und das Spiel liest die JSON Daten aus und ue4 formatiert die daten für dich. JSON ist glaube ich auch noch nicht in ue4 vorhanden, dafür brauchst du ein plugin.

    Es ist so, wenn du Mysql direkt im Spiel verwendest, dann sind die Einlogdaten für den Server, also die Mysql Daten im Spiel gespeichert. Irgend so ein Lustmolch möchte unbedingt an die Einloggdaten rann, der braucht dann nur im Spiel danach zusuchen. Wenn die Daten im webspace, also in php, gespeichert sind, dann kann da keiner die Einlogg Daten von mysql auslesen. Denn man benutzt hierführ die Login Daten vom Spieler. Genau das selbe wie im Forum wenn man sich einloggt. Nur das man nicht das Design sieht, sondern die JSON formatirung (Texte mit vielen Klammer).

    Daten wie MyCharakter, genauer gesagt, Objekte, oder Actors, können nicht abgespeichert werden. Dafür werden nur nötige Sachen genutzt.


    Workflow wäre, was mir spontan einfällt:

    Spieler loggt sich ein.

    Webspace wird mit Script angesprochen durch simplen Link, wie deinserver.de/login

    Durch die Form Handling im html script wird ein login durchgeführt.

    Es wird zur nächsten Webseite geleitet, der die MySQL Datenbank liest und die per JSON ausgibt. Entweder per Textform, oder als http Request.

    Die Daten werden durch ein JSON formatter formatiert und in alle Variablen verteilt.

    Die Daten müssen als String oder Zahl sein.

    Das bedeutet, du kannst Level, Charakter Typ, Name, Items IDs, usw alles abspeichern.


    Damit man dich da nicht so abschreckt. Hier ist ein Beispiel wie man ein simplen login erstellt https://www.w3schools.com/howto/howto_css_login_form.asp

    Und hier kannst du über php und mysql lesen https://www.php-einfach.de/mysql-tutorial/

    https://www.unrealengine.com/m…product/mysql-integration

    Entweder selber programmieren, oder kaufen. C++ mit mysql ist aber keine hürde. Das ist schnell getan.


    Egal was du jetzt versuchst. Du bleibst grad an einer Situation stecken, und zwar das speichern der Daten von Charaktern. Du kannst es nämlich nicht. Es geht nur über sql, oder über die savegame funktion, die ich aber nicht empfehlen würde. Die ist langsam. Sehr langsam. Du kannst auch auf den Charakter nicht mehr zugreifen, da MyCharater nicht mehr existiert. Auch wenn die Savegame gelesen wurde. Du kannst es mit savegame nur so machen, dass kein Actor (BP) gespeichert wird, sondern nur die Daten. Der Spieler hat eine ID, oder den Namen und dann wird im Savegame danach gesucht und alle Daten geladen. Denn wenn ein Spieler disconnected, dann wird der MyCharakter zerstört. Die Mycharakter variablen, die gespeichert sind, sind nur noch tote Links.

    Anfragen was es für ein Widget ist, abzweigen in die jeweilige Richtung im Script und den Index übertragen. Widget kannst du eine Kategorie variable hinzufügen, zb ein enum, und dadurch weiß dein Script, um was für ein Widget es sich handelt.


    Was ist ein Key? Du hast im Forum die Nummer 448. Damit bist du in der ganzen Datenbank willkürlich verteilt. Dadurch wirst du immer gefunden. Damit existiert du. Der nächste der sich anmeldet könnte auch exaran heißen. Genau die selben Buchstaben. Nur durch die Nummer wirst du identifiziert. Das bedeutet, es gibt 2 exaran, wie zb 2 Äpfel im Inventar die unterschiedliche Keys haben. Sehr wichtig für die Datenbank. Datenbank gehe ich von SQL aus, oder MySQL. Das sind richtige Datenbanken. Ich rede nicht von der ue4. Die ist statisch.


    Wenn der Server ausgeht. Dann werden die Arrays gelöscht. Die Daten sind alle weg. Von daher eine richtige Datenbank nutzen.


    Eigentlich ist es sogar nicht mehr möglich den mycharakter in ein Array zu speichern und den zu nutzen, wenn man wieder Joint. Derjenige der Joint hat eine ganz andere Adresse, obwohl es der selbe Spieler ist. Dieser actor ist also nichtig.

    Kannst du dir vorstellen wie viel Einträge dieses Forum in der Datenbank hat. Das kommt fast an die Millionen, gut, vllt übertreibt ich etwas. Nicht nur Threads werden gespeichert, auch jede Aktivitäten. Und trotzdem kann jeder hier verdammt schnell surfen.

    Mal noch ne andere Frage. Wenn der Spieler disconnected, und später wieder Joint, wie bekommt er sein Inventar wieder? Schon Mal Gedanken darüber gemacht?

    Wenn man keine Datenbank hat, dann kann er das so nutzen wie ich es gesagt habe, wenn die Datenbank genutzt wird, muss er ein schlüssel verwenden der fest geschrieben wird.

    Der Server weis, welcher charakter was für ein Item hat. Da muss man nicht noch erst alle Items Global behandeln. Sollte es aber zum großen Server gehen, der auch die Daten festhalten muss, also Datenbank, dann ist es logisch richtige Schlüssel zu verpassen.

    Exaran Du kommst an eine Verlinkung nicht drum herum. Also mit Keys zu arbeiten. Wenn ich mich richtig erinnere, willst du, dass alles ordentlich repliziert wird. Wenn deine Widget schon variablen festhalten, dann kannst du das schon mal vergessen. Deine Variablen, oder Arrays müssen im Charakter bleiben. Im Widget dürfen die structs als variable sein, aber sie dürfen nur zum anschauen sein, und nicht zum nutzen. Dafür verlinkt man wieder zum Charakter.

    Tomarr hat dir da schon ein super anhang gegeben, bei dem ich nur bissl was dazu sage.

    Die Keys werden schon beschrieben, wenn sie in das inventar gelegt werden. Ich würde nicht mit kategorien wie 2000 und 3000 arbeiten, sondern von 0 Anfangen. Immer wenn ein neues Item kommt, dann werden die keys neu beschrieben und von Null angefangen. Das bedeutet, im ersten Array werden die Keys von 0 bis zum Ende beschrieben, und dann gehts weiter mit dem 2. array, der dort mit dem key weiter geht, wo es im ersten aufgehört hat. Später werden sie in eine Gesammtliste "Inventar" eingefügt. Im Inventar ist nur Key interessant. Der wird auch im Widget da gelassen, um in den anderen Arrays danach zu suchen. Normalerweise wäre auch nur die Keys in den Widgets interessant, ohne ein Inventar Array zu nutzen.


    Array: Nahrung

    Bezichnung Key usw
    Apfel 0 ...
    Brot 1 ...


    Array: Rüstung

    Bezichnung Key usw
    Schwert 2 ...
    Lederrüstung 3 ...
    Holzscheit 4 ...



    Array: Inventar (Oder gleich verteilt in Widgets und das hier ist nur die Scrollliste)

    Bezichnung Key Widget
    Apfel 0 Nahrung(Enum)
    Brot 1 Nahrung(Enum)
    Schwert 2 Rüstung(Enum)
    Lederrüstung 3 Rüstung(Enum)
    Holzscheit 4 Rüstung(Enum)

    Wie Tomarr sagte, mit keys arbeiten. Sogenannte Identität-schlüssel. Ein Inventar array, der alle Schlüssel beinhaltet. Ein Schlüssel kann auch eine Struct sein, es ist nur ein Oberbegriff von mir. Da gibts viele Möglichkeiten. Spontan fällt mir nur ein, da du evtl 4 Kategorien hast, musst du aus dem Inventar array auslesen können, welche Kategorie es ist, und welches Index von der Kategorie. Dann wird das Array mit der Kategorie aufgerufen und das Index genommen. was auch gehen würde, eine inventar struct array dass 4 weitere Structs von den Kategorien enthält, eins wird davon nur beschrieben, die anderen sind leer und das wäre schon mal ein Index. Wenn das Inventar durchsucht wird, dann werden alle indexe gelesen und wärend dessen abgefragt, ob dieses struct leer, oder voll ist. Dieses wird dann auch angezeigt.