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