Automatic conveyor/conduit bridging
This commit is contained in:
@@ -6,12 +6,14 @@ import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.pooling.*;
|
||||
import mindustry.entities.units.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.distribution.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class Placement{
|
||||
private static final Seq<BuildPlan> plans1 = new Seq<>();
|
||||
private static final Seq<Point2> tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>();
|
||||
private static final NormalizeResult result = new NormalizeResult();
|
||||
private static final NormalizeDrawResult drawResult = new NormalizeDrawResult();
|
||||
@@ -75,7 +77,7 @@ public class Placement{
|
||||
var base = tmpPoints2;
|
||||
var result = tmpPoints.clear();
|
||||
|
||||
base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation, false));
|
||||
base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation));
|
||||
boolean addedLast = false;
|
||||
|
||||
outer:
|
||||
@@ -106,6 +108,59 @@ public class Placement{
|
||||
points.addAll(result);
|
||||
}
|
||||
|
||||
public static void calculateBridges(Seq<BuildPlan> plans, ItemBridge bridge){
|
||||
//check for orthogonal placement + unlocked state
|
||||
if(!(plans.first().x == plans.peek().x || plans.first().y == plans.peek().y || !bridge.unlockedNow())){
|
||||
return;
|
||||
}
|
||||
|
||||
var result = plans1.clear();
|
||||
var team = player.team();
|
||||
|
||||
outer:
|
||||
for(int i = 0; i < plans.size;){
|
||||
var cur = plans.get(i);
|
||||
result.add(cur);
|
||||
|
||||
//gap found
|
||||
if(i < plans.size - 1 && cur.placeable(team) && !plans.get(i + 1).placeable(team)){
|
||||
|
||||
//find the closest valid position within range
|
||||
for(int j = i + 1; j < plans.size; j++){
|
||||
var other = plans.get(j);
|
||||
|
||||
//out of range now, set to current position and keep scanning forward for next occurrence
|
||||
if(!bridge.positionsValid(cur.x, cur.y, other.x, other.y)){
|
||||
//add 'missed' conveyors
|
||||
for(int k = i + 1; k < j; k++){
|
||||
result.add(plans.get(k));
|
||||
}
|
||||
i = j;
|
||||
continue outer;
|
||||
}else if(other.placeable(team)){
|
||||
//found a link, assign bridges
|
||||
cur.block = bridge;
|
||||
other.block = bridge;
|
||||
cur.config = new Point2(other.x - cur.x, other.y - cur.y);
|
||||
|
||||
i = j;
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
|
||||
//if it got here, that means nothing was found. this likely means there's a bunch of stuff at the end; add it and bail out
|
||||
for(int j = i + 1; j < plans.size; j++){
|
||||
result.add(plans.get(j));
|
||||
}
|
||||
break;
|
||||
}else{
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
plans.set(result);
|
||||
}
|
||||
|
||||
private static float tileHeuristic(Tile tile, Tile other){
|
||||
Block block = control.input.block;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user