]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/interop/SaveGameStructureLoader.java
3802936813daadf3781ee4af2ab5587c841ef582
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / interop / SaveGameStructureLoader.java
1 package com.irtimaled.bbor.client.interop;
2
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;
8
9 import java.io.File;
10 import java.util.HashMap;
11 import java.util.Map;
12
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;
17
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();
23
24         for (int dimensionId : nbtStructureLoaders.keySet()) {
25             NBTStructureLoader dimensionProcessor = getNBTStructureLoader(dimensionId);
26             dimensionProcessor.configure(saveHandler, worldDirectory);
27         }
28
29         loadChunksAroundPlayer();
30     }
31
32     private static void loadChunksAroundPlayer() {
33         NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
34         int renderDistance = ClientInterop.getRenderDistanceChunks();
35
36         int playerChunkX = (int) Player.getX() >> 4;
37         int minChunkX = playerChunkX - renderDistance;
38         int maxChunkX = playerChunkX + renderDistance;
39
40         int playerChunkZ = (int) Player.getZ() >> 4;
41         int minChunkZ = playerChunkZ - renderDistance;
42         int maxChunkZ = playerChunkZ + renderDistance;
43
44         for (int chunkX = minChunkX; chunkX < maxChunkX; chunkX++) {
45             for (int chunkZ = minChunkZ; chunkZ < maxChunkZ; chunkZ++) {
46                 dimensionProcessor.loadStructures(chunkX, chunkZ);
47             }
48         }
49     }
50
51     static void loadStructures(int chunkX, int chunkZ) {
52         NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
53         dimensionProcessor.loadStructures(chunkX, chunkZ);
54     }
55
56     private static NBTStructureLoader getNBTStructureLoader(int dimensionId) {
57         return nbtStructureLoaders.computeIfAbsent(dimensionId,
58                 id -> new NBTStructureLoader(id, saveHandler, worldDirectory));
59     }
60
61     public static void clear() {
62         nbtStructureLoaders.values().forEach(NBTStructureLoader::clear);
63         nbtStructureLoaders.clear();
64         saveHandler = null;
65         worldDirectory = null;
66         RegionFileCache.clearRegionFileReferences();
67     }
68 }