From 8e8431bb8982efdde93fec6f80008855d8a68785 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Fri, 4 Apr 2025 05:57:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E6=B3=A8=E5=86=8Cattribute?= =?UTF-8?q?=20modifiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../atsuishio/superbwarfare/item/Monitor.java | 36 ++++++++----- .../item/common/ammo/Rocket.java | 36 +++++++++---- .../superbwarfare/item/gun/GunItem.java | 52 ++++++++----------- .../item/gun/launcher/SecondaryCataclysm.java | 31 ++++++----- 4 files changed, 89 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java b/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java index 1bae35bbc..be9547f3e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/Monitor.java @@ -15,10 +15,14 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; @@ -27,6 +31,7 @@ import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; import java.util.List; public class Monitor extends Item { @@ -94,19 +99,24 @@ public class Monitor extends Item { return super.use(world, player, hand); } - // TODO attribute -// @Override -// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { -// if (slot == EquipmentSlot.MAINHAND) { -// ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); -// builder.putAll(super.getAttributeModifiers(slot, stack)); -// builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Item modifier", 2d, AttributeModifier.Operation.ADDITION)); -// builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Item modifier", -2.4, AttributeModifier.Operation.ADDITION)); -// return builder.build(); -// } -// -// return super.getAttributeModifiers(slot, stack); -// } + @Override + public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { + var list = new ArrayList<>(super.getDefaultAttributeModifiers(stack).modifiers()); + list.addAll(List.of( + new ItemAttributeModifiers.Entry( + Attributes.ATTACK_DAMAGE, + new AttributeModifier(BASE_ATTACK_DAMAGE_ID, 2, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND + ), + new ItemAttributeModifiers.Entry( + Attributes.ATTACK_SPEED, + new AttributeModifier(BASE_ATTACK_SPEED_ID, -2.4, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND + ) + )); + + return new ItemAttributeModifiers(list, true); + } public static void getDronePos(ItemStack stack, Vec3 vec3) { var tag = NBTTool.getTag(stack); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java index 152704553..9ab069ce6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java @@ -14,12 +14,16 @@ import net.minecraft.core.Position; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ProjectileItem; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -32,6 +36,8 @@ import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; +import java.util.List; @EventBusSubscriber(modid = Mod.MODID, bus = EventBusSubscriber.Bus.MOD) public class Rocket extends Item implements GeoItem, ProjectileItem { @@ -74,17 +80,25 @@ public class Rocket extends Item implements GeoItem, ProjectileItem { return this.cache; } - // TODO attribute modifier -// @Override -// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { -// Multimap map = super.getAttributeModifiers(slot, stack); -// if (slot == EquipmentSlot.MAINHAND) { -// map = HashMultimap.create(map); -// map.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Item modifier", 6d, AttributeModifier.Operation.ADDITION)); -// map.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Item modifier", -2.4, AttributeModifier.Operation.ADDITION)); -// } -// return map; -// } + @Override + public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { + var list = new ArrayList<>(super.getDefaultAttributeModifiers(stack).modifiers()); + + list.addAll(List.of( + new ItemAttributeModifiers.Entry( + Attributes.ATTACK_DAMAGE, + new AttributeModifier(BASE_ATTACK_DAMAGE_ID, 6, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND + ), + new ItemAttributeModifiers.Entry( + Attributes.ATTACK_SPEED, + new AttributeModifier(BASE_ATTACK_SPEED_ID, -2.4, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND + ) + )); + + return new ItemAttributeModifiers(list, true); + } @Override public boolean hurtEnemy(@NotNull ItemStack stack, LivingEntity entity, @NotNull LivingEntity source) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index 6296bb6a5..b0128e09d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -22,11 +22,15 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -37,6 +41,7 @@ import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsE import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; import java.util.Optional; import java.util.Set; @@ -121,37 +126,24 @@ public abstract class GunItem extends Item implements CustomRendererItem { return false; } - // TODO attribute modifier -// @Override -// public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { -// ItemAttributeModifiers map = super.getDefaultAttributeModifiers(stack); -// map.builder().add( -// Attribute.BASE, -// new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, -// -0.01f - 0.005f * (GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight")), -// AttributeModifier.Operation.ADD_MULTIPLIED_BASE) -// ) -// -// map.put(Attributes.MOVEMENT_SPEED, -// new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, -// -0.01f - 0.005f * (GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight")), -// AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); -// return map; -// } + private static final ResourceLocation SPEED_ID = Mod.loc("gun_movement_speed"); -// @Override -// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { -// Multimap map = super.getAttributeModifiers(slot, stack); -// UUID uuid = new UUID(slot.toString().hashCode(), 0); -// if (slot == EquipmentSlot.MAINHAND) { -// map = HashMultimap.create(map); -// map.put(Attributes.MOVEMENT_SPEED, -// new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, -// -0.01f - 0.005f * (GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight")), -// AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); -// } -// return map; -// } + @Override + public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { + var list = new ArrayList<>(super.getDefaultAttributeModifiers(stack).modifiers()); + var tag = NBTTool.getTag(stack); + + list.add(new ItemAttributeModifiers.Entry( + Attributes.MOVEMENT_SPEED, + new AttributeModifier(SPEED_ID, + -0.01f - 0.005f * (GunsTool.getGunDoubleTag(tag, "Weight") + GunsTool.getGunDoubleTag(tag, "CustomWeight")), + AttributeModifier.Operation.ADD_MULTIPLIED_BASE + ), + EquipmentSlotGroup.MAINHAND + )); + + return new ItemAttributeModifiers(list, true); + } @Override public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java index 289ddb855..4336e74b4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java @@ -27,10 +27,14 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.network.PacketDistributor; @@ -42,6 +46,7 @@ import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; import java.util.Optional; public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireWeapon, EnergyStorageItem { @@ -226,18 +231,20 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireW return Optional.of(new SecondaryCataclysmImageComponent(pStack)); } - // TODO attribute -// @Override -// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { -// Multimap map = super.getAttributeModifiers(slot, stack); -// UUID uuid = new UUID(slot.toString().hashCode(), 0); -// if (slot == EquipmentSlot.MAINHAND) { -// map = HashMultimap.create(map); -// map.put(Attributes.ATTACK_DAMAGE, -// new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, 19, AttributeModifier.Operation.ADDITION)); -// } -// return map; -// } + private static final ResourceLocation DAMAGE_ID = Mod.loc("secondary_cataclysm_attack_damage"); + + @Override + public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) { + var list = new ArrayList<>(super.getDefaultAttributeModifiers(stack).modifiers()); + + list.add(new ItemAttributeModifiers.Entry( + Attributes.ATTACK_DAMAGE, + new AttributeModifier(DAMAGE_ID, 19, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND + )); + + return new ItemAttributeModifiers(list, true); + } @Override public boolean isIterativeReload(ItemStack stack) {