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

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-05-28 04:28:00 +08:00
committed by GitHub
2 changed files with 136 additions and 93 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(this) : new LegacyNetworkItemHandler(this);
this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler() : new LegacyNetworkItemHandler(this);
this.registerAllVanillaItems();
}

View File

@@ -1,26 +1,27 @@
package net.momirealms.craftengine.bukkit.item;
import com.mojang.datafixers.util.Either;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.item.*;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
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.craftengine.core.util.VersionHelper;
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.Supplier;
@SuppressWarnings("DuplicatedCode")
public class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
private final BukkitItemManager itemManager;
public ModernNetworkItemHandler(BukkitItemManager itemManager) {
this.itemManager = itemManager;
}
public final class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
@Override
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped, ItemBuildContext context) {
@@ -60,45 +61,16 @@ public class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
}
if (Config.interceptItem()) {
if (!tag.containsKey(ComponentIds.ITEM_NAME)) {
Tag nameTag = wrapped.getNBTComponent(ComponentTypes.ITEM_NAME);
if (nameTag != null) {
String tagStr = nameTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (!tokens.isEmpty()) {
wrapped.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens)));
tag.put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag));
}
}
if (VersionHelper.isOrAbove1_21_5()) processModernItemName(wrapped, () -> tag);
else processLegacyItemName(wrapped, () -> tag);
}
if (!tag.containsKey(ComponentIds.CUSTOM_NAME)) {
Tag nameTag = wrapped.getNBTComponent(ComponentTypes.CUSTOM_NAME);
if (nameTag != null) {
String tagStr = nameTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (!tokens.isEmpty()) {
wrapped.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens)));
tag.put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag));
}
}
if (VersionHelper.isOrAbove1_21_5()) processModernCustomName(wrapped, () -> tag);
else processLegacyCustomName(wrapped, () -> tag);
}
if (!tag.containsKey(ComponentIds.LORE)) {
Tag loreTag = wrapped.getNBTComponent(ComponentTypes.LORE);
if (loreTag instanceof ListTag listTag) {
ListTag newLore = new ListTag();
boolean changed = false;
String tagStr = listTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (tokens.isEmpty()) {
newLore.add(tag);
} else {
newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens)));
changed = true;
}
if (changed) {
wrapped.setNBTComponent(ComponentKeys.LORE, newLore);
tag.put(ComponentIds.LORE, NetworkItemHandler.pack(Operation.ADD, listTag));
}
}
if (VersionHelper.isOrAbove1_21_5()) processModernLore(wrapped, () -> tag);
else processLegacyLore(wrapped, () -> tag);
}
}
if (tag.isEmpty()) return Optional.empty();
@@ -109,6 +81,113 @@ public class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
}
}
public static boolean processLegacyLore(Item<ItemStack> item, Supplier<CompoundTag> tag) {
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));
}
tag.get().put(ComponentIds.LORE, NetworkItemHandler.pack(Operation.ADD, listTag));
return true;
}
}
return false;
}
public static boolean processLegacyCustomName(Item<ItemStack> item, Supplier<CompoundTag> tag) {
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)));
tag.get().put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, new StringTag(line)));
return true;
}
}
return false;
}
public static boolean processLegacyItemName(Item<ItemStack> item, Supplier<CompoundTag> tag) {
Optional<String> optionalItemName = item.itemNameJson();
if (optionalItemName.isPresent()) {
String line = optionalItemName.get();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(line);
if (!tokens.isEmpty()) {
item.itemNameJson(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens)));
tag.get().put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, new StringTag(line)));
return true;
}
}
return false;
}
public static boolean processModernItemName(Item<ItemStack> item, Supplier<CompoundTag> tag) {
Tag nameTag = item.getNBTComponent(ComponentTypes.ITEM_NAME);
if (nameTag == null) return false;
String tagStr = nameTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (!tokens.isEmpty()) {
item.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens)));
tag.get().put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag));
return true;
}
return false;
}
public static boolean processModernCustomName(Item<ItemStack> item, Supplier<CompoundTag> tag) {
Tag nameTag = item.getNBTComponent(ComponentTypes.CUSTOM_NAME);
if (nameTag == null) return false;
String tagStr = nameTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (!tokens.isEmpty()) {
item.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens)));
tag.get().put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag));
return true;
}
return false;
}
public static boolean processModernLore(Item<ItemStack> item, Supplier<CompoundTag> tagSupplier) {
Tag loreTag = item.getNBTComponent(ComponentTypes.LORE);
boolean changed = false;
if (!(loreTag instanceof ListTag listTag)) {
return false;
}
ListTag newLore = new ListTag();
for (Tag tag : listTag) {
String tagStr = tag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (tokens.isEmpty()) {
newLore.add(tag);
} else {
newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens)));
changed = true;
}
}
if (changed) {
item.setNBTComponent(ComponentKeys.LORE, newLore);
tagSupplier.get().put(ComponentIds.LORE, NetworkItemHandler.pack(Operation.ADD, listTag));
return true;
}
return false;
}
static class OtherItem {
private final Item<ItemStack> item;
private boolean globalChanged = false;
@@ -119,9 +198,21 @@ public class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
}
public Optional<Item<ItemStack>> process() {
processModernLore();
processModernCustomName();
processModernItemName();
if (VersionHelper.isOrAbove1_21_5()) {
if (processModernLore(this.item, this::getOrCreateTag))
this.globalChanged = true;
if (processModernCustomName(this.item, this::getOrCreateTag))
this.globalChanged = true;
if (processModernItemName(this.item, this::getOrCreateTag))
this.globalChanged = true;
} else {
if (processLegacyLore(this.item, this::getOrCreateTag))
this.globalChanged = true;
if (processLegacyCustomName(this.item, this::getOrCreateTag))
this.globalChanged = true;
if (processLegacyItemName(this.item, this::getOrCreateTag))
this.globalChanged = true;
}
if (this.globalChanged) {
CompoundTag customData = Optional.ofNullable(this.item.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag());
customData.put(NETWORK_ITEM_TAG, getOrCreateTag());
@@ -132,54 +223,6 @@ public class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
}
}
private void processModernItemName() {
Tag nameTag = this.item.getNBTComponent(ComponentTypes.ITEM_NAME);
if (nameTag == null) return;
String tagStr = nameTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (!tokens.isEmpty()) {
this.item.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens)));
this.globalChanged = true;
getOrCreateTag().put(ComponentKeys.ITEM_NAME.asString(), NetworkItemHandler.pack(Operation.ADD, nameTag));
}
}
private void processModernCustomName() {
Tag nameTag = this.item.getNBTComponent(ComponentTypes.CUSTOM_NAME);
if (nameTag == null) return;
String tagStr = nameTag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (!tokens.isEmpty()) {
this.item.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens)));
this.globalChanged = true;
getOrCreateTag().put(ComponentKeys.CUSTOM_NAME.asString(), NetworkItemHandler.pack(Operation.ADD, nameTag));
}
}
private void processModernLore() {
Tag loreTag = this.item.getNBTComponent(ComponentTypes.LORE);
boolean changed = false;
if (!(loreTag instanceof ListTag listTag)) {
return;
}
ListTag newLore = new ListTag();
for (Tag tag : listTag) {
String tagStr = tag.getAsString();
Map<String, Component> tokens = CraftEngine.instance().fontManager().matchTags(tagStr);
if (tokens.isEmpty()) {
newLore.add(tag);
} else {
newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens)));
changed = true;
}
}
if (changed) {
this.globalChanged = true;
this.item.setNBTComponent(ComponentKeys.LORE, newLore);
getOrCreateTag().put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(Operation.ADD, listTag));
}
}
private CompoundTag getOrCreateTag() {
if (this.tag == null) {
this.tag = new CompoundTag();