• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Brauche Hilf beim Spawnen/Droppen von Items, die nach einer bestimmten Zeit wieder gelöscht werden!

Walfisch

Minecrafter
Registriert
23 Mai 2015
Beiträge
26
Alter
25
Diamanten
250
Minecraft
Walfisch
Ich bin momentan dabei ein LobbySystem zu cooden. Nun bin ich auf ein Problem gestoßen.
Ich möchte, dass wenn man in einer ArrayList ist, dass über einem Items(Melonen) gespawnt werden.
Diese Items(Melonen) sollen nach einer bestimmeten Zeit wieder gelöscht werden.
Da allerdings das Item im Scheduler definiert wird kann man in einem zweiten Scheduler nicht darauf zugreifen um dieses Item wieder zu löschen.
Danke schonmal im Voraus für eure Antworten!


Code:
            if (e.getCurrentItem().getType() == Material.MELON) {

                if (p.hasPermission("Gadgets.bt")) {
               
                    p.playSound(p.getLocation(), Sound.CHICKEN_EGG_POP, 2, 2);
                    p.playEffect(p.getLocation(), Effect.FLAME, 2);
                    Main.hatr.add(p.getName());
                    e.getView().close();
                   
                        Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
                           
                            @Override
                            public void run() {
                                final Item x = p.getWorld().dropItem(p.getLocation().add(0, 3, 0), new ItemStack(Material.MELON));
                               
                            }
                        }, 0, 20);
                       
                        Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
                           
                            @Override
                            public void run() {
                               
                                x.remove;
                               
                            }
                        }, 10, 20);
 

Walfisch

Minecrafter
Registriert
23 Mai 2015
Beiträge
26
Alter
25
Diamanten
250
Minecraft
Walfisch
Danke für die Antwort, doch mir ist leider nicht klar wie ich das alter setzen kann.
So funktioniert es leider nicht:

Code:
            if (e.getCurrentItem().getType() == Material.MELON) {

                if (p.hasPermission("Gadgets.bt")) {
               
                    p.playSound(p.getLocation(), Sound.CHICKEN_EGG_POP, 2, 2);
                    p.playEffect(p.getLocation(), Effect.FLAME, 2);
                    Main.hatr.add(p.getName());
                    e.getView().close();
                   
                    final ItemStack melone = new ItemStack(Material.MELON);
                        Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
                           
                            @Override
                            public void run() {
                                final Item x = p.getWorld().dropItem(p.getLocation().add(0, 3, 0), melone);
                                x.setTicksLived(80);
                               
                               
                            }
                        }, 0, 20);

Es wäre nett, wenn du mir einen Code zukommen lassen könntest. :)
 

Walfisch

Minecrafter
Registriert
23 Mai 2015
Beiträge
26
Alter
25
Diamanten
250
Minecraft
Walfisch
Erstmal Danke.
In meiner Spigot Datei steht, dass die Items nach 6000 Ticks despawnen. Daraufhin hab ich die x.setTicksLived einmal auf 6000 und 5800 gestellt, doch es hat sich komplett nix geändert. Die Items despawnen erst nach der regulären Zeit ( 5 Minuten/Standert despawn Zeit).
Also geht das leider auch nicht.
 

Inkemann

Braumeister
Registriert
3 Mai 2015
Beiträge
339
Diamanten
301
Minecraft
Inkemann
Der einfache und offensichtliche Weg ist, die UUID des Items zu speichern und es anhand derer im zweiten Scheduler wieder zu finden und dann zu entfernen.
Gibt sicher elegantere Wege, aber da müsste ich nochmal länger als 10 Sekunden drüber nachdenken.
 
V

Verschraubt

Guest
Das Problem dabei ist: Wenn man den String uuid in der ersten Scheduler festlegt, wie kommt Sie dann in die zweite? Da sind wir wieder beim Anfang. Wenn das so gehen würde, hatten wir auch anstatt des Strings gleich das Item nehmen können ^^
 

Inkemann

Braumeister
Registriert
3 Mai 2015
Beiträge
339
Diamanten
301
Minecraft
Inkemann
Eine ArrayList ist völlig übertrieben, wenn man nur eine Referenz aufnehmen will. Möglicherweise bietet sich hier WeakReference an.
Und wenn man eh schon Speicher reserviert hat, dann muss man auch nicht mehr die UUID aufnehmen, sondern kann direkt die Referenz auf das Item benutzen. UUIDs sind hier sowieso im Nachteil, weil kein internes UUID->Entity Mapping existiert und man das Item deswegen durch eine Schleife wiedersuchen müsste.
 
Oben