From b76a5743cf8ba6580128a5bcb58ee6d63780e971 Mon Sep 17 00:00:00 2001 From: ErrorCraft Date: Sat, 1 Aug 2026 01:01:29 +0200 Subject: [PATCH] Move the disable_blocking_for_seconds field to a melee weapon type --- .../data/minecraft/item/copper_axe.json | 8 ++++++-- .../data/minecraft/item/diamond_axe.json | 8 ++++++-- .../data/minecraft/item/golden_axe.json | 8 ++++++-- .../generated/data/minecraft/item/iron_axe.json | 8 ++++++-- .../data/minecraft/item/netherite_axe.json | 8 ++++++-- .../data/minecraft/item/stone_axe.json | 8 ++++++-- .../data/minecraft/item/wooden_axe.json | 8 ++++++-- .../components/WeaponItemComponent.java | 17 +++++++++++------ .../weapon/melee/MeleeWeaponComponents.java | 2 ++ .../component/DisablesBlockingMeleeWeapon.java | 11 +++++++++++ 10 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 src/main/java/net/errorcraft/itematic/item/weapon/melee/component/DisablesBlockingMeleeWeapon.java diff --git a/src/main/generated/data/minecraft/item/copper_axe.json b/src/main/generated/data/minecraft/item/copper_axe.json index 54d235d1..9ad986cf 100644 --- a/src/main/generated/data/minecraft/item/copper_axe.json +++ b/src/main/generated/data/minecraft/item/copper_axe.json @@ -29,8 +29,12 @@ "rules": [] }, "attack_speed": 0.2, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/generated/data/minecraft/item/diamond_axe.json b/src/main/generated/data/minecraft/item/diamond_axe.json index 25002d63..2b55a076 100644 --- a/src/main/generated/data/minecraft/item/diamond_axe.json +++ b/src/main/generated/data/minecraft/item/diamond_axe.json @@ -29,8 +29,12 @@ "rules": [] }, "attack_speed": 0.25, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/generated/data/minecraft/item/golden_axe.json b/src/main/generated/data/minecraft/item/golden_axe.json index 38714af8..bf934c85 100644 --- a/src/main/generated/data/minecraft/item/golden_axe.json +++ b/src/main/generated/data/minecraft/item/golden_axe.json @@ -29,8 +29,12 @@ "rules": [] }, "attack_speed": 0.25, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/generated/data/minecraft/item/iron_axe.json b/src/main/generated/data/minecraft/item/iron_axe.json index d522a059..404cabaa 100644 --- a/src/main/generated/data/minecraft/item/iron_axe.json +++ b/src/main/generated/data/minecraft/item/iron_axe.json @@ -29,8 +29,12 @@ "rules": [] }, "attack_speed": 0.225, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/generated/data/minecraft/item/netherite_axe.json b/src/main/generated/data/minecraft/item/netherite_axe.json index 27c1ef6a..d8aeb31c 100644 --- a/src/main/generated/data/minecraft/item/netherite_axe.json +++ b/src/main/generated/data/minecraft/item/netherite_axe.json @@ -32,8 +32,12 @@ "rules": [] }, "attack_speed": 0.25, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/generated/data/minecraft/item/stone_axe.json b/src/main/generated/data/minecraft/item/stone_axe.json index 0c13e0a2..28e0a439 100644 --- a/src/main/generated/data/minecraft/item/stone_axe.json +++ b/src/main/generated/data/minecraft/item/stone_axe.json @@ -29,8 +29,12 @@ "rules": [] }, "attack_speed": 0.2, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/generated/data/minecraft/item/wooden_axe.json b/src/main/generated/data/minecraft/item/wooden_axe.json index 00367c30..96617fe8 100644 --- a/src/main/generated/data/minecraft/item/wooden_axe.json +++ b/src/main/generated/data/minecraft/item/wooden_axe.json @@ -32,8 +32,12 @@ "rules": [] }, "attack_speed": 0.2, - "disable_blocking_for_seconds": 5.0, - "item_damage_per_attack": 2 + "item_damage_per_attack": 2, + "types": { + "minecraft:disables_blocking": { + "seconds": 5.0 + } + } } }, "display": { diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java index 62aa10e3..c1b38aa3 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java @@ -10,6 +10,7 @@ import net.errorcraft.itematic.item.event.ItemEvents; import net.errorcraft.itematic.item.weapon.melee.MeleeWeaponComponents; import net.errorcraft.itematic.item.weapon.melee.MeleeWeaponWithDataComponents; +import net.errorcraft.itematic.item.weapon.melee.component.DisablesBlockingMeleeWeapon; import net.errorcraft.itematic.item.weapon.melee.component.KineticMeleeWeapon; import net.errorcraft.itematic.item.weapon.melee.component.SmashingMeleeWeapon; import net.errorcraft.itematic.serialization.ItematicCodecs; @@ -38,10 +39,9 @@ import java.util.List; import java.util.Optional; -public record WeaponItemComponent(int itemDamagePerAttack, float disableBlockingForSeconds, ComponentMap types, Optional> damageType, Optional swingAnimation, WeaponAttackDamageDataComponent attackDamage, double attackSpeed, Optional attackRange, Optional minimumAttackCharge) implements ItemComponent, ComponentHolder { +public record WeaponItemComponent(int itemDamagePerAttack, ComponentMap types, Optional> damageType, Optional swingAnimation, WeaponAttackDamageDataComponent attackDamage, double attackSpeed, Optional attackRange, Optional minimumAttackCharge) implements ItemComponent, ComponentHolder { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codecs.NON_NEGATIVE_INT.optionalFieldOf("item_damage_per_attack", 1).forGetter(WeaponItemComponent::itemDamagePerAttack), - Codecs.NON_NEGATIVE_FLOAT.optionalFieldOf("disable_blocking_for_seconds", 0.0f).forGetter(WeaponItemComponent::disableBlockingForSeconds), MeleeWeaponComponents.CODEC.optionalFieldOf("types", ComponentMap.EMPTY).forGetter(WeaponItemComponent::types), DamageType.ENTRY_CODEC.optionalFieldOf("damage_type").forGetter(WeaponItemComponent::damageType), SwingAnimationComponent.CODEC.optionalFieldOf("swing_animation").forGetter(WeaponItemComponent::swingAnimation), @@ -101,7 +101,11 @@ public void using(ItemStack stack, World world, LivingEntity user, int usedTicks @Override public void addComponents(ComponentMap.Builder builder) { - builder.add(DataComponentTypes.WEAPON, new WeaponComponent(this.itemDamagePerAttack, this.disableBlockingForSeconds)); + DisablesBlockingMeleeWeapon disablesBlocking = this.types.get(MeleeWeaponComponents.DISABLES_BLOCKING); + builder.add(DataComponentTypes.WEAPON, new WeaponComponent( + this.itemDamagePerAttack, + disablesBlocking != null ? disablesBlocking.seconds() : 0.0f + )); builder.add(ItematicDataComponentTypes.WEAPON_ATTACK_DAMAGE, this.attackDamage); builder.add(ItematicDataComponentTypes.ATTACK_SPEED_MULTIPLIER, this.attackSpeed); this.streamAll(MeleeWeaponWithDataComponents.class) @@ -151,7 +155,6 @@ public static class Builder { private final double attackSpeed; private AttackRangeComponent attackRange; private Float minimumAttackCharge; - private float disableBlockingForSeconds; private Builder(int itemDamagePerAttack, double attackDamage, double attackSpeed) { this.itemDamagePerAttack = itemDamagePerAttack; @@ -162,7 +165,6 @@ private Builder(int itemDamagePerAttack, double attackDamage, double attackSpeed public WeaponItemComponent build() { return new WeaponItemComponent( this.itemDamagePerAttack, - this.disableBlockingForSeconds, this.types.build(), Optional.ofNullable(this.damageType), Optional.ofNullable(this.swingAnimation), @@ -199,7 +201,10 @@ public Builder minimumAttackCharge(float minimumAttackCharge) { } public Builder disableBlockingForSeconds(float disableBlockingForSeconds) { - this.disableBlockingForSeconds = disableBlockingForSeconds; + if (disableBlockingForSeconds > 0.0f) { + this.type(MeleeWeaponComponents.DISABLES_BLOCKING, new DisablesBlockingMeleeWeapon(disableBlockingForSeconds)); + } + return this; } } diff --git a/src/main/java/net/errorcraft/itematic/item/weapon/melee/MeleeWeaponComponents.java b/src/main/java/net/errorcraft/itematic/item/weapon/melee/MeleeWeaponComponents.java index a29d29c8..f93e2fac 100644 --- a/src/main/java/net/errorcraft/itematic/item/weapon/melee/MeleeWeaponComponents.java +++ b/src/main/java/net/errorcraft/itematic/item/weapon/melee/MeleeWeaponComponents.java @@ -1,6 +1,7 @@ package net.errorcraft.itematic.item.weapon.melee; import com.mojang.serialization.Codec; +import net.errorcraft.itematic.item.weapon.melee.component.DisablesBlockingMeleeWeapon; import net.errorcraft.itematic.item.weapon.melee.component.KineticMeleeWeapon; import net.errorcraft.itematic.item.weapon.melee.component.PiercingMeleeWeapon; import net.errorcraft.itematic.item.weapon.melee.component.SmashingMeleeWeapon; @@ -17,6 +18,7 @@ public class MeleeWeaponComponents { public static final ComponentType SMASHING = register("smashing", builder -> builder.codec(SmashingMeleeWeapon.CODEC)); public static final ComponentType KINETIC = register("kinetic", builder -> builder.codec(KineticMeleeWeapon.CODEC)); public static final ComponentType PIERCING = register("piercing", builder -> builder.codec(PiercingMeleeWeapon.CODEC)); + public static final ComponentType DISABLES_BLOCKING = register("disables_blocking", builder -> builder.codec(DisablesBlockingMeleeWeapon.CODEC)); private MeleeWeaponComponents() {} diff --git a/src/main/java/net/errorcraft/itematic/item/weapon/melee/component/DisablesBlockingMeleeWeapon.java b/src/main/java/net/errorcraft/itematic/item/weapon/melee/component/DisablesBlockingMeleeWeapon.java new file mode 100644 index 00000000..86003cfd --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/weapon/melee/component/DisablesBlockingMeleeWeapon.java @@ -0,0 +1,11 @@ +package net.errorcraft.itematic.item.weapon.melee.component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.dynamic.Codecs; + +public record DisablesBlockingMeleeWeapon(float seconds) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codecs.NON_NEGATIVE_FLOAT.fieldOf("seconds").forGetter(DisablesBlockingMeleeWeapon::seconds) + ).apply(instance, DisablesBlockingMeleeWeapon::new)); +}