diff --git a/src/main/java/eu/midnightdust/swordblocking/SwordBlockingClient.java b/src/main/java/eu/midnightdust/swordblocking/SwordBlockingClient.java index 3736241..e59cb5b 100644 --- a/src/main/java/eu/midnightdust/swordblocking/SwordBlockingClient.java +++ b/src/main/java/eu/midnightdust/swordblocking/SwordBlockingClient.java @@ -31,7 +31,11 @@ public static boolean canEntityBlock(ItemStack mainHandStack, ItemStack offHandS // TODO/NOTE: I know this can be condensed more but i'm tired so will recheck later public static boolean canShieldSwordBlock(ItemStack mainHandStack, ItemStack offHandStack) { - if (SwordBlockingConfig.enabled && (offHandStack.getItem() instanceof ShieldItem || mainHandStack.getItem() instanceof ShieldItem)) { + if (!SwordBlockingConfig.enabled) return false; + boolean hasShield = offHandStack.getItem() instanceof ShieldItem || mainHandStack.getItem() instanceof ShieldItem; + if (!SwordBlockingConfig.requireShield) { + return mainHandStack.getItem().components().has(DataComponents.DAMAGE) || offHandStack.getItem().components().has(DataComponents.DAMAGE); + } else if (hasShield) { final Item weaponItem = offHandStack.getItem() instanceof ShieldItem ? mainHandStack.getItem() : offHandStack.getItem(); return weaponItem.components().has(DataComponents.DAMAGE); } else { diff --git a/src/main/java/eu/midnightdust/swordblocking/config/SwordBlockingConfig.java b/src/main/java/eu/midnightdust/swordblocking/config/SwordBlockingConfig.java index 8220914..f4b1f5f 100644 --- a/src/main/java/eu/midnightdust/swordblocking/config/SwordBlockingConfig.java +++ b/src/main/java/eu/midnightdust/swordblocking/config/SwordBlockingConfig.java @@ -23,4 +23,7 @@ public class SwordBlockingConfig extends MidnightConfig { @Entry public static boolean blockHitAnimation = false; + + @Entry + public static boolean requireShield = true; } diff --git a/src/main/java/eu/midnightdust/swordblocking/mixins/MixinHumanoidModel.java b/src/main/java/eu/midnightdust/swordblocking/mixins/MixinHumanoidModel.java index 4cdd53a..ed22e8a 100644 --- a/src/main/java/eu/midnightdust/swordblocking/mixins/MixinHumanoidModel.java +++ b/src/main/java/eu/midnightdust/swordblocking/mixins/MixinHumanoidModel.java @@ -5,6 +5,7 @@ import eu.midnightdust.swordblocking.ducks.ArmedItemStackData; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.entity.state.HumanoidRenderState; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; @@ -29,7 +30,14 @@ public abstract class MixinHumanoidModel { final ItemStack offHandStack = armedItemStackData.swordblocking$getOffHandItem(); final ItemStack mainHandStack = armedItemStackData.swordblocking$getMainHandItem(); if (renderState.isUsingItem && SwordBlockingClient.canEntityBlock(mainHandStack, offHandStack)) { - if (offHandStack.getItem() instanceof ShieldItem) { + if (SwordBlockingConfig.requireShield) { + if (mainHandStack.getItem().components().has(DataComponents.DAMAGE)) { + this.poseRightArm(renderState, HumanoidModel.ArmPose.BLOCK); + } + if (offHandStack.getItem().components().has(DataComponents.DAMAGE)) { + this.poseRightArm(renderState, HumanoidModel.ArmPose.BLOCK); + } + } else if (offHandStack.getItem() instanceof ShieldItem) { this.poseRightArm(renderState, HumanoidModel.ArmPose.BLOCK); } else { this.poseLeftArm(renderState, HumanoidModel.ArmPose.BLOCK); diff --git a/src/main/java/eu/midnightdust/swordblocking/mixins/MixinPlayerRenderer.java b/src/main/java/eu/midnightdust/swordblocking/mixins/MixinPlayerRenderer.java index 21cc593..7554abb 100644 --- a/src/main/java/eu/midnightdust/swordblocking/mixins/MixinPlayerRenderer.java +++ b/src/main/java/eu/midnightdust/swordblocking/mixins/MixinPlayerRenderer.java @@ -3,6 +3,7 @@ import eu.midnightdust.swordblocking.SwordBlockingClient; import eu.midnightdust.swordblocking.config.SwordBlockingConfig; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; @@ -60,7 +61,9 @@ public abstract class MixinPlayerRenderer { return; } - if (offStack.getItem() instanceof ShieldItem && SwordBlockingClient.canEntityBlock(player.getMainHandItem(), player.getOffhandItem())) { + if (!SwordBlockingConfig.requireShield && handStack.getItem().components().has(DataComponents.DAMAGE)) { + cir.setReturnValue(HumanoidModel.ArmPose.BLOCK); + } else if (offStack.getItem() instanceof ShieldItem && SwordBlockingClient.canEntityBlock(player.getMainHandItem(), player.getOffhandItem())) { cir.setReturnValue(HumanoidModel.ArmPose.BLOCK); } else if (handStack.getItem() instanceof ShieldItem && SwordBlockingConfig.hideShield && (cir.getReturnValue() == HumanoidModel.ArmPose.ITEM || cir.getReturnValue() == HumanoidModel.ArmPose.BLOCK)) { cir.setReturnValue(HumanoidModel.ArmPose.EMPTY); diff --git a/src/main/resources/assets/swordblocking/lang/en_us.json b/src/main/resources/assets/swordblocking/lang/en_us.json index 44df83b..3dbbd56 100644 --- a/src/main/resources/assets/swordblocking/lang/en_us.json +++ b/src/main/resources/assets/swordblocking/lang/en_us.json @@ -7,5 +7,7 @@ "swordblocking.midnightconfig.hideOffhandSlot.tooltip": "Hides the offhand slot when a shield is in the offhand.", "swordblocking.midnightconfig.disableUseEquipAnimation": "Remove the equip animation when blocking.", "swordblocking.midnightconfig.lockBlockingArmPosition": "Disable arm moving when blocking.", - "swordblocking.midnightconfig.blockHitAnimation": "Enable block hitting animation." + "swordblocking.midnightconfig.blockHitAnimation": "Enable block hitting animation.", + "swordblocking.midnightconfig.requireShield": "Require Shield", + "swordblocking.midnightconfig.requireShield.tooltip": "Require a shield in the offhand or mainhand slot to block." } \ No newline at end of file diff --git a/src/main/resources/assets/swordblocking/lang/ru_ru.json b/src/main/resources/assets/swordblocking/lang/ru_ru.json index 2ad1c78..7488e8a 100644 --- a/src/main/resources/assets/swordblocking/lang/ru_ru.json +++ b/src/main/resources/assets/swordblocking/lang/ru_ru.json @@ -7,5 +7,7 @@ "swordblocking.midnightconfig.hideOffhandSlot.tooltip": "Скрывает слот второй руки, если в ней находится щит.", "swordblocking.midnightconfig.disableUseEquipAnimation": "Удалять анимацию оснащения при блокировании.", "swordblocking.midnightconfig.lockBlockingArmPosition": "Отключить движение руки при блокировании.", - "swordblocking.midnightconfig.blockHitAnimation": "Включить анимацию удара по блоку." + "swordblocking.midnightconfig.blockHitAnimation": "Включить анимацию удара по блоку.", + "swordblocking.midnightconfig.requireShield": "", + "swordblocking.midnightconfig.requireShield.tooltip": "" } \ No newline at end of file