--- ../src-base/minecraft/net/minecraft/entity/monster/EntitySlime.java +++ ../src-work/minecraft/net/minecraft/entity/monster/EntitySlime.java @@ -14,12 +14,21 @@ import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; +// CraftBukkit start +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.SlimeSplitEvent; +import net.minecraft.entity.Entity; +// CraftBukkit end + public class EntitySlime extends EntityLiving implements IMob { public float squishAmount; public float squishFactor; public float prevSquishFactor; private int slimeJumpDelay; + private Entity lastTarget; // CraftBukkit private static final String __OBFID = "CL_00001698"; public EntitySlime(World p_i1742_1_) @@ -37,7 +46,7 @@ this.dataWatcher.addObject(16, new Byte((byte)1)); } - protected void setSlimeSize(int p_70799_1_) + public void setSlimeSize(int p_70799_1_) // CraftBukkit - protected -> public { this.dataWatcher.updateObject(16, new Byte((byte)p_70799_1_)); this.setSize(0.6F * (float)p_70799_1_, 0.6F * (float)p_70799_1_); @@ -131,8 +140,27 @@ protected void updateEntityActionState() { this.despawnEntity(); - EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); + // CraftBukkit start + Entity entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); // EntityPlayer -> Entity + EntityTargetEvent event = null; + if (entityplayer != null && !entityplayer.equals(lastTarget)) + { + event = CraftEventFactory.callEntityTargetEvent(this, entityplayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); + } + else if (lastTarget != null && entityplayer == null) + { + event = CraftEventFactory.callEntityTargetEvent(this, entityplayer, EntityTargetEvent.TargetReason.FORGOT_TARGET); + } + + if (event != null && !event.isCancelled()) + { + entityplayer = event.getTarget() == null ? null : ((CraftEntity) event.getTarget()).getHandle(); + } + + this.lastTarget = entityplayer; + // CraftBukkit end + if (entityplayer != null) { this.faceEntity(entityplayer, 10.0F, 20.0F); @@ -190,7 +218,22 @@ if (!this.worldObj.isRemote && i > 1 && this.getHealth() <= 0.0F) { int j = 2 + this.rand.nextInt(3); + // CraftBukkit start + SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), j); + this.worldObj.getServer().getPluginManager().callEvent(event); + if (!event.isCancelled() && event.getCount() > 0) + { + j = event.getCount(); + } + else + { + super.setDead(); + return; + } + + // CraftBukkit end + for (int k = 0; k < j; ++k) { float f = ((float)(k % 2) - 0.5F) * (float)i / 4.0F; @@ -198,7 +241,7 @@ EntitySlime entityslime = this.createInstance(); entityslime.setSlimeSize(i / 2); entityslime.setLocationAndAngles(this.posX + (double)f, this.posY + 0.5D, this.posZ + (double)f1, this.rand.nextFloat() * 360.0F, 0.0F); - this.worldObj.spawnEntityInWorld(entityslime); + this.worldObj.addEntity(entityslime, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason } }