9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00
This commit is contained in:
XiaoMoMi
2025-04-05 14:49:13 +08:00
parent 6c7c1a9361
commit e766052f87
17 changed files with 188 additions and 138 deletions

View File

@@ -6,6 +6,7 @@ import net.momirealms.craftengine.bukkit.item.behavior.BoneMealItemBehavior;
import net.momirealms.craftengine.bukkit.item.behavior.BucketItemBehavior;
import net.momirealms.craftengine.bukkit.item.behavior.WaterBucketItemBehavior;
import net.momirealms.craftengine.bukkit.item.factory.BukkitItemFactory;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.util.ItemUtils;
import net.momirealms.craftengine.bukkit.util.KeyUtils;
@@ -580,22 +581,19 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
@SuppressWarnings("unchecked")
private void registerAllVanillaItems() {
try {
for (Material material : Registry.MATERIAL) {
if (material.getKey().namespace().equals("minecraft")) {
if (!material.isLegacy() && material.isItem()) {
Key id = Key.from(material.getKey().asString());
VANILLA_ITEMS.add(id);
Holder.Reference<Key> holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id)
.orElseGet(() -> ((WritableRegistry<Key>) BuiltInRegistries.OPTIMIZED_ITEM_ID)
.register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id));
Object resourceLocation = KeyUtils.toResourceLocation(id.namespace(), id.value());
Object mcHolder = ((Optional<Object>) Reflections.method$Registry$getHolder1.invoke(Reflections.instance$BuiltInRegistries$ITEM, Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$ITEM, resourceLocation))).get();
Set<Object> tags = (Set<Object>) Reflections.field$Holder$Reference$tags.get(mcHolder);
for (Object tag : tags) {
Key tagId = Key.of(Reflections.field$TagKey$location.get(tag).toString());
VANILLA_ITEM_TAGS.computeIfAbsent(tagId, (key) -> new ArrayList<>()).add(holder);
}
for (NamespacedKey item : FastNMS.INSTANCE.getAllVanillaItems()) {
if (item.getNamespace().equals("minecraft")) {
Key id = KeyUtils.namespacedKey2Key(item);
VANILLA_ITEMS.add(id);
Holder.Reference<Key> holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id)
.orElseGet(() -> ((WritableRegistry<Key>) BuiltInRegistries.OPTIMIZED_ITEM_ID)
.register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id));
Object resourceLocation = KeyUtils.toResourceLocation(id.namespace(), id.value());
Object mcHolder = ((Optional<Object>) Reflections.method$Registry$getHolder1.invoke(Reflections.instance$BuiltInRegistries$ITEM, Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$ITEM, resourceLocation))).get();
Set<Object> tags = (Set<Object>) Reflections.field$Holder$Reference$tags.get(mcHolder);
for (Object tag : tags) {
Key tagId = Key.of(Reflections.field$TagKey$location.get(tag).toString());
VANILLA_ITEM_TAGS.computeIfAbsent(tagId, (key) -> new ArrayList<>()).add(holder);
}
}
}

View File

@@ -27,10 +27,15 @@ public abstract class BukkitItemFactory extends ItemFactory<CraftEngine, RTagIte
return new UniversalItemFactory(plugin);
}
case "1.20.5", "1.20.6",
"1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5",
"1.22", "1.22.1" -> {
"1.21", "1.21.1", "1.21.2", "1.21.3" -> {
return new ComponentItemFactory(plugin);
}
case "1.21.4" -> {
return new ComponentItemFactory1_21_4(plugin);
}
case "1.21.5", "1.22", "1.22.1" -> {
return new ComponentItemFactory1_21_5(plugin);
}
default -> throw new IllegalStateException("Unsupported server version: " + plugin.serverVersion());
}
}

View File

@@ -25,30 +25,8 @@ import java.util.function.Function;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory extends BukkitItemFactory {
private final BiConsumer<ItemWrapper<ItemStack>, Integer> customModelDataSetter;
private final Function<ItemWrapper<ItemStack>, Optional<Integer>> customModelDataGetter;
public ComponentItemFactory(CraftEngine plugin) {
super(plugin);
this.customModelDataSetter = VersionHelper.isVersionNewerThan1_21_4() ?
((item, data) -> item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA,
Map.of("floats", List.of(data.floatValue())))) : ((item, data) -> item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, data));
this.customModelDataGetter = VersionHelper.isVersionNewerThan1_21_4() ?
(item) -> {
Optional<Object> optional = ComponentType.encodeJava(ComponentKeys.CUSTOM_MODEL_DATA, item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA));
if (optional.isEmpty()) return Optional.empty();
@SuppressWarnings("unchecked")
Map<String, Object> data = (Map<String, Object>) optional.get();
@SuppressWarnings("unchecked")
List<Float> floats = (List<Float>) data.get("floats");
if (floats == null || floats.isEmpty()) return Optional.empty();
return Optional.of((int) Math.floor(floats.get(0)));
} : (item) -> Optional.ofNullable(
(Integer) ComponentType.encodeJava(
ComponentKeys.CUSTOM_MODEL_DATA,
item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA)
).orElse(null)
);
}
@Override
@@ -61,14 +39,18 @@ public class ComponentItemFactory extends BukkitItemFactory {
if (data == null) {
item.removeComponent(ComponentKeys.CUSTOM_MODEL_DATA);
} else {
this.customModelDataSetter.accept(item, data);
item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, data);
}
}
@Override
protected Optional<Integer> customModelData(ItemWrapper<ItemStack> item) {
if (!item.hasComponent(ComponentKeys.CUSTOM_MODEL_DATA)) return Optional.empty();
return this.customModelDataGetter.apply(item);
return Optional.ofNullable(
(Integer) ComponentType.encodeJava(
ComponentKeys.CUSTOM_MODEL_DATA,
item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA)
).orElse(null));
}
@Override

View File

@@ -0,0 +1,41 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.saicone.rtag.data.ComponentType;
import net.momirealms.craftengine.core.item.ComponentKeys;
import net.momirealms.craftengine.core.item.ItemWrapper;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory1_21_4 extends ComponentItemFactory {
public ComponentItemFactory1_21_4(CraftEngine plugin) {
super(plugin);
}
@Override
protected Optional<Integer> customModelData(ItemWrapper<ItemStack> item) {
if (!item.hasComponent(ComponentKeys.CUSTOM_MODEL_DATA)) return Optional.empty();
Optional<Object> optional = ComponentType.encodeJava(ComponentKeys.CUSTOM_MODEL_DATA, item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA));
if (optional.isEmpty()) return Optional.empty();
@SuppressWarnings("unchecked")
Map<String, Object> data = (Map<String, Object>) optional.get();
@SuppressWarnings("unchecked")
List<Float> floats = (List<Float>) data.get("floats");
if (floats == null || floats.isEmpty()) return Optional.empty();
return Optional.of((int) Math.floor(floats.get(0)));
}
@Override
protected void customModelData(ItemWrapper<ItemStack> item, Integer data) {
if (data == null) {
item.removeComponent(ComponentKeys.CUSTOM_MODEL_DATA);
} else {
item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, Map.of("floats", List.of(data.floatValue())));
}
}
}

View File

@@ -0,0 +1,82 @@
package net.momirealms.craftengine.bukkit.item.factory;
import com.saicone.rtag.data.ComponentType;
import com.saicone.rtag.tag.TagList;
import com.saicone.rtag.util.ChatComponent;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.core.item.ComponentKeys;
import net.momirealms.craftengine.core.item.ItemWrapper;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@SuppressWarnings("UnstableApiUsage")
public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
public ComponentItemFactory1_21_5(CraftEngine plugin) {
super(plugin);
}
@Override
protected void customName(ItemWrapper<ItemStack> item, String json) {
if (json == null) {
item.removeComponent(ComponentKeys.CUSTOM_NAME);
} else {
item.setComponent(ComponentKeys.CUSTOM_NAME, ChatComponent.toTag(ComponentUtils.jsonToMinecraft(json)));
}
}
@Override
protected Optional<String> customName(ItemWrapper<ItemStack> item) {
if (!item.hasComponent(ComponentKeys.CUSTOM_NAME)) return Optional.empty();
return ComponentType.encodeJava(ComponentKeys.CUSTOM_NAME, item.getComponent(ComponentKeys.ITEM_NAME)).map(ChatComponent::fromTag).map(ComponentUtils::minecraftToJson);
}
@Override
protected void itemName(ItemWrapper<ItemStack> item, String json) {
if (json == null) {
item.removeComponent(ComponentKeys.ITEM_NAME);
} else {
item.setComponent(ComponentKeys.ITEM_NAME, ChatComponent.toTag(ComponentUtils.jsonToMinecraft(json)));
}
}
@Override
protected Optional<String> itemName(ItemWrapper<ItemStack> item) {
if (!item.hasComponent(ComponentKeys.ITEM_NAME)) return Optional.empty();
return ComponentType.encodeJava(ComponentKeys.ITEM_NAME, item.getComponent(ComponentKeys.ITEM_NAME)).map(ChatComponent::fromTag).map(ComponentUtils::minecraftToJson);
}
@Override
protected Optional<List<String>> lore(ItemWrapper<ItemStack> item) {
if (!item.hasComponent(ComponentKeys.LORE)) return Optional.empty();
return ComponentType.encodeJava(
ComponentKeys.LORE,
item.getComponent(ComponentKeys.LORE)
).map(list -> {
List<String> lore = new ArrayList<>();
List<Object> tagList = TagList.getValue(list);
for (Object o : tagList) {
lore.add(ComponentUtils.minecraftToJson(ChatComponent.fromTag(o)));
}
return lore;
});
}
@Override
protected void lore(ItemWrapper<ItemStack> item, List<String> lore) {
if (lore == null || lore.isEmpty()) {
item.removeComponent(ComponentKeys.LORE);
} else {
List<Object> loreTags = new ArrayList<>();
for (String json : lore) {
loreTags.add(ChatComponent.toTag(ComponentUtils.jsonToMinecraft(json)));
}
item.setComponent(ComponentKeys.LORE, TagList.newTag(loreTags));
}
}
}

View File

@@ -561,16 +561,16 @@ public class RecipeEventListener implements Listener {
String renameText;
int maxRepairCost;
int previousCost;
//int previousCost;
if (VersionHelper.isVersionNewerThan1_21_2()) {
AnvilView anvilView = event.getView();
renameText = anvilView.getRenameText();
maxRepairCost = anvilView.getMaximumRepairCost();
previousCost = anvilView.getRepairCost();
//previousCost = anvilView.getRepairCost();
} else {
renameText = LegacyInventoryUtils.getRenameText(inventory);
maxRepairCost = LegacyInventoryUtils.getMaxRepairCost(inventory);
previousCost = LegacyInventoryUtils.getRepairCost(inventory);
//previousCost = LegacyInventoryUtils.getRepairCost(inventory);
}
int repairCost = actualConsumedAmount;

View File

@@ -40,7 +40,7 @@ public class DebugItemDataCommand extends BukkitCommandFeature<CommandSender> {
for (String text : readableList) {
joiner.add(text);
}
plugin().senderFactory().wrap(context.sender()).sendMessage(AdventureHelper.miniMessage(joiner.toString()));
plugin().senderFactory().wrap(context.sender()).sendMessage(AdventureHelper.miniMessage().deserialize(joiner.toString()));
});
}

View File

@@ -1,31 +1,27 @@
package net.momirealms.craftengine.bukkit.util;
import com.google.gson.JsonElement;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.VersionHelper;
public class ComponentUtils {
private ComponentUtils() {}
public static Object adventureToMinecraft(Component component) {
String json = AdventureHelper.componentToJson(component);
return jsonToMinecraft(json);
return jsonElementToMinecraft(AdventureHelper.componentToJsonElement(component));
}
public static Object jsonElementToMinecraft(JsonElement json) {
return FastNMS.INSTANCE.method$Component$Serializer$fromJson(json);
}
public static Object jsonToMinecraft(String json) {
if (VersionHelper.isVersionNewerThan1_20_5()) {
try {
return Reflections.method$Component$Serializer$fromJson.invoke(null, json, Reflections.instance$MinecraftRegistry);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
} else {
try {
return Reflections.method$CraftChatMessage$fromJSON.invoke(null, json);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
return FastNMS.INSTANCE.method$Component$Serializer$fromJson(json);
}
public static String minecraftToJson(Object component) {
return FastNMS.INSTANCE.method$Component$Serializer$toJson(component);
}
}

View File

@@ -404,12 +404,18 @@ public class Reflections {
BukkitReflectionUtils.assembleMCClass("core.HolderLookup$b")
);
public static final Method method$Component$Serializer$fromJson = ReflectionUtils.getMethod(
public static final Method method$Component$Serializer$fromJson0 = ReflectionUtils.getMethod(
clazz$Component$Serializer,
new String[] { "fromJson" },
String.class, clazz$HolderLookup$Provider
);
public static final Method method$Component$Serializer$fromJson1 = ReflectionUtils.getMethod(
clazz$Component$Serializer,
new String[] { "fromJson" },
JsonElement.class, clazz$HolderLookup$Provider
);
public static final Method method$Component$Serializer$toJson = ReflectionUtils.getMethod(
clazz$Component$Serializer,
new String[] { "toJson" },