diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 0690c13505..08302458d2 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -416,6 +416,7 @@ public class Control implements ApplicationListener, Loadable{ music.update(); loops.update(); + Time.updateGlobal(); if(Core.input.keyTap(Binding.fullscreen)){ boolean full = settings.getBool("fullscreen"); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index de24a552ec..6e1ab37030 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -302,6 +302,14 @@ public interface BuilderTrait extends Entity, TeamTrait{ } + public Rectangle bounds(Rectangle rect){ + if(breaking){ + return rect.set(-100f, -100f, 0f, 0f); + }else{ + return block.bounds(x, y, rect); + } + } + public BuildRequest set(int x, int y, int rotation, Block block){ this.x = x; this.y = y; diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index a81d460394..cd296a0692 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -19,7 +19,6 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.net.Administration.*; @@ -429,22 +428,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ if(request.progress > 0.01f || (buildRequest() == request && request.initialized && (dst(request.x * tilesize, request.y * tilesize) <= placeDistance || state.isEditor()))) continue; if(request.breaking){ - Block block = world.ltile(request.x, request.y).block(); - - //draw removal request - Lines.stroke(2f, Pal.removeBack); - - float rad = Mathf.absin(Time.time(), 7f, 1f) + block.size * tilesize / 2f - 1; - Lines.square( - request.x * tilesize + block.offset(), - request.y * tilesize + block.offset() - 1, - rad); - - Draw.color(Pal.remove); - - Lines.square( - request.x * tilesize + block.offset(), - request.y * tilesize + block.offset(), rad); + control.input.drawBreaking(request); }else{ request.block.drawRequest(request, control.input.allRequests(), true); } diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index b47b648f69..4b94cc091f 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -27,7 +27,7 @@ public class OverlayRenderer{ if(!input.isDrawing() || player.isDead()) return; - input.drawOutlined(); + input.drawBottom(); } public void drawTop(){ diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index c0dfa828f2..09e7025003 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -7,6 +7,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.*; import io.anuke.arc.scene.ui.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; @@ -17,6 +18,8 @@ import io.anuke.mindustry.input.PlaceUtils.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; +import java.util.*; + import static io.anuke.arc.Core.scene; import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.input.PlaceMode.*; @@ -47,7 +50,7 @@ public class DesktopInput extends InputHandler{ } @Override - public void drawOutlined(){ + public void drawTop(){ Lines.stroke(1f); int cursorX = tileX(Core.input.mouseX()); int cursorY = tileY(Core.input.mouseY()); @@ -56,7 +59,7 @@ public class DesktopInput extends InputHandler{ if(mode == placing && block != null){ for(int i = 0; i < lineRequests.size; i++){ BuildRequest req = lineRequests.get(i); - if(i == lineRequests.size - 1){ + if(i == lineRequests.size - 1 && req.block.rotate){ drawArrow(block, req.x, req.y, req.rotation); } drawRequest(lineRequests.get(i)); @@ -70,13 +73,24 @@ public class DesktopInput extends InputHandler{ Tile tile = world.ltile(x, y); if(tile == null || !validBreak(tile.x, tile.y)) continue; - Draw.color(Pal.removeBack); - Lines.square(tile.drawx(), tile.drawy() - 1, tile.block().size * tilesize / 2f - 1); - Draw.color(Pal.remove); - Lines.square(tile.drawx(), tile.drawy(), tile.block().size * tilesize / 2f - 1); + drawBreaking(tile.x, tile.y); } } + Tmp.r1.set(result.x, result.y, result.x2 - result.x, result.y2 - result.y); + + Draw.color(Pal.remove); + Lines.stroke(1f); + + for(BuildRequest req : player.buildQueue()){ + if(req.breaking) continue; + if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ + drawBreaking(req); + } + } + + Lines.stroke(2f); + Draw.color(Pal.removeBack); Lines.rect(result.x, result.y - 1, result.x2 - result.x, result.y2 - result.y); Draw.color(Pal.remove); @@ -85,6 +99,7 @@ public class DesktopInput extends InputHandler{ if(block.rotate){ drawArrow(block, cursorX, cursorY, rotation); } + Draw.color(); drawRequest(cursorX, cursorY, block, rotation); block.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, block, rotation)); } @@ -216,8 +231,7 @@ public class DesktopInput extends InputHandler{ }else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine player.isShooting = true; } - }else if(Core.input.keyTap(Binding.deselect) && (block != null || mode != none || player.isBuilding()) && - !(player.buildRequest() != null && player.buildRequest().breaking && Core.keybinds.get(Binding.deselect) == Core.keybinds.get(Binding.break_block))){ + }else if(Core.input.keyTap(Binding.deselect) && block != null){ block = null; mode = none; }else if(Core.input.keyTap(Binding.break_block) && !Core.scene.hasMouse()){ @@ -252,6 +266,15 @@ public class DesktopInput extends InputHandler{ tryBreakBlock(wx, wy); } } + + Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize); + Iterator it = player.buildQueue().iterator(); + while(it.hasNext()){ + BuildRequest req = it.next(); + if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ + it.remove(); + } + } } if(selected != null){ diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 5e922dbc3b..8c6500de6b 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -177,7 +177,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } - public void drawOutlined(){ + public void drawBottom(){ } @@ -189,6 +189,35 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return false; } + public void drawBreaking(BuildRequest request){ + if(request.breaking){ + drawBreaking(request.x, request.y); + }else{ + Block block = request.block; + Draw.color(Pal.remove); + for(int i = 0; i < 4; i++){ + Point2 p = Geometry.d8edge[i]; + float offset = -Math.max(block.size - 1, 0) / 2f * tilesize; + Draw.rect("block-select", request.drawx() + offset * p.x, request.drawy() + offset * p.y, i * 90); + } + Draw.reset(); + } + } + + public void drawBreaking(int x, int y){ + Tile tile = world.ltile(x, y); + if(tile == null) return; + Block block = tile.block(); + + Draw.color(Pal.remove); + for(int i = 0; i < 4; i++){ + Point2 p = Geometry.d8edge[i]; + float offset = -Math.max(block.size - 1, 0) / 2f * tilesize; + Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90); + } + Draw.reset(); + } + protected void flushRequests(Array requests){ for(BuildRequest req : requests){ if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){ @@ -476,7 +505,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ float angle = Angles.angle(startX, startY, endX, endY); int baseRotation = rotation; if(!overrideLineRotation || diagonal){ - baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4; + baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4; } Tmp.r3.set(-1, -1, 0, 0); diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 5e634e51b7..a7ed57ce63 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -241,7 +241,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } @Override - public void drawOutlined(){ + public void drawBottom(){ Lines.stroke(1f); //draw removals @@ -256,8 +256,6 @@ public class MobileInput extends InputHandler implements GestureListener{ drawRequest(request); } - BuildRequest last = null; - //draw list of requests for(BuildRequest request : selection){ Tile tile = request.tile(); @@ -288,8 +286,6 @@ public class MobileInput extends InputHandler implements GestureListener{ Draw.mixcol(); request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation)); } - - last = request; } Draw.mixcol(); diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index fa483fbb6d..529fd0a021 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -125,7 +125,7 @@ public class Mods implements Loadable{ //get textures packed if(totalSprites > 0){ - TextureFilter filter = TextureFilter.Nearest; + TextureFilter filter = Core.settings.getBool("linear") ? TextureFilter.Linear : TextureFilter.Nearest; packer.updateTextureAtlas(Core.atlas, filter, filter, false); //generate new icons diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 308209f0df..ac6cfe8edf 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -10,6 +10,8 @@ import io.anuke.arc.scene.event.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; @@ -17,7 +19,7 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Styles; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -74,17 +76,21 @@ public class PlacementFragment extends Fragment{ boolean gridUpdate(InputHandler input){ if(Core.input.keyDown(Binding.pick)){ //mouse eyedropper select - Tile tile = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + Tile tile = world.ltileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + Block tryRecipe = tile == null ? null : tile.block(); - if(tile != null){ - tile = tile.link(); - Block tryRecipe = tile.block(); - if(tryRecipe.isVisible() && unlocked(tryRecipe)){ - input.block = tryRecipe; - currentCategory = input.block.category; - return true; + for(BuildRequest req : player.buildQueue()){ + if(!req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).contains(Core.input.mouseWorld())){ + tryRecipe = req.block; + break; } } + + if(tryRecipe != null && tryRecipe.isVisible() && unlocked(tryRecipe)){ + input.block = tryRecipe; + currentCategory = input.block.category; + return true; + } } if(!Core.input.keyDown(Binding.gridMode) || ui.chatfrag.chatOpen()) return false; diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 56ba00fef9..8678b9b0c4 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -668,15 +668,10 @@ public class Block extends BlockStorage{ } public void drawRequest(BuildRequest req, Eachable list, boolean valid){ - Draw.mixcol(!valid ? Pal.breakInvalid : Pal.accent, 0.12f + Mathf.absin(Time.time(), 8f, 0.35f)); + Draw.reset(); + Draw.mixcol(!valid ? Pal.breakInvalid : Pal.accent, 0.24f + Mathf.absin(Time.globalTime(), 7f, 0.3f)); + Draw.alpha(1f); drawRequestRegion(req, list); - - //Draw.color(Pal.accent); - for(int i = 0; i < 4; i++){ - Point2 p = Geometry.d8edge[i]; - float offset = -Math.max(size - 1, 0) / 2f * tilesize; - //if(i % 2 == 0) Draw.rect("block-select", req.drawx() + offset * p.x, req.drawy() + offset * p.y, i * 90); - } Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java index 20dfee3833..f8f4394482 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java @@ -51,14 +51,17 @@ public class Conduit extends LiquidBlock implements Autotiler{ if(bits == null) return; Draw.colorl(0.34f); + Draw.alpha(0.5f); Draw.rect(botRegions[bits[0]], req.drawx(), req.drawy(), req.rotation * 90); Draw.color(); + + Draw.rect(topRegions[bits[0]], req.drawx(), req.drawy(), req.rotation * 90); } @Override public void transformCase(int num, int[] bits){ - bits[0] = num == 0 ? 3 : num == 1 ? 6 : num == 2 ? 2 : num == 3 ? 4 : num == 4 ? 5 : num == 6 ? 1 : 0; + bits[0] = num == 0 ? 3 : num == 1 ? 6 : num == 2 ? 2 : num == 3 ? 4 : num == 4 ? 5 : num == 5 ? 1 : 0; } @Override