diff options
Diffstat (limited to 'src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java')
-rwxr-xr-x | src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java b/src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java new file mode 100755 index 0000000..2e81fc9 --- /dev/null +++ b/src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java @@ -0,0 +1,112 @@ +package net.tylermurphy.Minecraft.Util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.tylermurphy.Minecraft.Chunk.Chunk;
+import net.tylermurphy.Minecraft.Scene.World;
+import org.joml.Vector2i;
+
+public class ChunkLoader {
+
+ private static final ArrayList<Vector2i> keys_to_be_removed = new ArrayList<>();
+
+ private static final HashMap<String, Data> loaded_regions = new HashMap<>();
+
+ public static void run() {
+ try {
+ int cx,cz;
+ cx = (int) ((World.player.getTransform().getGlobalPosition().x)/16);
+ cz = (int) ((World.player.getTransform().getGlobalPosition().z)/16);
+ keys_to_be_removed.clear();
+ for(Chunk c : World.getChunks()) {
+ if(c.gridX < cx-World.renderDistance || c.gridX > cx+World.renderDistance || c.gridZ < cz-World.renderDistance || c.gridZ > cz+World.renderDistance) {
+
+ int x = c.gridX; int z = c.gridZ;
+ int regionX = x > 0 ? x / 16 : (x - 16) / 16;
+ int regionZ = z > 0 ? z / 16 : (z - 16) / 16;
+ Data region = loaded_regions.get(getRegionKey(regionX,regionZ));
+ byte[] data = ResourceManager.flattenArray(c.cubes);
+ region.BYTE_ARRAYS.put(getChunkKey(x,z), data);
+ loaded_regions.put(getRegionKey(regionX,regionZ), region);
+
+ if(c.renderable() != null)
+ c.renderable().getMesh().delete();
+ c.deleteRenderable();
+ if(c.transparentRenderable() != null)
+ c.transparentRenderable().getMesh().delete();
+ c.deleteTransparentRenderable();
+ c.cubes = null;
+ keys_to_be_removed.add(new Vector2i(c.gridX, c.gridZ));
+ }
+ }
+ for(Vector2i pos : keys_to_be_removed) {
+ World.removeChunk(pos.x, pos.y);
+ }
+ for(int x=cx-World.renderDistance; x<cx+World.renderDistance;x++) {
+ for(int z=cz-World.renderDistance; z<cz+World.renderDistance;z++) {
+ if(World.getChunkUnsafe(x, z) != null) continue;
+
+ Chunk chunk = loadChunk(x, z);
+ chunk.initialize();
+ World.addChunk(chunk);
+ update(x+1,z);
+ update(x-1,z);
+ update(x,z+1);
+ update(x,z-1);
+ }
+ }
+ }catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void save() {
+ for(Chunk c : World.getChunks()) {
+ int x = c.gridX; int z = c.gridZ;
+ int regionX = x > 0 ? x / 16 : (x - 16) / 16;
+ int regionZ = z > 0 ? z / 16 : (z - 16) / 16;
+ Data region = loaded_regions.get(getRegionKey(regionX,regionZ));
+ byte[] data = ResourceManager.flattenArray(c.cubes);
+ region.BYTE_ARRAYS.put(getChunkKey(x,z), data);
+ loaded_regions.put(getRegionKey(regionX,regionZ), region);
+ }
+ for(Map.Entry<String, Data> entry : loaded_regions.entrySet()) {
+ ResourceManager.saveObject("region/", entry.getKey(), entry.getValue());
+ }
+ }
+
+ private static void update(int x, int z) {
+ Chunk c = World.getChunkUnsafe(x, z);
+ if(c != null) c.updateMesh();
+ }
+
+ private static Chunk loadChunk(int gridX, int gridZ) {
+ int regionX = gridX > 0 ? gridX / 16 : (gridX - 16) / 16;
+ int regionZ = gridZ > 0 ? gridZ / 16 : (gridZ - 16) / 16;
+ Data region;
+ if(!loaded_regions.containsKey(getRegionKey(regionX,regionZ))) {
+ Object reg = ResourceManager.loadObject("region/", getRegionKey(regionX,regionZ));
+ if(reg == null) region = new Data();
+ else region = (Data)reg;
+ loaded_regions.put(getRegionKey(regionX,regionZ), region);
+ } else region = loaded_regions.get(getRegionKey(regionX,regionZ));
+ if(region.BYTE_ARRAYS.containsKey(getChunkKey(gridX,gridZ))) {
+ byte[] data = region.BYTE_ARRAYS.get(getChunkKey(gridX,gridZ));
+ Chunk chunk = new Chunk(gridX,gridZ,true);
+ chunk.cubes = ResourceManager.expandArray(data);
+ return chunk;
+ } else {
+ return new Chunk(gridX,gridZ,true);
+ }
+ }
+
+ public static String getRegionKey(int regionX, int regionZ) {
+ return regionX+"x"+regionZ+"z.region";
+ }
+
+ public static String getChunkKey(int gridX, int gridZ) {
+ return gridX+"x"+gridZ+"z";
+ }
+}
|