9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-29 11:59:11 +00:00

优化物品系统

This commit is contained in:
XiaoMoMi
2025-07-30 20:41:32 +08:00
parent a19561984c
commit cd43273d4c
50 changed files with 1031 additions and 673 deletions

View File

@@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.item.CustomItem;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.NetworkItemHandler;
import net.momirealms.craftengine.core.item.modifier.ArgumentModifier;
import net.momirealms.craftengine.core.item.modifier.ArgumentsModifier;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
@@ -74,7 +74,7 @@ public final class LegacyNetworkItemHandler implements NetworkItemHandler<ItemSt
return new OtherItem(wrapped, hasDifferentMaterial).process();
} else {
CompoundTag tag = new CompoundTag();
Tag argumentTag = wrapped.getTag(ArgumentModifier.ARGUMENTS_TAG);
Tag argumentTag = wrapped.getTag(ArgumentsModifier.ARGUMENTS_TAG);
ItemBuildContext context;
if (argumentTag instanceof CompoundTag arguments) {
ContextHolder.Builder builder = ContextHolder.builder();

View File

@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.*;
import net.momirealms.craftengine.core.item.modifier.ArgumentModifier;
import net.momirealms.craftengine.core.item.modifier.ArgumentsModifier;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
@@ -77,7 +77,7 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler<ItemSt
return new OtherItem(wrapped, hasDifferentMaterial).process();
} else {
CompoundTag customData = Optional.ofNullable(wrapped.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag());
CompoundTag arguments = customData.getCompound(ArgumentModifier.ARGUMENTS_TAG);
CompoundTag arguments = customData.getCompound(ArgumentsModifier.ARGUMENTS_TAG);
ItemBuildContext context;
if (arguments == null) {
context = ItemBuildContext.of(player);

View File

@@ -10,21 +10,20 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInReg
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps;
import net.momirealms.craftengine.bukkit.util.EnchantmentUtils;
import net.momirealms.craftengine.bukkit.util.KeyUtils;
import net.momirealms.craftengine.core.attribute.AttributeModifier;
import net.momirealms.craftengine.core.item.ComponentKeys;
import net.momirealms.craftengine.core.item.data.Enchantment;
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
import net.momirealms.craftengine.core.item.data.Trim;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.Color;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.*;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemWrapper> {
@@ -129,7 +128,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
valueTag = MRegistryOps.JAVA.convertTo(MRegistryOps.SPARROW_NBT, value);
}
CompoundTag rootTag = (CompoundTag) item.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA).orElse(new CompoundTag());
CompoundTag rootTag = (CompoundTag) item.getSparrowNBTComponent(ComponentTypes.CUSTOM_DATA).orElseGet(CompoundTag::new);
if (path == null || path.length == 0) {
if (valueTag instanceof CompoundTag) {
@@ -587,4 +586,26 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
Object itemStack2 = FastNMS.INSTANCE.method$ItemStack$transmuteCopy(itemStack1, newItem, amount);
return new ComponentItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack2));
}
@Override
protected void attributeModifiers(ComponentItemWrapper item, List<AttributeModifier> modifierList) {
CompoundTag compoundTag = (CompoundTag) item.getSparrowNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS).orElseGet(CompoundTag::new);
ListTag modifiers = new ListTag();
compoundTag.put("modifiers", modifiers);
for (AttributeModifier modifier : modifierList) {
CompoundTag modifierTag = new CompoundTag();
modifierTag.putString("type", modifier.type());
modifierTag.putString("slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
if (VersionHelper.isOrAbove1_21()) {
modifierTag.putString("id", modifier.id().toString());
} else {
modifierTag.putIntArray("uuid", UUIDUtils.uuidToIntArray(UUID.nameUUIDFromBytes(modifier.id().toString().getBytes(StandardCharsets.UTF_8))));
modifierTag.putString("name", modifier.id().toString());
}
modifierTag.putDouble("amount", modifier.amount());
modifierTag.putString("operation", modifier.operation().id());
modifiers.add(modifierTag);
}
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, compoundTag);
}
}

View File

@@ -5,15 +5,20 @@ import com.google.gson.JsonElement;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.core.attribute.AttributeModifier;
import net.momirealms.craftengine.core.item.ComponentKeys;
import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.GsonHelper;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
@@ -123,4 +128,29 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
protected void jukeboxSong(ComponentItemWrapper item, JukeboxPlayable data) {
item.setJavaComponent(ComponentTypes.JUKEBOX_PLAYABLE, data.song());
}
@Override
protected void attributeModifiers(ComponentItemWrapper item, List<AttributeModifier> modifierList) {
ListTag modifiers = new ListTag();
for (AttributeModifier modifier : modifierList) {
CompoundTag modifierTag = new CompoundTag();
modifierTag.putString("type", modifier.type());
modifierTag.putString("slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
modifierTag.putString("id", modifier.id().toString());
modifierTag.putDouble("amount", modifier.amount());
modifierTag.putString("operation", modifier.operation().id());
AttributeModifier.Display display = modifier.display();
if (VersionHelper.isOrAbove1_21_6() && display != null) {
CompoundTag displayTag = new CompoundTag();
AttributeModifier.Display.Type displayType = display.type();
displayTag.putString("type", displayType.name().toLowerCase(Locale.ENGLISH));
if (displayType == AttributeModifier.Display.Type.OVERRIDE) {
displayTag.put("value", AdventureHelper.componentToTag(display.value()));
}
modifierTag.put("display", displayTag);
}
modifiers.add(modifierTag);
}
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, modifiers);
}
}

View File

@@ -5,6 +5,7 @@ import net.momirealms.craftengine.bukkit.item.LegacyItemWrapper;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries;
import net.momirealms.craftengine.bukkit.util.KeyUtils;
import net.momirealms.craftengine.core.attribute.AttributeModifier;
import net.momirealms.craftengine.core.item.data.Enchantment;
import net.momirealms.craftengine.core.item.data.FireworkExplosion;
import net.momirealms.craftengine.core.item.data.Trim;
@@ -13,6 +14,9 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.Color;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.SkullUtils;
import net.momirealms.craftengine.core.util.UUIDUtils;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
@@ -344,4 +348,20 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
FastNMS.INSTANCE.method$ItemStack$setTag(newItemStack, FastNMS.INSTANCE.method$CompoundTag$copy(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject())));
return new LegacyItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(newItemStack));
}
@Override
protected void attributeModifiers(LegacyItemWrapper item, List<AttributeModifier> modifiers) {
ListTag listTag = new ListTag();
for (AttributeModifier modifier : modifiers) {
CompoundTag modifierTag = new CompoundTag();
modifierTag.putString("AttributeName", modifier.type());
modifierTag.putString("Name", modifier.id().toString());
modifierTag.putString("Slot", modifier.slot().name().toLowerCase(Locale.ENGLISH));
modifierTag.putInt("Operation", modifier.operation().ordinal());
modifierTag.putDouble("Amount", modifier.amount());
modifierTag.putIntArray("UUID", UUIDUtils.uuidToIntArray(UUID.nameUUIDFromBytes(modifier.id().toString().getBytes(StandardCharsets.UTF_8))));
listTag.add(modifierTag);
}
item.setTag(listTag, "AttributeModifiers");
}
}