ServerPlugin EntityExplodeEvent

Dieses Thema im Forum "Programmierung" wurde erstellt von MrPyro13, 29. Oktober 2014.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Hallo Community,

    ich habe mal eine Frage:
    Wie erstelle ich einen Block aus einem Material?
    Block wool = ........


    PS: Ist ein Block eigentlich ein Entity?
     
    #1
  2. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Code (Text):
    1. Block wool = new CraftBlock(Chunk, int, int, int);
    Das ganze macht nur wenig Sinn, da der Block dann den gleichen Block repräsentiert wie Bukkit.getWorld(String).getBlock(int, int, int). Und dann Block#setType(Material);
    Warum brauchst du das denn?
    Ein Block ist kein Entity. Es sei denn der Block ist ein FallingBlock, dann ist der Block aber kein Block mehr.
     
    #2
  3. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Nunja, ich möchte halt folgendes:
    Bestimmte Blöcke sollen durch TNT/Explosionen nicht zerstört werden.
     
    #3
  4. games6471
    Online

    games6471

  5. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    #5
  6. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Du gehst alle Blöcke durch und prüfst das Material von dem Block (Block#getType()). Wenn das Material das Material ist, welches entfernt werden soll, entfernst du diesen Block aus der Liste.
     
    #6
    MrPyro13 gefällt das.
  7. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    #7
  8. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    #8
  9. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Habe es nun so gelöst:
    Code (Text):
    1.     @EventHandler
    2.     public void onBlockDamage(EntityExplodeEvent ev) {
    3.        
    4.         if (ev.getEntityType() == EntityType.PRIMED_TNT) {
    5.            
    6.             List<Block> blocks = ev.blockList();
    7.            
    8.             for (int i = 0; i < blocks.size();) {
    9.                
    10.                 if (blocks.get(i).getType() == Material.WOOL) {
    11.                     blocks.remove(i);
    12.                 } else {
    13.                     i++;
    14.                 }
    15.                
    16.             }
    17.            
    18.         }
    19.        
    20.     }
    21.  
     
    #9
  10. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Dann erstellst du ein (Hash)Set<Material> mit allen Materialien und statt "blocks.get(i).getType == type" benutzt du einfach "Set#contains(blocks.get(i).getType)". Nachdenken könnte beim nächsten Mal nicht schaden :p
     
    #10
  11. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Bevor ich dieses Beitrag gelesen habe hatte ich schon die Lösung. :p
    Habe nun noch eine letzte, abschließende Frage:

    Wie unterbinde ich, das bei der Zerstörung der Blöcke die Items droppen? :)
     
    #11
  12. Darkangel93424
    Offline

    Darkangel93424

    Registriert seit:
    28. Januar 2012
    Beiträge:
    20
    Minecraft:
    Darkangel
    Code (Text):
    1.  
    2. @EventHandler
    3.     public void onBlockDamage(EntityExplodeEvent ev) {
    4.  
    5.         if (ev.getEntityType() == EntityType.PRIMED_TNT) {
    6.      
    7.             List<Block> blocks = ev.blockList();
    8.      
    9.             for (int i = 0; i < blocks.size();) {
    10.                    blocks.getDrops().clear();//Entfernt den Drop
    11.                 if (blocks.get(i).getType() == Material.WOOL) {
    12.                     blocks.remove(i);
    13.                 } else {
    14.                     i++;
    15.                 }
    16.          
    17.             }
    18.      
    19.         }
    20.  
    21.     }
    22.  
     
    #12
  13. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    List#getDrops()? Wie soll das denn funktionieren?
     
    #13
  14. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Funktioniert nicht :(
    Meine Idee:
    Umkreis der Explosion und alle in diesem Umkreis gedroppten Items auf die ItemID x überprüfen und dann ggf. entfernen. Mein Problem ist das getten des Umkreis und das Getten der ItemID
     
    #14
  15. Darkangel93424
    Offline

    Darkangel93424

    Registriert seit:
    28. Januar 2012
    Beiträge:
    20
    Minecraft:
    Darkangel
    sollte auch gar nicht an die Liste sondern an den Block, mein Fehler ^^
    Außerdem solltest du wenn du eine Schleife durchgehst nicht dabei entfernen, könnte modifyconcurrentexceptions geben (daher die zweite Liste)
    Code (Text):
    1.  
    2. @EventHandler
    3. public void onBlockDamage(EntityExplodeEvent ev)
    4. {
    5. if (ev.getEntityType() == EntityType.PRIMED_TNT)
    6. {
    7. List<Block> blocks = ev.blockList();
    8. List<Block> blocks_to_remove = ev.blockList();
    9.  
    10. for (Block b : blocks)
    11. {
    12. if (b.getType() == Material.WOOL)
    13. {
    14. continue;}
    15. b.getDrops().clear();//Entfernt den Drop
    16. blocks_to_remove.add(b);}
    17.  
    18. for (Block b : blocks_to_remove)
    19. {
    20. blocks.remove(b);}
    21. }}
    22.  
     
    #15
  16. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Es wird immer eine neue Liste erstellt, wenn man die Methode aufruft, das ganze hat also keinen Sinn.
    Und: blocks und blocks_to_remove ist die selbe Liste. Von daher macht dein Code keinen Sinn.
     
    #16
  17. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Könnt ihr mir bitte noch verraten wie das geht:
    Und wenn ihr denkt das es nicht geht dann schreibt das bitte :(
     
    #17
  18. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    http://jd.bukkit.org/rb/doxygen/de/...Entity.html#a2822a7a6b8922952a9e7c5434f6c3fbf und http://jd.bukkit.org/rb/doxygen/dc/dfc/interfaceorg_1_1bukkit_1_1entity_1_1Item.html sollten helfen. Nahe Entities durchgehen, Instanceof-Check für Item und dann Item#getItemStack(). Entity#getNearbyEntities(double, double, double) kannst du auf das explodierte Entity aufrufen.
    Das ganze musst du aber etwas nach dem Event machen, da auch erst nach dem Event die Blöcke zerstört werden und dann erst die Items gedroppt werden.
     
    #18
  19. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Danke! Kann geschlossen werden ;)
     
    #19
Status des Themas:
Es sind keine weiteren Antworten möglich.