mirror of
https://github.com/TeamMidnightDust/SwordBlocking.git
synced 2025-12-16 14:55:09 +01:00
Architectury port
because why not
This commit is contained in:
@@ -1,36 +0,0 @@
|
||||
package eu.midnightdust.swordblocking;
|
||||
|
||||
import eu.midnightdust.swordblocking.config.SwordBlockingConfig;
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
import net.minecraft.component.DataComponentTypes;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.item.AxeItem;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.MaceItem;
|
||||
import net.minecraft.item.ShieldItem;
|
||||
import net.minecraft.item.SwordItem;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class SwordBlockingClient implements ClientModInitializer {
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
SwordBlockingConfig.init("swordblocking", SwordBlockingConfig.class);
|
||||
}
|
||||
|
||||
public static boolean isWeaponBlocking(LivingEntity entity) {
|
||||
return entity.isUsingItem() && (canWeaponBlock(entity) || isBlockingOnViaVersion(entity));
|
||||
}
|
||||
|
||||
public static boolean canWeaponBlock(LivingEntity entity) {
|
||||
if (SwordBlockingConfig.enabled && (entity.getOffHandStack().getItem() instanceof ShieldItem || entity.getMainHandStack().getItem() instanceof ShieldItem)) {
|
||||
Item weaponItem = entity.getOffHandStack().getItem() instanceof ShieldItem ? entity.getMainHandStack().getItem() : entity.getOffHandStack().getItem();
|
||||
return weaponItem instanceof SwordItem || weaponItem instanceof AxeItem || weaponItem instanceof MaceItem;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public static boolean isBlockingOnViaVersion(LivingEntity entity) {
|
||||
Item item = entity.getMainHandStack().getItem() instanceof SwordItem ? entity.getMainHandStack().getItem() : entity.getOffHandStack().getItem();
|
||||
return item instanceof SwordItem && item.getComponents() != null && item.getComponents().contains(DataComponentTypes.FOOD) && Objects.requireNonNull(item.getComponents().get(DataComponentTypes.FOOD)).eatSeconds() == 3600;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package eu.midnightdust.swordblocking.config;
|
||||
|
||||
import eu.midnightdust.lib.config.MidnightConfig;
|
||||
|
||||
public class SwordBlockingConfig extends MidnightConfig {
|
||||
@Entry public static boolean enabled = true;
|
||||
@Entry public static boolean hideShield = true;
|
||||
@Entry public static boolean alwaysHideShield = true;
|
||||
@Entry public static boolean hideOffhandSlot = false;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
package eu.midnightdust.swordblocking.mixin;
|
||||
|
||||
import eu.midnightdust.swordblocking.SwordBlockingClient;
|
||||
import net.minecraft.client.render.entity.model.BipedEntityModel;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.item.ShieldItem;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.*;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(BipedEntityModel.class)
|
||||
public abstract class MixinBipedEntityModel<T extends LivingEntity> {
|
||||
@Shadow protected abstract void positionRightArm(T entity);
|
||||
|
||||
@Shadow protected abstract void positionLeftArm(T entity);
|
||||
|
||||
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BipedEntityModel;animateArms(Lnet/minecraft/entity/LivingEntity;F)V", shift = At.Shift.BEFORE), method = "setAngles(Lnet/minecraft/entity/LivingEntity;FFFFF)V")
|
||||
private void swordblocking$setBlockingAngles(T livingEntity, float f, float g, float h, float i, float j, CallbackInfo ci) {
|
||||
if (!SwordBlockingClient.isWeaponBlocking(livingEntity))
|
||||
return;
|
||||
if (livingEntity.getOffHandStack().getItem() instanceof ShieldItem)
|
||||
this.positionRightArm(livingEntity);
|
||||
else
|
||||
this.positionLeftArm(livingEntity);
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package eu.midnightdust.swordblocking.mixin;
|
||||
|
||||
import eu.midnightdust.swordblocking.SwordBlockingClient;
|
||||
import eu.midnightdust.swordblocking.config.SwordBlockingConfig;
|
||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||
import net.minecraft.client.render.VertexConsumerProvider;
|
||||
import net.minecraft.client.render.item.HeldItemRenderer;
|
||||
import net.minecraft.client.render.model.json.ModelTransformationMode;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ShieldItem;
|
||||
import net.minecraft.util.Arm;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.RotationAxis;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(HeldItemRenderer.class)
|
||||
public abstract class MixinHeldItemRenderer {
|
||||
@Inject(at = @At("HEAD"), cancellable = true, method = "renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V")
|
||||
public void swordblocking$hideShield(LivingEntity entity, ItemStack stack, ModelTransformationMode renderMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) {
|
||||
if ((SwordBlockingConfig.alwaysHideShield && SwordBlockingConfig.hideShield && stack.getItem() instanceof ShieldItem) || (SwordBlockingConfig.hideShield && stack.getItem() instanceof ShieldItem && SwordBlockingClient.canWeaponBlock(entity)))
|
||||
ci.cancel();
|
||||
}
|
||||
|
||||
@Inject(method = "renderFirstPersonItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", shift = At.Shift.BEFORE, ordinal = 1))
|
||||
public void swordblocking$blockingPosition(AbstractClientPlayerEntity player, float tickDelta, float pitch, Hand hand, float swingProgress, ItemStack item, float equipProgress, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) {
|
||||
if (!SwordBlockingClient.isWeaponBlocking(player) || item.getItem() instanceof ShieldItem)
|
||||
return;
|
||||
boolean bl = hand == Hand.MAIN_HAND;
|
||||
Arm arm = bl ? player.getMainArm() : player.getMainArm().getOpposite();
|
||||
int k = arm == Arm.RIGHT ? 1 : -1;
|
||||
matrices.translate(k * -0.14142136F, 0.08F, 0.14142136F);
|
||||
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-102.25F));
|
||||
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(k * 13.365F));
|
||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(k * 78.05F));
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package eu.midnightdust.swordblocking.mixin;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import eu.midnightdust.swordblocking.config.SwordBlockingConfig;
|
||||
import net.minecraft.client.gui.hud.InGameHud;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ShieldItem;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
||||
@Mixin(InGameHud.class)
|
||||
public abstract class MixinInGameHud {
|
||||
@ModifyExpressionValue(at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getOffHandStack()Lnet/minecraft/item/ItemStack;"), method = "renderHotbar")
|
||||
public ItemStack swordblocking$hideOffHandSlot(ItemStack original) {
|
||||
return (SwordBlockingConfig.enabled && SwordBlockingConfig.hideOffhandSlot && original.getItem() instanceof ShieldItem) ? ItemStack.EMPTY : original;
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
package eu.midnightdust.swordblocking.mixin;
|
||||
|
||||
import eu.midnightdust.swordblocking.SwordBlockingClient;
|
||||
import eu.midnightdust.swordblocking.config.SwordBlockingConfig;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||
import net.minecraft.client.render.entity.PlayerEntityRenderer;
|
||||
import net.minecraft.client.render.entity.model.BipedEntityModel;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ShieldItem;
|
||||
import net.minecraft.util.Hand;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(PlayerEntityRenderer.class)
|
||||
public abstract class MixinPlayerEntityRenderer {
|
||||
@Inject(at = @At(value = "RETURN"), method = "getArmPose", cancellable = true)
|
||||
@Environment(EnvType.CLIENT)
|
||||
private static void swordblocking$getArmPose(AbstractClientPlayerEntity player, Hand hand, CallbackInfoReturnable<BipedEntityModel.ArmPose> cir) {
|
||||
if (!SwordBlockingConfig.enabled) return;
|
||||
|
||||
ItemStack handStack = player.getStackInHand(hand);
|
||||
ItemStack offStack = player.getStackInHand(hand.equals(Hand.MAIN_HAND) ? Hand.OFF_HAND : Hand.MAIN_HAND);
|
||||
if (!SwordBlockingConfig.alwaysHideShield && (handStack.getItem() instanceof ShieldItem) && !SwordBlockingClient.canWeaponBlock(player))
|
||||
return;
|
||||
|
||||
if (offStack.getItem() instanceof ShieldItem && SwordBlockingClient.isWeaponBlocking(player)) {
|
||||
cir.setReturnValue(BipedEntityModel.ArmPose.BLOCK);
|
||||
} else if (handStack.getItem() instanceof ShieldItem && SwordBlockingConfig.hideShield && (cir.getReturnValue() == BipedEntityModel.ArmPose.ITEM || cir.getReturnValue() == BipedEntityModel.ArmPose.BLOCK)) {
|
||||
cir.setReturnValue(BipedEntityModel.ArmPose.EMPTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.4 KiB |
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"swordblocking.midnightconfig.title": "Sword Blocking Config",
|
||||
"swordblocking.midnightconfig.enabled": "Enabled",
|
||||
"swordblocking.midnightconfig.hideShield": "Hide Shield",
|
||||
"swordblocking.midnightconfig.alwaysHideShield": "Always Hide Shield",
|
||||
"swordblocking.midnightconfig.hideOffhandSlot": "Hide Offhand Slot",
|
||||
"swordblocking.midnightconfig.hideOffhandSlot.tooltip": "Hides the offhand slot when a shield is in the offhand."
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"swordblocking.midnightconfig.title": "Конфигурация Sword Blocking",
|
||||
"swordblocking.midnightconfig.enabled": "Включено",
|
||||
"swordblocking.midnightconfig.hideShield": "Спрятать щит",
|
||||
"swordblocking.midnightconfig.alwaysHideShield": "Всегда прятать щит",
|
||||
"swordblocking.midnightconfig.hideOffhandSlot": "Скрывать слот второй руки",
|
||||
"swordblocking.midnightconfig.hideOffhandSlot.tooltip": "Скрывает слот второй руки, если в ней находится щит."
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "swordblocking",
|
||||
"version": "${version}",
|
||||
|
||||
"name": "Sword Blocking",
|
||||
"description": "Adds sword blocking to new versions, you just need a shield in your offhand!",
|
||||
"authors": [
|
||||
"Motschen",
|
||||
"TeamMidnightDust",
|
||||
"lowercasebtw"
|
||||
],
|
||||
"contact": {
|
||||
"homepage": "https://www.midnightdust.eu/",
|
||||
"sources": "https://github.com/TeamMidnightDust/SwordBlocking",
|
||||
"issues": "https://github.com/TeamMidnightDust/SwordBlocking/issues"
|
||||
},
|
||||
|
||||
"license": "MIT",
|
||||
"icon": "assets/swordblocking/icon.png",
|
||||
|
||||
"environment": "client",
|
||||
"entrypoints": {
|
||||
"client": [
|
||||
"eu.midnightdust.swordblocking.SwordBlockingClient"
|
||||
]
|
||||
},
|
||||
|
||||
"mixins": [
|
||||
"swordblocking.mixins.json"
|
||||
],
|
||||
|
||||
"depends": {
|
||||
"fabric-api": "*",
|
||||
"midnightlib": "*"
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"required": true,
|
||||
"minVersion": "0.8",
|
||||
"package": "eu.midnightdust.swordblocking.mixin",
|
||||
"compatibilityLevel": "JAVA_17",
|
||||
"client": [
|
||||
"MixinPlayerEntityRenderer",
|
||||
"MixinBipedEntityModel",
|
||||
"MixinInGameHud",
|
||||
"MixinHeldItemRenderer"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user