--- ../src-base/minecraft/net/minecraft/entity/item/EntityXPOrb.java +++ ../src-work/minecraft/net/minecraft/entity/item/EntityXPOrb.java @@ -12,13 +12,19 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; + +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.event.entity.EntityTargetEvent; +// CraftBukkit end + public class EntityXPOrb extends Entity { public int xpColor; public int xpOrbAge; public int field_70532_c; private int xpOrbHealth = 5; - public int xpValue; + public int xpValue; // CraftBukkit - private -> public private EntityPlayer closestPlayer; private int xpTargetColor; private static final String __OBFID = "CL_00001544"; @@ -115,18 +121,27 @@ if (this.closestPlayer != null) { - double d1 = (this.closestPlayer.posX - this.posX) / d0; - double d2 = (this.closestPlayer.posY + (double)this.closestPlayer.getEyeHeight() - this.posY) / d0; - double d3 = (this.closestPlayer.posZ - this.posZ) / d0; - double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); - double d5 = 1.0D - d4; + // CraftBukkit start + EntityTargetEvent event = CraftEventFactory.callEntityTargetEvent(this, closestPlayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); + Entity target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - if (d5 > 0.0D) + if (!event.isCancelled() && target != null) { - d5 *= d5; - this.motionX += d1 / d4 * d5 * 0.1D; - this.motionY += d2 / d4 * d5 * 0.1D; - this.motionZ += d3 / d4 * d5 * 0.1D; + double d1 = (target.posX - this.posX) / d0; + double d2 = (target.posY + (double) target.getEyeHeight() - this.posY) / d0; + double d3 = (target.posZ - this.posZ) / d0; + double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); + double d5 = 1.0D - d4; + + if (d5 > 0.0D) + { + d5 *= d5; + this.motionX += d1 / d4 * d5 * 0.1D; + this.motionY += d2 / d4 * d5 * 0.1D; + this.motionZ += d3 / d4 * d5 * 0.1D; + } + + // CraftBukkit end } } @@ -210,7 +225,7 @@ p_70100_1_.xpCooldown = 2; this.worldObj.playSoundAtEntity(p_70100_1_, "random.orb", 0.1F, 0.5F * ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.8F)); p_70100_1_.onItemPickup(this, 1); - p_70100_1_.addExperience(this.xpValue); + p_70100_1_.addExperience(CraftEventFactory.callPlayerExpChangeEvent(p_70100_1_, this.xpValue).getAmount()); this.setDead(); } } @@ -229,6 +244,88 @@ public static int getXPSplit(int p_70527_0_) { + // CraftBukkit start + if (p_70527_0_ > 162670129) + { + return p_70527_0_ - 100000; + } + + if (p_70527_0_ > 81335063) + { + return 81335063; + } + + if (p_70527_0_ > 40667527) + { + return 40667527; + } + + if (p_70527_0_ > 20333759) + { + return 20333759; + } + + if (p_70527_0_ > 10166857) + { + return 10166857; + } + + if (p_70527_0_ > 5083423) + { + return 5083423; + } + + if (p_70527_0_ > 2541701) + { + return 2541701; + } + + if (p_70527_0_ > 1270849) + { + return 1270849; + } + + if (p_70527_0_ > 635413) + { + return 635413; + } + + if (p_70527_0_ > 317701) + { + return 317701; + } + + if (p_70527_0_ > 158849) + { + return 158849; + } + + if (p_70527_0_ > 79423) + { + return 79423; + } + + if (p_70527_0_ > 39709) + { + return 39709; + } + + if (p_70527_0_ > 19853) + { + return 19853; + } + + if (p_70527_0_ > 9923) + { + return 9923; + } + + if (p_70527_0_ > 4957) + { + return 4957; + } + + // CraftBukkit end return p_70527_0_ >= 2477 ? 2477 : (p_70527_0_ >= 1237 ? 1237 : (p_70527_0_ >= 617 ? 617 : (p_70527_0_ >= 307 ? 307 : (p_70527_0_ >= 149 ? 149 : (p_70527_0_ >= 73 ? 73 : (p_70527_0_ >= 37 ? 37 : (p_70527_0_ >= 17 ? 17 : (p_70527_0_ >= 7 ? 7 : (p_70527_0_ >= 3 ? 3 : 1))))))))); } @@ -236,4 +333,11 @@ { return false; } + + // Cauldron start + @Override + public boolean entityProjectileHook() { + return true; + } + // Cauldron end }