diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RenderPlayer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/RenderPlayer.java.patch index b9d0d59fe..f901cb6f4 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/RenderPlayer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RenderPlayer.java.patch @@ -16,15 +16,31 @@ } private void setModelVisibilities(AbstractClientPlayer clientPlayer) -@@ -127,6 +129,11 @@ - if (enumaction1 == EnumAction.BLOCK) +@@ -128,6 +130,11 @@ { modelbiped$armpose1 = ModelBiped.ArmPose.BLOCK; -+ } + } + // FORGE: fix MC-88356 allow offhand to use bow and arrow animation + else if (enumaction1 == EnumAction.BOW) + { + modelbiped$armpose1 = ModelBiped.ArmPose.BOW_AND_ARROW; - } ++ } } } + +@@ -183,6 +190,7 @@ + + public void renderRightArm(AbstractClientPlayer clientPlayer) + { ++ if (net.minecraftforge.client.ForgeHooksClient.renderSpecificFirstPersonArm(this, clientPlayer, EnumHandSide.RIGHT)) return; + float f = 1.0F; + GlStateManager.color(1.0F, 1.0F, 1.0F); + float f1 = 0.0625F; +@@ -201,6 +209,7 @@ + + public void renderLeftArm(AbstractClientPlayer clientPlayer) + { ++ if (net.minecraftforge.client.ForgeHooksClient.renderSpecificFirstPersonArm(this, clientPlayer, EnumHandSide.LEFT)) return; + float f = 1.0F; + GlStateManager.color(1.0F, 1.0F, 1.0F); + float f1 = 0.0625F; diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index c57f8c243..fda2ace6d 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -43,6 +43,7 @@ import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.SoundHandler; import net.minecraft.client.audio.SoundManager; +import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.gui.BossInfoClient; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiMainMenu; @@ -68,6 +69,7 @@ import net.minecraft.client.renderer.block.model.SimpleBakedModel; import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.client.renderer.color.ItemColors; +import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.texture.TextureMap; @@ -94,6 +96,7 @@ import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumHandSide; import net.minecraft.util.MovementInput; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -111,6 +114,7 @@ import net.minecraftforge.client.event.InputUpdateEvent; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.MouseEvent; +import net.minecraftforge.client.event.RenderArmEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderSpecificHandEvent; @@ -193,6 +197,11 @@ public static boolean renderSpecificFirstPersonHand(EnumHand hand, float partial return MinecraftForge.EVENT_BUS.post(new RenderSpecificHandEvent(hand, partialTicks, interpPitch, swingProgress, equipProgress, stack)); } + public static boolean renderSpecificFirstPersonArm(RenderPlayer renderer, AbstractClientPlayer player, EnumHandSide arm) + { + return MinecraftForge.EVENT_BUS.post(new RenderArmEvent(renderer, player, arm)); + } + public static void onTextureStitchedPre(TextureMap map) { MinecraftForge.EVENT_BUS.post(new TextureStitchEvent.Pre(map)); diff --git a/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java b/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java new file mode 100644 index 000000000..d0fbe26a0 --- /dev/null +++ b/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java @@ -0,0 +1,71 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2021. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.client.event; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.util.EnumHandSide; +import net.minecraftforge.fml.common.eventhandler.Cancelable; +import net.minecraftforge.fml.common.eventhandler.Event; + +/** + * This is a more targeted version of {@link RenderHandEvent} event that is fired specifically when + * a player's arm is being rendered in first person, and should be used instead if the desired + * outcome is just to replace the rendering of the arm, such as to make armor render on it or + * instead of it. + * + * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS} + * Canceling the event causes the arm to not render. + */ +@Cancelable +public class RenderArmEvent extends Event +{ + private final RenderPlayer renderer; + private final AbstractClientPlayer player; + private final EnumHandSide arm; + + public RenderArmEvent(RenderPlayer renderer, AbstractClientPlayer player, EnumHandSide arm) + { + this.renderer = renderer; + this.player = player; + this.arm = arm; + } + + /** + * @return The arm being rendered. + */ + public EnumHandSide getArm() + { + return arm; + } + + public RenderPlayer getRenderer() + { + return renderer; + } + + /** + * @return the client player that is having their arm rendered. In general this will be the same as {@link net.minecraft.client.Minecraft#player}. + */ + public AbstractClientPlayer getPlayer() + { + return player; + } +}