From ee4c4aed738c789a921a1cdb1991ca300da2dd5c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 19 Feb 2021 17:38:39 +0300 Subject: [PATCH] End portals storage --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../ru/betterend/registry/EndPortals.java | 111 ++++++++++++++++++ .../java/ru/betterend/util/JsonFactory.java | 5 + 3 files changed, 118 insertions(+) create mode 100644 src/main/java/ru/betterend/registry/EndPortals.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 4cf23d03..47daecc1 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -27,6 +27,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndPortals; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; @@ -63,6 +64,7 @@ public class BetterEnd implements ModInitializer { Integrations.register(); BonemealUtil.init(); GeneratorOptions.init(); + EndPortals.loadPortals(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java new file mode 100644 index 00000000..d9fdfe5e --- /dev/null +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -0,0 +1,111 @@ +package ru.betterend.registry; + +import java.io.File; +import java.util.Iterator; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import ru.betterend.config.ConfigWriter; +import ru.betterend.util.JsonFactory; +import ru.betterend.util.MHelper; + +public class EndPortals { + private static PortalInfo[] portals; + + public static void loadPortals() { + File file = new File(ConfigWriter.MOD_CONFIG_DIR, "portals.json"); + JsonObject json; + if (!file.exists()) { + file.getParentFile().mkdirs(); + json = makeDefault(file); + } + else { + json = JsonFactory.getJsonObject(file); + } + if (!json.has("portals") || !json.get("portals").isJsonArray()) { + json = makeDefault(file); + } + JsonArray array = json.get("portals").getAsJsonArray(); + if (array.size() == 0) { + json = makeDefault(file); + array = json.get("portals").getAsJsonArray(); + } + portals = new PortalInfo[array.size()]; + for (int i = 0; i < portals.length; i++) { + portals[i] = new PortalInfo(array.get(i).getAsJsonObject()); + } + } + + public static ServerWorld getWorld(MinecraftServer server, int state) { + if (state >= portals.length) { + return server.getOverworld(); + } + return portals[state].getWorld(server); + } + + public static int getColor(int state) { + return portals[state].color; + } + + private static JsonObject makeDefault(File file) { + JsonObject jsonObject = new JsonObject(); + JsonFactory.storeJson(file, jsonObject); + JsonArray array = new JsonArray(); + jsonObject.add("portals", array); + array.add(makeDefault().toJson()); + JsonFactory.storeJson(file, jsonObject); + return jsonObject; + } + + private static PortalInfo makeDefault() { + return new PortalInfo(new Identifier("minecraft:overworld"), 255, 255, 255); + } + + private static class PortalInfo { + private final Identifier dimension; + private final int color; + private ServerWorld world; + + PortalInfo(JsonObject obj) { + this( + new Identifier(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + JsonFactory.getInt(obj, "colorRed", 255), + JsonFactory.getInt(obj, "colorGreen", 255), + JsonFactory.getInt(obj, "colorBlue", 255) + ); + } + + PortalInfo(Identifier dimension, int r, int g, int b) { + this.dimension = dimension; + this.color = MHelper.color(r, g, b); + } + + ServerWorld getWorld(MinecraftServer server) { + if (world != null) { + return world; + } + Iterator iterator = server.getWorlds().iterator(); + while (iterator.hasNext()) { + ServerWorld world = iterator.next(); + if (world.getRegistryKey().getValue().equals(dimension)) { + this.world = world; + return world; + } + } + return server.getOverworld(); + } + + JsonObject toJson() { + JsonObject obj = new JsonObject(); + obj.addProperty("dimension", dimension.toString()); + obj.addProperty("colorRed", (color >> 16) & 255); + obj.addProperty("colorGreen", (color >> 8) & 255); + obj.addProperty("colorBlue", color & 255); + return obj; + } + } +} diff --git a/src/main/java/ru/betterend/util/JsonFactory.java b/src/main/java/ru/betterend/util/JsonFactory.java index 355f4fa1..c3f24b22 100644 --- a/src/main/java/ru/betterend/util/JsonFactory.java +++ b/src/main/java/ru/betterend/util/JsonFactory.java @@ -69,6 +69,11 @@ public class JsonFactory { } } + public static int getInt(JsonObject object, String member, int def) { + JsonElement elem = object.get(member); + return elem == null ? def : elem.getAsInt(); + } + public static float getFloat(JsonObject object, String member, float def) { JsonElement elem = object.get(member); return elem == null ? def : elem.getAsFloat();