From 02355bfedc202886a229cc01773aad677584647f Mon Sep 17 00:00:00 2001 From: jsrobson10 Date: Tue, 22 Sep 2020 12:11:40 +1000 Subject: [PATCH] Added a queue to the saving system to prevent world corruption from chunks saving without the player. This also removes possibility for a saving based duplication glitch. Started adding more wood items. --- src/projectzombie/Main.java | 4 +- .../entity/player/EntityPlayer.java | 33 +- src/projectzombie/init/Items.java | 3 + src/projectzombie/init/Models.java | 18 + src/projectzombie/init/Recipes.java | 7 + src/projectzombie/items/Item.java | 6 + src/projectzombie/items/ItemWoodPlanks.java | 40 ++ src/projectzombie/menu/MenuSaves.java | 1 - src/projectzombie/menu/MenuWorldDelete.java | 1 - src/projectzombie/menu/MenuWorldNew.java | 2 - src/projectzombie/model/ModelWall.java | 113 ++++ src/projectzombie/settings/Settings.java | 4 +- src/projectzombie/tiles/TileHemp.java | 2 +- src/projectzombie/util/FileHelpers.java | 37 -- src/projectzombie/util/SaveSystem.java | 87 +++ .../worker/WorkerTaskChunkLoad.java | 4 +- .../worker/WorkerTaskChunkSave.java | 54 -- src/projectzombie/worker/WorkerTasks.java | 4 - src/projectzombie/world/World.java | 10 +- src/projectzombie/world/layer/Layer.java | 5 +- src/resources/texture/item/wood_planks.png | Bin 0 -> 2192 bytes .../texture/item/wood_snow_planks.png | Bin 0 -> 2155 bytes src/resources/texture/item/wood_snow_wall.png | Bin 0 -> 842 bytes src/resources/texture/item/wood_wall.png | Bin 0 -> 2122 bytes src/resources/texture/list.txt | 501 +++++++++--------- src/resources/texture/tile/wood_floor.png | Bin 0 -> 1836 bytes .../texture/tile/wood_snow_floor.png | Bin 0 -> 1864 bytes .../texture/tile/wood_snow_wall_front.png | Bin 0 -> 2364 bytes .../texture/tile/wood_snow_wall_side.png | Bin 0 -> 746 bytes .../texture/tile/wood_snow_wall_top.png | Bin 0 -> 1643 bytes .../texture/tile/wood_wall_front.png | Bin 0 -> 1024 bytes src/resources/texture/tile/wood_wall_side.png | Bin 0 -> 755 bytes src/resources/texture/tile/wood_wall_top.png | Bin 0 -> 703 bytes 33 files changed, 571 insertions(+), 365 deletions(-) create mode 100644 src/projectzombie/items/ItemWoodPlanks.java create mode 100644 src/projectzombie/model/ModelWall.java delete mode 100644 src/projectzombie/util/FileHelpers.java create mode 100644 src/projectzombie/util/SaveSystem.java delete mode 100644 src/projectzombie/worker/WorkerTaskChunkSave.java create mode 100644 src/resources/texture/item/wood_planks.png create mode 100644 src/resources/texture/item/wood_snow_planks.png create mode 100644 src/resources/texture/item/wood_snow_wall.png create mode 100644 src/resources/texture/item/wood_wall.png create mode 100644 src/resources/texture/tile/wood_floor.png create mode 100644 src/resources/texture/tile/wood_snow_floor.png create mode 100644 src/resources/texture/tile/wood_snow_wall_front.png create mode 100644 src/resources/texture/tile/wood_snow_wall_side.png create mode 100644 src/resources/texture/tile/wood_snow_wall_top.png create mode 100644 src/resources/texture/tile/wood_wall_front.png create mode 100644 src/resources/texture/tile/wood_wall_side.png create mode 100644 src/resources/texture/tile/wood_wall_top.png diff --git a/src/projectzombie/Main.java b/src/projectzombie/Main.java index e6e9dbb..58fdaf1 100755 --- a/src/projectzombie/Main.java +++ b/src/projectzombie/Main.java @@ -35,7 +35,7 @@ import projectzombie.settings.Environment; import projectzombie.settings.Settings; import projectzombie.time.GameTimer; import projectzombie.time.NoSleep; -import projectzombie.util.FileHelpers; +import projectzombie.util.SaveSystem; import projectzombie.worker.WorkerTasks; import projectzombie.worker.WorkerLighting; import projectzombie.world.World; @@ -108,7 +108,7 @@ public class Main LayerGenerators.init(); Recipes.init(); - bdf_saves = FileHelpers.readBDF("./saves.bdf.gz"); + bdf_saves = SaveSystem.readBDF("./saves.bdf.gz"); // Create the display window = new DisplayWindow(); diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java index 417901a..60c2107 100755 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -60,6 +60,7 @@ public class EntityPlayer extends Entity implements private Vec2i break_pos = new Vec2i(0, 0); public boolean dead = false; public boolean in_animation = false; + public int attackedCooldown = 0; private ArrayList tasks; private Inventory inventory; @@ -88,9 +89,8 @@ public class EntityPlayer extends Entity implements angle = nl.get("angle").getDouble(); temperature = nl.get("temperature").getDouble(); hydration = nl.get("hydration").getDouble(); - in_animation = nl.get("inAnimation").getBoolean(); - moving = nl.get("moving").getBoolean(); inventory_hand = nl.get("hand").getInteger(); + attackedCooldown = nl.get("attackedCooldown").getInteger(); tasks = new ArrayList(); @@ -122,9 +122,8 @@ public class EntityPlayer extends Entity implements nl.set("temperature", bdf.newObject().setDouble(temperature)); nl.set("hydration", bdf.newObject().setDouble(hydration)); nl.set("tasks", Task.saveTasks(bdf.newObject(), tasks.toArray(new Task[0]))); - nl.set("inAnimation", bdf.newObject().setBoolean(in_animation)); - nl.set("moving", bdf.newObject().setBoolean(moving)); nl.set("hand", bdf.newObject().setInteger(inventory_hand)); + nl.set("attackedCooldown", bdf.newObject().setInteger(attackedCooldown)); } public EntityPlayer() { @@ -201,6 +200,10 @@ public class EntityPlayer extends Entity implements // Call super super.tick(chunk, layer); + if(attackedCooldown > 0) { + attackedCooldown -= 1; + } + double temp_diff = MathHelpers.biggest( layer.layergen.getTemperature(layer, getPos().xz()), chunk.getLightLevel(getPos().xz().toInt()) * 0.6) - temperature; @@ -210,15 +213,22 @@ public class EntityPlayer extends Entity implements if(temperature < 0.3) { health -= 2 * (0.3 - temperature); + resetAttackTimer(); } - if(temperature > 0.7) { + else if(temperature > 0.7) { health -= 4 * (temperature - 0.7); + resetAttackTimer(); + } + + else if(attackedCooldown == 0 && health < health_max) { + health += 0.1; } if(hydration <= 0) { hydration = 0; health -= 0.1; + resetAttackTimer(); } // Rotate left @@ -350,8 +360,12 @@ public class EntityPlayer extends Entity implements @Override public void addDamage(double amount) { - //amount = amount / (defence_level / 2.5 + 1); health -= amount; + resetAttackTimer(); + } + + public void resetAttackTimer() { + attackedCooldown = 3000; // Don't heal for 30 seconds } @Override @@ -425,7 +439,8 @@ public class EntityPlayer extends Entity implements Model model_place = holding.item.getPlaceModel(holding); Model model_spawn = holding.item.getSpawnModel(holding); Vec2d pos = ppos.xz().add(MathHelpers.moveTowards2(1, Math.toRadians(angle))); - boolean render_place_model = model_place != null && layer.getFrontTile(pos.toInt()).tile == Tiles.VOID; + boolean render_place_model = model_place != null && + holding.item.showPlaceModel(layer, pos.toInt(), holding); if(render_place_model || model_spawn != null) { @@ -434,13 +449,13 @@ public class EntityPlayer extends Entity implements if(render_place_model) { - model_place.setModel(Matrix4.translate(Math.floor(pos.x) - ppos.x + 0.5, 0, Math.floor(pos.y) - ppos.z + 0.5)); + model_place.setModel(Matrix4.translate(Math.floor(pos.x) - ppos.x + 0.5, 0.001, Math.floor(pos.y) - ppos.z + 0.5)); model_place.render(); } if(model_spawn != null) { - model_spawn.setModel(Matrix4.translate(pos.x - ppos.x, 0, pos.y - ppos.z)); + model_spawn.setModel(Matrix4.translate(pos.x - ppos.x, 0.001, pos.y - ppos.z)); model_spawn.render(); } diff --git a/src/projectzombie/init/Items.java b/src/projectzombie/init/Items.java index 1ad8e4d..f2df7f3 100755 --- a/src/projectzombie/init/Items.java +++ b/src/projectzombie/init/Items.java @@ -31,6 +31,7 @@ import projectzombie.items.ItemStonePick; import projectzombie.items.ItemStoneShovel; import projectzombie.items.ItemTnt; import projectzombie.items.ItemTorch; +import projectzombie.items.ItemWoodPlanks; import projectzombie.items.ItemWorkbench; import projectzombie.items.spawner.ItemSpawnDummy; import projectzombie.items.spawner.ItemSpawnZombie; @@ -78,6 +79,7 @@ public class Items register(CLAY_POT_WET); register(TORCH); register(COAL); + register(WOOD_PLANKS); } public static final Item AMMO = new ItemAmmo(); @@ -111,4 +113,5 @@ public class Items public static final Item CLAY_POT_WET = new ItemClayPotWet(); public static final Item TORCH = new ItemTorch(); public static final Item COAL = new ItemCoal(); + public static final Item WOOD_PLANKS = new ItemWoodPlanks(); } diff --git a/src/projectzombie/init/Models.java b/src/projectzombie/init/Models.java index b5316c2..2d32baa 100755 --- a/src/projectzombie/init/Models.java +++ b/src/projectzombie/init/Models.java @@ -18,6 +18,7 @@ import projectzombie.model.ModelTile; import projectzombie.model.ModelTree; import projectzombie.model.ModelTreeSnow; import projectzombie.model.ModelVertical; +import projectzombie.model.ModelWall; public class Models { @@ -89,6 +90,19 @@ public class Models public static final Model TILE_ROCK_COAL = new ModelRock(Resources.ATLAS.get("/tile/rock_coal.png")); public static final Model TILE_ROCK_URANIUM = new ModelRock(Resources.ATLAS.get("/tile/rock_uranium.png")); + public static final Model TILE_WOOD_FLOOR = new ModelTile(Resources.ATLAS.get("/tile/wood_floor.png")); + public static final Model TILE_WOOD_SNOW_FLOOR = new ModelTile(Resources.ATLAS.get("/tile/wood_snow_floor.png")); + + public static final Model[] TILE_WOOD_WALL = ModelWall.rotationArray( + Resources.ATLAS.get("/tile/wood_wall_front.png"), + Resources.ATLAS.get("/tile/wood_wall_top.png"), + Resources.ATLAS.get("/tile/wood_wall_side.png")); + + public static final Model[] TILE_WOOD_SNOW_WALL = ModelWall.rotationArray( + Resources.ATLAS.get("/tile/wood_snow_wall_front.png"), + Resources.ATLAS.get("/tile/wood_snow_wall_top.png"), + Resources.ATLAS.get("/tile/wood_snow_wall_side.png")); + public static final Model ENTITY_BOSS_IDLE = new ModelVertical(Resources.ATLAS.get("/entity/boss1/boss_still.png"), new Vec2d(4, 4)); public static final Model ENTITY_BOSS_FIRING = new ModelVertical(Resources.ATLAS.get("/entity/boss1/boss_firing.png"), new Vec2d(4, 4), 4, 50); public static final Model ENTITY_BOSS_WALKING = new ModelVertical(Resources.ATLAS.get("/entity/boss1/boss_walking.png"), new Vec2d(4, 4), 4, 50); @@ -199,6 +213,10 @@ public class Models public static final ModelItem ITEM_LOG_SNOW = new ModelItem(Resources.ATLAS.get("/item/log_snow.png")); public static final ModelItem ITEM_CHARCOAL = new ModelItem(Resources.ATLAS.get("/item/charcoal.png")); public static final ModelItem ITEM_ASH = new ModelItem(Resources.ATLAS.get("/item/ash.png")); + public static final ModelItem ITEM_WOOD_FLOOR = new ModelItem(Resources.ATLAS.get("/item/wood_floor.png")); + public static final ModelItem ITEM_WOOD_SNOW_FLOOR = new ModelItem(Resources.ATLAS.get("/item/wood_snow_floor.png")); + public static final ModelItem ITEM_WOOD_PLANKS = new ModelItem(Resources.ATLAS.get("/item/wood_planks.png")); + public static final ModelItem ITEM_WOOD_SNOW_PLANKS = new ModelItem(Resources.ATLAS.get("/item/wood_snow_planks.png")); // Player varients public static final ModelPlayer ENTITY_PLAYER_W = new ModelPlayer( diff --git a/src/projectzombie/init/Recipes.java b/src/projectzombie/init/Recipes.java index 5adf0ca..ffac85c 100644 --- a/src/projectzombie/init/Recipes.java +++ b/src/projectzombie/init/Recipes.java @@ -41,6 +41,13 @@ public class Recipes // Basic crafting items + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.LOG, 1), + }, new Crafting[] { + Crafting.BASIC, + }, new ItemStack(Items.WOOD_PLANKS, 2))); + recipies.add(new RecipeBasic( new ItemStack[] { new ItemStack(Items.FLINT, 2), diff --git a/src/projectzombie/items/Item.java b/src/projectzombie/items/Item.java index 3abad39..a376291 100755 --- a/src/projectzombie/items/Item.java +++ b/src/projectzombie/items/Item.java @@ -3,10 +3,12 @@ package projectzombie.items; import gl_engine.vec.Vec2d; import gl_engine.vec.Vec2i; import gl_engine.vec.Vec3d; +import projectzombie.Main; import projectzombie.entity.Entity; import projectzombie.entity.EntityHasInventory; import projectzombie.entity.player.EntityPlayer; import projectzombie.init.Models; +import projectzombie.init.Tiles; import projectzombie.inventory.IInventory; import projectzombie.items.modifier.ItemModifierDamage; import projectzombie.model.Model; @@ -36,6 +38,10 @@ public abstract class Item return null; } + public boolean showPlaceModel(Layer layer, Vec2i pos, ItemStack stack) { + return layer.getFrontTile(pos).tile == Tiles.VOID; + } + public Model getSpawnModel(ItemStack stack) { return null; } diff --git a/src/projectzombie/items/ItemWoodPlanks.java b/src/projectzombie/items/ItemWoodPlanks.java new file mode 100644 index 0000000..79e8aba --- /dev/null +++ b/src/projectzombie/items/ItemWoodPlanks.java @@ -0,0 +1,40 @@ +package projectzombie.items; + +import gl_engine.vec.Vec2i; +import projectzombie.init.Models; +import projectzombie.items.modifier.ItemModifierMeta; +import projectzombie.model.Model; +import projectzombie.model.ModelItem; +import projectzombie.util.ItemStack; +import projectzombie.world.layer.Layer; + +public class ItemWoodPlanks extends Item +{ + + @Override + public ModelItem getModel(ItemStack stack) + { + switch(ItemModifierMeta.getStackMeta(stack)) + { + case 0: return Models.ITEM_WOOD_PLANKS; + case 1: return Models.ITEM_WOOD_SNOW_PLANKS; + default: return Models.ITEM_EMPTY; + } + } + + @Override + public boolean showPlaceModel(Layer layer, Vec2i pos, ItemStack stack) { + return true; + } + + @Override + public Model getPlaceModel(ItemStack stack) { + return Models.TILE_WOOD_FLOOR; + } + + @Override + public String getName(ItemStack stack) { + return "Wood Planks"; + } + +} diff --git a/src/projectzombie/menu/MenuSaves.java b/src/projectzombie/menu/MenuSaves.java index 087653e..8bc9277 100644 --- a/src/projectzombie/menu/MenuSaves.java +++ b/src/projectzombie/menu/MenuSaves.java @@ -21,7 +21,6 @@ import projectzombie.menu.gui.GUIContainerSlider; import projectzombie.menu.gui.GUILabel; import projectzombie.menu.gui.GUISavesCard; import projectzombie.model.ModelGui; -import projectzombie.util.FileHelpers; import projectzombie.worker.WorkerTasks; import projectzombie.world.World; diff --git a/src/projectzombie/menu/MenuWorldDelete.java b/src/projectzombie/menu/MenuWorldDelete.java index 5a48141..2c40b37 100644 --- a/src/projectzombie/menu/MenuWorldDelete.java +++ b/src/projectzombie/menu/MenuWorldDelete.java @@ -24,7 +24,6 @@ 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 diff --git a/src/projectzombie/menu/MenuWorldNew.java b/src/projectzombie/menu/MenuWorldNew.java index 277be1a..9cfbc42 100644 --- a/src/projectzombie/menu/MenuWorldNew.java +++ b/src/projectzombie/menu/MenuWorldNew.java @@ -6,7 +6,6 @@ import java.util.Random; 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; @@ -17,7 +16,6 @@ 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; diff --git a/src/projectzombie/model/ModelWall.java b/src/projectzombie/model/ModelWall.java new file mode 100644 index 0000000..4c3b22c --- /dev/null +++ b/src/projectzombie/model/ModelWall.java @@ -0,0 +1,113 @@ +package projectzombie.model; + +import gl_engine.texture.TextureRef3D; + +public class ModelWall extends Model +{ + private int rotation; + private TextureRef3D front; + private TextureRef3D side; + private TextureRef3D top; + + public ModelWall(TextureRef3D front, TextureRef3D top, TextureRef3D side, int rotation) { + this.rotation = rotation; + this.front = front; + this.side = side; + this.top = top; + } + + public static ModelWall[] rotationArray(TextureRef3D front, TextureRef3D top, TextureRef3D side) { + return new ModelWall[] { + new ModelWall(front, top, side, 0), + new ModelWall(front, top, side, 1), + new ModelWall(front, top, side, 2), + new ModelWall(front, top, side, 3), + }; + } + + @Override + public int[] getIndicies() { + return new int[] { + 0, 1, 2, + 2, 3, 0, + + 4, 5, 6, + 6, 7, 4, + + 8, 9, 10, + 10, 11, 8, + + 12, 13, 14, + 14, 15, 12, + + 16, 17, 18, + 18, 19, 16, + }; + } + + @Override + public float[] getVerticies() + { + float x1 = 0.5f, z1 = 0.5f, x2 = 0.25f, z2 = -0.5f; + + return new float[] + { + x1, 0, z1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x1, 0, z2, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x1, 1, z2, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x1, 1, z1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + + x2, 0, z1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 0, z2, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 1, z2, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 1, z1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + + x1, 0, z1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 0, z1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 1, z1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x1, 1, z1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + + x1, 0, z2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 0, z2, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 1, z2, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x1, 1, z2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + + x1, 1, z1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 1, z1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x2, 1, z2, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x1, 1, z2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + }; + } + + @Override + public TextureRef3D[] getTextures() { + return new TextureRef3D[] { + front, front, front, front, + front, front, front, front, + side, side, side, side, + side, side, side, side, + top, top, top, top, + }; + } + + @Override + public double getWidth() { + return 1; + } + + @Override + public double getHeight() { + return 1; + } + + @Override + public int getIndexSize() { + return 30; + } + + @Override + public int getSize() { + return 20; + } + +} diff --git a/src/projectzombie/settings/Settings.java b/src/projectzombie/settings/Settings.java index 7978fe7..f21427d 100755 --- a/src/projectzombie/settings/Settings.java +++ b/src/projectzombie/settings/Settings.java @@ -1,7 +1,7 @@ package projectzombie.settings; import projectzombie.util.ClassBdf; -import projectzombie.util.FileHelpers; +import projectzombie.util.SaveSystem; import projectzombie.worker.WorkerTasks; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -122,7 +122,7 @@ public class Settings implements ClassBdf } public static void init() { - READER = FileHelpers.readBDF("./settings.bdf.gz"); + READER = SaveSystem.readBDF("./settings.bdf.gz"); SETTINGS.BdfClassLoad(READER.getObject()); } diff --git a/src/projectzombie/tiles/TileHemp.java b/src/projectzombie/tiles/TileHemp.java index 2a4673e..91b4369 100644 --- a/src/projectzombie/tiles/TileHemp.java +++ b/src/projectzombie/tiles/TileHemp.java @@ -24,7 +24,7 @@ public class TileHemp extends Tile public void tickRandomly(Layer layer, Chunk chunk, TileState state, Vec2i pos) { super.tickRandomly(layer, chunk, state, pos); - if(Math.random() > 0.9) { + if(Math.random() > 0.96) { if(state.meta < 7) { layer.setFrontTile(new TileState(this, state.meta + 1), pos); } diff --git a/src/projectzombie/util/FileHelpers.java b/src/projectzombie/util/FileHelpers.java deleted file mode 100644 index b42ef85..0000000 --- a/src/projectzombie/util/FileHelpers.java +++ /dev/null @@ -1,37 +0,0 @@ -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/SaveSystem.java b/src/projectzombie/util/SaveSystem.java new file mode 100644 index 0000000..a5d886a --- /dev/null +++ b/src/projectzombie/util/SaveSystem.java @@ -0,0 +1,87 @@ +package projectzombie.util; + +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.zip.GZIPInputStream; + +import bdf.types.BdfReader; +import projectzombie.Main; +import projectzombie.settings.Environment; +import projectzombie.worker.WorkerTasks; +import projectzombie.world.chunk.Chunk; + +public class SaveSystem +{ + private static HashMap map = new HashMap(); + + 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(); + } + } + + public synchronized static void save(String path, BdfReader reader) { + map.put(path, reader); + } + + public synchronized static void saveChunk(Chunk chunk) + { + String path = Main.world.getSavePath(); + + if(path == null) { + return; + } + + path = "./saves/" + path + "/c_" + chunk.layer.id + "_" + chunk.c_pos.x + "_" + chunk.c_pos.y + ".bdf.gz"; + + BdfReader reader = new BdfReader(); + + chunk.BdfClassSave(reader.getObject()); + + map.put(path, reader); + } + + public synchronized static BdfReader load(String path) + { + if(map.containsKey(path)) { + return map.get(path); + } + + else { + return readBDF(path); + } + } + + public synchronized static void saveAll() + { + for(String path : map.keySet()) + { + BdfReader reader = map.get(path); + + WorkerTasks.saveToFile(path, reader); + } + + map.clear(); + } +} diff --git a/src/projectzombie/worker/WorkerTaskChunkLoad.java b/src/projectzombie/worker/WorkerTaskChunkLoad.java index 956177d..1bc2a76 100644 --- a/src/projectzombie/worker/WorkerTaskChunkLoad.java +++ b/src/projectzombie/worker/WorkerTaskChunkLoad.java @@ -4,7 +4,7 @@ import java.util.Vector; import bdf.types.BdfReader; import gl_engine.vec.Vec2i; -import projectzombie.util.FileHelpers; +import projectzombie.util.SaveSystem; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; @@ -29,7 +29,7 @@ public class WorkerTaskChunkLoad extends WorkerTaskChunk String path = "./saves/" + this.path + "/c_" + layer.id + "_" + pos.x + "_" + pos.y + ".bdf.gz"; - BdfReader reader = FileHelpers.readBDF(path); + BdfReader reader = SaveSystem.load(path); Chunk chunk = new Chunk(layer, pos, reader.getObject()); diff --git a/src/projectzombie/worker/WorkerTaskChunkSave.java b/src/projectzombie/worker/WorkerTaskChunkSave.java deleted file mode 100644 index 4d6536b..0000000 --- a/src/projectzombie/worker/WorkerTaskChunkSave.java +++ /dev/null @@ -1,54 +0,0 @@ -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/WorkerTasks.java b/src/projectzombie/worker/WorkerTasks.java index ba5be0b..319c593 100644 --- a/src/projectzombie/worker/WorkerTasks.java +++ b/src/projectzombie/worker/WorkerTasks.java @@ -25,10 +25,6 @@ public class WorkerTasks extends Thread 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)); diff --git a/src/projectzombie/world/World.java b/src/projectzombie/world/World.java index 3a431d4..0b1460a 100755 --- a/src/projectzombie/world/World.java +++ b/src/projectzombie/world/World.java @@ -9,7 +9,7 @@ import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL33; import projectzombie.util.ClassBdf; -import projectzombie.util.FileHelpers; +import projectzombie.util.SaveSystem; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; @@ -62,7 +62,7 @@ public class World implements ClassBdf } if(file_dir.exists()) { - BdfReader reader = FileHelpers.readBDF(path + "world.bdf.gz"); + BdfReader reader = SaveSystem.load(path + "world.bdf.gz"); BdfClassLoad(reader.getObject()); } } @@ -270,10 +270,10 @@ public class World implements ClassBdf } BdfReader reader = new BdfReader(); - BdfObject bdf = reader.getObject(); - BdfClassSave(bdf); + BdfClassSave(reader.getObject()); - WorkerTasks.saveToFile("./saves/" + path + "/world.bdf.gz", reader); + SaveSystem.save("./saves/" + path + "/world.bdf.gz", reader); + SaveSystem.saveAll(); } } diff --git a/src/projectzombie/world/layer/Layer.java b/src/projectzombie/world/layer/Layer.java index d035c17..2dec54f 100755 --- a/src/projectzombie/world/layer/Layer.java +++ b/src/projectzombie/world/layer/Layer.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Random; import projectzombie.util.ClassBdf; +import projectzombie.util.SaveSystem; import projectzombie.util.TileState; import bdf.types.BdfArray; import bdf.types.BdfNamedList; @@ -316,7 +317,7 @@ public class Layer implements ClassBdf Chunk chunk = chunks.get(pos); if(chunk.isDirty()) { - WorkerTasks.saveChunk(Main.world.getSavePath(), pos, chunk, id); + SaveSystem.saveChunk(chunk); if(!hasSavedChunk(pos)) { chunks_saved.add(pos); @@ -405,7 +406,7 @@ public class Layer implements ClassBdf { if(chunk.o.isDirty()) { - WorkerTasks.saveChunk(Main.world.getSavePath(), chunk.pos, chunk.o, id); + SaveSystem.saveChunk(chunk.o); if(!hasSavedChunk(chunk.pos)) { chunks_saved.add(chunk.pos); diff --git a/src/resources/texture/item/wood_planks.png b/src/resources/texture/item/wood_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..1709c7a3cd01454df1aa8585d5bb7c4da53cac72 GIT binary patch literal 2192 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 G5}E)UxFE;? literal 0 HcmV?d00001 diff --git a/src/resources/texture/item/wood_snow_planks.png b/src/resources/texture/item/wood_snow_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5b81f781440867d254df76ed8b3d91ab2949e4 GIT binary patch literal 2155 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s-{#J!VlmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNQ(S9z97#o#)SU5j!R!jw6K?Za>)U_Dv2y`{hkf`L%EJ@4AR@ z5pYWJ(z^AK*OhfQtSctYPH$2ydU5xk zR2j!mL-3w z-Svi9fLDFdnw>9nloyLSyt}rkLF}Vw&*Lmk-`s7YPfVh79am53IC#q7$;!ZGj zYQ=oHW4S1O-J5AXu}_X%^_}-8$Hby(?=z8<(09iyJAQs_y|yp&ZMf&gV&xS^2PJ$@ z?az9)UafxVOvVyM!N}STP4PC$;(0#Lo(V@Ov>bcrD|TSJ?60@Ge>kpaa*Q<4=9`gw zQ?2Vlbk5GBo15n?xF6}Lwk?@KAThtun4{X?Y=SUXigK|EQy*88kxlyZoehja582dj zT8rOs37c1)?7L*?=|hdnCAM<9ba3l6Nk0)k@hMKg{-So0Mz^rOlH;Nk6ICpCJZNqa zNSfiQ=Pq75MIxz3D)`K+E2}dutXSn){OCylvudlzVY+K9om&fzrqb~g* zr%qRIt({6WtJViO_l9P#+F4l4o4Tk~Z1%P*Me3IWHFv$gEVPbL&3g(+k>nn?KukbhhAMvHU;A&(17)cR%4=!!G&C-z{6s?iZID zZrfatlqI`~|8wl-#Iv85PWzwvfB!=LUy3&DF;`~Y)7050{%X>PBd+SVXIQQMShKKx zxp};{!irlm-l76+rTh9tDb;H`_#f52nkToW?iJr24T%|V-L`Fd zV;Fbp_NMYFea^>^uF(jHUjFIh<6VwfW*wey7uWJstgW2yD|B4t_Wf&tpX@%L)p_0} z(_xbK?WNxHGL!FlUM|s2&)>xLZ_M(wS?rQJzvb$E=9aSx-D_{(UA696@AnUNJAR2R zeAc#Nx8g19?YRu9mDcT(3d?r-ERvajAn3jLF+;r=_}<}^Js0|ueDId_Q|o3 zy*~}-_1nwlXvNO>!uj}ZmD|$%>pPwQKTf;U-p(F-o6qM~Uf+%6Pv6!p+q1d8L-yU| zGxwfrm+lCfud-|5o2@k-QQyVPXRGp`Er?vi|Lw0~%kB4p+p77Er%&zmI*_{I4QuU# zefATSXM5e3zOF8omp3Q*F<)bb*=%Q9S51S{sy?6B2A3RG%zdN!LpsuKj?J;wyRp*G zdv;_W70EMQ_-o#UGLEHv)vp$=zf(0O`)bMN4|CWqtA8mt`%mIQ!uPz)a+9XY=3i0s zHawa?_3Dhv+oB2&&RG8`R$~UA+l~Js{pxE2ShsQ1-(h>+TeWhoUE9T%y?>J)oxW$P zuzkkX9SRxtd^4tpAK$*}^YgtwcXR*W-S**q>Vt1z)g!MT6AJ(j|ezjy*_XnN#`|MYTpPb3_q4UUQA9I~Y zypLA;dOzReFO%fzsc5GzXZ)h+NPo=q*t*9t1rZNsDk{&NrOqeV-D)=N_6$+psTN)` zVIjSrT6<1&J=Z;#we!@h?@#o3o^6?$y6&=+n@o3vlaNwMNT8FXn9`Q)B{MuOR-QR* z|K!KyCzDQwGASQt(h5+ttova9!#3L3-twUuYqG=h?%etwhQ`9bt%CdtvhbovhwhU{JQCsY`A_TZE+_Te(Vrf3{|=}Ar8>q? Y%c(-2*It!jU|?YIboFyt=akR{08I7?761SM literal 0 HcmV?d00001 diff --git a/src/resources/texture/item/wood_snow_wall.png b/src/resources/texture/item/wood_snow_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..1df8a62b7df2a866017d88968058a85b1b80d5eb GIT binary patch literal 842 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 bGk##5aCpZA-g&N|@L=$C^>bP0l+XkKpzmrd literal 0 HcmV?d00001 diff --git a/src/resources/texture/tile/wood_snow_wall_front.png b/src/resources/texture/tile/wood_snow_wall_front.png new file mode 100644 index 0000000000000000000000000000000000000000..d5087fb471c8fa45b5641e26c6eacf391c60e2c1 GIT binary patch literal 2364 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s-qpLz9N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsC+e%f9qPjpxsK%_0_+Bd;wad_wakJYLTDP_p{j?Kfe^9#400 z3fkUs_UHNgcmK4?3#%*JEt}xH;fLq6Gpzh4*Tv5a-(eHWIkTIV1=UJt^;v_;ze7;Hu&<2nm&mLpZ2xx#VN(*KjfTl z3#v?AQaYR&|Jy!UDTsXvY^S5AL!s;ht3 ziu+uTb~0bnA;Wp?E;8r;L@}Ruz+`iN*6qu2H}^b!=JfRU`9FRUUhUF%u1~&npoYgL zL%?t9ZuY8&yZm=n@=f^9_x;G1vx_yZAFBDhqBWcMH{WZE>im`8i(SK26rL<_eCu(- zN2A)BjdR&81Bt>ao8y%!GMrC?4sJ|aZCem>>PW+m$pMR-D(%^%$xT*)GK1A;4-6w61@NZTu-b^zqG#Z zp1ZD~gPjlGJM$7(dOEo|96j#~>}jIL+)r zr^)k8&sE*0vk2W|6>sGA5>Du>_@M5^)ZSGdx99so_xUy7RCg$_iHbS#EWSJK#UdAZ z=N`kOGTud=ll&ErP6_f;EiQX;%x+@?>$y zh2>sfO|L`*pWSMbw{BrybjHS|)1ob3vP|`}+-rGQ@_fm&%_RkEckA8#ej(Z4_IuI7 zWh?4r>Kmjqvuq|xeSXv`wZw4U?wK`>6B{K3k`)!?*qIbe_|N1h3Cf+|J(H6b(wc7Z zlHIH~XW@aQIdhKeyWD!0d#C-Ovn)SV^Zx8UF_ZD`f0w*RX@39PZi`>Jbz|FWmz>at zCsvlO*mrJSfmY21=R992{bc9b{p{O{`F1^i+h?{|c*Df1KZ#a8jFWutm+H@5UdSVJ zx@*CnX_oC#vy)H$(%kfW-j$AXPjYMhUEK3NFTAxw<(OUWpAz+ZtFi?*YHjfRkXI07 zRd%4<{ms-)_fvMJ8&buuPJO)YPn1EXo$To?!I%2fIalw$`hnTZROd`xcIU2%nd&F( z4N7_My9e{{_S$&&s%y{Tc|Q~`c%J$FaAh5w9J5?rZmoLmw&%9aMRO3_<&e^`z zV{PuyBsMm`*S_6~(XGeDr?|$*slSogaxhxZXlZ!5!K@j}jYI8DJa~8O>N8uDduJbT z?)6SvnX~jwi1(dY!gDrBRX%j4ag znqG-&yYA;VI&VcERjb(~FMZbUcVWKr_KDwR&1^4!eRO{6o9y5)|6|85ojZ4YS@oU5 zLTO`xt9PEi6WOozO8wwwcZn~jJJv7A`Nuk?@A$2SsZQs)tbr|CQ^7JV6IL_mqnInSAgObuC-P(Vt%puN=*_GcR#rG!Gq&T zR}UVI3}+8_6!^nXSX2^JGEwONbg`%-6$N+t%fHK&zh_t&mNe_CAz#L>T(!rBhI1oD znb*H?vu6`<@<^LzsP4&G(YL<($B!!Ur;+!b|C8C9buFpEUu9luTc&WnfPeliw&%5v z475*ZeYE^I!&6+P?#Zr856sV1PG_AbX%>94@{z&D8TrXedm|5C=~&*OylPqSz6p67 zPE~eq4qLV1ne9*R=E&OAnXgUS1&=FDQ*dl);_A{k=r$#6t_Zj1t^Ud%?J@gZ^jc$F z4T^LY@bGSW&Hlgn{@tjZCp+DO4A@HcS)4o0A#j8BRp{}bc4c#ZaXzSLTlZz!{ut&o zJJ0powww?YxW%ToE_&7`_Lz4J&HimUr`A1LuKA?sz;DUgV73>#S*xx|?KS;g_={o5 ziq%JW3ko=To@rL!eSA0e?cTrD%WmH1w|rJKq43XKP6h@Bwj^(N7lw@t^BE>wTJjB4 zGjbMqL>4nJ=qZCRW5rVYG6n_)_7YEDSN12IVvMp{GG$@E85kHOOI#yLobz*YQ}ap~ zoQqNuOHxx5$}>wc6x=<11Hv2m#2FYE*Lu1*hFF}Ao$OsCX2{dB|J#juIv$5+$!_qm za4ur*`aNH1;fh23g_}2||2Wt^(Mx&d*Nm69pZjk+TeE8-vm%d2!A=8F?-OeGo;TFY zS}vln&0GGk#+;M?YYmUqw#_v#FL-XQG+_h#Uelmc;XW_c-kEZo%WUoS&iugag;$;O zd*843-(vNDYt+Tlm&KbkmkNc=6n1QwxP_sIcW?N%8630r72c4z@%~+&+EQb=`%~02 z)$DVHHg0!2^>S9+&sYw}8^W;;K9VX`y4hNnEtk3cxyjz2#lSN=zWt%WVKoJ|4-cAD z?!9L0STOU+JhvK;M{E05pE)iQc5~KW=KS1-vxoN`Gz`z;zxP^U*_O`-TXT6+y*V2e zO!fFMv8z$SxT`zzz~WOeg?`qz)sD^R(OSFVdF?lAg<~ZXOKxx|yZBfyoO3xPBn#n#9h8w5dZ&`5jwp8E$%l_Bq=Juot`^cTS9Ao=(&*YP> jpSLLLXr9Yse#Sq?_Ww)6J6#403=9mOu6{1-oD!MY5cp_k~PDhtTmS|Ui;uWs7Rx@ILvHD6)5)pSl zxb?w<<4IQ!9*qoV4|f#!!%$dM5>zr#=>K%Fs3R2xclyh}%ay-pSQwTx>#8AN#;#no z$A*S;BSo3lzi_i>6L9iKn`Wr)$yw32zWT?HD)Fb0_n!Zg*_(AOsli`mUTRyWaK3Gu1gQh&s9!mohNA)e6sS9!NwW+$xC}94_@h5-l4o| zS@6CIc^ghuc5e<_wc(lVPwwW(+SHk^P1*&ID@{{yY-!@^(m3cgC2Xz;x96??${+19 z`(5-}V_Xf2bQbXNZhFoBzxn>%sGTP}-GU6*O7>ZtJI*0+gY{MD@t<~ObAE9?sApUE zW!nB2<}^Fc_1m_b5EQt@rnfG7)+Y9tcMQ$`Z8@jbJz1{#r0BqJ$=YDH7rR-ju1W1R z{a*NsVabZsM|cYgIC`FGR^NSmH}>t`ztzib-siV`Ry5%}cex7#0|Q%Fdh=gj0-BTFrUZ-Y^CR2FViFh!W@g z+}zZ>5(ej@)Wnk16ovB4k_-iRPv3y>Mm}){28KhPE{-7*mstd3oqyi)n1o zE6&~P8f};Gi z%$!t(lFEWqh1817GzNx>TT8N`TJa?m_P&fjW%mntxEQh z+Hm2YigoP&=kFi>JLH=4Y|)CPb0!@ZEj|;o!EpcjO=+JB&ptnRf42FqX#USh6PT`T zkk^&1VxN2Pe0yB~Jf>ZHG*11MiFwcdR3pinEib%pp~LNleD^@hE++ZY#}B`b@VoiN zw56;)tv%^?S#g)6rKeKw4CU&pQ#P7^3!J#!OjdU4=P8r3U;nHrGuJ+>{;shpesiw= z;eFiidS)JMUSROdPXE`r_2msbdIvt&6y5$i`Rw*PHU+iyJLk8Qo_fgpF1`HJfxGPG zqBYYTU$raOESNs8^y1y;j3>Vr==;RmT&gJB^RizlyT7Bpwe()HiS*+4FT8v>EaxtG zCvZ|%!+m#}pw7mYg*#ZQW0jL7ZY^DOY}WdJhgMAKWc;|mqnC@%kxIU9odr`JeuE)*)1@4a4L`D1?`YYVrLD7o z`3K8uJ)2A0o-SX+ahoaqg7d_hMG8|+Xm1u$oXFO|Rry%pCliy(Azr^C9z{lJ6Gk8F z6B@d4V)sh+s5Z8=h=|-+V9FTQ)AZ|N#)^eXj*B`}0u4_F1$kUtcsS^iN&I%#W;apa zRavvPMr_DPI(g;Hrm1HvALQytzMY}_JccVrEJN?4=m+rty?uv7^>?U=5~mqKsf*<0^;E$<6@wXys4%Ixj)swG!!6?Bs^x^y8?x&PCGvVgy- ze;Bh$0v@+sd2*TEG$8c*tFXNeCy(%S6sjn!6J``K@jtUCu*YWN>={4Lyx>Z-&=j8S zwlCn(3#T_nj9wgk$Gy}3(AlLwqVN1zeqtx*-Ty9m51;MY^WYnAR&L$4*G@U*56`UR zf3ff2!VRMPEEKk%dv^HGf_>{c|2}eb-oLiutPER?2dn)GzwU;V%ilNkpIKfc6BF&t zGQq}N<>KyuZEkj4flRlrKi1Y77r`~wEny4{ zj4heY&HArt*b}6rKo}tJBeCktNy{pm>FAt<{W} zU#z}TlSIVb4{m+%;CRy2gGVF7*~1+L{xB34l?0Vc6#741Eb2%_!JYo{?{eku85V{m z&AMvHm$55X?XjWZ+(=R8^)KA)*#w+C(xw@zdvaFvt*`#^qe}c~+u?GsubEkDli6j!Nxvg^_V^K+HcS?5Wb1)r>ZWUz5Ye)7`Z z$b(lpmUk$xS{A%-Lf(c`mED`eR&97@`;)slvNm<*Ym;`t<4V&M99x>Wx-<^DO$nPT z!tHshzw$?W%zhWW))-fVBAo?1yqjLL|8Ks3H)`j}PPZTfwvv4o=ZaT59-<0eVMjDhB?j7bN#k0Cjq7-;I5{_iy#GoA>!GpA}6g{4-3)~21`SnUIchmt}&R@cKyZ% zovE5?hXjsY|84xtK(67JYtz+xE&>gr0(q>8OwZV-?zFjZ)Yb7D0|Nttr>mdKI;Vst E0JeqtUH||9 literal 0 HcmV?d00001 diff --git a/src/resources/texture/tile/wood_wall_front.png b/src/resources/texture/tile/wood_wall_front.png new file mode 100644 index 0000000000000000000000000000000000000000..d24cfd592cfd809d2670d5ac0b86ceda36ad8590 GIT binary patch literal 1024 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7TQZ%U13aCb6$*;-(=u~X z85lGs)=sqbIP4&EG(LE#)>OVQk-`%Jb9FkpEV4wq0u--st+kpF^NZD2YLbY!`@yXb z9vn})dhlpuID5FGz#oRfqLQGJi9-LUi$xu&D7e#K{#~y8J;TDVq*+%D`7(Cpsy#L| zoEs_1y#9roJ)3}&N7^()bx+QUzV+2VepHD+jlB2#pUmE@Ye^0MD)Um?GKKR6{PS$WLC{8+q_b$MO#4Rm+0+ zO~~7Ds?NMQuIx`Z#Tdm@^KB;lSiYzLQ6}>qwnRKO}V#iFAFv9jnxP`IVtyUyIp;S{5!q|m8uSo<0?!O6c)`t z5^dD=xptmFaQ=i24we~dHBa6(zIprUzf+RmOC}bn!yXz<42$eLRa73n%UL_=Q_-0l zTSb+sHXm~k*b?UEdSz44=~LIV_Se-do@(@pwf6rfLj{fOgU8H^%=b7m2C3Dz20^-8Yu+2#RUVO@9(N!kK zM&`YC|8M5mL@^(@`?LBk~m&dP{7nHZOWpAQT5Rt{-%_h|j`t}m_m_Ij zyuGjZ9JgTOOvQwCueHrqO1r&kliDJ?&V=`0bp?x=iP8Qo(dHKt4P@DF9e0flachyk e;&rH@e&%ag{+;XGe=smGFnGH9xvXY5cp_k~PDhtTmS|Ui;uWs7Rx@ILvHD6)5)pSl zxb?w<<4IQ!9*qoV4|f#!!%$dM5>zr#=>K%Fs3R2xclyh}%ay-pSQwTx>#8AN#;#no z$A*S;BSo3lzi_i>6L9iKn`Wr)$yw32zWT?HD)Fb0_n!Zg*_(AOsli`mUTRyWaK3Gu1gQh&s9!mohNA)e6sS9!NwW+$xC}94_@h5-l4o| zS@6CIc^ghuc5e<_wc(lVPwwW(+SHk^P1*&ID@{{yY-!@^(m3cgC2Xz;x96??${+19 z`(5-}V_Xf2bQbXNZhFoBzxn>%sGTP}-GU6*O7>ZtJI*0+gY{MD@t<~ObAE9?sApUE zW!nB2<}^Fc_1m_b5EQt@rnfG7)+Y9tcMQ$`Z8@jbJz1{#r0BqJ$=YDH7rR-ju1W1R z{a*NsVabZsM|cYgIC`FGR^NSmH}>t`ztzib-siV`Ry5%}cex7#0|Q%Fdh=gj0-BiuK2{zo`ri43Z_T5hc#~ zxw)x%B@E6*sfi`2DGKG8B^e6tp1uL$jeOz^3=F3|T^vIsF0&ro?aS;a;&9RW|JJiy zH(5#?99mo$SwtN9`6ha3Fh)CFacA`CJ22zpyPA8CWjqMGVr*C;;@mawe$BCN4*m1dJzP(pcMGuHd1~5}yubQ+>2DXm@Gp-W4G)EA zUtQmMdgAuK?AyANY7hC{KO#{mE}dm(C~p_Z!(5+uSc}ag`5&Tx@|fq}u()z4*} HQ$iB}3(q<7 literal 0 HcmV?d00001 diff --git a/src/resources/texture/tile/wood_wall_top.png b/src/resources/texture/tile/wood_wall_top.png new file mode 100644 index 0000000000000000000000000000000000000000..529ea3ddb8e7cbf7b968db89595ac8d2465cd163 GIT binary patch literal 703 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznU|`{3V_;xt-?IM=0|R4Arn7T^r?ay{K~a8M zW=<*tgT}<#iMAex9b}Hi2QSr{$`>Y5cp_k~PDhtTmS|Ui;uWs7Rx@ILvHD6)5)pSl zxb?w<<4IQ!9*qoV4|f#!!%$dM5>zr#=>K%Fs3R2xclyh}%ay-pSQwTx>#8AN#;#no z$A*S;BSo3lzi_i>6L9iKn`Wr)$yw32zWT?HD)Fb0_n!Zg*_(AOsli`mUTRyWaK3Gu1gQh&s9!mohNA)e6sS9!NwW+$xC}94_@h5-l4o| zS@6CIc^ghuc5e<_wc(lVPwwW(+SHk^P1*&ID@{{yY-!@^(m3cgC2Xz;x96??${+19 z`(5-}V_Xf2bQbXNZhFoBzxn>%sGTP}-GU6*O7>ZtJI*0+gY{MD@t<~ObAE9?sApUE zW!nB2<}^Fc_1m_b5EQt@rnfG7)+Y9tcMQ$`Z8@jbJz1{#r0BqJ$=YDH7rR-ju1W1R z{a*NsVabZsM|cYgIC`FGR^NSmH}>t`ztzib-siV`Ry5%}cex7#0|Q%