• 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!

EntityExplodeEvent

Status
Für weitere Antworten geschlossen.

MrPyro13

Workaholic
Registriert
29 April 2013
Beiträge
826
Diamanten
300
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?
 
Zuletzt bearbeitet:

MiCrJonas

Threadripper
Registriert
29 Oktober 2012
Beiträge
1.064
Diamanten
0
Code:
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.
 

MrPyro13

Workaholic
Registriert
29 April 2013
Beiträge
826
Diamanten
300
Minecraft
MrPyro13
Habe es nun so gelöst:
Code:
    @EventHandler
    public void onBlockDamage(EntityExplodeEvent ev) {
       
        if (ev.getEntityType() == EntityType.PRIMED_TNT) {
           
            List<Block> blocks = ev.blockList();
           
            for (int i = 0; i < blocks.size();) {
               
                if (blocks.get(i).getType() == Material.WOOL) {
                    blocks.remove(i);
                } else {
                    i++;
                }
               
            }
           
        }
       
    }
 
Zuletzt bearbeitet:

MiCrJonas

Threadripper
Registriert
29 Oktober 2012
Beiträge
1.064
Diamanten
0
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
 

MrPyro13

Workaholic
Registriert
29 April 2013
Beiträge
826
Diamanten
300
Minecraft
MrPyro13
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
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? :)
 
Zuletzt bearbeitet:

NoWayOut

Minecrafter
Registriert
28 Januar 2012
Beiträge
20
Diamanten
0
Minecraft
Darkangel
Code:
@EventHandler
    public void onBlockDamage(EntityExplodeEvent ev) {
 
        if (ev.getEntityType() == EntityType.PRIMED_TNT) {
     
            List<Block> blocks = ev.blockList();
     
            for (int i = 0; i < blocks.size();) {
                   blocks.getDrops().clear();//Entfernt den Drop
                if (blocks.get(i).getType() == Material.WOOL) {
                    blocks.remove(i);
                } else {
                    i++;
                }
         
            }
     
        }
 
    }
 

NoWayOut

Minecrafter
Registriert
28 Januar 2012
Beiträge
20
Diamanten
0
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:
@EventHandler
public void onBlockDamage(EntityExplodeEvent ev)
{
if (ev.getEntityType() == EntityType.PRIMED_TNT)
{
List<Block> blocks = ev.blockList();
List<Block> blocks_to_remove = ev.blockList();

for (Block b : blocks)
{
if (b.getType() == Material.WOOL)
{
continue;}
b.getDrops().clear();//Entfernt den Drop
blocks_to_remove.add(b);}

for (Block b : blocks_to_remove)
{
blocks.remove(b);}
}}
 

MrPyro13

Workaholic
Registriert
29 April 2013
Beiträge
826
Diamanten
300
Minecraft
MrPyro13
Könnt ihr mir bitte noch verraten wie das geht:
Wie unterbinde ich, das bei der Zerstörung der Blöcke die Items droppen?
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
Und wenn ihr denkt das es nicht geht dann schreibt das bitte :(
 

MiCrJonas

Threadripper
Registriert
29 Oktober 2012
Beiträge
1.064
Diamanten
0
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.
 
Status
Für weitere Antworten geschlossen.
Oben