From aef224221ff80e710eaea2e2e710f078715500d3 Mon Sep 17 00:00:00 2001 From: Ben Staddon Date: Tue, 23 Apr 2019 18:04:19 -0400 Subject: [PATCH] Better support for custom bows (#5209) --- .../entity/AbstractClientPlayer.java.patch | 9 +++++++ .../renderer/FirstPersonRenderer.java.patch | 9 +++++++ .../layers/LayerHeldItemWitch.java.patch | 11 ++++++++ .../entity/model/ModelSkeleton.java.patch | 20 ++++++++++++++ .../ai/EntityAIAttackRangedBow.java.patch | 11 ++++++++ .../monster/AbstractSkeleton.java.patch | 20 ++++++++++++++ .../monster/EntityIllusionIllager.java.patch | 11 ++++++++ .../net/minecraft/item/ItemBow.java.patch | 26 +++++++++++++++++-- .../resources/META-INF/accesstransformer.cfg | 2 ++ 9 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerHeldItemWitch.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/entity/model/ModelSkeleton.java.patch create mode 100644 patches/minecraft/net/minecraft/entity/ai/EntityAIAttackRangedBow.java.patch create mode 100644 patches/minecraft/net/minecraft/entity/monster/AbstractSkeleton.java.patch create mode 100644 patches/minecraft/net/minecraft/entity/monster/EntityIllusionIllager.java.patch diff --git a/patches/minecraft/net/minecraft/client/entity/AbstractClientPlayer.java.patch b/patches/minecraft/net/minecraft/client/entity/AbstractClientPlayer.java.patch index b4ac1ddea..900885f57 100644 --- a/patches/minecraft/net/minecraft/client/entity/AbstractClientPlayer.java.patch +++ b/patches/minecraft/net/minecraft/client/entity/AbstractClientPlayer.java.patch @@ -1,5 +1,14 @@ --- a/net/minecraft/client/entity/AbstractClientPlayer.java +++ b/net/minecraft/client/entity/AbstractClientPlayer.java +@@ -114,7 +114,7 @@ + f = 1.0F; + } + +- if (this.func_184587_cr() && this.func_184607_cu().func_77973_b() == Items.field_151031_f) { ++ if (this.func_184587_cr() && this.func_184607_cu().func_77973_b() instanceof net.minecraft.item.ItemBow) { + int i = this.func_184612_cw(); + float f1 = (float)i / 20.0F; + if (f1 > 1.0F) { @@ -126,6 +126,6 @@ f *= 1.0F - f1 * 0.15F; } diff --git a/patches/minecraft/net/minecraft/client/renderer/FirstPersonRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/FirstPersonRenderer.java.patch index 70132c11c..42cfa2ff6 100644 --- a/patches/minecraft/net/minecraft/client/renderer/FirstPersonRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/FirstPersonRenderer.java.patch @@ -1,5 +1,14 @@ --- a/net/minecraft/client/renderer/FirstPersonRenderer.java +++ b/net/minecraft/client/renderer/FirstPersonRenderer.java +@@ -273,7 +273,7 @@ + boolean flag1 = true; + if (abstractclientplayer.func_184587_cr()) { + ItemStack itemstack = abstractclientplayer.func_184607_cu(); +- if (itemstack.func_77973_b() == Items.field_151031_f) { ++ if (itemstack.func_77973_b() instanceof net.minecraft.item.ItemBow) { + flag = abstractclientplayer.func_184600_cs() == EnumHand.MAIN_HAND; + flag1 = !flag; + } @@ -286,12 +286,14 @@ if (flag) { float f4 = enumhand == EnumHand.MAIN_HAND ? f : 0.0F; diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerHeldItemWitch.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerHeldItemWitch.java.patch new file mode 100644 index 000000000..20ff39eb4 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerHeldItemWitch.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/client/renderer/entity/layers/LayerHeldItemWitch.java ++++ b/net/minecraft/client/renderer/entity/layers/LayerHeldItemWitch.java +@@ -43,7 +43,7 @@ + GlStateManager.func_179114_b(-5.0F, 0.0F, 1.0F, 0.0F); + float f1 = 0.375F; + GlStateManager.func_179152_a(0.375F, -0.375F, 0.375F); +- } else if (item == Items.field_151031_f) { ++ } else if (item instanceof net.minecraft.item.ItemBow) { + GlStateManager.func_179109_b(0.0F, 0.125F, -0.125F); + GlStateManager.func_179114_b(-45.0F, 0.0F, 1.0F, 0.0F); + float f2 = 0.625F; diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/model/ModelSkeleton.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/model/ModelSkeleton.java.patch new file mode 100644 index 000000000..486ad28f7 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/entity/model/ModelSkeleton.java.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/client/renderer/entity/model/ModelSkeleton.java ++++ b/net/minecraft/client/renderer/entity/model/ModelSkeleton.java +@@ -42,7 +42,7 @@ + this.field_187076_m = ModelBiped.ArmPose.EMPTY; + this.field_187075_l = ModelBiped.ArmPose.EMPTY; + ItemStack itemstack = p_78086_1_.func_184586_b(EnumHand.MAIN_HAND); +- if (itemstack.func_77973_b() == Items.field_151031_f && ((AbstractSkeleton)p_78086_1_).func_184725_db()) { ++ if (itemstack.func_77973_b() instanceof net.minecraft.item.ItemBow && ((AbstractSkeleton)p_78086_1_).func_184725_db()) { + if (p_78086_1_.func_184591_cq() == EnumHandSide.RIGHT) { + this.field_187076_m = ModelBiped.ArmPose.BOW_AND_ARROW; + } else { +@@ -57,7 +57,7 @@ + super.func_78087_a(p_78087_1_, p_78087_2_, p_78087_3_, p_78087_4_, p_78087_5_, p_78087_6_, p_78087_7_); + ItemStack itemstack = ((EntityLivingBase)p_78087_7_).func_184614_ca(); + AbstractSkeleton abstractskeleton = (AbstractSkeleton)p_78087_7_; +- if (abstractskeleton.func_184725_db() && (itemstack.func_190926_b() || itemstack.func_77973_b() != Items.field_151031_f)) { ++ if (abstractskeleton.func_184725_db() && (itemstack.func_190926_b() || !(itemstack.func_77973_b() instanceof net.minecraft.item.ItemBow))) { + float f = MathHelper.func_76126_a(this.field_78095_p * (float)Math.PI); + float f1 = MathHelper.func_76126_a((1.0F - (1.0F - this.field_78095_p) * (1.0F - this.field_78095_p)) * (float)Math.PI); + this.field_178723_h.field_78808_h = 0.0F; diff --git a/patches/minecraft/net/minecraft/entity/ai/EntityAIAttackRangedBow.java.patch b/patches/minecraft/net/minecraft/entity/ai/EntityAIAttackRangedBow.java.patch new file mode 100644 index 000000000..4e5bf60bc --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/ai/EntityAIAttackRangedBow.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/entity/ai/EntityAIAttackRangedBow.java ++++ b/net/minecraft/entity/ai/EntityAIAttackRangedBow.java +@@ -35,7 +35,7 @@ + } + + protected boolean func_188498_f() { +- return !this.field_188499_a.func_184614_ca().func_190926_b() && this.field_188499_a.func_184614_ca().func_77973_b() == Items.field_151031_f; ++ return !this.field_188499_a.func_184614_ca().func_190926_b() && this.field_188499_a.func_184614_ca().func_77973_b() instanceof net.minecraft.item.ItemBow; + } + + public boolean func_75253_b() { diff --git a/patches/minecraft/net/minecraft/entity/monster/AbstractSkeleton.java.patch b/patches/minecraft/net/minecraft/entity/monster/AbstractSkeleton.java.patch new file mode 100644 index 000000000..312c83234 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/monster/AbstractSkeleton.java.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/entity/monster/AbstractSkeleton.java ++++ b/net/minecraft/entity/monster/AbstractSkeleton.java +@@ -161,7 +161,7 @@ + this.field_70714_bg.func_85156_a(this.field_85038_e); + this.field_70714_bg.func_85156_a(this.field_85037_d); + ItemStack itemstack = this.func_184614_ca(); +- if (itemstack.func_77973_b() == Items.field_151031_f) { ++ if (itemstack.func_77973_b() instanceof net.minecraft.item.ItemBow) { + int i = 20; + if (this.field_70170_p.func_175659_aa() != EnumDifficulty.HARD) { + i = 40; +@@ -178,6 +178,8 @@ + + public void func_82196_d(EntityLivingBase p_82196_1_, float p_82196_2_) { + EntityArrow entityarrow = this.func_190726_a(p_82196_2_); ++ if (this.func_184614_ca().func_77973_b() instanceof net.minecraft.item.ItemBow) ++ entityarrow = ((net.minecraft.item.ItemBow) this.func_184614_ca().func_77973_b()).customizeArrow(entityarrow); + double d0 = p_82196_1_.field_70165_t - this.field_70165_t; + double d1 = p_82196_1_.func_174813_aQ().field_72338_b + (double)(p_82196_1_.field_70131_O / 3.0F) - entityarrow.field_70163_u; + double d2 = p_82196_1_.field_70161_v - this.field_70161_v; diff --git a/patches/minecraft/net/minecraft/entity/monster/EntityIllusionIllager.java.patch b/patches/minecraft/net/minecraft/entity/monster/EntityIllusionIllager.java.patch new file mode 100644 index 000000000..c4ac565d7 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/monster/EntityIllusionIllager.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/entity/monster/EntityIllusionIllager.java ++++ b/net/minecraft/entity/monster/EntityIllusionIllager.java +@@ -181,6 +181,8 @@ + + public void func_82196_d(EntityLivingBase p_82196_1_, float p_82196_2_) { + EntityArrow entityarrow = this.func_193097_t(p_82196_2_); ++ if (this.func_184614_ca().func_77973_b() instanceof net.minecraft.item.ItemBow) ++ entityarrow = ((net.minecraft.item.ItemBow) this.func_184614_ca().func_77973_b()).customizeArrow(entityarrow); + double d0 = p_82196_1_.field_70165_t - this.field_70165_t; + double d1 = p_82196_1_.func_174813_aQ().field_72338_b + (double)(p_82196_1_.field_70131_O / 3.0F) - entityarrow.field_70163_u; + double d2 = p_82196_1_.field_70161_v - this.field_70161_v; diff --git a/patches/minecraft/net/minecraft/item/ItemBow.java.patch b/patches/minecraft/net/minecraft/item/ItemBow.java.patch index 3271de18d..1d5897ba7 100644 --- a/patches/minecraft/net/minecraft/item/ItemBow.java.patch +++ b/patches/minecraft/net/minecraft/item/ItemBow.java.patch @@ -1,6 +1,15 @@ --- a/net/minecraft/item/ItemBow.java +++ b/net/minecraft/item/ItemBow.java -@@ -56,15 +56,19 @@ +@@ -22,7 +22,7 @@ + if (p_210310_2_ == null) { + return 0.0F; + } else { +- return p_210310_2_.func_184607_cu().func_77973_b() != Items.field_151031_f ? 0.0F : (float)(p_210310_0_.func_77988_m() - p_210310_2_.func_184605_cv()) / 20.0F; ++ return !(p_210310_2_.func_184607_cu().func_77973_b() instanceof ItemBow) ? 0.0F : (float)(p_210310_0_.func_77988_m() - p_210310_2_.func_184605_cv()) / 20.0F; + } + }); + this.func_185043_a(new ResourceLocation("pulling"), (p_210309_0_, p_210309_1_, p_210309_2_) -> { +@@ -56,18 +56,23 @@ EntityPlayer entityplayer = (EntityPlayer)p_77615_3_; boolean flag = entityplayer.field_71075_bZ.field_75098_d || EnchantmentHelper.func_77506_a(Enchantments.field_185312_x, p_77615_1_) > 0; ItemStack itemstack = this.func_185060_a(entityplayer); @@ -22,7 +31,11 @@ if (!p_77615_2_.field_72995_K) { ItemArrow itemarrow = (ItemArrow)(itemstack.func_77973_b() instanceof ItemArrow ? itemstack.func_77973_b() : Items.field_151032_g); EntityArrow entityarrow = itemarrow.func_200887_a(p_77615_2_, itemstack, entityplayer); -@@ -130,6 +134,10 @@ ++ entityarrow = this.customizeArrow(entityarrow); + entityarrow.func_184547_a(entityplayer, entityplayer.field_70125_A, entityplayer.field_70177_z, 0.0F, f * 3.0F, 1.0F); + if (f == 1.0F) { + entityarrow.func_70243_d(true); +@@ -130,6 +135,10 @@ public ActionResult func_77659_a(World p_77659_1_, EntityPlayer p_77659_2_, EnumHand p_77659_3_) { ItemStack itemstack = p_77659_2_.func_184586_b(p_77659_3_); boolean flag = !this.func_185060_a(p_77659_2_).func_190926_b(); @@ -33,3 +46,12 @@ if (!p_77659_2_.field_71075_bZ.field_75098_d && !flag) { return flag ? new ActionResult<>(EnumActionResult.PASS, itemstack) : new ActionResult<>(EnumActionResult.FAIL, itemstack); } else { +@@ -141,4 +150,8 @@ + public int func_77619_b() { + return 1; + } ++ ++ public EntityArrow customizeArrow(EntityArrow arrow) { ++ return arrow; ++ } + } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 143510de8..049e18f27 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -18,6 +18,8 @@ public net.minecraft.block.BlockFire func_176534_d(Lnet/minecraft/block/Block;)I public net.minecraft.item.Item func_77656_e(I)Lnet.minecraft.item.Item; #setMaxDamage public net.minecraft.item.Item func_77627_a(Z)Lnet.minecraft.item.Item; #setHasSubtypes public net.minecraft.item.Item field_185051_m # properties +# ItemBow +protected net.minecraft.item.ItemBow func_185060_a(Lnet/minecraft/entity/player/EntityPlayer;)Lnet/minecraft/item/ItemStack; # findAmmo # Fluid public net.minecraft.fluid.Fluid func_180664_k()Lnet/minecraft/util/BlockRenderLayer; # getRenderLayer # Entity