From 4bc37ab065b64b65d605c1ba35b76054e5806f0c Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 30 Sep 2019 22:12:02 -0400 Subject: [PATCH] Some minor queued block fixes --- core/src/io/anuke/mindustry/Vars.java | 2 ++ core/src/io/anuke/mindustry/core/Logic.java | 26 +++++++++++++++++ .../src/io/anuke/mindustry/core/Renderer.java | 2 ++ .../entities/type/base/BuilderDrone.java | 7 +++-- .../mindustry/graphics/BlockRenderer.java | 28 +++++++++++++++---- 5 files changed, 57 insertions(+), 8 deletions(-) diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 3b905ca0e8..36790a71d1 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -31,6 +31,8 @@ import static io.anuke.arc.Core.*; public class Vars implements Loadable{ /** Whether to load locales.*/ public static boolean loadLocales = true; + /** Maximum number of broken blocks.*/ + public static final int maxBrokenBlocks = 256; /** IO buffer size. */ public static final int bufferSize = 8192; /** global charset, since Android doesn't support the Charsets class */ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 750c6459b5..7be985497b 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -61,8 +61,34 @@ public class Logic implements ApplicationListener{ } TeamData data = state.teams.get(tile.getTeam()); + + //remove existing blocks that have been placed here. + //painful O(n) iteration + copy + for(int i = 0; i < data.brokenBlocks.size; i++){ + BrokenBlock b = data.brokenBlocks.get(i); + if(b.x == tile.x && b.y == tile.y){ + data.brokenBlocks.removeIndex(i); + break; + } + } + data.brokenBlocks.addFirst(new BrokenBlock(tile.x, tile.y, tile.rotation(), block.id, tile.entity.config())); }); + + Events.on(BlockBuildEndEvent.class, event -> { + if(!event.breaking){ + TeamData data = state.teams.get(event.team); + + //painful O(n) iteration + copy + for(int i = 0; i < data.brokenBlocks.size; i++){ + BrokenBlock b = data.brokenBlocks.get(i); + if(b.x == event.tile.x && b.y == event.tile.y){ + data.brokenBlocks.removeIndex(i); + break; + } + } + } + }); } /** Handles the event of content being used by either the player or some block. */ diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index c6652e3327..30b4781abb 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -240,6 +240,8 @@ public class Renderer implements ApplicationListener{ blocks.drawBlocks(Layer.block); blocks.drawFog(); + blocks.drawBroken(); + Draw.shader(Shaders.blockbuild, true); blocks.drawBlocks(Layer.placement); Draw.shader(); diff --git a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java index dc91e18881..06a3ceb60d 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java @@ -187,9 +187,10 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ TeamData data = Vars.state.teams.get(team); if(!data.brokenBlocks.isEmpty()){ BrokenBlock block = data.brokenBlocks.removeLast(); - - placeQueue.addFirst(new BuildRequest(block.x, block.y, block.rotation, content.block(block.block)).configure(block.config)); - setState(build); + if(Build.validPlace(getTeam(), block.x, block.y, content.block(block.block), block.rotation)){ + placeQueue.addFirst(new BuildRequest(block.x, block.y, block.rotation, content.block(block.block)).configure(block.config)); + setState(build); + } } } } diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index ab9af0d674..d232b9897e 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -2,15 +2,19 @@ package io.anuke.mindustry.graphics; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.Texture.TextureFilter; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.FrameBuffer; +import io.anuke.arc.graphics.glutils.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.type.base.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.Block.*; import static io.anuke.arc.Core.camera; import static io.anuke.mindustry.Vars.*; @@ -120,6 +124,20 @@ public class BlockRenderer implements Disposable{ Draw.shader(); } + public void drawBroken(){ + if(unitGroups[player.getTeam().ordinal()].all().contains(p -> p instanceof BuilderDrone)){ + for(BrokenBlock block : state.teams.get(player.getTeam()).brokenBlocks){ + Block b = content.block(block.block); + if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue; + + Draw.alpha(0.5f); + Draw.mixcol(Pal.accent, 0.2f + Mathf.absin(5f, 0.2f)); + Draw.rect(b.icon(Icon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f); + } + Draw.reset(); + } + } + public void drawShadows(){ if(!shadowEvents.isEmpty()){ Draw.flush();