From 45031672838e5686bb3dbb8909f2fdc5b40d6106 Mon Sep 17 00:00:00 2001
From: feildmaster <admin@feildmaster.com>
Date: Mon, 12 Mar 2012 17:55:02 -0500
Subject: [PATCH] Fixed EntityDamageByEntityEvent to call for every attackable
 entity. Fixes BUKKIT-1129, Fixes BUKKIT-1054 and Fixes BUKKIT-147.

---
 .../net/minecraft/server/EntityArrow.java     |  4 +-
 .../java/net/minecraft/server/EntityEgg.java  |  8 ++--
 .../minecraft/server/EntityEnderCrystal.java  |  5 ++
 .../net/minecraft/server/EntityFireball.java  | 39 +++++++---------
 .../minecraft/server/EntityFishingHook.java   |  3 +-
 .../net/minecraft/server/EntityHuman.java     | 44 +-----------------
 .../net/minecraft/server/EntityLiving.java    | 11 ++++-
 .../net/minecraft/server/EntityMonster.java   | 25 +---------
 .../minecraft/server/EntitySmallFireball.java | 34 ++++----------
 .../net/minecraft/server/EntitySnowball.java  | 38 ---------------
 .../craftbukkit/event/CraftEventFactory.java  | 46 ++++++++++---------
 11 files changed, 72 insertions(+), 185 deletions(-)
 delete mode 100644 src/main/java/net/minecraft/server/EntitySnowball.java

diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java
index d258e0fab6..ffc219cbea 100644
--- a/src/main/java/net/minecraft/server/EntityArrow.java
+++ b/src/main/java/net/minecraft/server/EntityArrow.java
@@ -221,8 +221,8 @@ public class EntityArrow extends Entity {
                         }
                         // CraftBukkit end
                     }
-                    // CraftBukkit - entity.damageEntity -> event function
-                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleProjectileEvent(projectile, entity, damagesource, l)) {
+
+                    if (movingobjectposition.entity.damageEntity(damagesource, l)) {
                         if (movingobjectposition.entity instanceof EntityLiving) {
                             ++((EntityLiving) movingobjectposition.entity).aI;
                             if (this.n > 0) {
diff --git a/src/main/java/net/minecraft/server/EntityEgg.java b/src/main/java/net/minecraft/server/EntityEgg.java
index 4b311eb726..167c1e8482 100644
--- a/src/main/java/net/minecraft/server/EntityEgg.java
+++ b/src/main/java/net/minecraft/server/EntityEgg.java
@@ -23,13 +23,11 @@ public class EntityEgg extends EntityProjectile {
     }
 
     protected void a(MovingObjectPosition movingobjectposition) {
-        // CraftBukkit start
-        if (movingobjectposition.entity != null) {
-            if (org.bukkit.craftbukkit.event.CraftEventFactory.handleProjectileEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity, DamageSource.projectile(this, this.shooter), 0)) {
-                ; // Original code does nothing *yet*
-            }
+        if (movingobjectposition.entity != null && movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.shooter), 0)) {
+            ;
         }
 
+        // CraftBukkit start
         boolean hatching = !this.world.isStatic && this.random.nextInt(8) == 0;
         int numHatching = (this.random.nextInt(32) == 0) ? 4 : 1;
         if (!hatching) {
diff --git a/src/main/java/net/minecraft/server/EntityEnderCrystal.java b/src/main/java/net/minecraft/server/EntityEnderCrystal.java
index 5079d2295d..cd48def21e 100644
--- a/src/main/java/net/minecraft/server/EntityEnderCrystal.java
+++ b/src/main/java/net/minecraft/server/EntityEnderCrystal.java
@@ -50,6 +50,11 @@ public class EntityEnderCrystal extends Entity {
             this.b = 0;
             if (this.b <= 0) {
                 if (!this.world.isStatic) {
+                    // CraftBukkit start - All non-living entities need this
+                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, i)) {
+                        return false;
+                    }
+                    // CraftBukkit end
                     this.die();
                     this.world.explode(this, this.locX, this.locY, this.locZ, 6.0F); // CraftBukkit - (Entity) null -> this.
                 } else {
diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java
index ae7cd6f846..b4616af89b 100644
--- a/src/main/java/net/minecraft/server/EntityFireball.java
+++ b/src/main/java/net/minecraft/server/EntityFireball.java
@@ -5,7 +5,6 @@ import java.util.List;
 // CraftBukkit start
 import org.bukkit.craftbukkit.entity.CraftEntity;
 import org.bukkit.entity.Explosive;
-import org.bukkit.entity.Projectile;
 import org.bukkit.event.entity.ExplosionPrimeEvent;
 import org.bukkit.event.entity.ProjectileHitEvent;
 // CraftBukkit end
@@ -137,6 +136,12 @@ public class EntityFireball extends Entity {
 
             if (movingobjectposition != null) {
                 this.a(movingobjectposition);
+                // CraftBukkit start
+                if (this.dead) {
+                    ProjectileHitEvent phe = new ProjectileHitEvent((org.bukkit.entity.Projectile) this.getBukkitEntity());
+                    this.world.getServer().getPluginManager().callEvent(phe);
+                }
+                // CraftBukkit end
             }
 
             this.locX += this.motX;
@@ -189,30 +194,18 @@ public class EntityFireball extends Entity {
 
     protected void a(MovingObjectPosition movingobjectposition) {
         if (!this.world.isStatic) {
-            // CraftBukkit start
-            Projectile projectile = (Projectile) this.getBukkitEntity();
-            ProjectileHitEvent phe = new ProjectileHitEvent(projectile);
-            this.world.getServer().getPluginManager().callEvent(phe);
-            // CraftBukkit end
-            if (!this.world.isStatic) {
-                // CraftBukkit start
-                if (movingobjectposition.entity != null) {
-                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleProjectileEvent(projectile, movingobjectposition.entity, DamageSource.projectile(this, this.shooter), 0)) {
-                        ;
-                    }
-                }
-
-                ExplosionPrimeEvent event = new ExplosionPrimeEvent((Explosive) CraftEntity.getEntity(this.world.getServer(), this));
-                this.world.getServer().getPluginManager().callEvent(event);
-
-                if (!event.isCancelled()) {
-                    // give 'this' instead of (Entity) null so we know what causes the damage
-                    this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire());
-                }
-                // CraftBukkit end
+            if (movingobjectposition.entity != null && movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 4)) {
+                ;
             }
+            // CraftBukkit start
+            ExplosionPrimeEvent event = new ExplosionPrimeEvent((Explosive) CraftEntity.getEntity(this.world.getServer(), this));
+            this.world.getServer().getPluginManager().callEvent(event);
 
-            // this.world.createExplosion((Entity) null, this.locX, this.locY, this.locZ, 1.0F, true); // CraftBukkit
+            if (!event.isCancelled()) {
+                // give 'this' instead of (Entity) null so we know what causes the damage
+                this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire());
+            }
+            // CraftBukkit end
             this.die();
         }
     }
diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java
index 1c54ec2a0b..ca0fc8351d 100644
--- a/src/main/java/net/minecraft/server/EntityFishingHook.java
+++ b/src/main/java/net/minecraft/server/EntityFishingHook.java
@@ -184,8 +184,7 @@ public class EntityFishingHook extends Entity {
 
             if (movingobjectposition != null) {
                 if (movingobjectposition.entity != null) {
-                    // CraftBukkit - entity.damageEntity -> event function
-                    if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleProjectileEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), entity, DamageSource.projectile(this, this.owner), 0)) {
+                    if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.owner), 0)) {
                         this.hooked = movingobjectposition.entity;
                     }
                 } else {
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index a5da800d8a..448c4f9f06 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -9,15 +9,10 @@ import org.bukkit.craftbukkit.entity.CraftItem;
 import org.bukkit.craftbukkit.TrigMath;
 import org.bukkit.entity.HumanEntity;
 import org.bukkit.entity.Player;
-import org.bukkit.entity.Projectile;
 import org.bukkit.event.entity.EntityCombustByEntityEvent;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.EntityTargetEvent;
 import org.bukkit.event.player.PlayerBedEnterEvent;
 import org.bukkit.event.player.PlayerBedLeaveEvent;
 import org.bukkit.event.player.PlayerDropItemEvent;
-import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
 // CraftBukkit end
 
 public abstract class EntityHuman extends EntityLiving {
@@ -309,7 +304,7 @@ public abstract class EntityHuman extends EntityLiving {
 
         if (this.world.difficulty == 0 && this.getHealth() < this.getMaxHealth() && this.ticksLived % 20 * 12 == 0) {
             // CraftBukkit - added regain reason of "REGEN" for filtering purposes.
-            this.heal(1, RegainReason.REGEN);
+            this.heal(1, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN);
         }
 
         this.inventory.i();
@@ -593,27 +588,6 @@ public abstract class EntityHuman extends EntityLiving {
                     }
 
                     if (entity1 instanceof EntityLiving) {
-                        // CraftBukkit start - this is here instead of EntityMonster because EntityLiving(s) that aren't monsters
-                        // also damage the player in this way. For example, EntitySlime.
-
-                        // We handle projectiles in their individual classes!
-                        boolean isProjectile = damagesource instanceof EntityDamageSourceIndirect && ((EntityDamageSourceIndirect) damagesource).getProximateDamageSource().getBukkitEntity() instanceof Projectile;
-
-                        if (!isProjectile) {
-                            org.bukkit.entity.Entity damager = ((Entity) entity1).getBukkitEntity();
-                            org.bukkit.entity.Entity damagee = this.getBukkitEntity();
-
-                            EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(damager, damagee, EntityDamageEvent.DamageCause.ENTITY_ATTACK, i);
-                            Bukkit.getPluginManager().callEvent(event);
-
-                            if (event.isCancelled() || event.getDamage() == 0) {
-                                return false;
-                            }
-
-                            i = event.getDamage();
-                        }
-                        // CraftBukkit end
-
                         this.a((EntityLiving) entity1, false);
                     }
 
@@ -771,22 +745,6 @@ public abstract class EntityHuman extends EntityLiving {
                     i += this.random.nextInt(i / 2 + 2);
                 }
 
-                // CraftBukkit start - Don't call the event when the entity is human since it will be called with damageEntity
-                if ((entity instanceof EntityLiving || entity instanceof EntityComplexPart || entity instanceof EntityEnderCrystal) && !(entity instanceof EntityHuman)) {
-                    org.bukkit.entity.Entity damager = this.getBukkitEntity();
-                    org.bukkit.entity.Entity damagee = (entity == null) ? null : entity.getBukkitEntity();
-
-                    EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(damager, damagee, EntityDamageEvent.DamageCause.ENTITY_ATTACK, i);
-                    Bukkit.getPluginManager().callEvent(event);
-
-                    if (event.isCancelled() || event.getDamage() == 0) {
-                        return;
-                    }
-
-                    i = event.getDamage();
-                }
-                // CraftBukkit end
-
                 i += k;
                 boolean flag1 = entity.damageEntity(DamageSource.playerAttack(this), i);
 
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index abf1ec22e4..22bf409f4d 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -602,6 +602,16 @@ public abstract class EntityLiving extends Entity {
                 this.aE = 1.5F;
                 boolean flag = true;
 
+                // CraftBukkit start
+                if (damagesource instanceof EntityDamageSource) {
+                    org.bukkit.event.entity.EntityDamageEvent event = CraftEventFactory.handleEntityDamageEvent(this, damagesource, i);
+                    if (event.isCancelled()) {
+                        return false;
+                    }
+                    i = event.getDamage();
+                }
+                // CraftBukkit end
+
                 if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) {
                     if (i <= this.lastDamage) {
                         return false;
@@ -829,7 +839,6 @@ public abstract class EntityLiving extends Entity {
 
                 this.damageEntity(DamageSource.FALL, i);
             }
-
             // CraftBukkit end
             int j = this.world.getTypeId(MathHelper.floor(this.locX), MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height), MathHelper.floor(this.locZ));
 
diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java
index 5f6dcf65c2..170dfcd724 100644
--- a/src/main/java/net/minecraft/server/EntityMonster.java
+++ b/src/main/java/net/minecraft/server/EntityMonster.java
@@ -1,11 +1,6 @@
 package net.minecraft.server;
 
-// CraftBukkit start
-import org.bukkit.Bukkit;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.EntityTargetEvent;
-// CraftBukkit end
+import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit
 
 public abstract class EntityMonster extends EntityCreature implements IMonster {
 
@@ -82,24 +77,6 @@ public abstract class EntityMonster extends EntityCreature implements IMonster {
             i -= 2 << this.getEffect(MobEffectList.WEAKNESS).getAmplifier();
         }
 
-        // CraftBukkit start - this is still duplicated here and EntityHuman because it's possible for lastDamage EntityMonster
-        // to damage another EntityMonster, and we want to catch those events.
-        // This does not fire events for slime attacks, av they're not lastDamage EntityMonster.
-        if (entity instanceof EntityLiving && !(entity instanceof EntityHuman)) {
-            org.bukkit.entity.Entity damagee = (entity == null) ? null : entity.getBukkitEntity();
-
-            EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(this.getBukkitEntity(), damagee, EntityDamageEvent.DamageCause.ENTITY_ATTACK, this.damage);
-            Bukkit.getPluginManager().callEvent(event);
-            i = event.getDamage();
-
-            if (!event.isCancelled()) {
-                return entity.damageEntity(DamageSource.mobAttack(this), i);
-            }
-
-            return false;
-        }
-        // CraftBukkit end
-
         return entity.damageEntity(DamageSource.mobAttack(this), i);
     }
 
diff --git a/src/main/java/net/minecraft/server/EntitySmallFireball.java b/src/main/java/net/minecraft/server/EntitySmallFireball.java
index 6f63270047..6cd2008cf0 100644
--- a/src/main/java/net/minecraft/server/EntitySmallFireball.java
+++ b/src/main/java/net/minecraft/server/EntitySmallFireball.java
@@ -1,12 +1,6 @@
 package net.minecraft.server;
 
-// CraftBukkit start
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Projectile;
-import org.bukkit.event.entity.EntityCombustByEntityEvent;
-import org.bukkit.event.entity.ProjectileHitEvent;
-import org.bukkit.plugin.PluginManager;
-// CraftBukkit end
+import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit
 
 public class EntitySmallFireball extends EntityFireball {
 
@@ -27,26 +21,14 @@ public class EntitySmallFireball extends EntityFireball {
 
     protected void a(MovingObjectPosition movingobjectposition) {
         if (!this.world.isStatic) {
-            // CraftBukkit start - projectile hit event
-            Projectile projectile = (Projectile) this.getBukkitEntity();
-            ProjectileHitEvent phe = new ProjectileHitEvent(projectile);
-            final PluginManager pluginManager = Bukkit.getPluginManager();
-            pluginManager.callEvent(phe);
-            // CraftBukkit end
-            final Entity movingEntity = movingobjectposition.entity;
-            if (movingEntity != null) {
-                // CraftBukkit start - entity damage by entity event + combust event
-                if (!movingEntity.isFireproof()) { // check if not fireproof
-                    org.bukkit.entity.Entity damagee = movingEntity.getBukkitEntity();
+            if (movingobjectposition.entity != null) {
+                if (!movingobjectposition.entity.isFireproof() && movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 5)) {
+                    // CraftBukkit start - entity damage by entity event + combust event
+                    EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5);
+                    movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event);
 
-                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleProjectileEvent(projectile, movingobjectposition.entity, DamageSource.projectile(this, this.shooter), 0)) {
-                        // if the fireball 'sticks', ignite the target
-                        EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(projectile, damagee, 5);
-                        pluginManager.callEvent(combustEvent);
-
-                        if (!combustEvent.isCancelled()) {
-                            movingEntity.setOnFire(combustEvent.getDuration());
-                        }
+                    if (!event.isCancelled()) {
+                        movingobjectposition.entity.setOnFire(event.getDuration());
                     }
                     // CraftBukkit end
                 }
diff --git a/src/main/java/net/minecraft/server/EntitySnowball.java b/src/main/java/net/minecraft/server/EntitySnowball.java
deleted file mode 100644
index 3dc5b9aca9..0000000000
--- a/src/main/java/net/minecraft/server/EntitySnowball.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package net.minecraft.server;
-
-public class EntitySnowball extends EntityProjectile {
-
-    public EntitySnowball(World world) {
-        super(world);
-    }
-
-    public EntitySnowball(World world, EntityLiving entityliving) {
-        super(world, entityliving);
-    }
-
-    public EntitySnowball(World world, double d0, double d1, double d2) {
-        super(world, d0, d1, d2);
-    }
-
-    protected void a(MovingObjectPosition movingobjectposition) {
-        if (movingobjectposition.entity != null) {
-            int b0 = 0; // CraftBukkit - byte -> int
-
-            if (movingobjectposition.entity instanceof EntityBlaze) {
-                b0 = 3;
-            }
-            // CraftBukkit - entity.damageEntity -> event function
-            if (org.bukkit.craftbukkit.event.CraftEventFactory.handleProjectileEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity, DamageSource.projectile(this, this.shooter), b0)) {
-                ;
-            }
-        }
-
-        for (int i = 0; i < 8; ++i) {
-            this.world.a("snowballpoof", this.locX, this.locY, this.locZ, 0.0D, 0.0D, 0.0D);
-        }
-
-        if (!this.world.isStatic) {
-            this.die();
-        }
-    }
-}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 66dbef782e..9116adfab2 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -9,8 +9,8 @@ import net.minecraft.server.Container;
 import net.minecraft.server.DamageSource;
 import net.minecraft.server.Entity;
 import net.minecraft.server.EntityArrow;
-import net.minecraft.server.EntityComplexPart;
-import net.minecraft.server.EntityEnderCrystal;
+import net.minecraft.server.EntityDamageSource;
+import net.minecraft.server.EntityDamageSourceIndirect;
 import net.minecraft.server.EntityHuman;
 import net.minecraft.server.EntityItem;
 import net.minecraft.server.EntityLiving;
@@ -348,7 +348,7 @@ public class CraftEventFactory {
     /**
      * EntityDamage(ByEntityEvent)
      */
-    public static EntityDamageEvent callEntityDamageEvent(Entity damager, EntityLiving damagee, DamageCause cause, int damage) {
+    public static EntityDamageEvent callEntityDamageEvent(Entity damager, Entity damagee, DamageCause cause, int damage) {
         EntityDamageEvent event;
         if (damager != null) {
             event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, damage);
@@ -360,6 +360,28 @@ public class CraftEventFactory {
         return event;
     }
 
+    public static EntityDamageEvent handleEntityDamageEvent(Entity entity, DamageSource source, int damage) {
+        Entity damager = source.getEntity();
+        EntityDamageEvent.DamageCause cause = EntityDamageEvent.DamageCause.ENTITY_ATTACK;
+
+        if (source instanceof EntityDamageSourceIndirect) {
+            damager = ((EntityDamageSourceIndirect) source).getProximateDamageSource();
+            if (damager.getBukkitEntity() instanceof Projectile) {
+                cause = EntityDamageEvent.DamageCause.PROJECTILE;
+            } // Else, magic..?
+        }
+        return callEntityDamageEvent(damager, entity, cause, damage);
+    }
+
+    // Non-Living Entities such as EntityEnderCrystal need to call this
+    public static boolean handleNonLivingEntityDamageEvent(Entity entity, DamageSource source, int damage) {
+        if (!(source instanceof EntityDamageSource)) {
+            return false;
+        }
+        EntityDamageEvent event = handleEntityDamageEvent(entity, source, damage);
+        return event.isCancelled() || event.getDamage() == 0;
+    }
+
     public static PlayerLevelChangeEvent callPlayerLevelChangeEvent(Player player, int oldLevel, int newLevel) {
         PlayerLevelChangeEvent event = new PlayerLevelChangeEvent(player, oldLevel, newLevel);
         Bukkit.getPluginManager().callEvent(event);
@@ -373,24 +395,6 @@ public class CraftEventFactory {
         return event;
     }
 
-    public static boolean handleProjectileEvent(Projectile projectile, Entity target, DamageSource damagesource, int damage) {
-        if (target instanceof EntityLiving || target instanceof EntityComplexPart || target instanceof EntityEnderCrystal) {
-            org.bukkit.entity.Entity damagee = target.getBukkitEntity();
-
-            EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(projectile, damagee, EntityDamageEvent.DamageCause.PROJECTILE, damage);
-            Bukkit.getPluginManager().callEvent(event);
-
-            if (!event.isCancelled()) {
-                return target.damageEntity(damagesource, event.getDamage());
-            }
-        } else {
-            // Other entities have their events (if any) handled in damageEntity
-            return target.damageEntity(damagesource, damage);
-        }
-
-        return !projectile.doesBounce();
-    }
-
     public static void handleBlockGrowEvent(World world, int x, int y, int z, int type, int data) {
         Block block = world.getWorld().getBlockAt(x, y, z);
         CraftBlockState state = (CraftBlockState) block.getState();