Skip to content

Commit

Permalink
Extract offhand rendering to a hook class for Angelica (#63)
Browse files Browse the repository at this point in the history
  • Loading branch information
Caedis authored Feb 3, 2025
1 parent b4849d7 commit 8dea8d0
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 33 deletions.
54 changes: 54 additions & 0 deletions src/main/java/xonin/backhand/client/hooks/ItemRendererHooks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package xonin.backhand.client.hooks;

import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;

import org.lwjgl.opengl.GL11;

import xonin.backhand.api.core.BackhandUtils;
import xonin.backhand.api.core.IBackhandPlayer;
import xonin.backhand.client.utils.BackhandRenderHelper;
import xonin.backhand.utils.BackhandConfig;
import xonin.backhand.utils.BackhandConfigClient;

public class ItemRendererHooks {

/**
* Extracted outside the mixin to be used in Angelica for Backhand compat
*
* @param frame
*/
public static void renderOffhandReturn(float frame) {
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
if (BackhandUtils.isUsingOffhand(player)) return;

ItemStack mainhandItem = player.getCurrentEquippedItem();
ItemStack offhandItem = BackhandUtils.getOffhandItem(player);
if (!BackhandConfig.EmptyOffhand && !BackhandConfigClient.RenderEmptyOffhandAtRest && offhandItem == null) {
return;
}
if (offhandItem == null && !BackhandConfigClient.RenderEmptyOffhandAtRest
&& ((IBackhandPlayer) player).getOffSwingProgress(frame) == 0) {
return;
}
if (mainhandItem != null && mainhandItem.getItem() instanceof ItemMap) {
return;
}

BackhandRenderHelper.firstPersonFrame = frame;
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glCullFace(GL11.GL_FRONT);
GL11.glPushMatrix();
GL11.glScalef(-1, 1, 1);
float f3 = player.prevRenderArmPitch + (player.renderArmPitch - player.prevRenderArmPitch) * frame;
float f4 = player.prevRenderArmYaw + (player.renderArmYaw - player.prevRenderArmYaw) * frame;
GL11.glRotatef((player.rotationPitch - f3) * -0.1F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef((player.rotationYaw - f4) * -0.1F, 0.0F, 1.0F, 0.0F);
BackhandUtils
.useOffhandItem(player, false, () -> BackhandRenderHelper.itemRenderer.renderItemInFirstPerson(frame));
GL11.glPopMatrix();
GL11.glCullFace(GL11.GL_BACK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;

import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
Expand All @@ -17,44 +15,15 @@

import xonin.backhand.api.core.BackhandUtils;
import xonin.backhand.api.core.IBackhandPlayer;
import xonin.backhand.client.utils.BackhandRenderHelper;
import xonin.backhand.utils.BackhandConfig;
import xonin.backhand.client.hooks.ItemRendererHooks;
import xonin.backhand.utils.BackhandConfigClient;

@Mixin(ItemRenderer.class)
public abstract class MixinItemRenderer {

@Inject(method = "renderItemInFirstPerson", at = @At("RETURN"))
private void backhand$renderItemInFirstPerson(float frame, CallbackInfo ci) {
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
if (BackhandUtils.isUsingOffhand(player)) return;

ItemStack mainhandItem = player.getCurrentEquippedItem();
ItemStack offhandItem = BackhandUtils.getOffhandItem(player);
if (!BackhandConfig.EmptyOffhand && !BackhandConfigClient.RenderEmptyOffhandAtRest && offhandItem == null) {
return;
}
if (offhandItem == null && !BackhandConfigClient.RenderEmptyOffhandAtRest
&& ((IBackhandPlayer) player).getOffSwingProgress(frame) == 0) {
return;
}
if (mainhandItem != null && mainhandItem.getItem() instanceof ItemMap) {
return;
}

BackhandRenderHelper.firstPersonFrame = frame;
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glCullFace(GL11.GL_FRONT);
GL11.glPushMatrix();
GL11.glScalef(-1, 1, 1);
float f3 = player.prevRenderArmPitch + (player.renderArmPitch - player.prevRenderArmPitch) * frame;
float f4 = player.prevRenderArmYaw + (player.renderArmYaw - player.prevRenderArmYaw) * frame;
GL11.glRotatef((player.rotationPitch - f3) * -0.1F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef((player.rotationYaw - f4) * -0.1F, 0.0F, 1.0F, 0.0F);
BackhandUtils
.useOffhandItem(player, false, () -> BackhandRenderHelper.itemRenderer.renderItemInFirstPerson(frame));
GL11.glPopMatrix();
GL11.glCullFace(GL11.GL_BACK);
ItemRendererHooks.renderOffhandReturn(frame);
}

@ModifyExpressionValue(
Expand Down

0 comments on commit 8dea8d0

Please sign in to comment.