9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

完善craft remainder和item updater

This commit is contained in:
XiaoMoMi
2025-12-30 00:44:27 +08:00
parent c6239a0394
commit 791e0e7a63
15 changed files with 49 additions and 56 deletions

View File

@@ -13,9 +13,9 @@ import java.util.List;
import java.util.Map;
public final class CraftRemainders {
public static final CraftRemainderType<?> FIXED = register(Key.ce("fixed"), FixedCraftRemainder.FACTORY);
public static final CraftRemainderType<?> RECIPE_BASED = register(Key.ce("recipe_based"), RecipeBasedCraftRemainder.FACTORY);
public static final CraftRemainderType<?> HURT_AND_BREAK = register(Key.ce("hurt_and_break"), HurtAndBreakRemainder.FACTORY);
public static final CraftRemainderType<FixedCraftRemainder> FIXED = register(Key.ce("fixed"), FixedCraftRemainder.FACTORY);
public static final CraftRemainderType<RecipeBasedCraftRemainder> RECIPE_BASED = register(Key.ce("recipe_based"), RecipeBasedCraftRemainder.FACTORY);
public static final CraftRemainderType<HurtAndBreakRemainder> HURT_AND_BREAK = register(Key.ce("hurt_and_break"), HurtAndBreakRemainder.FACTORY);
private CraftRemainders() {}

View File

@@ -49,11 +49,10 @@ public final class ItemUpdateConfig {
return new ItemUpdateResult(item, orginalItem != item, true);
}
public record Version(int version, ItemUpdater<?>[] updaters) implements Comparable<Version> {
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) {
for (ItemUpdater updater : updaters) {
item = updater.update(item, context);
}
return item;

View File

@@ -3,7 +3,7 @@ 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> {
public interface ItemUpdater {
Item<I> update(Item<I> item, ItemBuildContext context);
<I> Item<I> update(Item<I> item, ItemBuildContext context);
}

View File

@@ -4,7 +4,7 @@ import net.momirealms.craftengine.core.util.Key;
import java.util.Map;
public interface ItemUpdaterFactory<I> {
public interface ItemUpdaterFactory<T extends ItemUpdater> {
ItemUpdater<I> create(Key item, Map<String, Object> args);
T create(Key item, Map<String, Object> args);
}

View File

@@ -2,5 +2,5 @@ package net.momirealms.craftengine.core.item.updater;
import net.momirealms.craftengine.core.util.Key;
public record ItemUpdaterType<I>(Key id, ItemUpdaterFactory<I> factory) {
public record ItemUpdaterType<T extends ItemUpdater>(Key id, ItemUpdaterFactory<T> factory) {
}

View File

@@ -14,24 +14,23 @@ import net.momirealms.craftengine.core.util.ResourceKey;
import java.util.Map;
public final class ItemUpdaters {
public static final ItemUpdaterType<?> APPLY_DATA = register(Key.ce("apply_data"), ApplyDataOperation.FACTORY);
public static final ItemUpdaterType<?> TRANSMUTE = register(Key.ce("transmute"), TransmuteOperation.FACTORY);
public static final ItemUpdaterType<?> RESET = register(Key.ce("reset"), ResetOperation.FACTORY);
public static final ItemUpdaterType<ApplyDataOperation> APPLY_DATA = register(Key.ce("apply_data"), ApplyDataOperation.FACTORY);
public static final ItemUpdaterType<TransmuteOperation> TRANSMUTE = register(Key.ce("transmute"), TransmuteOperation.FACTORY);
public static final ItemUpdaterType<ResetOperation> RESET = register(Key.ce("reset"), ResetOperation.FACTORY);
private ItemUpdaters() {}
public static <I> ItemUpdaterType<I> register(Key id, ItemUpdaterFactory<I> factory) {
ItemUpdaterType<I> type = new ItemUpdaterType<>(id, factory);
public static <T extends ItemUpdater> ItemUpdaterType<T> register(Key id, ItemUpdaterFactory<T> factory) {
ItemUpdaterType<T> type = new ItemUpdaterType<>(id, factory);
((WritableRegistry<ItemUpdaterType<?>>) BuiltInRegistries.ITEM_UPDATER_TYPE)
.register(ResourceKey.create(Registries.ITEM_UPDATER_TYPE.location(), id), type);
return type;
}
@SuppressWarnings("unchecked")
public static <I> ItemUpdater<I> fromMap(Key item, Map<String, Object> map) {
public static ItemUpdater fromMap(Key item, Map<String, Object> map) {
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.updater.missing_type");
Key key = Key.ce(type);
ItemUpdaterType<I> updaterType = (ItemUpdaterType<I>) BuiltInRegistries.ITEM_UPDATER_TYPE.getValue(key);
ItemUpdaterType<? extends ItemUpdater> updaterType = BuiltInRegistries.ITEM_UPDATER_TYPE.getValue(key);
if (updaterType == null) {
throw new LocalizedResourceConfigException("warning.config.item.updater.invalid_type", type);
}

View File

@@ -13,16 +13,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public final class ApplyDataOperation<I> implements ItemUpdater<I> {
public static final ItemUpdaterFactory<?> FACTORY = new Factory<>();
private final List<ItemProcessor<I>> modifiers;
public final class ApplyDataOperation implements ItemUpdater {
public static final ItemUpdaterFactory<ApplyDataOperation> FACTORY = new Factory();
private final List<ItemProcessor> modifiers;
public ApplyDataOperation(List<ItemProcessor<I>> modifiers) {
public ApplyDataOperation(List<ItemProcessor> modifiers) {
this.modifiers = modifiers;
}
@Override
public Item<I> update(Item<I> item, ItemBuildContext context) {
public <I> Item<I> update(Item<I> item, ItemBuildContext context) {
if (this.modifiers != null) {
for (ItemProcessor<I> modifier : this.modifiers) {
modifier.apply(item, context);
@@ -31,17 +31,17 @@ public final class ApplyDataOperation<I> implements ItemUpdater<I> {
return item;
}
private static class Factory<I> implements ItemUpdaterFactory<I> {
private static class Factory implements ItemUpdaterFactory<ApplyDataOperation> {
@SuppressWarnings("unchecked")
@Override
public ItemUpdater<I> create(Key item, Map<String, Object> args) {
List<ItemProcessor<I>> modifiers = new ArrayList<>();
public ApplyDataOperation create(Key item, Map<String, Object> args) {
List<ItemProcessor> modifiers = new ArrayList<>();
Map<String, Object> data = ResourceConfigUtils.getAsMap(args.get("data"), "data");
ItemProcessors.applyDataModifiers(data, m -> {
modifiers.add((ItemProcessor<I>) m);
modifiers.add(m);
});
return new ApplyDataOperation<>(modifiers);
return new ApplyDataOperation(modifiers);
}
}
}

View File

@@ -3,7 +3,6 @@ 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.ItemUpdaterFactory;
import net.momirealms.craftengine.core.plugin.CraftEngine;
@@ -15,21 +14,22 @@ import net.momirealms.craftengine.core.util.VersionHelper;
import java.util.List;
import java.util.Map;
public final class ResetOperation<I> implements ItemUpdater<I> {
public static final ItemUpdaterFactory<?> FACTORY = new Factory<>();
private final LazyReference<CustomItem<I>> item;
public final class ResetOperation implements ItemUpdater {
public static final ItemUpdaterFactory<ResetOperation> FACTORY = new Factory();
private final LazyReference<CustomItem<?>> item;
private final List<Key> componentsToKeep;
private final List<String[]> tagsToKeep;
public ResetOperation(LazyReference<CustomItem<I>> item, List<Key> componentsToKeep, List<String[]> tagsToKeep) {
public ResetOperation(LazyReference<CustomItem<?>> item, List<Key> componentsToKeep, List<String[]> tagsToKeep) {
this.componentsToKeep = componentsToKeep;
this.tagsToKeep = tagsToKeep;
this.item = item;
}
@SuppressWarnings("unchecked")
@Override
public Item<I> update(Item<I> item, ItemBuildContext context) {
Item<I> newItem = this.item.get().buildItem(context);
public <I> Item<I> update(Item<I> item, ItemBuildContext context) {
Item<I> newItem = (Item<I>) this.item.get().buildItem(context);
if (VersionHelper.COMPONENT_RELEASE) {
for (Key component : this.componentsToKeep) {
if (item.hasComponent(component)) {
@@ -46,15 +46,12 @@ public final class ResetOperation<I> implements ItemUpdater<I> {
return newItem;
}
private static class Factory<I> implements ItemUpdaterFactory<I> {
private static class Factory implements ItemUpdaterFactory<ResetOperation> {
@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();
}),
public ResetOperation create(Key item, Map<String, Object> args) {
return new ResetOperation(
LazyReference.lazyReference(() -> CraftEngine.instance().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

@@ -9,8 +9,8 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import java.util.Map;
public final class TransmuteOperation<I> implements ItemUpdater<I> {
public static final ItemUpdaterFactory<?> FACTORY = new Factory<>();
public final class TransmuteOperation implements ItemUpdater {
public static final ItemUpdaterFactory<TransmuteOperation> FACTORY = new Factory();
private final Key newMaterial;
public TransmuteOperation(Key newMaterial) {
@@ -18,15 +18,15 @@ public final class TransmuteOperation<I> implements ItemUpdater<I> {
}
@Override
public Item<I> update(Item<I> item, ItemBuildContext context) {
public <I> Item<I> update(Item<I> item, ItemBuildContext context) {
return item.transmuteCopy(this.newMaterial, item.count());
}
private static class Factory<I> implements ItemUpdaterFactory<I> {
private static class Factory implements ItemUpdaterFactory<TransmuteOperation> {
@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")));
public TransmuteOperation 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

@@ -25,6 +25,7 @@ import net.momirealms.craftengine.core.item.recipe.RecipeSerializer;
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.remainder.CraftRemainder;
import net.momirealms.craftengine.core.item.recipe.remainder.CraftRemainderType;
import net.momirealms.craftengine.core.item.recipe.result.PostProcessorType;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
@@ -96,7 +97,7 @@ public final class BuiltInRegistries {
public static final Registry<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> MOD_PACKET = createConstantBoundRegistry(Registries.MOD_PACKET, 16);
public static final Registry<BlockEntityType<? extends BlockEntity>> BLOCK_ENTITY_TYPE = createConstantBoundRegistry(Registries.BLOCK_ENTITY_TYPE, 64);
public static final Registry<BlockEntityElementConfigType<? extends BlockEntityElement>> BLOCK_ENTITY_ELEMENT_TYPE = createConstantBoundRegistry(Registries.BLOCK_ENTITY_ELEMENT_TYPE, 16);
public static final Registry<CraftRemainderType<?>> CRAFT_REMAINDER_TYPE = createConstantBoundRegistry(Registries.CRAFT_REMAINDER_TYPE, 16);
public static final Registry<CraftRemainderType<? extends CraftRemainder>> CRAFT_REMAINDER_TYPE = createConstantBoundRegistry(Registries.CRAFT_REMAINDER_TYPE, 16);
public static final Registry<FurnitureElementConfigType<? extends FurnitureElement>> FURNITURE_ELEMENT_TYPE = createConstantBoundRegistry(Registries.FURNITURE_ELEMENT_TYPE, 16);
public static final Registry<FurnitureHitboxConfigType<? extends FurnitureHitBox>> FURNITURE_HITBOX_TYPE = createConstantBoundRegistry(Registries.FURNITURE_HITBOX_TYPE, 16);
public static final Registry<FurnitureBehaviorType<? extends FurnitureBehavior>> FURNITURE_BEHAVIOR_TYPE = createConstantBoundRegistry(Registries.FURNITURE_BEHAVIOR_TYPE, 32);

View File

@@ -25,6 +25,7 @@ import net.momirealms.craftengine.core.item.recipe.RecipeSerializer;
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.remainder.CraftRemainder;
import net.momirealms.craftengine.core.item.recipe.remainder.CraftRemainderType;
import net.momirealms.craftengine.core.item.recipe.result.PostProcessorType;
import net.momirealms.craftengine.core.item.updater.ItemUpdaterType;
@@ -100,7 +101,7 @@ public final class Registries {
public static final ResourceKey<Registry<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>>> MOD_PACKET = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("mod_packet_type"));
public static final ResourceKey<Registry<BlockEntityType<? extends BlockEntity>>> BLOCK_ENTITY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_entity_type"));
public static final ResourceKey<Registry<BlockEntityElementConfigType<? extends BlockEntityElement>>> BLOCK_ENTITY_ELEMENT_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_entity_element_type"));
public static final ResourceKey<Registry<CraftRemainderType<?>>> CRAFT_REMAINDER_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("craft_remainder_type"));
public static final ResourceKey<Registry<CraftRemainderType<? extends CraftRemainder>>> CRAFT_REMAINDER_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("craft_remainder_type"));
public static final ResourceKey<Registry<FurnitureElementConfigType<? extends FurnitureElement>>> FURNITURE_ELEMENT_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("furniture_element_type"));
public static final ResourceKey<Registry<FurnitureHitboxConfigType<? extends FurnitureHitBox>>> FURNITURE_HITBOX_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("furniture_hitbox_type"));
public static final ResourceKey<Registry<FurnitureBehaviorType<? extends FurnitureBehavior>>> FURNITURE_BEHAVIOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("furniture_behavior_type"));

View File

@@ -113,7 +113,7 @@ public final class GsonHelper {
public static JsonElement combine(List<? extends JsonElement> jo) {
if (jo.size() == 1) {
return jo.get(0);
return jo.getFirst();
} else {
JsonArray ja = new JsonArray();
for (JsonElement je : jo) {