onPlayerGenerateMapTile

  • German

We've posted an important announcement regarding the current situation and the future of the game: Announcement

  • onPlayerGenerateMapTile

    Hallo @red51,

    nachdem ich jetzt die screenshot Funktion in meine Plugins eingebaut habe (DiscordPlugin / GlobalIntercom) bin ich gerade dabei die neue requestMapTileRaw Funktion für mein Map Plugin zu verwenden und bin noch nicht ganz zufrieden.

    Mein erstes Problem: es fehlt noch das richtige Event um die Funktion zu verwenden. Aktuell habe ich diese prototyp code hier in Verwendung:

    Java Source Code

    1. @EventMethod
    2. public void onPlayerEnterChunk(PlayerEnterChunkEvent event) {
    3. Player player = event.getPlayer();
    4. // String lang = player.getSystemLanguage();
    5. Vector3i coords = event.getNewChunkCoordinates();
    6. // player.sendTextMessage("You are now in " + coords.x + "x " + coords.y + "y " + coords.z + "z");
    7. int tileX = coords.x / 3;
    8. int tileY = coords.z / 3;
    9. final File destinationFile = new File(tileRoot + "mt_" + tileX + "_" + tileY);
    10. String compareHash = FileUtils.getMd5(destinationFile);
    11. // player.sendTextMessage("You are now in MatTile" + tileX + "x " + tileY + "y ");
    12. player.requestMapTileRaw(tileX, tileY, compareHash, (byte[] tile) -> {
    13. if (tile == null) {
    14. // player.sendTextMessage("no tile returned");
    15. } else {
    16. // String tileChecksum = ByteUtils.getMd5(tile);
    17. // player.sendTextMessage("tile has " + tile.length + " bytes, checksum=" + tileChecksum);
    18. FileUtils.writeBytesToFile(tile, destinationFile);
    19. }
    20. });
    21. }
    Display All
    Ist noch nicht ganz korrekt der code aber damit komm ich erstmal weiter.
    Der Vergleich mit dem MD5 funktioniert soweit, nur kam mir der Gedanke das ja die ingame MAP nicht immer direkt aktualisiert wird, also manchmal muss man halt den refresh button drücken.
    Wenn jetzt jemand mit einer alten ingame map kommt hat der natürlich einen anderen MD5 weil die Daten anders sind. Dies verhindert dann aber nicht das die alten Daten die neueren überschreiben. Hier müßte man dann das datum der Datei noch vergleichen können oder besser dieser Vorschlag:

    Ein neues Event "onPlayerGenerateMapTile" das gefeuert wird wenn der client ein map tile rendert bzw. gerendert hat. dort müßten dann die x/y Koordinaten übergeben werden. Diese kann man dann in requestMapTileRaw wieder verwenden um das entsprechende tile anzufragen.
    So könnte man gewährleisten das immer nur neue tiles übertragen werden und keine alten.
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Oh das wäre cool, dann kann ich vielleicht diese Woche noch eine erste Version meines Plugins veröffentlichen.
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Oh super dann werde ich das nachher wenn ich am PC bin direkt mal ausprobieren.
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Funktioniert super, bin gerade mal durch unbekanntes Gebiet und habe in bekanntem Gebiet auf resresh gedrückt. Keine Einschränkungen bzgl. lag oder sowas bemerkt, auch wenn bei refresh gleich mehrere übertragen werden. Eis ist mir noch aufgefallen das auch vorher schon war. im Server-Log steht immer SERVER MAPTILE 0 0 UPLOAD FROM _name_ COMPLETED! also immer 0 0 ;)
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • @red51 nachdem ich bemerkte das von meinen Spielern, wenn sie neues Gebiet erkunden gesprenkelte maps zurück kommen (teile fehlen) habe ich es selbst getestet und es werden nicht alle erstellten map files übertragen.

    Hier der code den ich verwende:

    Java Source Code

    1. @EventMethod
    2. public void onPlayerGenerateMapTile(PlayerGenerateMapTileEvent event) {
    3. Player player = event.getPlayer();
    4. int tileX = event.getX();
    5. int tileY = event.getY();
    6. final File destinationFile = new File(tileRoot + "mt_" + tileX + "_" + tileY);
    7. String compareHash = FileUtils.getMd5(destinationFile);
    8. player.requestMapTileRaw(tileX, tileY, compareHash, (byte[] tile) -> {
    9. if (tile == null) {
    10. // player.sendTextMessage("no tile returned");
    11. } else {
    12. FileUtils.writeBytesToFile(tile, destinationFile);
    13. }
    14. });
    15. }
    Display All
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Jain lokal sind die tiles ja da, wenn ich z.b. in eine Richtung laufe habe ich den Effekt das 3 tiles lokal erstellt werden aber nur 1 wird übertragen.
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Ich könnte mir vorstellen, dass der Client möglicherweise sehr lange (oder länger als üblich) braucht, um die Map-Datei auf die Festplatte zu speichern. Das Speichern läuft in einem separaten Thread ab, sodass das Event schon vorher getriggert wird (besonders dann, wenn ein guter Ping zwischen Client und Server besteht). Wenn das Speichern länger dauert als 2x der Ping (Event zum Server senden und Anforderung des Map-Tiles vom Server) kommt eine leere Antwort zurück zum Server (der Client prüft auf Performance-Gründen nur, ob die Map-Tile Datei vorhanden ist).

    Ich werde das mit dem nächsten Hotfix ändern ;)

    Wenn du dieses Phänomen bei dir reproduzieren kannst, könntest du ggf. im Vorfeld prüfen, ob es funktioniert, wenn du die "requestMapTileRaw()" Funktion verzögert aufrufst. Dafür gibt es in der Plugin Klasse die Funktion "executeDelayed()", zB:

    Java Source Code

    1. //4 Sekunden Verzögerung
    2. executeDelayed(4f, () -> {
    3. player.requestMapTileRaw(...);
    4. });

    Wenn die Map-Tiles dann korrekt übertragen werden, dürfte o.g. Vermutung tatsächlich zutreffen (ändere das mit dem executeDelayed() aber am besten danach wieder, da das sonst nur unnötigen Overhead mitbringt^^)
  • Ok werde ich mal heute Abend prüfen falls ich's zeitlich schaffe, danke! Hatte auch schon überlegt ob ich die requests in eine art queue packen soll um die pro-player sequentiell abzurufen damit nicht mehrere tiles gleichzeitig zu lag führen (ist bisher nie passiert aber kann ja immer mal jemand ne schlechte Leitung haben)
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334