正确注册attribute modifiers

This commit is contained in:
Light_Quanta 2025-04-04 05:57:26 +08:00
parent de26447164
commit 8e8431bb89
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
4 changed files with 89 additions and 66 deletions

View file

@ -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<Attribute, AttributeModifier> getAttributeModifiers(EquipmentSlot slot, ItemStack stack) {
// if (slot == EquipmentSlot.MAINHAND) {
// ImmutableMultimap.Builder<Attribute, AttributeModifier> 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);

View file

@ -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<Attribute, AttributeModifier> getAttributeModifiers(EquipmentSlot slot, ItemStack stack) {
// Multimap<Attribute, AttributeModifier> 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) {

View file

@ -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<Attribute, AttributeModifier> getAttributeModifiers(EquipmentSlot slot, ItemStack stack) {
// Multimap<Attribute, AttributeModifier> 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<TooltipComponent> getTooltipImage(@NotNull ItemStack pStack) {

View file

@ -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<Attribute, AttributeModifier> getAttributeModifiers(EquipmentSlot slot, ItemStack stack) {
// Multimap<Attribute, AttributeModifier> 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) {