diff options
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.java | 99 |
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 @@ | |||
| 1 | package lv.enes.mc.eris_alchemy; | ||
| 2 | |||
| 3 | import com.google.gson.reflect.TypeToken; | ||
| 4 | import jakarta.annotation.Nonnull; | ||
| 5 | import net.minecraft.resources.ResourceLocation; | ||
| 6 | import net.minecraft.server.packs.resources.ResourceManager; | ||
| 7 | import org.quiltmc.qsl.resource.loader.api.reloader.SimpleSynchronousResourceReloader; | ||
| 8 | |||
| 9 | import java.io.IOException; | ||
| 10 | import java.io.InputStream; | ||
| 11 | import java.io.InputStreamReader; | ||
| 12 | import java.util.*; | ||
| 13 | |||
| 14 | import static lv.enes.mc.eris_alchemy.ErisAlchemy.GSON; | ||
| 15 | |||
| 16 | public 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 | } | ||