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

Dieses Thema im Forum "Programmierung" wurde erstellt von Walfisch, 24. Oktober 2015.

  1. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    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 (Text):
    1.             if (e.getCurrentItem().getType() == Material.MELON) {
    2.  
    3.                 if (p.hasPermission("Gadgets.bt")) {
    4.                
    5.                     p.playSound(p.getLocation(), Sound.CHICKEN_EGG_POP, 2, 2);
    6.                     p.playEffect(p.getLocation(), Effect.FLAME, 2);
    7.                     Main.hatr.add(p.getName());
    8.                     e.getView().close();
    9.                    
    10.                         Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
    11.                            
    12.                             @Override
    13.                             public void run() {
    14.                                 final Item x = p.getWorld().dropItem(p.getLocation().add(0, 3, 0), new ItemStack(Material.MELON));
    15.                                
    16.                             }
    17.                         }, 0, 20);
    18.                        
    19.                         Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
    20.                            
    21.                             @Override
    22.                             public void run() {
    23.                                
    24.                                 x.remove;
    25.                                
    26.                             }
    27.                         }, 10, 20);
    28.  
     
    #1
  2. JTK222
    Online

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Du spawnst ja einen Itemstack und diese haben in MC eine maximal lebensdauer setz die einfach so gering bzw das aktuele alter so hoch dass es nach der zeit despawnt
     
    #2
  3. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    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 (Text):
    1.             if (e.getCurrentItem().getType() == Material.MELON) {
    2.  
    3.                 if (p.hasPermission("Gadgets.bt")) {
    4.                
    5.                     p.playSound(p.getLocation(), Sound.CHICKEN_EGG_POP, 2, 2);
    6.                     p.playEffect(p.getLocation(), Effect.FLAME, 2);
    7.                     Main.hatr.add(p.getName());
    8.                     e.getView().close();
    9.                    
    10.                     final ItemStack melone = new ItemStack(Material.MELON);
    11.                         Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    12.                            
    13.                             @Override
    14.                             public void run() {
    15.                                 final Item x = p.getWorld().dropItem(p.getLocation().add(0, 3, 0), melone);
    16.                                 x.setTicksLived(80);
    17.                                
    18.                                
    19.                             }
    20.                         }, 0, 20);
    21.  
    22.  
    23.                
    Es wäre nett, wenn du mir einen Code zukommen lassen könntest. :)
     
    #3
  4. JTK222
    Online

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Sorry, arbeite nie mit Bukkit/Spigot ich weiß nur das es selbst mit commandoblöcken machbar ist und müsste von daher auch mit Bukkit/spigot gehen.
     
    #4
  5. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    Minecraft:
    Walfisch
    Achso. Trozdem Danke.
    Dann stelle ich die Frage weiterhin an die anderen :)
     
    #5
  6. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    1. Ich glaub kein entity lebt nur 4 sekunden (es sei denn du hast es so eingestellt)
    2. wenn du spigot benutzt geh in die spigot.yml und such item-despawn-rate:
    -> guck dir die zahl an und änder x.setTicksLived() dem entsprechend
    3. setPickupDelay(int delay) solltest du auch nutzen
     
    #6
  7. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    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.
     
    #7
  8. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    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.
     
    #8
  9. Verschraubt
    Offline

    Verschraubt

    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 ^^
     
    #9
  10. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    Minecraft:
    Walfisch
    Daran scheitern wir momentan. Es wäre nett, wenn du uns einen Code schicken könntest.
     
    #10
  11. JTK222
    Online

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    öhm... erstellt eine array list außerhalb des schedulers und speicherts auf sie ...
     
    #11
  12. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    Minecraft:
    Inkemann
    Mach eine eigene Klasse ItemReference, die eine Referenz auf ein Item aufnehmen kann. Dann speicher das Item da drin und lies es im zweiten Scheduler wieder aus. Ist wohl der einfachste Weg.
     
    #12
  13. JTK222
    Online

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    ne eigene klasse dafür ist extrem übertrieben ....
    Eine Array List die die UUID speicher ist völlig genügend.
    Und so schwer wird es nicht sein diese über dem scheduler zu erstellen.
     
    #13
  14. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    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.
     
    #14
  15. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    Minecraft:
    Walfisch
    Vielen Dank für eure Antworten! :)
    Ihr habt uns sehr geholfen! :)
     
    #15