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-08-17 22:44:12 +08:00
parent 69b9b164c9
commit b7586310f9
26 changed files with 492 additions and 12 deletions

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.item.updater.ItemUpdateConfig;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
import net.momirealms.craftengine.core.plugin.context.function.Function;
@@ -24,6 +25,7 @@ public abstract class AbstractCustomItem<I> implements CustomItem<I> {
protected final List<ItemBehavior> behaviors;
protected final ItemSettings settings;
protected final Map<EventTrigger, List<Function<PlayerOptionalContext>>> events;
protected final ItemUpdateConfig updater;
@SuppressWarnings("unchecked")
public AbstractCustomItem(boolean isVanillaItem, UniqueKey id, Key material, Key clientBoundMaterial,
@@ -31,7 +33,8 @@ public abstract class AbstractCustomItem<I> implements CustomItem<I> {
List<ItemDataModifier<I>> modifiers,
List<ItemDataModifier<I>> clientBoundModifiers,
ItemSettings settings,
Map<EventTrigger, List<Function<PlayerOptionalContext>>> events) {
Map<EventTrigger, List<Function<PlayerOptionalContext>>> events,
ItemUpdateConfig updater) {
this.isVanillaItem = isVanillaItem;
this.id = id;
this.material = material;
@@ -43,6 +46,7 @@ public abstract class AbstractCustomItem<I> implements CustomItem<I> {
this.clientBoundModifiers = clientBoundModifiers.toArray(new ItemDataModifier[0]);
this.behaviors = List.copyOf(behaviors);
this.settings = settings;
this.updater = updater;
}
@Override
@@ -52,6 +56,11 @@ public abstract class AbstractCustomItem<I> implements CustomItem<I> {
}
}
@Override
public Optional<ItemUpdateConfig> updater() {
return Optional.ofNullable(this.updater);
}
@Override
public Key id() {
return this.id.key();

View File

@@ -6,6 +6,10 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.behavior.ItemBehaviors;
import net.momirealms.craftengine.core.item.equipment.*;
import net.momirealms.craftengine.core.item.modifier.*;
import net.momirealms.craftengine.core.item.updater.ItemUpdateConfig;
import net.momirealms.craftengine.core.item.updater.ItemUpdateResult;
import net.momirealms.craftengine.core.item.updater.ItemUpdater;
import net.momirealms.craftengine.core.item.updater.ItemUpdaters;
import net.momirealms.craftengine.core.pack.AbstractPackManager;
import net.momirealms.craftengine.core.pack.LoadingSequence;
import net.momirealms.craftengine.core.pack.Pack;
@@ -30,6 +34,7 @@ import org.incendo.cloud.type.Either;
import java.nio.file.Path;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Stream;
public abstract class AbstractItemManager<I> extends AbstractModelGenerator implements ItemManager<I> {
@@ -144,6 +149,19 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
return Optional.ofNullable(this.customItemsByPath.get(path));
}
@Override
public ItemUpdateResult updateItem(Item<I> item, Supplier<ItemBuildContext> contextSupplier) {
Optional<CustomItem<I>> optionalCustomItem = item.getCustomItem();
if (optionalCustomItem.isPresent()) {
CustomItem<I> customItem = optionalCustomItem.get();
Optional<ItemUpdateConfig> updater = customItem.updater();
if (updater.isPresent()) {
return updater.get().update(item, contextSupplier);
}
}
return new ItemUpdateResult(item, false, false);
}
@Override
public boolean addCustomItem(CustomItem<I> customItem) {
Key id = customItem.id();
@@ -417,6 +435,25 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
behaviors = Collections.emptyList();
}
// 如果有物品更新器
if (section.containsKey("updater")) {
Map<String, Object> updater = ResourceConfigUtils.getAsMap(section.get("updater"), "updater");
List<ItemUpdateConfig.Version> versions = new ArrayList<>(2);
for (Map.Entry<String, Object> entry : updater.entrySet()) {
try {
int version = Integer.parseInt(entry.getKey());
versions.add(new ItemUpdateConfig.Version(
version,
ResourceConfigUtils.parseConfigAsList(entry.getValue(), map -> ItemUpdaters.fromMap(id, map)).toArray(new ItemUpdater[0])
));
} catch (NumberFormatException ignored) {
}
}
ItemUpdateConfig config = new ItemUpdateConfig(versions);
itemBuilder.updater(config);
itemBuilder.dataModifier(new ItemVersionModifier<>(config.maxVersion()));
}
// 构建自定义物品
CustomItem<I> customItem = itemBuilder
.isVanillaItem(isVanillaItem)

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.item.updater.ItemUpdateConfig;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
import net.momirealms.craftengine.core.plugin.context.function.Function;
@@ -11,6 +12,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public interface CustomItem<I> extends BuildableItem<I> {
@@ -32,6 +34,8 @@ public interface CustomItem<I> extends BuildableItem<I> {
ItemSettings settings();
Optional<ItemUpdateConfig> updater();
default boolean is(Key tag) {
return settings().tags().contains(tag);
}
@@ -64,6 +68,8 @@ public interface CustomItem<I> extends BuildableItem<I> {
Builder<I> settings(ItemSettings settings);
Builder<I> updater(ItemUpdateConfig updater);
Builder<I> events(Map<EventTrigger, List<Function<PlayerOptionalContext>>> events);
CustomItem<I> build();

View File

@@ -5,6 +5,7 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.equipment.Equipment;
import net.momirealms.craftengine.core.item.recipe.DatapackRecipeResult;
import net.momirealms.craftengine.core.item.recipe.UniqueIdItem;
import net.momirealms.craftengine.core.item.updater.ItemUpdateResult;
import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel;
import net.momirealms.craftengine.core.pack.model.ModernItemModel;
import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator;
@@ -18,6 +19,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.function.Supplier;
public interface ItemManager<T> extends Manageable, ModelGenerator {
@@ -114,4 +116,6 @@ public interface ItemManager<T> extends Manageable, ModelGenerator {
Item<T> applyTrim(Item<T> base, Item<T> addition, Item<T> template, Key pattern);
Item<T> build(DatapackRecipeResult result);
ItemUpdateResult updateItem(Item<T> item, Supplier<ItemBuildContext> contextSupplier);
}

View File

@@ -37,7 +37,7 @@ public class ArgumentsModifier<I> implements ItemDataModifier<I> {
@Override
public Item<I> apply(Item<I> item, ItemBuildContext context) {
if (VersionHelper.isOrAbove1_20_5()) {
CompoundTag customData = (CompoundTag) Optional.ofNullable(item.getSparrowNBTComponent(ComponentKeys.CUSTOM_DATA)).orElse(new CompoundTag());
CompoundTag customData = (CompoundTag) Optional.ofNullable(item.getSparrowNBTComponent(ComponentKeys.CUSTOM_DATA)).orElseGet(CompoundTag::new);
CompoundTag argumentTag = new CompoundTag();
for (Map.Entry<String, TextProvider> entry : this.arguments.entrySet()) {
argumentTag.put(entry.getKey(), new StringTag(entry.getValue().get(context)));

View File

@@ -31,6 +31,7 @@ public final class ItemDataModifiers {
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 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");

View File

@@ -0,0 +1,40 @@
package net.momirealms.craftengine.core.item.modifier;
import net.momirealms.craftengine.core.item.ComponentKeys;
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;
import java.util.Optional;
public class ItemVersionModifier<I> implements ItemDataModifier<I> {
public static final String VERSION_TAG = "craftengine:version";
private final int version;
public ItemVersionModifier(int version) {
this.version = version;
}
public int version() {
return this.version;
}
@Override
public Key type() {
return ItemDataModifiers.VERSION;
}
@Override
public Item<I> apply(Item<I> item, ItemBuildContext context) {
if (VersionHelper.isOrAbove1_20_5()) {
CompoundTag customData = (CompoundTag) Optional.ofNullable(item.getSparrowNBTComponent(ComponentKeys.CUSTOM_DATA)).orElseGet(CompoundTag::new);
customData.putInt(VERSION_TAG, this.version);
item.setNBTComponent(ComponentKeys.CUSTOM_DATA, customData);
} else {
item.setTag(this.version, VERSION_TAG);
}
return item;
}
}

View File

@@ -0,0 +1,67 @@
package net.momirealms.craftengine.core.item.updater;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.modifier.ItemVersionModifier;
import net.momirealms.sparrow.nbt.NumericTag;
import net.momirealms.sparrow.nbt.Tag;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public class ItemUpdateConfig {
private final List<Version> versions;
private final int maxVersion;
public ItemUpdateConfig(List<Version> versions) {
this.versions = new ArrayList<>(versions);
this.versions.sort(Version::compareTo);
int maxVersion = 0;
for (Version version : versions) {
maxVersion = Math.max(maxVersion, version.version);
}
this.maxVersion = maxVersion;
}
public int maxVersion() {
return maxVersion;
}
public ItemUpdateResult update(Item<?> item, Supplier<ItemBuildContext> context) {
Tag versionTag = item.getTag(ItemVersionModifier.VERSION_TAG);
int currentVersion = 0;
if (versionTag instanceof NumericTag numericTag) {
currentVersion = numericTag.getAsInt();
}
if (currentVersion >= this.maxVersion) {
return new ItemUpdateResult(item, false, false);
}
ItemBuildContext buildContext = context.get();
Item<?> orginalItem = item;
for (Version version : this.versions) {
if (currentVersion < version.version) {
item = version.apply(item, buildContext);
}
}
item.setTag(this.maxVersion, ItemVersionModifier.VERSION_TAG);
return new ItemUpdateResult(item, orginalItem != item, true);
}
public record Version(int version, ItemUpdater<?>[] updaters) implements Comparable<Version> {
@SuppressWarnings("unchecked")
public <T> Item<T> apply(Item<T> item, ItemBuildContext context) {
for (ItemUpdater<T> updater : (ItemUpdater<T>[]) updaters) {
item = updater.update(item, context);
}
return item;
}
@Override
public int compareTo(@NotNull ItemUpdateConfig.Version o) {
return Integer.compare(this.version, o.version);
}
}
}

View File

@@ -0,0 +1,6 @@
package net.momirealms.craftengine.core.item.updater;
import net.momirealms.craftengine.core.item.Item;
public record ItemUpdateResult(Item<?> finalItem, boolean replaced, boolean updated) {
}

View File

@@ -0,0 +1,9 @@
package net.momirealms.craftengine.core.item.updater;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
public interface ItemUpdater<I> {
Item<I> update(Item<I> item, ItemBuildContext context);
}

View File

@@ -0,0 +1,10 @@
package net.momirealms.craftengine.core.item.updater;
import net.momirealms.craftengine.core.util.Key;
import java.util.Map;
public interface ItemUpdaterType<I> {
ItemUpdater<I> create(Key item, Map<String, Object> args);
}

View File

@@ -0,0 +1,42 @@
package net.momirealms.craftengine.core.item.updater;
import net.momirealms.craftengine.core.item.updater.impl.ApplyDataOperation;
import net.momirealms.craftengine.core.item.updater.impl.ResetOperation;
import net.momirealms.craftengine.core.item.updater.impl.TransmuteOperation;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Registries;
import net.momirealms.craftengine.core.registry.WritableRegistry;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.ResourceKey;
import java.util.Map;
@SuppressWarnings("unchecked")
public class ItemUpdaters {
public static final Key APPLY_DATA = Key.of("craftengine:apply_data");
public static final Key TRANSMUTE = Key.of("craftengine:transmute");
public static final Key RESET = Key.of("craftengine:reset");
static {
register(APPLY_DATA, ApplyDataOperation.TYPE);
register(TRANSMUTE, TransmuteOperation.TYPE);
register(RESET, ResetOperation.TYPE);
}
public static void register(Key id, ItemUpdaterType<?> type) {
WritableRegistry<ItemUpdaterType<?>> registry = (WritableRegistry<ItemUpdaterType<?>>) BuiltInRegistries.ITEM_UPDATER_TYPE;
registry.register(ResourceKey.create(Registries.ITEM_UPDATER_TYPE.location(), id), type);
}
public static <I> ItemUpdater<I> fromMap(Key item, Map<String, Object> map) {
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.updater.missing_type");
Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE);
ItemUpdaterType<I> updaterType = (ItemUpdaterType<I>) BuiltInRegistries.ITEM_UPDATER_TYPE.getValue(key);
if (updaterType == null) {
throw new LocalizedResourceConfigException("warning.config.item.updater.invalid_type", type);
}
return updaterType.create(item, map);
}
}

View File

@@ -0,0 +1,49 @@
package net.momirealms.craftengine.core.item.updater.impl;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.item.updater.ItemUpdater;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class ApplyDataOperation<I> implements ItemUpdater<I> {
public static final Type<?> TYPE = new Type<>();
private final List<ItemDataModifier<I>> modifiers;
public ApplyDataOperation(List<ItemDataModifier<I>> modifiers) {
this.modifiers = modifiers;
}
@Override
public Item<I> update(Item<I> item, ItemBuildContext context) {
if (this.modifiers != null) {
for (ItemDataModifier<I> modifier : this.modifiers) {
modifier.apply(item, context);
}
}
return item;
}
public static class Type<I> implements ItemUpdaterType<I> {
@SuppressWarnings("unchecked")
@Override
public ItemUpdater<I> create(Key item, Map<String, Object> args) {
List<ItemDataModifier<I>> modifiers = new ArrayList<>();
Map<String, Object> data = ResourceConfigUtils.getAsMap(args.get("data"), "data");
for (Map.Entry<String, Object> entry : data.entrySet()) {
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(entry.getKey(), Key.DEFAULT_NAMESPACE)))
.ifPresent(factory -> modifiers.add((ItemDataModifier<I>) factory.create(entry.getValue())));
}
return new ApplyDataOperation<>(modifiers);
}
}
}

View File

@@ -0,0 +1,63 @@
package net.momirealms.craftengine.core.item.updater.impl;
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.item.ItemManager;
import net.momirealms.craftengine.core.item.updater.ItemUpdater;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.LazyReference;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.VersionHelper;
import java.util.List;
import java.util.Map;
public class ResetOperation<I> implements ItemUpdater<I> {
public static final Type<?> TYPE = new Type<>();
private final LazyReference<CustomItem<I>> item;
private final List<Key> componentsToKeep;
private final List<String[]> tagsToKeep;
public ResetOperation(LazyReference<CustomItem<I>> item, List<Key> componentsToKeep, List<String[]> tagsToKeep) {
this.componentsToKeep = componentsToKeep;
this.tagsToKeep = tagsToKeep;
this.item = item;
}
@Override
public Item<I> update(Item<I> item, ItemBuildContext context) {
Item<I> newItem = this.item.get().buildItem(context);
if (VersionHelper.COMPONENT_RELEASE) {
for (Key component : this.componentsToKeep) {
if (item.hasComponent(component)) {
newItem.setExactComponent(component, item.getExactComponent(component));
}
}
} else {
for (String[] nbt : this.tagsToKeep) {
if (item.hasTag((Object[]) nbt)) {
newItem.setTag(item.getTag((Object[]) nbt), (Object[]) nbt);
}
}
}
return newItem;
}
public static class Type<I> implements ItemUpdaterType<I> {
@Override
public ItemUpdater<I> create(Key item, Map<String, Object> args) {
return new ResetOperation<>(
LazyReference.lazyReference(() -> {
ItemManager<I> itemManager = CraftEngine.instance().itemManager();
return itemManager.getCustomItem(item).orElseThrow();
}),
MiscUtils.getAsStringList(args.get("keep-components")).stream().map(Key::of).toList(),
MiscUtils.getAsStringList(args.get("keep-tags")).stream().map(tag -> tag.split("\\.")).toList()
);
}
}
}

View File

@@ -0,0 +1,32 @@
package net.momirealms.craftengine.core.item.updater.impl;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.updater.ItemUpdater;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import java.util.Map;
public class TransmuteOperation<I> implements ItemUpdater<I> {
public static final Type<?> TYPE = new Type<>();
private final Key newMaterial;
public TransmuteOperation(Key newMaterial) {
this.newMaterial = newMaterial;
}
@Override
public Item<I> update(Item<I> item, ItemBuildContext context) {
return item.transmuteCopy(this.newMaterial, item.count());
}
public static class Type<I> implements ItemUpdaterType<I> {
@Override
public ItemUpdater<I> create(Key item, Map<String, Object> args) {
return new TransmuteOperation<>(Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(args.get("material"), "warning.config.item.updater.transmute.missing_material")));
}
}
}

View File

@@ -151,6 +151,10 @@ public class Config {
protected boolean item$client_bound_model;
protected boolean item$non_italic_tag;
protected boolean item$update_triggers$attack;
protected boolean item$update_triggers$click_in_inventory;
protected boolean item$update_triggers$drop;
protected boolean item$update_triggers$pick_up;
protected String equipment$sacrificed_vanilla_armor$type;
protected Key equipment$sacrificed_vanilla_armor$asset_id;
@@ -359,6 +363,10 @@ public class Config {
// item
item$client_bound_model = config.getBoolean("item.client-bound-model", false);
item$non_italic_tag = config.getBoolean("item.non-italic-tag", false);
item$update_triggers$attack = config.getBoolean("item.update-triggers.attack", false);
item$update_triggers$click_in_inventory = config.getBoolean("item.update-triggers.click-in-inventory", false);
item$update_triggers$drop = config.getBoolean("item.update-triggers.drop", false);
item$update_triggers$pick_up = config.getBoolean("item.update-triggers.pick-up", false);
// block
block$sound_system$enable = config.getBoolean("block.sound-system.enable", true);
@@ -835,6 +843,22 @@ public class Config {
return instance.recipe$ingredient_sources;
}
public static boolean triggerUpdateAttack() {
return instance.item$update_triggers$attack;
}
public static boolean triggerUpdateClick() {
return instance.item$update_triggers$click_in_inventory;
}
public static boolean triggerUpdatePickUp() {
return instance.item$update_triggers$pick_up;
}
public static boolean triggerUpdateDrop() {
return instance.item$update_triggers$drop;
}
public void setObf(boolean enable) {
this.resource_pack$protection$obfuscation$enable = enable;
}

View File

@@ -14,6 +14,7 @@ import net.momirealms.craftengine.core.item.recipe.network.legacy.LegacyRecipe;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.result.PostProcessor;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
import net.momirealms.craftengine.core.loot.LootContext;
import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory;
import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction;
@@ -79,6 +80,7 @@ public class BuiltInRegistries {
public static final Registry<RecipeDisplay.Type> RECIPE_DISPLAY_TYPE = createConstantBoundRegistry(Registries.RECIPE_DISPLAY_TYPE);
public static final Registry<LegacyRecipe.Type> LEGACY_RECIPE_TYPE = createConstantBoundRegistry(Registries.LEGACY_RECIPE_TYPE);
public static final Registry<PostProcessor.Type<?>> RECIPE_POST_PROCESSOR_TYPE = createConstantBoundRegistry(Registries.RECIPE_POST_PROCESSOR_TYPE);
public static final Registry<ItemUpdaterType<?>> ITEM_UPDATER_TYPE = createConstantBoundRegistry(Registries.ITEM_UPDATER_TYPE);
private static <T> Registry<T> createConstantBoundRegistry(ResourceKey<? extends Registry<T>> key) {
return new ConstantBoundRegistry<>(key);

View File

@@ -14,6 +14,7 @@ import net.momirealms.craftengine.core.item.recipe.network.legacy.LegacyRecipe;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.result.PostProcessor;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
import net.momirealms.craftengine.core.loot.LootContext;
import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory;
import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction;
@@ -81,4 +82,5 @@ public class Registries {
public static final ResourceKey<Registry<RecipeDisplay.Type>> RECIPE_DISPLAY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type"));
public static final ResourceKey<Registry<LegacyRecipe.Type>> LEGACY_RECIPE_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("legacy_recipe_type"));
public static final ResourceKey<Registry<PostProcessor.Type<?>>> RECIPE_POST_PROCESSOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_post_processor_type"));
public static final ResourceKey<Registry<ItemUpdaterType<?>>> ITEM_UPDATER_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_updater_type"));
}

View File

@@ -18,7 +18,7 @@ public class SingularPalette<T> implements Palette<T> {
this.idList = idList;
this.listener = listener;
if (!entries.isEmpty()) {
this.entry = entries.get(0);
this.entry = entries.getFirst();
}
}