minecraft Blöcke reload

  • Guten Tag ich habe folgendes Problem:

    Nämlich habe ich ein System Programmiert das wenn ein Spieler einen Diamant block anklickt, das dich dann der block in einen Obsidian block verwandelt.

    Ich habe einen Timer eingebaut sodass sich dieser block innerhalb von 5 min wieder in einen Diamant block verwandelt.

    So jetzt habe ich folgendes Problem:

    Wenn der Timmer abgelaufen ist verwandelt sich die Block id in den Diablock aber Grafisch bleibt es ein Obsidian Block.

    Nur wenn man re joint dann sieht man auch grafisch das dort ein Diamant block ist. Ich hoffe das ihr mir sagen könnt ob die blöcke irgendwie reloaded werden können wie bei reconnecten.

    MFG. XCraft_MC

  • Wäre gut wenn du uns zeigst wie du es derzeit machst ^^ da ohne zu wissen wie du es machst man nicht wissen kann warum es so ist.


    An sich sollte eigentlich wenn du den Block normal setzen lässt es keinerlei Probleme geben.

  • Hallo hier ist der Timer wo die blöcke replaced werden:


    timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {


    @Override

    public void run() {


    Location block = e.getClickedBlock().getLocation();


    if(block.getBlock().getType().equals(Material.OBSIDIAN)){


    block.getBlock().setType(Material.QUARTZ_ORE);

    }


    }


    },5000,5000);


    nicht wundern habe ausversehen statt Quartz_ore diablock geschrieben ganz oben.


    MFG: XCraft_MC

    • Hilfreich

    Versuchs mal mit block.getBlock().setType(Material.QUARTZ_ORE, true);

    Das sollte glaube ich nicht bringen. Laut JavaDoc setzt der Bool nur, ob der Block die physics beachten soll oder nicht.

    Normalerweise sollte sich der Block automatisch auch für den Player updaten.

    Man kann aber alle Spieler durch Iterieren und dann die Methode PLAYER.sendBlockChange() aufrufen. Damit sollte das BlockUpdate auch beim Spieler ankommen. (siehe JavaDoc)

  • Ich glaube es liegt daran, dass du das mit dieser TimerLib machst. Probier es mal mit dem hauseigenen Scheduler von Bukkit.


    Mit freundlichen Grüßen,

    Rincewind

    Das ist nicht irgendeine "Third Party Libary", sondern eine "Default Libary" in Java seit Java 7, ich kann dir versichern es liegt nicht daran xD


    XCraft_MC Ich denke jedoch das du einen Fehler in deinem Timer hast. Den wenn ich das richtig gelesen habe führst du den Task einmal nach 5000 ms aus und dann startet er eine Schleife die ernuet alle 5000 ms ausgeführt wird! Ist das so gewollt? Ich denke du willst nur einen Block wieder in seinen Ursprungs Zustand zurücksetzten?

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

  • Das ist nicht irgendeine "Third Party Libary", sondern eine "Default Libary" in Java seit Java 7, ich kann dir versichern es liegt nicht daran xD

    https://docs.oracle.com/javase…/api/java/util/Timer.html


    Direkt der erste Satz. Ich habe nicht gemeint, dass die Lib eventuell nicht funktioniert. (Das kann man ohne Zweifel ausschließen, da nach eine reconnect der richtige block angezeigt wird.) Meine These ist, dass das Problem durch den neuen Thread entsteht. Die #getBlock Methode sollte man ohne hin nur im Mainthread aufrufen. Unterumständen lädt die Methode nämlich einen ganzen Chuck nach. Spätestens dann fliegt dir das ganze um die Ohren.


    XCraft_MC Ich denke jedoch das du einen Fehler in deinem Timer hast. Den wenn ich das richtig gelesen habe führst du den Task einmal nach 5000 ms aus und dann startet er eine Schleife die ernuet alle 5000 ms ausgeführt wird! Ist das so gewollt? Ich denke du willst nur einen Block wieder in seinen Ursprungs Zustand zurücksetzten?

    Das, was XCraft_MC mit den Timern macht, ergibt zwar keinen Sinn, aber wenn das passiert, was du beschreibst, sollte der Code trotzdem funktionieren.


    Mit freundlichen Grüßen,

    Rincewind

  • Das, was XCraft_MC mit den Timern macht, ergibt zwar keinen Sinn, aber wenn das passiert, was du beschreibst, sollte der Code trotzdem funktionieren.

    Klar darauf wolle ich nicht hinweisen, das sollte lediglich als Info dazu dienen das er, wenn er das so macht, früher oder später dem Server der RAM ausgeht weil er hunderte Threads hat die alle 5 Sekunden diese Blöcke neusetzten :D


    Zum eigentlichen Problem:


    Hier die Lösung es scheint tatsächlich daran zu liegen das es nicht über den Main Thread ausgeführt wird. Verstehe ich zwar nur teilweise warum aber naja ist halt Mojangs verdrehte Art zu denken.

    Hier noch der Thread auf spigotmc.org


    Also wie Rincewind34 schrieb verwende den "Bukkit Scheduler" zum setzten der Blöcke und alles sollte funktionieren!

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!