From 180aad05decc7eefa87e4e45d6747c48f40e5361 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Mon, 17 Apr 2023 12:12:01 -0400 Subject: save --- .../tylermurphy/Minecraft/Util/ChunkLoader.java | 112 +++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java (limited to 'src/main/java/net/tylermurphy/Minecraft/Util/ChunkLoader.java') 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 keys_to_be_removed = new ArrayList<>(); + + private static final HashMap 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 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 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"; + } +} -- cgit v1.2.3-freya