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

修改datamodifier为itemprocessor

This commit is contained in:
XiaoMoMi
2025-12-26 21:44:05 +08:00
parent b51ee588a8
commit dbb7834e0b
37 changed files with 156 additions and 104 deletions

View File

@@ -17,6 +17,7 @@ import java.util.Map;
import java.util.Optional;
public class ArgumentsProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:arguments");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
public static final String ARGUMENTS_TAG = "craftengine:arguments";
private final Map<String, TextProvider> arguments;

View File

@@ -15,6 +15,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
public class AttributeModifiersProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:attribute_modifiers");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
public static final Map<Key, Key> CONVERTOR = new HashMap<>();
private static final Object[] NBT_PATH = new Object[]{"AttributeModifiers"};

View File

@@ -17,6 +17,7 @@ import java.util.Locale;
import java.util.Map;
public class BlockStateProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:blockstate");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] NBT_PATH = new Object[]{"BlockStateTag"};
private final LazyReference<Map<String, String>> wrapper;

View File

@@ -13,6 +13,7 @@ import java.util.List;
import java.util.Map;
public class ComponentsProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:components");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final List<Pair<Key, Tag>> arguments;
private CompoundTag customData = null;

View File

@@ -17,6 +17,7 @@ import java.util.Map;
import java.util.function.Predicate;
public class ConditionalProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:conditional");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Predicate<Context> condition;
private final ItemProcessor<I>[] modifiers;

View File

@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.jetbrains.annotations.Nullable;
public class CustomModelDataProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:custom_model_data");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final int argument;

View File

@@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
public class CustomNameProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:custom_name");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] NBT_PATH = new Object[]{"display", "Name"};
private final String argument;

View File

@@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
public class DyedColorProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:dyed_color");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] NBT_PATH = new Object[]{"display", "color"};
private final Color color;

View File

@@ -14,6 +14,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
public class EnchantmentsProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:enchantments");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] STORED_ENCHANTMENTS = new Object[] {"StoredEnchantments"};
private static final Object[] ENCHANTMENTS = new Object[] {"Enchantments"};

View File

@@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.item.processor;
import net.momirealms.craftengine.core.item.DataComponentKeys;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.item.setting.EquipmentData;
import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
@@ -10,6 +11,8 @@ import org.jetbrains.annotations.Nullable;
import java.util.Optional;
public class EquippableAssetIdProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:equippable_asset_id");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Key assetId;
public EquippableAssetIdProcessor(Key assetsId) {
@@ -39,4 +42,13 @@ public class EquippableAssetIdProcessor<I> implements SimpleNetworkItemProcessor
public @Nullable Key componentType(Item<I> item, ItemBuildContext context) {
return DataComponentKeys.EQUIPPABLE;
}
private static class Factory<I> implements ItemProcessorFactory<I> {
@Override
public ItemProcessor<I> create(Object arg) {
String id = arg.toString();
return new EquippableAssetIdProcessor<>(Key.of(id));
}
}
}

View File

@@ -12,6 +12,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Map;
public class EquippableProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:equippable");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final EquipmentData data;

View File

@@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.*;
public class ExternalSourceProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:external");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final ThreadLocal<Set<Dependency>> BUILD_STACK = ThreadLocal.withInitial(LinkedHashSet::new);
private final String id;

View File

@@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Map;
public class FoodProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:food");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final int nutrition;
private final float saturation;

View File

@@ -16,6 +16,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
public class HideTooltipProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:hide_tooltip");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
public static final Map<Key, Integer> TO_LEGACY;
public static final List<Key> COMPONENTS = List.of(

View File

@@ -2,10 +2,13 @@ package net.momirealms.craftengine.core.item.processor;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.util.Key;
public class IdProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:id");
public static final String CRAFT_ENGINE_ID = "craftengine:id";
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Key argument;
public IdProcessor(Key argument) {
@@ -21,4 +24,13 @@ public class IdProcessor<I> implements ItemProcessor<I> {
item.customId(this.argument);
return item;
}
private static class Factory<I> implements ItemProcessorFactory<I> {
@Override
public ItemProcessor<I> create(Object arg) {
String id = arg.toString();
return new IdProcessor<>(Key.of(id));
}
}
}

View File

@@ -5,9 +5,11 @@ import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.jetbrains.annotations.Nullable;
public class ItemModelProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:item_model");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Key data;
@@ -21,6 +23,7 @@ public class ItemModelProcessor<I> implements SimpleNetworkItemProcessor<I> {
@Override
public Item<I> apply(Item<I> item, ItemBuildContext context) {
if (!VersionHelper.isOrAbove1_21_2()) return item;
return item.itemModel(this.data.asString());
}

View File

@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
public class ItemNameProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:item_name");;
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] NBT_PATH = new Object[]{"display", "Name"};
private final String argument;

View File

@@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.item.processor;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.sparrow.nbt.CompoundTag;
public interface ItemProcessor<I> {

View File

@@ -20,53 +20,56 @@ import java.util.function.Consumer;
public final class ItemProcessors {
private ItemProcessors() {}
public static final Key ITEM_MODEL = Key.of("craftengine:item_model");
public static final Key OVERWRITABLE_ITEM_MODEL = Key.of("craftengine:overwritable_item_model");
public static final Key ID = Key.of("craftengine:id");
public static final Key HIDE_TOOLTIP = Key.of("craftengine:hide_tooltip");
public static final Key FOOD = Key.of("craftengine:food");
public static final Key EXTERNAL = Key.of("craftengine:external");
public static final Key EQUIPPABLE = Key.of("craftengine:equippable");
public static final Key EQUIPPABLE_ASSET_ID = Key.of("craftengine:equippable_asset_id");
public static final Key ENCHANTMENT = Key.of("craftengine:enchantment");
public static final Key ENCHANTMENTS = Key.of("craftengine:enchantments");
public static final Key DYED_COLOR = Key.of("craftengine:dyed_color");
public static final Key DISPLAY_NAME = Key.of("craftengine:display_name");
public static final Key CUSTOM_NAME = Key.of("craftengine:custom_name");
public static final Key CUSTOM_MODEL_DATA = Key.of("craftengine:custom_model_data");
public static final Key OVERWRITABLE_CUSTOM_MODEL_DATA = Key.of("craftengine:overwritable_custom_model_data");
public static final Key COMPONENTS = Key.of("craftengine:components");
public static final Key COMPONENT = Key.of("craftengine:component");
public static final Key ATTRIBUTE_MODIFIERS = Key.of("craftengine:attribute_modifiers");
public static final Key ATTRIBUTES = Key.of("craftengine:attributes");
public static final Key ARGUMENTS = Key.of("craftengine:arguments");
public static final Key VERSION = Key.of("craftengine:version");
public static final Key PDC = Key.of("craftengine:pdc");
public static final Key ITEM_NAME = Key.of("craftengine:item_name");
public static final Key OVERWRITABLE_ITEM_NAME = Key.of("craftengine:overwritable_item_name");
public static final Key JUKEBOX_PLAYABLE = Key.of("craftengine:jukebox_playable");
public static final Key REMOVE_COMPONENTS = Key.of("craftengine:remove_components");
public static final Key REMOVE_COMPONENT = Key.of("craftengine:remove_component");
public static final Key TAGS = Key.of("craftengine:tags");
public static final Key NBT = Key.of("craftengine:nbt");
public static final Key TOOLTIP_STYLE = Key.of("craftengine:tooltip_style");
public static final Key TRIM = Key.of("craftengine:trim");
public static final Key LORE = Key.of("craftengine:lore");
public static final Key UNBREAKABLE = Key.of("craftengine:unbreakable");
public static final Key DYNAMIC_LORE = Key.of("craftengine:dynamic_lore");
public static final Key OVERWRITABLE_LORE = Key.of("craftengine:overwritable_lore");
public static final Key MAX_DAMAGE = Key.of("craftengine:max_damage");
public static final Key BLOCK_STATE = Key.of("craftengine:block_state");
public static final Key CONDITIONAL = Key.of("craftengine:conditional");
public static final Key CONDITION = Key.of("craftengine:condition");
public static final ItemProcessorType<?> ITEM_MODEL = register(ItemModelProcessor.ID, ItemModelProcessor.FACTORY, VersionHelper.isOrAbove1_21_2());
public static final ItemProcessorType<?> ARGUMENTS = register(ArgumentsProcessor.ID, ArgumentsProcessor.FACTORY);
public static final ItemProcessorType<?> OVERWRITABLE_ITEM_MODEL = register(OverwritableItemModelProcessor.ID, OverwritableItemModelProcessor.FACTORY, VersionHelper.isOrAbove1_21_2());
public static final ItemProcessorType<?> ID = register(IdProcessor.ID, IdProcessor.FACTORY);
public static final ItemProcessorType<?> HIDE_TOOLTIP = register(HideTooltipProcessor.ID, HideTooltipProcessor.FACTORY);
public static final ItemProcessorType<?> FOOD = register(FoodProcessor.ID, FoodProcessor.FACTORY, VersionHelper.isOrAbove1_20_5());
public static final ItemProcessorType<?> EXTERNAL = register(ExternalSourceProcessor.ID, ExternalSourceProcessor.FACTORY);
public static final ItemProcessorType<?> EQUIPPABLE = register(EquippableProcessor.ID, EquippableProcessor.FACTORY, VersionHelper.isOrAbove1_21_2());
public static final ItemProcessorType<?> EQUIPPABLE_ASSET_ID = register(EquippableAssetIdProcessor.ID, EquippableAssetIdProcessor.FACTORY, VersionHelper.isOrAbove1_21_2());
public static final ItemProcessorType<?> ENCHANTMENTS = register(EnchantmentsProcessor.ID, EnchantmentsProcessor.FACTORY);
public static final ItemProcessorType<?> ENCHANTMENT = register(Key.of("craftengine:enchantment"), EnchantmentsProcessor.FACTORY);
public static final ItemProcessorType<?> DYED_COLOR = register(DyedColorProcessor.ID, DyedColorProcessor.FACTORY);
public static final ItemProcessorType<?> DISPLAY_NAME = register(Key.of("craftengine:display_name"), ItemNameProcessor.FACTORY);
public static final ItemProcessorType<?> ITEM_NAME = register(ItemNameProcessor.ID, ItemNameProcessor.FACTORY);
public static final ItemProcessorType<?> CUSTOM_NAME = register(CustomNameProcessor.ID, CustomNameProcessor.FACTORY);
public static final ItemProcessorType<?> CUSTOM_MODEL_DATA = register(CustomModelDataProcessor.ID, CustomModelDataProcessor.FACTORY);
public static final ItemProcessorType<?> OVERWRITABLE_CUSTOM_MODEL_DATA = register(OverwritableCustomModelDataProcessor.ID, OverwritableCustomModelDataProcessor.FACTORY);
public static final ItemProcessorType<?> COMPONENTS = register(ComponentsProcessor.ID, ComponentsProcessor.FACTORY, VersionHelper.isOrAbove1_20_5());
public static final ItemProcessorType<?> COMPONENT = register(Key.of("craftengine:component"), ComponentsProcessor.FACTORY, VersionHelper.isOrAbove1_20_5());
public static final ItemProcessorType<?> ATTRIBUTE_MODIFIERS = register(AttributeModifiersProcessor.ID, AttributeModifiersProcessor.FACTORY);
public static final ItemProcessorType<?> ATTRIBUTES = register(Key.of("craftengine:attributes"), AttributeModifiersProcessor.FACTORY);
public static final ItemProcessorType<?> PDC = register(PDCProcessor.ID, PDCProcessor.FACTORY);
public static final ItemProcessorType<?> OVERWRITABLE_ITEM_NAME = register(OverwritableItemNameProcessor.ID, OverwritableItemNameProcessor.FACTORY);
public static final ItemProcessorType<?> JUKEBOX_PLAYABLE = register(JukeboxSongProcessor.ID, JukeboxSongProcessor.FACTORY, VersionHelper.isOrAbove1_21());
public static final ItemProcessorType<?> REMOVE_COMPONENTS = register(RemoveComponentProcessor.ID, RemoveComponentProcessor.FACTORY, VersionHelper.isOrAbove1_20_5());
public static final ItemProcessorType<?> REMOVE_COMPONENT = register(Key.of("craftengine:remove_component"), RemoveComponentProcessor.FACTORY, VersionHelper.isOrAbove1_20_5());
public static final ItemProcessorType<?> TAGS = register(TagsProcessor.ID, TagsProcessor.FACTORY);
public static final ItemProcessorType<?> NBT = register(Key.of("craftengine:nbt"), TagsProcessor.FACTORY);
public static final ItemProcessorType<?> TOOLTIP_STYLE = register(TooltipStyleProcessor.ID, TooltipStyleProcessor.FACTORY, VersionHelper.isOrAbove1_21_2());
public static final ItemProcessorType<?> TRIM = register(TrimProcessor.ID, TrimProcessor.FACTORY);
public static final ItemProcessorType<?> LORE = register(LoreProcessor.ID, LoreProcessor.FACTORY);
public static final ItemProcessorType<?> UNBREAKABLE = register(UnbreakableProcessor.ID, UnbreakableProcessor.FACTORY);
public static final ItemProcessorType<?> DYNAMIC_LORE = register(DynamicLoreProcessor.ID, DynamicLoreProcessor.FACTORY);
public static final ItemProcessorType<?> OVERWRITABLE_LORE = register(OverwritableLoreProcessor.ID, OverwritableLoreProcessor.FACTORY);
public static final ItemProcessorType<?> MAX_DAMAGE = register(MaxDamageProcessor.ID, MaxDamageProcessor.FACTORY, VersionHelper.isOrAbove1_20_5());
public static final ItemProcessorType<?> BLOCK_STATE = register(BlockStateProcessor.ID, BlockStateProcessor.FACTORY);
public static final ItemProcessorType<?> CONDITIONAL = register(ConditionalProcessor.ID, ConditionalProcessor.FACTORY, VersionHelper.PREMIUM);
public static final ItemProcessorType<?> CONDITION = register(Key.of("craftengine:condition"), ConditionalProcessor.FACTORY, VersionHelper.PREMIUM);
public static <T> ItemProcessorType<T> register(Key key, ItemProcessorFactory<T> factory) {
ItemProcessorType<T> type = new ItemProcessorType<>(key, factory);
((WritableRegistry<ItemProcessorFactory<?>>) BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY)
.register(ResourceKey.create(Registries.ITEM_DATA_MODIFIER_FACTORY.location(), key), factory);
((WritableRegistry<ItemProcessorType<?>>) BuiltInRegistries.ITEM_PROCESSOR_TYPE)
.register(ResourceKey.create(Registries.ITEM_PROCESSOR_TYPE.location(), key), type);
return type;
}
private static <T> ItemProcessorType<T> register(Key key, ItemProcessorFactory<T> factory, boolean condition) {
return register(key, condition ? factory : null);
}
@SuppressWarnings("unchecked")
public static <I> void applyDataModifiers(Map<String, Object> dataSection, Consumer<ItemProcessor<I>> callback) {
ExceptionCollector<LocalizedResourceConfigException> errorCollector = new ExceptionCollector<>();
@@ -74,15 +77,13 @@ public final class ItemProcessors {
for (Map.Entry<String, Object> dataEntry : dataSection.entrySet()) {
Object value = dataEntry.getValue();
if (value == null) continue;
String key = dataEntry.getKey();
int idIndex = key.indexOf('#');
if (idIndex != -1)
key = key.substring(0, idIndex);
if (key.contains("-"))
key = key.replace("-", "_");
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(key, Key.DEFAULT_NAMESPACE))).ifPresent(factory -> {
String key = processKey(dataEntry.getKey());
Optional.ofNullable(BuiltInRegistries.ITEM_PROCESSOR_TYPE.getValue(Key.withDefaultNamespace(key, Key.DEFAULT_NAMESPACE))).ifPresent(processorType -> {
try {
callback.accept((ItemProcessor<I>) factory.create(value));
ItemProcessorFactory<?> factory = processorType.factory();
if (factory != null) {
callback.accept((ItemProcessor<I>) factory.create(value));
}
} catch (LocalizedResourceConfigException e) {
errorCollector.add(e);
}
@@ -92,54 +93,55 @@ public final class ItemProcessors {
errorCollector.throwIfPresent();
}
public static void init() {}
public static String processKey(String key) {
if (key == null) return null;
int len = key.length();
if (len == 0) return key;
static {
register(EXTERNAL, ExternalSourceProcessor.FACTORY);
register(LORE, LoreProcessor.FACTORY);
register(DYNAMIC_LORE, DynamicLoreProcessor.FACTORY);
register(OVERWRITABLE_LORE, OverwritableLoreProcessor.FACTORY);
register(DYED_COLOR, DyedColorProcessor.FACTORY);
register(TAGS, TagsProcessor.FACTORY);
register(NBT, TagsProcessor.FACTORY);
register(ATTRIBUTE_MODIFIERS, AttributeModifiersProcessor.FACTORY);
register(ATTRIBUTES, AttributeModifiersProcessor.FACTORY);
register(CUSTOM_MODEL_DATA, CustomModelDataProcessor.FACTORY);
register(UNBREAKABLE, UnbreakableProcessor.FACTORY);
register(ENCHANTMENT, EnchantmentsProcessor.FACTORY);
register(ENCHANTMENTS, EnchantmentsProcessor.FACTORY);
register(TRIM, TrimProcessor.FACTORY);
register(HIDE_TOOLTIP, HideTooltipProcessor.FACTORY);
register(ARGUMENTS, ArgumentsProcessor.FACTORY);
register(OVERWRITABLE_ITEM_NAME, OverwritableItemNameProcessor.FACTORY);
register(PDC, PDCProcessor.FACTORY);
register(BLOCK_STATE, BlockStateProcessor.FACTORY);
if (VersionHelper.isOrAbove1_20_5()) {
register(CUSTOM_NAME, CustomNameProcessor.FACTORY);
register(ITEM_NAME, ItemNameProcessor.FACTORY);
register(DISPLAY_NAME, ItemNameProcessor.FACTORY);
register(COMPONENTS, ComponentsProcessor.FACTORY);
register(COMPONENT, ComponentsProcessor.FACTORY);
register(REMOVE_COMPONENTS, RemoveComponentProcessor.FACTORY);
register(REMOVE_COMPONENT, RemoveComponentProcessor.FACTORY);
register(FOOD, FoodProcessor.FACTORY);
register(MAX_DAMAGE, MaxDamageProcessor.FACTORY);
} else {
register(CUSTOM_NAME, CustomNameProcessor.FACTORY);
register(ITEM_NAME, CustomNameProcessor.FACTORY);
register(DISPLAY_NAME, CustomNameProcessor.FACTORY);
// 提前扫描确定是否需要处理
boolean hasHash = false;
boolean hasDash = false;
int hashPos = -1;
for (int i = 0; i < len; i++) {
char c = key.charAt(i);
if (c == '#') {
hasHash = true;
hashPos = i;
break;
} else if (c == '-') {
hasDash = true;
}
}
if (VersionHelper.isOrAbove1_21()) {
register(JUKEBOX_PLAYABLE, JukeboxSongProcessor.FACTORY);
// 情况1无需任何处理
if (!hasHash && !hasDash) {
return key;
}
if (VersionHelper.isOrAbove1_21_2()) {
register(TOOLTIP_STYLE, TooltipStyleProcessor.FACTORY);
register(ITEM_MODEL, ItemModelProcessor.FACTORY);
register(EQUIPPABLE, EquippableProcessor.FACTORY);
// 情况2只有替换没有截断
if (!hasHash) {
char[] chars = key.toCharArray();
for (int i = 0; i < len; i++) {
if (chars[i] == '-') {
chars[i] = '_';
}
}
return new String(chars);
}
if (VersionHelper.PREMIUM) {
register(CONDITIONAL, ConditionalProcessor.FACTORY);
register(CONDITION, ConditionalProcessor.FACTORY);
// 情况3需要截断可能有替换
int newLen = hashPos;
char[] result = new char[newLen];
// 只需要复制到 hashPos 位置
for (int i = 0; i < newLen; i++) {
char c = key.charAt(i);
result[i] = (c == '-') ? '_' : c;
}
return new String(result);
}
public static void init() {}
}

View File

@@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.item.processor;
import net.momirealms.craftengine.core.item.DataComponentKeys;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.CompoundTag;

View File

@@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.item.data.JukeboxPlayable;
import net.momirealms.craftengine.core.util.Key;
public class JukeboxSongProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:jukebox_playable");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final JukeboxPlayable song;

View File

@@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
public class MaxDamageProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:max_damage");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final NumberProvider argument;

View File

@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.jetbrains.annotations.Nullable;
public class OverwritableCustomModelDataProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:overwritable_custom_model_data");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final int argument;

View File

@@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
public class OverwritableItemModelProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:overwritable_item_model");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Key data;

View File

@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.util.VersionHelper;
import org.jetbrains.annotations.Nullable;
public class OverwritableItemNameProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:overwritable_item_name");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final ItemNameProcessor<I> modifier;

View File

@@ -14,6 +14,7 @@ import java.util.Map;
import java.util.Optional;
public class PDCProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:pdc");
public static final String BUKKIT_PDC = "PublicBukkitValues";
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final CompoundTag data;

View File

@@ -13,6 +13,7 @@ import java.util.Collections;
import java.util.List;
public class RemoveComponentProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:remove_components");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final List<String> arguments;

View File

@@ -9,6 +9,7 @@ import java.util.LinkedHashMap;
import java.util.Map;
public class TagsProcessor<I> implements ItemProcessor<I> {
public static final Key ID = Key.of("craftengine:tags");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Map<String, Object> arguments;

View File

@@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable;
public class TooltipStyleProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:tooltip_style");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private final Key argument;

View File

@@ -13,6 +13,7 @@ import java.util.Locale;
import java.util.Map;
public class TrimProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:trim");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] NBT_PATH = new Object[] {"Trim"};
private final Key material;

View File

@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.jetbrains.annotations.Nullable;
public class UnbreakableProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:unbreakable");
public static final ItemProcessorFactory<?> FACTORY = new Factory<>();
private static final Object[] NBT_PATH = new Object[]{"Unbreakable"};
private final boolean argument;

View File

@@ -5,7 +5,6 @@ import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.item.processor.ItemProcessor;
import net.momirealms.craftengine.core.item.processor.ItemProcessors;
import net.momirealms.craftengine.core.item.processor.SimpleNetworkItemProcessor;
import net.momirealms.craftengine.core.util.Key;
@@ -14,6 +13,7 @@ import java.util.Map;
import java.util.Optional;
public final class DynamicLoreProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:dynamic_lore");
public static final Factory<?> FACTORY = new Factory<>();
public static final String CONTEXT_TAG_KEY = "craftengine:display_context";
private final Map<String, LoreProcessor<I>> displayContexts;

View File

@@ -6,7 +6,6 @@ import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.item.processor.ItemProcessor;
import net.momirealms.craftengine.core.item.processor.ItemProcessors;
import net.momirealms.craftengine.core.item.processor.SimpleNetworkItemProcessor;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.text.minimessage.FormattedLine;
@@ -20,7 +19,8 @@ import java.util.stream.Stream;
public sealed interface LoreProcessor<I> extends SimpleNetworkItemProcessor<I>
permits LoreProcessor.EmptyLoreProcessor, LoreProcessor.CompositeLoreProcessor, LoreProcessor.DoubleLoreProcessor, LoreProcessor.SingleLoreProcessor {
Factory<?> FACTORY = new Factory<>();
ItemProcessorFactory<?> FACTORY = new Factory<>();
Key ID = Key.of("craftengine:lore");
@Override
@Nullable

View File

@@ -5,13 +5,13 @@ import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.item.processor.ItemProcessor;
import net.momirealms.craftengine.core.item.processor.ItemProcessors;
import net.momirealms.craftengine.core.item.processor.SimpleNetworkItemProcessor;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.CompoundTag;
public final class OverwritableLoreProcessor<I> implements SimpleNetworkItemProcessor<I> {
public static final Key ID = Key.of("craftengine:overwritable_lore");
public static final Factory<?> FACTORY = new Factory<>();
private final LoreProcessor<I> loreProcessor;

View File

@@ -53,7 +53,7 @@ public class EventConditions {
public static <CTX extends Context> Condition<CTX> fromMap(Map<String, Object> map) {
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.event.condition.missing_type");
Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE);
if (key.value().charAt(0) == '!') {
if (type.charAt(0) == '!') {
ConditionFactory<Context> factory = BuiltInRegistries.EVENT_CONDITION_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1)));
if (factory == null) {
throw new LocalizedResourceConfigException("warning.config.event.condition.invalid_type", type);

View File

@@ -8,9 +8,9 @@ import net.momirealms.craftengine.core.block.properties.PropertyFactory;
import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehaviorType;
import net.momirealms.craftengine.core.entity.furniture.element.FurnitureElementConfigFactory;
import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfigFactory;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
import net.momirealms.craftengine.core.item.processor.ItemProcessorType;
import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe;
import net.momirealms.craftengine.core.item.recipe.Recipe;
import net.momirealms.craftengine.core.item.recipe.RecipeSerializer;
@@ -53,7 +53,7 @@ import net.momirealms.craftengine.core.util.ResourceKey;
public class BuiltInRegistries {
public static final Registry<CustomBlock> BLOCK = createDynamicBoundRegistry(Registries.BLOCK, 512);
public static final Registry<BlockBehaviorType> BLOCK_BEHAVIOR_TYPE = createConstantBoundRegistry(Registries.BLOCK_BEHAVIOR_TYPE, 64);
public static final Registry<ItemProcessorFactory<?>> ITEM_DATA_MODIFIER_FACTORY = createConstantBoundRegistry(Registries.ITEM_DATA_MODIFIER_FACTORY, 64);
public static final Registry<ItemProcessorType<?>> ITEM_PROCESSOR_TYPE = createConstantBoundRegistry(Registries.ITEM_PROCESSOR_TYPE, 64);
public static final Registry<ItemBehaviorFactory> ITEM_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.ITEM_BEHAVIOR_FACTORY, 64);
public static final Registry<PropertyFactory> PROPERTY_FACTORY = createConstantBoundRegistry(Registries.PROPERTY_FACTORY, 16);
public static final Registry<LootFunctionFactory<?>> LOOT_FUNCTION_FACTORY = createConstantBoundRegistry(Registries.LOOT_FUNCTION_FACTORY, 32);

View File

@@ -8,9 +8,9 @@ import net.momirealms.craftengine.core.block.properties.PropertyFactory;
import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehaviorType;
import net.momirealms.craftengine.core.entity.furniture.element.FurnitureElementConfigFactory;
import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfigFactory;
import net.momirealms.craftengine.core.item.ItemProcessorFactory;
import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
import net.momirealms.craftengine.core.item.processor.ItemProcessorType;
import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe;
import net.momirealms.craftengine.core.item.recipe.Recipe;
import net.momirealms.craftengine.core.item.recipe.RecipeSerializer;
@@ -54,7 +54,7 @@ import net.momirealms.craftengine.core.util.ResourceKey;
public class Registries {
public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root");
public static final ResourceKey<Registry<CustomBlock>> BLOCK = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block"));
public static final ResourceKey<Registry<ItemProcessorFactory<?>>> ITEM_DATA_MODIFIER_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_data_modifier_factory"));
public static final ResourceKey<Registry<ItemProcessorType<?>>> ITEM_PROCESSOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_processor_type"));
public static final ResourceKey<Registry<PropertyFactory>> PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory"));
public static final ResourceKey<Registry<BlockBehaviorType>> BLOCK_BEHAVIOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_type"));
public static final ResourceKey<Registry<ItemBehaviorFactory>> ITEM_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory"));