summaryrefslogtreecommitdiff
path: root/src/main/java/lv/enes/mc/eris_alchemy/EmcLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/lv/enes/mc/eris_alchemy/EmcLoader.java')
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/EmcLoader.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/EmcLoader.java b/src/main/java/lv/enes/mc/eris_alchemy/EmcLoader.java
new file mode 100644
index 0000000..dd4613f
--- /dev/null
+++ b/src/main/java/lv/enes/mc/eris_alchemy/EmcLoader.java
@@ -0,0 +1,99 @@
1package lv.enes.mc.eris_alchemy;
2
3import com.google.gson.reflect.TypeToken;
4import jakarta.annotation.Nonnull;
5import net.minecraft.resources.ResourceLocation;
6import net.minecraft.server.packs.resources.ResourceManager;
7import org.quiltmc.qsl.resource.loader.api.reloader.SimpleSynchronousResourceReloader;
8
9import java.io.IOException;
10import java.io.InputStream;
11import java.io.InputStreamReader;
12import java.util.*;
13
14import static lv.enes.mc.eris_alchemy.ErisAlchemy.GSON;
15
16public class EmcLoader implements SimpleSynchronousResourceReloader {
17 public static final EmcLoader INSTANCE = new EmcLoader();
18
19 @Nonnull
20 @Override
21 public ResourceLocation getQuiltId() {
22 return new ResourceLocation(ErisAlchemy.ID, "emc_loader");
23 }
24
25 @Override
26 public void onResourceManagerReload(ResourceManager manager) {
27 var itemValues = loadAllFiles(manager, "item_emcs", new HashMap<>(), EmcLoader::loadEmcValues);
28 var itemTagValues = loadAllFiles(manager, "item_tag_emcs", new HashMap<>(), EmcLoader::loadEmcValues);
29 var blockTagValues = loadAllFiles(manager, "block_tag_emcs", new HashMap<>(), EmcLoader::loadEmcValues);
30
31 var fakeRecipes = loadAllFiles(manager, "fake_recipes", new ArrayList<>(), EmcLoader::loadFakeRecipes);
32
33 Emc.reloadData(itemValues, itemTagValues, blockTagValues, fakeRecipes);
34 }
35
36 private static <T> T loadAllFiles(
37 ResourceManager manager,
38 String path,
39 T arg,
40 Loader<T> loader
41 ) {
42 manager.listResources(
43 ErisAlchemy.ID + "/" + path,
44 loc -> loc.getPath().endsWith(".json") || loc.getPath().endsWith(".json5")
45 ).forEach((id, res) -> {
46 ErisAlchemy.LOGGER.info("Loading {}:{}...", id.getNamespace(), id.getPath());
47 try (var is = res.open()) {
48 loader.loadFile(arg, id, is);
49 } catch (IOException e) {
50 ErisAlchemy.LOGGER.error(
51 "Error occured while reading {}:{}",
52 id.getNamespace(),
53 id.getPath(),
54 e
55 );
56 }
57 });
58 return arg;
59 }
60
61 private static void loadEmcValues(Map<ResourceLocation, OptionalDouble> map, ResourceLocation id, InputStream is)
62 throws IOException
63 {
64 try (var reader = new InputStreamReader(is)) {
65 var json = GSON.fromJson(reader, new TypeToken<Map<ResourceLocation, Double>>(){});
66 json.forEach((item, newEmcRaw) -> {
67 var newEmc = newEmcRaw == null ? OptionalDouble.empty() : OptionalDouble.of(newEmcRaw);
68 var oldEmc = map.get(item);
69 if (oldEmc != null && !newEmc.equals(oldEmc)) {
70 var oldStr = oldEmc.isEmpty() ? "NONE" : Double.toString(oldEmc.getAsDouble());
71 var newStr = newEmc.isEmpty() ? "NONE" : Double.toString(newEmc.getAsDouble());
72 ErisAlchemy.LOGGER.warn(
73 "Redefining the EMC value for {} from {} to {}",
74 item,
75 oldStr,
76 newStr
77 );
78 }
79 map.put(item, newEmc);
80 });
81 }
82 }
83
84 private static void loadFakeRecipes(List<SimplifiedRecipe> recipes, ResourceLocation id, InputStream is)
85 throws IOException
86 {
87 try (var reader = new InputStreamReader(is)) {
88 var json = GSON.fromJson(reader, new TypeToken<List<SimplifiedRecipe>>(){});
89 recipes.addAll(json);
90 }
91 }
92
93 @FunctionalInterface
94 private interface Loader<T> {
95 void loadFile(T arg, ResourceLocation id, InputStream is) throws IOException;
96 }
97
98 private EmcLoader() {}
99}