diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 577d40771e..189911c66f 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -294,9 +294,7 @@ public class Block extends BlockStorage{ /** Called after the block is placed by this client. */ @CallSuper public void playerPlaced(Tile tile){ - if(outputsPower && !consumesPower){ - PowerNode.lastPlaced = tile.pos(); - } + } /** Called after the block is placed by anyone. */ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 86220b6acc..358fb27a43 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; +import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -20,9 +21,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; public class PowerNode extends PowerBlock{ - //last distribution block placed - public static int lastPlaced = -1; - + protected ObjectSet graphs = new ObjectSet<>(); protected Vector2 t1 = new Vector2(), t2 = new Vector2(); protected TextureRegion laser, laserEnd; @@ -99,23 +98,11 @@ public class PowerNode extends PowerBlock{ () -> Mathf.clamp(entity.power.graph.getPowerProduced() / entity.power.graph.getPowerNeeded()))); } - @Override - public void playerPlaced(Tile tile){ - Tile before = world.tile(lastPlaced); - - if(linkValid(tile, before) && !before.entity.proximity().contains(tile)){ - Call.linkPowerNodes(null, tile, before); - } - - lastPlaced = tile.pos(); - super.playerPlaced(tile); - } - @Override public void placed(Tile tile){ if(Net.client()) return; - Predicate valid = other -> other != null && other != tile && ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower)) && linkValid(tile, other) + Predicate valid = other -> other != null && other != tile && ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && linkValid(tile, other) && !other.entity.proximity().contains(tile) && other.entity.power.graph != tile.entity.power.graph; tempTiles.clear(); @@ -132,6 +119,28 @@ public class PowerNode extends PowerBlock{ super.placed(tile); } + private void getPotentialLinks(Tile tile, Consumer others){ + Predicate valid = other -> other != null && other != tile && other.entity != null && other.entity.power != null && + ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && + overlaps(tile.x * tilesize + offset(), tile.y *tilesize + offset(), other, laserRange * tilesize) + && !other.entity.proximity().contains(tile) && !graphs.contains(other.entity.power.graph); + + tempTiles.clear(); + graphs.clear(); + Geometry.circle(tile.x, tile.y, (int)(laserRange + 1), (x, y) -> { + Tile other = world.ltile(x, y); + if(valid.test(other)){ + tempTiles.add(other); + } + }); + + tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); + tempTiles.each(valid, t -> { + graphs.add(t.entity.power.graph); + others.accept(t); + }); + } + @Override public void setStats(){ super.setStats(); @@ -213,6 +222,11 @@ public class PowerNode extends PowerBlock{ Draw.color(Pal.placing); Drawf.circles(x * tilesize + offset(), y * tilesize + offset(), laserRange * tilesize); + getPotentialLinks(tile, other -> { + Drawf.square(other.drawx(), other.drawy(), other.block().size * tilesize / 2f + 2f, Pal.place); + }); + + /* for(int cx = (int)(x - laserRange - 1); cx <= x + laserRange + 1; cx++){ for(int cy = (int)(y - laserRange - 1); cy <= y + laserRange + 1; cy++){ Tile link = world.ltile(cx, cy); @@ -221,7 +235,7 @@ public class PowerNode extends PowerBlock{ Drawf.square(link.drawx(), link.drawy(), link.block().size * tilesize / 2f + 2f, link.pos() == lastPlaced ? Pal.place : Pal.accent); } } - } + }*/ Draw.reset(); }