9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-24 17:39:30 +00:00

优化组件物品构建

This commit is contained in:
XiaoMoMi
2025-05-27 21:54:15 +08:00
parent e6564af5bd
commit fb40b49549
26 changed files with 447 additions and 264 deletions

View File

@@ -5,8 +5,9 @@ plugins {
repositories {
maven("https://jitpack.io/")
maven("https://repo.papermc.io/repository/maven-public/")
maven("https://repo.momirealms.net/releases/")
maven("https://libraries.minecraft.net/")
maven("https://repo.papermc.io/repository/maven-public/")
mavenCentral()
}

View File

@@ -151,7 +151,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
EmojiComponentProcessResult replaceProcessResult = replaceComponentEmoji(itemName, plugin.adapt(player), renameText);
if (replaceProcessResult.changed()) {
Item<ItemStack> wrapped = this.plugin.itemManager().wrap(result);
wrapped.customName(AdventureHelper.componentToJson(replaceProcessResult.newText()));
wrapped.customNameJson(AdventureHelper.componentToJson(replaceProcessResult.newText()));
event.setResult(wrapped.load());
}
}

View File

@@ -1,26 +1,31 @@
package net.momirealms.craftengine.bukkit.item;
import com.google.gson.JsonElement;
import com.saicone.rtag.RtagItem;
import com.saicone.rtag.data.ComponentType;
import com.saicone.rtag.tag.TagBase;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.core.item.ItemWrapper;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.inventory.ItemStack;
@SuppressWarnings("UnstableApiUsage")
import java.util.Optional;
public class ComponentItemWrapper implements ItemWrapper<ItemStack> {
private final ItemStack item;
private final Object handle;
public ComponentItemWrapper(final ItemStack item) {
this.item = FastNMS.INSTANCE.ensureCraftItemStack(item);
this.handle = FastNMS.INSTANCE.field$CraftItemStack$handle(this.item);
}
public ComponentItemWrapper(final ItemStack item, int count) {
this.item = FastNMS.INSTANCE.ensureCraftItemStack(item);
this.item.setAmount(count);
this.handle = FastNMS.INSTANCE.field$CraftItemStack$handle(this.item);
}
public void removeComponent(Object type) {
@@ -34,31 +39,86 @@ public class ComponentItemWrapper implements ItemWrapper<ItemStack> {
public void setComponent(Object type, final Object value) {
if (value instanceof JsonElement jsonElement) {
setJsonComponent(type, jsonElement);
} else if (TagBase.isTag(value)) {
} else if (Reflections.clazz$Tag.isInstance(value)) {
setNBTComponent(type, value);
} else if (value instanceof Tag tag) {
setSparrowNBTComponent(type, tag);
} else {
setJavaComponent(type, value);
}
}
public Object getComponent(Object type) {
public Object getComponentExact(Object type) {
return FastNMS.INSTANCE.getComponent(getLiteralObject(), ensureDataComponentType(type));
}
public <T> Optional<T> getJavaComponent(Object type) {
return getComponentInternal(type, Reflections.instance$JAVA_OPS);
}
public Optional<JsonElement> getJsonComponent(Object type) {
return getComponentInternal(type, Reflections.instance$JSON_OPS);
}
public Optional<Object> getNBTComponent(Object type) {
return getComponentInternal(type, Reflections.instance$NBT_OPS);
}
public Optional<Tag> getSparrowNBTComponent(Object type) {
return getComponentInternal(type, Reflections.instance$SPARROW_NBT_OPS);
}
@SuppressWarnings({"rawtypes", "unchecked"})
private <T> Optional<T> getComponentInternal(Object type, DynamicOps ops) {
Object componentType = ensureDataComponentType(type);
Codec codec = FastNMS.INSTANCE.method$DataComponentType$codec(componentType);
try {
Object componentData = FastNMS.INSTANCE.getComponent(getLiteralObject(), componentType);
if (componentData == null) return Optional.empty();
DataResult<Object> result = codec.encodeStart(ops, componentData);
return (Optional<T>) result.result();
} catch (Throwable t) {
throw new RuntimeException("Cannot read component " + type.toString(), t);
}
}
public boolean hasComponent(Object type) {
return FastNMS.INSTANCE.hasComponent(getLiteralObject(), ensureDataComponentType(type));
}
public void setComponentExact(Object type, final Object value) {
FastNMS.INSTANCE.setComponent(this.getLiteralObject(), ensureDataComponentType(type), value);
}
public void setJavaComponent(Object type, Object value) {
ComponentType.parseJava(type, value).ifPresent(it -> FastNMS.INSTANCE.setComponent(this.getLiteralObject(), ensureDataComponentType(type), it));
setComponentInternal(type, Reflections.instance$JAVA_OPS, value);
}
public void setJsonComponent(Object type, JsonElement value) {
ComponentType.parseJson(type, value).ifPresent(it -> FastNMS.INSTANCE.setComponent(this.getLiteralObject(), ensureDataComponentType(type), it));
setComponentInternal(type, Reflections.instance$JSON_OPS, value);
}
public void setNBTComponent(Object type, Object value) {
ComponentType.parseNbt(type, value).ifPresent(it -> FastNMS.INSTANCE.setComponent(this.getLiteralObject(), ensureDataComponentType(type), it));
setComponentInternal(type, Reflections.instance$NBT_OPS, value);
}
public void setSparrowNBTComponent(Object type, Tag value) {
setComponentInternal(type, Reflections.instance$SPARROW_NBT_OPS, value);
}
@SuppressWarnings({"rawtypes", "unchecked"})
private void setComponentInternal(Object type, DynamicOps ops, Object value) {
Object componentType = ensureDataComponentType(type);
Codec codec = FastNMS.INSTANCE.method$DataComponentType$codec(componentType);
try {
DataResult<Object> result = codec.parse(ops, value);
if (result.isError()) {
throw new IllegalArgumentException(result.toString());
}
result.result().ifPresent(it -> FastNMS.INSTANCE.setComponent(this.getLiteralObject(), componentType, it));
} catch (Throwable t) {
throw new RuntimeException("Cannot parse component " + type.toString(), t);
}
}
private Object ensureDataComponentType(Object type) {
@@ -89,7 +149,7 @@ public class ComponentItemWrapper implements ItemWrapper<ItemStack> {
@Override
public Object getLiteralObject() {
return FastNMS.INSTANCE.field$CraftItemStack$handle(this.item);
return this.handle;
}
@Override

View File

@@ -1,17 +1,11 @@
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.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.AdventureHelper;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class LegacyNetworkItemHandler implements NetworkItemHandler {

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.google.gson.JsonElement;
import com.saicone.rtag.item.ItemTagStream;
import net.momirealms.craftengine.bukkit.util.ItemTags;
import net.momirealms.craftengine.bukkit.util.Reflections;
@@ -11,7 +10,6 @@ import net.momirealms.craftengine.core.item.JukeboxPlayable;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.Optional;
@@ -89,16 +87,6 @@ public abstract class BukkitItemFactory<W extends ItemWrapper<ItemStack>> extend
}
}
@Override
protected JsonElement encodeJson(Object type, Object component) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
}
@Override
public Object encodeJava(Object componentType, @Nullable Object component) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
}
@Override
protected void resetComponent(W item, Object type) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
@@ -110,7 +98,7 @@ public abstract class BukkitItemFactory<W extends ItemWrapper<ItemStack>> extend
}
@Override
protected Object getComponent(W item, Object type) {
protected Object getExactComponent(W item, Object type) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
}

View File

@@ -1,8 +1,6 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.google.gson.JsonElement;
import com.saicone.rtag.data.ComponentType;
import com.saicone.rtag.item.ItemObject;
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
@@ -11,15 +9,14 @@ import net.momirealms.craftengine.core.item.Enchantment;
import net.momirealms.craftengine.core.item.Trim;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemWrapper> {
public ComponentItemFactory1_20_5(CraftEngine plugin) {
@@ -82,8 +79,23 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
}
@Override
protected Object getComponent(ComponentItemWrapper item, Object type) {
return item.getComponent(type);
protected Object getExactComponent(ComponentItemWrapper item, Object type) {
return item.getComponentExact(type);
}
@Override
protected Object getJavaComponent(ComponentItemWrapper item, Object type) {
return item.getJavaComponent(type).orElse(null);
}
@Override
protected JsonElement getJsonComponent(ComponentItemWrapper item, Object type) {
return item.getJsonComponent(type).orElse(null);
}
@Override
protected Tag getNBTComponent(ComponentItemWrapper item, Object type) {
return item.getSparrowNBTComponent(type).orElse(null);
}
@Override
@@ -96,16 +108,6 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
item.removeComponent(type);
}
@Override
public Object encodeJava(Object componentType, @Nullable Object component) {
return ComponentType.encodeJava(componentType, component).orElse(null);
}
@Override
protected JsonElement encodeJson(Object type, Object component) {
return ComponentType.encodeJson(type, component).orElse(null);
}
@Override
protected void customModelData(ComponentItemWrapper item, Integer data) {
if (data == null) {
@@ -117,16 +119,11 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Integer> customModelData(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.CUSTOM_MODEL_DATA)) return Optional.empty();
return Optional.ofNullable(
(Integer) ComponentType.encodeJava(
ComponentTypes.CUSTOM_MODEL_DATA,
item.getComponent(ComponentTypes.CUSTOM_MODEL_DATA)
).orElse(null));
return item.getJavaComponent(ComponentTypes.CUSTOM_MODEL_DATA);
}
@Override
protected void customName(ComponentItemWrapper item, String json) {
protected void customNameJson(ComponentItemWrapper item, String json) {
if (json == null) {
item.resetComponent(ComponentTypes.CUSTOM_NAME);
} else {
@@ -135,18 +132,12 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
}
@Override
protected Optional<String> customName(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.CUSTOM_NAME)) return Optional.empty();
return Optional.ofNullable(
(String) ComponentType.encodeJava(
ComponentTypes.CUSTOM_NAME,
item.getComponent(ComponentTypes.CUSTOM_NAME)
).orElse(null)
);
protected Optional<String> customNameJson(ComponentItemWrapper item) {
return item.getJavaComponent(ComponentTypes.CUSTOM_NAME);
}
@Override
protected void itemName(ComponentItemWrapper item, String json) {
protected void itemNameJson(ComponentItemWrapper item, String json) {
if (json == null) {
item.resetComponent(ComponentTypes.ITEM_NAME);
} else {
@@ -155,14 +146,8 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
}
@Override
protected Optional<String> itemName(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.ITEM_NAME)) return Optional.empty();
return Optional.ofNullable(
(String) ComponentType.encodeJava(
ComponentTypes.ITEM_NAME,
item.getComponent(ComponentTypes.ITEM_NAME)
).orElse(null)
);
protected Optional<String> itemNameJson(ComponentItemWrapper item) {
return item.getJavaComponent(ComponentTypes.ITEM_NAME);
}
@Override
@@ -175,20 +160,13 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
}
}
@SuppressWarnings("unchecked")
@Override
protected Optional<List<String>> lore(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.LORE)) return Optional.empty();
return Optional.ofNullable(
(List<String>) ComponentType.encodeJava(
ComponentTypes.LORE,
item.getComponent(ComponentTypes.LORE)
).orElse(null)
);
protected Optional<List<String>> loreJson(ComponentItemWrapper item) {
return item.getJavaComponent(ComponentTypes.LORE);
}
@Override
protected void lore(ComponentItemWrapper item, List<String> lore) {
protected void loreJson(ComponentItemWrapper item, List<String> lore) {
if (lore == null || lore.isEmpty()) {
item.resetComponent(ComponentTypes.LORE);
} else {
@@ -212,7 +190,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Boolean> glint(ComponentItemWrapper item) {
return Optional.ofNullable((Boolean) item.getComponent(ComponentTypes.ENCHANTMENT_GLINT_OVERRIDE));
return Optional.ofNullable((Boolean) item.getComponentExact(ComponentTypes.ENCHANTMENT_GLINT_OVERRIDE));
}
@Override
@@ -226,13 +204,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Integer> damage(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.DAMAGE)) return Optional.empty();
return Optional.ofNullable(
(Integer) ComponentType.encodeJava(
ComponentTypes.DAMAGE,
item.getComponent(ComponentTypes.DAMAGE)
).orElse(null)
);
return item.getJavaComponent(ComponentTypes.DAMAGE);
}
@Override
@@ -247,10 +219,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Integer> dyedColor(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.DYED_COLOR)) return Optional.empty();
Object javaObj = ComponentType.encodeJava(
ComponentTypes.DYED_COLOR,
item.getComponent(ComponentTypes.DYED_COLOR)
).orElse(null);
Object javaObj = getJavaComponent(item, ComponentTypes.DYED_COLOR);
if (javaObj instanceof Integer integer) {
return Optional.of(integer);
} else if (javaObj instanceof Map<?, ?> map) {
@@ -269,14 +238,9 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
}
@Override
protected Optional<Integer> maxDamage(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.MAX_DAMAGE)) return Optional.of((int) item.getItem().getType().getMaxDurability());
return Optional.ofNullable(
(Integer) ComponentType.encodeJava(
ComponentTypes.MAX_DAMAGE,
item.getComponent(ComponentTypes.MAX_DAMAGE)
).orElse(null)
);
protected int maxDamage(ComponentItemWrapper item) {
Optional<Integer> damage = item.getJavaComponent(ComponentTypes.MAX_DAMAGE);
return damage.orElseGet(() -> (int) item.getItem().getType().getMaxDurability());
}
@Override
@@ -290,7 +254,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Enchantment> getEnchantment(ComponentItemWrapper item, Key key) {
Object enchant = item.getComponent(ComponentTypes.ENCHANTMENTS);
Object enchant = item.getComponentExact(ComponentTypes.ENCHANTMENTS);
try {
Map<String, Integer> map = EnchantmentUtils.toMap(enchant);
Integer level = map.get(key.toString());
@@ -330,7 +294,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected void addEnchantment(ComponentItemWrapper item, Enchantment enchantment) {
Object enchant = item.getComponent(ComponentTypes.ENCHANTMENTS);
Object enchant = item.getComponentExact(ComponentTypes.ENCHANTMENTS);
try {
Map<String, Integer> map = EnchantmentUtils.toMap(enchant);
map.put(enchantment.id().toString(), enchantment.level());
@@ -342,7 +306,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected void addStoredEnchantment(ComponentItemWrapper item, Enchantment enchantment) {
Object enchant = item.getComponent(ComponentTypes.STORED_ENCHANTMENTS);
Object enchant = item.getComponentExact(ComponentTypes.STORED_ENCHANTMENTS);
try {
Map<String, Integer> map = EnchantmentUtils.toMap(enchant);
map.put(enchantment.id().toString(), enchantment.level());
@@ -359,9 +323,8 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected int maxStackSize(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.MAX_STACK_SIZE)) return item.getItem().getType().getMaxStackSize();
return Optional.ofNullable((Integer) ComponentType.encodeJava(ComponentTypes.MAX_STACK_SIZE, item.getComponent(ComponentTypes.MAX_STACK_SIZE)).orElse(null))
.orElse(item.getItem().getType().getMaxStackSize());
Optional<Integer> stackSize = item.getJavaComponent(ComponentTypes.MAX_STACK_SIZE);
return stackSize.orElseGet(() -> item.getItem().getType().getMaxStackSize());
}
@Override
@@ -384,8 +347,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Integer> repairCost(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.REPAIR_COST)) return Optional.empty();
return Optional.ofNullable((Integer) ComponentType.encodeJava(ComponentTypes.REPAIR_COST, item.getComponent(ComponentTypes.REPAIR_COST)).orElse(null));
return item.getJavaComponent(ComponentTypes.REPAIR_COST);
}
@Override
@@ -402,8 +364,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Trim> trim(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.TRIM)) return Optional.empty();
Optional<Object> trim = ComponentType.encodeJava(ComponentTypes.TRIM, item.getComponent(ComponentTypes.TRIM));
Optional<Object> trim = item.getJavaComponent(ComponentTypes.TRIM);
if (trim.isEmpty()) {
return Optional.empty();
}
@@ -418,7 +379,7 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
Object itemStack2 = item2.getLiteralObject();
Object itemStack3 = FastNMS.INSTANCE.method$ItemStack$transmuteCopy(itemStack1, itemStack2);
FastNMS.INSTANCE.method$ItemStack$applyComponents(itemStack3, FastNMS.INSTANCE.method$ItemStack$getComponentsPatch(itemStack2));
return new ComponentItemWrapper(ItemObject.asCraftMirror(itemStack3), item2.count());
return new ComponentItemWrapper(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack3), item2.count());
}
@Override

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.saicone.rtag.data.ComponentType;
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.core.item.JukeboxPlayable;
@@ -9,7 +8,6 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
import java.util.Map;
import java.util.Optional;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory1_21 extends ComponentItemFactory1_20_5 {
public ComponentItemFactory1_21(CraftEngine plugin) {
@@ -18,14 +16,11 @@ public class ComponentItemFactory1_21 extends ComponentItemFactory1_20_5 {
@Override
protected Optional<JukeboxPlayable> jukeboxSong(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.JUKEBOX_PLAYABLE)) return Optional.empty();
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) ComponentType.encodeJava(
ComponentTypes.JUKEBOX_PLAYABLE,
item.getComponent(ComponentTypes.JUKEBOX_PLAYABLE)
).orElse(null);
if (map == null) return Optional.empty();
return Optional.of(new JukeboxPlayable((String) map.get("song"), (boolean) map.getOrDefault("show_in_tooltip", true)));
Optional<Map<String, Object>> map = item.getJavaComponent(ComponentTypes.JUKEBOX_PLAYABLE);
return map.map(song -> new JukeboxPlayable(
(String) song.get("song"),
(boolean) song.getOrDefault("show_in_tooltip", true))
);
}
@Override

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.saicone.rtag.data.ComponentType;
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.core.item.EquipmentData;
@@ -8,7 +7,6 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
import java.util.Optional;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory1_21_2 extends ComponentItemFactory1_21 {
public ComponentItemFactory1_21_2(CraftEngine plugin) {
@@ -26,13 +24,7 @@ public class ComponentItemFactory1_21_2 extends ComponentItemFactory1_21 {
@Override
protected Optional<String> tooltipStyle(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.TOOLTIP_STYLE)) return Optional.empty();
return Optional.ofNullable(
(String) ComponentType.encodeJava(
ComponentTypes.TOOLTIP_STYLE,
item.getComponent(ComponentTypes.TOOLTIP_STYLE)
).orElse(null)
);
return item.getJavaComponent(ComponentTypes.TOOLTIP_STYLE);
}
@Override
@@ -46,13 +38,7 @@ public class ComponentItemFactory1_21_2 extends ComponentItemFactory1_21 {
@Override
protected Optional<String> itemModel(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.ITEM_MODEL)) return Optional.empty();
return Optional.ofNullable(
(String) ComponentType.encodeJava(
ComponentTypes.ITEM_MODEL,
item.getComponent(ComponentTypes.ITEM_MODEL)
).orElse(null)
);
return item.getJavaComponent(ComponentTypes.ITEM_MODEL);
}
@Override

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.saicone.rtag.data.ComponentType;
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.core.plugin.CraftEngine;
@@ -9,7 +8,6 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory1_21_4 extends ComponentItemFactory1_21_2 {
public ComponentItemFactory1_21_4(CraftEngine plugin) {
@@ -18,8 +16,7 @@ public class ComponentItemFactory1_21_4 extends ComponentItemFactory1_21_2 {
@Override
protected Optional<Integer> customModelData(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.CUSTOM_MODEL_DATA)) return Optional.empty();
Optional<Object> optional = ComponentType.encodeJava(ComponentTypes.CUSTOM_MODEL_DATA, item.getComponent(ComponentTypes.CUSTOM_MODEL_DATA));
Optional<Object> optional = item.getJavaComponent(ComponentTypes.CUSTOM_MODEL_DATA);
if (optional.isEmpty()) return Optional.empty();
@SuppressWarnings("unchecked")
Map<String, Object> data = (Map<String, Object>) optional.get();

View File

@@ -3,14 +3,16 @@ package net.momirealms.craftengine.bukkit.item.factory;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.saicone.rtag.data.ComponentType;
import com.saicone.rtag.tag.TagList;
import com.saicone.rtag.util.ChatComponent;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper;
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.core.item.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.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer;
import java.util.ArrayList;
import java.util.List;
@@ -24,60 +26,91 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
}
@Override
protected void customName(ComponentItemWrapper item, String json) {
protected void customNameJson(ComponentItemWrapper item, String json) {
if (json == null) {
item.resetComponent(ComponentTypes.CUSTOM_NAME);
} else {
item.setNBTComponent(ComponentTypes.CUSTOM_NAME, ChatComponent.toTag(ComponentUtils.jsonToMinecraft(json)));
item.setSparrowNBTComponent(ComponentTypes.CUSTOM_NAME, NBTComponentSerializer.nbt().serialize(AdventureHelper.jsonToComponent(json)));
}
}
@Override
protected Optional<String> customName(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.CUSTOM_NAME)) return Optional.empty();
return ComponentType.encodeJson(ComponentTypes.CUSTOM_NAME, item.getComponent(ComponentTypes.CUSTOM_NAME)).map(jsonElement -> GsonHelper.get().toJson(jsonElement));
protected Optional<String> customNameJson(ComponentItemWrapper item) {
return item.getJsonComponent(ComponentTypes.CUSTOM_NAME).map(it -> GsonHelper.get().toJson(it));
}
@Override
protected void itemName(ComponentItemWrapper item, String json) {
protected void customNameComponent(ComponentItemWrapper item, Component component) {
if (component == null) {
item.resetComponent(ComponentTypes.CUSTOM_NAME);
} else {
item.setSparrowNBTComponent(ComponentTypes.CUSTOM_NAME, NBTComponentSerializer.nbt().serialize(component));
}
}
@Override
protected Optional<Component> customNameComponent(ComponentItemWrapper item) {
return customNameJson(item).map(AdventureHelper::jsonToComponent);
}
@Override
protected void itemNameJson(ComponentItemWrapper item, String json) {
if (json == null) {
item.resetComponent(ComponentTypes.ITEM_NAME);
} else {
item.setNBTComponent(ComponentTypes.ITEM_NAME, ChatComponent.toTag(ComponentUtils.jsonToMinecraft(json)));
item.setSparrowNBTComponent(ComponentTypes.ITEM_NAME, NBTComponentSerializer.nbt().serialize(AdventureHelper.jsonToComponent(json)));
}
}
@Override
protected Optional<String> itemName(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.ITEM_NAME)) return Optional.empty();
return ComponentType.encodeJson(ComponentTypes.ITEM_NAME, item.getComponent(ComponentTypes.ITEM_NAME)).map(jsonElement -> GsonHelper.get().toJson(jsonElement));
protected void itemNameComponent(ComponentItemWrapper item, Component component) {
if (component == null) {
item.resetComponent(ComponentTypes.ITEM_NAME);
} else {
item.setSparrowNBTComponent(ComponentTypes.ITEM_NAME, NBTComponentSerializer.nbt().serialize(component));
}
}
@Override
protected Optional<List<String>> lore(ComponentItemWrapper item) {
protected Optional<String> itemNameJson(ComponentItemWrapper item) {
return item.getJsonComponent(ComponentTypes.ITEM_NAME).map(it -> GsonHelper.get().toJson(it));
}
@Override
protected Optional<List<String>> loreJson(ComponentItemWrapper item) {
if (!item.hasComponent(ComponentTypes.LORE)) return Optional.empty();
return ComponentType.encodeJson(
ComponentTypes.LORE,
item.getComponent(ComponentTypes.LORE)
).map(list -> {
List<String> lore = new ArrayList<>();
for (JsonElement jsonElement : (JsonArray) list) {
lore.add(GsonHelper.get().toJson(jsonElement));
}
return lore;
});
Optional<JsonElement> json = item.getJsonComponent(ComponentTypes.LORE);
if (json.isEmpty()) return Optional.empty();
List<String> lore = new ArrayList<>();
for (JsonElement jsonElement : (JsonArray) json.get()) {
lore.add(GsonHelper.get().toJson(jsonElement));
}
return Optional.of(lore);
}
@Override
protected void lore(ComponentItemWrapper item, List<String> lore) {
protected void loreComponent(ComponentItemWrapper item, List<Component> lore) {
if (lore == null || lore.isEmpty()) {
item.resetComponent(ComponentTypes.LORE);
} else {
List<Object> loreTags = new ArrayList<>();
for (String json : lore) {
loreTags.add(ChatComponent.toTag(ComponentUtils.jsonToMinecraft(json)));
List<Tag> loreTags = new ArrayList<>();
for (Component component : lore) {
loreTags.add(NBTComponentSerializer.nbt().serialize(component));
}
item.setNBTComponent(ComponentTypes.LORE, TagList.newTag(loreTags));
item.setSparrowNBTComponent(ComponentTypes.LORE, new ListTag(loreTags));
}
}
@Override
protected void loreJson(ComponentItemWrapper item, List<String> lore) {
if (lore == null || lore.isEmpty()) {
item.resetComponent(ComponentTypes.LORE);
} else {
List<Tag> loreTags = new ArrayList<>();
for (String json : lore) {
loreTags.add(NBTComponentSerializer.nbt().serialize(AdventureHelper.jsonToComponent(json)));
}
item.setSparrowNBTComponent(ComponentTypes.LORE, new ListTag(loreTags));
}
}
@@ -86,7 +119,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
if (!item.hasComponent(ComponentTypes.JUKEBOX_PLAYABLE)) return Optional.empty();
String song = (String) ComponentType.encodeJava(
ComponentTypes.JUKEBOX_PLAYABLE,
item.getComponent(ComponentTypes.JUKEBOX_PLAYABLE)).orElse(null);
item.getComponentExact(ComponentTypes.JUKEBOX_PLAYABLE)).orElse(null);
if (song == null) return Optional.empty();
return Optional.of(new JukeboxPlayable(song, true));
}

View File

@@ -1,5 +1,6 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.google.gson.JsonElement;
import com.saicone.rtag.RtagItem;
import com.saicone.rtag.item.ItemObject;
import com.saicone.rtag.tag.TagBase;
@@ -12,6 +13,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;
@@ -31,6 +33,21 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
return new LegacyItemWrapper(new RtagItem(item), item.getAmount());
}
@Override
protected Object getJavaComponent(LegacyItemWrapper item, Object type) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
}
@Override
protected JsonElement getJsonComponent(LegacyItemWrapper item, Object type) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
}
@Override
protected Tag getNBTComponent(LegacyItemWrapper item, Object type) {
throw new UnsupportedOperationException("This feature is only available on 1.20.5+");
}
@Override
protected void setTag(LegacyItemWrapper item, Object value, Object... path) {
item.set(value, path);
@@ -64,7 +81,7 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
}
@Override
protected void customName(LegacyItemWrapper item, String json) {
protected void customNameJson(LegacyItemWrapper item, String json) {
if (json != null) {
item.set(json, "display", "Name");
} else {
@@ -73,19 +90,19 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
}
@Override
protected Optional<String> customName(LegacyItemWrapper item) {
protected Optional<String> customNameJson(LegacyItemWrapper item) {
if (!item.hasTag("display", "Name")) return Optional.empty();
return Optional.of(item.get("display", "Name"));
}
@Override
protected void itemName(LegacyItemWrapper item, String json) {
customName(item, json);
protected void itemNameJson(LegacyItemWrapper item, String json) {
customNameJson(item, json);
}
@Override
protected Optional<String> itemName(LegacyItemWrapper item) {
return customName(item);
protected Optional<String> itemNameJson(LegacyItemWrapper item) {
return customNameJson(item);
}
@Override
@@ -117,13 +134,13 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
}
@Override
protected Optional<List<String>> lore(LegacyItemWrapper item) {
protected Optional<List<String>> loreJson(LegacyItemWrapper item) {
if (!item.hasTag("display", "Lore")) return Optional.empty();
return Optional.of(item.get("display", "Lore"));
}
@Override
protected void lore(LegacyItemWrapper item, List<String> lore) {
protected void loreJson(LegacyItemWrapper item, List<String> lore) {
if (lore == null || lore.isEmpty()) {
item.remove("display", "Lore");
} else {
@@ -168,8 +185,8 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
}
@Override
protected Optional<Integer> maxDamage(LegacyItemWrapper item) {
return Optional.of((int) item.getItem().getType().getMaxDurability());
protected int maxDamage(LegacyItemWrapper item) {
return item.getItem().getType().getMaxDurability();
}
@Override

View File

@@ -512,7 +512,7 @@ public class RecipeEventListener implements Listener {
Item<ItemStack> wrappedFirst = BukkitItemManager.instance().wrap(first.clone());
int maxDamage = wrappedFirst.maxDamage().orElse(0);
int maxDamage = wrappedFirst.maxDamage();
int damage = wrappedFirst.damage().orElse(0);
// not a repairable item
if (damage == 0 || maxDamage == 0) return;
@@ -577,8 +577,8 @@ public class RecipeEventListener implements Listener {
if (renameText != null && !renameText.isBlank()) {
try {
if (!renameText.equals(Reflections.method$Component$getString.invoke(ComponentUtils.jsonToMinecraft(wrappedFirst.hoverName().orElse(AdventureHelper.EMPTY_COMPONENT))))) {
wrappedFirst.customName(AdventureHelper.componentToJson(Component.text(renameText)));
if (!renameText.equals(Reflections.method$Component$getString.invoke(ComponentUtils.jsonToMinecraft(wrappedFirst.hoverNameJson().orElse(AdventureHelper.EMPTY_COMPONENT))))) {
wrappedFirst.customNameJson(AdventureHelper.componentToJson(Component.text(renameText)));
repairCost += 1;
} else if (repairCost == 0) {
hasResult = false;
@@ -588,10 +588,10 @@ public class RecipeEventListener implements Listener {
}
} else if (VersionHelper.isOrAbove1_20_5() && wrappedFirst.hasComponent(ComponentTypes.CUSTOM_NAME)) {
repairCost += 1;
wrappedFirst.customName(null);
wrappedFirst.customNameJson(null);
} else if (!VersionHelper.isOrAbove1_20_5() && wrappedFirst.hasTag("display", "Name")) {
repairCost += 1;
wrappedFirst.customName(null);
wrappedFirst.customNameJson(null);
}
int finalCost = repairCost + repairPenalty;
@@ -665,7 +665,7 @@ public class RecipeEventListener implements Listener {
}
if (renameText != null && !renameText.isBlank()) {
try {
if (!renameText.equals(Reflections.method$Component$getString.invoke(ComponentUtils.jsonToMinecraft(wrappedFirst.hoverName().orElse(AdventureHelper.EMPTY_COMPONENT))))) {
if (!renameText.equals(Reflections.method$Component$getString.invoke(ComponentUtils.jsonToMinecraft(wrappedFirst.hoverNameJson().orElse(AdventureHelper.EMPTY_COMPONENT))))) {
event.setResult(null);
}
} catch (Exception e) {
@@ -721,7 +721,7 @@ public class RecipeEventListener implements Listener {
}
int totalDamage = right.damage().orElse(0) + left.damage().orElse(0);
int totalMaxDamage = left.maxDamage().get() + right.maxDamage().get();
int totalMaxDamage = left.maxDamage() + right.maxDamage();
// should be impossible, but take care
if (totalDamage >= totalMaxDamage) {
inventory.setResult(null);
@@ -750,7 +750,7 @@ public class RecipeEventListener implements Listener {
Item<ItemStack> newItem = customItem.buildItem(ItemBuildContext.of(plugin.adapt(player)));
int remainingDurability = totalMaxDamage - totalDamage;
int newItemDamage = Math.max(0, newItem.maxDamage().get() - remainingDurability);
int newItemDamage = Math.max(0, newItem.maxDamage() - remainingDurability);
newItem.damage(newItemDamage);
inventory.setResult(newItem.load());
} else if (Reflections.clazz$ArmorDyeRecipe.isInstance(mcRecipe)) {

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.network.id;
import net.momirealms.craftengine.bukkit.plugin.network.PacketIds;
import net.momirealms.craftengine.bukkit.util.Reflections;
public class PacketIds1_20_5 implements PacketIds {

View File

@@ -3,6 +3,8 @@ package net.momirealms.craftengine.bukkit.util;
import com.google.common.collect.ImmutableList;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.JsonOps;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
@@ -14,6 +16,8 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.core.util.ReflectionUtils;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.Tag;
import net.momirealms.sparrow.nbt.codec.NBTOps;
import org.bukkit.NamespacedKey;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
@@ -6855,4 +6859,53 @@ public class Reflections {
"network.protocol.game.ServerboundContainerClickPacket"
)
);
public static final Class<?> clazz$RegistryOps = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"resources.RegistryOps",
"resources.RegistryOps"
)
);
public static final Class<?> clazz$JavaOps = requireNonNull(
ReflectionUtils.getClazz("com.mojang.serialization.JavaOps")
);
public static final Class<?> clazz$NbtOps = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"nbt.DynamicOpsNBT",
"nbt.NbtOps"
)
);
public static final Method method$RegistryOps$create = requireNonNull(
ReflectionUtils.getStaticMethod(
clazz$RegistryOps, clazz$RegistryOps, DynamicOps.class, clazz$HolderLookup$Provider
)
);
public static final DynamicOps<Object> instance$NBT_OPS;
public static final DynamicOps<Tag> instance$SPARROW_NBT_OPS;
public static final DynamicOps<Object> instance$JAVA_OPS;
public static final DynamicOps<JsonElement> instance$JSON_OPS;
static {
try {
Object nbtOps = ReflectionUtils.getDeclaredField(clazz$NbtOps, clazz$NbtOps, 0).get(null);
instance$NBT_OPS = (DynamicOps<Object>) method$RegistryOps$create.invoke(null, nbtOps, instance$MinecraftRegistry);
Object javaOps = ReflectionUtils.getDeclaredField(clazz$JavaOps, clazz$JavaOps, 0).get(null);
instance$JAVA_OPS = (DynamicOps<Object>) method$RegistryOps$create.invoke(null, javaOps, instance$MinecraftRegistry);
instance$JSON_OPS = (DynamicOps<JsonElement>) method$RegistryOps$create.invoke(null, JsonOps.INSTANCE, instance$MinecraftRegistry);
instance$SPARROW_NBT_OPS = (DynamicOps<Tag>) method$RegistryOps$create.invoke(null, NBTOps.INSTANCE, instance$MinecraftRegistry);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
public static final Class<?> clazz$Tag = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"nbt.NBTBase",
"nbt.Tag"
)
);
}

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.core.font;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.pack.LoadingSequence;
import net.momirealms.craftengine.core.pack.Pack;

View File

@@ -1,8 +1,10 @@
package net.momirealms.craftengine.core.item;
import com.google.gson.JsonElement;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.sparrow.nbt.Tag;
import java.util.List;
import java.util.Optional;
@@ -89,7 +91,7 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
}
@Override
public Optional<Integer> maxDamage() {
public int maxDamage() {
return this.factory.maxDamage(this.item);
}
@@ -180,25 +182,47 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
}
@Override
public Optional<String> customName() {
return this.factory.customName(this.item);
public Optional<String> customNameJson() {
return this.factory.customNameJson(this.item);
}
@Override
public Item<I> customName(String displayName) {
this.factory.customName(this.item, displayName);
public Item<I> customNameJson(String displayName) {
this.factory.customNameJson(this.item, displayName);
return this;
}
@Override
public Item<I> lore(List<String> lore) {
this.factory.lore(this.item, lore);
public Optional<Component> customNameComponent() {
return this.factory.customNameComponent(this.item);
}
@Override
public Item<I> customNameComponent(Component displayName) {
this.factory.customNameComponent(this.item, displayName);
return this;
}
@Override
public Optional<List<String>> lore() {
return this.factory.lore(this.item);
public Item<I> loreJson(List<String> lore) {
this.factory.loreJson(this.item, lore);
return this;
}
@Override
public Optional<List<String>> loreJson() {
return this.factory.loreJson(this.item);
}
@Override
public Item<I> loreComponent(List<Component> lore) {
this.factory.loreComponent(this.item, lore);
return this;
}
@Override
public Optional<List<Component>> loreComponent() {
return this.factory.loreComponent(this.item);
}
@Override
@@ -212,18 +236,28 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
return this.factory.unbreakable(this.item);
}
@Override
public Optional<String> itemName() {
return this.factory.itemName(this.item);
public Item<I> itemNameJson(String itemName) {
this.factory.itemNameJson(this.item, itemName);
return this;
}
@Override
public Item<I> itemName(String itemName) {
this.factory.itemName(this.item, itemName);
public Optional<String> itemNameJson() {
return this.factory.itemNameJson(this.item);
}
@Override
public Item<I> itemNameComponent(Component itemName) {
this.factory.itemNameComponent(this.item, itemName);
return this;
}
@Override
public Optional<Component> itemNameComponent() {
return this.factory.itemNameComponent(this.item);
}
@Override
public Item<I> skull(String data) {
this.factory.skull(this.item, data);
@@ -308,18 +342,23 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
}
@Override
public Object getComponent(Object type) {
return this.factory.getComponent(this.item, type);
public Object getExactComponent(Object type) {
return this.factory.getExactComponent(this.item, type);
}
@Override
public Object getJavaTypeComponent(Object type) {
return this.factory.encodeJava(type, getComponent(type));
public Object getJavaComponent(Object type) {
return this.factory.getJavaComponent(this.item, type);
}
@Override
public JsonElement getJsonTypeComponent(Object type) {
return this.factory.encodeJson(type, getComponent(type));
public JsonElement getJsonComponent(Object type) {
return this.factory.getJsonComponent(this.item, type);
}
@Override
public Tag getNBTComponent(Object type) {
return this.factory.getNBTComponent(this.item, type);
}
@Override

View File

@@ -437,7 +437,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
}, "external");
registerDataFunction((obj) -> {
String name = obj.toString();
return new DisplayNameModifier<>(name);
return new CustomNameModifier<>(name);
}, "custom-name");
registerDataFunction((obj) -> {
String name = obj.toString();

View File

@@ -1,8 +1,10 @@
package net.momirealms.craftengine.core.item;
import com.google.gson.JsonElement;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.sparrow.nbt.Tag;
import java.util.List;
import java.util.Optional;
@@ -54,23 +56,35 @@ public interface Item<I> {
Item<I> maxDamage(Integer data);
Optional<Integer> maxDamage();
int maxDamage();
Item<I> dyedColor(Integer data);
Optional<Integer> dyedColor();
Item<I> customName(String displayName);
Item<I> customNameJson(String displayName);
Optional<String> customName();
Item<I> customNameComponent(Component displayName);
default Optional<String> hoverName() {
return customName().or(this::itemName);
Optional<String> customNameJson();
Optional<Component> customNameComponent();
default Optional<String> hoverNameJson() {
return customNameJson().or(this::itemNameJson);
}
Item<I> itemName(String itemName);
default Optional<Component> hoverNameComponent() {
return customNameComponent().or(this::itemNameComponent);
}
Optional<String> itemName();
Item<I> itemNameJson(String itemName);
Item<I> itemNameComponent(Component itemName);
Optional<String> itemNameJson();
Optional<Component> itemNameComponent();
Item<I> itemModel(String itemModel);
@@ -80,7 +94,13 @@ public interface Item<I> {
Optional<String> tooltipStyle();
Item<I> lore(List<String> lore);
Item<I> loreJson(List<String> lore);
Item<I> loreComponent(List<Component> lore);
Optional<List<String>> loreJson();
Optional<List<Component>> loreComponent();
Optional<JukeboxPlayable> jukeboxSong();
@@ -90,7 +110,6 @@ public interface Item<I> {
Item<I> equippable(EquipmentData equipmentData);
Optional<List<String>> lore();
Item<I> unbreakable(boolean unbreakable);
@@ -122,11 +141,13 @@ public interface Item<I> {
void removeComponent(Object type);
Object getComponent(Object type);
Object getExactComponent(Object type);
Object getJavaTypeComponent(Object type);
Object getJavaComponent(Object type);
JsonElement getJsonTypeComponent(Object type);
JsonElement getJsonComponent(Object type);
Tag getNBTComponent(Object type);
void setComponent(Object type, Object value);

View File

@@ -1,13 +1,16 @@
package net.momirealms.craftengine.core.item;
import com.google.gson.JsonElement;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
import net.momirealms.sparrow.nbt.Tag;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected final CraftEngine plugin;
@@ -25,10 +28,6 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract void merge(W item1, W item2);
protected abstract Object encodeJava(Object type, @Nullable Object component);
protected abstract JsonElement encodeJson(Object type, Object component);
protected abstract W wrapInternal(I item);
protected abstract Object getTag(W item, Object... path);
@@ -41,7 +40,13 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract void setComponent(W item, Object type, Object value);
protected abstract Object getComponent(W item, Object type);
protected abstract Object getExactComponent(W item, Object type);
protected abstract Object getJavaComponent(W item, Object type);
protected abstract JsonElement getJsonComponent(W item, Object type);
protected abstract Tag getNBTComponent(W item, Object type);
protected abstract boolean hasComponent(W item, Object type);
@@ -57,20 +62,56 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract Optional<Integer> customModelData(W item);
protected abstract void customName(W item, String json);
protected abstract void customNameJson(W item, String json);
protected abstract Optional<String> customName(W item);
protected abstract Optional<String> customNameJson(W item);
protected abstract void itemName(W item, String json);
protected void customNameComponent(W item, Component component) {
if (component != null) {
customNameJson(item, AdventureHelper.componentToJson(component));
} else {
customNameJson(item, null);
}
}
protected abstract Optional<String> itemName(W item);
protected Optional<Component> customNameComponent(W item) {
return customNameJson(item).map(AdventureHelper::jsonToComponent);
}
protected abstract void itemNameJson(W item, String json);
protected abstract Optional<String> itemNameJson(W item);
protected void itemNameComponent(W item, Component component) {
if (component != null) {
itemNameJson(item, AdventureHelper.componentToJson(component));
} else {
itemNameJson(item, null);
}
}
protected Optional<Component> itemNameComponent(W item) {
return itemNameJson(item).map(AdventureHelper::jsonToComponent);
}
protected abstract Optional<List<String>> loreJson(W item);
protected abstract void loreJson(W item, List<String> lore);
protected void loreComponent(W item, List<Component> component) {
if (component != null && !component.isEmpty()) {
loreJson(item, component.stream().map(AdventureHelper::componentToJson).collect(Collectors.toList()));
} else {
loreJson(item, null);
}
}
protected Optional<List<Component>> loreComponent(W item) {
return loreJson(item).map(list -> list.stream().map(AdventureHelper::jsonToComponent).toList());
}
protected abstract void skull(W item, String skullData);
protected abstract Optional<List<String>> lore(W item);
protected abstract void lore(W item, List<String> lore);
protected abstract boolean unbreakable(W item);
protected abstract void unbreakable(W item, boolean unbreakable);
@@ -87,7 +128,7 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract void dyedColor(W item, Integer color);
protected abstract Optional<Integer> maxDamage(W item);
protected abstract int maxDamage(W item);
protected abstract void maxDamage(W item, Integer damage);
@@ -144,5 +185,4 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract Optional<EquipmentData> equippable(W item);
protected abstract byte[] toByteArray(W item);
}

View File

@@ -65,7 +65,7 @@ public class ComponentModifier<I> implements ItemDataModifier<I> {
item.setComponent(entry.left(), entry.right());
}
if (this.customData != null) {
JsonObject tag = (JsonObject) item.getJsonTypeComponent(ComponentKeys.CUSTOM_DATA);
JsonObject tag = (JsonObject) item.getJsonComponent(ComponentKeys.CUSTOM_DATA);
if (tag != null) {
item.setComponent(ComponentKeys.CUSTOM_DATA, GsonHelper.shallowMerge(this.customData, tag));
} else {
@@ -80,7 +80,7 @@ public class ComponentModifier<I> implements ItemDataModifier<I> {
item.resetComponent(entry.left());
}
if (this.customData != null) {
JsonObject tag = (JsonObject) item.getJsonTypeComponent(ComponentKeys.CUSTOM_DATA);
JsonObject tag = (JsonObject) item.getJavaComponent(ComponentKeys.CUSTOM_DATA);
if (tag != null) {
// crude method
for (String key : this.customData.keySet()) {

View File

@@ -5,25 +5,25 @@ import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.AdventureHelper;
public class DisplayNameModifier<I> implements ItemDataModifier<I> {
public class CustomNameModifier<I> implements ItemDataModifier<I> {
private final String argument;
public DisplayNameModifier(String argument) {
public CustomNameModifier(String argument) {
this.argument = Config.nonItalic() ? "<!i>" + argument : argument;
}
@Override
public String name() {
return "display-name";
return "custom-name";
}
@Override
public void apply(Item<I> item, ItemBuildContext context) {
item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers())));
item.customNameComponent(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()));
}
@Override
public void remove(Item<I> item) {
item.customName(null);
item.customNameJson(null);
}
}

View File

@@ -19,11 +19,11 @@ public class ItemNameModifier<I> implements ItemDataModifier<I> {
@Override
public void apply(Item<I> item, ItemBuildContext context) {
item.itemName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers())));
item.itemNameComponent(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()));
}
@Override
public void remove(Item<I> item) {
item.itemName(null);
item.itemNameJson(null);
}
}

View File

@@ -21,12 +21,12 @@ public class LoreModifier<I> implements ItemDataModifier<I> {
@Override
public void apply(Item<I> item, ItemBuildContext context) {
item.lore(this.argument.stream().map(it -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(
it, context.tagResolvers()))).toList());
item.loreComponent(this.argument.stream().map(it -> AdventureHelper.miniMessage().deserialize(
it, context.tagResolvers())).toList());
}
@Override
public void remove(Item<I> item) {
item.lore(null);
item.loreJson(null);
}
}

View File

@@ -219,7 +219,7 @@ public class CustomSmithingTransformRecipe<T> implements Recipe<T> {
@Override
public void accept(Item<?> item1, Item<?> item2, Item<?> item3) {
for (Key component : this.components) {
Object componentObj = item1.getComponent(component);
Object componentObj = item1.getExactComponent(component);
if (componentObj != null) {
item3.setComponent(component, componentObj);
}

View File

@@ -163,8 +163,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager {
this.plugin.logger().warn("Can't not find item " + it.icon() + " for category icon");
return null;
}
item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(it.displayName(), ItemBuildContext.EMPTY.tagResolvers())));
item.lore(it.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList());
item.customNameJson(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(it.displayName(), ItemBuildContext.EMPTY.tagResolvers())));
item.loreJson(it.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList());
item.load();
return new ItemWithAction(item, (element, click) -> {
click.cancel();
@@ -249,13 +249,13 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager {
if (!subCategory.icon().equals(ItemKeys.AIR)) {
this.plugin.logger().warn("Can't find item " + subCategory.icon() + " as icon for sub category " + subCategoryId);
item = this.plugin.itemManager().createWrappedItem(ItemKeys.BARRIER, player);
item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers())));
item.lore(subCategory.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList());
item.customNameJson(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers())));
item.loreJson(subCategory.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList());
item.load();
}
} else {
item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers())));
item.lore(subCategory.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList());
item.customNameJson(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers())));
item.loreJson(subCategory.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList());
item.load();
}
return new ItemWithAction(item, (element, click) -> {
@@ -271,7 +271,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager {
if (!itemId.equals(ItemKeys.AIR)) {
this.plugin.logger().warn("Can't find item " + itemId + " for category " + categoryId);
item = this.plugin.itemManager().createWrappedItem(ItemKeys.BARRIER, player);
item.customName(AdventureHelper.componentToJson(Component.text(it).decoration(TextDecoration.ITALIC, TextDecoration.State.FALSE).color(NamedTextColor.RED)));
item.customNameJson(AdventureHelper.componentToJson(Component.text(it).decoration(TextDecoration.ITALIC, TextDecoration.State.FALSE).color(NamedTextColor.RED)));
}
canGoFurther = false;
} else {

View File

@@ -39,18 +39,18 @@ 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.7.3
sparrow_nbt_version=0.8.1
sparrow_util_version=0.47
fastutil_version=8.5.15
netty_version=4.1.121.Final
joml_version=1.10.8
datafixerupper_version=6.0.8
datafixerupper_version=8.0.16
mojang_brigadier_version=1.0.18
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.2
nms_helper_version=0.66.3
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23