]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/interop/SaveGameStructureLoader.java
407adc921ea00d591eb10d50377b2a7c74e375a2
[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.storage.SaveFormat;
6 import net.minecraft.world.storage.SaveHandler;
7
8 import java.io.File;
9 import java.util.HashMap;
10 import java.util.Map;
11
12 public class SaveGameStructureLoader {
13     private static final Map<Integer, NBTStructureLoader> nbtStructureLoaders = new HashMap<>();
14     private static SaveHandler saveHandler = null;
15     private static File worldDirectory = null;
16
17     static void loadSaveGame(String fileName) {
18         Minecraft minecraft = Minecraft.getInstance();
19         SaveFormat saveLoader = minecraft.getSaveLoader();
20         saveHandler = saveLoader.getSaveLoader(fileName, null);
21         worldDirectory = saveLoader.func_215781_c().resolve(fileName).toFile();
22
23         for (int dimensionId : nbtStructureLoaders.keySet()) {
24             NBTStructureLoader dimensionProcessor = getNBTStructureLoader(dimensionId);
25             dimensionProcessor.configure(saveHandler, worldDirectory);
26         }
27
28         loadChunksAroundPlayer();
29     }
30
31     private static void loadChunksAroundPlayer() {
32         NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
33         int renderDistance = ClientInterop.getRenderDistanceChunks();
34
35         int playerChunkX = (int) Player.getX() >> 4;
36         int minChunkX = playerChunkX - renderDistance;
37         int maxChunkX = playerChunkX + renderDistance;
38
39         int playerChunkZ = (int) Player.getZ() >> 4;
40         int minChunkZ = playerChunkZ - renderDistance;
41         int maxChunkZ = playerChunkZ + renderDistance;
42
43         for (int chunkX = minChunkX; chunkX < maxChunkX; chunkX++) {
44             for (int chunkZ = minChunkZ; chunkZ < maxChunkZ; chunkZ++) {
45                 dimensionProcessor.loadStructures(chunkX, chunkZ);
46             }
47         }
48     }
49
50     static void loadStructures(int chunkX, int chunkZ) {
51         NBTStructureLoader dimensionProcessor = getNBTStructureLoader(Player.getDimensionId());
52         dimensionProcessor.loadStructures(chunkX, chunkZ);
53     }
54
55     private static NBTStructureLoader getNBTStructureLoader(int dimensionId) {
56         return nbtStructureLoaders.computeIfAbsent(dimensionId,
57                 id -> new NBTStructureLoader(id, saveHandler, worldDirectory));
58     }
59
60     public static void clear() {
61         nbtStructureLoaders.values().forEach(NBTStructureLoader::clear);
62         nbtStructureLoaders.clear();
63         saveHandler = null;
64         worldDirectory = null;
65     }
66 }