From fff86dd939e00f84e4e1c8827c95a1b9124f0e66 Mon Sep 17 00:00:00 2001 From: valoeghese Date: Fri, 25 Sep 2020 23:43:56 +1200 Subject: [PATCH] 0.2.4 --- .../fc0/client/render/model/ChunkMesh.java | 32 ++++++------------ .../fc0/client/render/screen/GameScreen.java | 1 + .../fc0/client/world/ClientChunk.java | 30 +++++++++------- .../fc0/client/world/ClientWorld.java | 6 ++-- .../valoeghese/fc0/world/GameplayWorld.java | 4 +++ .../valoeghese/fc0/world/player/Player.java | 9 +++++ .../resources/assets/texture/font_atlas.png | Bin 6957 -> 6961 bytes src/main/resources/data/language/en.gb.txt | 1 - 8 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/main/java/tk/valoeghese/fc0/client/render/model/ChunkMesh.java b/src/main/java/tk/valoeghese/fc0/client/render/model/ChunkMesh.java index c5b6165..7577b89 100644 --- a/src/main/java/tk/valoeghese/fc0/client/render/model/ChunkMesh.java +++ b/src/main/java/tk/valoeghese/fc0/client/render/model/ChunkMesh.java @@ -12,32 +12,22 @@ import java.util.List; public class ChunkMesh { - public ChunkMesh(ClientChunk chunk, byte[] tiles, byte[] meta, int x, int z) { + public ChunkMesh(ClientChunk chunk, int x, int z) { this.x = x << 4; this.z = z << 4; this.transform = new Matrix4f().translate(this.x, 0, this.z); - this.tiles = tiles; - this.meta = meta; this.chunk = chunk; - this.buildMesh(); } private final int x; private final int z; private final Matrix4f transform; - private final byte[] tiles; - private final byte[] meta; private final RenderedChunk chunk; private ChunkMeshModel solid; private ChunkMeshModel translucent; private ChunkMeshModel water; - public void updateTile(int index, byte tile) { - this.tiles[index] = tile; - this.buildMesh(); - } - - public void buildMesh() { + public void buildMesh(byte[] tiles, byte[] metas) { List faces = new ArrayList<>(); List waterFaces = new ArrayList<>(); List translucentFaces = new ArrayList<>(); @@ -46,8 +36,8 @@ public void buildMesh() { for (int z = 0; z < 16; ++z) { for (int y = 0; y < 128; ++y) { if (this.chunk.renderHeight(y)) { - int tile = this.tiles[index(x, y, z)]; - byte meta = this.meta[index(x, y, z)]; + int tile = tiles[index(x, y, z)]; + byte meta = metas[index(x, y, z)]; Tile instance = Tile.BY_ID[tile]; boolean waterLayer = instance == Tile.WATER; List layer = waterLayer ? waterFaces : (instance.isTranslucent() ? translucentFaces : faces); @@ -55,7 +45,7 @@ public void buildMesh() { TileRenderer custom = instance.getCustomTileRenderer(); if (custom != null && instance.shouldRender()) { - custom.addFaces(instance, layer, this.tiles, this.chunk, x, y, z, meta); + custom.addFaces(instance, layer, tiles, this.chunk, x, y, z, meta); } else if (instance.shouldRender() && instance.isCross()) { layer.add( new RenderedCrossTileFace(new Vector3f(x, y, z), @@ -63,12 +53,12 @@ public void buildMesh() { 0.95f * this.chunk.getRenderLightingFactor(x, y, z), meta)); } else if (instance.shouldRender() || waterLayer) { - Tile tileUp = y == 127 ? Tile.AIR : Tile.BY_ID[this.tiles[index(x, y + 1, z)]]; - Tile tileDown = y == 0 ? Tile.AIR : Tile.BY_ID[this.tiles[index(x, y - 1, z)]]; - Tile tileWest = x == 0 ? this.chunk.west(z, y) : Tile.BY_ID[this.tiles[index(x - 1, y, z)]]; - Tile tileEast = x == 15 ? this.chunk.east(z, y) : Tile.BY_ID[this.tiles[index(x + 1, y, z)]]; - Tile tileSouth = z == 0 ? this.chunk.south(x, y) : Tile.BY_ID[this.tiles[index(x, y, z - 1)]]; - Tile tileNorth = z == 15 ? this.chunk.north(x, y) : Tile.BY_ID[this.tiles[index(x, y, z + 1)]]; + Tile tileUp = y == 127 ? Tile.AIR : Tile.BY_ID[tiles[index(x, y + 1, z)]]; + Tile tileDown = y == 0 ? Tile.AIR : Tile.BY_ID[tiles[index(x, y - 1, z)]]; + Tile tileWest = x == 0 ? this.chunk.west(z, y) : Tile.BY_ID[tiles[index(x - 1, y, z)]]; + Tile tileEast = x == 15 ? this.chunk.east(z, y) : Tile.BY_ID[tiles[index(x + 1, y, z)]]; + Tile tileSouth = z == 0 ? this.chunk.south(x, y) : Tile.BY_ID[tiles[index(x, y, z - 1)]]; + Tile tileNorth = z == 15 ? this.chunk.north(x, y) : Tile.BY_ID[tiles[index(x, y, z + 1)]]; if (!tileUp.isOpaque(waterLayer, instance)) { layer.add(new RenderedTileFace( diff --git a/src/main/java/tk/valoeghese/fc0/client/render/screen/GameScreen.java b/src/main/java/tk/valoeghese/fc0/client/render/screen/GameScreen.java index 794c124..15453f0 100644 --- a/src/main/java/tk/valoeghese/fc0/client/render/screen/GameScreen.java +++ b/src/main/java/tk/valoeghese/fc0/client/render/screen/GameScreen.java @@ -283,6 +283,7 @@ public void handleKeybinds() { world.writeTile(pos, Tile.CACTUS.id); } else { world.writeTile(pos, tile.id); + world.writeMeta(pos.x, pos.y, pos.z, selectedItem.getMeta()); } tile.onPlace(world, pos); diff --git a/src/main/java/tk/valoeghese/fc0/client/world/ClientChunk.java b/src/main/java/tk/valoeghese/fc0/client/world/ClientChunk.java index 8fa212b..89b256a 100644 --- a/src/main/java/tk/valoeghese/fc0/client/world/ClientChunk.java +++ b/src/main/java/tk/valoeghese/fc0/client/world/ClientChunk.java @@ -15,6 +15,7 @@ public ClientChunk(ChunkAccess parent, int x, int z, byte[] tiles, byte[] meta, } protected ChunkMesh mesh; + public boolean dirtyForRender = true; @Override public void writeMeta(int x, int y, int z, byte meta) { @@ -24,8 +25,8 @@ public void writeMeta(int x, int y, int z, byte meta) { return; } + this.dirtyForRender = true; super.writeMeta(x, y, z, meta); - this.rebuildMesh(); } @Override @@ -36,20 +37,20 @@ public void writeTile(int x, int y, int z, byte tile) { return; } + this.dirtyForRender = true; super.writeTile(x, y, z, tile); - this.updateMesh(i, tile); if (x == 0) { ClientChunk chunk = (ClientChunk) this.getRenderChunk(this.x - 1, this.z); if (chunk != null) { - chunk.rebuildMesh(); + chunk.dirtyForRender = true; } } else if (x == 15) { ClientChunk chunk = (ClientChunk) this.getRenderChunk(this.x + 1, this.z); if (chunk != null) { - chunk.rebuildMesh(); + chunk.dirtyForRender = true; } } @@ -57,13 +58,13 @@ public void writeTile(int x, int y, int z, byte tile) { ClientChunk chunk = (ClientChunk) this.getRenderChunk(this.x, this.z - 1); if (chunk != null) { - chunk.rebuildMesh(); + chunk.dirtyForRender = true; } } else if (z == 15) { ClientChunk chunk = (ClientChunk) this.getRenderChunk(this.x, this.z + 1); if (chunk != null) { - chunk.rebuildMesh(); + chunk.dirtyForRender = true; } } } @@ -119,21 +120,24 @@ public Tile west(int z, int y) { void rebuildMesh() { if (this.mesh != null) { - this.mesh.buildMesh(); + this.mesh.buildMesh(this.tiles, this.meta); } } - private void updateMesh(int index, byte tile) { - if (this.mesh != null) { - this.mesh.updateTile(index, tile); + private void lebronJames() { + if (this.dirtyForRender && this.mesh != null) { + this.dirtyForRender = false; + this.mesh.buildMesh(this.tiles, this.meta); } } public ChunkMesh getOrCreateMesh() { if (this.mesh == null) { - this.mesh = new ChunkMesh(this, this.tiles, this.meta, this.x, this.z); + this.mesh = new ChunkMesh(this, this.x, this.z); } + this.lebronJames(); + return this.mesh; } @@ -153,8 +157,8 @@ public void destroy() { public void refreshLighting() { super.refreshLighting(); - if (this.status == ChunkLoadStatus.RENDER) { // Is this neccesary? - this.rebuildMesh(); // rebuild mesh to account for new lighting + if (this.status == ChunkLoadStatus.RENDER) { // Is this necessary? + this.dirtyForRender = true; } } diff --git a/src/main/java/tk/valoeghese/fc0/client/world/ClientWorld.java b/src/main/java/tk/valoeghese/fc0/client/world/ClientWorld.java index b03a7bc..20c6dfd 100644 --- a/src/main/java/tk/valoeghese/fc0/client/world/ClientWorld.java +++ b/src/main/java/tk/valoeghese/fc0/client/world/ClientWorld.java @@ -71,11 +71,11 @@ public List getChunksForRendering() { @Override protected void onChunkRemove(Chunk c) { - if (c.render) { - c.destroy(); + c.destroy(); + if (c.render) { if (this.toAddToQueue.contains(c)) { - this.toAddForRendering.remove(c); + this.toAddToQueue.remove(c); } else if (this.toAddForRendering.contains(c)) { this.toAddForRendering.remove(c); } else if (this.chunksForRendering.contains(c)) { diff --git a/src/main/java/tk/valoeghese/fc0/world/GameplayWorld.java b/src/main/java/tk/valoeghese/fc0/world/GameplayWorld.java index 43b7644..9b0610d 100644 --- a/src/main/java/tk/valoeghese/fc0/world/GameplayWorld.java +++ b/src/main/java/tk/valoeghese/fc0/world/GameplayWorld.java @@ -333,6 +333,10 @@ public void addEntity(Entity entity) { @Override public void destroy() { + for (Chunk c : this.chunks.values()) { + c.destroy(); + } + this.chunkSaveExecutor.shutdown(); } diff --git a/src/main/java/tk/valoeghese/fc0/world/player/Player.java b/src/main/java/tk/valoeghese/fc0/world/player/Player.java index f54ffe0..9fe6bcd 100644 --- a/src/main/java/tk/valoeghese/fc0/world/player/Player.java +++ b/src/main/java/tk/valoeghese/fc0/world/player/Player.java @@ -99,6 +99,15 @@ public final void move(Pos pos) { // setters and adders etc. + @Override + public int damage(int amount) { + if (this.dev) { + return this.getHealth(); + } + + return super.damage(amount); + } + @Override public void setPos(Pos pos) { super.setPos(pos); diff --git a/src/main/resources/assets/texture/font_atlas.png b/src/main/resources/assets/texture/font_atlas.png index 81685b931804bea2f16193d05c86568bf5958e41..71fb639570419d3529d6c0eaacb28297b0101107 100644 GIT binary patch delta 5550 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 delta 5572 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 S;UJX&0000