aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authornea <nea@nea.moe>2023-05-29 23:03:30 +0200
committernea <nea@nea.moe>2023-05-29 23:03:30 +0200
commit9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25 (patch)
tree3a044890e9cc91f5a9b72f0563f3a084202b862a /src/main/java
parentdd608d89aabeae1cd5302ba0a79149d60001ab87 (diff)
downloadneurepoparsing-9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25.tar.gz
neurepoparsing-9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25.tar.bz2
neurepoparsing-9bef42c18c0ba48ccd4e8aeffd79f8728db8dc25.zip
Add support for unknown recipes
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/io/github/moulberry/repo/NEURepository.java7
-rw-r--r--src/main/java/io/github/moulberry/repo/data/NEUIngredient.java6
-rw-r--r--src/main/java/io/github/moulberry/repo/data/NEURecipe.java5
-rw-r--r--src/main/java/io/github/moulberry/repo/data/NEUUnknownRecipe.java56
-rw-r--r--src/main/java/io/github/moulberry/repo/vendored/RuntimeTypeAdapterFactory.java17
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?");