From 3d90cdd1204b6b6a2c57b121cdf82de2448bb951 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 14 Jun 2021 20:45:12 +0800 Subject: Fix auto crafting patterns & refactor internals providers --- .../common/display/SimpleDisplaySerializer.java | 15 +++++++-- .../rei/api/common/display/basic/BasicDisplay.java | 37 ++++++++++++++++++++++ .../shedaniel/rei/api/common/entry/EntryStack.java | 1 + .../rei/api/common/transfer/info/MenuInfo.java | 2 +- 4 files changed, 52 insertions(+), 3 deletions(-) (limited to 'api/src/main/java/me/shedaniel') diff --git a/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleDisplaySerializer.java b/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleDisplaySerializer.java index ad2ca952d..4863f90fd 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleDisplaySerializer.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleDisplaySerializer.java @@ -23,17 +23,28 @@ package me.shedaniel.rei.api.common.display; +import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.nbt.CompoundTag; +import java.util.List; + public interface SimpleDisplaySerializer extends DisplaySerializer { @Override default CompoundTag save(CompoundTag tag, D display) { - tag.put("input", EntryIngredients.save(display.getInputEntries())); - tag.put("output", EntryIngredients.save(display.getOutputEntries())); + tag.put("input", EntryIngredients.save(getInputIngredients(display))); + tag.put("output", EntryIngredients.save(getOutputIngredients(display))); tag = saveExtra(tag, display); return tag; } + default List getInputIngredients(D display) { + return display.getInputEntries(); + } + + default List getOutputIngredients(D display) { + return display.getOutputEntries(); + } + CompoundTag saveExtra(CompoundTag tag, D display); } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java b/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java index 1d0ac2dfe..da78fc0b1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Optional; @@ -67,6 +68,8 @@ public abstract class BasicDisplay implements Display { public static class Serializer

implements SimpleDisplaySerializer

{ protected final Constructor

constructor; protected final ExtraSerializer

extraSerializer; + protected EntryIngredientsProvider

inputEntries = EntryIngredientsProvider.pass(); + protected EntryIngredientsProvider

outputEntries = EntryIngredientsProvider.pass(); public static

Serializer

ofSimple(SimpleConstructor

constructor) { return new Serializer<>(constructor, (p, tag) -> {}); @@ -109,6 +112,16 @@ public abstract class BasicDisplay implements Display { this.extraSerializer = extraSerializer; } + public Serializer

inputProvider(EntryIngredientsProvider

provider) { + this.inputEntries = provider; + return this; + } + + public Serializer

outputProvider(EntryIngredientsProvider

provider) { + this.outputEntries = provider; + return this; + } + @Override public CompoundTag saveExtra(CompoundTag tag, P display) { display.getDisplayLocation().ifPresent(location -> tag.putString("location", location.toString())); @@ -129,6 +142,20 @@ public abstract class BasicDisplay implements Display { return constructor.construct(input, output, Optional.ofNullable(location), tag); } + @Override + public List getInputIngredients(P display) { + List entries = this.inputEntries.getEntries(display); + if (entries != null) return entries; + return SimpleDisplaySerializer.super.getInputIngredients(display); + } + + @Override + public List getOutputIngredients(P display) { + List entries = this.outputEntries.getEntries(display); + if (entries != null) return entries; + return SimpleDisplaySerializer.super.getOutputIngredients(display); + } + @FunctionalInterface public interface Constructor { R construct(List input, List output, Optional location, CompoundTag tag); @@ -168,5 +195,15 @@ public abstract class BasicDisplay implements Display { public interface ExtraSerializer { void serialize(R display, CompoundTag tag); } + + @FunctionalInterface + public interface EntryIngredientsProvider { + @Nullable + List getEntries(R display); + + static EntryIngredientsProvider pass() { + return display -> null; + } + } } } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java index c9810211d..1789ccbae 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java @@ -66,6 +66,7 @@ public interface EntryStack extends TextRepresentable, Renderer { static EntryStack read(CompoundTag tag) { EntryDefinition definition = EntryTypeRegistry.getInstance().get(new ResourceLocation(tag.getString("type"))); + if (definition == null) throw new NullPointerException("Read missing entry type: " + definition); EntrySerializer serializer = definition.getSerializer(); if (serializer != null && serializer.supportReading()) { return EntryStack.of((EntryDefinition) definition, serializer.read(tag)); diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java index e9f87d51f..313ab23de 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java @@ -99,7 +99,7 @@ public interface MenuInfo ex */ default void markDirty(MenuInfoContext context) { context.getPlayerEntity().getInventory().setChanged(); - context.getMenu().broadcastChanges(); + context.getMenu().sendAllDataToRemote(); } /** -- cgit