From ce06e1bb531ddffc2e426fae8d9dee5a1f65d170 Mon Sep 17 00:00:00 2001 From: josua Date: Thu, 10 Sep 2020 12:30:23 +1000 Subject: [PATCH] Made bdf use the .gz file ending to say its gzip --- run/saves.bdf.gz | Bin 0 -> 58 bytes run/saves/world/c_0_-10_10.bdf.gz | Bin 0 -> 95 bytes run/saves/world/c_0_-5_0.bdf.gz | Bin 0 -> 416 bytes run/saves/world/world.bdf.gz | Bin 0 -> 53 bytes run/settings.bdf.gz | Bin 0 -> 103 bytes src/projectzombie/Main.java | 27 ++-- src/projectzombie/entity/Entity.java | 4 +- src/projectzombie/inventory/Inventory.java | 4 +- .../inventory/InventoryArmor.java | 4 +- .../inventory/InventoryClothing.java | 4 +- .../items/modifier/ItemModifier.java | 4 +- src/projectzombie/menu/MenuSaves.java | 14 +- src/projectzombie/menu/MenuSavingWorld.java | 4 +- src/projectzombie/menu/MenuWorldDelete.java | 11 +- src/projectzombie/menu/MenuWorldNew.java | 10 +- src/projectzombie/settings/Environment.java | 2 +- src/projectzombie/settings/Settings.java | 18 ++- src/projectzombie/task/Task.java | 4 +- src/projectzombie/util/ClassBdf.java | 8 + src/projectzombie/util/FileHelpers.java | 37 +++++ src/projectzombie/util/math/ItemStack.java | 4 +- src/projectzombie/worker/WorkerChunkTask.java | 13 -- .../worker/WorkerChunkTaskLoad.java | 16 -- .../worker/WorkerChunkTaskSave.java | 18 --- src/projectzombie/worker/WorkerChunks.java | 143 ------------------ src/projectzombie/worker/WorkerFile.java | 24 +-- src/projectzombie/worker/WorkerFileTask.java | 14 -- src/projectzombie/worker/WorkerTask.java | 10 ++ src/projectzombie/worker/WorkerTaskChunk.java | 8 + ...rate.java => WorkerTaskChunkGenerate.java} | 13 +- .../worker/WorkerTaskChunkLoad.java | 38 +++++ .../worker/WorkerTaskChunkSave.java | 54 +++++++ src/projectzombie/worker/WorkerTaskFile.java | 39 +++++ src/projectzombie/worker/WorkerTasks.java | 102 +++++++++++++ src/projectzombie/world/World.java | 19 +-- src/projectzombie/world/chunk/Chunk.java | 4 +- .../world/chunk/ChunkEventHandler.java | 4 +- src/projectzombie/world/layer/Layer.java | 41 ++--- 38 files changed, 410 insertions(+), 309 deletions(-) create mode 100644 run/saves.bdf.gz create mode 100644 run/saves/world/c_0_-10_10.bdf.gz create mode 100644 run/saves/world/c_0_-5_0.bdf.gz create mode 100644 run/saves/world/world.bdf.gz create mode 100644 run/settings.bdf.gz create mode 100644 src/projectzombie/util/ClassBdf.java create mode 100644 src/projectzombie/util/FileHelpers.java delete mode 100644 src/projectzombie/worker/WorkerChunkTask.java delete mode 100644 src/projectzombie/worker/WorkerChunkTaskLoad.java delete mode 100644 src/projectzombie/worker/WorkerChunkTaskSave.java delete mode 100644 src/projectzombie/worker/WorkerChunks.java delete mode 100644 src/projectzombie/worker/WorkerFileTask.java create mode 100644 src/projectzombie/worker/WorkerTask.java create mode 100644 src/projectzombie/worker/WorkerTaskChunk.java rename src/projectzombie/worker/{WorkerChunkTaskGenerate.java => WorkerTaskChunkGenerate.java} (61%) create mode 100644 src/projectzombie/worker/WorkerTaskChunkLoad.java create mode 100644 src/projectzombie/worker/WorkerTaskChunkSave.java create mode 100644 src/projectzombie/worker/WorkerTaskFile.java create mode 100644 src/projectzombie/worker/WorkerTasks.java diff --git a/run/saves.bdf.gz b/run/saves.bdf.gz new file mode 100644 index 0000000000000000000000000000000000000000..cfd86a5222b3748e435234ba2663f183568157b0 GIT binary patch literal 58 zcmb2|=3oGW|Fc!?f?fPG*s3e)0{yrS^L#53ID10nz@+IjW}gb05Haas)SQTEQ9KOO M80INzFfcFx06anzSO5S3 literal 0 HcmV?d00001 diff --git a/run/saves/world/c_0_-10_10.bdf.gz b/run/saves/world/c_0_-10_10.bdf.gz new file mode 100644 index 0000000000000000000000000000000000000000..440b7e3fe1a510916c95bd1631c16282b4d94dea GIT binary patch literal 95 zcmb2|=3oGW|FS2n`5F`iSRMW|=GshV{jRX9Q(8XbLturdfA*5uXRH@H^|I+&eUX^6 z)al*P^~WQgT$0Rey6``}e#$J3hm)SnoIJyp{qB_hi5^Q&{bgM2YJWMLfq?-4!R085 literal 0 HcmV?d00001 diff --git a/run/saves/world/c_0_-5_0.bdf.gz b/run/saves/world/c_0_-5_0.bdf.gz new file mode 100644 index 0000000000000000000000000000000000000000..ea33eb88c25f3632312ed2feba1fca9fdf7a665c GIT binary patch literal 416 zcmb2|=3sz;r<3mc9WoF(c6*`sMezrx+CMg_Cm2NKb?6laUU1m?fp^b^=xvtr*NT7T zrcSZ39WzJW<_v83g`NHRK@@vljz4xn{>;E4I z@*4z0d^&z_FHX94!tc=hg>0{+CIpL2{^s}gTu;l@bsN_F=5!L>{YiWGrHB6vdBj#E zEmJGIyZij{Ywy&Pjvuy7%Di__$d6vVF$N{HPc~V2f=e&*%xp;U)J2$Q*I-W zC+%0-8KAIrx8IHnjJK!0J}_mqTc(!79j+Y$vn;fveimOibMPilordDM2Ry4*X*s$E z=4>y}zGs@Thi%{SR2HwTY|Gf!CA&sSMQCszXv<=ra^d3SD1kv3^m-jp;v~x9yvE|4#ghn+0EYOv#ye(sGlXpUAE$Hy>$6pM9D(b>r@{ bO8d_~H9kGfXnN(ge=Pme47R3nFfafBMy$}9 literal 0 HcmV?d00001 diff --git a/run/saves/world/world.bdf.gz b/run/saves/world/world.bdf.gz new file mode 100644 index 0000000000000000000000000000000000000000..e3a9166abcc2c07782ba6ca4c21c59bdb6ca03d1 GIT binary patch literal 53 zcmb2|=3oGW|Fe%yJv`y?jKfn7>zti7dH#$^vkpz095FL0S G7#IMyTqxxL literal 0 HcmV?d00001 diff --git a/src/projectzombie/Main.java b/src/projectzombie/Main.java index 1bbb671..484ea1e 100755 --- a/src/projectzombie/Main.java +++ b/src/projectzombie/Main.java @@ -5,6 +5,7 @@ import java.awt.datatransfer.Clipboard; import java.io.IOException; import java.util.Random; +import bdf.types.BdfReader; import gl_engine.MathHelpers; import mainloop.manager.MainloopManager; import projectzombie.audio.AudioEngine; @@ -33,14 +34,16 @@ import projectzombie.settings.Environment; import projectzombie.settings.Settings; import projectzombie.time.GameTimer; import projectzombie.time.NoSleep; -import projectzombie.worker.WorkerChunks; -import projectzombie.worker.WorkerFile; +import projectzombie.util.FileHelpers; +import projectzombie.worker.WorkerTasks; import projectzombie.worker.WorkerLighting; import projectzombie.world.World; import projectzombie.world.chunk.ChunkEventHandler; public class Main { + public static BdfReader bdf_saves; + public static Clipboard clipboard; public static MainloopManager mainloop; public static DisplayWindow window; @@ -49,9 +52,8 @@ public class Main public static AudioEngine audio; public static Random rand = new Random(); public static Menu menu; - public static WorkerFile workerFile; public static WorkerLighting workerLighting; - public static WorkerChunks[] workerChunks; + public static WorkerTasks[] workerChunks; public static boolean game_paused = false; public static boolean running = true; public static int tickrate = 10; @@ -60,18 +62,23 @@ public class Main { try { - clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + Runtime runtime = Runtime.getRuntime(); + int cores = runtime.availableProcessors(); - workerFile = new WorkerFile(); - workerFile.start(); + clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); workerLighting = new WorkerLighting(); workerLighting.start(); - workerChunks = new WorkerChunks[4]; + int workers = cores - 2; + if(workers < 1) { + workers = 1; + } + + workerChunks = new WorkerTasks[workers]; for(int i=0;i saves; private int saves_remove = -1; @@ -74,7 +75,7 @@ public class MenuSaves extends Menu Models.UI_SELECTION_BOX_WIDE.getWidth() * 254 / 256.0, Models.UI_SELECTION_BOX_WIDE.getHeight() * 126 / 128.0), 10); - reloadDatabase(); + reloadDatabase(Main.bdf_saves); buttonBack.setAlign(GUIAlignment.RIGHT); buttonCreate.setAlign(GUIAlignment.LEFT); @@ -99,14 +100,14 @@ public class MenuSaves extends Menu private void loadSave(int index) { - BdfObject bdf = reader.getObject(); + BdfObject bdf = Main.bdf_saves.getObject(); BdfNamedList nl = bdf.getNamedList(); BdfArray array = nl.get("saves").getArray(); BdfObject save_bdf = array.remove(index); array.add(save_bdf); - reader.saveDatabase(); + WorkerTasks.saveToFile("./saves.bdf.gz", Main.bdf_saves); Main.world = new World(saves.get(index).filename); Main.menu = new MenuLoadingWorld(); @@ -118,10 +119,9 @@ public class MenuSaves extends Menu Main.menu = new MenuWorldDelete(this, save.text, save.filename); } - public void reloadDatabase() + public void reloadDatabase(BdfReader reader) { saves.clear(); - reader = new BdfFileManager("./saves.bdf", true); BdfNamedList nl = reader.getObject().getNamedList(); BdfArray array = nl.get("saves").getArray(); diff --git a/src/projectzombie/menu/MenuSavingWorld.java b/src/projectzombie/menu/MenuSavingWorld.java index cf6d2fc..d57f8bb 100644 --- a/src/projectzombie/menu/MenuSavingWorld.java +++ b/src/projectzombie/menu/MenuSavingWorld.java @@ -9,7 +9,7 @@ import projectzombie.menu.gui.GUI; import projectzombie.menu.gui.GUIAlignment; import projectzombie.menu.gui.GUILabel; import projectzombie.util.gl.GlHelpers; -import projectzombie.worker.WorkerChunks; +import projectzombie.worker.WorkerTasks; import projectzombie.world.chunk.ChunkEventHandler; public class MenuSavingWorld extends Menu @@ -56,7 +56,7 @@ public class MenuSavingWorld extends Menu { super.update(); - if(WorkerChunks.isDone()) { + if(WorkerTasks.isDone()) { Main.menu = new MenuMain(); } } diff --git a/src/projectzombie/menu/MenuWorldDelete.java b/src/projectzombie/menu/MenuWorldDelete.java index dfc7c18..5a48141 100644 --- a/src/projectzombie/menu/MenuWorldDelete.java +++ b/src/projectzombie/menu/MenuWorldDelete.java @@ -9,7 +9,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; -import bdf.file.BdfFileManager; + import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -24,6 +24,8 @@ import projectzombie.menu.gui.GUIBackToMenu; import projectzombie.menu.gui.GUIButtonBasic; import projectzombie.menu.gui.GUILabel; import projectzombie.menu.gui.GUITextBox; +import projectzombie.util.FileHelpers; +import projectzombie.worker.WorkerTasks; public class MenuWorldDelete extends Menu { @@ -85,8 +87,7 @@ public class MenuWorldDelete extends Menu private void deleteSave() { - BdfFileManager reader = new BdfFileManager("./saves.bdf", true); - BdfObject bdf = reader.getObject(); + BdfObject bdf = Main.bdf_saves.getObject(); BdfNamedList nl = bdf.getNamedList(); BdfArray array = nl.get("saves").getArray(); @@ -132,8 +133,8 @@ public class MenuWorldDelete extends Menu Main.menu = parent; - reader.saveDatabase(); - parent.reloadDatabase(); + WorkerTasks.saveToFile("./saves.bdf.gz", Main.bdf_saves); + parent.reloadDatabase(Main.bdf_saves); } @Override diff --git a/src/projectzombie/menu/MenuWorldNew.java b/src/projectzombie/menu/MenuWorldNew.java index dfe1181..277be1a 100644 --- a/src/projectzombie/menu/MenuWorldNew.java +++ b/src/projectzombie/menu/MenuWorldNew.java @@ -2,10 +2,11 @@ package projectzombie.menu; import java.util.Random; -import bdf.file.BdfFileManager; + import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; +import bdf.types.BdfReader; import gl_engine.vec.Vec2d; import projectzombie.Main; import projectzombie.init.Models; @@ -16,6 +17,8 @@ import projectzombie.menu.gui.GUIBackToMenu; import projectzombie.menu.gui.GUIButtonBasic; import projectzombie.menu.gui.GUILabel; import projectzombie.menu.gui.GUITextBox; +import projectzombie.util.FileHelpers; +import projectzombie.worker.WorkerTasks; import projectzombie.world.World; public class MenuWorldNew extends Menu @@ -114,8 +117,7 @@ public class MenuWorldNew extends Menu return; } - BdfFileManager reader = new BdfFileManager("./saves.bdf", true); - BdfObject bdf = reader.getObject(); + BdfObject bdf = Main.bdf_saves.getObject(); BdfNamedList nl = bdf.getNamedList(); BdfArray array = nl.get("saves").getArray(); @@ -155,7 +157,7 @@ public class MenuWorldNew extends Menu save_nl.set("path", bdf.newObject().setString(path_new)); array.add(save_bdf); - reader.saveDatabase(); + WorkerTasks.saveToFile("./saves.bdf.gz", Main.bdf_saves); World.createWorld(path_new, seed); Main.menu = new MenuLoadingWorld(); diff --git a/src/projectzombie/settings/Environment.java b/src/projectzombie/settings/Environment.java index e745d03..8e802c4 100755 --- a/src/projectzombie/settings/Environment.java +++ b/src/projectzombie/settings/Environment.java @@ -4,7 +4,7 @@ import projectzombie.world.chunk.Chunk; public class Environment { - public static String gdir = "."; + public static String gdir = "./"; public static void init(String args[]) { diff --git a/src/projectzombie/settings/Settings.java b/src/projectzombie/settings/Settings.java index 4161bcf..7978fe7 100755 --- a/src/projectzombie/settings/Settings.java +++ b/src/projectzombie/settings/Settings.java @@ -1,19 +1,21 @@ package projectzombie.settings; -import bdf.classes.IBdfClassManager; -import bdf.file.BdfFileManager; +import projectzombie.util.ClassBdf; +import projectzombie.util.FileHelpers; +import projectzombie.worker.WorkerTasks; import bdf.types.BdfNamedList; import bdf.types.BdfObject; +import bdf.types.BdfReader; import bdf.types.BdfTypes; import projectzombie.display.DisplayRender; import projectzombie.display.DisplayRenderUI; import projectzombie.display.DisplayWindow; import projectzombie.world.chunk.Chunk; -public class Settings implements IBdfClassManager +public class Settings implements ClassBdf { public static final Settings SETTINGS = new Settings(); - private static BdfFileManager FILE_MANAGER; + private static BdfReader READER; @Override public void BdfClassLoad(BdfObject bdf) { @@ -120,13 +122,13 @@ public class Settings implements IBdfClassManager } public static void init() { - FILE_MANAGER = new BdfFileManager(Environment.gdir + "/settings.bdf", true); - SETTINGS.BdfClassLoad(FILE_MANAGER.getObject()); + READER = FileHelpers.readBDF("./settings.bdf.gz"); + SETTINGS.BdfClassLoad(READER.getObject()); } public static void update() { - SETTINGS.BdfClassSave(FILE_MANAGER.getObject()); - FILE_MANAGER.saveDatabase(); + SETTINGS.BdfClassSave(READER.getObject()); + WorkerTasks.saveToFile("./settings.bdf.gz", READER); } } diff --git a/src/projectzombie/task/Task.java b/src/projectzombie/task/Task.java index c8fe267..be9d6af 100644 --- a/src/projectzombie/task/Task.java +++ b/src/projectzombie/task/Task.java @@ -3,14 +3,14 @@ package projectzombie.task; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import bdf.classes.IBdfClassManager; +import projectzombie.util.ClassBdf; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; import projectzombie.entity.Entity; import projectzombie.init.Tasks; -public abstract class Task implements IBdfClassManager +public abstract class Task implements ClassBdf { protected Entity parent; diff --git a/src/projectzombie/util/ClassBdf.java b/src/projectzombie/util/ClassBdf.java new file mode 100644 index 0000000..4bd47e8 --- /dev/null +++ b/src/projectzombie/util/ClassBdf.java @@ -0,0 +1,8 @@ +package projectzombie.util; + +import bdf.types.BdfObject; + +public interface ClassBdf { + public void BdfClassLoad(BdfObject bdf); + public void BdfClassSave(BdfObject bdf); +} diff --git a/src/projectzombie/util/FileHelpers.java b/src/projectzombie/util/FileHelpers.java new file mode 100644 index 0000000..b42ef85 --- /dev/null +++ b/src/projectzombie/util/FileHelpers.java @@ -0,0 +1,37 @@ +package projectzombie.util; + +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.GZIPInputStream; + +import bdf.types.BdfReader; +import projectzombie.settings.Environment; + +public class FileHelpers +{ + public static BdfReader readBDF(String path) + { + try + { + InputStream in = new GZIPInputStream(new FileInputStream(Environment.gdir + path)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + byte buffer[] = new byte[1024]; + int size; + + while((size = in.read(buffer)) != -1) { + out.write(buffer, 0, size); + } + + in.close(); + + return new BdfReader(out.toByteArray()); + } + + catch(IOException e) { + return new BdfReader(); + } + } +} diff --git a/src/projectzombie/util/math/ItemStack.java b/src/projectzombie/util/math/ItemStack.java index 8772e04..6926c24 100755 --- a/src/projectzombie/util/math/ItemStack.java +++ b/src/projectzombie/util/math/ItemStack.java @@ -1,6 +1,6 @@ package projectzombie.util.math; -import bdf.classes.IBdfClassManager; +import projectzombie.util.ClassBdf; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -8,7 +8,7 @@ import projectzombie.init.Items; import projectzombie.items.Item; import projectzombie.items.modifier.ItemModifier; -public class ItemStack implements IBdfClassManager +public class ItemStack implements ClassBdf { public ItemModifier[] modifiers; public Item item; diff --git a/src/projectzombie/worker/WorkerChunkTask.java b/src/projectzombie/worker/WorkerChunkTask.java deleted file mode 100644 index c5b9765..0000000 --- a/src/projectzombie/worker/WorkerChunkTask.java +++ /dev/null @@ -1,13 +0,0 @@ -package projectzombie.worker; - -import java.util.Random; - -import gl_engine.vec.Vec2i; -import projectzombie.world.chunk.Chunk; -import projectzombie.world.layer.Layer; -import projectzombie.world.layer.layergen.LayerGen; - -abstract class WorkerChunkTask -{ - Vec2i pos; -} diff --git a/src/projectzombie/worker/WorkerChunkTaskLoad.java b/src/projectzombie/worker/WorkerChunkTaskLoad.java deleted file mode 100644 index 9c671ea..0000000 --- a/src/projectzombie/worker/WorkerChunkTaskLoad.java +++ /dev/null @@ -1,16 +0,0 @@ -package projectzombie.worker; - -import gl_engine.vec.Vec2i; -import projectzombie.world.layer.Layer; - -public class WorkerChunkTaskLoad extends WorkerChunkTask -{ - String path; - Layer layer; - - public WorkerChunkTaskLoad(String path, Layer layer, Vec2i pos) { - this.path = path; - this.layer = layer; - this.pos = pos; - } -} diff --git a/src/projectzombie/worker/WorkerChunkTaskSave.java b/src/projectzombie/worker/WorkerChunkTaskSave.java deleted file mode 100644 index e537556..0000000 --- a/src/projectzombie/worker/WorkerChunkTaskSave.java +++ /dev/null @@ -1,18 +0,0 @@ -package projectzombie.worker; - -import gl_engine.vec.Vec2i; -import projectzombie.world.chunk.Chunk; - -public class WorkerChunkTaskSave extends WorkerChunkTask -{ - Chunk chunk; - String path; - int id; - - public WorkerChunkTaskSave(String path, Vec2i pos, Chunk chunk, int id) { - this.path = path; - this.pos = pos; - this.chunk = chunk; - this.id = id; - } -} diff --git a/src/projectzombie/worker/WorkerChunks.java b/src/projectzombie/worker/WorkerChunks.java deleted file mode 100644 index b61e8ec..0000000 --- a/src/projectzombie/worker/WorkerChunks.java +++ /dev/null @@ -1,143 +0,0 @@ -package projectzombie.worker; - -import java.util.Random; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; - -import bdf.file.BdfFileManager; -import gl_engine.vec.Vec2i; -import projectzombie.Main; -import projectzombie.world.chunk.Chunk; -import projectzombie.world.layer.Layer; -import projectzombie.world.layer.layergen.LayerGen; - -public class WorkerChunks extends Thread -{ - private static Vector chunks_in = new Vector(); - private static AtomicReference> chunks_out = new AtomicReference>(); - - public static void generateChunk(LayerGen layergen, Layer layer, Chunk chunk, Random rand, Vec2i pos) { - chunks_in.add(new WorkerChunkTaskGenerate(layergen, layer, chunk, rand, pos.copy())); - } - - public static void loadChunk(String path, Layer layer, Vec2i pos) { - chunks_in.add(new WorkerChunkTaskLoad(path, layer, pos.copy())); - } - - public static void saveChunk(String path, Vec2i pos, Chunk chunk, int id) { - chunks_in.add(new WorkerChunkTaskSave(path, pos.copy(), chunk, id)); - } - - public static Vector getChunks() { - return chunks_out.getAndSet(new Vector()); - } - - public static boolean hasChunk(Vec2i cpos) - { - boolean has[] = {false}; - - chunks_in.forEach(c -> - { - if( - (c instanceof WorkerChunkTaskGenerate || - c instanceof WorkerChunkTaskLoad) && - c.pos.equal(cpos)) - { - has[0] = true; - } - }); - - return has[0]; - } - - public WorkerChunks() { - chunks_out.set(new Vector()); - } - - private synchronized WorkerChunkTask getNextIfAvailable() - { - if(chunks_in.size() == 0) { - return null; - } else { - return chunks_in.remove(0); - } - } - - @Override - public void run() - { - try - { - while(Main.running) - { - WorkerChunkTask ct = getNextIfAvailable(); - - if(ct == null) { - Thread.sleep(10); - continue; - } - - // Generate a new chunk - if(ct instanceof WorkerChunkTaskGenerate) - { - WorkerChunkTaskGenerate ct_g = (WorkerChunkTaskGenerate)ct; - - ct_g.layergen.generateChunk(ct_g.chunk, ct_g.layer, ct_g.rand, ct_g.pos); - - chunks_out.get().add(ct_g.chunk); - } - - // Load an existing chunk - if(ct instanceof WorkerChunkTaskLoad) - { - WorkerChunkTaskLoad ct_l = (WorkerChunkTaskLoad)ct; - - if(ct_l.path == null) { - System.out.println("ChunkLoad: Path is NULL"); - continue; - } - - String path = ( - "./saves/" + ct_l.path + "/c_" + ct_l.layer.id + - "_" + ct_l.pos.x + "_" + ct_l.pos.y + ".bdf"); - - BdfFileManager reader = new BdfFileManager(path, true); - - Chunk chunk = new Chunk(ct_l.layer, ct_l.pos, reader.getObject()); - - chunks_out.get().add(chunk); - } - - // Save a chunk - if(ct instanceof WorkerChunkTaskSave) - { - WorkerChunkTaskSave ct_s = (WorkerChunkTaskSave)ct; - - if(ct_s.path == null) { - System.out.println("ChunkSave: Path is NULL"); - continue; - } - - String path = ( - "./saves/" + ct_s.path + "/c_" + ct_s.id + - "_" + ct_s.pos.x + "_" + ct_s.pos.y + ".bdf"); - - BdfFileManager reader = new BdfFileManager(path, true); - - ct_s.chunk.BdfClassSave(reader.getObject()); - - reader.saveDatabase(); - } - } - } - - catch(InterruptedException e) { - e.printStackTrace(); - } - } - - public static boolean isDone() { - return chunks_in.size() == 0; - } -} diff --git a/src/projectzombie/worker/WorkerFile.java b/src/projectzombie/worker/WorkerFile.java index fae9386..4fd89fd 100644 --- a/src/projectzombie/worker/WorkerFile.java +++ b/src/projectzombie/worker/WorkerFile.java @@ -1,23 +1,19 @@ package projectzombie.worker; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; import java.util.Vector; -import java.util.zip.GZIPOutputStream; import bdf.types.BdfReader; import projectzombie.Main; public class WorkerFile extends Thread { - private static Vector tasks = new Vector(); + private static Vector tasks = new Vector(); public static void addTask(String path, BdfReader reader) { - tasks.add(new WorkerFileTask(path, reader)); + tasks.add(new WorkerTaskFile(path, reader)); } - private synchronized WorkerFileTask getNextIfAvailable() + private synchronized WorkerTaskFile getNextIfAvailable() { if(tasks.size() == 0) { return null; @@ -33,26 +29,14 @@ public class WorkerFile extends Thread { while(Main.running) { - WorkerFileTask task = getNextIfAvailable(); + WorkerTaskFile task = getNextIfAvailable(); if(task == null) { Thread.sleep(10); continue; } - try - { - OutputStream out = new FileOutputStream(task.path); - out = new GZIPOutputStream(out); - - task.reader.serialize().writeToStream(out); - - out.close(); - } - catch(IOException e) { - e.printStackTrace(); - } } } diff --git a/src/projectzombie/worker/WorkerFileTask.java b/src/projectzombie/worker/WorkerFileTask.java deleted file mode 100644 index c2471a7..0000000 --- a/src/projectzombie/worker/WorkerFileTask.java +++ /dev/null @@ -1,14 +0,0 @@ -package projectzombie.worker; - -import bdf.types.BdfReader; - -class WorkerFileTask -{ - String path; - BdfReader reader; - - public WorkerFileTask(String path, BdfReader reader) { - this.reader = reader; - this.path = path; - } -} diff --git a/src/projectzombie/worker/WorkerTask.java b/src/projectzombie/worker/WorkerTask.java new file mode 100644 index 0000000..2eb9835 --- /dev/null +++ b/src/projectzombie/worker/WorkerTask.java @@ -0,0 +1,10 @@ +package projectzombie.worker; + +import java.util.Vector; + +import projectzombie.world.chunk.Chunk; + +abstract class WorkerTask +{ + public abstract void run(); +} diff --git a/src/projectzombie/worker/WorkerTaskChunk.java b/src/projectzombie/worker/WorkerTaskChunk.java new file mode 100644 index 0000000..873aa86 --- /dev/null +++ b/src/projectzombie/worker/WorkerTaskChunk.java @@ -0,0 +1,8 @@ +package projectzombie.worker; + +import gl_engine.vec.Vec2i; + +public abstract class WorkerTaskChunk extends WorkerTask +{ + Vec2i pos; +} diff --git a/src/projectzombie/worker/WorkerChunkTaskGenerate.java b/src/projectzombie/worker/WorkerTaskChunkGenerate.java similarity index 61% rename from src/projectzombie/worker/WorkerChunkTaskGenerate.java rename to src/projectzombie/worker/WorkerTaskChunkGenerate.java index 8dc8202..10d6e13 100644 --- a/src/projectzombie/worker/WorkerChunkTaskGenerate.java +++ b/src/projectzombie/worker/WorkerTaskChunkGenerate.java @@ -1,24 +1,33 @@ package projectzombie.worker; import java.util.Random; +import java.util.Vector; import gl_engine.vec.Vec2i; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; import projectzombie.world.layer.layergen.LayerGen; -class WorkerChunkTaskGenerate extends WorkerChunkTask +class WorkerTaskChunkGenerate extends WorkerTaskChunk { Chunk chunk; LayerGen layergen; Layer layer; Random rand; - public WorkerChunkTaskGenerate(LayerGen layergen, Layer layer, Chunk chunk, Random rand, Vec2i pos) { + public WorkerTaskChunkGenerate(LayerGen layergen, Layer layer, Chunk chunk, Random rand, Vec2i pos) { this.chunk = chunk; this.layergen = layergen; this.layer = layer; this.rand = rand; this.pos = pos; } + + @Override + public void run() + { + layergen.generateChunk(chunk, layer, rand, pos); + + WorkerTasks.addChunkOut(chunk); + } } diff --git a/src/projectzombie/worker/WorkerTaskChunkLoad.java b/src/projectzombie/worker/WorkerTaskChunkLoad.java new file mode 100644 index 0000000..956177d --- /dev/null +++ b/src/projectzombie/worker/WorkerTaskChunkLoad.java @@ -0,0 +1,38 @@ +package projectzombie.worker; + +import java.util.Vector; + +import bdf.types.BdfReader; +import gl_engine.vec.Vec2i; +import projectzombie.util.FileHelpers; +import projectzombie.world.chunk.Chunk; +import projectzombie.world.layer.Layer; + +public class WorkerTaskChunkLoad extends WorkerTaskChunk +{ + String path; + Layer layer; + + public WorkerTaskChunkLoad(String path, Layer layer, Vec2i pos) { + this.path = path; + this.layer = layer; + this.pos = pos; + } + + @Override + public void run() + { + if(path == null) { + System.out.println("ChunkLoad: Path is NULL"); + return; + } + + String path = "./saves/" + this.path + "/c_" + layer.id + "_" + pos.x + "_" + pos.y + ".bdf.gz"; + + BdfReader reader = FileHelpers.readBDF(path); + + Chunk chunk = new Chunk(layer, pos, reader.getObject()); + + WorkerTasks.addChunkOut(chunk); + } +} diff --git a/src/projectzombie/worker/WorkerTaskChunkSave.java b/src/projectzombie/worker/WorkerTaskChunkSave.java new file mode 100644 index 0000000..4d6536b --- /dev/null +++ b/src/projectzombie/worker/WorkerTaskChunkSave.java @@ -0,0 +1,54 @@ +package projectzombie.worker; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Vector; +import java.util.zip.GZIPOutputStream; + +import bdf.types.BdfReader; +import gl_engine.vec.Vec2i; +import projectzombie.settings.Environment; +import projectzombie.util.FileHelpers; +import projectzombie.world.chunk.Chunk; + +public class WorkerTaskChunkSave extends WorkerTaskChunk +{ + Chunk chunk; + String path; + int id; + + public WorkerTaskChunkSave(String path, Vec2i pos, Chunk chunk, int id) { + this.path = path; + this.pos = pos; + this.chunk = chunk; + this.id = id; + } + + @Override + public void run() + { + if(path == null) { + return; + } + + String path = "./saves/" + this.path + "/c_" + id + "_" + pos.x + "_" + pos.y + ".bdf.gz"; + + BdfReader reader = new BdfReader(); + + chunk.BdfClassSave(reader.getObject()); + + try + { + OutputStream out = new GZIPOutputStream(new FileOutputStream(Environment.gdir + path)); + + reader.serialize().writeToStream(out); + + out.close(); + } + + catch(IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/projectzombie/worker/WorkerTaskFile.java b/src/projectzombie/worker/WorkerTaskFile.java new file mode 100644 index 0000000..8c049ec --- /dev/null +++ b/src/projectzombie/worker/WorkerTaskFile.java @@ -0,0 +1,39 @@ +package projectzombie.worker; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Vector; +import java.util.zip.GZIPOutputStream; + +import bdf.types.BdfReader; +import projectzombie.settings.Environment; +import projectzombie.world.chunk.Chunk; + +class WorkerTaskFile extends WorkerTask +{ + String path; + BdfReader reader; + + public WorkerTaskFile(String path, BdfReader reader) { + this.reader = reader; + this.path = path; + } + + @Override + public void run() + { + try + { + OutputStream out = new GZIPOutputStream(new FileOutputStream(Environment.gdir + path)); + + reader.serialize().writeToStream(out); + + out.close(); + } + + catch(IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/projectzombie/worker/WorkerTasks.java b/src/projectzombie/worker/WorkerTasks.java new file mode 100644 index 0000000..ba5be0b --- /dev/null +++ b/src/projectzombie/worker/WorkerTasks.java @@ -0,0 +1,102 @@ +package projectzombie.worker; + +import java.util.Random; +import java.util.Vector; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + + +import bdf.types.BdfReader; +import gl_engine.vec.Vec2i; +import projectzombie.Main; +import projectzombie.world.chunk.Chunk; +import projectzombie.world.layer.Layer; +import projectzombie.world.layer.layergen.LayerGen; + +public class WorkerTasks extends Thread +{ + private static Vector tasks_in = new Vector(); + private static AtomicReference> chunks_out = new AtomicReference>(); + + public static void generateChunk(LayerGen layergen, Layer layer, Chunk chunk, Random rand, Vec2i pos) { + tasks_in.add(new WorkerTaskChunkGenerate(layergen, layer, chunk, rand, pos.copy())); + } + + public static void loadChunk(String path, Layer layer, Vec2i pos) { + tasks_in.add(new WorkerTaskChunkLoad(path, layer, pos.copy())); + } + + public static void saveChunk(String path, Vec2i pos, Chunk chunk, int id) { + tasks_in.add(new WorkerTaskChunkSave(path, pos.copy(), chunk, id)); + } + + public static void saveToFile(String path, BdfReader reader) { + tasks_in.add(new WorkerTaskFile(path, reader)); + } + + public synchronized static Vector getChunks() { + return chunks_out.getAndSet(new Vector()); + } + + synchronized static void addChunkOut(Chunk chunk) { + chunks_out.get().add(chunk); + } + + public static boolean hasChunk(Vec2i cpos) + { + boolean has[] = {false}; + + tasks_in.forEach(c -> + { + if( + (c instanceof WorkerTaskChunkGenerate || + c instanceof WorkerTaskChunkLoad) && + ((WorkerTaskChunk)c).pos.equal(cpos)) + { + has[0] = true; + } + }); + + return has[0]; + } + + public WorkerTasks() { + chunks_out.set(new Vector()); + } + + private static synchronized WorkerTask getNextIfAvailable() + { + if(tasks_in.size() == 0) { + return null; + } else { + return tasks_in.remove(0); + } + } + + @Override + public void run() + { + try + { + while(Main.running) + { + WorkerTask ct = getNextIfAvailable(); + + if(ct == null) { + Thread.sleep(10); + continue; + } + + ct.run(); + } + } + + catch(InterruptedException e) { + e.printStackTrace(); + } + } + + public static boolean isDone() { + return tasks_in.size() == 0; + } +} diff --git a/src/projectzombie/world/World.java b/src/projectzombie/world/World.java index e1639e8..42f27a1 100755 --- a/src/projectzombie/world/World.java +++ b/src/projectzombie/world/World.java @@ -8,8 +8,8 @@ import java.util.Random; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL33; -import bdf.classes.IBdfClassManager; -import bdf.file.BdfFileManager; +import projectzombie.util.ClassBdf; +import projectzombie.util.FileHelpers; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -25,12 +25,13 @@ import projectzombie.init.LayerGenerators; import projectzombie.init.Layers; import projectzombie.menu.MenuLoadingWorld; import projectzombie.model.Model; +import projectzombie.settings.Environment; import projectzombie.time.GameTimer; -import projectzombie.worker.WorkerFile; +import projectzombie.worker.WorkerTasks; import projectzombie.world.chunk.ChunkEventHandler; import projectzombie.world.layer.Layer; -public class World implements IBdfClassManager +public class World implements ClassBdf { public static final double BIOME_SIZE = 1024; @@ -53,16 +54,16 @@ public class World implements IBdfClassManager if(path != null) { path = "./saves/" + path + "/"; - File save_dir = new File(path); - File file_dir = new File(path + "world.bdf"); + File save_dir = new File(Environment.gdir + path); + File file_dir = new File(Environment.gdir + path + "world.bdf.gz"); if(!save_dir.exists()) { save_dir.mkdirs(); } if(file_dir.exists()) { - BdfFileManager file_manager = new BdfFileManager(path + "world.bdf", true); - BdfClassLoad(file_manager.getObject()); + BdfReader reader = FileHelpers.readBDF(path + "world.bdf.gz"); + BdfClassLoad(reader.getObject()); } } } @@ -272,7 +273,7 @@ public class World implements IBdfClassManager BdfObject bdf = reader.getObject(); BdfClassSave(bdf); - WorkerFile.addTask("./saves/" + path + "/world.bdf", reader); + WorkerTasks.saveToFile("./saves/" + path + "/world.bdf.gz", reader); } } diff --git a/src/projectzombie/world/chunk/Chunk.java b/src/projectzombie/world/chunk/Chunk.java index d4a3647..2ae7e82 100755 --- a/src/projectzombie/world/chunk/Chunk.java +++ b/src/projectzombie/world/chunk/Chunk.java @@ -4,7 +4,7 @@ import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.Random; -import bdf.classes.IBdfClassManager; +import projectzombie.util.ClassBdf; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -34,7 +34,7 @@ import projectzombie.util.math.TileState; import projectzombie.util.math.random.RandomHelpers; import projectzombie.world.layer.Layer; -public class Chunk implements IBdfClassManager +public class Chunk implements ClassBdf { public static final Range2i CHUNK_SIZE = new Range2i(16, 16); public static final Chunk CHUNK_EMPTY = new ChunkEmpty(); diff --git a/src/projectzombie/world/chunk/ChunkEventHandler.java b/src/projectzombie/world/chunk/ChunkEventHandler.java index dda2edf..9eca38d 100755 --- a/src/projectzombie/world/chunk/ChunkEventHandler.java +++ b/src/projectzombie/world/chunk/ChunkEventHandler.java @@ -7,7 +7,7 @@ import mainloop.task.IMainloopTask; import projectzombie.Main; import projectzombie.display.DisplayLighting; import projectzombie.util.math.map.Map2DElement; -import projectzombie.worker.WorkerChunks; +import projectzombie.worker.WorkerTasks; import projectzombie.world.layer.Layer; public class ChunkEventHandler implements IMainloopTask @@ -74,7 +74,7 @@ public class ChunkEventHandler implements IMainloopTask Vec2i c_pos = new Vec2i(cx, cy); // Is this chunk not loaded - if(!layer.chunkLoaded(c_pos) && !WorkerChunks.hasChunk(c_pos)) + if(!layer.chunkLoaded(c_pos) && !WorkerTasks.hasChunk(c_pos)) { // Load the chunk layer.loadChunk(c_pos); diff --git a/src/projectzombie/world/layer/Layer.java b/src/projectzombie/world/layer/Layer.java index d34d2bc..734aff7 100755 --- a/src/projectzombie/world/layer/Layer.java +++ b/src/projectzombie/world/layer/Layer.java @@ -4,7 +4,7 @@ import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.Random; -import bdf.classes.IBdfClassManager; +import projectzombie.util.ClassBdf; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -21,11 +21,11 @@ import projectzombie.util.math.TileState; import projectzombie.util.math.map.Map2D; import projectzombie.util.math.map.Map2DElement; import projectzombie.util.math.random.NoiseGenerator; -import projectzombie.worker.WorkerChunks; +import projectzombie.worker.WorkerTasks; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.layergen.LayerGen; -public class Layer implements IBdfClassManager +public class Layer implements ClassBdf { public Map2D chunks; public NoiseGenerator[] noise_gens; @@ -269,7 +269,7 @@ public class Layer implements IBdfClassManager public void loadChunks() { - WorkerChunks.getChunks().forEach(chunk -> + WorkerTasks.getChunks().forEach(chunk -> { if(chunk.layer != this) { return; @@ -296,7 +296,7 @@ public class Layer implements IBdfClassManager { // Has the chunk been saved for later if(hasSavedChunk(pos)) { - WorkerChunks.loadChunk(Main.world.getSavePath(), this, pos); + WorkerTasks.loadChunk(Main.world.getSavePath(), this, pos); } else @@ -306,7 +306,7 @@ public class Layer implements IBdfClassManager // Create and generate the chunk Chunk chunk = new Chunk(this, pos, rand); - WorkerChunks.generateChunk(layergen, this, chunk, new Random(cseed), pos); + WorkerTasks.generateChunk(layergen, this, chunk, new Random(cseed), pos); } } @@ -316,7 +316,7 @@ public class Layer implements IBdfClassManager Chunk chunk = chunks.get(pos); if(chunk.isDirty()) { - WorkerChunks.saveChunk(Main.world.getSavePath(), pos, chunk, id); + WorkerTasks.saveChunk(Main.world.getSavePath(), pos, chunk, id); if(!hasSavedChunk(pos)) { chunks_saved.add(pos); @@ -362,19 +362,18 @@ public class Layer implements IBdfClassManager { BdfNamedList nl = bdf.getNamedList(); - BdfArray bdf_chunks = nl.get("chunks").getArray(); + int[] bdf_chunks = nl.get("chunks").getIntegerArray(); this.layergen = LayerGenerators.loadFromID((int)nl.get("lgen").getAutoInt()); - this.chunks_saved = new ArrayList(bdf_chunks.size()); + this.chunks_saved = new ArrayList(bdf_chunks.length / 2); this.chunks = new Map2D(layergen); this.seed = nl.get("seed").getLong(); this.lseed = nl.get("lseed").getLong(); this.id = (int)nl.get("id").getAutoInt(); this.rand = new Random(); - for(BdfObject bdf_chunk : bdf_chunks) { - Vec2i c = new Vec2i(bdf_chunk); - chunks_saved.add(c); + for(int i=0;i