1 package com.irtimaled.bbor.client.interop;
3 import com.irtimaled.bbor.client.Player;
4 import com.irtimaled.bbor.common.models.DimensionId;
5 import net.minecraft.client.MinecraftClient;
6 import net.minecraft.world.level.storage.LevelStorage;
9 import java.io.IOException;
10 import java.util.HashMap;
13 public class SaveGameStructureLoader {
14 private static final Map<DimensionId, NBTStructureLoader> nbtStructureLoaders = new HashMap<>();
15 private static LevelStorage.Session saveHandler = null;
16 private static File worldDirectory = null;
18 static void loadSaveGame(String fileName) {
19 MinecraftClient minecraft = MinecraftClient.getInstance();
20 LevelStorage saveLoader = minecraft.getLevelStorage();
22 saveHandler = saveLoader.createSession(fileName);
23 } catch (IOException e) {
26 worldDirectory = saveLoader.getSavesDirectory().resolve(fileName).toFile();
28 for (DimensionId dimensionId : nbtStructureLoaders.keySet()) {
29 NBTStructureLoader dimensionProcessor = getNBTStructureLoader(dimensionId);
30 dimensionProcessor.configure(saveHandler, worldDirectory);
33 loadChunksAroundPlayer();
36 private static void loadChunksAroundPlayer() {
37 NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
38 int renderDistance = ClientInterop.getRenderDistanceChunks();
40 int playerChunkX = (int) Player.getX() >> 4;
41 int minChunkX = playerChunkX - renderDistance;
42 int maxChunkX = playerChunkX + renderDistance;
44 int playerChunkZ = (int) Player.getZ() >> 4;
45 int minChunkZ = playerChunkZ - renderDistance;
46 int maxChunkZ = playerChunkZ + renderDistance;
48 for (int chunkX = minChunkX; chunkX < maxChunkX; chunkX++) {
49 for (int chunkZ = minChunkZ; chunkZ < maxChunkZ; chunkZ++) {
50 dimensionProcessor.loadStructures(chunkX, chunkZ);
55 static void loadStructures(int chunkX, int chunkZ) {
56 NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
57 dimensionProcessor.loadStructures(chunkX, chunkZ);
60 private static NBTStructureLoader getNBTStructureLoader(DimensionId dimensionId) {
61 return nbtStructureLoaders.computeIfAbsent(dimensionId,
62 id -> new NBTStructureLoader(id, saveHandler, worldDirectory));
65 public static void clear() {
66 nbtStructureLoaders.values().forEach(NBTStructureLoader::clear);
67 nbtStructureLoaders.clear();
69 worldDirectory = null;