From 403eda184abb405779a39df2614f2fe992c66d36 Mon Sep 17 00:00:00 2001 From: LexManos Date: Thu, 23 Feb 2017 15:15:48 -0800 Subject: [PATCH] Properly fix IShearable implementation. Fixes shears taking damage twice, mooshroom particles, and blocks dropping incorrect loot. --- .../minecraft/block/BlockDeadBush.java.patch | 9 ----- .../minecraft/block/BlockNewLeaf.java.patch | 9 ----- .../minecraft/block/BlockTallGrass.java.patch | 9 ----- .../net/minecraft/block/BlockVine.java.patch | 9 ----- .../net/minecraft/block/BlockWeb.java.patch | 22 +++++++++++++ .../entity/monster/EntitySnowman.java.patch | 33 +++++++++++++++++++ .../entity/passive/EntityMooshroom.java.patch | 2 +- .../net/minecraft/item/ItemShears.java.patch | 13 ++++---- .../net/minecraftforge/common/IShearable.java | 2 ++ 9 files changed, 65 insertions(+), 43 deletions(-) create mode 100644 patches/minecraft/net/minecraft/block/BlockWeb.java.patch create mode 100644 patches/minecraft/net/minecraft/entity/monster/EntitySnowman.java.patch diff --git a/patches/minecraft/net/minecraft/block/BlockDeadBush.java.patch b/patches/minecraft/net/minecraft/block/BlockDeadBush.java.patch index a29cac2035..30963462e5 100644 --- a/patches/minecraft/net/minecraft/block/BlockDeadBush.java.patch +++ b/patches/minecraft/net/minecraft/block/BlockDeadBush.java.patch @@ -9,15 +9,6 @@ { protected static final AxisAlignedBB field_185516_a = new AxisAlignedBB(0.09999999403953552D, 0.0D, 0.09999999403953552D, 0.8999999761581421D, 0.800000011920929D, 0.8999999761581421D); -@@ -58,7 +58,7 @@ - - public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) - { -- if (!p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) -+ if (false && !p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) - { - p_180657_2_.func_71029_a(StatList.func_188055_a(this)); - func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(Blocks.field_150330_I, 1, 0)); @@ -68,4 +68,11 @@ super.func_180657_a(p_180657_1_, p_180657_2_, p_180657_3_, p_180657_4_, p_180657_5_, p_180657_6_); } diff --git a/patches/minecraft/net/minecraft/block/BlockNewLeaf.java.patch b/patches/minecraft/net/minecraft/block/BlockNewLeaf.java.patch index 6cf25c84c4..a1d1e2c062 100644 --- a/patches/minecraft/net/minecraft/block/BlockNewLeaf.java.patch +++ b/patches/minecraft/net/minecraft/block/BlockNewLeaf.java.patch @@ -1,14 +1,5 @@ --- ../src-base/minecraft/net/minecraft/block/BlockNewLeaf.java +++ ../src-work/minecraft/net/minecraft/block/BlockNewLeaf.java -@@ -99,7 +99,7 @@ - - public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) - { -- if (!p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) -+ if (false && !p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) - { - p_180657_2_.func_71029_a(StatList.func_188055_a(this)); - func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(Item.func_150898_a(this), 1, ((BlockPlanks.EnumType)p_180657_4_.func_177229_b(field_176240_P)).func_176839_a() - 4)); @@ -109,4 +109,10 @@ super.func_180657_a(p_180657_1_, p_180657_2_, p_180657_3_, p_180657_4_, p_180657_5_, p_180657_6_); } diff --git a/patches/minecraft/net/minecraft/block/BlockTallGrass.java.patch b/patches/minecraft/net/minecraft/block/BlockTallGrass.java.patch index 8320200de7..477990d2c0 100644 --- a/patches/minecraft/net/minecraft/block/BlockTallGrass.java.patch +++ b/patches/minecraft/net/minecraft/block/BlockTallGrass.java.patch @@ -27,15 +27,6 @@ } public int func_149679_a(int p_149679_1_, Random p_149679_2_) -@@ -62,7 +62,7 @@ - - public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) - { -- if (!p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) -+ if (false && !p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) // Forge: Noop Taken care of by IShearable - { - p_180657_2_.func_71029_a(StatList.func_188055_a(this)); - func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(Blocks.field_150329_H, 1, ((BlockTallGrass.EnumType)p_180657_4_.func_177229_b(field_176497_a)).func_177044_a())); @@ -181,4 +181,21 @@ } } diff --git a/patches/minecraft/net/minecraft/block/BlockVine.java.patch b/patches/minecraft/net/minecraft/block/BlockVine.java.patch index 9364c30c72..0d3a99649d 100644 --- a/patches/minecraft/net/minecraft/block/BlockVine.java.patch +++ b/patches/minecraft/net/minecraft/block/BlockVine.java.patch @@ -9,15 +9,6 @@ { public static final PropertyBool field_176277_a = PropertyBool.func_177716_a("up"); public static final PropertyBool field_176273_b = PropertyBool.func_177716_a("north"); -@@ -344,7 +344,7 @@ - - public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) - { -- if (!p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) -+ if (false && !p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) // Forge: Noop, Covered by IShearable - { - p_180657_2_.func_71029_a(StatList.func_188055_a(this)); - func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(Blocks.field_150395_bd, 1, 0)); @@ -459,4 +459,14 @@ return i; diff --git a/patches/minecraft/net/minecraft/block/BlockWeb.java.patch b/patches/minecraft/net/minecraft/block/BlockWeb.java.patch new file mode 100644 index 0000000000..9a8fc29430 --- /dev/null +++ b/patches/minecraft/net/minecraft/block/BlockWeb.java.patch @@ -0,0 +1,22 @@ +--- ../src-base/minecraft/net/minecraft/block/BlockWeb.java ++++ ../src-work/minecraft/net/minecraft/block/BlockWeb.java +@@ -20,7 +20,7 @@ + import net.minecraftforge.fml.relauncher.Side; + import net.minecraftforge.fml.relauncher.SideOnly; + +-public class BlockWeb extends Block ++public class BlockWeb extends Block implements net.minecraftforge.common.IShearable + { + public BlockWeb() + { +@@ -77,4 +77,10 @@ + super.func_180657_a(p_180657_1_, p_180657_2_, p_180657_3_, p_180657_4_, p_180657_5_, p_180657_6_); + } + } ++ ++ @Override public boolean isShearable(ItemStack item, IBlockAccess world, BlockPos pos) { return true; } ++ @Override ++ public java.util.List onSheared(ItemStack item, IBlockAccess world, BlockPos pos, int fortune) { ++ return com.google.common.collect.Lists.newArrayList(new ItemStack(Item.func_150898_a(this))); ++ } + } diff --git a/patches/minecraft/net/minecraft/entity/monster/EntitySnowman.java.patch b/patches/minecraft/net/minecraft/entity/monster/EntitySnowman.java.patch new file mode 100644 index 0000000000..2661671bb6 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/monster/EntitySnowman.java.patch @@ -0,0 +1,33 @@ +--- ../src-base/minecraft/net/minecraft/entity/monster/EntitySnowman.java ++++ ../src-work/minecraft/net/minecraft/entity/monster/EntitySnowman.java +@@ -31,7 +31,7 @@ + import net.minecraft.world.World; + import net.minecraft.world.storage.loot.LootTableList; + +-public class EntitySnowman extends EntityGolem implements IRangedAttackMob ++public class EntitySnowman extends EntityGolem implements IRangedAttackMob, net.minecraftforge.common.IShearable + { + private static final DataParameter field_184749_a = EntityDataManager.func_187226_a(EntitySnowman.class, DataSerializers.field_187191_a); + +@@ -152,7 +152,7 @@ + { + ItemStack itemstack = p_184645_1_.func_184586_b(p_184645_2_); + +- if (itemstack.func_77973_b() == Items.field_151097_aZ && this.func_184748_o() && !this.field_70170_p.field_72995_K) ++ if (false && itemstack.func_77973_b() == Items.field_151097_aZ && this.func_184748_o() && !this.field_70170_p.field_72995_K) //Forge: Moved to onSheared + { + this.func_184747_a(false); + itemstack.func_77972_a(1, p_184645_1_); +@@ -197,4 +197,12 @@ + { + return SoundEvents.field_187801_fC; + } ++ ++ @Override public boolean isShearable(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos) { return this.func_184748_o(); } ++ @Override ++ public java.util.List onSheared(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos, int fortune) ++ { ++ this.func_184747_a(false); ++ return com.google.common.collect.Lists.newArrayList(); ++ } + } diff --git a/patches/minecraft/net/minecraft/entity/passive/EntityMooshroom.java.patch b/patches/minecraft/net/minecraft/entity/passive/EntityMooshroom.java.patch index 158bec0ea0..726e62f31e 100644 --- a/patches/minecraft/net/minecraft/entity/passive/EntityMooshroom.java.patch +++ b/patches/minecraft/net/minecraft/entity/passive/EntityMooshroom.java.patch @@ -27,7 +27,7 @@ + public java.util.List onSheared(ItemStack item, net.minecraft.world.IBlockAccess world, net.minecraft.util.math.BlockPos pos, int fortune) + { + this.func_70106_y(); -+ this.field_70170_p.func_175688_a(EnumParticleTypes.EXPLOSION_LARGE, this.field_70165_t, this.field_70163_u + (double)(this.field_70131_O / 2.0F), this.field_70161_v, 0.0D, 0.0D, 0.0D, new int[0]); ++ ((net.minecraft.world.WorldServer)this.field_70170_p).func_180505_a(EnumParticleTypes.EXPLOSION_LARGE, false, this.field_70165_t, this.field_70163_u + (double)(this.field_70131_O / 2.0F), this.field_70161_v, 1, 0.0D, 0.0D, 0.0D, 0.0D); + + EntityCow entitycow = new EntityCow(this.field_70170_p); + entitycow.func_70012_b(this.field_70165_t, this.field_70163_u, this.field_70161_v, this.field_70177_z, this.field_70125_A); diff --git a/patches/minecraft/net/minecraft/item/ItemShears.java.patch b/patches/minecraft/net/minecraft/item/ItemShears.java.patch index 4abe802195..dd9d598a3f 100644 --- a/patches/minecraft/net/minecraft/item/ItemShears.java.patch +++ b/patches/minecraft/net/minecraft/item/ItemShears.java.patch @@ -1,15 +1,14 @@ --- ../src-base/minecraft/net/minecraft/item/ItemShears.java +++ ../src-work/minecraft/net/minecraft/item/ItemShears.java -@@ -26,7 +26,7 @@ +@@ -26,6 +26,7 @@ } Block block = p_179218_3_.func_177230_c(); -- return p_179218_3_.func_185904_a() != Material.field_151584_j && block != Blocks.field_150321_G && block != Blocks.field_150329_H && block != Blocks.field_150395_bd && block != Blocks.field_150473_bD && block != Blocks.field_150325_L ? super.func_179218_a(p_179218_1_, p_179218_2_, p_179218_3_, p_179218_4_, p_179218_5_) : true; -+ return p_179218_3_.func_185904_a() != Material.field_151584_j && block != Blocks.field_150321_G && block != Blocks.field_150329_H && block != Blocks.field_150395_bd && block != Blocks.field_150473_bD && block != Blocks.field_150325_L && !(p_179218_3_ instanceof net.minecraftforge.common.IShearable) ? super.func_179218_a(p_179218_1_, p_179218_2_, p_179218_3_, p_179218_4_, p_179218_5_) : true; ++ if (block instanceof net.minecraftforge.common.IShearable) return true; + return p_179218_3_.func_185904_a() != Material.field_151584_j && block != Blocks.field_150321_G && block != Blocks.field_150329_H && block != Blocks.field_150395_bd && block != Blocks.field_150473_bD && block != Blocks.field_150325_L ? super.func_179218_a(p_179218_1_, p_179218_2_, p_179218_3_, p_179218_4_, p_179218_5_) : true; } - public boolean func_150897_b(IBlockState p_150897_1_) -@@ -40,4 +40,71 @@ +@@ -40,4 +41,73 @@ Block block = p_150893_2_.func_177230_c(); return block != Blocks.field_150321_G && p_150893_2_.func_185904_a() != Material.field_151584_j ? (block == Blocks.field_150325_L ? 5.0F : super.func_150893_a(p_150893_1_, p_150893_2_)) : 15.0F; } @@ -63,7 +62,7 @@ + net.minecraft.enchantment.EnchantmentHelper.func_77506_a(net.minecraft.init.Enchantments.field_185308_t, itemstack)); + java.util.Random rand = new java.util.Random(); + -+ for(ItemStack stack : drops) ++ for (ItemStack stack : drops) + { + float f = 0.7F; + double d = (double)(rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; @@ -76,6 +75,8 @@ + + itemstack.func_77972_a(1, player); + player.func_71029_a(net.minecraft.stats.StatList.func_188055_a(block)); ++ player.field_70170_p.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11); //TODO: Move to IShearable implementors in 1.12+ ++ return true; + } + } + return false; diff --git a/src/main/java/net/minecraftforge/common/IShearable.java b/src/main/java/net/minecraftforge/common/IShearable.java index 13b1a7ae4a..1b9ee1cded 100644 --- a/src/main/java/net/minecraftforge/common/IShearable.java +++ b/src/main/java/net/minecraftforge/common/IShearable.java @@ -35,6 +35,8 @@ import javax.annotation.Nonnull; * to support mod-shears as well. * */ +//TODO Change to World, not IBlockAccess and make Implementor responsible for removing itself from the world. +//Better mimics vanilla behavior and allows more control for the user. public interface IShearable { /**