From 51c5e52057dcdc77d012e6f22231ed460611113e Mon Sep 17 00:00:00 2001 From: jsrobson10 Date: Tue, 20 Oct 2020 10:36:00 +1100 Subject: [PATCH] Added wood walls, fixed some collision detection, added lines and tile break indicators for the user, added an indicator to tell the user when they can use a certain tile. --- src/projectzombie/display/DisplayWindow.java | 5 +- src/projectzombie/entity/Entity.java | 67 ++++++---- .../entity/player/EntityPlayer.java | 49 ++++++- src/projectzombie/init/Models.java | 2 + src/projectzombie/init/Tiles.java | 3 + src/projectzombie/items/ItemWoodWall.java | 29 ++++ src/projectzombie/model/ModelChunkBorder.java | 62 +++++---- src/projectzombie/model/ModelTileBorder.java | 87 ++++++++++++ src/projectzombie/model/ModelWall.java | 125 ++++++++++-------- src/projectzombie/tiles/Tile.java | 12 ++ src/projectzombie/tiles/TileAbstractWall.java | 25 ++++ src/projectzombie/tiles/TileBlastFurnace.java | 5 + src/projectzombie/tiles/TileBossPortal.java | 5 + src/projectzombie/tiles/TileCampfire.java | 5 + src/projectzombie/tiles/TileChest.java | 5 + src/projectzombie/tiles/TileClayPot.java | 5 + src/projectzombie/tiles/TileHemp.java | 5 + src/projectzombie/tiles/TileLadderUp.java | 5 + src/projectzombie/tiles/TilePortalDown.java | 5 + src/projectzombie/tiles/TileWater.java | 6 +- src/projectzombie/tiles/TileWoodWall.java | 8 +- src/projectzombie/tiles/TileWorkbench.java | 5 + src/resources/shader/environmentRenderer.fsh | 3 +- .../texture/tile/wood_door_front.png | Bin 0 -> 2474 bytes src/resources/texture/tile/wood_door_top.png | Bin 0 -> 1671 bytes .../texture/tile/wood_snow_door_front.png | Bin 0 -> 2413 bytes .../texture/tile/wood_snow_door_top.png | Bin 0 -> 1656 bytes .../texture/tile/wood_snow_wall_front.png | Bin 2364 -> 2365 bytes .../texture/tile/wood_snow_wall_top.png | Bin 1643 -> 1644 bytes 29 files changed, 404 insertions(+), 124 deletions(-) create mode 100644 src/projectzombie/model/ModelTileBorder.java create mode 100644 src/projectzombie/tiles/TileAbstractWall.java create mode 100644 src/resources/texture/tile/wood_door_front.png create mode 100644 src/resources/texture/tile/wood_door_top.png create mode 100644 src/resources/texture/tile/wood_snow_door_front.png create mode 100644 src/resources/texture/tile/wood_snow_door_top.png diff --git a/src/projectzombie/display/DisplayWindow.java b/src/projectzombie/display/DisplayWindow.java index b93e0bd..e3a68cd 100755 --- a/src/projectzombie/display/DisplayWindow.java +++ b/src/projectzombie/display/DisplayWindow.java @@ -47,6 +47,7 @@ public class DisplayWindow implements IMainloopTask public int glsl_discard_coords; public int glsl_do_discard_coords; public int glsl_do_lighting; + public int glsl_do_texture; public int glsl_model; public int glsl_camera; public int glsl_projection; @@ -144,6 +145,7 @@ public class DisplayWindow implements IMainloopTask glsl_discard_coords = GL33.glGetUniformLocation(environmentRenderer.program, "discard_coords"); glsl_do_discard_coords = GL33.glGetUniformLocation(environmentRenderer.program, "do_discard_coords"); glsl_do_lighting = GL33.glGetUniformLocation(environmentRenderer.program, "do_lighting"); + glsl_do_texture = GL33.glGetUniformLocation(environmentRenderer.program, "do_texture"); glsl_color = GL33.glGetUniformLocation(environmentRenderer.program, "color"); glsl_contrast = GL33.glGetUniformLocation(environmentRenderer.program, "contrast"); glsl_billboard = GL33.glGetUniformLocation(environmentRenderer.program, "billboard"); @@ -214,7 +216,8 @@ public class DisplayWindow implements IMainloopTask environmentRenderer.use(); DisplayLighting.updateLighting(); - GL33.glUniform1f(glsl_mist, 0); + GL33.glUniform1f(glsl_mist, 0.0078125f); + GL33.glUniform1i(glsl_do_texture, 1); if(Main.player.getHydration() < 0.2) { GL33.glUniform1f(glsl_contrast, (float)(0.2 - Main.player.getHydration()) * 1.6f); diff --git a/src/projectzombie/entity/Entity.java b/src/projectzombie/entity/Entity.java index 50bc962..defc466 100755 --- a/src/projectzombie/entity/Entity.java +++ b/src/projectzombie/entity/Entity.java @@ -320,47 +320,60 @@ public abstract class Entity implements ClassBdf private boolean moveIsLegal(Vec2d pos) { - Vec2i t_pos = new Vec2i(MathHelpers.floor(pos.x)+0, MathHelpers.floor(pos.y)+0); - Chunk chunk = Main.world.getLayer().getChunk(pos); - tile_back = chunk.getBackTile(t_pos); - tile_front = chunk.getFrontTile(t_pos); + Layer layer = Main.world.getLayer(); // Is this entity solid if(isSolid) { - // Check the tile the player is standing on - Vec2i tpos = new Vec2i(MathHelpers.floor(pos.x)+0, MathHelpers.floor(pos.y)+0); + final Vec2i[] positions = { + new Vec2i(-1, -1), + new Vec2i(1, -1), + new Vec2i(1, 1), + new Vec2i(-1, 1), + new Vec2i(1, 0), + new Vec2i(0, 1), + new Vec2i(-1, 0), + new Vec2i(0, -1), + new Vec2i(0, 0), + }; + for(Vec2i tpos_offset : positions) { - // Get the tile - Tile t = tile_back.tile; + // Check the tile the player is standing on + Vec2i tpos = new Vec2i( + MathHelpers.floor(pos.x) + tpos_offset.x, + MathHelpers.floor(pos.y) + tpos_offset.y); + + TileState tile_back = layer.getBackTile(tpos); + TileState tile_front = layer.getFrontTile(tpos); - // Check the tiles hitbox if the tile is solid - if(t.tileSolid) { - // Is the entity in the tiles hitbox - Vec2d check = pos.subtract(new Vec2d(tpos.x + 0.5, tpos.y + 0.5)); - if(Math.max(Math.abs(check.x), Math.abs(check.y)) <= t.tileHitbox) + // Get the tile + Tile t = tile_back.tile; + + // Check the tiles hitbox if the tile is solid + if(t.tileSolid) { - // Send back false - return false; + // Is the entity in the tiles hitbox + Vec2d check = pos.subtract(tpos.toDouble()); + if(t.inHitbox(tile_back, check)) { + return false; + } } } - } - - { - // Get the front tile - Tile t = tile_front.tile; - // Check the tiles hitbox if the tile is solid - if(t.tileSolid) { - // Is the entity in the tiles hitbox - Vec2d check = pos.subtract(new Vec2d(tpos.x + 0.5, tpos.y + 0.5)); - if(Math.max(Math.abs(check.x), Math.abs(check.y)) <= t.tileHitbox) + // Get the front tile + Tile t = tile_front.tile; + + // Check the tiles hitbox if the tile is solid + if(t.tileSolid) { - // Send back false - return false; + // Is the entity in the tiles hitbox + Vec2d check = pos.subtract(tpos.toDouble()); + if(t.inHitbox(tile_front, check)) { + return false; + } } } } diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java index 60c2107..7eb3033 100755 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -61,6 +61,7 @@ public class EntityPlayer extends Entity implements public boolean dead = false; public boolean in_animation = false; public int attackedCooldown = 0; + private int particle_spawn_cooldown = 0; private ArrayList tasks; private Inventory inventory; @@ -285,7 +286,7 @@ public class EntityPlayer extends Entity implements if(is.isEmpty() || !is.item.onPlayerLeftClick(is, Main.world.getLayer(), this, place_pos)) { - boolean isTool = is.item instanceof ItemTool; + boolean isTool = !is.isEmpty() && is.item instanceof ItemTool; ItemTool tool = isTool ? (ItemTool) is.item : null; double speed = isTool ? ((ItemTool) is.item).toolSpeed(is) : 1; Vec2i pos = place_pos.toInt(); @@ -309,6 +310,16 @@ public class EntityPlayer extends Entity implements break_pos = pos; } + particle_spawn_cooldown += 1; + + if(particle_spawn_cooldown > 10) { + particle_spawn_cooldown -= 10; + + layer.spawnEntity(new ParticleBreak( + new Vec3d(pos.x + 0.5, 0, pos.y + 0.5), + new Vec3d(0, 0, 0), ts.tile.getModel(ts.meta), 2)); + } + if(break_progress > ts.tile.hardness) { ItemStack[] stacks = ts.tile.getTileDrops(ts); @@ -431,11 +442,37 @@ public class EntityPlayer extends Entity implements model.render(); ItemStack holding = inventory.getItem(inventory_hand); + Vec2d place_pos = getPos().xz().add(MathHelpers.moveTowards2(0.5, Math.toRadians(angle))); + Vec3d ppos = getPos(); + + { + boolean isTool = !holding.isEmpty() && holding.item instanceof ItemTool; + ItemTool tool = isTool ? (ItemTool) holding.item : null; + Vec2i pos = place_pos.toInt(); + + for(int ti=0;ti<2;ti++) + { + TileState ts; + + if(ti == 0) { + ts = layer.getFrontTile(pos); + } else { + ts = layer.getBackTile(pos); + } + + if(ts.tile.canTileBreak(ts, holding, tool) || ts.tile.canUse(ts)) + { + Models.TILE_BORDER.setModel(Matrix4.translate( + new Vec3d(pos.x + 0.5 - ppos.x, 0, pos.y + 0.5 - ppos.z))); + Models.TILE_BORDER.render(); + + break; + } + } + } if(holding != null && !holding.isEmpty()) { - Vec3d ppos = getPos(); - 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))); @@ -449,13 +486,15 @@ public class EntityPlayer extends Entity implements if(render_place_model) { - 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.setModel(Matrix4.translate(new Vec3d( + MathHelpers.floor(pos.x) + 0.5 - ppos.x, 0.00390625, + MathHelpers.floor(pos.y) + 0.5 - ppos.z))); model_place.render(); } if(model_spawn != null) { - model_spawn.setModel(Matrix4.translate(pos.x - ppos.x, 0.001, pos.y - ppos.z)); + model_spawn.setModel(Matrix4.translate(pos.x - ppos.x, 0, pos.y - ppos.z)); model_spawn.render(); } diff --git a/src/projectzombie/init/Models.java b/src/projectzombie/init/Models.java index 0c6cbc8..c93fed9 100755 --- a/src/projectzombie/init/Models.java +++ b/src/projectzombie/init/Models.java @@ -15,6 +15,7 @@ import projectzombie.model.ModelRandom; import projectzombie.model.ModelRock; import projectzombie.model.ModelTallGrass; import projectzombie.model.ModelTile; +import projectzombie.model.ModelTileBorder; import projectzombie.model.ModelTree; import projectzombie.model.ModelTreeSnow; import projectzombie.model.ModelVertical; @@ -24,6 +25,7 @@ public class Models { public static final Model EMPTY = new ModelEmpty(); public static final Model TILE_MISSING = new ModelTile(Resources.TEX_EMPTY); + public static final Model TILE_BORDER = new ModelTileBorder(); public static final Model TILE_TALL_GRASS = new ModelTallGrass(); public static final Model TILE_GRASS = new ModelGrass(); diff --git a/src/projectzombie/init/Tiles.java b/src/projectzombie/init/Tiles.java index 9e33268..b743e5e 100755 --- a/src/projectzombie/init/Tiles.java +++ b/src/projectzombie/init/Tiles.java @@ -37,6 +37,7 @@ import projectzombie.tiles.TileVoid; import projectzombie.tiles.TileWall; import projectzombie.tiles.TileWater; import projectzombie.tiles.TileWoodFloor; +import projectzombie.tiles.TileWoodWall; import projectzombie.tiles.TileWorkbench; public class Tiles @@ -90,6 +91,7 @@ public class Tiles register(ORE); register(COAL); register(WOOD_FLOOR); + register(WOOD_WALL); } public static final Tile GRASS = new TileGrass(); @@ -127,4 +129,5 @@ public class Tiles public static final Tile ORE = new TileOre(); public static final Tile COAL = new TileCoal(); public static final Tile WOOD_FLOOR = new TileWoodFloor(); + public static final Tile WOOD_WALL = new TileWoodWall(); } diff --git a/src/projectzombie/items/ItemWoodWall.java b/src/projectzombie/items/ItemWoodWall.java index 6b7fd1b..5b9ff51 100644 --- a/src/projectzombie/items/ItemWoodWall.java +++ b/src/projectzombie/items/ItemWoodWall.java @@ -1,11 +1,18 @@ package projectzombie.items; import gl_engine.MathHelpers; +import gl_engine.vec.Vec2d; +import gl_engine.vec.Vec2i; import projectzombie.Main; +import projectzombie.entity.player.EntityPlayer; import projectzombie.init.Models; +import projectzombie.init.Tiles; +import projectzombie.items.modifier.ItemModifierMeta; import projectzombie.model.Model; import projectzombie.model.ModelItem; import projectzombie.util.ItemStack; +import projectzombie.util.TileState; +import projectzombie.world.layer.Layer; public class ItemWoodWall extends Item { @@ -21,6 +28,28 @@ public class ItemWoodWall extends Item public ModelItem getModel(ItemStack stack) { return Models.ITEM_WOOD_WALL; } + + @Override + public boolean showPlaceModel(Layer layer, Vec2i pos, ItemStack stack) { + return layer.getFrontTile(pos).tile.isNaturalFloorItem; + } + + @Override + public boolean onPlayerRightClick(ItemStack stack, Layer layer, EntityPlayer player, Vec2d place_pos) + { + Vec2i pos = place_pos.toInt(); + + if(!showPlaceModel(layer, pos, stack)) { + return false; + } + + int angle = (int)MathHelpers.mod(Main.player.angle / 90 + 0.5, 4); + + stack.count -= 1; + layer.setFrontTile(new TileState(Tiles.WOOD_WALL, ItemModifierMeta.getStackMeta(stack) * 4 + angle), pos); + + return true; + } @Override public String getName(ItemStack stack) { diff --git a/src/projectzombie/model/ModelChunkBorder.java b/src/projectzombie/model/ModelChunkBorder.java index 4c64bf7..998a929 100644 --- a/src/projectzombie/model/ModelChunkBorder.java +++ b/src/projectzombie/model/ModelChunkBorder.java @@ -1,7 +1,10 @@ package projectzombie.model; +import org.lwjgl.opengl.GL33; + import gl_engine.texture.TextureRef3D; import gl_engine.vec.Vec2d; +import projectzombie.Main; import projectzombie.init.Resources; public class ModelChunkBorder extends Model @@ -10,61 +13,58 @@ public class ModelChunkBorder extends Model @Override public int getSize() { - return 16; + return 8; } @Override public int getIndexSize() { - return 24; + return 8; + } + + @Override + public void render() + { + if(bound != this) { + bind(); + } + + GL33.glUniform1i(Main.window.glsl_do_texture, 0); + GL33.glDrawElements(GL33.GL_LINES, getIndexSize(), GL33.GL_UNSIGNED_INT, 0); + GL33.glUniform1i(Main.window.glsl_do_texture, 1); } @Override public float[] getVerticies() { float w = 16; - float h = 0.0625f; + float h = 0.03125f; float f = 0b10; float c = 0b000000111111111111; float o = 0.5f; return new float[] { - 0-o, 0, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, 0, 0-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, h, 0-o, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, h, 0-o, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 0-o, h, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + w-o, h, 0-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, 0, w-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, 0, w-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, h, w-o, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, h, w-o, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 0-o, h, w-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + w-o, h, w-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, 0, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, 0, w-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, h, w-o, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - 0-o, h, 0-o, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 0-o, h, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 0-o, h, w-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, 0, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, 0, w-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, h, w-o, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, - w-o, h, 0-o, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + w-o, h, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + w-o, h, w-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, }; } @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, + 0, 1, + 2, 3, + 4, 5, + 6, 7, }; } @@ -74,8 +74,6 @@ public class ModelChunkBorder extends Model return new TextureRef3D[] { ref, ref, ref, ref, ref, ref, ref, ref, - ref, ref, ref, ref, - ref, ref, ref, ref, }; } diff --git a/src/projectzombie/model/ModelTileBorder.java b/src/projectzombie/model/ModelTileBorder.java new file mode 100644 index 0000000..6b39703 --- /dev/null +++ b/src/projectzombie/model/ModelTileBorder.java @@ -0,0 +1,87 @@ +package projectzombie.model; + +import org.lwjgl.opengl.GL33; + +import gl_engine.texture.TextureRef3D; +import projectzombie.Main; +import projectzombie.init.Resources; + +public class ModelTileBorder extends Model +{ + private static final TextureRef3D ref = Resources.ATLAS.get("/gui/pixel_white.png"); + + @Override + public int getSize() { + return 8; + } + + @Override + public int getIndexSize() { + return 8; + } + + @Override + public void render() + { + if(bound != this) { + bind(); + } + + GL33.glUniform1i(Main.window.glsl_do_texture, 0); + GL33.glDrawElements(GL33.GL_LINES, getIndexSize(), GL33.GL_UNSIGNED_INT, 0); + GL33.glUniform1i(Main.window.glsl_do_texture, 1); + } + + @Override + public float[] getVerticies() + { + float h = 0.03125f; + float f = 0b10; + float c = 0b101111101111101111; + float o = 0.5f; + + return new float[] + { + 0-o, h, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 1-o, h, 0-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + + 0-o, h, 1-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 1-o, h, 1-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + + 0-o, h, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 0-o, h, 1-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + + 1-o, h, 0-o, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + 1-o, h, 1-o, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, c, f, + }; + } + + @Override + public int[] getIndicies() { + return new int[] { + 0, 1, + 2, 3, + 4, 5, + 6, 7, + }; + } + + @Override + public TextureRef3D[] getTextures() + { + return new TextureRef3D[] { + ref, ref, ref, ref, + ref, ref, ref, ref, + }; + } + + @Override + public double getHeight() { + return 1; + } + + @Override + public double getWidth() { + return 16; + } +} diff --git a/src/projectzombie/model/ModelWall.java b/src/projectzombie/model/ModelWall.java index 5dbbcf6..66c7c0c 100644 --- a/src/projectzombie/model/ModelWall.java +++ b/src/projectzombie/model/ModelWall.java @@ -48,90 +48,109 @@ public class ModelWall extends Model @Override public float[] getVerticies() { - float x1=0, x2=0, x3=0, x4=0, z1=0, z2=0, z3=0, z4=0; + float x1=0, x2=0, x3=0, x4=0, x5=0, x6=0, z1=0, z2=0, z3=0, z4=0, z5=0, z6=0; switch(rotation) { case 0: - z1 = -0.5f; - z2 = -0.5f; - z3 = -0.25f; - z4 = -0.25f; + z1 = 0.5f; + z2 = 0.25f; x1 = 0.5f; - x2 = 0.5f; - x3 = -0.5f; - x4 = -0.5f; + x2 = -0.5f; break; case 1: - x1 = -0.5f; - x2 = -0.5f; - x3 = -0.25f; - x4 = -0.25f; + x1 = 0.5f; + x2 = 0.25f; z1 = 0.5f; - z2 = 0.5f; - z3 = -0.5f; - z4 = -0.5f; + z2 = -0.5f; break; case 2: - z1 = 0.5f; - z2 = 0.5f; - z3 = 0.25f; - z4 = 0.25f; + z1 = -0.5f; + z2 = -0.25f; x1 = 0.5f; - x2 = 0.5f; - x3 = -0.5f; - x4 = -0.5f; + x2 = -0.5f; break; case 3: - x1 = 0.5f; - x2 = 0.5f; - x3 = 0.25f; - x4 = 0.25f; + x1 = -0.5f; + x2 = -0.25f; z1 = 0.5f; - z2 = 0.5f; - z3 = -0.5f; - z4 = -0.5f; + z2 = -0.5f; break; } + if(rotation % 2 == 0) { + x3 = x1; + x4 = x2; + x5 = x2; + x6 = x1; + z3 = z1; + z4 = z1; + z5 = z2; + z6 = z2; + } + + else { + x3 = x1; + x4 = x1; + x5 = x2; + x6 = x2; + z3 = z1; + z4 = z2; + z5 = z2; + z6 = z1; + } + return new float[] { x1, 0, z1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x2, 0, z3, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x2, 1, z3, 1, 1, 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, - x3, 0, z1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x4, 0, z3, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x4, 1, z3, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x3, 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, - x3, 0, z2, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x3, 1, z2, 1, 1, 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, z3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x3, 0, z4, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x3, 1, z4, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x1, 1, z3, 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, - x3, 1, z1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x3, 1, z3, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, - x1, 1, z3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x3, 1, z3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x4, 1, z4, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x5, 1, z5, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, + x6, 1, z6, 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, - }; + public TextureRef3D[] getTextures() + { + if(rotation % 2 == 0) { + return new TextureRef3D[] { + side, side, side, side, + side, side, side, side, + front, front, front, front, + front, front, front, front, + top, top, top, top, + }; + } + + else { + return new TextureRef3D[] { + front, front, front, front, + front, front, front, front, + side, side, side, side, + side, side, side, side, + top, top, top, top, + }; + } } @Override diff --git a/src/projectzombie/tiles/Tile.java b/src/projectzombie/tiles/Tile.java index c6d2121..1340825 100755 --- a/src/projectzombie/tiles/Tile.java +++ b/src/projectzombie/tiles/Tile.java @@ -1,5 +1,6 @@ package projectzombie.tiles; +import gl_engine.vec.Vec2d; import gl_engine.vec.Vec2i; import projectzombie.entity.Entity; import projectzombie.items.ItemTool; @@ -23,6 +24,17 @@ public abstract class Tile public boolean isNaturalFloorItem = false; public int hardness = -1; + public boolean inHitbox(TileState state, Vec2d pos) { + return (pos.x > 0.5 - tileHitbox && + pos.x < 0.5 + tileHitbox && + pos.y > 0.5 - tileHitbox && + pos.y < 0.5 + tileHitbox); + } + + public boolean canUse(TileState state) { + return false; + } + public void onWalkedOn(Chunk chunk, Layer layer, Vec2i pos, Entity entity, TileState state) { } diff --git a/src/projectzombie/tiles/TileAbstractWall.java b/src/projectzombie/tiles/TileAbstractWall.java new file mode 100644 index 0000000..9100ee1 --- /dev/null +++ b/src/projectzombie/tiles/TileAbstractWall.java @@ -0,0 +1,25 @@ +package projectzombie.tiles; + +import gl_engine.vec.Vec2d; +import projectzombie.util.TileState; + +public abstract class TileAbstractWall extends Tile +{ + public TileAbstractWall() { + tileSolid = true; + } + + @Override + public boolean inHitbox(TileState state, Vec2d pos) + { + switch(state.meta % 4) + { + case 0: return pos.x > -0.125 && pos.x < 1.125 && pos.y > 0.5 && pos.y < 1.125; + case 1: return pos.y > -0.125 && pos.y < 1.125 && pos.x > 0.5 && pos.x < 1.125; + case 2: return pos.x > -0.125 && pos.x < 1.125 && pos.y > -0.125 && pos.y < 0.5; + case 3: return pos.y > -0.125 && pos.y < 1.125 && pos.x > -0.125 && pos.x < 0.5; + } + + return false; + } +} diff --git a/src/projectzombie/tiles/TileBlastFurnace.java b/src/projectzombie/tiles/TileBlastFurnace.java index 788a76f..ce69f9f 100644 --- a/src/projectzombie/tiles/TileBlastFurnace.java +++ b/src/projectzombie/tiles/TileBlastFurnace.java @@ -38,6 +38,11 @@ public class TileBlastFurnace extends Tile return Models.TILE_BLAST_FURNACE; } + @Override + public boolean canUse(TileState state) { + return true; + } + @Override public boolean onActivated(Layer layer, Vec2i tpos, Entity entity, TileState state) { super.onActivated(layer, tpos, entity, state); diff --git a/src/projectzombie/tiles/TileBossPortal.java b/src/projectzombie/tiles/TileBossPortal.java index 2eccba8..554fb5f 100755 --- a/src/projectzombie/tiles/TileBossPortal.java +++ b/src/projectzombie/tiles/TileBossPortal.java @@ -30,6 +30,11 @@ public class TileBossPortal extends Tile this.unbreakable = true; } + @Override + public boolean canUse(TileState state) { + return true; + } + @Override public double getLightLevel(TileState state, Vec2i pos) { return 0.6; diff --git a/src/projectzombie/tiles/TileCampfire.java b/src/projectzombie/tiles/TileCampfire.java index a26f382..024c092 100644 --- a/src/projectzombie/tiles/TileCampfire.java +++ b/src/projectzombie/tiles/TileCampfire.java @@ -27,6 +27,11 @@ public class TileCampfire extends Tile this.hardness = 800; } + @Override + public boolean canUse(TileState state) { + return true; + } + @Override public double getLightLevel(TileState state, Vec2i pos) { return 1 - MathHelpers.squared(1 - state.meta / 16.0); diff --git a/src/projectzombie/tiles/TileChest.java b/src/projectzombie/tiles/TileChest.java index 78294fe..673b386 100755 --- a/src/projectzombie/tiles/TileChest.java +++ b/src/projectzombie/tiles/TileChest.java @@ -29,6 +29,11 @@ public class TileChest extends Tile implements TileBulletBreakable } + @Override + public boolean canUse(TileState state) { + return true; + } + private void spawnItem(Chunk chunk, Vec2i pos, ItemStack stack) { chunk.spawnEntity(new EntityItem(pos.xny().toDouble(), new Vec3d(0, 0, 0), stack)); } diff --git a/src/projectzombie/tiles/TileClayPot.java b/src/projectzombie/tiles/TileClayPot.java index cd82530..0f80a5c 100644 --- a/src/projectzombie/tiles/TileClayPot.java +++ b/src/projectzombie/tiles/TileClayPot.java @@ -27,6 +27,11 @@ public class TileClayPot extends Tile hardness = 100; } + @Override + public boolean canUse(TileState state) { + return true; + } + @Override public Model getModel(byte meta) { diff --git a/src/projectzombie/tiles/TileHemp.java b/src/projectzombie/tiles/TileHemp.java index 91b4369..b9d063a 100644 --- a/src/projectzombie/tiles/TileHemp.java +++ b/src/projectzombie/tiles/TileHemp.java @@ -20,6 +20,11 @@ public class TileHemp extends Tile this.hardness = 5000; } + @Override + public boolean canUse(TileState state) { + return state.meta > 3; + } + @Override public void tickRandomly(Layer layer, Chunk chunk, TileState state, Vec2i pos) { super.tickRandomly(layer, chunk, state, pos); diff --git a/src/projectzombie/tiles/TileLadderUp.java b/src/projectzombie/tiles/TileLadderUp.java index 8bbd426..5c9a187 100755 --- a/src/projectzombie/tiles/TileLadderUp.java +++ b/src/projectzombie/tiles/TileLadderUp.java @@ -19,6 +19,11 @@ public class TileLadderUp extends Tile this.unbreakable = true; } + @Override + public boolean canUse(TileState state) { + return true; + } + @Override public boolean onActivated(Layer layer, Vec2i pos, Entity entity, TileState state) { diff --git a/src/projectzombie/tiles/TilePortalDown.java b/src/projectzombie/tiles/TilePortalDown.java index 7e1c51c..9233838 100755 --- a/src/projectzombie/tiles/TilePortalDown.java +++ b/src/projectzombie/tiles/TilePortalDown.java @@ -18,6 +18,11 @@ public class TilePortalDown extends Tile this.unbreakable = true; } + @Override + public boolean canUse(TileState state) { + return true; + } + @Override public boolean onActivated(Layer layer, Vec2i pos, Entity entity, TileState state) { diff --git a/src/projectzombie/tiles/TileWater.java b/src/projectzombie/tiles/TileWater.java index 7130f97..629eea7 100755 --- a/src/projectzombie/tiles/TileWater.java +++ b/src/projectzombie/tiles/TileWater.java @@ -22,7 +22,11 @@ public class TileWater extends Tile this.slowness = 0.5; this.unbreakable = true; this.hardness = 800; - this.isNaturalFloorItem = true; + } + + @Override + public boolean canUse(TileState state) { + return true; } @Override diff --git a/src/projectzombie/tiles/TileWoodWall.java b/src/projectzombie/tiles/TileWoodWall.java index 93d0113..ce08b5c 100644 --- a/src/projectzombie/tiles/TileWoodWall.java +++ b/src/projectzombie/tiles/TileWoodWall.java @@ -9,17 +9,17 @@ import projectzombie.model.Model; import projectzombie.util.ItemStack; import projectzombie.util.TileState; -public class TileWoodWall extends Tile +public class TileWoodWall extends TileAbstractWall { public TileWoodWall() { - tileSolid = true; - + light_dissipation = 0.5; + hardness = 800; } @Override public boolean canTileBreak(TileState state, ItemStack stack, ItemTool tool) { - return tool.toolType(stack) == ItemToolType.HATCHET; + return tool != null && tool.toolType(stack) == ItemToolType.HATCHET; } @Override diff --git a/src/projectzombie/tiles/TileWorkbench.java b/src/projectzombie/tiles/TileWorkbench.java index d5b99a3..8b2a22b 100644 --- a/src/projectzombie/tiles/TileWorkbench.java +++ b/src/projectzombie/tiles/TileWorkbench.java @@ -20,6 +20,11 @@ public class TileWorkbench extends Tile tileHitbox = 0.4; hardness = 200; } + + @Override + public boolean canUse(TileState state) { + return true; + } @Override public Model getModel(byte meta) { diff --git a/src/resources/shader/environmentRenderer.fsh b/src/resources/shader/environmentRenderer.fsh index 3b23fed..2ecd565 100644 --- a/src/resources/shader/environmentRenderer.fsh +++ b/src/resources/shader/environmentRenderer.fsh @@ -25,6 +25,7 @@ uniform vec2 lightmap_size; uniform int do_lighting; uniform int do_discard_coords; +uniform int do_texture; uniform vec4 discard_coords; uniform vec4 color; @@ -70,7 +71,7 @@ vec3 interpolate2RGB(float x, float y, vec3 v00, vec3 v01, vec3 v10, vec3 v11) { void main() { - vec4 textureRGB = texture(atlas, pTexture); + vec4 textureRGB = do_texture == 0 ? vec4(1) : texture(atlas, pTexture); if(mode == 0) { diff --git a/src/resources/texture/tile/wood_door_front.png b/src/resources/texture/tile/wood_door_front.png new file mode 100644 index 0000000000000000000000000000000000000000..d2204ae39b4a1d6143e8bacccb72f85eaa8f3ad9 GIT binary patch literal 2474 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 rahB=SEU|BsJQ>TaqqRF3{xEY*Q~C6F8f};Gi z%$!t(lFEWqh1817GzNx>TT4SDCq2>N`TJa?m_P&fjW%mntx8tl z*)(CR?a3Yg&fh=$x7BgZ-tI-yioE2MpUv3WV6fjkQv2tQYo8zGKk9vd?X(O}*a5k3 ztCt>r|G@ak&kwIJ1|OI%?z(e+^XtD0WL$HOA9#DpP$Wb8!&?n4_rM3qKPxI^PixNJ z*LLCEg*OE`_IY}S8tR@)1hZ4t&oatLmKUwezI-uoVj$1XZS&5Tmv&*2bFd^-~K!KEILna$3FRY>WOoUDw=;U^po82 z`@y=V^F|(jJzDs`T-vO^@3)P@Pq}xkFT35P_>a#1ud(T4&7=6lx#uO$9(!TEOGwzs zPkn{8OA+^}i|Zm;UTW_KvSt}cOFQ{psZDZ)(zpcyr#p-Q` zn5-Q9HoQNiocsItN{vI?4oGq}98llFulniK8W)cxj0>FZS-9+LVCXDpo-E_+ae&R2 z;WFQS4c$nwdo_Pl8(S7=ir!cd$r#qt^y^~AiiJv!i#k*S4NnFId0bq0IOvi|{dU)8 zH&NeJS+llAY{*DDdF9Nesb?%789n6Al}LT}&MTkm)+?+bdhvHSJP?CtZaC0A?}bdxc|I>o9 zfWN8#7_&+O9=BeZa+%$~C*`+_C@BCPPVkhU_|1NnCpY7W7;2UpNZrtrs#cjI_ zo?T%txz7=EgDYNUir$^SBB}SftKC1Twf=sUeBNE*KxK`b?fc2EQdbuLoObYkVPQe@ zy0vFsSG|uG`5~Lz_aRqyLj6z>~Z|5 zHM{9N6XwIeDn#CIQ7bQ*f8fyM4_~Hz_`#ZPEBMP=UE0pv`g8B+Ll(DwUfi|#cx>}8 zraSNA1B5+(?$Nka&cMLfn(6Eu;OXoP%fbu{6?1AQ+Ik#zkU1J3yi`k*$6qFmHB!}1UC#Jr(~XKT<@)AuLiCCINjRnLtRmi(R3UVq`E_miL#p)AVBnND3$u&(=H|Ksl3sk7%4Ol~q< z@cHOA`?kgddKXsQ{PulguDKt>f8&Cs+y6YZGWhISwRWj%U&FoJ2ak3w)vP}7l<&g- zloQL|c+|~u(qrE<|Dt(n!@lSR>1W@r-PwPcUBNY0HLs!BIYGt$=4-k4@3P*%y>EQ> zUmb(*iJ}=VA0$p@U|?WN@^*J&*vK%SVZx;)-$2DKXMsm#F$061G6*wPEVVCVU|?V` z@$_|Nf5Iurq{si$#6&{a-=|}88nXZnE4!o+%r8rw?cA?Levm!aiuKYj#eK&9W}Hr>trsDbfaJHph=F$?Fi9e!KZq&EDoC|M#%GY*e{tsmyuX jqw(+6m#r#JkC@ZGx?Wosv_+7Cfq}u()z4*}Q$iB}7>N;f literal 0 HcmV?d00001 diff --git a/src/resources/texture/tile/wood_snow_door_front.png b/src/resources/texture/tile/wood_snow_door_front.png new file mode 100644 index 0000000000000000000000000000000000000000..36b67049d6a0a1876ed33e4eda9913804c27977a GIT binary patch literal 2413 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s->#IT{N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsC+ekDT^IgXhn4kzy8=Z;unEeSgMQ{D;$F!nW0`mjCwMb;*J? zqkBTZ%5UfI$Np{QpWJ(Dmq6{OxW~zpedl}>`1gKTKF{d{98LC+%-f z+!NlSV^w06g0_-H<-t>C`NW*>)akP5YRnDfk&I$15p|6ekrX>!_IKZrP5y>=oL5*k zX-wL&FYC@4&Np+HClqd9=YMOz1-1F#;gPg`Us#!W z&HVA~g7n85`V7*Nedm-Le_k!B(9He8#xrlW-OZXO&lY_8>;Bg-!l|A8&U4R<1^ayV zWIULC;w-mq{V~n(_nbxd58E2ylkE48yeFAQkxpC--TbEfs| z6xW1_J7zHMk`*uITj0d{BZq56lETw_Q-3&J&YSg(%Qa$M%Tk{Jvx?92r~jJkx_?)d z{8pDGOVTnJ&n)J7c+4U1&PJY&fayzi&3sU6%c*%l%Hc)YEM=xMzoNAC+~xCTa&9?j z)m|uS-n#1>zpL0b**S{L99z^MpP0;drjetwhe2aJJUH<9)$0MtzNY3`3xYPEUHL3JW8>0k);q5GZogZ4-?`uR zYfXS~$o`o61}V-gn~74d4>|H)61cWPEq*~t0^5-rLIV8Ei~_UR)2t?KwV5D2YR zT*nJ8@#bi~^qIHTXq(_}Kla`HMfEMSKYg3NE2OM90V82?&H6iC$-TRxL z!}>b2GdF6iUwUrAwP!I`^18mrE!LPgb9vYaDy%BgJ+*R{?z4!t?w z=E8|*XZSCEy00j}xx3?~e@4_vk*zzvv3iNR-JY^rDo|OP!BJuJzG=_Rp3V(4`9Jse zwaunXZ#j1rd-3MXP|l0w%E_*tZ(O^N<@9+)DJ*7L!u-(-w-mMxG z)z&S{d$ILs7RPb7uM7Hgod5T{Jo-6&R@XW0j}bPmSpi4%o0nd>EW1bW%$LL~y&l@! zochcvo1lS|_-EK$rXEEI|1=Bv{QlZ}~ET3R5=a*$s@ z-Cf;PT=QeS=R(&W_Tzsm%HJ1$=M#9Px-3%mal^9kGbuJ|%ZyhiJrKPs(a;dsl9DD_ zJZVb9^B=p~``4ET&U;$>?z~{oW-;a(rH?wsXShDHef*Mk^uZo~nKaf&RXcS#K@N2k9aUM(Rk_{bw1(lpJrjVW{CRqR&-e`%CdUOojE=9T=bl+K~qiNpNy9{ z^Gf@4%yP>X3$cwXoJt}gfi9e)E}2(7H%?gccSd{tg^%7(f=-08C?97!bwRMTn$#B8vqucD;8V~4QSaI{)_l>#cehmMO3zlyG^VG`VvuD-XrLKJq_i`UR z+O<@(`oL4Z3;$D2EPLZoH_J(neb4-h=BW+)q8Fr}eY@Fy+2*GT5Li9>(M6JH$jb}>XfvilMF4#FPF>t+v{C2OL!GkRo5M4 zv^C{g)X!f9{<=?htkeH4&!hI-Ng{QbN&lnXC4mz*CdP6H`&@~tSl4?ahev1m<*C89 z{y$GL@ObqoJiT!3RFmb0_tui*1^ZvW6k5c&%7R7zqKROcFy0ul4h54m=-ab zpYwQ>ev?6vB{$>9Y?XOl)*|`O4NisC+kXg=zHvuKIA`zD>1NAX#n1V?V)N7d`YnTl zGcM3T;Bilqy7u$p^$Z8+h%NKna;@`}>E<)u_4&;bml-oRv(K+>oyC1S>W10li~sZa z8f};Gi z%$!t(lFEWqh1817GzNx>TT8N`TJa?m_P&fjW%mntxEQh z+Hm2YigoP&=kFi>JLEcNZ}*~UMP72@XAFxE9{aQJ)U1=oP3N=M=ihsgXM3jGkt^bG z-IkIUvL$Tx@>RA~TrWN?()eCnuvdP{;*PfxJ7O){m~xr-$+|w(;HuG)=U<;}nR@xU zz%AKXvR!X)pVef0s?uqa)b}Pd_}IN0?ymQ4m6U{}h)j=(KL334?np_yLVl4yvvR8? zzr_}$pOImyY1!H$!SeZ;iwfU_gRB+v{PT9#Z~8fHHv78w`rjvS@Uz@=@b4Qx$sNBR ztZO=NpZVXwl*fV}*Kasi-IJF5MK-pRQ*pWQ z6oloOGZ5LHus%D5$9Z?im59$*<0YmV87jz$tPEWEaK(DxrCjpLI$3!z{Mv9GgX#UT9j#q2;C8a4LDnV{YBul{Z(XY`DX*#wWn+^)vhS-<+4< zACuTTy`!xAP0K<3dAS_sYDL9tw{2w9S8fuj>HpqjbAT;l^3*ivhNJP(M^(RsMkg}L z9#D@ce>icQuDz)14KWL6Mu8tLjv5og(^Q?5co{@L9aH?o%Hq)?J?Dvp6O&m6(~PnS zfl+&O_Png{UN_Chv5|L{Xu?sA74p4pQd&YPT^>TBlXX;EMP#jXRDC~}Mw?`WTwJnh zS!6eBx7swHvpUfy=P=(pHtAyD&7yNl52Q6dn-s%X&-nC_cFe~~+ObtPr>+kQv@;D` zxiV|(tnAD?PR{b%uWX4ty|(0)#!|W6JLc^wd%bgdW0Z8_5k+NQS+h?X{8{W*v7mY=4gEIQY~G+vVg)90kTJ$R&*>5TgV~m zwD!WP=95d~FDy~aEG!g>;pVH;36qVPQ(9Ue%5sojK;2#4Rb2C9z2`#L9`@sZE6U#& ze&-W-rMfIq_Ho0q@G~hkYRimQCp{3oE78yp*piYaSv+Yf0;DaNL4#^Ipdd2NBU#JW9lByDUWzCGtqeJ9Cbe7 z?w@91w`Pd?^j36PEXuNa%AGkq^j!3utwB>w-=B<^IP*&Tbj)(g77MYBESyRrA%QNO zqAr%JleHXv--eOz6<|TPAq%lQ8&v; zkA2Vli{_~f`=S@5pMAS_Xa8k(1=m>ByoP4y1Qq|AujSsq%XBg1@#373|90~NWP1s;*b3=De8Ak0{?)V_>?fq}im)7O>#38y5J zuJADdH+}{N2FViFh!W@g+}zZ>5(ej@)Wnk16ovB4k_-iRPv3y>Mm}){28IcqE{-7* zmwo#-@*Xk}ak+0<_Clh8?^cIo0&`j_)3St~DT0MEPc?E}cRq{%`0w(|y1h5dOs($l zD)M-2P`;AHdGkmySII{AhaNLGi6z-I`f5t9JQaVw@%wY{SJlTd-TEJ<8CdGK1T38L zYuh1@thnUEyYxy71yzn^s`Xu7e|DiQ!|5KD*?YSc7^D?qjGR~w%6l2uO{@IGV8p<{ Oz~JfX=d#Wzp$P!{{O`{I 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 index d5087fb471c8fa45b5641e26c6eacf391c60e2c1..25841600c7232ad0d300ba24d677e1658b7403a7 100644 GIT binary patch delta 1623 zcmdlZv{z_C3iE`PfQjkG^)EJ`TK!9N!f$i;pH~_m+XY+^RG*u0euc1Ql<X zYm84<*_S+<5L^@QbX(g)%k#C#Vf+XyqjHNS^Op>+)o6uS4}yn>T+p{;|1# zHZ1kXk>$$i&rR2A+_mC9*Q0ICZ+mF3MPa7boipoA8+a5IKCRhl`*!Nt=sdmpkbVEp zyw~x5SD{B-}}yczpkMV`)@kuSKl;B4akMA`KB zx?k(oT@~ewD7xVKcIt$g0pH4agnTwXGo089lRX~~1E>1O1<%~#Km)D^8ctQO+!H^7w`LV2_GE464z8H~lZuaw!yj8LW&bP8ALaA&i%m1 za-upffn(CqoeVhvEHiE$P`h*`^}KhV9;eD4ZapSx5$yv)A0PNnVc`>fzo+7TbHCls zH{Jz~JX$&}5^lS7FS>TxwMis*Sx$R0NoBrMm*&zrUeDfK=&g0Ld^V+6kF{8=Lhqo+ zi^=6oKJ`@}op>)vT)*qH@4(3eJRKVa1p1j71!l3QnN8&2f5Mh#wpepfppu9EhRhUh zR0wmhZWHF)f5qdgXEXb%#Y1>TiCz`)yOD)$s!x_i&ub z-dVh2tL3yc^ObhL_nf;zE&qMApzO}G?OBf}N&Nou@$%e?+3P%ytU91}aQ8vamp8cg zu_vwfu?hN?*{HjF#afy2$JbjtKfjDvHh2X8Y6(iJ4_hf0%=> zf2cKiyJ5A+?bz5O7H>NFnd(E6?(zG7&OUhM$n4u$a;J;MMc>F>Sh^=QhV_Q4pXfq~ ze3|N{HR?(y`4-x{y=uOhnEpez`_I(h`rN5fc1qt)_#Nc)Ncmj$yn9NpY0T%JE1cEl z-v0Np;Q8~TF0zhSSIsxyH?z9v=cTEv&mYQMmuz=`?K%5xylp2)pra#=l@MTp6zzvXZxcYJGZ7DZMhn&DsxR` z>$a_8#s&pZ`B6MKwQTk+(0SBlk@$Q8@4YC+;Hpx##hsOG!B3lc-sQ#S-gAC@muKFE z-6_*fnVs@mdqj8cgDF>U80V)ZyCrP#R+#?2{^-Y>XWq=^xRF_I^6lPby{;Hm>wTf+ z$setztjiPgjnp}MPPFyhjb(vfcFz0G_aRI9OU|LmUTI;kuD+Lx+0&J@{z2%w^QTOb zy~9mD?bY6Ser@u0f9<#P8d}cJn%nt2ZK1%fyDuu+pPDgF+VfWMJKxUV$Jpi9iJqK0 zdA(rr`Sg!6e%682t8cXUe@k9`Gt>TE?h~_5`wlNl-xc>~=cL-)Q&J~?MBKXh^F~R( zwO(E_+oD;!-}!x9y{Jyern<#(f6ouDQ_tcr_8q_1?r-44z`)o#xrbH0UYD;dpzuV1 z?2)Dw9gD*ja)>&uy|AkJ7$PEnR>2|Y#+a*9euFJUnY$;Qq@jf&iG~1k^Y$Qn7YSv z$|D}kOf;T4N1ac&`=?phtr?;|y%k*+i?Xbqa%WBtJr_M^YtU5F_b1~e&b-n-9kblB z#X@W&3#XDuNT3U+s7vNm&y5q7{GHKWf8nF|lb{o!EXv23PF+y2uKQsBf8&Cs+y6YZGWhISwRWj%U&FoJ2ak3w)vP}7 zl<&g-loQL|c+|~u(qrE<|Dt(n!@lSR>1W@r-PwPcUBNY0HLs!BIYGt$=4-k4@3P*% zy>EQ>Umb(*iJ}=VA0$p@U|?WN@^*J&*vK%SVZx=!>g>uKl1v8Tc7pG?HV3i4Vgvv? CVIv{{ delta 1623 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