--- ../src-base/minecraft/net/minecraft/entity/EntityLivingBase.java +++ ../src-work/minecraft/net/minecraft/entity/EntityLivingBase.java @@ -82,6 +82,7 @@ private static final Logger field_190632_a = LogManager.getLogger(); private static final UUID field_110156_b = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"); private static final AttributeModifier field_110157_c = (new AttributeModifier(field_110156_b, "Sprinting speed boost", 0.30000001192092896D, 2)).func_111168_a(false); + public static final net.minecraft.entity.ai.attributes.IAttribute SWIM_SPEED = new net.minecraft.entity.ai.attributes.RangedAttribute(null, "forge.swimSpeed", 1.0D, 0.0D, 1024.0D).func_111112_a(true); protected static final DataParameter field_184621_as = EntityDataManager.func_187226_a(EntityLivingBase.class, DataSerializers.field_187191_a); private static final DataParameter field_184632_c = EntityDataManager.func_187226_a(EntityLivingBase.class, DataSerializers.field_187193_c); private static final DataParameter field_184633_f = EntityDataManager.func_187226_a(EntityLivingBase.class, DataSerializers.field_187192_b); @@ -188,6 +189,7 @@ this.func_110140_aT().func_111150_b(SharedMonsterAttributes.field_111263_d); this.func_110140_aT().func_111150_b(SharedMonsterAttributes.field_188791_g); this.func_110140_aT().func_111150_b(SharedMonsterAttributes.field_189429_h); + this.func_110140_aT().func_111150_b(SWIM_SPEED); } protected void func_184231_a(double p_184231_1_, boolean p_184231_3_, IBlockState p_184231_4_, BlockPos p_184231_5_) @@ -201,10 +203,11 @@ { float f = (float)MathHelper.func_76123_f(this.field_70143_R - 3.0F); - if (p_184231_4_.func_185904_a() != Material.field_151579_a) + if (!p_184231_4_.func_177230_c().isAir(p_184231_4_, field_70170_p, p_184231_5_)) { double d0 = Math.min((double)(0.2F + f / 15.0F), 2.5D); int i = (int)(150.0D * d0); + if (!p_184231_4_.func_177230_c().addLandingEffects(p_184231_4_, (WorldServer)this.field_70170_p, p_184231_5_, p_184231_4_, this, i)) ((WorldServer)this.field_70170_p).func_175739_a(EnumParticleTypes.BLOCK_DUST, this.field_70165_t, this.field_70163_u, this.field_70161_v, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, Block.func_176210_f(p_184231_4_)); } } @@ -281,7 +284,7 @@ } } - if (!this.field_70170_p.field_72995_K && this.func_184218_aH() && this.func_184187_bx() instanceof EntityLivingBase) + if (!this.field_70170_p.field_72995_K && this.func_184218_aH() && this.func_184187_bx() != null && this.func_184187_bx().shouldDismountInWater(this)) { this.func_184210_p(); } @@ -380,7 +383,7 @@ if (!this.field_70170_p.field_72995_K && (this.func_70684_aJ() || this.field_70718_bc > 0 && this.func_146066_aG() && this.field_70170_p.func_82736_K().func_82766_b("doMobLoot"))) { int i = this.func_70693_a(this.field_70717_bb); - + i = net.minecraftforge.event.ForgeEventFactory.getExperienceDrop(this, this.field_70717_bb, i); while (i > 0) { int j = EntityXPOrb.func_70527_a(i); @@ -442,6 +445,7 @@ { this.field_70755_b = p_70604_1_; this.field_70756_c = this.field_70173_aa; + net.minecraftforge.common.ForgeHooks.onLivingSetAttackTarget(this, p_70604_1_); } public EntityLivingBase func_110144_aD() @@ -670,8 +674,10 @@ else { Collection collection = this.field_70713_bf.values(); - this.field_70180_af.func_187227_b(field_184634_g, Boolean.valueOf(func_184593_a(collection))); - this.field_70180_af.func_187227_b(field_184633_f, Integer.valueOf(PotionUtils.func_185181_a(collection))); + net.minecraftforge.event.entity.living.PotionColorCalculationEvent event = new net.minecraftforge.event.entity.living.PotionColorCalculationEvent(this, PotionUtils.func_185181_a(collection), func_184593_a(collection), collection); + net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event); + this.field_70180_af.func_187227_b(field_184634_g, event.areParticlesHidden()); + this.field_70180_af.func_187227_b(field_184633_f, event.getColor()); this.func_82142_c(this.func_70644_a(MobEffects.field_76441_p)); } } @@ -819,6 +825,8 @@ public void func_70691_i(float p_70691_1_) { + p_70691_1_ = net.minecraftforge.event.ForgeEventFactory.onLivingHeal(this, p_70691_1_); + if (p_70691_1_ <= 0) return; float f = this.func_110143_aJ(); if (f > 0.0F) @@ -839,6 +847,7 @@ public boolean func_70097_a(DamageSource p_70097_1_, float p_70097_2_) { + if (!net.minecraftforge.common.ForgeHooks.onLivingAttack(this, p_70097_1_, p_70097_2_)) return false; if (this.func_180431_b(p_70097_1_)) { return false; @@ -927,9 +936,9 @@ this.field_70718_bc = 100; this.field_70717_bb = (EntityPlayer)entity1; } - else if (entity1 instanceof EntityWolf) + else if (entity1 instanceof net.minecraft.entity.passive.EntityTameable) { - EntityWolf entitywolf = (EntityWolf)entity1; + net.minecraft.entity.passive.EntityTameable entitywolf = (net.minecraft.entity.passive.EntityTameable)entity1; if (entitywolf.func_70909_n()) { @@ -1127,7 +1136,7 @@ public void func_70669_a(ItemStack p_70669_1_) { - this.func_184185_a(SoundEvents.field_187635_cQ, 0.8F, 0.8F + this.field_70170_p.field_73012_v.nextFloat() * 0.4F); + this.field_70170_p.func_184148_a(null, this.field_70165_t, this.field_70163_u, this.field_70161_v, SoundEvents.field_187635_cQ, this.func_184176_by(), 0.8F, 0.8F + this.field_70170_p.field_73012_v.nextFloat() * 0.4F); //Forge: Fix MC-2518 Items are not damaged on the client so client needs packet as well. for (int i = 0; i < 5; ++i) { @@ -1139,12 +1148,17 @@ vec3d1 = vec3d1.func_178789_a(-this.field_70125_A * 0.017453292F); vec3d1 = vec3d1.func_178785_b(-this.field_70177_z * 0.017453292F); vec3d1 = vec3d1.func_72441_c(this.field_70165_t, this.field_70163_u + (double)this.func_70047_e(), this.field_70161_v); - this.field_70170_p.func_175688_a(EnumParticleTypes.ITEM_CRACK, vec3d1.field_72450_a, vec3d1.field_72448_b, vec3d1.field_72449_c, vec3d.field_72450_a, vec3d.field_72448_b + 0.05D, vec3d.field_72449_c, Item.func_150891_b(p_70669_1_.func_77973_b())); + if (this.field_70170_p instanceof WorldServer) //Forge: Fix MC-2518 spawnParticle is nooped on server, need to use server specific variant + ((WorldServer)this.field_70170_p).func_175739_a(EnumParticleTypes.ITEM_CRACK, vec3d1.field_72450_a, vec3d1.field_72448_b, vec3d1.field_72449_c, 0, vec3d.field_72450_a, vec3d.field_72448_b + 0.05D, vec3d.field_72449_c, 0.0D, Item.func_150891_b(p_70669_1_.func_77973_b()), p_70669_1_.func_77960_j()); + else //Fix the fact that spawning ItemCrack uses TWO arguments. + this.field_70170_p.func_175688_a(EnumParticleTypes.ITEM_CRACK, vec3d1.field_72450_a, vec3d1.field_72448_b, vec3d1.field_72449_c, vec3d.field_72450_a, vec3d.field_72448_b + 0.05D, vec3d.field_72449_c, Item.func_150891_b(p_70669_1_.func_77973_b()), p_70669_1_.func_77960_j()); + } } public void func_70645_a(DamageSource p_70645_1_) { + if (net.minecraftforge.common.ForgeHooks.onLivingDeath(this, p_70645_1_)) return; if (!this.field_70729_aU) { Entity entity = p_70645_1_.func_76346_g(); @@ -1165,18 +1179,26 @@ if (!this.field_70170_p.field_72995_K) { - int i = 0; + int i = net.minecraftforge.common.ForgeHooks.getLootingLevel(this, entity, p_70645_1_); - if (entity instanceof EntityPlayer) - { - i = EnchantmentHelper.func_185283_h((EntityLivingBase)entity); - } + captureDrops = true; + capturedDrops.clear(); if (this.func_146066_aG() && this.field_70170_p.func_82736_K().func_82766_b("doMobLoot")) { boolean flag = this.field_70718_bc > 0; this.func_184610_a(flag, i, p_70645_1_); } + + captureDrops = false; + + if (!net.minecraftforge.common.ForgeHooks.onLivingDrops(this, p_70645_1_, capturedDrops, i, field_70718_bc > 0)) + { + for (EntityItem item : capturedDrops) + { + field_70170_p.func_72838_d(item); + } + } } this.field_70170_p.func_72960_a(this, (byte)3); @@ -1195,6 +1217,9 @@ public void func_70653_a(Entity p_70653_1_, float p_70653_2_, double p_70653_3_, double p_70653_5_) { + net.minecraftforge.event.entity.living.LivingKnockBackEvent event = net.minecraftforge.common.ForgeHooks.onLivingKnockBack(this, p_70653_1_, p_70653_2_, p_70653_3_, p_70653_5_); + if(event.isCanceled()) return; + p_70653_2_ = event.getStrength(); p_70653_3_ = event.getRatioX(); p_70653_5_ = event.getRatioZ(); if (this.field_70146_Z.nextDouble() >= this.func_110148_a(SharedMonsterAttributes.field_111266_c).func_111126_e()) { this.field_70160_al = true; @@ -1253,15 +1278,7 @@ BlockPos blockpos = new BlockPos(i, j, k); IBlockState iblockstate = this.field_70170_p.func_180495_p(blockpos); Block block = iblockstate.func_177230_c(); - - if (block != Blocks.field_150468_ap && block != Blocks.field_150395_bd) - { - return block instanceof BlockTrapDoor && this.func_184604_a(blockpos, iblockstate); - } - else - { - return true; - } + return net.minecraftforge.common.ForgeHooks.isLivingOnLadder(iblockstate, field_70170_p, new BlockPos(i, j, k), this); } } @@ -1287,6 +1304,9 @@ public void func_180430_e(float p_180430_1_, float p_180430_2_) { + float[] ret = net.minecraftforge.common.ForgeHooks.onLivingFall(this, p_180430_1_, p_180430_2_); + if (ret == null) return; + p_180430_1_ = ret[0]; p_180430_2_ = ret[1]; super.func_180430_e(p_180430_1_, p_180430_2_); PotionEffect potioneffect = this.func_70660_b(MobEffects.field_76430_j); float f = potioneffect == null ? 0.0F : (float)(potioneffect.func_76458_c() + 1); @@ -1303,7 +1323,7 @@ if (iblockstate.func_185904_a() != Material.field_151579_a) { - SoundType soundtype = iblockstate.func_177230_c().func_185467_w(); + SoundType soundtype = iblockstate.func_177230_c().getSoundType(iblockstate, field_70170_p, new BlockPos(j, k, l), this); this.func_184185_a(soundtype.func_185842_g(), soundtype.func_185843_a() * 0.5F, soundtype.func_185847_b() * 0.75F); } } @@ -1380,17 +1400,20 @@ { if (!this.func_180431_b(p_70665_1_)) { + p_70665_2_ = net.minecraftforge.common.ForgeHooks.onLivingHurt(this, p_70665_1_, p_70665_2_); + if (p_70665_2_ <= 0) return; p_70665_2_ = this.func_70655_b(p_70665_1_, p_70665_2_); p_70665_2_ = this.func_70672_c(p_70665_1_, p_70665_2_); float f = p_70665_2_; p_70665_2_ = Math.max(p_70665_2_ - this.func_110139_bj(), 0.0F); this.func_110149_m(this.func_110139_bj() - (f - p_70665_2_)); + p_70665_2_ = net.minecraftforge.common.ForgeHooks.onLivingDamage(this, p_70665_1_, p_70665_2_); if (p_70665_2_ != 0.0F) { float f1 = this.func_110143_aJ(); - this.func_70606_j(f1 - p_70665_2_); this.func_110142_aN().func_94547_a(p_70665_1_, f1, p_70665_2_); + this.func_70606_j(f1 - p_70665_2_); // Forge: moved to fix MC-121048 this.func_110149_m(this.func_110139_bj() - p_70665_2_); } } @@ -1447,6 +1470,11 @@ public void func_184609_a(EnumHand p_184609_1_) { + ItemStack stack = this.func_184586_b(p_184609_1_); + if (!stack.func_190926_b()) + { + if (stack.func_77973_b().onEntitySwing(this, stack)) return; + } if (!this.field_82175_bq || this.field_110158_av >= this.func_82166_i() / 2 || this.field_110158_av < 0) { this.field_110158_av = -1; @@ -1694,7 +1722,7 @@ if (!this.field_70170_p.func_184143_b(axisalignedbb1)) { - if (this.field_70170_p.func_180495_p(new BlockPos(d11, this.field_70163_u, d12)).func_185896_q()) + if (this.field_70170_p.func_180495_p(new BlockPos(d11, this.field_70163_u, d12)).isSideSolid(field_70170_p, new BlockPos(d11, this.field_70163_u, d12), EnumFacing.UP)) { this.func_70634_a(d11, this.field_70163_u + 1.0D, d12); return; @@ -1702,14 +1730,14 @@ BlockPos blockpos = new BlockPos(d11, this.field_70163_u - 1.0D, d12); - if (this.field_70170_p.func_180495_p(blockpos).func_185896_q() || this.field_70170_p.func_180495_p(blockpos).func_185904_a() == Material.field_151586_h) + if (this.field_70170_p.func_180495_p(blockpos).isSideSolid(field_70170_p, blockpos, EnumFacing.UP) || this.field_70170_p.func_180495_p(blockpos).func_185904_a() == Material.field_151586_h) { d1 = d11; d13 = this.field_70163_u + 1.0D; d14 = d12; } } - else if (!this.field_70170_p.func_184143_b(axisalignedbb1.func_72317_d(0.0D, 1.0D, 0.0D)) && this.field_70170_p.func_180495_p(new BlockPos(d11, this.field_70163_u + 1.0D, d12)).func_185896_q()) + else if (!this.field_70170_p.func_184143_b(axisalignedbb1.func_72317_d(0.0D, 1.0D, 0.0D)) && this.field_70170_p.func_180495_p(new BlockPos(d11, this.field_70163_u + 1.0D, d12)).isSideSolid(field_70170_p, new BlockPos(d11, this.field_70163_u + 1.0D, d12), EnumFacing.UP)) { d1 = d11; d13 = this.field_70163_u + 2.0D; @@ -1781,16 +1809,17 @@ } this.field_70160_al = true; + net.minecraftforge.common.ForgeHooks.onLivingJump(this); } protected void func_70629_bd() { - this.field_70181_x += 0.03999999910593033D; + this.field_70181_x += 0.03999999910593033D * this.func_110148_a(SWIM_SPEED).func_111126_e(); } protected void func_180466_bG() { - this.field_70181_x += 0.03999999910593033D; + this.field_70181_x += 0.03999999910593033D * this.func_110148_a(SWIM_SPEED).func_111126_e(); } protected float func_189749_co() @@ -1874,7 +1903,8 @@ if (this.field_70122_E) { - f6 = this.field_70170_p.func_180495_p(blockpos$pooledmutableblockpos).func_177230_c().field_149765_K * 0.91F; + IBlockState underState = this.field_70170_p.func_180495_p(blockpos$pooledmutableblockpos); + f6 = underState.func_177230_c().getSlipperiness(underState, this.field_70170_p, blockpos$pooledmutableblockpos, this) * 0.91F; } float f7 = 0.16277136F / (f6 * f6 * f6); @@ -1894,7 +1924,8 @@ if (this.field_70122_E) { - f6 = this.field_70170_p.func_180495_p(blockpos$pooledmutableblockpos.func_189532_c(this.field_70165_t, this.func_174813_aQ().field_72338_b - 1.0D, this.field_70161_v)).func_177230_c().field_149765_K * 0.91F; + IBlockState underState = this.field_70170_p.func_180495_p(blockpos$pooledmutableblockpos.func_189532_c(this.field_70165_t, this.func_174813_aQ().field_72338_b - 1.0D, this.field_70161_v)); + f6 = underState.func_177230_c().getSlipperiness(underState, this.field_70170_p, blockpos$pooledmutableblockpos, this) * 0.91F; } if (this.func_70617_f_()) @@ -2054,6 +2085,7 @@ public void func_70071_h_() { + if (net.minecraftforge.common.ForgeHooks.onLivingUpdate(this)) return; super.func_70071_h_(); this.func_184608_ct(); @@ -2096,7 +2128,9 @@ if (!ItemStack.func_77989_b(itemstack1, itemstack)) { + if (!ItemStack.areItemStacksEqualUsingNBTShareTag(itemstack1, itemstack)) ((WorldServer)this.field_70170_p).func_73039_n().func_151247_a(this, new SPacketEntityEquipment(this.func_145782_y(), entityequipmentslot, itemstack1)); + net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent(this, entityequipmentslot, itemstack, itemstack1)); if (!itemstack.func_190926_b()) { @@ -2575,6 +2609,40 @@ this.field_70752_e = true; } + /*** + * Removes all potion effects that have curativeItem as a curative item for its effect + * @param curativeItem The itemstack we are using to cure potion effects + */ + public void curePotionEffects(ItemStack curativeItem) + { + if (field_70170_p.field_72995_K) return; + Iterator iterator = this.field_70713_bf.values().iterator(); + + while (iterator.hasNext()) + { + PotionEffect effect = iterator.next(); + + if (effect.isCurativeItem(curativeItem)) + { + func_70688_c(effect); + iterator.remove(); + this.field_70752_e = true; + } + } + } + + /** + * Returns true if the entity's rider (EntityPlayer) should face forward when mounted. + * currently only used in vanilla code by pigs. + * + * @param player The player who is riding the entity. + * @return If the player should orient the same direction as this entity. + */ + public boolean shouldRiderFaceForward(EntityPlayer player) + { + return this instanceof net.minecraft.entity.passive.EntityPig; + } + public abstract EnumHandSide func_184591_cq(); public boolean func_184587_cr() @@ -2595,12 +2663,19 @@ if (itemstack == this.field_184627_bm) { + if (!this.field_184627_bm.func_190926_b()) + { + field_184628_bn = net.minecraftforge.event.ForgeEventFactory.onItemUseTick(this, field_184627_bm, field_184628_bn); + if (field_184628_bn > 0) + field_184627_bm.func_77973_b().onUsingTick(field_184627_bm, this, field_184628_bn); + } + if (this.func_184605_cv() <= 25 && this.func_184605_cv() % 4 == 0) { this.func_184584_a(this.field_184627_bm, 5); } - if (--this.field_184628_bn == 0 && !this.field_70170_p.field_72995_K) + if (--this.field_184628_bn <= 0 && !this.field_70170_p.field_72995_K) { this.func_71036_o(); } @@ -2618,8 +2693,10 @@ if (!itemstack.func_190926_b() && !this.func_184587_cr()) { + int duration = net.minecraftforge.event.ForgeEventFactory.onItemUseStart(this, itemstack, itemstack.func_77988_m()); + if (duration <= 0) return; this.field_184627_bm = itemstack; - this.field_184628_bn = itemstack.func_77988_m(); + this.field_184628_bn = duration; if (!this.field_70170_p.field_72995_K) { @@ -2700,7 +2777,10 @@ if (!this.field_184627_bm.func_190926_b() && this.func_184587_cr()) { this.func_184584_a(this.field_184627_bm, 16); - this.func_184611_a(this.func_184600_cs(), this.field_184627_bm.func_77950_b(this.field_70170_p, this)); + ItemStack activeItemStackCopy = this.field_184627_bm.func_77946_l(); + ItemStack itemstack = this.field_184627_bm.func_77950_b(this.field_70170_p, this); + itemstack = net.minecraftforge.event.ForgeEventFactory.onItemUseFinish(this, activeItemStackCopy, func_184605_cv(), itemstack); + this.func_184611_a(this.func_184600_cs(), itemstack); this.func_184602_cy(); } } @@ -2724,7 +2804,8 @@ { if (!this.field_184627_bm.func_190926_b()) { - this.field_184627_bm.func_77974_b(this.field_70170_p, this, this.func_184605_cv()); + if (!net.minecraftforge.event.ForgeEventFactory.onUseItemStop(this, field_184627_bm, this.func_184605_cv())) + this.field_184627_bm.func_77974_b(this.field_70170_p, this, this.func_184605_cv()); } this.func_184602_cy(); @@ -2852,6 +2933,31 @@ return true; } + // FORGE + private final net.minecraftforge.items.IItemHandlerModifiable handHandler = new net.minecraftforge.items.wrapper.EntityHandsInvWrapper(this); + private final net.minecraftforge.items.IItemHandlerModifiable armorHandler = new net.minecraftforge.items.wrapper.EntityArmorInvWrapper(this); + private final net.minecraftforge.items.IItemHandler joinedHandler = new net.minecraftforge.items.wrapper.CombinedInvWrapper(armorHandler, handHandler); + + @SuppressWarnings("unchecked") + @Override + @Nullable + public T getCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable net.minecraft.util.EnumFacing facing) + { + if (capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { + if (facing == null) return (T) joinedHandler; + else if (facing.func_176740_k().func_176720_b()) return (T) handHandler; + else if (facing.func_176740_k().func_176722_c()) return (T) armorHandler; + } + return super.getCapability(capability, facing); + } + + @Override + public boolean hasCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable net.minecraft.util.EnumFacing facing) + { + return capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); + } + public boolean func_190631_cK() { return true; @@ -2861,4 +2967,30 @@ public void func_191987_a(BlockPos p_191987_1_, boolean p_191987_2_) { } + + @Override + public void func_191958_b(float strafe, float up, float forward, float friction) + { + float f = strafe * strafe + up * up + forward * forward; + if (f >= 1.0E-4F) + { + f = MathHelper.func_76129_c(f); + if (f < 1.0F) f = 1.0F; + f = friction / f; + strafe = strafe * f; + up = up * f; + forward = forward * f; + if(this.func_70090_H() || this.func_180799_ab()) + { + strafe = strafe * (float)this.func_110148_a(SWIM_SPEED).func_111126_e(); + up = up * (float)this.func_110148_a(SWIM_SPEED).func_111126_e(); + forward = forward * (float)this.func_110148_a(SWIM_SPEED).func_111126_e(); + } + float f1 = MathHelper.func_76126_a(this.field_70177_z * 0.017453292F); + float f2 = MathHelper.func_76134_b(this.field_70177_z * 0.017453292F); + this.field_70159_w += (double)(strafe * f2 - forward * f1); + this.field_70181_x += (double)up; + this.field_70179_y += (double)(forward * f2 + strafe * f1); + } + } }