diff --git a/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/FirstPersonSettings.java b/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/FirstPersonSettings.java index 78bf71fe..742a5a8a 100644 --- a/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/FirstPersonSettings.java +++ b/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/FirstPersonSettings.java @@ -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 autoVanillaHands = new HashSet<>(Arrays.asList("antiqueatlas:antique_atlas", "twilightforest:filled_magic_map", "twilightforest:filled_maze_map", "twilightforest:filled_ore_map", diff --git a/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/VanillaHands.java b/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/VanillaHands.java new file mode 100644 index 00000000..f431bfe4 --- /dev/null +++ b/FPVersionless/src/main/java/dev/tr7zw/firstperson/versionless/config/VanillaHands.java @@ -0,0 +1,5 @@ +package dev.tr7zw.firstperson.versionless.config; + +public enum VanillaHands { + OFF, ALL, ALL_DOUBLE, ITEMS; +} diff --git a/src/main/java/dev/tr7zw/firstperson/LogicHandler.java b/src/main/java/dev/tr7zw/firstperson/LogicHandler.java index 0bd9bbb3..f457421b 100644 --- a/src/main/java/dev/tr7zw/firstperson/LogicHandler.java +++ b/src/main/java/dev/tr7zw/firstperson/LogicHandler.java @@ -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; @@ -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; @@ -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()) { @@ -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); } diff --git a/src/main/java/dev/tr7zw/firstperson/config/ConfigScreenProvider.java b/src/main/java/dev/tr7zw/firstperson/config/ConfigScreenProvider.java index 942e35ab..c2839578 100644 --- a/src/main/java/dev/tr7zw/firstperson/config/ConfigScreenProvider.java +++ b/src/main/java/dev/tr7zw/firstperson/config/ConfigScreenProvider.java @@ -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 @@ -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 diff --git a/src/main/java/dev/tr7zw/firstperson/mixins/ArmorFeatureRendererMixin.java b/src/main/java/dev/tr7zw/firstperson/mixins/ArmorFeatureRendererMixin.java index 57fed7f6..d5fac7f0 100644 --- a/src/main/java/dev/tr7zw/firstperson/mixins/ArmorFeatureRendererMixin.java +++ b/src/main/java/dev/tr7zw/firstperson/mixins/ArmorFeatureRendererMixin.java @@ -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(); diff --git a/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemFeatureRendererMixin.java b/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemFeatureRendererMixin.java index 33a939ab..ed03c2e8 100644 --- a/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemFeatureRendererMixin.java +++ b/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemFeatureRendererMixin.java @@ -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(); + } } } diff --git a/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemRendererMixin.java b/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemRendererMixin.java index 9f0b6790..cfbf9075 100644 --- a/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemRendererMixin.java +++ b/src/main/java/dev/tr7zw/firstperson/mixins/HeldItemRendererMixin.java @@ -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; @@ -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; @@ -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(); + } + } } } diff --git a/src/main/java/dev/tr7zw/firstperson/mixins/LivingEntityRendererMixin.java b/src/main/java/dev/tr7zw/firstperson/mixins/LivingEntityRendererMixin.java index aaa7e146..4fe4db76 100644 --- a/src/main/java/dev/tr7zw/firstperson/mixins/LivingEntityRendererMixin.java +++ b/src/main/java/dev/tr7zw/firstperson/mixins/LivingEntityRendererMixin.java @@ -1,5 +1,8 @@ package dev.tr7zw.firstperson.mixins; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Items; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -14,6 +17,7 @@ import dev.tr7zw.firstperson.access.PlayerAccess; import dev.tr7zw.firstperson.access.PlayerModelAccess; import dev.tr7zw.firstperson.versionless.mixinbase.ModelPartBase; +import dev.tr7zw.util.NMSHelper; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.HeadedModel; import net.minecraft.client.model.HumanoidModel; @@ -48,11 +52,28 @@ public void renderPostAnim(LivingEntity livingEntity, float f, float g, PoseStac ((ModelPartBase) (Object) headed.getHead()).setHidden(); headShouldBeHidden = true; } - if (model instanceof HumanoidModel humanModel && livingEntity instanceof PlayerAccess playerAccess - && FirstPersonModelCore.instance.getLogicHandler().showVanillaHands( - playerAccess.getInventory().getSelected(), playerAccess.getInventory().offhand.get(0))) { - ((ModelPartBase) (Object) humanModel.leftArm).setHidden(); - ((ModelPartBase) (Object) humanModel.rightArm).setHidden(); + if (model instanceof HumanoidModel humanModel && livingEntity instanceof PlayerAccess playerAccess) { + if (FirstPersonModelCore.instance.getLogicHandler().hideArmsAndItems(livingEntity)) { + ((ModelPartBase) (Object) humanModel.leftArm).setHidden(); + ((ModelPartBase) (Object) humanModel.rightArm).setHidden(); + } else if (FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled()) {// TODO VANILLA HANDS + // ITEM + float offset = Mth.clamp(-NMSHelper.getXRot(Minecraft.getInstance().player) / 20 + 2, -0.0f, 0.7f); + humanModel.rightArm.xRot += offset; + humanModel.leftArm.xRot += offset; +// humanModel.rightArm.offsetRotation(new Vector3f(offset, 0, 0)); +// humanModel.leftArm.offsetRotation(new Vector3f(offset, 0, 0)); + + if (!FirstPersonModelCore.instance.getLogicHandler().lookingDown()) {// TODO DYNAMIC HAND + if (!playerAccess.getInventory().offhand.get(0).isEmpty() + || livingEntity.getMainHandItem().getItem().equals(Items.FILLED_MAP)) { + ((ModelPartBase) (Object) humanModel.leftArm).setHidden(); + } + if (!playerAccess.getInventory().getSelected().isEmpty()) { + ((ModelPartBase) (Object) humanModel.rightArm).setHidden(); + } + } + } } if (model instanceof VillagerHeadModel villaterHead) { villaterHead.hatVisible(false); @@ -60,11 +81,28 @@ public void renderPostAnim(LivingEntity livingEntity, float f, float g, PoseStac if (model instanceof PlayerModel playerModel) { headShouldBeHidden = true; ((ModelPartBase) (Object) playerModel.hat).setHidden(); - if (livingEntity instanceof PlayerAccess playerAccess - && FirstPersonModelCore.instance.getLogicHandler().showVanillaHands( - playerAccess.getInventory().getSelected(), playerAccess.getInventory().offhand.get(0))) { - ((ModelPartBase) (Object) playerModel.leftSleeve).setHidden(); - ((ModelPartBase) (Object) playerModel.rightSleeve).setHidden(); + if (livingEntity instanceof PlayerAccess playerAccess) { + if (FirstPersonModelCore.instance.getLogicHandler().hideArmsAndItems(livingEntity)) { + ((ModelPartBase) (Object) playerModel.leftSleeve).setHidden(); + ((ModelPartBase) (Object) playerModel.rightSleeve).setHidden(); + } else if (FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled()) {// TODO VANILLA HANDS + // ITEM + float offset = Mth.clamp(-NMSHelper.getXRot(Minecraft.getInstance().player) / 20 + 2, -0.0f, 0.7f); + playerModel.rightSleeve.xRot += offset; + playerModel.leftSleeve.xRot += offset; +// playerModel.rightSleeve.offsetRotation(new Vector3f(offset, 0, 0)); +// playerModel.leftSleeve.offsetRotation(new Vector3f(offset, 0, 0)); + + if (!FirstPersonModelCore.instance.getLogicHandler().lookingDown()) {// TODO DYNAMIC HAND + if (!playerAccess.getInventory().offhand.get(0).isEmpty() + || livingEntity.getMainHandItem().getItem().equals(Items.FILLED_MAP)) { + ((ModelPartBase) (Object) playerModel.leftSleeve).setHidden(); + } + if (!playerAccess.getInventory().getSelected().isEmpty()) { + ((ModelPartBase) (Object) playerModel.rightSleeve).setHidden(); + } + } + } } } if (livingEntity instanceof AbstractClientPlayer player && (Object) model instanceof PlayerModel playerModel @@ -93,10 +131,23 @@ public void renderReturn(LivingEntity livingEntity, float f, float g, PoseStack if (model instanceof HeadedModel headed) { ((ModelPartBase) (Object) headed.getHead()).showAgain(); } - if (model instanceof HumanoidModel humanModel - && FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()) { - ((ModelPartBase) (Object) humanModel.leftArm).showAgain(); - ((ModelPartBase) (Object) humanModel.rightArm).showAgain(); + if (model instanceof HumanoidModel humanModel) { + if (FirstPersonModelCore.instance.getLogicHandler().showVanillaHands() + && !FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()) { + ((ModelPartBase) (Object) humanModel.leftArm).showAgain(); + ((ModelPartBase) (Object) humanModel.rightArm).showAgain(); + } else if (FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled()) {// TODO VANILLA HANDS + // ITEM + if (!FirstPersonModelCore.instance.getLogicHandler().lookingDown()) {// TODO DYNAMIC HAND + ((ModelPartBase) (Object) humanModel.leftArm).showAgain(); + ((ModelPartBase) (Object) humanModel.rightArm).showAgain(); + } else { + if (!livingEntity.getOffhandItem().isEmpty()) + ((ModelPartBase) (Object) humanModel.leftArm).showAgain(); + if (!livingEntity.getMainHandItem().isEmpty()) + ((ModelPartBase) (Object) humanModel.rightArm).showAgain(); + } + } } if (model instanceof VillagerHeadModel villaterHead) { villaterHead.hatVisible(false); @@ -106,6 +157,15 @@ public void renderReturn(LivingEntity livingEntity, float f, float g, PoseStack if (FirstPersonModelCore.instance.getLogicHandler().showVanillaHands()) { ((ModelPartBase) (Object) playerModel.leftSleeve).showAgain(); ((ModelPartBase) (Object) playerModel.rightSleeve).showAgain(); + } else if (FirstPersonModelCore.instance.getLogicHandler().dynamicHandsEnabled()) {// TODO VANILLA HANDS + // ITEM + if (!livingEntity.getOffhandItem().isEmpty()) + ((ModelPartBase) (Object) playerModel.leftSleeve).showAgain(); + if (!livingEntity.getMainHandItem().isEmpty()) + ((ModelPartBase) (Object) playerModel.rightSleeve).showAgain(); + } else { + ((ModelPartBase) (Object) playerModel.leftSleeve).showAgain(); + ((ModelPartBase) (Object) playerModel.rightSleeve).showAgain(); } } if ((Object) model instanceof PlayerModel playerModel) { diff --git a/src/main/java/dev/tr7zw/firstperson/mixins/PlayerMixin.java b/src/main/java/dev/tr7zw/firstperson/mixins/PlayerMixin.java index e697365b..7c7358f7 100644 --- a/src/main/java/dev/tr7zw/firstperson/mixins/PlayerMixin.java +++ b/src/main/java/dev/tr7zw/firstperson/mixins/PlayerMixin.java @@ -30,7 +30,7 @@ public void getItemBySlot(EquipmentSlot slot, CallbackInfoReturnable return; } if ((slot == EquipmentSlot.MAINHAND || slot == EquipmentSlot.OFFHAND) && FirstPersonModelCore.instance - .getLogicHandler().showVanillaHands(this.inventory.getSelected(), this.inventory.offhand.get(0))) { + .getLogicHandler().hideArmsAndItems(this.inventory.getSelected(), this.inventory.offhand.get(0))) { ci.setReturnValue(ItemStack.EMPTY); return; } diff --git a/src/main/resources/assets/firstperson/lang/en_us.json b/src/main/resources/assets/firstperson/lang/en_us.json index f070ca09..bacc7c75 100644 --- a/src/main/resources/assets/firstperson/lang/en_us.json +++ b/src/main/resources/assets/firstperson/lang/en_us.json @@ -12,12 +12,14 @@ "text.firstperson.option.firstperson.sitXOffset.tooltip": "Moves the body relative to the camera back and forth while sitting", "text.firstperson.option.firstperson.renderStuckFeatures": "Render Arrows & Stings", "text.firstperson.option.firstperson.renderStuckFeatures.tooltip": "Shows arrows, bee stings or other modded features in first person", - "text.firstperson.option.firstperson.vanillaHands": "Vanilla Hands", - "text.firstperson.option.firstperson.vanillaHands.tooltip": "Shows the vanilla first person hands, but also the player model(but without arms)", - "text.firstperson.option.firstperson.doubleHands": "Double Hands", - "text.firstperson.option.firstperson.doubleHands.tooltip": "When using Vanilla hands it will always show both hands", - "text.firstperson.option.firstperson.forceActive": "Force Active", - "text.firstperson.option.firstperson.forceActive.tooltip": "Forces the FirstPerson Mod when other mods modify the rendering, but will cause visual issues(for example the players head is missing)", + "text.firstperson.option.firstperson.vanillaHandMode": "Vanilla Hands Mode", + "text.firstperson.option.firstperson.vanillaHandMode.OFF": "Off", + "text.firstperson.option.firstperson.vanillaHandMode.ALL": "Always", + "text.firstperson.option.firstperson.vanillaHandMode.ALL_DOUBLE": "Always Both Hands", + "text.firstperson.option.firstperson.vanillaHandMode.ITEMS": "Item In Hand", + "text.firstperson.option.firstperson.vanillaHandMode.tooltip": "Shows the vanilla first person hands", + "text.firstperson.option.firstperson.dynamicMode": "Dynamic Mode", + "text.firstperson.option.firstperson.dynamicMode.tooltip": "Changes the Vanilla Hands view based on the current view", "modmenu.summaryTranslation.firstperson": "Enables the third-person Model in first-person", "modmenu.descriptionTranslation.firstperson": "Enables the third-person Model in first-person" } diff --git a/src/main/resources/assets/firstperson/lang/ru_ru.json b/src/main/resources/assets/firstperson/lang/ru_ru.json index 0484aa59..08440149 100644 --- a/src/main/resources/assets/firstperson/lang/ru_ru.json +++ b/src/main/resources/assets/firstperson/lang/ru_ru.json @@ -16,6 +16,10 @@ "text.firstperson.option.firstperson.vanillaHands.tooltip": "Показывает ванильные руки от первого лица, а также модель игрока (но без рук)", "text.firstperson.option.firstperson.doubleHands": "Двойные руки", "text.firstperson.option.firstperson.doubleHands.tooltip": "При использовании ванильных рук всегда будут показаны обе руки", + "text.firstperson.option.firstperson.vanillaHandsItem": "Ванильные с предметом", + "text.firstperson.option.firstperson.vanillaHandsItem.tooltip": "Показывает ванильные руки от первого лица, если есть предмет", + "text.firstperson.option.firstperson.dynamicHands": "Динамические руки", + "text.firstperson.option.firstperson.dynamicHands.tooltip": "Динамическая смена рук при изменении угла обзора (нужны Ванильные с предметом)", "text.firstperson.option.firstperson.forceActive": "Принудительная активация", "text.firstperson.option.firstperson.forceActive.tooltip": "Принудительное использование мода в тех случаях, когда другие моды изменяют рендеринг, но при этом возникают визуальные проблемы (например, пропадает голова игрока)", "modmenu.summaryTranslation.firstperson": "Включает модель третьего лица в первом лице",