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

完成旧版发包物品tag框架

This commit is contained in:
XiaoMoMi
2025-05-29 18:47:16 +08:00
parent 8c2a848dba
commit 30c1affdc9
17 changed files with 252 additions and 69 deletions

View File

@@ -59,7 +59,7 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
this.itemEventListener = new ItemEventListener(plugin);
this.debugStickListener = new DebugStickListener(plugin);
this.armorEventListener = new ArmorEventListener();
this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler() : new LegacyNetworkItemHandler(this);
this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler() : new LegacyNetworkItemHandler();
this.registerAllVanillaItems();
}

View File

@@ -1,9 +1,19 @@
package net.momirealms.craftengine.bukkit.item;
import com.saicone.rtag.RtagItem;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.core.item.ItemWrapper;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.NBT;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.inventory.ItemStack;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Arrays;
public class LegacyItemWrapper implements ItemWrapper<ItemStack> {
private final RtagItem rtagItem;
private int count;
@@ -20,18 +30,50 @@ public class LegacyItemWrapper implements ItemWrapper<ItemStack> {
return itemStack;
}
public boolean set(Object value, Object... path) {
return this.rtagItem.set(value, path);
public boolean setTag(Object value, Object... path) {
if (value instanceof Tag tag) {
try {
Object nmsTag = FastNMS.INSTANCE.method$NbtIo$fromBytes(NBT.toBytes(tag, !VersionHelper.isOrAbove1_20_3()));
return this.rtagItem.set(nmsTag, path);
} catch (IOException e) {
CraftEngine.instance().logger().warn("Failed to set NBT tag " + Arrays.toString(path), e);
return false;
}
} else {
return this.rtagItem.set(value, path);
}
}
public boolean add(Object value, Object... path) {
return this.rtagItem.add(value, path);
if (value instanceof Tag tag) {
try {
// Incompatible DFU version
// return this.rtagItem.add(Reflections.instance$SPARROW_NBT_OPS.convertTo(Reflections.instance$NBT_OPS, tag), path);
Object nmsTag = FastNMS.INSTANCE.method$NbtIo$fromBytes(NBT.toBytes(tag, !VersionHelper.isOrAbove1_20_3()));
return this.rtagItem.add(nmsTag, path);
} catch (IOException e) {
CraftEngine.instance().logger().warn("Failed to add NBT tag " + Arrays.toString(path), e);
return false;
}
} else {
return this.rtagItem.add(value, path);
}
}
public <V> V get(Object... path) {
public <V> V getJavaTag(Object... path) {
return this.rtagItem.get(path);
}
public Tag getNBTTag(Object... path) {
Object tag = getExactTag(path);
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(FastNMS.INSTANCE.method$NbtIo$toBytes(tag)))) {
return NBT.readUnnamedTag(dis, !VersionHelper.isOrAbove1_20_3());
} catch (IOException e) {
CraftEngine.instance().logger().warn("Failed to read NBT tag " + Arrays.toString(path), e);
return null;
}
}
public int count() {
return this.count;
}
@@ -41,8 +83,8 @@ public class LegacyItemWrapper implements ItemWrapper<ItemStack> {
this.count = amount;
}
public <V> V getExact(Object... path) {
return this.rtagItem.get(path);
public Object getExactTag(Object... path) {
return this.rtagItem.getExact(path);
}
public boolean remove(Object... path) {

View File

@@ -1,26 +1,122 @@
package net.momirealms.craftengine.bukkit.item;
import net.kyori.adventure.text.Component;
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.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.StringTag;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiConsumer;
public class LegacyNetworkItemHandler implements NetworkItemHandler<ItemStack> {
private final BukkitItemManager itemManager;
public LegacyNetworkItemHandler(BukkitItemManager itemManager) {
this.itemManager = itemManager;
@Override
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped, ItemBuildContext context) {
if (!wrapped.hasTag(NETWORK_ITEM_TAG)) return Optional.empty();
CompoundTag networkData = (CompoundTag) wrapped.getNBTTag(NETWORK_ITEM_TAG);
if (networkData == null) return Optional.empty();
wrapped.removeTag(NETWORK_ITEM_TAG);
for (Map.Entry<String, Tag> entry : networkData.entrySet()) {
if (entry.getValue() instanceof CompoundTag tag) {
NetworkItemHandler.apply(entry.getKey(), tag, wrapped);
}
}
return Optional.of(wrapped);
}
@Override
public Optional<Item<ItemStack>> c2s(Item<ItemStack> itemStack, ItemBuildContext context) {
public Optional<Item<ItemStack>> s2c(Item<ItemStack> wrapped, ItemBuildContext context) {
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
if (optionalCustomItem.isEmpty()) {
if (!Config.interceptItem()) return Optional.empty();
return new OtherItem(wrapped).process();
}
return Optional.empty();
}
@Override
public Optional<Item<ItemStack>> s2c(Item<ItemStack> itemStack, ItemBuildContext context) {
return Optional.empty();
public static boolean processCustomName(Item<ItemStack> item, BiConsumer<String, CompoundTag> callback) {
Optional<String> optionalCustomName = item.customNameJson();
if (optionalCustomName.isPresent()) {
String line = optionalCustomName.get();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(line);
if (!tokens.isEmpty()) {
item.customNameJson(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens)));
callback.accept("display.Name", NetworkItemHandler.pack(Operation.ADD, new StringTag(line)));
return true;
}
}
return false;
}
private static boolean processLore(Item<ItemStack> item, BiConsumer<String, CompoundTag> callback) {
Optional<List<String>> optionalLore = item.loreJson();
if (optionalLore.isPresent()) {
boolean changed = false;
List<String> lore = optionalLore.get();
List<String> newLore = new ArrayList<>(lore.size());
for (String line : lore) {
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(line);
if (tokens.isEmpty()) {
newLore.add(line);
} else {
newLore.add(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens)));
changed = true;
}
}
if (changed) {
item.loreJson(newLore);
ListTag listTag = new ListTag();
for (String line : lore) {
listTag.add(new StringTag(line));
}
callback.accept("display.Lore", NetworkItemHandler.pack(Operation.ADD, listTag));
return true;
}
}
return false;
}
static class OtherItem {
private final Item<ItemStack> item;
private boolean globalChanged = false;
private CompoundTag networkTag;
public OtherItem(Item<ItemStack> item) {
this.item = item;
}
public Optional<Item<ItemStack>> process() {
if (processLore(this.item, (s, c) -> networkTag().put(s, c))) {
this.globalChanged = true;
}
if (processCustomName(this.item, (s, c) -> networkTag().put(s, c))) {
this.globalChanged = true;
}
if (this.globalChanged) {
this.item.setTag(this.networkTag, NETWORK_ITEM_TAG);
return Optional.of(this.item);
} else {
return Optional.empty();
}
}
public CompoundTag networkTag() {
if (this.networkTag == null) {
this.networkTag = new CompoundTag();
}
return this.networkTag;
}
}
}

View File

@@ -39,7 +39,12 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
}
@Override
protected Object getTag(ComponentItemWrapper item, Object... path) {
protected Object getJavaTag(ComponentItemWrapper item, Object... path) {
throw new UnsupportedOperationException("This feature is not available on 1.20.5+");
}
@Override
protected Tag getNBTTag(ComponentItemWrapper item, Object... path) {
throw new UnsupportedOperationException("This feature is not available on 1.20.5+");
}

View File

@@ -12,7 +12,6 @@ import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.GsonHelper;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer;
import java.util.ArrayList;
import java.util.List;

View File

@@ -12,6 +12,7 @@ import net.momirealms.craftengine.core.item.modifier.IdModifier;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.SkullUtils;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.inventory.ItemFlag;
@@ -33,12 +34,17 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
@Override
protected void setTag(LegacyItemWrapper item, Object value, Object... path) {
item.set(value, path);
item.setTag(value, path);
}
@Override
protected Object getTag(LegacyItemWrapper item, Object... path) {
return item.get(path);
protected Object getJavaTag(LegacyItemWrapper item, Object... path) {
return item.getJavaTag(path);
}
@Override
protected Tag getNBTTag(LegacyItemWrapper item, Object... path) {
return item.getNBTTag(path);
}
@Override
@@ -53,20 +59,20 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
@Override
protected Optional<Key> customId(LegacyItemWrapper item) {
Object id = item.get(IdModifier.CRAFT_ENGINE_ID);
Object id = item.getJavaTag(IdModifier.CRAFT_ENGINE_ID);
if (id == null) return Optional.empty();
return Optional.of(Key.of(id.toString()));
}
@Override
protected void customId(LegacyItemWrapper item, Key id) {
item.set(id.toString(), IdModifier.CRAFT_ENGINE_ID);
item.setTag(id.toString(), IdModifier.CRAFT_ENGINE_ID);
}
@Override
protected void customNameJson(LegacyItemWrapper item, String json) {
if (json != null) {
item.set(json, "display", "Name");
item.setTag(json, "display", "Name");
} else {
item.remove("display", "Name");
}
@@ -75,7 +81,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
@Override
protected Optional<String> customNameJson(LegacyItemWrapper item) {
if (!item.hasTag("display", "Name")) return Optional.empty();
return Optional.of(item.get("display", "Name"));
return Optional.of(item.getJavaTag("display", "Name"));
}
@Override
@@ -93,14 +99,14 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
if (data == null) {
item.remove("CustomModelData");
} else {
item.set(data, "CustomModelData");
item.setTag(data, "CustomModelData");
}
}
@Override
protected Optional<Integer> customModelData(LegacyItemWrapper item) {
if (!item.hasTag("CustomModelData")) return Optional.empty();
return Optional.of(item.get("CustomModelData"));
return Optional.of(item.getJavaTag("CustomModelData"));
}
@Override
@@ -108,8 +114,8 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
if (skullData == null) {
item.remove("SkullOwner");
} else {
item.set(UUID.nameUUIDFromBytes(SkullUtils.identifierFromBase64(skullData).getBytes(StandardCharsets.UTF_8)), "SkullOwner", "Id");
item.set(
item.setTag(UUID.nameUUIDFromBytes(SkullUtils.identifierFromBase64(skullData).getBytes(StandardCharsets.UTF_8)), "SkullOwner", "Id");
item.setTag(
List.of(Map.of("Value", skullData)),
"SkullOwner", "Properties", "textures"
);
@@ -119,7 +125,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
@Override
protected Optional<List<String>> loreJson(LegacyItemWrapper item) {
if (!item.hasTag("display", "Lore")) return Optional.empty();
return Optional.of(item.get("display", "Lore"));
return Optional.of(item.getJavaTag("display", "Lore"));
}
@Override
@@ -127,35 +133,35 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
if (lore == null || lore.isEmpty()) {
item.remove("display", "Lore");
} else {
item.set(lore, "display", "Lore");
item.setTag(lore, "display", "Lore");
}
}
@Override
protected boolean unbreakable(LegacyItemWrapper item) {
return Optional.ofNullable((Boolean) item.get("Unbreakable")).orElse(false);
return Optional.ofNullable((Boolean) item.getJavaTag("Unbreakable")).orElse(false);
}
@Override
protected void unbreakable(LegacyItemWrapper item, boolean unbreakable) {
item.set(unbreakable, "Unbreakable");
item.setTag(unbreakable, "Unbreakable");
}
@Override
protected Optional<Integer> damage(LegacyItemWrapper item) {
if (!item.hasTag("Damage")) return Optional.empty();
return Optional.of(item.get("Damage"));
return Optional.of(item.getJavaTag("Damage"));
}
@Override
protected void damage(LegacyItemWrapper item, Integer damage) {
item.set(damage, "Damage");
item.setTag(damage, "Damage");
}
@Override
protected Optional<Integer> dyedColor(LegacyItemWrapper item) {
if (!item.hasTag("display", "color")) return Optional.empty();
return Optional.of(item.get("display", "color"));
return Optional.of(item.getJavaTag("display", "color"));
}
@Override
@@ -163,7 +169,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
if (color == null) {
item.remove("display", "color");
} else {
item.set(color, "display", "color");
item.setTag(color, "display", "color");
}
}
@@ -187,7 +193,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
for (Enchantment enchantment : enchantments) {
tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level())));
}
item.set(tags, "Enchantments");
item.setTag(tags, "Enchantments");
}
@Override
@@ -200,12 +206,12 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
for (Enchantment enchantment : enchantments) {
tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level())));
}
item.set(tags, "StoredEnchantments");
item.setTag(tags, "StoredEnchantments");
}
@Override
protected void addEnchantment(LegacyItemWrapper item, Enchantment enchantment) {
Object enchantments = item.getExact("Enchantments");
Object enchantments = item.getExactTag("Enchantments");
if (enchantments != null) {
for (Object enchant : TagList.getValue(enchantments)) {
if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) {
@@ -215,13 +221,13 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
}
item.add(Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()), "Enchantments");
} else {
item.set(List.of(Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level())), "Enchantments");
item.setTag(List.of(Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level())), "Enchantments");
}
}
@Override
protected void addStoredEnchantment(LegacyItemWrapper item, Enchantment enchantment) {
Object enchantments = item.getExact("StoredEnchantments");
Object enchantments = item.getExactTag("StoredEnchantments");
if (enchantments != null) {
for (Object enchant : TagList.getValue(enchantments)) {
if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) {
@@ -231,7 +237,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
}
item.add(Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()), "StoredEnchantments");
} else {
item.set(List.of(Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level())), "StoredEnchantments");
item.setTag(List.of(Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level())), "StoredEnchantments");
}
}
@@ -254,7 +260,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
ItemFlag itemFlag = ItemFlag.valueOf(flag);
f = f | 1 << itemFlag.ordinal();
}
item.set(f, "HideFlags");
item.setTag(f, "HideFlags");
}
@Override
@@ -269,13 +275,13 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
@Override
protected void repairCost(LegacyItemWrapper item, Integer data) {
item.set(data, "RepairCost");
item.setTag(data, "RepairCost");
}
@Override
protected Optional<Integer> repairCost(LegacyItemWrapper item) {
if (!item.hasTag("RepairCost")) return Optional.empty();
return Optional.of(item.get("RepairCost"));
return Optional.of(item.getJavaTag("RepairCost"));
}
@Override
@@ -284,14 +290,14 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
item.remove("Trim");
return;
}
item.set(trim.material(), "Trim", "material");
item.set(trim.pattern(), "Trim", "pattern");
item.setTag(trim.material(), "Trim", "material");
item.setTag(trim.pattern(), "Trim", "pattern");
}
@Override
protected Optional<Trim> trim(LegacyItemWrapper item) {
String material = item.get("Trim", "material");
String pattern = item.get("Trim", "pattern");
String material = item.getJavaTag("Trim", "material");
String pattern = item.getJavaTag("Trim", "pattern");
if (material == null || pattern == null) return Optional.empty();
return Optional.of(new Trim(material, pattern));
}

View File

@@ -74,7 +74,7 @@ public class DebugStickListener implements Listener {
player.sendPacket(systemChatPacket, false);
} else {
LegacyItemWrapper wrapped = new LegacyItemWrapper(new RtagItem(itemInHand), itemInHand.getAmount());
Object storedData = wrapped.get("craftengine:debug_stick_state");
Object storedData = wrapped.getJavaTag("craftengine:debug_stick_state");
if (storedData == null) storedData = new HashMap<>();
if (storedData instanceof Map<?,?> map) {
Map<String, Object> data = MiscUtils.castToMap(map, false);
@@ -96,7 +96,7 @@ public class DebugStickListener implements Listener {
} else {
currentProperty = getRelative(properties, currentProperty, player.isSecondaryUseActive());
data.put(blockId, currentProperty.name());
wrapped.set(data, "craftengine:debug_stick_state");
wrapped.setTag(data, "craftengine:debug_stick_state");
wrapped.load();
Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance(
ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.select")

View File

@@ -3,7 +3,6 @@ package net.momirealms.craftengine.bukkit.plugin.network;
import com.google.gson.JsonObject;
import io.netty.buffer.ByteBuf;
import io.netty.channel.*;
import io.netty.handler.codec.MessageToMessageCodec;
import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.internal.logging.InternalLogger;

View File

@@ -311,8 +311,13 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
}
@Override
public Object getTag(Object... path) {
return this.factory.getTag(this.item, path);
public Object getJavaTag(Object... path) {
return this.factory.getJavaTag(this.item, path);
}
@Override
public Tag getNBTTag(Object... path) {
return this.factory.getNBTTag(this.item, path);
}
@Override

View File

@@ -5,5 +5,6 @@ public final class ComponentIds {
public static final String ITEM_NAME = "minecraft:item_name";
public static final String CUSTOM_NAME = "minecraft:custom_name";
public static final String ENCHANTMENTS = "minecraft:enchantments";
public static final String LORE = "minecraft:lore";
}

View File

@@ -129,7 +129,9 @@ public interface Item<I> {
Item<I> itemFlags(List<String> flags);
Object getTag(Object... path);
Object getJavaTag(Object... path);
Tag getNBTTag(Object... path);
Item<I> setTag(Object value, Object... path);

View File

@@ -30,7 +30,9 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract W wrapInternal(I item);
protected abstract Object getTag(W item, Object... path);
protected abstract Object getJavaTag(W item, Object... path);
protected abstract Tag getNBTTag(W item, Object... path);
protected abstract void setTag(W item, Object value, Object... path);

View File

@@ -1,6 +1,8 @@
package net.momirealms.craftengine.core.item;
import net.momirealms.craftengine.core.util.StringUtils;
import net.momirealms.craftengine.core.util.TriConsumer;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.ByteTag;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.Tag;
@@ -31,25 +33,25 @@ public interface NetworkItemHandler<T> {
return new CompoundTag(Map.of(NETWORK_OPERATION, operation.tag()));
}
static <T> void apply(String componentType, CompoundTag networkData, Item<T> item) {
static <T> void apply(String tagPath, CompoundTag networkData, Item<T> item) {
byte index = networkData.getByte(NETWORK_OPERATION);
Operation operation = BY_INDEX[index];
operation.consumer.accept(item, componentType, operation == Operation.ADD ? networkData.get(NETWORK_VALUE) : null);
operation.consumer.accept(item, tagPath, operation == Operation.ADD ? networkData.get(NETWORK_VALUE) : null);
}
enum Operation {
ADD(0, Item::setNBTComponent),
REMOVE(1, (i, s, t) -> i.removeComponent(s)),
RESET(2, (i, s, t) -> i.resetComponent(s));
ADD(0, Item::setNBTComponent, (i, s, t) -> i.setTag(t, (Object[]) StringUtils.splitByDot(s))),
REMOVE(1, (i, s, t) -> i.removeComponent(s), (i, s, t) -> i.removeTag((Object[]) StringUtils.splitByDot(s))),
RESET(2, (i, s, t) -> i.resetComponent(s), (i, s, t) -> i.removeTag((Object[]) StringUtils.splitByDot(s)));
private final int id;
private final ByteTag tag;
private final TriConsumer<Item<?>, String, Tag> consumer;
Operation(int id, TriConsumer<Item<?>, String, Tag> consumer) {
Operation(int id, TriConsumer<Item<?>, String, Tag> componentConsumer, TriConsumer<Item<?>, String, Tag> nbtConsumer) {
this.id = id;
this.tag = new ByteTag((byte) id);
this.consumer = consumer;
this.consumer = VersionHelper.isOrAbove1_20_5() ? componentConsumer : nbtConsumer;
}
public int id() {

View File

@@ -256,7 +256,7 @@ public class CustomSmithingTransformRecipe<T> implements Recipe<T> {
@Override
public void accept(Item<?> item1, Item<?> item2, Item<?> item3) {
for (String[] tag : this.tags) {
Object tagObj = item1.getTag((Object[]) tag);
Object tagObj = item1.getJavaTag((Object[]) tag);
if (tagObj != null) {
item3.setTag(tagObj, (Object[]) tag);
}

View File

@@ -11,10 +11,6 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.json.JSONOptions;
import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.Tag;
import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer;
import net.momirealms.sparrow.nbt.serializer.NBTSerializerOptions;

View File

@@ -0,0 +1,28 @@
package net.momirealms.craftengine.core.util;
public final class StringUtils {
private StringUtils() {}
public static String[] splitByDot(String s) {
if (s == null || s.isEmpty()) {
return new String[0];
}
int dotCount = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '.') {
dotCount++;
}
}
String[] result = new String[dotCount + 1];
int start = 0;
int index = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '.') {
result[index++] = s.substring(start, i);
start = i + 1;
}
}
result[index] = s.substring(start);
return result;
}
}

View File

@@ -39,7 +39,7 @@ geantyref_version=1.3.16
zstd_version=1.5.7-2
commons_io_version=2.18.0
commons_imaging_version=1.0.0-alpha6
sparrow_nbt_version=0.8.3
sparrow_nbt_version=0.8.4
sparrow_util_version=0.47
fastutil_version=8.5.15
netty_version=4.1.121.Final
@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.4
anti_grief_version=0.17
nms_helper_version=0.66.4
nms_helper_version=0.66.5
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23