diff options
author | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2023-07-13 15:42:10 +0800 |
---|---|---|
committer | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2023-08-30 22:49:50 -0400 |
commit | 2b185ea7e4a64aff28eac8152b7d3dca1a97e33a (patch) | |
tree | 8e5bcc38bb9a2995385ca3af5fc1f927cce30dd4 /src/test/java/me/xmrvizzy/skyblocker | |
parent | d54ee77fb2c007b16bcc3d6b77acf008f948596d (diff) | |
download | Skyblocker-2b185ea7e4a64aff28eac8152b7d3dca1a97e33a.tar.gz Skyblocker-2b185ea7e4a64aff28eac8152b7d3dca1a97e33a.tar.bz2 Skyblocker-2b185ea7e4a64aff28eac8152b7d3dca1a97e33a.zip |
Add DungeonRoomsDFU
Diffstat (limited to 'src/test/java/me/xmrvizzy/skyblocker')
-rw-r--r-- | src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonRoomsDFU.java | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonRoomsDFU.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonRoomsDFU.java new file mode 100644 index 00000000..305d1efb --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonRoomsDFU.java @@ -0,0 +1,90 @@ +package me.xmrvizzy.skyblocker.skyblock.dungeon.secrets; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.zip.InflaterInputStream; + +public class DungeonRoomsDFU { + private static final Logger LOGGER = LoggerFactory.getLogger(DungeonRoomsDFU.class); + private static final String DUNGEONS_DATA_DIR = "/assets/skyblocker/dungeons"; + private static final String DUNGEON_ROOMS_DATA_DIR = DUNGEONS_DATA_DIR + "/dungeonrooms"; + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final HashMap<String, HashMap<String, HashMap<String, long[]>>> ROOMS = new HashMap<>(); + private static JsonObject roomsJson; + private static JsonObject waypointsJson; + + public static void main(String[] args) { + load().join(); + } + + private static CompletableFuture<Void> load() { + try { + List<CompletableFuture<Void>> dungeonFutures = new ArrayList<>(); + //noinspection DataFlowIssue + File dungeons = new File(DungeonRoomsDFU.class.getResource(DUNGEON_ROOMS_DATA_DIR).getFile()); + int resourcePathIndex = dungeons.getPath().indexOf(DUNGEON_ROOMS_DATA_DIR); + //noinspection DataFlowIssue + for (File dungeon : dungeons.listFiles()) { + if (!dungeon.isDirectory()) { + continue; + } + File[] roomShapes = dungeon.listFiles(); + if (roomShapes == null) { + LOGGER.error("Failed to load dungeon secrets for dungeon {}", dungeon.getName()); + continue; + } + ROOMS.put(dungeon.getName(), new HashMap<>()); + List<CompletableFuture<Void>> roomShapeFutures = new ArrayList<>(); + for (File roomShape : roomShapes) { + roomShapeFutures.add(CompletableFuture.supplyAsync(() -> readRooms(roomShape, resourcePathIndex)).thenAccept(rooms -> ROOMS.get(dungeon.getName()).put(roomShape.getName(), rooms))); + } + dungeonFutures.add(CompletableFuture.allOf(roomShapeFutures.toArray(CompletableFuture[]::new)).thenRun(() -> LOGGER.info("Loaded dungeon secrets for dungeon {} with {} room shapes and {} rooms total", dungeon.getName(), ROOMS.get(dungeon.getName()).size(), ROOMS.get(dungeon.getName()).values().stream().mapToInt(HashMap::size).sum()))); + } + dungeonFutures.add(CompletableFuture.runAsync(() -> { + //noinspection DataFlowIssue + try (BufferedReader roomsReader = new BufferedReader(new InputStreamReader(DungeonRoomsDFU.class.getResourceAsStream(DUNGEONS_DATA_DIR + "/dungeonrooms.json"))); + BufferedReader waypointsReader = new BufferedReader(new InputStreamReader(DungeonRoomsDFU.class.getResourceAsStream(DUNGEONS_DATA_DIR + "/secretlocations.json")))) { + roomsJson = GSON.fromJson(roomsReader, JsonObject.class); + waypointsJson = GSON.fromJson(waypointsReader, JsonObject.class); + LOGGER.info("Loaded dungeon secrets json"); + } catch (Exception e) { + LOGGER.error("Failed to load dungeon secrets json", e); + } + })); + return CompletableFuture.allOf(dungeonFutures.toArray(CompletableFuture[]::new)).thenRun(() -> LOGGER.info("Loaded dungeon secrets for {} dungeon(s), {} room shapes, and {} rooms total", ROOMS.size(), ROOMS.values().stream().mapToInt(HashMap::size).sum(), ROOMS.values().stream().map(HashMap::values).flatMap(Collection::stream).mapToInt(HashMap::size).sum())); + } catch (Exception e) { + throw new RuntimeException("Failed to load dungeon secrets", e); + } + } + + private static HashMap<String, long[]> readRooms(File roomShape, int resourcePathIndex) { + HashMap<String, long[]> data = new HashMap<>(); + File[] rooms = roomShape.listFiles(); + if (rooms == null) { + LOGGER.error("Failed to load dungeon secrets room shape {}", roomShape.getName()); + return data; + } + for (File room : rooms) { + String name = room.getName(); + //noinspection DataFlowIssue + try (ObjectInputStream in = new ObjectInputStream(new InflaterInputStream(DungeonRoomsDFU.class.getResourceAsStream(room.getPath().substring(resourcePathIndex))))) { + data.put(name.substring(0, name.length() - 9), (long[]) in.readObject()); + LOGGER.info("Loaded dungeon secrets room {}", name); + } catch (NullPointerException | IOException | ClassNotFoundException e) { + LOGGER.error("Failed to load dungeon secrets room " + name, e); + } + } + LOGGER.info("Loaded dungeon secrets room shape {} with {} rooms", roomShape.getName(), data.size()); + return data; + } +} |