Skip to content

Commit

Permalink
Merge pull request #449 from tr7zw/vanillaHandsRework
Browse files Browse the repository at this point in the history
Vanilla hands rework
  • Loading branch information
tr7zw authored May 18, 2024
2 parents 1760a72 + b389d5d commit c9e7336
Show file tree
Hide file tree
Showing 11 changed files with 267 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ public class FirstPersonSettings {
public int sitXOffset = 0;

public boolean renderStuckFeatures = true;
public boolean vanillaHands = false;
public boolean doubleHands = false;
public VanillaHands vanillaHandsMode = VanillaHands.OFF;
public boolean dynamicMode = true;

public Set<String> autoVanillaHands = new HashSet<>(Arrays.asList("antiqueatlas:antique_atlas",
"twilightforest:filled_magic_map", "twilightforest:filled_maze_map", "twilightforest:filled_ore_map",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package dev.tr7zw.firstperson.versionless.config;

public enum VanillaHands {
OFF, ALL, ALL_DOUBLE, ITEMS;
}
102 changes: 97 additions & 5 deletions src/main/java/dev/tr7zw/firstperson/LogicHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import java.util.HashSet;
import java.util.Set;

import dev.tr7zw.firstperson.access.PlayerAccess;
import dev.tr7zw.firstperson.api.ActivationHandler;
import dev.tr7zw.firstperson.api.FirstPersonAPI;
import dev.tr7zw.firstperson.versionless.Constants;
import dev.tr7zw.firstperson.versionless.FirstPersonBase;
import dev.tr7zw.firstperson.versionless.config.VanillaHands;
import dev.tr7zw.util.NMSHelper;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -56,6 +58,12 @@ void registerDefaultHandlers() {
});
}

/**
* Checks rather the mod should render at all.
*
* @param thirdPerson
* @return
*/
public boolean shouldApplyThirdPerson(boolean thirdPerson) {
if (!fpm.isEnabled() || thirdPerson) {
return false;
Expand All @@ -68,6 +76,13 @@ public boolean shouldApplyThirdPerson(boolean thirdPerson) {
return true;
}

/**
* Calculates the X/Z offset applied to the player model to get it relative to
* the vanilla camera position
*
* @param entity
* @param defValue
*/
public void updatePositionOffset(Entity entity, Vec3 defValue) {
// handle sleeping
if (entity == client.getCameraEntity() && client.player.isSleeping()) {
Expand Down Expand Up @@ -147,18 +162,95 @@ public boolean isCrawlingOrSwimming(Player player) {
}

public boolean showVanillaHands() {
return fpm.getConfig().vanillaHands || autoVanillaHandItems.contains(client.player.getMainHandItem().getItem())
|| autoVanillaHandItems.contains(client.player.getOffhandItem().getItem())
|| autoDisableItems.contains(client.player.getMainHandItem().getItem())
|| autoDisableItems.contains(client.player.getOffhandItem().getItem());
return showVanillaHands(client.player);
}

public boolean showVanillaHands(LivingEntity livingEntity) {
if (livingEntity instanceof PlayerAccess playerAccess) {
return showVanillaHands(playerAccess.getInventory().getSelected(),
playerAccess.getInventory().offhand.get(0));
}
return false;
}

/**
* Don't skip the vanilla first person arm rendering
*
* @param mainhand
* @param offhand
* @return
*/
public boolean showVanillaHands(ItemStack mainhand, ItemStack offhand) {
return fpm.getConfig().vanillaHands || autoVanillaHandItems.contains(mainhand.getItem())
return fpm.getConfig().vanillaHandsMode == VanillaHands.ALL
|| fpm.getConfig().vanillaHandsMode == VanillaHands.ALL_DOUBLE
|| (fpm.getConfig().vanillaHandsMode == VanillaHands.ITEMS
&& (!mainhand.isEmpty() || !offhand.isEmpty()))
|| autoVanillaHandItems.contains(mainhand.getItem()) || autoVanillaHandItems.contains(offhand.getItem())
|| autoDisableItems.contains(mainhand.getItem()) || autoDisableItems.contains(offhand.getItem());
}

public boolean hideArmsAndItems() {
return hideArmsAndItems(client.player);
}

public boolean hideArmsAndItems(LivingEntity livingEntity) {
if (livingEntity instanceof PlayerAccess playerAccess) {
return hideArmsAndItems(playerAccess.getInventory().getSelected(),
playerAccess.getInventory().offhand.get(0));
}
return false;
}

/**
* Should the models arms and items not be rendered?
*
* @param mainhand
* @param offhand
* @return
*/
public boolean hideArmsAndItems(ItemStack mainhand, ItemStack offhand) {
if (lookingDown()) {
return false;
}
return fpm.getConfig().vanillaHandsMode != VanillaHands.OFF || autoVanillaHandItems.contains(mainhand.getItem())
|| autoVanillaHandItems.contains(offhand.getItem()) || autoDisableItems.contains(mainhand.getItem())
|| autoDisableItems.contains(offhand.getItem());
}

public boolean dynamicHandsEnabled() {
return dynamicHandsEnabled(client.player);
}

public boolean dynamicHandsEnabled(LivingEntity livingEntity) {
if (livingEntity instanceof PlayerAccess playerAccess) {
return dynamicHandsEnabled(playerAccess.getInventory().getSelected(),
playerAccess.getInventory().offhand.get(0));
}
return false;
}

/**
* True is dynamic hands is enabled and could apply at this moment
*
* @param mainhand
* @param offhand
* @return
*/
public boolean dynamicHandsEnabled(ItemStack mainhand, ItemStack offhand) {
return fpm.getConfig().dynamicMode && !(autoVanillaHandItems.contains(mainhand.getItem())
|| autoVanillaHandItems.contains(offhand.getItem()) || autoDisableItems.contains(mainhand.getItem())
|| autoDisableItems.contains(offhand.getItem()));
}

/**
* Is Dynamic hands enabled and the player looking down?
*
* @return
*/
public boolean lookingDown() {
return dynamicHandsEnabled() && NMSHelper.getXRot(Minecraft.getInstance().player) > 30;
}

public void addAutoVanillaHandsItem(Item item) {
autoVanillaHandItems.add(item);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import dev.tr7zw.config.CustomConfigScreen;
import dev.tr7zw.firstperson.FirstPersonModelCore;
import dev.tr7zw.firstperson.versionless.config.VanillaHands;
import lombok.experimental.UtilityClass;
//spotless:off
//#if MC >= 11900
Expand Down Expand Up @@ -36,10 +37,10 @@ public void initialize() {
() -> fpm.getConfig().sitXOffset, i -> fpm.getConfig().sitXOffset = i));
options.add(getOnOffOption("text.firstperson.option.firstperson.renderStuckFeatures",
() -> fpm.getConfig().renderStuckFeatures, b -> fpm.getConfig().renderStuckFeatures = b));
options.add(getOnOffOption("text.firstperson.option.firstperson.vanillaHands",
() -> fpm.getConfig().vanillaHands, b -> fpm.getConfig().vanillaHands = b));
options.add(getOnOffOption("text.firstperson.option.firstperson.doubleHands",
() -> fpm.getConfig().doubleHands, b -> fpm.getConfig().doubleHands = b));
options.add(getEnumOption("text.firstperson.option.firstperson.vanillaHandMode", VanillaHands.class,
() -> fpm.getConfig().vanillaHandsMode, b -> fpm.getConfig().vanillaHandsMode = b));
options.add(getOnOffOption("text.firstperson.option.firstperson.dynamicMode",
() -> fpm.getConfig().dynamicMode, b -> fpm.getConfig().dynamicMode = b));

// spotless:off
//#if MC >= 11900
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,19 @@ private void renderArmor(PoseStack matrices, MultiBufferSource vertexConsumers,
&& FirstPersonModelCore.instance.getLogicHandler().isSwimming(player)) {
info.cancel();
}
if (equipmentSlot == EquipmentSlot.CHEST && FirstPersonModelCore.instance.isRenderingPlayer()
&& FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()) {
((ModelPartBase) (Object) bipedEntityModel.leftArm).setHidden();
((ModelPartBase) (Object) bipedEntityModel.rightArm).setHidden();
if (equipmentSlot == EquipmentSlot.CHEST && FirstPersonModelCore.instance.isRenderingPlayer()) {
if (FirstPersonModelCore.instance.getLogicHandler().hideArmsAndItems()) {
((ModelPartBase) (Object) bipedEntityModel.leftArm).setHidden();
((ModelPartBase) (Object) bipedEntityModel.rightArm).setHidden();
} else if (FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled()) {// TODO DYNAMIC HAND
if (!livingEntity.getOffhandItem().isEmpty())
((ModelPartBase) (Object) bipedEntityModel.leftArm).setHidden();
if (!livingEntity.getMainHandItem().isEmpty())
((ModelPartBase) (Object) bipedEntityModel.rightArm).setHidden();
} else {
((ModelPartBase) (Object) bipedEntityModel.leftArm).showAgain();
((ModelPartBase) (Object) bipedEntityModel.rightArm).showAgain();
}
} else {
((ModelPartBase) (Object) bipedEntityModel.leftArm).showAgain();
((ModelPartBase) (Object) bipedEntityModel.rightArm).showAgain();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,11 @@ private void renderArmWithItem(LivingEntity livingEntity, ItemStack itemStack, I
//$$ HumanoidArm humanoidArm, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci) {
//#endif
//spotless:on
if (livingEntity instanceof LocalPlayer && FirstPersonModelCore.instance.isRenderingPlayer()
&& FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()) {
ci.cancel();
if (livingEntity instanceof LocalPlayer && FirstPersonModelCore.instance.isRenderingPlayer()) {
if (FirstPersonModelCore.instance.getLogicHandler().hideArmsAndItems(livingEntity)
&& !FirstPersonModelCore.instance.getLogicHandler().lookingDown()) {
ci.cancel();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
import com.mojang.blaze3d.vertex.PoseStack;

import dev.tr7zw.firstperson.FirstPersonModelCore;
import dev.tr7zw.firstperson.versionless.config.VanillaHands;
import dev.tr7zw.util.NMSHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.ItemInHandRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
Expand All @@ -27,22 +31,41 @@ public abstract class HeldItemRendererMixin {

@Shadow
private EntityRenderDispatcher entityRenderDispatcher;
@Shadow
private float mainHandHeight;
@Shadow
private float offHandHeight;
@Shadow
private ItemStack mainHandItem;
@Shadow
private ItemStack offHandItem;

@Inject(at = @At("HEAD"), method = "renderArmWithItem", cancellable = true)
public void renderFirstPersonItem(AbstractClientPlayer player, float tickDelta, float pitch, InteractionHand hand,
float swingProgress, ItemStack item, float equipProgress, PoseStack matrices,
MultiBufferSource vertexConsumers, int light, CallbackInfo info) {
if (!skip()) {

if (!FirstPersonModelCore.instance.isEnabled()) {
return;
}
if (!FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()) {
info.cancel();
return;
}
// filter out vanilla hands with no item
if (FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled() && pitch > 35) {
// item held too low, hide
info.cancel();
return;
}
if (!FirstPersonModelCore.instance.getConfig().doubleHands
// double hands
if (FirstPersonModelCore.instance.getConfig().vanillaHandsMode != VanillaHands.ALL_DOUBLE
|| player.getMainHandItem().getItem() == Items.FILLED_MAP
// spotless:off
//#if MC >= 11700
//#if MC >= 11700
|| player.isScoping()) {
//#else
//$$|| false) {
//$$|| false) {
//#endif
//spotless:on
return;
Expand All @@ -60,9 +83,32 @@ public void renderFirstPersonItem(AbstractClientPlayer player, float tickDelta,
public abstract void renderPlayerArm(PoseStack matrices, MultiBufferSource vertexConsumers, int light,
float equipProgress, float swingProgress, HumanoidArm arm);

public boolean skip() {
return !FirstPersonModelCore.instance.isEnabled()
|| FirstPersonModelCore.instance.getLogicHandler().showVanillaHands();
/*
* public boolean skip() {//TODO NO NEED? return
* !FirstPersonModelCore.instance.isEnabled() ||
* FirstPersonModelCore.instance.getLogicHandler().showVanillaHands(); }
*/

@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;getAttackStrengthScale(F)F", shift = At.Shift.BEFORE), method = "tick", cancellable = true)
public void tick(CallbackInfo ci) {// TODO DYNAMIC HAND
if (FirstPersonModelCore.instance.isEnabled()
&& FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()
&& FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled()) {
LocalPlayer localPlayer = Minecraft.getInstance().player;
float f = NMSHelper.getXRot(localPlayer);
if (f > 15) {
if (f < 30) {
this.mainHandHeight = 15 / f;
this.offHandHeight = 15 / f;
} else {
this.mainHandHeight -= this.mainHandHeight > -0.1f ? 0.15f : 0;
this.offHandHeight -= this.offHandHeight > -0.1f ? 0.15f : 0;
}
ci.cancel();
this.mainHandItem = localPlayer.getMainHandItem();
this.offHandItem = localPlayer.getOffhandItem();
}
}
}

}
Loading

0 comments on commit c9e7336

Please sign in to comment.