mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-23 17:09:19 +00:00
Merge branch 'Xiao-MoMi:dev' into dev
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user