1 package com.irtimaled.bbor.client.interop;
3 import com.irtimaled.bbor.client.Player;
4 import net.minecraft.client.Minecraft;
5 import net.minecraft.world.chunk.storage.RegionFileCache;
6 import net.minecraft.world.storage.ISaveFormat;
7 import net.minecraft.world.storage.ISaveHandler;
10 import java.util.HashMap;
13 public class SaveGameStructureLoader {
14 private static final Map<Integer, NBTStructureLoader> nbtStructureLoaders = new HashMap<>();
15 private static ISaveHandler saveHandler = null;
16 private static File worldDirectory = null;
18 static void loadSaveGame(String fileName) {
19 Minecraft minecraft = Minecraft.getInstance();
20 ISaveFormat saveLoader = minecraft.getSaveLoader();
21 saveHandler = saveLoader.getSaveLoader(fileName, null);
22 worldDirectory = saveLoader.getWorldFolder(fileName).toFile();
24 for (int dimensionId : nbtStructureLoaders.keySet()) {
25 NBTStructureLoader dimensionProcessor = getNBTStructureLoader(dimensionId);
26 dimensionProcessor.configure(saveHandler, worldDirectory);
29 loadChunksAroundPlayer();
32 private static void loadChunksAroundPlayer() {
33 NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
34 int renderDistance = ClientInterop.getRenderDistanceChunks();
36 int playerChunkX = (int) Player.getX() >> 4;
37 int minChunkX = playerChunkX - renderDistance;
38 int maxChunkX = playerChunkX + renderDistance;
40 int playerChunkZ = (int) Player.getZ() >> 4;
41 int minChunkZ = playerChunkZ - renderDistance;
42 int maxChunkZ = playerChunkZ + renderDistance;
44 for (int chunkX = minChunkX; chunkX < maxChunkX; chunkX++) {
45 for (int chunkZ = minChunkZ; chunkZ < maxChunkZ; chunkZ++) {
46 dimensionProcessor.loadStructures(chunkX, chunkZ);
51 static void loadStructures(int chunkX, int chunkZ) {
52 NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
53 dimensionProcessor.loadStructures(chunkX, chunkZ);
56 private static NBTStructureLoader getNBTStructureLoader(int dimensionId) {
57 return nbtStructureLoaders.computeIfAbsent(dimensionId,
58 id -> new NBTStructureLoader(id, saveHandler, worldDirectory));
61 public static void clear() {
62 nbtStructureLoaders.values().forEach(NBTStructureLoader::clear);
63 nbtStructureLoaders.clear();
65 worldDirectory = null;
66 RegionFileCache.clearRegionFileReferences();