Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vanilla hands rework #449

Merged
merged 18 commits into from
May 18, 2024
Merged
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
Loading