diff --git a/Plugins/Libraries/craftbukkit.jar b/Plugins/Libraries/craftbukkit.jar index 1a85cd1e6..7d600709b 100644 Binary files a/Plugins/Libraries/craftbukkit.jar and b/Plugins/Libraries/craftbukkit.jar differ diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java index 292f61cdf..5692eef86 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java @@ -55,6 +55,17 @@ public class UtilEnt } } + public static void Leash(Entity leashed, Entity holder, boolean pull, boolean breakable) + { + if (((CraftEntity)leashed).getHandle() instanceof EntityInsentient) + { + EntityInsentient creature = (EntityInsentient)((CraftEntity)leashed).getHandle(); + + creature.PullWhileLeashed = pull; + creature.BreakLeash = breakable; + } + } + public static void Vegetate(Entity entity) { try diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 00331f7de..d5a333b6e 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -8,6 +8,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; import org.bukkit.entity.Egg; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -127,6 +128,8 @@ public class HubManager extends MiniClientPlugin _statsManager = new StatsManager(plugin); _statsManager.addTable("Pvp"); + + ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle().pvpMode = true; } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java index 6ed66f667..091d1d488 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java @@ -199,35 +199,12 @@ public class WorldManager extends MiniPlugin World world = UtilWorld.getWorld("world"); - if (Manager.Mode.equals("Halloween")) world.setTime(16000); - else world.setTime(6000); - - - if (Manager.Mode.equals("Christmas")) - { - if (_christmasSnow) - { - world.setStorm(true); - - if (UtilTime.elapsed(_christSnowTime, 60000)) - { - _christSnowTime = System.currentTimeMillis(); - _christmasSnow = false; - } - } - else - { - world.setStorm(false); - - if (UtilTime.elapsed(_christSnowTime, 120000)) - { - _christSnowTime = System.currentTimeMillis(); - _christmasSnow = true; - } - } - - } - else world.setStorm(false); + if (Manager.Mode.equals("Halloween")) + world.setTime(16000); + else + world.setTime(6000); + + world.setStorm(false); } @EventHandler diff --git a/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_6_R3/EntityCreature.java b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_6_R3/EntityCreature.java new file mode 100644 index 000000000..38358d4c8 --- /dev/null +++ b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_6_R3/EntityCreature.java @@ -0,0 +1,315 @@ +package net.minecraft.server.v1_6_R3; + +import java.util.Random; +import java.util.UUID; +import org.bukkit.craftbukkit.v1_6_R3.CraftServer; +import org.bukkit.craftbukkit.v1_6_R3.TrigMath; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; +import org.bukkit.event.entity.EntityUnleashEvent; +import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; +import org.bukkit.plugin.PluginManager; + +public abstract class EntityCreature extends EntityInsentient +{ + public static final UUID h = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); + public static final AttributeModifier i = new AttributeModifier(h, "Fleeing speed bonus", 2.0D, 2).a(false); + public PathEntity pathEntity; + public Entity target; + protected boolean bn; + protected int bo; + private ChunkCoordinates bq = new ChunkCoordinates(0, 0, 0); + private float br = -1.0F; + private PathfinderGoal bs = new PathfinderGoalMoveTowardsRestriction(this, 1.0D); + private boolean bt; + + public EntityCreature(World world) + { + super(world); + } + + protected boolean bJ() { + return false; + } + + protected void bl() { + this.world.methodProfiler.a("ai"); + if ((this.bo > 0) && (--this.bo == 0)) { + AttributeInstance attributeinstance = getAttributeInstance(GenericAttributes.d); + + attributeinstance.b(i); + } + + this.bn = bJ(); + float f11 = 16.0F; + + if (this.target == null) + { + Entity target = findTarget(); + if (target != null) { + EntityTargetEvent event = new EntityTargetEvent(getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.CLOSEST_PLAYER); + this.world.getServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + if (event.getTarget() == null) + this.target = null; + else { + this.target = ((CraftEntity)event.getTarget()).getHandle(); + } + } + + } + + if (this.target != null) + this.pathEntity = this.world.findPath(this, this.target, f11, true, false, false, true); + } + else if (this.target.isAlive()) { + float f1 = this.target.d(this); + + if (o(this.target)) + a(this.target, f1); + } + else + { + EntityTargetEvent event = new EntityTargetEvent(getBukkitEntity(), null, EntityTargetEvent.TargetReason.TARGET_DIED); + this.world.getServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + if (event.getTarget() == null) + this.target = null; + else { + this.target = ((CraftEntity)event.getTarget()).getHandle(); + } + } + + } + + this.world.methodProfiler.b(); + if ((!this.bn) && (this.target != null) && ((this.pathEntity == null) || (this.random.nextInt(20) == 0))) + this.pathEntity = this.world.findPath(this, this.target, f11, true, false, false, true); + else if ((!this.bn) && (((this.pathEntity == null) && (this.random.nextInt(180) == 0)) || (((this.random.nextInt(120) == 0) || (this.bo > 0)) && (this.aV < 100)))) { + bK(); + } + + int i = MathHelper.floor(this.boundingBox.b + 0.5D); + boolean flag = H(); + boolean flag1 = J(); + + this.pitch = 0.0F; + if ((this.pathEntity != null) && (this.random.nextInt(100) != 0)) { + this.world.methodProfiler.a("followpath"); + Vec3D vec3d = this.pathEntity.a(this); + double d0 = this.width * 2.0F; + + while ((vec3d != null) && (vec3d.d(this.locX, vec3d.d, this.locZ) < d0 * d0)) { + this.pathEntity.a(); + if (this.pathEntity.b()) { + vec3d = null; + this.pathEntity = null; + } else { + vec3d = this.pathEntity.a(this); + } + } + + this.bd = false; + if (vec3d != null) { + double d1 = vec3d.c - this.locX; + double d2 = vec3d.e - this.locZ; + double d3 = vec3d.d - i; + + float f2 = (float)(TrigMath.atan2(d2, d1) * 180.0D / 3.141592741012573D) - 90.0F; + float f3 = MathHelper.g(f2 - this.yaw); + + this.bf = ((float)getAttributeInstance(GenericAttributes.d).getValue()); + if (f3 > 30.0F) { + f3 = 30.0F; + } + + if (f3 < -30.0F) { + f3 = -30.0F; + } + + this.yaw += f3; + if ((this.bn) && (this.target != null)) { + double d4 = this.target.locX - this.locX; + double d5 = this.target.locZ - this.locZ; + float f4 = this.yaw; + + this.yaw = ((float)(Math.atan2(d5, d4) * 180.0D / 3.141592741012573D) - 90.0F); + f3 = (f4 - this.yaw + 90.0F) * 3.141593F / 180.0F; + this.be = (-MathHelper.sin(f3) * this.bf * 1.0F); + this.bf = (MathHelper.cos(f3) * this.bf * 1.0F); + } + + if (d3 > 0.0D) { + this.bd = true; + } + } + + if (this.target != null) { + a(this.target, 30.0F, 30.0F); + } + + if ((this.positionChanged) && (!bM())) { + this.bd = true; + } + + if ((this.random.nextFloat() < 0.8F) && ((flag) || (flag1))) { + this.bd = true; + } + + this.world.methodProfiler.b(); + } else { + super.bl(); + this.pathEntity = null; + } + } + + protected void bK() { + this.world.methodProfiler.a("stroll"); + boolean flag = false; + int i = -1; + int j = -1; + int k = -1; + float f = -99999.0F; + + for (int l = 0; l < 10; l++) { + int i1 = MathHelper.floor(this.locX + this.random.nextInt(13) - 6.0D); + int j1 = MathHelper.floor(this.locY + this.random.nextInt(7) - 3.0D); + int k1 = MathHelper.floor(this.locZ + this.random.nextInt(13) - 6.0D); + float f1 = a(i1, j1, k1); + + if (f1 > f) { + f = f1; + i = i1; + j = j1; + k = k1; + flag = true; + } + } + + if (flag) { + this.pathEntity = this.world.a(this, i, j, k, 10.0F, true, false, false, true); + } + + this.world.methodProfiler.b(); + } + protected void a(Entity entity, float f) { + } + + public float a(int i, int j, int k) { + return 0.0F; + } + + protected Entity findTarget() { + return null; + } + + public boolean canSpawn() { + int i = MathHelper.floor(this.locX); + int j = MathHelper.floor(this.boundingBox.b); + int k = MathHelper.floor(this.locZ); + + return (super.canSpawn()) && (a(i, j, k) >= 0.0F); + } + + public boolean bM() { + return this.pathEntity != null; + } + + public void setPathEntity(PathEntity pathentity) { + this.pathEntity = pathentity; + } + + public Entity bN() { + return this.target; + } + + public void setTarget(Entity entity) { + this.target = entity; + } + + public boolean bO() { + return b(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); + } + + public boolean b(int i, int j, int k) { + return this.br == -1.0F; + } + + public void b(int i, int j, int k, int l) { + this.bq.b(i, j, k); + this.br = l; + } + + public ChunkCoordinates bP() { + return this.bq; + } + + public float bQ() { + return this.br; + } + + public void bR() { + this.br = -1.0F; + } + + public boolean bS() { + return this.br != -1.0F; + } + + protected void bF() { + super.bF(); + if ((bH()) && (getLeashHolder() != null) && (getLeashHolder().world == this.world) && this.PullWhileLeashed) { + Entity entity = getLeashHolder(); + + b((int)entity.locX, (int)entity.locY, (int)entity.locZ, 5); + float f = d(entity); + + if (((this instanceof EntityTameableAnimal)) && (((EntityTameableAnimal)this).isSitting())) { + if (f > 10.0F) { + this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); + unleash(true, true); + } + + return; + } + + if (!this.bt) { + this.goalSelector.a(2, this.bs); + getNavigation().a(false); + this.bt = true; + } + + o(f); + if (f > 4.0F) { + getNavigation().a(entity, 1.0D); + } + + if (f > 6.0F) { + double d0 = (entity.locX - this.locX) / f; + double d1 = (entity.locY - this.locY) / f; + double d2 = (entity.locZ - this.locZ) / f; + + this.motX += d0 * Math.abs(d0) * 0.4D; + this.motY += d1 * Math.abs(d1) * 0.4D; + this.motZ += d2 * Math.abs(d2) * 0.4D; + } + + if (f > 10.0F) { + this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); + unleash(true, true); + } + } else if ((!bH()) && (this.bt)) { + this.bt = false; + this.goalSelector.a(this.bs); + getNavigation().a(true); + bR(); + } + } + + protected void o(float f) + { + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_6_R3/EntityHorse.java b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_6_R3/EntityHorse.java new file mode 100644 index 000000000..4aa1bf80c --- /dev/null +++ b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_6_R3/EntityHorse.java @@ -0,0 +1,1228 @@ +package net.minecraft.server.v1_6_R3; + +import java.util.Iterator; +import java.util.List; + +// CraftBukkit start +import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory; +import org.bukkit.event.entity.EntityDamageEvent; +// CraftBukkit end + +public class EntityHorse extends EntityAnimal implements IInventoryListener { + + private static final IEntitySelector bu = new EntitySelectorHorse(); + public static final IAttribute attributeJumpStrength = (new AttributeRanged("horse.jumpStrength", 0.7D, 0.0D, 2.0D)).a("Jump Strength").a(true); // CraftBukkit - private -> public + private static final String[] bw = new String[] { null, "textures/entity/horse/armor/horse_armor_iron.png", "textures/entity/horse/armor/horse_armor_gold.png", "textures/entity/horse/armor/horse_armor_diamond.png"}; + private static final String[] bx = new String[] { "", "meo", "goo", "dio"}; + private static final int[] by = new int[] { 0, 5, 7, 11}; + private static final String[] bz = new String[] { "textures/entity/horse/horse_white.png", "textures/entity/horse/horse_creamy.png", "textures/entity/horse/horse_chestnut.png", "textures/entity/horse/horse_brown.png", "textures/entity/horse/horse_black.png", "textures/entity/horse/horse_gray.png", "textures/entity/horse/horse_darkbrown.png"}; + private static final String[] bA = new String[] { "hwh", "hcr", "hch", "hbr", "hbl", "hgr", "hdb"}; + private static final String[] bB = new String[] { null, "textures/entity/horse/horse_markings_white.png", "textures/entity/horse/horse_markings_whitefield.png", "textures/entity/horse/horse_markings_whitedots.png", "textures/entity/horse/horse_markings_blackdots.png"}; + private static final String[] bC = new String[] { "", "wo_", "wmo", "wdo", "bdo"}; + private int bD; + private int bE; + private int bF; + public int bp; + public int bq; + protected boolean br; + public InventoryHorseChest inventoryChest; // CraftBukkit - private -> public + private boolean bH; + protected int bs; + protected float bt; + private boolean bI; + private float bJ; + private float bK; + private float bL; + private float bM; + private float bN; + private float bO; + private int bP; + private String bQ; + private String[] bR = new String[3]; + public int maxDomestication = 100; // CraftBukkit - store max domestication value + + public EntityHorse(World world) { + super(world); + this.a(1.4F, 1.6F); + this.fireProof = false; + this.setHasChest(false); + this.getNavigation().a(true); + this.goalSelector.a(0, new PathfinderGoalFloat(this)); + this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.2D)); + this.goalSelector.a(1, new PathfinderGoalTame(this, 1.2D)); + this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); + this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.0D)); + this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 0.7D)); + this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); + this.loadChest(); + } + + protected void a() { + super.a(); + this.datawatcher.a(16, Integer.valueOf(0)); + this.datawatcher.a(19, Byte.valueOf((byte) 0)); + this.datawatcher.a(20, Integer.valueOf(0)); + this.datawatcher.a(21, String.valueOf("")); + this.datawatcher.a(22, Integer.valueOf(0)); + } + + public void setType(int i) { + this.datawatcher.watch(19, Byte.valueOf((byte) i)); + this.cJ(); + } + + public int getType() { + return this.datawatcher.getByte(19); + } + + public void setVariant(int i) { + this.datawatcher.watch(20, Integer.valueOf(i)); + this.cJ(); + } + + public int getVariant() { + return this.datawatcher.getInt(20); + } + + public String getLocalizedName() { + if (this.hasCustomName()) { + return this.getCustomName(); + } else { + int i = this.getType(); + + switch (i) { + case 0: + default: + return LocaleI18n.get("entity.horse.name"); + + case 1: + return LocaleI18n.get("entity.donkey.name"); + + case 2: + return LocaleI18n.get("entity.mule.name"); + + case 3: + return LocaleI18n.get("entity.zombiehorse.name"); + + case 4: + return LocaleI18n.get("entity.skeletonhorse.name"); + } + } + } + + private boolean w(int i) { + return (this.datawatcher.getInt(16) & i) != 0; + } + + private void b(int i, boolean flag) { + int j = this.datawatcher.getInt(16); + + if (Vegetated) + return; + + if (flag) { + this.datawatcher.watch(16, Integer.valueOf(j | i)); + } else { + this.datawatcher.watch(16, Integer.valueOf(j & ~i)); + } + } + + public boolean bV() { + return !this.isBaby(); + } + + public boolean isTame() { + return this.w(2); + } + + public boolean ca() { + return this.bV(); + } + + public String getOwnerName() { + return this.datawatcher.getString(21); + } + + public void setOwnerName(String s) { + this.datawatcher.watch(21, s); + } + + public float cc() { + int i = this.getAge(); + + return i >= 0 ? 1.0F : 0.5F + (float) (-24000 - i) / -24000.0F * 0.5F; + } + + public void a(boolean flag) { + if (flag) { + this.a(this.cc()); + } else { + this.a(1.0F); + } + } + + public boolean cd() { + return this.br; + } + + public void setTame(boolean flag) { + this.b(2, flag); + } + + public void j(boolean flag) { + this.br = flag; + } + + public boolean bG() { + return !this.cy() && super.bG(); + } + + protected void o(float f) { + if (f > 6.0F && this.cg()) { + this.o(false); + } + } + + public boolean hasChest() { + return this.w(8); + } + + public int cf() { + return this.datawatcher.getInt(22); + } + + public int d(ItemStack itemstack) { + return itemstack == null ? 0 : (itemstack.id == Item.HORSE_ARMOR_IRON.id ? 1 : (itemstack.id == Item.HORSE_ARMOR_GOLD.id ? 2 : (itemstack.id == Item.HORSE_ARMOR_DIAMOND.id ? 3 : 0))); + } + + public boolean cg() { + return this.w(32); + } + + public boolean ch() { + return this.w(64); + } + + public boolean ci() { + return this.w(16); + } + + public boolean cj() { + return this.bH; + } + + public void r(int i) { + this.datawatcher.watch(22, Integer.valueOf(i)); + this.cJ(); + } + + public void k(boolean flag) { + this.b(16, flag); + } + + public void setHasChest(boolean flag) { + this.b(8, flag); + } + + public void m(boolean flag) { + this.bH = flag; + } + + public void n(boolean flag) { + this.b(4, flag); + } + + public int getTemper() { + return this.bs; + } + + public void setTemper(int i) { + this.bs = i; + } + + public int t(int i) { + int j = MathHelper.a(this.getTemper() + i, 0, this.getMaxDomestication()); + + this.setTemper(j); + return j; + } + + public boolean damageEntity(DamageSource damagesource, float f) { + Entity entity = damagesource.getEntity(); + + return this.passenger != null && this.passenger.equals(entity) ? false : super.damageEntity(damagesource, f); + } + + public int aQ() { + return by[this.cf()]; + } + + public boolean M() { + return this.passenger == null; + } + + public boolean cl() { + int i = MathHelper.floor(this.locX); + int j = MathHelper.floor(this.locZ); + + this.world.getBiome(i, j); + return true; + } + + public void cm() { + if (!this.world.isStatic && this.hasChest()) { + this.b(Block.CHEST.id, 1); + this.setHasChest(false); + } + } + + private void cF() { + this.cM(); + this.world.makeSound(this, "eating", 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); + } + + protected void b(float f) { + if (f > 1.0F) { + this.makeSound("mob.horse.land", 0.4F, 1.0F); + } + + int i = MathHelper.f(f * 0.5F - 3.0F); + + if (i > 0) { + // CraftBukkit start + EntityDamageEvent event = CraftEventFactory.callEntityDamageEvent(null, this, EntityDamageEvent.DamageCause.FALL, i); + if (!event.isCancelled()) { + float damage = (float) event.getDamage(); + if (damage > 0) { + this.getBukkitEntity().setLastDamageCause(event); + this.damageEntity(DamageSource.FALL, damage); + } + } + + if (this.passenger != null) { + EntityDamageEvent passengerEvent = CraftEventFactory.callEntityDamageEvent(null, this.passenger, EntityDamageEvent.DamageCause.FALL, i); + if (!passengerEvent.isCancelled() && this.passenger != null) { // Check again in case of plugin + float damage = (float) passengerEvent.getDamage(); + if (damage > 0) { + this.passenger.getBukkitEntity().setLastDamageCause(passengerEvent); + this.passenger.damageEntity(DamageSource.FALL, damage); + } + } + // CraftBukkit end + } + + int j = this.world.getTypeId(MathHelper.floor(this.locX), MathHelper.floor(this.locY - 0.2D - (double) this.lastYaw), MathHelper.floor(this.locZ)); + + if (j > 0) { + StepSound stepsound = Block.byId[j].stepSound; + + this.world.makeSound(this, stepsound.getStepSound(), stepsound.getVolume1() * 0.5F, stepsound.getVolume2() * 0.75F); + } + } + } + + private int cG() { + int i = this.getType(); + + return this.hasChest() /* && (i == 1 || i == 2) */ ? 17 : 2; // CraftBukkit - Remove type check + } + + public void loadChest() { // CraftBukkit - private -> public + InventoryHorseChest inventoryhorsechest = this.inventoryChest; + + this.inventoryChest = new InventoryHorseChest("HorseChest", this.cG(), this); // CraftBukkit - add this horse + this.inventoryChest.a(this.getLocalizedName()); + if (inventoryhorsechest != null) { + inventoryhorsechest.b(this); + int i = Math.min(inventoryhorsechest.getSize(), this.inventoryChest.getSize()); + + for (int j = 0; j < i; ++j) { + ItemStack itemstack = inventoryhorsechest.getItem(j); + + if (itemstack != null) { + this.inventoryChest.setItem(j, itemstack.cloneItemStack()); + } + } + + inventoryhorsechest = null; + } + + this.inventoryChest.a(this); + this.cI(); + } + + private void cI() { + if (!this.world.isStatic) { + this.n(this.inventoryChest.getItem(0) != null); + if (this.cv()) { + this.r(this.d(this.inventoryChest.getItem(1))); + } + } + } + + public void a(InventorySubcontainer inventorysubcontainer) { + int i = this.cf(); + boolean flag = this.co(); + + this.cI(); + if (this.ticksLived > 20) { + if (i == 0 && i != this.cf()) { + this.makeSound("mob.horse.armor", 0.5F, 1.0F); + } + + if (!flag && this.co()) { + this.makeSound("mob.horse.leather", 0.5F, 1.0F); + } + } + } + + public boolean canSpawn() { + this.cl(); + return super.canSpawn(); + } + + protected EntityHorse a(Entity entity, double d0) { + double d1 = Double.MAX_VALUE; + Entity entity1 = null; + List list = this.world.getEntities(entity, entity.boundingBox.a(d0, d0, d0), bu); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { + Entity entity2 = (Entity) iterator.next(); + double d2 = entity2.e(entity.locX, entity.locY, entity.locZ); + + if (d2 < d1) { + entity1 = entity2; + d1 = d2; + } + } + + return (EntityHorse) entity1; + } + + public double getJumpStrength() { + return this.getAttributeInstance(attributeJumpStrength).getValue(); + } + + protected String aP() { + this.cM(); + int i = this.getType(); + + return i == 3 ? "mob.horse.zombie.death" : (i == 4 ? "mob.horse.skeleton.death" : (i != 1 && i != 2 ? "mob.horse.death" : "mob.horse.donkey.death")); + } + + protected int getLootId() { + boolean flag = this.random.nextInt(4) == 0; + int i = this.getType(); + + return i == 4 ? Item.BONE.id : (i == 3 ? (flag ? 0 : Item.ROTTEN_FLESH.id) : Item.LEATHER.id); + } + + protected String aO() { + this.cM(); + if (this.random.nextInt(3) == 0) { + this.cO(); + } + + int i = this.getType(); + + return i == 3 ? "mob.horse.zombie.hit" : (i == 4 ? "mob.horse.skeleton.hit" : (i != 1 && i != 2 ? "mob.horse.hit" : "mob.horse.donkey.hit")); + } + + public boolean co() { + return this.w(4); + } + + protected String r() { + this.cM(); + if (this.random.nextInt(10) == 0 && !this.bc()) { + this.cO(); + } + + int i = this.getType(); + + return i == 3 ? "mob.horse.zombie.idle" : (i == 4 ? "mob.horse.skeleton.idle" : (i != 1 && i != 2 ? "mob.horse.idle" : "mob.horse.donkey.idle")); + } + + protected String cp() { + this.cM(); + this.cO(); + int i = this.getType(); + + return i != 3 && i != 4 ? (i != 1 && i != 2 ? "mob.horse.angry" : "mob.horse.donkey.angry") : null; + } + + protected void a(int i, int j, int k, int l) { + StepSound stepsound = Block.byId[l].stepSound; + + if (this.world.getTypeId(i, j + 1, k) == Block.SNOW.id) { + stepsound = Block.SNOW.stepSound; + } + + if (!Block.byId[l].material.isLiquid()) { + int i1 = this.getType(); + + if (this.passenger != null && i1 != 1 && i1 != 2) { + ++this.bP; + if (this.bP > 5 && this.bP % 3 == 0) { + this.makeSound("mob.horse.gallop", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); + if (i1 == 0 && this.random.nextInt(10) == 0) { + this.makeSound("mob.horse.breathe", stepsound.getVolume1() * 0.6F, stepsound.getVolume2()); + } + } else if (this.bP <= 5) { + this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); + } + } else if (stepsound == Block.h) { + this.makeSound("mob.horse.soft", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); + } else { + this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); + } + } + } + + protected void az() { + super.az(); + this.aX().b(attributeJumpStrength); + this.getAttributeInstance(GenericAttributes.a).setValue(53.0D); + this.getAttributeInstance(GenericAttributes.d).setValue(0.22499999403953552D); + } + + public int bv() { + return 6; + } + + public int getMaxDomestication() { + return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100 + } + + protected float ba() { + return 0.8F; + } + + public int o() { + return 400; + } + + private void cJ() { + this.bQ = null; + } + + public void f(EntityHuman entityhuman) { + if (!this.world.isStatic && (this.passenger == null || this.passenger == entityhuman) && this.isTame()) { + this.inventoryChest.a(this.getLocalizedName()); + entityhuman.openHorseInventory(this, this.inventoryChest); + } + } + + public boolean a(EntityHuman entityhuman) { + ItemStack itemstack = entityhuman.inventory.getItemInHand(); + + if (itemstack != null && itemstack.id == Item.MONSTER_EGG.id) { + return super.a(entityhuman); + } else if (!this.isTame() && this.cy()) { + return false; + } else if (this.isTame() && this.bV() && entityhuman.isSneaking()) { + this.f(entityhuman); + return true; + } else if (this.ca() && this.passenger != null) { + return super.a(entityhuman); + } else { + if (itemstack != null) { + boolean flag = false; + + if (this.cv()) { + byte b0 = -1; + + if (itemstack.id == Item.HORSE_ARMOR_IRON.id) { + b0 = 1; + } else if (itemstack.id == Item.HORSE_ARMOR_GOLD.id) { + b0 = 2; + } else if (itemstack.id == Item.HORSE_ARMOR_DIAMOND.id) { + b0 = 3; + } + + if (b0 >= 0) { + if (!this.isTame()) { + this.cD(); + return true; + } + + this.f(entityhuman); + return true; + } + } + + if (!flag && !this.cy()) { + float f = 0.0F; + short short1 = 0; + byte b1 = 0; + + if (itemstack.id == Item.WHEAT.id) { + f = 2.0F; + short1 = 60; + b1 = 3; + } else if (itemstack.id == Item.SUGAR.id) { + f = 1.0F; + short1 = 30; + b1 = 3; + } else if (itemstack.id == Item.BREAD.id) { + f = 7.0F; + short1 = 180; + b1 = 3; + } else if (itemstack.id == Block.HAY_BLOCK.id) { + f = 20.0F; + short1 = 180; + } else if (itemstack.id == Item.APPLE.id) { + f = 3.0F; + short1 = 60; + b1 = 3; + } else if (itemstack.id == Item.CARROT_GOLDEN.id) { + f = 4.0F; + short1 = 60; + b1 = 5; + if (this.isTame() && this.getAge() == 0) { + flag = true; + this.bX(); + } + } else if (itemstack.id == Item.GOLDEN_APPLE.id) { + f = 10.0F; + short1 = 240; + b1 = 10; + if (this.isTame() && this.getAge() == 0) { + flag = true; + this.bX(); + } + } + + if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { + this.heal(f); + flag = true; + } + + if (!this.bV() && short1 > 0) { + this.a(short1); + flag = true; + } + + if (b1 > 0 && (flag || !this.isTame()) && b1 < this.getMaxDomestication()) { + flag = true; + this.t(b1); + } + + if (flag) { + this.cF(); + } + } + + if (!this.isTame() && !flag) { + if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) { + return true; + } + + this.cD(); + return true; + } + + if (!flag && this.cw() && !this.hasChest() && itemstack.id == Block.CHEST.id) { + this.setHasChest(true); + this.makeSound("mob.chickenplop", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); + flag = true; + this.loadChest(); + } + + if (!flag && this.ca() && !this.co() && itemstack.id == Item.SADDLE.id) { + this.f(entityhuman); + return true; + } + + if (flag) { + if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count == 0) { + entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); + } + + return true; + } + } + + if (this.ca() && this.passenger == null) { + if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) { + return true; + } else { + this.h(entityhuman); + return true; + } + } else { + return super.a(entityhuman); + } + } + } + + private void h(EntityHuman entityhuman) { + entityhuman.yaw = this.yaw; + entityhuman.pitch = this.pitch; + this.o(false); + this.p(false); + if (!this.world.isStatic) { + entityhuman.mount(this); + } + } + + public boolean cv() { + return this.getType() == 0; + } + + public boolean cw() { + int i = this.getType(); + + return i == 2 || i == 1; + } + + protected boolean bc() { + return this.passenger != null && this.co() ? true : this.cg() || this.ch(); + } + + public boolean cy() { + int i = this.getType(); + + return i == 3 || i == 4; + } + + public boolean cz() { + return this.cy() || this.getType() == 2; + } + + public boolean c(ItemStack itemstack) { + return false; + } + + private void cL() { + this.bp = 1; + } + + public void die(DamageSource damagesource) { + super.die(damagesource); + if (!this.world.isStatic) { + this.cE(); + } + } + + public void c() { + if (this.random.nextInt(200) == 0) { + this.cL(); + } + + super.c(); + if (!this.world.isStatic) { + if (this.random.nextInt(900) == 0 && this.deathTicks == 0) { + this.heal(1.0F); + } + + if (!this.cg() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getTypeId(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ)) == Block.GRASS.id) { + this.o(true); + } + + if (this.cg() && ++this.bD > 50) { + this.bD = 0; + this.o(false); + } + + if (this.ci() && !this.bV() && !this.cg()) { + EntityHorse entityhorse = this.a(this, 16.0D); + + if (entityhorse != null && this.e(entityhorse) > 4.0D) { + PathEntity pathentity = this.world.findPath(this, entityhorse, 16.0F, true, false, false, true); + + this.setPathEntity(pathentity); + } + } + } + } + + public void l_() { + super.l_(); + if (this.world.isStatic && this.datawatcher.a()) { + this.datawatcher.e(); + this.cJ(); + } + + if (this.bE > 0 && ++this.bE > 30) { + this.bE = 0; + this.b(128, false); + } + + if (!this.world.isStatic && this.bF > 0 && ++this.bF > 20) { + this.bF = 0; + this.p(false); + } + + if (this.bp > 0 && ++this.bp > 8) { + this.bp = 0; + } + + if (this.bq > 0) { + ++this.bq; + if (this.bq > 300) { + this.bq = 0; + } + } + + this.bK = this.bJ; + if (this.cg()) { + this.bJ += (1.0F - this.bJ) * 0.4F + 0.05F; + if (this.bJ > 1.0F) { + this.bJ = 1.0F; + } + } else { + this.bJ += (0.0F - this.bJ) * 0.4F - 0.05F; + if (this.bJ < 0.0F) { + this.bJ = 0.0F; + } + } + + this.bM = this.bL; + if (this.ch()) { + this.bK = this.bJ = 0.0F; + this.bL += (1.0F - this.bL) * 0.4F + 0.05F; + if (this.bL > 1.0F) { + this.bL = 1.0F; + } + } else { + this.bI = false; + this.bL += (0.8F * this.bL * this.bL * this.bL - this.bL) * 0.6F - 0.05F; + if (this.bL < 0.0F) { + this.bL = 0.0F; + } + } + + this.bO = this.bN; + if (this.w(128)) { + this.bN += (1.0F - this.bN) * 0.7F + 0.05F; + if (this.bN > 1.0F) { + this.bN = 1.0F; + } + } else { + this.bN += (0.0F - this.bN) * 0.7F - 0.05F; + if (this.bN < 0.0F) { + this.bN = 0.0F; + } + } + } + + private void cM() { + if (!this.world.isStatic) { + this.bE = 1; + this.b(128, true); + } + } + + private boolean cN() { + return this.passenger == null && this.vehicle == null && this.isTame() && this.bV() && !this.cz() && this.getHealth() >= this.getMaxHealth(); + } + + public void e(boolean flag) { + this.b(32, flag); + } + + public void o(boolean flag) { + this.e(flag); + } + + public void p(boolean flag) { + if (flag) { + this.o(false); + } + + this.b(64, flag); + } + + private void cO() { + if (!this.world.isStatic) { + this.bF = 1; + this.p(true); + } + } + + public void cD() { + this.cO(); + String s = this.cp(); + + if (s != null) { + this.makeSound(s, this.ba(), this.bb()); + } + } + + public void cE() { + this.a(this, this.inventoryChest); + this.cm(); + } + + private void a(Entity entity, InventoryHorseChest inventoryhorsechest) { + if (inventoryhorsechest != null && !this.world.isStatic) { + for (int i = 0; i < inventoryhorsechest.getSize(); ++i) { + ItemStack itemstack = inventoryhorsechest.getItem(i); + + if (itemstack != null) { + this.a(itemstack, 0.0F); + } + } + } + } + + public boolean g(EntityHuman entityhuman) { + this.setOwnerName(entityhuman.getName()); + this.setTame(true); + return true; + } + + public void e(float f, float f1) { + if (this.passenger != null && this.co()) { + this.lastYaw = this.yaw = this.passenger.yaw; + this.pitch = this.passenger.pitch * 0.5F; + this.b(this.yaw, this.pitch); + this.aP = this.aN = this.yaw; + f = ((EntityLiving) this.passenger).be * 0.5F; + f1 = ((EntityLiving) this.passenger).bf; + if (f1 <= 0.0F) { + f1 *= 0.25F; + this.bP = 0; + } + + if (this.onGround && this.bt == 0.0F && this.ch() && !this.bI) { + f = 0.0F; + f1 = 0.0F; + } + + if (this.bt > 0.0F && !this.cd() && this.onGround) { + this.motY = this.getJumpStrength() * (double) this.bt; + if (this.hasEffect(MobEffectList.JUMP)) { + this.motY += (double) ((float) (this.getEffect(MobEffectList.JUMP).getAmplifier() + 1) * 0.1F); + } + + this.j(true); + this.an = true; + if (f1 > 0.0F) { + float f2 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F); + float f3 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F); + + this.motX += (double) (-0.4F * f2 * this.bt); + this.motZ += (double) (0.4F * f3 * this.bt); + this.makeSound("mob.horse.jump", 0.4F, 1.0F); + } + + this.bt = 0.0F; + } + + this.Y = 1.0F; + this.aR = this.bg() * 0.1F; + if (!this.world.isStatic) { + this.i((float) this.getAttributeInstance(GenericAttributes.d).getValue()); + super.e(f, f1); + } + + if (this.onGround) { + this.bt = 0.0F; + this.j(false); + } + + this.aF = this.aG; + double d0 = this.locX - this.lastX; + double d1 = this.locZ - this.lastZ; + float f4 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; + + if (f4 > 1.0F) { + f4 = 1.0F; + } + + this.aG += (f4 - this.aG) * 0.4F; + this.aH += this.aG; + } else { + this.Y = 0.5F; + this.aR = 0.02F; + super.e(f, f1); + } + } + + public void b(NBTTagCompound nbttagcompound) { + super.b(nbttagcompound); + nbttagcompound.setBoolean("EatingHaystack", this.cg()); + nbttagcompound.setBoolean("ChestedHorse", this.hasChest()); + nbttagcompound.setBoolean("HasReproduced", this.cj()); + nbttagcompound.setBoolean("Bred", this.ci()); + nbttagcompound.setInt("Type", this.getType()); + nbttagcompound.setInt("Variant", this.getVariant()); + nbttagcompound.setInt("Temper", this.getTemper()); + nbttagcompound.setBoolean("Tame", this.isTame()); + nbttagcompound.setString("OwnerName", this.getOwnerName()); + nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit + if (this.hasChest()) { + NBTTagList nbttaglist = new NBTTagList(); + + for (int i = 2; i < this.inventoryChest.getSize(); ++i) { + ItemStack itemstack = this.inventoryChest.getItem(i); + + if (itemstack != null) { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + + nbttagcompound1.setByte("Slot", (byte) i); + itemstack.save(nbttagcompound1); + nbttaglist.add(nbttagcompound1); + } + } + + nbttagcompound.set("Items", nbttaglist); + } + + if (this.inventoryChest.getItem(1) != null) { + nbttagcompound.set("ArmorItem", this.inventoryChest.getItem(1).save(new NBTTagCompound("ArmorItem"))); + } + + if (this.inventoryChest.getItem(0) != null) { + nbttagcompound.set("SaddleItem", this.inventoryChest.getItem(0).save(new NBTTagCompound("SaddleItem"))); + } + } + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + this.o(nbttagcompound.getBoolean("EatingHaystack")); + this.k(nbttagcompound.getBoolean("Bred")); + this.setHasChest(nbttagcompound.getBoolean("ChestedHorse")); + this.m(nbttagcompound.getBoolean("HasReproduced")); + this.setType(nbttagcompound.getInt("Type")); + this.setVariant(nbttagcompound.getInt("Variant")); + this.setTemper(nbttagcompound.getInt("Temper")); + this.setTame(nbttagcompound.getBoolean("Tame")); + if (nbttagcompound.hasKey("OwnerName")) { + this.setOwnerName(nbttagcompound.getString("OwnerName")); + } + // CraftBukkit start + if (nbttagcompound.hasKey("Bukkit.MaxDomestication")) { + this.maxDomestication = nbttagcompound.getInt("Bukkit.MaxDomestication"); + } + // CraftBukkit end + AttributeInstance attributeinstance = this.aX().a("Speed"); + + if (attributeinstance != null) { + this.getAttributeInstance(GenericAttributes.d).setValue(attributeinstance.b() * 0.25D); + } + + if (this.hasChest()) { + NBTTagList nbttaglist = nbttagcompound.getList("Items"); + + this.loadChest(); + + for (int i = 0; i < nbttaglist.size(); ++i) { + NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.get(i); + int j = nbttagcompound1.getByte("Slot") & 255; + + if (j >= 2 && j < this.inventoryChest.getSize()) { + this.inventoryChest.setItem(j, ItemStack.createStack(nbttagcompound1)); + } + } + } + + ItemStack itemstack; + + if (nbttagcompound.hasKey("ArmorItem")) { + itemstack = ItemStack.createStack(nbttagcompound.getCompound("ArmorItem")); + if (itemstack != null && v(itemstack.id)) { + this.inventoryChest.setItem(1, itemstack); + } + } + + if (nbttagcompound.hasKey("SaddleItem")) { + itemstack = ItemStack.createStack(nbttagcompound.getCompound("SaddleItem")); + if (itemstack != null && itemstack.id == Item.SADDLE.id) { + this.inventoryChest.setItem(0, itemstack); + } + } else if (nbttagcompound.getBoolean("Saddle")) { + this.inventoryChest.setItem(0, new ItemStack(Item.SADDLE)); + } + + this.cI(); + } + + public boolean mate(EntityAnimal entityanimal) { + if (entityanimal == this) { + return false; + } else if (entityanimal.getClass() != this.getClass()) { + return false; + } else { + EntityHorse entityhorse = (EntityHorse) entityanimal; + + if (this.cN() && entityhorse.cN()) { + int i = this.getType(); + int j = entityhorse.getType(); + + return i == j || i == 0 && j == 1 || i == 1 && j == 0; + } else { + return false; + } + } + } + + public EntityAgeable createChild(EntityAgeable entityageable) { + EntityHorse entityhorse = (EntityHorse) entityageable; + EntityHorse entityhorse1 = new EntityHorse(this.world); + int i = this.getType(); + int j = entityhorse.getType(); + int k = 0; + + if (i == j) { + k = i; + } else if (i == 0 && j == 1 || i == 1 && j == 0) { + k = 2; + } + + if (k == 0) { + int l = this.random.nextInt(9); + int i1; + + if (l < 4) { + i1 = this.getVariant() & 255; + } else if (l < 8) { + i1 = entityhorse.getVariant() & 255; + } else { + i1 = this.random.nextInt(7); + } + + int j1 = this.random.nextInt(5); + + if (j1 < 4) { + i1 |= this.getVariant() & '\uff00'; + } else if (j1 < 8) { + i1 |= entityhorse.getVariant() & '\uff00'; + } else { + i1 |= this.random.nextInt(5) << 8 & '\uff00'; + } + + entityhorse1.setVariant(i1); + } + + entityhorse1.setType(k); + double d0 = this.getAttributeInstance(GenericAttributes.a).b() + entityageable.getAttributeInstance(GenericAttributes.a).b() + (double) this.cP(); + + entityhorse1.getAttributeInstance(GenericAttributes.a).setValue(d0 / 3.0D); + double d1 = this.getAttributeInstance(attributeJumpStrength).b() + entityageable.getAttributeInstance(attributeJumpStrength).b() + this.cQ(); + + entityhorse1.getAttributeInstance(attributeJumpStrength).setValue(d1 / 3.0D); + double d2 = this.getAttributeInstance(GenericAttributes.d).b() + entityageable.getAttributeInstance(GenericAttributes.d).b() + this.cR(); + + entityhorse1.getAttributeInstance(GenericAttributes.d).setValue(d2 / 3.0D); + return entityhorse1; + } + + public GroupDataEntity a(GroupDataEntity groupdataentity) { + Object object = super.a(groupdataentity); + boolean flag = false; + int i = 0; + int j; + + if (object instanceof GroupDataHorse) { + j = ((GroupDataHorse) object).a; + i = ((GroupDataHorse) object).b & 255 | this.random.nextInt(5) << 8; + } else { + if (this.random.nextInt(10) == 0) { + j = 1; + } else { + int k = this.random.nextInt(7); + int l = this.random.nextInt(5); + + j = 0; + i = k | l << 8; + } + + object = new GroupDataHorse(j, i); + } + + this.setType(j); + this.setVariant(i); + if (this.random.nextInt(5) == 0) { + this.setAge(-24000); + } + + if (j != 4 && j != 3) { + this.getAttributeInstance(GenericAttributes.a).setValue((double) this.cP()); + if (j == 0) { + this.getAttributeInstance(GenericAttributes.d).setValue(this.cR()); + } else { + this.getAttributeInstance(GenericAttributes.d).setValue(0.17499999701976776D); + } + } else { + this.getAttributeInstance(GenericAttributes.a).setValue(15.0D); + this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); + } + + if (j != 2 && j != 1) { + this.getAttributeInstance(attributeJumpStrength).setValue(this.cQ()); + } else { + this.getAttributeInstance(attributeJumpStrength).setValue(0.5D); + } + + this.setHealth(this.getMaxHealth()); + return (GroupDataEntity) object; + } + + protected boolean bf() { + return true; + } + + public void u(int i) { + if (this.co()) { + // CraftBukkit start - fire HorseJumpEvent, use event power + if (i < 0) { + i = 0; + } + + float power; + if (i >= 90) { + power = 1.0F; + } else { + power = 0.4F + 0.4F * (float) i / 90.0F; + } + + org.bukkit.event.entity.HorseJumpEvent event = org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory.callHorseJumpEvent(this, power); + if (!event.isCancelled()) { + this.bI = true; + this.cO(); + this.bt = event.getPower(); + } + // CraftBukkit end + } + } + + public void W() { + super.W(); + if (this.bM > 0.0F) { + float f = MathHelper.sin(this.aN * 3.1415927F / 180.0F); + float f1 = MathHelper.cos(this.aN * 3.1415927F / 180.0F); + float f2 = 0.7F * this.bM; + float f3 = 0.15F * this.bM; + + this.passenger.setPosition(this.locX + (double) (f2 * f), this.locY + this.Y() + this.passenger.X() + (double) f3, this.locZ - (double) (f2 * f1)); + if (this.passenger instanceof EntityLiving) { + ((EntityLiving) this.passenger).aN = this.aN; + } + } + } + + private float cP() { + return 15.0F + (float) this.random.nextInt(8) + (float) this.random.nextInt(9); + } + + private double cQ() { + return 0.4000000059604645D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D; + } + + private double cR() { + return (0.44999998807907104D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D) * 0.25D; + } + + public static boolean v(int i) { + return i == Item.HORSE_ARMOR_IRON.id || i == Item.HORSE_ARMOR_GOLD.id || i == Item.HORSE_ARMOR_DIAMOND.id; + } + + public boolean e() { + return false; + } +} \ No newline at end of file