From e08cdf66fcb1781278c7e2653113e362ae7009af Mon Sep 17 00:00:00 2001 From: josua Date: Tue, 11 Aug 2020 11:12:03 +1000 Subject: [PATCH] Added more tools, resources, added blast furnace, clay pot, started adding metals, ores, improved water indicator. --- src/projectzombie/display/Camera.java | 1 + src/projectzombie/display/DisplayRender.java | 3 + .../display/DisplayRenderUI.java | 86 +++--- src/projectzombie/display/DisplayWindow.java | 2 + src/projectzombie/entity/Entity.java | 9 +- src/projectzombie/entity/EntityExplosion.java | 2 +- src/projectzombie/entity/EntityFlare.java | 2 +- src/projectzombie/entity/EntityTnt.java | 2 +- .../entity/player/EntityPlayer.java | 46 +++- .../entity/tileentity/TileEntity.java | 9 +- .../tileentity/TileEntityBlastFurnace.java | 257 ++++++++++++++++++ .../entity/tileentity/TileEntityCampfire.java | 246 ++++++++++++++++- .../entity/tileentity/TileEntityClayPot.java | 42 +++ src/projectzombie/init/Entities.java | 4 + src/projectzombie/init/ItemModifiers.java | 4 + src/projectzombie/init/Items.java | 33 +++ src/projectzombie/init/Models.java | 70 +++-- src/projectzombie/init/Recipes.java | 68 ++++- src/projectzombie/init/Tiles.java | 15 + src/projectzombie/inventory/Crafting.java | 2 +- src/projectzombie/inventory/Inventory.java | 18 ++ .../inventory/recipe/RecipeBasic.java | 2 +- src/projectzombie/items/Item.java | 5 +- src/projectzombie/items/ItemAbstractTool.java | 30 ++ src/projectzombie/items/ItemAcorn.java | 15 +- src/projectzombie/items/ItemAsh.java | 21 ++ src/projectzombie/items/ItemBlastFurnace.java | 47 ++++ src/projectzombie/items/ItemBurnable.java | 9 + src/projectzombie/items/ItemCharcoal.java | 21 ++ src/projectzombie/items/ItemClayPot.java | 118 ++++++++ src/projectzombie/items/ItemClayPotWet.java | 31 +++ src/projectzombie/items/ItemCookable.java | 8 + src/projectzombie/items/ItemEmpty.java | 4 + src/projectzombie/items/ItemFlintHatchet.java | 39 +-- src/projectzombie/items/ItemInfestation.java | 5 + src/projectzombie/items/ItemLog.java | 16 +- src/projectzombie/items/ItemMetal.java | 36 +++ src/projectzombie/items/ItemOre.java | 45 +++ src/projectzombie/items/ItemRock.java | 6 +- src/projectzombie/items/ItemSmeltable.java | 8 + src/projectzombie/items/ItemStoneHatchet.java | 40 +++ src/projectzombie/items/ItemStonePick.java | 40 +++ src/projectzombie/items/ItemStoneShovel.java | 40 +++ src/projectzombie/items/ItemTool.java | 7 +- src/projectzombie/items/ItemToolType.java | 5 + src/projectzombie/items/ItemWorkbench.java | 47 ++++ .../modifier/ItemModifierFluidStorage.java | 70 +++++ .../items/modifier/ItemModifierWater.java | 54 ++++ .../items/spawner/ItemSpawnDummy.java | 5 + .../items/spawner/ItemSpawnZombie.java | 5 + .../menu/MenuInventoryStorage.java | 2 + .../menu/gui/GUIItemSlotReadonly.java | 32 +++ src/projectzombie/menu/gui/GUIRecipeCard.java | 35 +-- src/projectzombie/tiles/Tile.java | 10 +- src/projectzombie/tiles/TileBlastFurnace.java | 89 ++++++ src/projectzombie/tiles/TileCampfire.java | 50 +++- src/projectzombie/tiles/TileClayPot.java | 112 ++++++++ src/projectzombie/tiles/TileGrassBurnt.java | 12 + src/projectzombie/tiles/TileLadder.java | 6 - src/projectzombie/tiles/TileOre.java | 21 ++ src/projectzombie/tiles/TileRock.java | 2 +- src/projectzombie/tiles/TileTallGrass.java | 2 +- src/projectzombie/tiles/TileTree.java | 15 +- src/projectzombie/tiles/TileWater.java | 28 ++ src/projectzombie/tiles/TileWorkbench.java | 46 ++++ src/projectzombie/world/chunk/Chunk.java | 17 +- .../world/layer/layergen/LayerGenEarth.java | 17 +- src/resources/shader/environmentRenderer.fsh | 4 +- src/resources/texture/gui/inventory.png | Bin 1677 -> 4521 bytes .../texture/gui/selection_box_crafting.png | Bin 2429 -> 2528 bytes .../texture/gui/selection_box_storage.png | Bin 2786 -> 2739 bytes src/resources/texture/item/clay.png | Bin 0 -> 2920 bytes src/resources/texture/list.txt | 2 + src/resources/texture/tile/grass_burnt.png | Bin 0 -> 2203 bytes 74 files changed, 2015 insertions(+), 187 deletions(-) create mode 100644 src/projectzombie/entity/tileentity/TileEntityBlastFurnace.java create mode 100644 src/projectzombie/entity/tileentity/TileEntityClayPot.java create mode 100644 src/projectzombie/items/ItemAbstractTool.java create mode 100644 src/projectzombie/items/ItemAsh.java create mode 100644 src/projectzombie/items/ItemBlastFurnace.java create mode 100644 src/projectzombie/items/ItemBurnable.java create mode 100644 src/projectzombie/items/ItemCharcoal.java create mode 100644 src/projectzombie/items/ItemClayPot.java create mode 100644 src/projectzombie/items/ItemClayPotWet.java create mode 100644 src/projectzombie/items/ItemCookable.java create mode 100644 src/projectzombie/items/ItemMetal.java create mode 100644 src/projectzombie/items/ItemOre.java create mode 100644 src/projectzombie/items/ItemSmeltable.java create mode 100644 src/projectzombie/items/ItemStoneHatchet.java create mode 100644 src/projectzombie/items/ItemStonePick.java create mode 100644 src/projectzombie/items/ItemStoneShovel.java create mode 100644 src/projectzombie/items/ItemToolType.java create mode 100644 src/projectzombie/items/ItemWorkbench.java create mode 100644 src/projectzombie/items/modifier/ItemModifierFluidStorage.java create mode 100644 src/projectzombie/items/modifier/ItemModifierWater.java create mode 100644 src/projectzombie/menu/gui/GUIItemSlotReadonly.java create mode 100644 src/projectzombie/tiles/TileBlastFurnace.java create mode 100644 src/projectzombie/tiles/TileClayPot.java create mode 100644 src/projectzombie/tiles/TileGrassBurnt.java create mode 100644 src/projectzombie/tiles/TileOre.java create mode 100644 src/projectzombie/tiles/TileWorkbench.java create mode 100644 src/resources/texture/item/clay.png create mode 100644 src/resources/texture/tile/grass_burnt.png diff --git a/src/projectzombie/display/Camera.java b/src/projectzombie/display/Camera.java index e148e7a..7ed9d2b 100755 --- a/src/projectzombie/display/Camera.java +++ b/src/projectzombie/display/Camera.java @@ -1,5 +1,6 @@ package projectzombie.display; +import gl_engine.MathHelpers; import gl_engine.matrix.Matrix4; import gl_engine.vec.Vec3d; import projectzombie.Main; diff --git a/src/projectzombie/display/DisplayRender.java b/src/projectzombie/display/DisplayRender.java index 75cbd01..da617c2 100755 --- a/src/projectzombie/display/DisplayRender.java +++ b/src/projectzombie/display/DisplayRender.java @@ -136,6 +136,7 @@ public class DisplayRender GL33.glUniformMatrix4fv(Main.window.glsl_rotated, true, rotated.getArray()); GL33.glUniformMatrix4fv(Main.window.glsl_projection_sun, true, Camera.camera.projection_sun.getArray()); GL33.glUniform1i(Main.window.glsl_time, (int)((System.currentTimeMillis() / 10) % 1000)); + GL33.glUniform1i(Main.window.glsl_do_lighting, 1); Main.world.markPoolDirty(); @@ -170,6 +171,8 @@ public class DisplayRender Main.world.render(camera); player.chunk = Main.world.getLayer().getChunk(player.getPos().xz()); + + GL33.glUniform1i(Main.window.glsl_do_lighting, 0); } } diff --git a/src/projectzombie/display/DisplayRenderUI.java b/src/projectzombie/display/DisplayRenderUI.java index fd40421..c95403d 100755 --- a/src/projectzombie/display/DisplayRenderUI.java +++ b/src/projectzombie/display/DisplayRenderUI.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL33; import gl_engine.MathHelpers; import gl_engine.matrix.Matrix4; +import gl_engine.vec.Vec2d; import gl_engine.vec.Vec3d; import projectzombie.Main; import projectzombie.init.Models; @@ -94,44 +95,63 @@ public class DisplayRenderUI ModelGui model_health_b = Models.UI_HEALTH_BG; ModelGui model_temperature = Models.UI_TEMPERATURE; ModelGui model_water = Models.UI_WATER; + Matrix4 matrix; - double offset = -(79 * 15.0) / 160; - Matrix4 matrix = Matrix4.translate(offset, -9.5 + (1.5 * 17) / 16, 0); - - model_health_b.setModel(matrix); - model_health_b.render(); - - GL33.glUniform1i(Main.window.glsl_do_discard_coords, 1); - GL33.glUniform4f(Main.window.glsl_discard_coords, -10, -10, (float)MathHelpers.map( - Main.player.getHealth(), - 0, Main.player.maxHealth(), - offset, offset + model_health_f.getWidth()), 10); - - model_health_f.setModel(matrix); - model_health_f.render(); - - GL33.glUniform1i(Main.window.glsl_do_discard_coords, 0); + { + double offset = -(79 * 15.0) / 160; + matrix = Matrix4.translate(offset, -9.5 + (1.5 * 17) / 16, 0); + + model_health_b.setModel(matrix); + model_health_b.render(); + + GL33.glUniform1i(Main.window.glsl_do_discard_coords, 1); + GL33.glUniform4f(Main.window.glsl_discard_coords, -10, -10, (float)MathHelpers.map( + Main.player.getHealth(), + 0, Main.player.maxHealth(), + offset, offset + model_health_f.getWidth()), 10); + + model_health_f.setModel(matrix); + model_health_f.render(); + } double temperature = MathHelpers.smoothStep(Main.player.getTemperature()); - double hydration = MathHelpers.smoothStep(1 - Main.player.getHydration()) * 0.75; + double hydration = MathHelpers.smoothStep(1 - Main.player.getHydration()); - GL33.glUniform4f(Main.window.glsl_discard_coords, -1, -1, 1, 1); + { + Vec2d offset = new Vec2d((1 * 0.75) / 8, -9.5 + (1.5 * 17) / 16); + + matrix = Matrix4.translate(offset.x, offset.y, 0); + + GL33.glUniform1i(Main.window.glsl_do_discard_coords, 0); + GL33.glUniform4f(Main.window.glsl_color, 0.65f, 0.65f, 0.65f, 1); + + model_water.setModel(matrix); + model_water.render(); + + GL33.glUniform1i(Main.window.glsl_do_discard_coords, 1); + + GL33.glUniform4f(Main.window.glsl_discard_coords, + (float)offset.x, (float)offset.y, + (float)(offset.x + model_water.getWidth()), + (float)(offset.y + model_water.getHeight() * Main.player.getHydration())); + + GL33.glUniform4f(Main.window.glsl_color, + (float)hydration * 0.75f, calculateGreen(hydration), 1 - (float)hydration, 1); + + model_water.render(); + + GL33.glUniform1i(Main.window.glsl_do_discard_coords, 0); + } - GL33.glUniform4f(Main.window.glsl_color, - (float)temperature, calculateGreen(temperature), 1 - (float)temperature, 1); - - matrix = Matrix4.translate(-(9 * 0.75) / 8, -9.5 + (1.5 * 17) / 16, 0); - - model_temperature.setModel(matrix); - model_temperature.render(); - - GL33.glUniform4f(Main.window.glsl_color, - (float)hydration * 0.75f, calculateGreen(hydration), 1 - (float)hydration, 1); - - matrix = Matrix4.translate((1 * 0.75) / 8, -9.5 + (1.5 * 17) / 16, 0); - - model_water.setModel(matrix); - model_water.render(); + { + GL33.glUniform4f(Main.window.glsl_color, + (float)temperature, calculateGreen(temperature), 1 - (float)temperature, 1); + + matrix = Matrix4.translate(-(9 * 0.75) / 8, -9.5 + (1.5 * 17) / 16, 0); + + model_temperature.setModel(matrix); + model_temperature.render(); + } GL33.glUniform4f(Main.window.glsl_color, 1, 1, 1, 1); } diff --git a/src/projectzombie/display/DisplayWindow.java b/src/projectzombie/display/DisplayWindow.java index 17e2205..b93e0bd 100755 --- a/src/projectzombie/display/DisplayWindow.java +++ b/src/projectzombie/display/DisplayWindow.java @@ -46,6 +46,7 @@ public class DisplayWindow implements IMainloopTask public int glsl_contrast; public int glsl_discard_coords; public int glsl_do_discard_coords; + public int glsl_do_lighting; public int glsl_model; public int glsl_camera; public int glsl_projection; @@ -142,6 +143,7 @@ public class DisplayWindow implements IMainloopTask glsl_time = GL33.glGetUniformLocation(environmentRenderer.program, "time"); 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_color = GL33.glGetUniformLocation(environmentRenderer.program, "color"); glsl_contrast = GL33.glGetUniformLocation(environmentRenderer.program, "contrast"); glsl_billboard = GL33.glGetUniformLocation(environmentRenderer.program, "billboard"); diff --git a/src/projectzombie/entity/Entity.java b/src/projectzombie/entity/Entity.java index 29a0b00..9a3879f 100755 --- a/src/projectzombie/entity/Entity.java +++ b/src/projectzombie/entity/Entity.java @@ -24,8 +24,8 @@ public abstract class Entity implements IBdfClassManager public double hitbox = 1; public boolean isSolid = false; public Chunk chunk; - protected TileState tile_front; - protected TileState tile_back; + private TileState tile_front; + private TileState tile_back; protected static final Random rand = new Random(); public boolean emitsLight = false; private boolean isDead = false; @@ -294,11 +294,12 @@ public abstract class Entity implements IBdfClassManager isDead = true; } - public void activateTile() + public void activateTile(Vec2i tpos) { // Get the tile position and the layer Layer layer = Main.world.getLayer(); - Vec2i tpos = new Vec2i(MathHelpers.floor(pos.x)+0, MathHelpers.floor(pos.z)+0); + TileState tile_front = layer.getFrontTile(tpos); + TileState tile_back = layer.getBackTile(tpos); // Activate both tiles tile_front.tile.onActivated(layer, tpos, this, tile_front); diff --git a/src/projectzombie/entity/EntityExplosion.java b/src/projectzombie/entity/EntityExplosion.java index 04cbc24..409a145 100755 --- a/src/projectzombie/entity/EntityExplosion.java +++ b/src/projectzombie/entity/EntityExplosion.java @@ -157,6 +157,6 @@ public class EntityExplosion extends Entity @Override public Model getModel() { - return Models.EMPTY; + return null; } } diff --git a/src/projectzombie/entity/EntityFlare.java b/src/projectzombie/entity/EntityFlare.java index 8e21afb..bf3254f 100755 --- a/src/projectzombie/entity/EntityFlare.java +++ b/src/projectzombie/entity/EntityFlare.java @@ -30,7 +30,7 @@ public class EntityFlare extends EntityTnt @Override public Model getModel() { - return active ? Models.ENTITY_FLARE : Models.EMPTY; + return active ? Models.ENTITY_FLARE : null; } } diff --git a/src/projectzombie/entity/EntityTnt.java b/src/projectzombie/entity/EntityTnt.java index 56f2393..427f732 100755 --- a/src/projectzombie/entity/EntityTnt.java +++ b/src/projectzombie/entity/EntityTnt.java @@ -99,7 +99,7 @@ public class EntityTnt extends Entity implements EntityHoldsEntities @Override public Model getModel() { - return active ? Models.ENTITY_TNT : Models.EMPTY; + return active ? Models.ENTITY_TNT : null; } } diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java index 417b62e..0566588 100755 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -23,6 +23,7 @@ import projectzombie.entity.EntityItem; import projectzombie.entity.particle.ParticleBreak; import projectzombie.init.Items; import projectzombie.init.Models; +import projectzombie.init.Tiles; import projectzombie.inventory.Inventory; import projectzombie.inventory.InventoryArmor; import projectzombie.inventory.InventoryClothing; @@ -32,6 +33,7 @@ import projectzombie.model.ModelPlayer; import projectzombie.settings.Cheats; import projectzombie.task.Task; import projectzombie.task.TaskDeathScreen; +import projectzombie.tiles.TileSapling; import projectzombie.util.math.ItemStack; import projectzombie.util.math.TileState; import projectzombie.world.chunk.Chunk; @@ -53,7 +55,7 @@ public class EntityPlayer extends Entity implements private double health = health_max; private double temperature = 0.5; private double hydration = 1; - private int break_progress = 0; + private double break_progress = 0; private Vec2i break_pos = new Vec2i(0, 0); public boolean dead = false; public boolean in_animation = false; @@ -96,6 +98,10 @@ public class EntityPlayer extends Entity implements for(int i=0;i 1) { + hydration = 1; + } } public int getAmmo() { @@ -268,7 +274,9 @@ public class EntityPlayer extends Entity implements if(is.isEmpty() || !is.item.onPlayerLeftClick(is, Main.world.getLayer(), this, place_pos)) { - ItemTool tool = (is.item instanceof ItemTool) ? (ItemTool) is.item : null; + boolean isTool = 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(); for(int ti=0;ti<2;ti++) @@ -281,9 +289,9 @@ public class EntityPlayer extends Entity implements ts = layer.getBackTile(pos); } - if(ts.tile.canTileBreak(tile_front, is, tool)) + if(ts.tile.canTileBreak(ts, is, tool)) { - break_progress += 1; + break_progress += speed; if(!pos.equal(break_pos)) { break_progress = 0; @@ -300,10 +308,12 @@ public class EntityPlayer extends Entity implements new Vec3d(0, 0, 0), stack)); } - if(ti == 0) { - layer.breakFrontTile(pos); - } else { - layer.breakBackTile(pos); + if(ts.tile.doBreak(layer, chunk, ts, pos)) { + if(ti == 0) { + layer.breakFrontTile(pos); + } else { + layer.breakBackTile(pos); + } } break_progress = 0; @@ -323,10 +333,11 @@ public class EntityPlayer extends Entity implements if(dead || in_animation) return; ItemStack is = inventory.getItem(inventory_hand); - Vec2d place_pos = getPos().xz().add(MathHelpers.moveTowards2(1, Math.toRadians(angle))); + Vec2d movement = MathHelpers.moveTowards2(1, Math.toRadians(angle)); + Vec2d place_pos = getPos().xz().add(movement); if(is.isEmpty() || !is.item.onPlayerRightClick(is, Main.world.getLayer(), this, place_pos)) { - activateTile(); + activateTile(getPos().xz().add(movement.multiply(0.5)).toInt()); } } @@ -399,6 +410,7 @@ public class EntityPlayer extends Entity implements public void render() { + Layer layer = Main.world.getLayer(); Model model = getModel(); model.setModel(Matrix4.identity()); model.render(); @@ -412,13 +424,14 @@ 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; - if(model_place != null || model_spawn != null) + if(render_place_model || model_spawn != null) { GL33.glUniform4f(Main.window.glsl_color, 0.5f, 0.75f, 0.5f, 1); } - if(model_place != null) + 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.render(); @@ -430,7 +443,7 @@ public class EntityPlayer extends Entity implements model_spawn.render(); } - if(model_place != null || model_spawn != null) + if(render_place_model || model_spawn != null) { GL33.glUniform4f(Main.window.glsl_color, 1, 1, 1, 1); } @@ -468,8 +481,13 @@ public class EntityPlayer extends Entity implements tasks.add(task); } - public void rehydrate() { + public void rehydrate() + { hydration += 0.001; + + if(hydration > 1) { + hydration = 1; + } } @Override diff --git a/src/projectzombie/entity/tileentity/TileEntity.java b/src/projectzombie/entity/tileentity/TileEntity.java index 0dd8d86..4e154e4 100644 --- a/src/projectzombie/entity/tileentity/TileEntity.java +++ b/src/projectzombie/entity/tileentity/TileEntity.java @@ -8,15 +8,12 @@ import projectzombie.model.IModel; public abstract class TileEntity extends Entity { - public TileEntity(Vec2i pos) { - super(new Vec3d(pos.x, 0, pos.y), new Vec3d(0, 0, 0)); - } - - protected TileEntity() { + public TileEntity() { + super(new Vec3d(0, 0, 0), new Vec3d(0, 0, 0)); } @Override public IModel getModel() { - return Models.EMPTY; + return null; } } diff --git a/src/projectzombie/entity/tileentity/TileEntityBlastFurnace.java b/src/projectzombie/entity/tileentity/TileEntityBlastFurnace.java new file mode 100644 index 0000000..54988a7 --- /dev/null +++ b/src/projectzombie/entity/tileentity/TileEntityBlastFurnace.java @@ -0,0 +1,257 @@ +package projectzombie.entity.tileentity; + +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; +import gl_engine.vec.Vec2i; +import projectzombie.Main; +import projectzombie.init.Items; +import projectzombie.init.Tiles; +import projectzombie.inventory.Inventory; +import projectzombie.items.ItemBurnable; +import projectzombie.items.ItemSmeltable; +import projectzombie.items.ItemFlint; +import projectzombie.items.ItemSmeltable; +import projectzombie.items.modifier.ItemModifierDamage; +import projectzombie.menu.MenuInventoryStorage; +import projectzombie.menu.gui.GUIItemSlotGetter; +import projectzombie.util.math.ItemStack; +import projectzombie.util.math.TileState; +import projectzombie.world.chunk.Chunk; +import projectzombie.world.layer.Layer; + +public class TileEntityBlastFurnace extends TileEntity +{ + private ItemStack burning; + private Inventory inventory; + private int next_level; + private int burn_time; + private int smelt_time; + private int smelt_slot = -1; + private int level; + + public TileEntityBlastFurnace(BdfObject bdf) { + BdfClassLoad(bdf); + } + + public TileEntityBlastFurnace(Vec2i pos) { + inventory = new Inventory(8); + burning = ItemStack.getEmpty(); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + + inventory = new Inventory(nl.get("inventory")); + burning = new ItemStack(nl.get("burning")); + + burn_time = nl.get("burnTime").getInteger(); + smelt_time = nl.get("smeltTime").getInteger(); + smelt_slot = nl.get("smeltSlot").getInteger(); + next_level = nl.get("nextLevel").getInteger(); + level = nl.get("level").getInteger(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + + inventory.BdfClassSave(nl.get("inventory")); + burning.BdfClassSave(nl.get("burning")); + + nl.set("burnTime", bdf.newObject().setInteger(burn_time)); + nl.set("smeltTime", bdf.newObject().setInteger(smelt_time)); + nl.set("smeltSlot", bdf.newObject().setInteger(smelt_slot)); + nl.set("nextLevel", bdf.newObject().setInteger(next_level)); + nl.set("level", bdf.newObject().setInteger(level)); + } + + private void updateTile() { + chunk.setFrontTile(new TileState(Tiles.BLAST_FURNACE, (byte)level), getPos().xz().toInt()); + } + + private void checkForFuel() + { + for(int i=0;i 16) { + level = 16; + } + + else { + updateTile(); + } + } + } + } + + public Inventory getInventory() { + return inventory; + } + + public void onOpened() { + Main.menu = new MenuInventoryStorage(Main.menu, inventory, new GUIItemSlotGetter() { + + @Override + public void setItemStack(ItemStack stack) { + } + + @Override + public boolean isAllowed(ItemStack stack) + { + if(stack.item instanceof ItemBurnable) { + return true; + } + + if(stack.item instanceof ItemSmeltable) { + return true; + } + + return false; + } + + @Override + public ItemStack getItemStack() { + return null; + } + }); + } +} diff --git a/src/projectzombie/entity/tileentity/TileEntityCampfire.java b/src/projectzombie/entity/tileentity/TileEntityCampfire.java index 58ab883..c2aab41 100644 --- a/src/projectzombie/entity/tileentity/TileEntityCampfire.java +++ b/src/projectzombie/entity/tileentity/TileEntityCampfire.java @@ -1,22 +1,264 @@ package projectzombie.entity.tileentity; +import bdf.types.BdfNamedList; import bdf.types.BdfObject; import gl_engine.vec.Vec2i; +import projectzombie.Main; +import projectzombie.init.Items; +import projectzombie.init.Tiles; +import projectzombie.inventory.Inventory; +import projectzombie.items.ItemBurnable; +import projectzombie.items.ItemCookable; +import projectzombie.items.ItemFlint; +import projectzombie.items.ItemSmeltable; +import projectzombie.items.modifier.ItemModifierDamage; +import projectzombie.menu.MenuInventoryStorage; +import projectzombie.menu.gui.GUIItemSlotGetter; +import projectzombie.util.math.ItemStack; +import projectzombie.util.math.TileState; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; public class TileEntityCampfire extends TileEntity { + private ItemStack burning; + private Inventory inventory; + private int next_level; + private int burn_time; + private int cook_time; + private int cook_slot; + private int level; + public TileEntityCampfire(BdfObject bdf) { BdfClassLoad(bdf); } public TileEntityCampfire(Vec2i pos) { - super(pos); + inventory = new Inventory(8); + burning = ItemStack.getEmpty(); } @Override - public void tick(Chunk chunk, Layer layer) { + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + + inventory = new Inventory(nl.get("inventory")); + burning = new ItemStack(nl.get("burning")); + + burn_time = nl.get("burnTime").getInteger(); + cook_time = nl.get("cookTime").getInteger(); + cook_slot = nl.get("cookSlot").getInteger(); + next_level = nl.get("nextLevel").getInteger(); + level = nl.get("level").getInteger(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + + inventory.BdfClassSave(nl.get("inventory")); + burning.BdfClassSave(nl.get("burning")); + + nl.set("burnTime", bdf.newObject().setInteger(burn_time)); + nl.set("cookTime", bdf.newObject().setInteger(cook_time)); + nl.set("cookSlot", bdf.newObject().setInteger(cook_slot)); + nl.set("nextLevel", bdf.newObject().setInteger(next_level)); + nl.set("level", bdf.newObject().setInteger(level)); + } + + private void updateTile() { + chunk.setFrontTile(new TileState(Tiles.CAMPFIRE, (byte)level), getPos().xz().toInt()); + } + + private void checkForFuel() + { + for(int i=0;i 0) + { + ItemStack stack = inventory.getItem(cook_slot); + + // Check for cookable items if things aren't being cooked + if(stack.isEmpty() || !(stack.item instanceof ItemCookable)) + { + cook_time = 1600; + + for(int i=0;i 16) { + level = 16; + } + + else { + updateTile(); + } + } + } + } + + public Inventory getInventory() { + return inventory; + } + + public void onOpened() { + Main.menu = new MenuInventoryStorage(Main.menu, inventory, new GUIItemSlotGetter() { + + @Override + public void setItemStack(ItemStack stack) { + } + + @Override + public boolean isAllowed(ItemStack stack) + { + if(stack.item instanceof ItemBurnable) { + return true; + } + + if(stack.item instanceof ItemCookable) { + return true; + } + + return false; + } + + @Override + public ItemStack getItemStack() { + return null; + } + }); } } diff --git a/src/projectzombie/entity/tileentity/TileEntityClayPot.java b/src/projectzombie/entity/tileentity/TileEntityClayPot.java new file mode 100644 index 0000000..ea31f0c --- /dev/null +++ b/src/projectzombie/entity/tileentity/TileEntityClayPot.java @@ -0,0 +1,42 @@ +package projectzombie.entity.tileentity; + +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; +import projectzombie.util.math.ItemStack; + +public class TileEntityClayPot extends TileEntity +{ + private double volume; + + public TileEntityClayPot(double volume) { + this.volume = volume; + } + + public TileEntityClayPot(BdfObject bdf) { + BdfClassLoad(bdf); + } + + public double getVolume() { + return volume; + } + + public void setVolume(double volume) { + this.volume = volume; + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + volume = nl.get("volume").getDouble(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + nl.set("volume", bdf.newObject().setDouble(volume)); + } +} diff --git a/src/projectzombie/init/Entities.java b/src/projectzombie/init/Entities.java index 54fa032..b892f72 100755 --- a/src/projectzombie/init/Entities.java +++ b/src/projectzombie/init/Entities.java @@ -16,7 +16,9 @@ import projectzombie.entity.EntityTnt; import projectzombie.entity.EntityZombie; import projectzombie.entity.EntityZombieArmored; import projectzombie.entity.player.EntityPlayer; +import projectzombie.entity.tileentity.TileEntityBlastFurnace; import projectzombie.entity.tileentity.TileEntityCampfire; +import projectzombie.entity.tileentity.TileEntityClayPot; public class Entities { @@ -49,5 +51,7 @@ public class Entities register(EntityPlayer.class); register(EntityContainer.class); register(TileEntityCampfire.class); + register(TileEntityBlastFurnace.class); + register(TileEntityClayPot.class); } } diff --git a/src/projectzombie/init/ItemModifiers.java b/src/projectzombie/init/ItemModifiers.java index 86c1157..b2c1ce0 100644 --- a/src/projectzombie/init/ItemModifiers.java +++ b/src/projectzombie/init/ItemModifiers.java @@ -5,7 +5,9 @@ import java.util.ArrayList; import bdf.types.BdfObject; import projectzombie.items.modifier.ItemModifier; import projectzombie.items.modifier.ItemModifierDamage; +import projectzombie.items.modifier.ItemModifierFluidStorage; import projectzombie.items.modifier.ItemModifierMeta; +import projectzombie.items.modifier.ItemModifierWater; public class ItemModifiers { @@ -27,5 +29,7 @@ public class ItemModifiers { register(ItemModifierMeta.class); register(ItemModifierDamage.class); + register(ItemModifierFluidStorage.class); + register(ItemModifierWater.class); } } diff --git a/src/projectzombie/init/Items.java b/src/projectzombie/init/Items.java index 5418e44..d19b439 100755 --- a/src/projectzombie/init/Items.java +++ b/src/projectzombie/init/Items.java @@ -5,7 +5,12 @@ import java.util.ArrayList; import projectzombie.items.Item; import projectzombie.items.ItemAcorn; import projectzombie.items.ItemAmmo; +import projectzombie.items.ItemAsh; +import projectzombie.items.ItemBlastFurnace; import projectzombie.items.ItemCampfire; +import projectzombie.items.ItemCharcoal; +import projectzombie.items.ItemClayPot; +import projectzombie.items.ItemClayPotWet; import projectzombie.items.ItemEmpty; import projectzombie.items.ItemFlare; import projectzombie.items.ItemFlint; @@ -16,9 +21,15 @@ import projectzombie.items.ItemHempSeed; import projectzombie.items.ItemInfestation; import projectzombie.items.ItemLantern; import projectzombie.items.ItemLog; +import projectzombie.items.ItemMetal; +import projectzombie.items.ItemOre; import projectzombie.items.ItemPlantFibre; import projectzombie.items.ItemRock; +import projectzombie.items.ItemStoneHatchet; +import projectzombie.items.ItemStonePick; +import projectzombie.items.ItemStoneShovel; import projectzombie.items.ItemTnt; +import projectzombie.items.ItemWorkbench; import projectzombie.items.spawner.ItemSpawnDummy; import projectzombie.items.spawner.ItemSpawnZombie; @@ -52,6 +63,17 @@ public class Items register(INFESTATION); register(FLINT_HATCHET); register(CAMPFIRE); + register(CHARCOAL); + register(ASH); + register(WORKBENCH); + register(STONE_HATCHET); + register(STONE_PICK); + register(STONE_SHOVEL); + register(METAL); + register(ORE); + register(BLAST_FURNACE); + register(CLAY_POT); + register(CLAY_POT_WET); } public static final Item AMMO = new ItemAmmo(); @@ -72,4 +94,15 @@ public class Items public static final Item CAMPFIRE = new ItemCampfire(); public static final Item FLINT_HATCHET = new ItemFlintHatchet(); public static final Item INFESTATION = new ItemInfestation(); + public static final Item CHARCOAL = new ItemCharcoal(); + public static final Item ASH = new ItemAsh(); + public static final Item WORKBENCH = new ItemWorkbench(); + public static final Item STONE_SHOVEL = new ItemStoneShovel(); + public static final Item STONE_PICK = new ItemStonePick(); + public static final Item STONE_HATCHET = new ItemStoneHatchet(); + public static final Item METAL = new ItemMetal(); + public static final Item ORE = new ItemOre(); + public static final Item BLAST_FURNACE = new ItemBlastFurnace(); + public static final Item CLAY_POT = new ItemClayPot(); + public static final Item CLAY_POT_WET = new ItemClayPotWet(); } diff --git a/src/projectzombie/init/Models.java b/src/projectzombie/init/Models.java index 1d2672a..c1beef6 100755 --- a/src/projectzombie/init/Models.java +++ b/src/projectzombie/init/Models.java @@ -20,24 +20,31 @@ import projectzombie.model.ModelVertical; public class Models { - public static final Model EMPTY = new ModelEmpty(); + public static final Model EMPTY = new ModelEmpty(); + public static final Model TILE_MISSING = new ModelTile(Resources.TEX_EMPTY); - public static final Model TILE_TALL_GRASS = new ModelTallGrass(); - public static final Model TILE_GRASS = new ModelGrass(); - public static final Model TILE_TREE = new ModelTree(); - public static final Model TILE_TREE_SNOW = new ModelTreeSnow(); + public static final Model TILE_TALL_GRASS = new ModelTallGrass(); + public static final Model TILE_GRASS = new ModelGrass(); + public static final Model TILE_TREE = new ModelTree(); + public static final Model TILE_TREE_SNOW = new ModelTreeSnow(); - public static final Model TILE_CAMPFIRE = new ModelCross(Resources.ATLAS.get("/tile/campfire.png")); + public static final Model TILE_CAMPFIRE = new ModelCross(Resources.ATLAS.get("/tile/campfire.png")); + public static final Model TILE_BLAST_FURNACE = new ModelBox(Resources.ATLAS.get("/tile/blast_furnace.png")); + public static final Model TILE_WORKBENCH = new ModelBox(Resources.ATLAS.get("/tile/workbench.png")); + public static final Model TILE_CLAY_POT_EMPTY = new ModelBox(Resources.ATLAS.get("/tile/clay_pot_empty.png")); + public static final Model TILE_CLAY_POT_WATER_1 = new ModelBox(Resources.ATLAS.get("/tile/clay_pot_water_1.png")); + public static final Model TILE_CLAY_POT_WATER_2 = new ModelBox(Resources.ATLAS.get("/tile/clay_pot_water_2.png")); + public static final Model TILE_CLAY_POT_WATER_3 = new ModelBox(Resources.ATLAS.get("/tile/clay_pot_water_3.png")); - public static final Model TILE_SAPLING_1 = new ModelCross(Resources.ATLAS.get("/tile/sapling1.png")); - public static final Model TILE_SAPLING_2 = new ModelCross(Resources.ATLAS.get("/tile/sapling2.png")); - public static final Model TILE_SAPLING_3 = new ModelCross(Resources.ATLAS.get("/tile/sapling3.png")); - public static final Model TILE_SAPLING_4 = new ModelCross(Resources.ATLAS.get("/tile/sapling4.png")); + public static final Model TILE_SAPLING_1 = new ModelCross(Resources.ATLAS.get("/tile/sapling1.png")); + public static final Model TILE_SAPLING_2 = new ModelCross(Resources.ATLAS.get("/tile/sapling2.png")); + public static final Model TILE_SAPLING_3 = new ModelCross(Resources.ATLAS.get("/tile/sapling3.png")); + public static final Model TILE_SAPLING_4 = new ModelCross(Resources.ATLAS.get("/tile/sapling4.png")); - public static final Model TILE_CACTUS_1 = new ModelCactus(Resources.ATLAS.get("/tile/cactus1.png"), 0.5); - public static final Model TILE_CACTUS_2 = new ModelCactus(Resources.ATLAS.get("/tile/cactus2.png"), 1.0); - public static final Model TILE_CACTUS_3 = new ModelCactus(Resources.ATLAS.get("/tile/cactus3.png"), 1.5); - public static final Model TILE_CACTUS_4 = new ModelCactus(Resources.ATLAS.get("/tile/cactus4.png"), 2.0); + public static final Model TILE_CACTUS_1 = new ModelCactus(Resources.ATLAS.get("/tile/cactus1.png"), 0.5); + public static final Model TILE_CACTUS_2 = new ModelCactus(Resources.ATLAS.get("/tile/cactus2.png"), 1.0); + public static final Model TILE_CACTUS_3 = new ModelCactus(Resources.ATLAS.get("/tile/cactus3.png"), 1.5); + public static final Model TILE_CACTUS_4 = new ModelCactus(Resources.ATLAS.get("/tile/cactus4.png"), 2.0); public static final Model[] TILE_HEMP = new Model[] { new ModelBox(Resources.ATLAS.get("/tile/hemp1.png")), @@ -56,6 +63,7 @@ public class Models public static final Model TILE_SANDSTONE = new ModelTile(Resources.ATLAS.get("/tile/sandstone.png")); public static final Model TILE_SANDSTONE_WALL = new ModelTile(Resources.ATLAS.get("/tile/sandstone_wall.png")); public static final Model TILE_GRASS_INFESTED = new ModelTile(Resources.ATLAS.get("/tile/grass_infested.png")); + public static final Model TILE_GRASS_BURNT = new ModelTile(Resources.ATLAS.get("/tile/grass_burnt.png")); public static final Model TILE_SAND = new ModelTile(Resources.ATLAS.get("/tile/sand.png")); public static final Model TILE_STONE = new ModelTile(Resources.ATLAS.get("/tile/stone.png")); public static final Model TILE_DIRT = new ModelTile(Resources.ATLAS.get("/tile/dirt.png")); @@ -72,6 +80,10 @@ public class Models public static final Model TILE_LAVA = new ModelTile(Resources.ATLAS.get("/tile/lava.png"), 16, 50); public static final Model TILE_LAVA_FLOW = new ModelTile(Resources.ATLAS.get("/tile/lava_flow.png"), 16, 50); public static final Model TILE_LANTERN = new ModelVertical(Resources.ATLAS.get("/tile/lantern.png"), 4, 5); + public static final Model TILE_ORE_IRON = new ModelTile(Resources.ATLAS.get("/tile/ore_iron.png")); + public static final Model TILE_ORE_GOLD = new ModelTile(Resources.ATLAS.get("/tile/ore_gold.png")); + public static final Model TILE_ORE_TIN = new ModelTile(Resources.ATLAS.get("/tile/ore_tin.png")); + public static final Model TILE_ORE_COPPER = new ModelTile(Resources.ATLAS.get("/tile/ore_copper.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); @@ -131,7 +143,10 @@ public class Models public static final ModelItem UI_SLOT_CLOTHING_BOOTS = new ModelItem(Resources.ATLAS.get("/gui/slot_clothing_boots.png")); public static final ModelItem ITEM_EMPTY = ModelItem.createEmpty(); + public static final ModelItem ITEM_MISSING = new ModelItem(Resources.TEX_EMPTY); public static final ModelItem ITEM_CAMPFIRE = new ModelItem(Resources.ATLAS.get("/tile/campfire.png")); + public static final ModelItem ITEM_BLAST_FURNACE = new ModelItem(Resources.ATLAS.get("/item/blast_furnace.png")); + public static final ModelItem ITEM_WORKBENCH = new ModelItem(Resources.ATLAS.get("/item/workbench.png")); public static final ModelItem ITEM_GRAPPLING_HOOK = new ModelItem(Resources.ATLAS.get("/item/grappling_hook.png")); public static final ModelItem ITEM_HEALTH_POTION = new ModelItem(Resources.ATLAS.get("/item/health_potion.png")); public static final ModelItem ITEM_AMMO_BOX = new ModelItem(Resources.ATLAS.get("/item/ammo_box.png")); @@ -139,6 +154,22 @@ public class Models public static final ModelItem ITEM_FLARE = new ModelItem(Resources.ATLAS.get("/entity/flare.png")); public static final ModelItem ITEM_LANTERN = new ModelItem(Resources.ATLAS.get("/tile/lantern.png"), 4, 5); + public static final ModelItem ITEM_CLAY_POT_WET = new ModelItem(Resources.ATLAS.get("/item/clay_pot_wet.png")); + public static final ModelItem ITEM_CLAY_POT_EMPTY = new ModelItem(Resources.ATLAS.get("/item/clay_pot_empty.png")); + public static final ModelItem ITEM_CLAY_POT_WATER_1 = new ModelItem(Resources.ATLAS.get("/item/clay_pot_water1.png")); + public static final ModelItem ITEM_CLAY_POT_WATER_2 = new ModelItem(Resources.ATLAS.get("/item/clay_pot_water2.png")); + public static final ModelItem ITEM_CLAY_POT_WATER_3 = new ModelItem(Resources.ATLAS.get("/item/clay_pot_water3.png")); + + public static final ModelItem ITEM_FLINT_HATCHET = new ModelItem(Resources.ATLAS.get("/item/flint_hatchet.png")); + public static final ModelItem ITEM_STONE_HATCHET = new ModelItem(Resources.ATLAS.get("/item/stone_hatchet.png")); + public static final ModelItem ITEM_STONE_PICK = new ModelItem(Resources.ATLAS.get("/item/stone_pick.png")); + public static final ModelItem ITEM_STONE_SHOVEL = new ModelItem(Resources.ATLAS.get("/item/stone_shovel.png")); + + public static final ModelItem ITEM_ORE_IRON = new ModelItem(Resources.ATLAS.get("/item/ore_iron.png")); + public static final ModelItem ITEM_ORE_COPPER = new ModelItem(Resources.ATLAS.get("/item/ore_copper.png")); + public static final ModelItem ITEM_ORE_TIN = new ModelItem(Resources.ATLAS.get("/item/ore_tin.png")); + public static final ModelItem ITEM_ORE_GOLD = new ModelItem(Resources.ATLAS.get("/item/ore_gold.png")); + public static final ModelItem ITEM_SPAWN_ZOMBIE = new ModelItem(Resources.ATLAS.get("/entity/zombie_front_moving.png"), 4, 10); public static final ModelItem ITEM_SPAWN_DUMMY = new ModelItem(Resources.ATLAS.get("/entity/dummy.png")); @@ -146,14 +177,21 @@ public class Models public static final ModelItem ITEM_SNOW_PILE = new ModelItem(Resources.ATLAS.get("/item/snow_pile.png")); public static final ModelItem ITEM_SANDSTONE = new ModelItem(Resources.ATLAS.get("/item/sandstone.png")); public static final ModelItem ITEM_FLINT = new ModelItem(Resources.ATLAS.get("/item/flint.png")); - - public static final ModelItem ITEM_FLINT_HATCHET = new ModelItem(Resources.ATLAS.get("/item/flint_hatchet.png")); + public static final ModelItem ITEM_CLAY = new ModelItem(Resources.ATLAS.get("/item/clay.png")); + public static final ModelItem ITEM_IRON = new ModelItem(Resources.ATLAS.get("/item/iron.png")); + public static final ModelItem ITEM_COPPER = new ModelItem(Resources.ATLAS.get("/item/copper.png")); + public static final ModelItem ITEM_TIN = new ModelItem(Resources.ATLAS.get("/item/tin.png")); + public static final ModelItem ITEM_GOLD = new ModelItem(Resources.ATLAS.get("/item/gold.png")); + public static final ModelItem ITEM_SLAG = new ModelItem(Resources.ATLAS.get("/item/slag.png")); + public static final ModelItem ITEM_COAL = new ModelItem(Resources.ATLAS.get("/item/coal.png")); public static final ModelItem ITEM_PLANT_FIBRE = new ModelItem(Resources.ATLAS.get("/item/plant_fibre.png")); public static final ModelItem ITEM_HEMP_SEED = new ModelItem(Resources.ATLAS.get("/item/hemp_seed.png")); public static final ModelItem ITEM_ACORN = new ModelItem(Resources.ATLAS.get("/item/acorn.png")); public static final ModelItem ITEM_LOG = new ModelItem(Resources.ATLAS.get("/item/log.png")); 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")); // 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 c9f5c82..f829829 100644 --- a/src/projectzombie/init/Recipes.java +++ b/src/projectzombie/init/Recipes.java @@ -6,6 +6,7 @@ import projectzombie.inventory.Crafting; import projectzombie.inventory.recipe.Recipe; import projectzombie.inventory.recipe.RecipeBasic; import projectzombie.items.modifier.ItemModifierDamage; +import projectzombie.items.modifier.ItemModifierMeta; import projectzombie.util.math.ItemStack; public class Recipes @@ -38,30 +39,77 @@ public class Recipes { recipies = new ArrayList(); + // Basic crafting items + recipies.add(new RecipeBasic( new ItemStack[] { new ItemStack(Items.FLINT, 2), new ItemStack(Items.PLANT_FIBRE, 5), }, new Crafting[] { Crafting.BASIC, - }, new ItemStack(Items.FLINT_HATCHET, 1, new ItemModifierDamage(0, 10)))); - - recipies.add(new RecipeBasic( - new ItemStack[] { - new ItemStack(Items.FLINT, 1), - new ItemStack(Items.PLANT_FIBRE, 1), - }, new Crafting[] { - Crafting.BASIC, }, new ItemStack(Items.FLINT_HATCHET, 1))); recipies.add(new RecipeBasic( new ItemStack[] { - new ItemStack(Items.LOG, 1), - new ItemStack(Items.ROCK, 1), + new ItemStack(Items.LOG, 12), + new ItemStack(Items.ROCK, 8, new ItemModifierMeta(0)), }, new Crafting[] { Crafting.BASIC, }, new ItemStack(Items.CAMPFIRE, 1))); + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.LOG, 16), + new ItemStack(Items.ROCK, 4, new ItemModifierMeta(0)), + new ItemStack(Items.PLANT_FIBRE, 8), + }, new Crafting[] { + Crafting.BASIC, + }, new ItemStack(Items.WORKBENCH, 1))); + + + // Workbench items + + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.LOG, 4), + new ItemStack(Items.ROCK, 3, new ItemModifierMeta(0)), + new ItemStack(Items.PLANT_FIBRE, 3), + }, new Crafting[] { + Crafting.WOODEN_WORKBENCH, + }, new ItemStack(Items.STONE_PICK, 1))); + + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.LOG, 4), + new ItemStack(Items.ROCK, 2, new ItemModifierMeta(0)), + new ItemStack(Items.PLANT_FIBRE, 3), + }, new Crafting[] { + Crafting.WOODEN_WORKBENCH, + }, new ItemStack(Items.STONE_SHOVEL, 1))); + + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.LOG, 4), + new ItemStack(Items.ROCK, 3, new ItemModifierMeta(0)), + new ItemStack(Items.PLANT_FIBRE, 3), + }, new Crafting[] { + Crafting.WOODEN_WORKBENCH, + }, new ItemStack(Items.STONE_HATCHET, 1))); + + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.ROCK, 8, new ItemModifierMeta(3)), + }, new Crafting[] { + Crafting.WOODEN_WORKBENCH, + }, new ItemStack(Items.CLAY_POT_WET, 1))); + + recipies.add(new RecipeBasic( + new ItemStack[] { + new ItemStack(Items.ROCK, 32, new ItemModifierMeta(3)), + }, new Crafting[] { + Crafting.WOODEN_WORKBENCH, + }, new ItemStack(Items.BLAST_FURNACE, 1))); + } } diff --git a/src/projectzombie/init/Tiles.java b/src/projectzombie/init/Tiles.java index 7bfa986..4e3f65f 100755 --- a/src/projectzombie/init/Tiles.java +++ b/src/projectzombie/init/Tiles.java @@ -3,12 +3,15 @@ package projectzombie.init; import java.util.ArrayList; import projectzombie.tiles.Tile; +import projectzombie.tiles.TileBlastFurnace; import projectzombie.tiles.TileBossPortal; import projectzombie.tiles.TileCactus; import projectzombie.tiles.TileCampfire; import projectzombie.tiles.TileChest; +import projectzombie.tiles.TileClayPot; import projectzombie.tiles.TileDirt; import projectzombie.tiles.TileGrass; +import projectzombie.tiles.TileGrassBurnt; import projectzombie.tiles.TileGrassInfested; import projectzombie.tiles.TileHemp; import projectzombie.tiles.TileIce; @@ -18,6 +21,7 @@ import projectzombie.tiles.TileLadderUp; import projectzombie.tiles.TileLantern; import projectzombie.tiles.TileLava; import projectzombie.tiles.TileLavaFlow; +import projectzombie.tiles.TileOre; import projectzombie.tiles.TilePortalDown; import projectzombie.tiles.TileRock; import projectzombie.tiles.TileSand; @@ -31,6 +35,7 @@ import projectzombie.tiles.TileTree; import projectzombie.tiles.TileVoid; import projectzombie.tiles.TileWall; import projectzombie.tiles.TileWater; +import projectzombie.tiles.TileWorkbench; public class Tiles { @@ -76,6 +81,11 @@ public class Tiles register(TALL_GRASS); register(SAPLING); register(CAMPFIRE); + register(GRASS_BURNT); + register(WORKBENCH); + register(BLAST_FURNACE); + register(CLAY_POT); + register(ORE); } public static final Tile GRASS = new TileGrass(); @@ -106,4 +116,9 @@ public class Tiles public static final Tile SAPLING = new TileSapling(); public static final Tile HEMP = new TileHemp(); public static final Tile CAMPFIRE = new TileCampfire(); + public static final Tile GRASS_BURNT = new TileGrassBurnt(); + public static final Tile WORKBENCH = new TileWorkbench(); + public static final Tile BLAST_FURNACE = new TileBlastFurnace(); + public static final Tile CLAY_POT = new TileClayPot(); + public static final Tile ORE = new TileOre(); } diff --git a/src/projectzombie/inventory/Crafting.java b/src/projectzombie/inventory/Crafting.java index 1b6c2a5..40e309b 100644 --- a/src/projectzombie/inventory/Crafting.java +++ b/src/projectzombie/inventory/Crafting.java @@ -1,5 +1,5 @@ package projectzombie.inventory; public enum Crafting { - BASIC + BASIC, WOODEN_WORKBENCH } diff --git a/src/projectzombie/inventory/Inventory.java b/src/projectzombie/inventory/Inventory.java index 9691880..00ec796 100755 --- a/src/projectzombie/inventory/Inventory.java +++ b/src/projectzombie/inventory/Inventory.java @@ -4,9 +4,14 @@ import bdf.classes.IBdfClassManager; import bdf.types.BdfArray; import bdf.types.BdfNamedList; import bdf.types.BdfObject; +import gl_engine.vec.Vec2d; +import gl_engine.vec.Vec3d; +import projectzombie.entity.EntityItem; import projectzombie.items.Item; import projectzombie.items.modifier.ItemModifier; import projectzombie.util.math.ItemStack; +import projectzombie.world.chunk.Chunk; +import projectzombie.world.layer.Layer; public class Inventory implements IInventory, IBdfClassManager { @@ -98,6 +103,19 @@ public class Inventory implements IInventory, IBdfClassManager } } + public void dropInventory(Layer layer, Chunk chunk, Vec3d pos, Vec3d velocity) + { + for(int i=0;i 1) { + volume = 1; + } + + fluid.setVolume(volume); + + return true; + } + + // Only place if the front tile is void + if(ts.tile != Tiles.VOID) { + return false; + } + + layer.setFrontTile(new TileState(Tiles.CLAY_POT, (byte)Math.ceil(fluid.getVolume() * 3)), tpos); + layer.createTileEntity(tpos, new TileEntityClayPot(fluid.getVolume())); + stack.count -= 1; + + return true; + } + +} diff --git a/src/projectzombie/items/ItemClayPotWet.java b/src/projectzombie/items/ItemClayPotWet.java new file mode 100644 index 0000000..c8c6607 --- /dev/null +++ b/src/projectzombie/items/ItemClayPotWet.java @@ -0,0 +1,31 @@ +package projectzombie.items; + +import projectzombie.init.Items; +import projectzombie.init.Models; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; + +public class ItemClayPotWet extends Item implements ItemCookable +{ + public ItemClayPotWet() { + max = 1; + } + + @Override + public ItemStack[] getCookProducts(ItemStack stack) { + return new ItemStack[] { + new ItemStack(Items.CLAY_POT, 1), + }; + } + + @Override + public ModelItem getModel(ItemStack stack) { + return Models.ITEM_CLAY_POT_WET; + } + + @Override + public String getName(ItemStack stack) { + return "Wet Clay Pot"; + } + +} diff --git a/src/projectzombie/items/ItemCookable.java b/src/projectzombie/items/ItemCookable.java new file mode 100644 index 0000000..9cbc8fc --- /dev/null +++ b/src/projectzombie/items/ItemCookable.java @@ -0,0 +1,8 @@ +package projectzombie.items; + +import projectzombie.util.math.ItemStack; + +public interface ItemCookable +{ + public ItemStack[] getCookProducts(ItemStack stack); +} diff --git a/src/projectzombie/items/ItemEmpty.java b/src/projectzombie/items/ItemEmpty.java index 44fd3d6..51e66f8 100755 --- a/src/projectzombie/items/ItemEmpty.java +++ b/src/projectzombie/items/ItemEmpty.java @@ -22,4 +22,8 @@ public class ItemEmpty extends Item return Models.ITEM_EMPTY; } + @Override + public String getName(ItemStack stack) { + return ""; + } } diff --git a/src/projectzombie/items/ItemFlintHatchet.java b/src/projectzombie/items/ItemFlintHatchet.java index b164501..1f9af75 100644 --- a/src/projectzombie/items/ItemFlintHatchet.java +++ b/src/projectzombie/items/ItemFlintHatchet.java @@ -7,47 +7,26 @@ import projectzombie.items.modifier.ItemModifierMeta; import projectzombie.model.ModelItem; import projectzombie.util.math.ItemStack; -public class ItemFlintHatchet extends Item implements ItemTool +public class ItemFlintHatchet extends ItemAbstractTool { - public ItemFlintHatchet() { - max = 1; - } - @Override - public int toolPowerAxe(ItemStack stack) { + public int toolPower(ItemStack stack) { return 1; } - + @Override - public int toolPowerPickaxe(ItemStack stack) { - return 0; + public ItemToolType toolType(ItemStack stack) { + return ItemToolType.HATCHET; } @Override - public int toolPowerShovel(ItemStack stack) { - return 0; - } - - @Override - public int toolSpeed(ItemStack stack) { + public double toolSpeed(ItemStack stack) { return 1; } - + @Override - public void toolOnUse(ItemStack stack) - { - ItemModifierDamage modifier = (ItemModifierDamage) stack.getModifier(ItemModifierDamage.class); - - if(modifier == null) { - modifier = new ItemModifierDamage(0, 10); - stack.addModifier(modifier); - } - - modifier.damage(1); - - if(modifier.isBroken()) { - stack.count = 0; - } + protected int getMaxDamage() { + return 10; } @Override diff --git a/src/projectzombie/items/ItemInfestation.java b/src/projectzombie/items/ItemInfestation.java index 3949dc7..5ca2c25 100644 --- a/src/projectzombie/items/ItemInfestation.java +++ b/src/projectzombie/items/ItemInfestation.java @@ -26,4 +26,9 @@ public class ItemInfestation extends Item return true; } + @Override + public String getName(ItemStack stack) { + return "Infestation"; + } + } diff --git a/src/projectzombie/items/ItemLog.java b/src/projectzombie/items/ItemLog.java index a15def6..e60dd91 100644 --- a/src/projectzombie/items/ItemLog.java +++ b/src/projectzombie/items/ItemLog.java @@ -1,11 +1,12 @@ package projectzombie.items; +import projectzombie.init.Items; import projectzombie.init.Models; import projectzombie.items.modifier.ItemModifierMeta; import projectzombie.model.ModelItem; import projectzombie.util.math.ItemStack; -public class ItemLog extends Item +public class ItemLog extends Item implements ItemBurnable { @Override @@ -23,4 +24,17 @@ public class ItemLog extends Item return "Log"; } + @Override + public int getBurnTime(ItemStack stack) { + return 3200; + } + + @Override + public ItemStack[] getBurnProducts(ItemStack stack) { + return new ItemStack[] { + new ItemStack(Items.CHARCOAL, 1), + new ItemStack(Items.ASH, 2), + }; + } + } diff --git a/src/projectzombie/items/ItemMetal.java b/src/projectzombie/items/ItemMetal.java new file mode 100644 index 0000000..43bd3a6 --- /dev/null +++ b/src/projectzombie/items/ItemMetal.java @@ -0,0 +1,36 @@ +package projectzombie.items; + +import projectzombie.init.Items; +import projectzombie.init.Models; +import projectzombie.items.modifier.ItemModifierMeta; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; + +public class ItemMetal extends Item +{ + @Override + public ModelItem getModel(ItemStack stack) + { + switch(ItemModifierMeta.getStackMeta(stack)) + { + case 0: return Models.ITEM_IRON; + case 1: return Models.ITEM_COPPER; + case 2: return Models.ITEM_TIN; + case 3: return Models.ITEM_GOLD; + default: return Models.ITEM_MISSING; + } + } + + @Override + public String getName(ItemStack stack) + { + switch(ItemModifierMeta.getStackMeta(stack)) + { + case 0: return "Iron"; + case 1: return "Copper"; + case 2: return "Tin"; + case 3: return "Gold"; + default: return "Metal"; + } + } +} diff --git a/src/projectzombie/items/ItemOre.java b/src/projectzombie/items/ItemOre.java new file mode 100644 index 0000000..74d388c --- /dev/null +++ b/src/projectzombie/items/ItemOre.java @@ -0,0 +1,45 @@ +package projectzombie.items; + +import projectzombie.init.Items; +import projectzombie.init.Models; +import projectzombie.items.modifier.ItemModifierMeta; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; + +public class ItemOre extends Item implements ItemSmeltable +{ + + @Override + public ModelItem getModel(ItemStack stack) + { + switch(ItemModifierMeta.getStackMeta(stack)) + { + case 0: return Models.ITEM_ORE_IRON; + case 1: return Models.ITEM_ORE_COPPER; + case 2: return Models.ITEM_ORE_TIN; + case 3: return Models.ITEM_ORE_GOLD; + default: return Models.ITEM_MISSING; + } + } + + @Override + public String getName(ItemStack stack) + { + switch(ItemModifierMeta.getStackMeta(stack)) + { + case 0: return "Iron Ore"; + case 1: return "Copper Ore"; + case 2: return "Tin Ore"; + case 3: return "Gold Ore"; + default: return "Ore"; + } + } + + @Override + public ItemStack[] getSmeltProducts(ItemStack stack) { + return new ItemStack[] { + new ItemStack(Items.METAL, 1, stack.modifiers.clone()), + }; + } + +} diff --git a/src/projectzombie/items/ItemRock.java b/src/projectzombie/items/ItemRock.java index 8fa5c7a..2e96c58 100755 --- a/src/projectzombie/items/ItemRock.java +++ b/src/projectzombie/items/ItemRock.java @@ -12,9 +12,11 @@ public class ItemRock extends Item public ModelItem getModel(ItemStack stack) { switch(ItemModifierMeta.getStackMeta(stack)) { + case 0: return Models.ITEM_ROCK; case 1: return Models.ITEM_SNOW_PILE; case 2: return Models.ITEM_SANDSTONE; - default: return Models.ITEM_ROCK; + case 3: return Models.ITEM_CLAY; + default: return Models.ITEM_MISSING; } } @@ -22,8 +24,10 @@ public class ItemRock extends Item public String getName(ItemStack stack) { switch(ItemModifierMeta.getStackMeta(stack)) { + case 0: return "Rock"; case 1: return "Snow"; case 2: return "Sandstone"; + case 3: return "Clay"; default: return "Rock"; } } diff --git a/src/projectzombie/items/ItemSmeltable.java b/src/projectzombie/items/ItemSmeltable.java new file mode 100644 index 0000000..5540a76 --- /dev/null +++ b/src/projectzombie/items/ItemSmeltable.java @@ -0,0 +1,8 @@ +package projectzombie.items; + +import projectzombie.util.math.ItemStack; + +public interface ItemSmeltable +{ + public ItemStack[] getSmeltProducts(ItemStack stack); +} diff --git a/src/projectzombie/items/ItemStoneHatchet.java b/src/projectzombie/items/ItemStoneHatchet.java new file mode 100644 index 0000000..6315245 --- /dev/null +++ b/src/projectzombie/items/ItemStoneHatchet.java @@ -0,0 +1,40 @@ +package projectzombie.items; + +import projectzombie.init.Models; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; + +public class ItemStoneHatchet extends ItemAbstractTool +{ + + @Override + protected int getMaxDamage() { + return 20; + } + + @Override + public int toolPower(ItemStack stack) { + return 1; + } + + @Override + public ItemToolType toolType(ItemStack stack) { + return ItemToolType.HATCHET; + } + + @Override + public double toolSpeed(ItemStack stack) { + return 1.5; + } + + @Override + public ModelItem getModel(ItemStack stack) { + return Models.ITEM_STONE_HATCHET; + } + + @Override + public String getName(ItemStack stack) { + return "Stone Hatchet"; + } + +} diff --git a/src/projectzombie/items/ItemStonePick.java b/src/projectzombie/items/ItemStonePick.java new file mode 100644 index 0000000..81c7bb1 --- /dev/null +++ b/src/projectzombie/items/ItemStonePick.java @@ -0,0 +1,40 @@ +package projectzombie.items; + +import projectzombie.init.Models; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; + +public class ItemStonePick extends ItemAbstractTool +{ + + @Override + public int toolPower(ItemStack stack) { + return 1; + } + + @Override + public double toolSpeed(ItemStack stack) { + return 1.5; + } + + @Override + public ItemToolType toolType(ItemStack stack) { + return ItemToolType.PICK; + } + + @Override + protected int getMaxDamage() { + return 20; + } + + @Override + public ModelItem getModel(ItemStack stack) { + return Models.ITEM_STONE_PICK; + } + + @Override + public String getName(ItemStack stack) { + return "Stone Pick"; + } + +} diff --git a/src/projectzombie/items/ItemStoneShovel.java b/src/projectzombie/items/ItemStoneShovel.java new file mode 100644 index 0000000..7c02ecc --- /dev/null +++ b/src/projectzombie/items/ItemStoneShovel.java @@ -0,0 +1,40 @@ +package projectzombie.items; + +import projectzombie.init.Models; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; + +public class ItemStoneShovel extends ItemAbstractTool +{ + + @Override + public int toolPower(ItemStack stack) { + return 1; + } + + @Override + public double toolSpeed(ItemStack stack) { + return 1.5; + } + + @Override + public ItemToolType toolType(ItemStack stack) { + return ItemToolType.SHOVEL; + } + + @Override + protected int getMaxDamage() { + return 16; + } + + @Override + public ModelItem getModel(ItemStack stack) { + return Models.ITEM_STONE_SHOVEL; + } + + @Override + public String getName(ItemStack stack) { + return "Stone Shovel"; + } + +} diff --git a/src/projectzombie/items/ItemTool.java b/src/projectzombie/items/ItemTool.java index 23b4c7e..8f2cadc 100644 --- a/src/projectzombie/items/ItemTool.java +++ b/src/projectzombie/items/ItemTool.java @@ -4,9 +4,8 @@ import projectzombie.util.math.ItemStack; public interface ItemTool { - public int toolPowerAxe(ItemStack stack); - public int toolPowerPickaxe(ItemStack stack); - public int toolPowerShovel(ItemStack stack); - public int toolSpeed(ItemStack stack); + public int toolPower(ItemStack stack); + public double toolSpeed(ItemStack stack); + public ItemToolType toolType(ItemStack stack); public void toolOnUse(ItemStack stack); } diff --git a/src/projectzombie/items/ItemToolType.java b/src/projectzombie/items/ItemToolType.java new file mode 100644 index 0000000..186583c --- /dev/null +++ b/src/projectzombie/items/ItemToolType.java @@ -0,0 +1,5 @@ +package projectzombie.items; + +public enum ItemToolType { + NONE, HATCHET, PICK, SHOVEL +} diff --git a/src/projectzombie/items/ItemWorkbench.java b/src/projectzombie/items/ItemWorkbench.java new file mode 100644 index 0000000..1b609bd --- /dev/null +++ b/src/projectzombie/items/ItemWorkbench.java @@ -0,0 +1,47 @@ +package projectzombie.items; + +import gl_engine.vec.Vec2d; +import gl_engine.vec.Vec2i; +import projectzombie.entity.player.EntityPlayer; +import projectzombie.init.Models; +import projectzombie.init.Tiles; +import projectzombie.model.Model; +import projectzombie.model.ModelItem; +import projectzombie.util.math.ItemStack; +import projectzombie.world.layer.Layer; + +public class ItemWorkbench extends Item +{ + + @Override + public ModelItem getModel(ItemStack stack) { + return Models.ITEM_WORKBENCH; + } + + @Override + public Model getPlaceModel(ItemStack stack) { + return Models.TILE_WORKBENCH; + } + + @Override + public String getName(ItemStack stack) { + return "Workbench"; + } + + @Override + public boolean onPlayerRightClick(ItemStack stack, Layer layer, EntityPlayer player, Vec2d place_pos) + { + Vec2i tpos = place_pos.toInt(); + + if(layer.getFrontTile(tpos).tile != Tiles.VOID) { + return false; + } + + layer.setFrontTile(Tiles.WORKBENCH.getDefaultState(), tpos); + + stack.count -= 1; + + return true; + } + +} diff --git a/src/projectzombie/items/modifier/ItemModifierFluidStorage.java b/src/projectzombie/items/modifier/ItemModifierFluidStorage.java new file mode 100644 index 0000000..98e69f3 --- /dev/null +++ b/src/projectzombie/items/modifier/ItemModifierFluidStorage.java @@ -0,0 +1,70 @@ +package projectzombie.items.modifier; + +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; + +public class ItemModifierFluidStorage extends ItemModifier +{ + public static final byte FLUID_NONE = 0; + public static final byte FLUID_WATER = 1; + + private byte type; + private double volume; + + public byte getType() { + return type; + } + + public void setType(byte type) { + this.type = type; + } + + public double getVolume() { + return volume; + } + + public void setVolume(double volume) { + this.volume = volume; + } + + public ItemModifierFluidStorage(byte type, double volume) { + this.type = type; + this.volume = volume; + } + + public ItemModifierFluidStorage(BdfObject bdf) { + BdfClassLoad(bdf); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + type = nl.get("type").getByte(); + volume = nl.get("volume").getDouble(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + nl.set("type", bdf.newObject().setByte(type)); + nl.set("volume", bdf.newObject().setDouble(volume)); + } + + @Override + public boolean isEqual(ItemModifier other) + { + if(!(other instanceof ItemModifierFluidStorage)) { + return false; + } + + ItemModifierFluidStorage other_fs = (ItemModifierFluidStorage)other; + + return other_fs.type == type && other_fs.volume == volume; + } + + @Override + public ItemModifier copy() { + return new ItemModifierFluidStorage(type, volume); + } + +} diff --git a/src/projectzombie/items/modifier/ItemModifierWater.java b/src/projectzombie/items/modifier/ItemModifierWater.java new file mode 100644 index 0000000..c99ebc6 --- /dev/null +++ b/src/projectzombie/items/modifier/ItemModifierWater.java @@ -0,0 +1,54 @@ +package projectzombie.items.modifier; + +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; + +public class ItemModifierWater extends ItemModifier +{ + private double volume; + + public double getVolume() { + return volume; + } + + public void setVolume(double volume) { + this.volume = volume; + } + + public ItemModifierWater(double volume) { + this.volume = volume; + } + + public ItemModifierWater(BdfObject bdf) { + BdfClassLoad(bdf); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + volume = nl.get("volume").getDouble(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + nl.set("volume", bdf.newObject().setDouble(volume)); + } + + @Override + public boolean isEqual(ItemModifier other) + { + if(!(other instanceof ItemModifierWater)) { + return false; + } + + ItemModifierWater other_fs = (ItemModifierWater)other; + + return other_fs.volume == volume; + } + + @Override + public ItemModifier copy() { + return new ItemModifierWater(volume); + } +} diff --git a/src/projectzombie/items/spawner/ItemSpawnDummy.java b/src/projectzombie/items/spawner/ItemSpawnDummy.java index c98c3d8..bec1df1 100644 --- a/src/projectzombie/items/spawner/ItemSpawnDummy.java +++ b/src/projectzombie/items/spawner/ItemSpawnDummy.java @@ -21,5 +21,10 @@ public class ItemSpawnDummy extends ItemSpawn public void spawnEntity(Layer layer, Vec3d pos, Vec3d velocity) { layer.spawnEntity(new EntityDummy(pos, velocity)); } + + @Override + public String getName(ItemStack stack) { + return "Spawn Dummy"; + } } diff --git a/src/projectzombie/items/spawner/ItemSpawnZombie.java b/src/projectzombie/items/spawner/ItemSpawnZombie.java index 36b5f7b..333204b 100755 --- a/src/projectzombie/items/spawner/ItemSpawnZombie.java +++ b/src/projectzombie/items/spawner/ItemSpawnZombie.java @@ -21,5 +21,10 @@ public class ItemSpawnZombie extends ItemSpawn public void spawnEntity(Layer layer, Vec3d pos, Vec3d velocity) { layer.spawnEntity(new EntityZombie(pos, velocity)); } + + @Override + public String getName(ItemStack stack) { + return "Spawn Zombie"; + } } diff --git a/src/projectzombie/menu/MenuInventoryStorage.java b/src/projectzombie/menu/MenuInventoryStorage.java index 21a2b1c..8017b00 100644 --- a/src/projectzombie/menu/MenuInventoryStorage.java +++ b/src/projectzombie/menu/MenuInventoryStorage.java @@ -106,6 +106,7 @@ public class MenuInventoryStorage extends MenuInventory gui.add(slider); } + /* @Override public void render() { @@ -117,4 +118,5 @@ public class MenuInventoryStorage extends MenuInventory super.render(); } + */ } diff --git a/src/projectzombie/menu/gui/GUIItemSlotReadonly.java b/src/projectzombie/menu/gui/GUIItemSlotReadonly.java new file mode 100644 index 0000000..e177e8a --- /dev/null +++ b/src/projectzombie/menu/gui/GUIItemSlotReadonly.java @@ -0,0 +1,32 @@ +package projectzombie.menu.gui; + +import projectzombie.util.math.ItemStack; + +public class GUIItemSlotReadonly extends GUIItemSlot +{ + + public GUIItemSlotReadonly(double hitboxSize, boolean renderItem, ItemStack stack) { + super(hitboxSize, renderItem, new GUIItemSlotGetter() + { + @Override + public void setItemStack(ItemStack stack) { + } + + @Override + public boolean isAllowed(ItemStack stack) { + return false; + } + + @Override + public ItemStack getItemStack() { + return stack.copy(); + } + + @Override + public boolean isReadOnly() { + return true; + } + }); + } + +} diff --git a/src/projectzombie/menu/gui/GUIRecipeCard.java b/src/projectzombie/menu/gui/GUIRecipeCard.java index ae6735e..677d109 100644 --- a/src/projectzombie/menu/gui/GUIRecipeCard.java +++ b/src/projectzombie/menu/gui/GUIRecipeCard.java @@ -16,6 +16,7 @@ public class GUIRecipeCard implements GUIContainer private Vec2d pos; private Recipe recipe; private GUIContainer gui; + private GUIItemSlot result_display_slot; private GUIItemSlot result_slot; private GUIItemSlot[] ingredients; private Inventory inventory; @@ -65,34 +66,19 @@ public class GUIRecipeCard implements GUIContainer Models.UI_LABEL_RECIPE.getWidth() * 103 / 128.0 + 0.25, Models.UI_LABEL_RECIPE.getHeight() * 9 / 32.0 + 0.25))); + result_display_slot = new GUIItemSlotReadonly(1, true, recipe.getResult()); + + result_display_slot.setPos(pos.add(new Vec2d( + Models.UI_LABEL_RECIPE.getWidth() * 87 / 128.0 + 0.25, + Models.UI_LABEL_RECIPE.getHeight() * 9 / 32.0 + 0.25))); + ItemStack[] ingredients = recipe.getIngredients(); this.ingredients = new GUIItemSlot[ingredients.length]; for(int i=0;i 0.8 ? 1 : 0), + new ItemStack(Items.FLINT, state.meta == 0 && Math.random() > 0.75 ? 1 : 0), }; } diff --git a/src/projectzombie/tiles/TileTallGrass.java b/src/projectzombie/tiles/TileTallGrass.java index 8fb37ff..9e8b272 100644 --- a/src/projectzombie/tiles/TileTallGrass.java +++ b/src/projectzombie/tiles/TileTallGrass.java @@ -26,7 +26,7 @@ public class TileTallGrass extends Tile @Override public ItemStack[] getTileDrops(TileState state) { return new ItemStack[] { - new ItemStack(Items.PLANT_FIBRE, Math.random() > 0.9 ? 1 : 0), + new ItemStack(Items.PLANT_FIBRE, Math.random() > 0.6 ? 1 : 0), }; } diff --git a/src/projectzombie/tiles/TileTree.java b/src/projectzombie/tiles/TileTree.java index 3769a12..1718e39 100755 --- a/src/projectzombie/tiles/TileTree.java +++ b/src/projectzombie/tiles/TileTree.java @@ -3,6 +3,7 @@ package projectzombie.tiles; import projectzombie.init.Items; import projectzombie.init.Models; import projectzombie.items.ItemTool; +import projectzombie.items.ItemToolType; import projectzombie.items.modifier.ItemModifierMeta; import projectzombie.model.Model; import projectzombie.util.math.ItemStack; @@ -19,13 +20,13 @@ public class TileTree extends Tile implements TileBulletBreakable } @Override - public boolean canTileBreak(TileState state, ItemStack stack, ItemTool tool) - { - if(tool == null) { - return false; - } - - return tool.toolPowerAxe(stack) > 0; + public boolean canTileBreak(TileState state, ItemStack stack, ItemTool tool) { + return (tool != null && tool.toolType(stack) == ItemToolType.HATCHET); + } + + @Override + public boolean canTileSpeedBreak(TileState state, ItemStack stack, ItemTool tool) { + return canTileBreak(state, stack, tool); } @Override diff --git a/src/projectzombie/tiles/TileWater.java b/src/projectzombie/tiles/TileWater.java index a2dd176..fd1e20a 100755 --- a/src/projectzombie/tiles/TileWater.java +++ b/src/projectzombie/tiles/TileWater.java @@ -4,8 +4,13 @@ import gl_engine.vec.Vec2i; import projectzombie.entity.Entity; import projectzombie.entity.particle.ParticleWater; import projectzombie.entity.player.EntityPlayer; +import projectzombie.init.Items; import projectzombie.init.Models; +import projectzombie.items.ItemTool; +import projectzombie.items.ItemToolType; +import projectzombie.items.modifier.ItemModifierMeta; import projectzombie.model.Model; +import projectzombie.util.math.ItemStack; import projectzombie.util.math.TileState; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; @@ -16,6 +21,7 @@ public class TileWater extends Tile public TileWater() { this.slowness = 0.5; this.unbreakable = true; + this.hardness = 800; } @Override @@ -38,6 +44,28 @@ public class TileWater extends Tile } } + @Override + public boolean canTileBreak(TileState state, ItemStack stack, ItemTool tool) { + return (tool != null && tool.toolType(stack) == ItemToolType.SHOVEL); + } + + @Override + public boolean canTileSpeedBreak(TileState state, ItemStack stack, ItemTool tool) { + return canTileBreak(state, stack, tool); + } + + @Override + public boolean doBreak(Layer layer, Chunk chunk, TileState state, Vec2i pos) { + return false; + } + + @Override + public ItemStack[] getTileDrops(TileState state) { + return new ItemStack[] { + new ItemStack(Items.ROCK, 2, new ItemModifierMeta(3)), + }; + } + @Override public Model getModel(byte meta) { return Models.TILE_WATER; diff --git a/src/projectzombie/tiles/TileWorkbench.java b/src/projectzombie/tiles/TileWorkbench.java new file mode 100644 index 0000000..30f5d26 --- /dev/null +++ b/src/projectzombie/tiles/TileWorkbench.java @@ -0,0 +1,46 @@ +package projectzombie.tiles; + +import gl_engine.vec.Vec2i; +import projectzombie.Main; +import projectzombie.entity.Entity; +import projectzombie.init.Models; +import projectzombie.inventory.Crafting; +import projectzombie.items.ItemTool; +import projectzombie.items.ItemToolType; +import projectzombie.menu.MenuInventoryBasic; +import projectzombie.model.Model; +import projectzombie.util.math.ItemStack; +import projectzombie.util.math.TileState; +import projectzombie.world.layer.Layer; + +public class TileWorkbench extends Tile +{ + public TileWorkbench() { + tileSolid = true; + tileHitbox = 0.4; + hardness = 200; + } + + @Override + public Model getModel(byte meta) { + return Models.TILE_WORKBENCH; + } + + @Override + public boolean canTileBreak(TileState state, ItemStack stack, ItemTool tool) { + return true; + } + + @Override + public boolean canTileSpeedBreak(TileState state, ItemStack stack, ItemTool tool) { + return (tool != null && tool.toolType(stack) == ItemToolType.HATCHET); + } + + @Override + public void onActivated(Layer layer, Vec2i tpos, Entity entity, TileState state) { + super.onActivated(layer, tpos, entity, state); + + Main.menu = new MenuInventoryBasic(Main.menu, Crafting.WOODEN_WORKBENCH); + } + +} diff --git a/src/projectzombie/world/chunk/Chunk.java b/src/projectzombie/world/chunk/Chunk.java index c8d0b0f..b95b90e 100755 --- a/src/projectzombie/world/chunk/Chunk.java +++ b/src/projectzombie/world/chunk/Chunk.java @@ -521,13 +521,16 @@ public class Chunk implements IBdfClassManager public void setBackTile(TileState tile, int id) { + Vec2i pos = Vec2i.fromId(CHUNK_SIZE, id).add(c_pos.multiply(16)); + tiles_back[id].onDestroy(layer, this, new TileState(tiles_back[id], tiles_back_meta[id]), tile, pos); + // Set the back tile - this.tiles_back[id] = tile.tile; - this.tiles_back_meta[id] = tile.meta; + tiles_back[id] = tile.tile; + tiles_back_meta[id] = tile.meta; setDirty(); - tile.tile.onGenerate(layer, this, tile, Vec2i.fromId(CHUNK_SIZE, id)); + tile.tile.onGenerate(layer, this, tile, pos); } public void setFrontTile(TileState tile, Vec2i pos) @@ -543,13 +546,16 @@ public class Chunk implements IBdfClassManager public void setFrontTile(TileState tile, int id) { + Vec2i pos = Vec2i.fromId(CHUNK_SIZE, id).add(c_pos.multiply(16)); + tiles_front[id].onDestroy(layer, this, new TileState(tiles_front[id], tiles_front_meta[id]), tile, pos); + // Set the front tile this.tiles_front[id] = tile.tile; this.tiles_front_meta[id] = tile.meta; setDirty(); - tile.tile.onGenerate(layer, this, tile, Vec2i.fromId(CHUNK_SIZE, id)); + tile.tile.onGenerate(layer, this, tile, pos); } public TileState getBackTile(Vec2i pos) @@ -608,7 +614,8 @@ public class Chunk implements IBdfClassManager if(!ts.tile.unbreakable) { setFrontTile(Tiles.VOID.getDefaultState(), pos); - spawnEntity(new ParticleBreak(new Vec3d(pos.x + 0.5, 0, pos.y + 0.5), new Vec3d(0, 0, 0), ts.tile.getModel(ts.meta))); + spawnEntity(new ParticleBreak(new Vec3d(pos.x + 0.5, 0, pos.y + 0.5), + new Vec3d(0, 0, 0), ts.tile.getModel(ts.meta))); } } diff --git a/src/projectzombie/world/layer/layergen/LayerGenEarth.java b/src/projectzombie/world/layer/layergen/LayerGenEarth.java index 6e810c7..7ee781b 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenEarth.java +++ b/src/projectzombie/world/layer/layergen/LayerGenEarth.java @@ -44,7 +44,7 @@ public class LayerGenEarth extends LayerGen // Get the noise generator double humidity = getHumidity(layer, pos); double light = MathHelpers.map( - MathHelpers.sin(GameTimer.getTime() / 14400.0 - MathHelpers.PI / 4), + MathHelpers.sin(MathHelpers.map(GameTimer.getTime() % 720000, 0, 720000, 0, MathHelpers.TWO_PI)), -1, 1, 0.2 * humidity, 0.2); NoiseGenerator terrain_noise = layer.noise_gens[0]; return MathHelpers.map(terrain_noise.eval(pos.x / World.BIOME_SIZE, pos.y / World.BIOME_SIZE), -1, 1, 0, 0.5 + light); @@ -201,7 +201,7 @@ public class LayerGenEarth extends LayerGen } private double getEarthLight() { - return MathHelpers.sin(((MathHelpers.TWO_PI * (GameTimer.getTime() % 720000)) / 72000.0) + MathHelpers.PI/4) * 0.5 + 0.5; + return MathHelpers.sin(Math.toRadians(getSunPosition())) * 0.5 + 0.5; } @Override @@ -210,8 +210,17 @@ public class LayerGenEarth extends LayerGen } @Override - public double getSunPosition() { - return (GameTimer.getTime() % 720000) / 200.0 + 45; + public double getSunPosition() + { + int timer = (int)((GameTimer.getTime() + 9000) % 72000); + + if(timer < 48000) { + return MathHelpers.map(timer, 0, 48000, 0, 180); + } + + else { + return 270; + } } @Override diff --git a/src/resources/shader/environmentRenderer.fsh b/src/resources/shader/environmentRenderer.fsh index 4fca704..3b23fed 100644 --- a/src/resources/shader/environmentRenderer.fsh +++ b/src/resources/shader/environmentRenderer.fsh @@ -23,6 +23,7 @@ uniform vec3 lighting_day_high; uniform vec2 lightmap_offset; uniform vec2 lightmap_size; +uniform int do_lighting; uniform int do_discard_coords; uniform vec4 discard_coords; uniform vec4 color; @@ -93,7 +94,8 @@ void main() float fog = pCameraDepth; FragColor = (fog + (1 - fog) * textureRGB * (mod(int(pFlags / 4), 2) == 1 ? color_grass : vec4(1,1,1,1)) * color) - * vec4(light_day + max(0, light_src), pFade) * (mod(int(pFlags / 2), 2) == 1 ? rgb : vec4(1, 1, 1, 1)) + * vec4(do_lighting == 1 ? (light_day + max(0, light_src)) : vec3(1), pFade) + * (mod(int(pFlags / 2), 2) == 1 ? rgb : vec4(1, 1, 1, 1)) * saturation + contrast; } diff --git a/src/resources/texture/gui/inventory.png b/src/resources/texture/gui/inventory.png index d1eefe87d0fd3128031ee43866fe1040a7d8dcf9..08a3e585706c250c9f0600832f47b35b11e99a6a 100644 GIT binary patch literal 4521 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 F1OWcd^)CPb delta 1313 zcmZ3f+{-&bnTfG=@*Hl7dIy=K@xe=#MA^B!ELc|hiMhD4h_7`L)M|-Z7|K4`+rCAO z*R!j8@q?&>56K%}J$STcb@OTkj=Ba5ODoM?9-aTaxpb3kEZ!a8UEROCydgl_@NAYe ztI1un;LaU0POj@%7~Ue_roYTk!}#=!sY_I9j$gNBs@dE9QRjbgeV?9bdcC27g3x(` z!&^G9cdDD`Hh;D&Y!OYJ`eRPTktN(h_C>KDfAkg~Ol?eeJ5!R?XW^tH78Q}17-nMn zi1X2kRWGOLr`Uv9<`-V`61}!Vy*|-mxxRkk+-D3z5eJl1IsyU?vUzO~TpX%?)T!&+ zW4nKK*YziQD_&=luzVKS#&+{-^Z)vT@AKCF`7vXQ=FoS+1K#c!tC?s&o8rg->dolyY}US+i$-;-hcM|8S%z@ z`-JlMJ)ik3{rP2^$q#uYCV$}NM8Z6J^Y~ZAJS<%H^XAVlqPFv9>8LX&b27|*&#*54 z|COI##6KH)3pd(sRjdAY z%((vVpChv-Hy!rFrzl!=_XT6E5 z3j2R|;i3C;R_!xmYB0CTo(>Cz)Q}W=hH1OEEsTD9wU%R5{CtKF-{k+Ts#XZwZ|BW$ zFYc?Yfc4vp8Vna^Ff=eQFfnj2D1aF9vJGE;egQ?v^|+^N%syW~U+yA4jp4#iK82re zJ}ZB&wyE|zXx;E-^Z94rE5FH1HV{;*@@9{5HmT3AS@osu zjm7;CidbR9+pMuy4Gd=ir#_yod>R?Tm| z@Ny0tC`3NVbcL5WtV0SBcxbO?n(*)L$qWn(44$rjF6*2UngB^Rbn^fJ diff --git a/src/resources/texture/gui/selection_box_crafting.png b/src/resources/texture/gui/selection_box_crafting.png index b88768feb60a5955fc05b5e09c39512eb22bebd2..38fe5dd60e81c38c9d25feceb68999538f1bb090 100644 GIT binary patch delta 1999 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 O1_n=8KbLh*2~7a8^H0M7 diff --git a/src/resources/texture/gui/selection_box_storage.png b/src/resources/texture/gui/selection_box_storage.png index 86d81ed9f7b882a86c9991df63c62449ddc8e382..4ef5a930d6c6872dbe46aed4fb635d13b655fb1a 100644 GIT binary patch delta 2098 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 P7#KWV{an^LB{Ts5L^bV; delta 2172 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 diff --git a/src/resources/texture/item/clay.png b/src/resources/texture/item/clay.png new file mode 100644 index 0000000000000000000000000000000000000000..bb206a73895a6a9cad5d42a29cbbb03d314df33f GIT binary patch literal 2920 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 literal 0 HcmV?d00001 diff --git a/src/resources/texture/list.txt b/src/resources/texture/list.txt index 2599da7..eedc4d6 100644 --- a/src/resources/texture/list.txt +++ b/src/resources/texture/list.txt @@ -185,6 +185,7 @@ ./tile/rock_ice.png ./tile/boss_portal.png ./tile/ladder.png +./tile/grass_burnt.png ./tile/hemp7.png ./tile/grass_infested.png ./tile/tree_branch.png @@ -221,6 +222,7 @@ ./entity/zombie_back_still.png ./entity/zombie_front_still.png ./item/acorn.png +./item/clay.png ./item/grappling_hook.png ./item/gun_upgrade.png ./item/shield_upgrade.png diff --git a/src/resources/texture/tile/grass_burnt.png b/src/resources/texture/tile/grass_burnt.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb906291c1c770075a898c2b174159dbbf913aa GIT binary patch literal 2203 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orG0E>(p@lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNPt{p1bL(2FKs`T4|h&t|gXrVQ2Z$el~Ybius)9Uw-vYh)^>} z1>b|}Wq&`Ho7bP@?{7FJ$S%Lv{>k%2-7``I`d*8lSC@HLbFM#`*Y1g%dVovVy>Gvs zn0%dl;$_^18i#*VW*ej%_&A^bWRlUIKE<(?O|xjvlLyNd-dNYz-#C9^+Mau7vBgL$Nt^&yl-uvR7 zg-@<8ntAVZ14rM22+tS`qwqr#XL^@sa4KF<&o5!xv(EGX#}o3Np@|dxW;Ev*$o@2% z$ocNhCiU}SUp(%Ghc-O4;^lC8G+RYt!=VEYRev8me6WK@!GcXu!}CdoY+52i#|Ezn zFV=j`kXV{>Wc!*#i_(b~9t(Kq3n`tbI(^7@i|2`=K9%|#tS1+`Op_6;OyX)&QqAA{ z`N`gN`<br~5i>joJI=H1X;Md}ws$FkI4c(Tjh{3+3Yi$v&LELhhb9su%s0PR__J zo4M)y9OphuQP260xJ2W3v`8av$C($JQj<}S?Rs5^mgp> zch=u8B>SJbmGZUpFJrbry7asUXII|zJ;Ac}=SXfZTQozSv z+`L)Y%Y1W-kP2^}PwT-M0WYK!N(0{IJ*(?BcYe6N;_&~Zb3Cv9@jvSc`2OrI`?XgV z&rhAa5!%Xp`LNg5(jzSgPt+!?dyp|l)zz+@<y32}cNiS+HS*p5_}QT|PolEtq$$1MxioE+ zlZSc2Ga*f#4L^4oYrdT=*?w4d!Ota~@kdrZsW=)q?`OK*j(|CDov!PDFaNs5R@l$v z%x1af`^Js&r?={PzFsj`_0z(o0Xz4;T2Sx%*84h-#B2ZA|2Pbf_Z}8+edcCdw^Y1B z@`~1#qPT;z-M>WrS$*aGz6ED{w#n=@j$Zw~{qGH1^~N&3(gcq0sUpiWyYE-E{W<$f zD{5`$?(awT#(41l+{;vQ`Pj>EZ|||JPV-t3zhjs6^2)1q*X+1=o4rx*l4H=Eef`)p zS$Wgdm+O{jtiNS?;)DC5`7T%X>fCb|%v)M!cY(;y$d^+%F^=W3;|zO*Q)-?|R7xdiDAz|G#|}FW7cSMLo}E4FdyXYo@bv zfTy!FtaM{w(3n^|(bnUzgGAf?ZPUb7T5Rd)aBh2*;uvxyaCJZn*TS%js|TN4vd_3Q zVaW~)u63;J^nA;r~HTw$`E`kd)#)<_r3b%_Zk1CO9D9{~j5`=zRMTD+FPhQz{Ku~L{`cja^Pa|jfBqtvOO3gP>7&kN z-tLO#imJ<(EZ++skBAKFINy1kXP3f9cd*)P| zmyN4Tcu4Q3zn0TQ&qdFh zDlZ+jfAYh%=;V`C4HJ_YO;=2ivHv0e=iS=KIdcjoD|ssXNV+Yr?2sXzVVd*%_l<4Q z>JASicU-di7bQI7r^?=o7azGh{5LBoynFG9?SmqAiJD8Q&P7WYbn7>A?3sVj{AuG0 z-3z;)eOp`GcbQ$md#~4h2KM#?8J(N1+uoCX_wM$7)3^WrGO&skRTnm&EM;I|;4JWn zEM{Qf76xHPhFNnY7#JAXOFVsD*`IK5u!>7wepa`ffr0U~r;B5V#(CR`8;f+bd015$ znU2jXy_)yvMCbqi_xB|0XGl!QTTsNiy*oFW z*KK_^$0a4L0wN(>APx3^84 z8GHR}ja?@PL)H6trxtr@UN1c=an>i4QDMmxFU`J|j$%LKZbKnKz}y4i{ForA3xUE9hcBt zTCo2ImqxAb*zs@9 z=JUb~KkDC2pILig_vh>Ps(J!LUzY9O8>c`0Ms@gA!!~U