diff options
author | nea <nea@nea.moe> | 2023-05-29 23:03:30 +0200 |
---|---|---|
committer | nea <nea@nea.moe> | 2023-05-29 23:03:30 +0200 |
commit | 9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25 (patch) | |
tree | 3a044890e9cc91f5a9b72f0563f3a084202b862a /src/main/java/io | |
parent | dd608d89aabeae1cd5302ba0a79149d60001ab87 (diff) | |
download | neurepoparsing-9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25.tar.gz neurepoparsing-9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25.tar.bz2 neurepoparsing-9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25.zip |
Add support for unknown recipes
Diffstat (limited to 'src/main/java/io')
5 files changed, 83 insertions, 8 deletions
diff --git a/src/main/java/io/github/moulberry/repo/NEURepository.java b/src/main/java/io/github/moulberry/repo/NEURepository.java index 1fbac5f..41bfc12 100644 --- a/src/main/java/io/github/moulberry/repo/NEURepository.java +++ b/src/main/java/io/github/moulberry/repo/NEURepository.java @@ -3,8 +3,8 @@ package io.github.moulberry.repo; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; -import io.github.moulberry.repo.vendored.RuntimeTypeAdapterFactory; import io.github.moulberry.repo.data.*; +import io.github.moulberry.repo.vendored.RuntimeTypeAdapterFactory; import lombok.Getter; import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -23,6 +23,8 @@ public final class NEURepository { final Gson gson = new GsonBuilder() .setPrettyPrinting() + .registerTypeAdapter(new TypeToken<NEUUnknownRecipe>() { + }.getType(), new NEUUnknownRecipe.Serializer()) .registerTypeAdapter(new TypeToken<NEUIngredient>() { }.getType(), new NEUIngredient.Serializer()) .registerTypeAdapter(new TypeToken<Coordinate>() { @@ -32,12 +34,13 @@ public final class NEURepository { .registerTypeAdapter(new TypeToken<NEUCraftingRecipe>() { }.getType(), new NEUCraftingRecipe.Serializer()) .registerTypeAdapterFactory( - RuntimeTypeAdapterFactory.of(NEURecipe.class, "type") + RuntimeTypeAdapterFactory.of(NEURecipe.class, "type", true) .registerSubtype(NEUForgeRecipe.class, "forge") .registerSubtype(NEUTradeRecipe.class, "trade") .registerSubtype(NEUCraftingRecipe.class, "crafting") .registerSubtype(NEUMobDropRecipe.class, "drops") .registerSubtype(NEUNpcShopRecipe.class, "npc_shop") + .setFallbackType(NEUUnknownRecipe.class) .setDefaultTypeTag("crafting") ) .create(); diff --git a/src/main/java/io/github/moulberry/repo/data/NEUIngredient.java b/src/main/java/io/github/moulberry/repo/data/NEUIngredient.java index 6e86c4d..0442cd1 100644 --- a/src/main/java/io/github/moulberry/repo/data/NEUIngredient.java +++ b/src/main/java/io/github/moulberry/repo/data/NEUIngredient.java @@ -9,7 +9,7 @@ import java.lang.reflect.Type; @Getter public class NEUIngredient { @NEUId String itemId; - int amount; + double amount; public static final String NEU_SENTINEL_EMPTY = "NEU_SENTINEL_EMPTY"; public static final NEUIngredient SENTINEL_EMPTY = new NEUIngredient(); @@ -32,7 +32,7 @@ public class NEUIngredient { String[] parts = string.split(":"); NEUIngredient ingredient = new NEUIngredient(); if (parts.length == 2) { - ingredient.amount = Integer.parseInt(parts[1]); + ingredient.amount = Double.parseDouble(parts[1]); } else if (parts.length == 1) { ingredient.amount = 1; } else { @@ -59,6 +59,6 @@ public class NEUIngredient { @Override public String toString() { - return String.format("NEUIngredient{%s:%d}", itemId, amount); + return String.format("NEUIngredient{%s:%f}", itemId, amount); } } diff --git a/src/main/java/io/github/moulberry/repo/data/NEURecipe.java b/src/main/java/io/github/moulberry/repo/data/NEURecipe.java index b21dfde..e6c873e 100644 --- a/src/main/java/io/github/moulberry/repo/data/NEURecipe.java +++ b/src/main/java/io/github/moulberry/repo/data/NEURecipe.java @@ -1,14 +1,15 @@ package io.github.moulberry.repo.data; +import org.jetbrains.annotations.ApiStatus; + import java.util.Collection; public interface NEURecipe { /** * This is to be called once, after deserialization by the item that contains this recipe. This will be done * automatically by {@link NEUItem#getRecipes()}. - * This method is deprecated because it should only be called by the Repository itself, not consumers of this library. */ - @Deprecated + @ApiStatus.OverrideOnly default void fillItemInfo(NEUItem item) { } diff --git a/src/main/java/io/github/moulberry/repo/data/NEUUnknownRecipe.java b/src/main/java/io/github/moulberry/repo/data/NEUUnknownRecipe.java new file mode 100644 index 0000000..c1f42be --- /dev/null +++ b/src/main/java/io/github/moulberry/repo/data/NEUUnknownRecipe.java @@ -0,0 +1,56 @@ +package io.github.moulberry.repo.data; + +import com.google.gson.*; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.Collections; + +@RequiredArgsConstructor +public class NEUUnknownRecipe implements NEURecipe { + /** + * Type tag of the unknown recipe type. + */ + @Getter + @Nullable + final String type; + + /** + * The json tree of this unknown recipe. + */ + @Getter + final JsonObject tree; + + /** + * Item associated with this recipe. + */ + @Getter + NEUItem item; + + @Override + public Collection<NEUIngredient> getAllInputs() { + return Collections.singleton(NEUIngredient.fromItem(item, 1)); + } + + @Override + public Collection<NEUIngredient> getAllOutputs() { + return Collections.emptyList(); + } + + @Override + public void fillItemInfo(NEUItem item) { + this.item = item; + } + + public static class Serializer implements JsonDeserializer<NEUUnknownRecipe> { + + @Override + public NEUUnknownRecipe deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonElement type = json.getAsJsonObject().get("type"); + return new NEUUnknownRecipe(type != null && type.isJsonPrimitive() ? type.getAsString() : null, json.getAsJsonObject()); + } + } +} diff --git a/src/main/java/io/github/moulberry/repo/vendored/RuntimeTypeAdapterFactory.java b/src/main/java/io/github/moulberry/repo/vendored/RuntimeTypeAdapterFactory.java index 1c67f02..4c40def 100644 --- a/src/main/java/io/github/moulberry/repo/vendored/RuntimeTypeAdapterFactory.java +++ b/src/main/java/io/github/moulberry/repo/vendored/RuntimeTypeAdapterFactory.java @@ -129,6 +129,7 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory { private final Map<String, Class<?>> labelToSubtype = new LinkedHashMap<>(); private final Map<Class<?>, String> subtypeToLabel = new LinkedHashMap<>(); private final boolean maintainType; + private Class<?> fallbackType = null; private String defaultType; // NEU modification // NEU modification @@ -187,6 +188,18 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory { return this; } + // NEU Modification + + /** + * Set a fallback type to be used if the read type tag is not registered + */ + public RuntimeTypeAdapterFactory<T> setFallbackType(Class<? extends T> fallbackType) { + if (this.fallbackType != null) + throw new IllegalArgumentException("Cannot set fallback type twice"); + this.fallbackType = fallbackType; + return this; + } + /** * Registers {@code type} identified by its {@link Class#getSimpleName simple name}. Labels are case sensitive. * @@ -206,6 +219,8 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory { final TypeAdapter<JsonElement> jsonElementAdapter = gson.getAdapter(JsonElement.class); final Map<String, TypeAdapter<?>> labelToDelegate = new LinkedHashMap<>(); final Map<Class<?>, TypeAdapter<?>> subtypeToDelegate = new LinkedHashMap<>(); + final TypeAdapter<?> fallbackAdapter = fallbackType != null ? gson.getDelegateAdapter(this, TypeToken.get(fallbackType)) : null; + for (Map.Entry<String, Class<?>> entry : labelToSubtype.entrySet()) { TypeAdapter<?> delegate = gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); labelToDelegate.put(entry.getKey(), delegate); @@ -240,7 +255,7 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory { } String label = labelJsonElement.getAsString(); @SuppressWarnings("unchecked") // registration requires that subtype extends T - TypeAdapter<R> delegate = (TypeAdapter<R>) labelToDelegate.get(label); + TypeAdapter<R> delegate = (TypeAdapter<R>) labelToDelegate.getOrDefault(label, fallbackAdapter); if (delegate == null) { throw new JsonParseException("cannot deserialize " + baseType + " subtype named " + label + "; did you forget to register a subtype?"); |