mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-01-19 08:47:29 +07:00
Duct blend fix / Duct autobridge
This commit is contained in:
parent
a31ddb7fa1
commit
99488e7c8d
@ -94,8 +94,10 @@ public class Blocks{
|
||||
|
||||
//power
|
||||
combustionGenerator, thermalGenerator, steamGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor,
|
||||
turbineCondenser,
|
||||
impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, diode,
|
||||
|
||||
//power - erekir
|
||||
turbineCondenser, chemicalCombustionChamber,
|
||||
beamNode, beamTower,
|
||||
|
||||
//production
|
||||
@ -1044,7 +1046,7 @@ public class Blocks{
|
||||
iconOverride = new String[]{"-bottom", "", "-top1"};
|
||||
drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidRegion(), new DrawBlock(), new DrawHeatOutput());
|
||||
|
||||
craftTime = 60f * 3f;
|
||||
craftTime = 60f * 4f;
|
||||
liquidCapacity = 30f;
|
||||
heatOutput = 5f;
|
||||
}};
|
||||
@ -1963,6 +1965,19 @@ public class Blocks{
|
||||
liquidCapacity = 20f;
|
||||
}};
|
||||
|
||||
//TODO arkycite combustion: ozone + arkycite
|
||||
|
||||
if(false)
|
||||
chemicalCombustionChamber = new ItemLiquidGenerator("chemical-combustion-chamber"){{
|
||||
requirements(Category.power, with(Items.graphite, 30, Items.tungsten, 40, Items.silicon, 30));
|
||||
powerProduction = 6f;
|
||||
consumes.liquids(LiquidStack.with(Liquids.ozone, 1f / 60f, Liquids.arkycite, 20f / 60f));
|
||||
size = 3;
|
||||
|
||||
ambientSound = Sounds.smelter;
|
||||
ambientSoundVolume = 0.06f;
|
||||
}};
|
||||
|
||||
//endregion power
|
||||
//region production
|
||||
|
||||
|
@ -175,7 +175,7 @@ public class Placement{
|
||||
plans.set(result);
|
||||
}
|
||||
|
||||
public static void calculateBridges(Seq<BuildPlan> plans, DirectionBridge bridge){
|
||||
public static void calculateBridges(Seq<BuildPlan> plans, DirectionBridge bridge, boolean hasJunction){
|
||||
if(isSidePlace(plans)) return;
|
||||
|
||||
//check for orthogonal placement + unlocked state
|
||||
@ -183,8 +183,11 @@ public class Placement{
|
||||
return;
|
||||
}
|
||||
|
||||
Boolf<BuildPlan> placeable = plan -> (plan.placeable(player.team())) ||
|
||||
(plan.tile() != null && plan.tile().block() == plan.block); //don't count the same block as inaccessible
|
||||
//TODO for chains of ducts, do not count consecutives in a different rotation as 'placeable'
|
||||
Boolf<BuildPlan> placeable = plan ->
|
||||
!(!hasJunction && plan.build() != null && plan.build().block == plan.block && plan.rotation != plan.build().rotation) &&
|
||||
(plan.placeable(player.team()) ||
|
||||
(plan.tile() != null && plan.tile().block() == plan.block)); //don't count the same block as inaccessible
|
||||
|
||||
var result = plans1.clear();
|
||||
var team = player.team();
|
||||
@ -198,7 +201,7 @@ public class Placement{
|
||||
if(i < plans.size - 1 && placeable.get(cur) && !placeable.get(plans.get(i + 1))){
|
||||
|
||||
//find the closest valid position within range
|
||||
for(int j = i + 1; j < plans.size; j++){
|
||||
for(int j = i + 2; j < plans.size; j++){
|
||||
var other = plans.get(j);
|
||||
|
||||
//out of range now, set to current position and keep scanning forward for next occurrence
|
||||
|
@ -63,6 +63,15 @@ public class Duct extends Block implements Autotiler{
|
||||
Draw.scl();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean blendsArmored(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){
|
||||
return Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery)
|
||||
|| ((!otherblock.rotatedOutput(otherx, othery) && Edges.getFacingEdge(otherblock, otherx, othery, tile) != null &&
|
||||
Edges.getFacingEdge(otherblock, otherx, othery, tile).relativeTo(tile) == rotation) ||
|
||||
//basically the only change here is that it treats overflow ducts specially, since they're... weird
|
||||
((otherblock.rotatedOutput(otherx, othery) || otherblock instanceof OverflowDuct) && Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){
|
||||
return (otherblock.outputsItems() && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock)) || (lookingAt(tile, rotation, otherx, othery, otherblock) && otherblock.hasItems);
|
||||
@ -75,7 +84,7 @@ public class Duct extends Block implements Autotiler{
|
||||
|
||||
@Override
|
||||
public void handlePlacementLine(Seq<BuildPlan> plans){
|
||||
Placement.calculateBridges(plans, (DuctBridge)Blocks.ductBridge);
|
||||
Placement.calculateBridges(plans, (DuctBridge)Blocks.ductBridge, false);
|
||||
}
|
||||
|
||||
public class DuctBuild extends Building{
|
||||
|
@ -17,6 +17,7 @@ import mindustry.type.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.*;
|
||||
import mindustry.world.blocks.distribution.Conveyor.*;
|
||||
import mindustry.world.blocks.distribution.Duct.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
@ -137,7 +138,8 @@ public class StackConveyor extends Block implements Autotiler{
|
||||
}
|
||||
}
|
||||
}else if(state == stateUnload){ //front unload
|
||||
if((blendprox & (1)) != 0){
|
||||
//TOOD hacky front check
|
||||
if((blendprox & (1)) != 0 && !(front() instanceof DuctBuild)){
|
||||
Draw.rect(sliced(regions[0], SliceMode.top), x + Geometry.d4x(rotation) * tilesize*0.75f, y + Geometry.d4y(rotation) * tilesize*0.75f, rotation * 90f);
|
||||
}
|
||||
}
|
||||
|
@ -133,7 +133,7 @@ public class Conduit extends LiquidBlock implements Autotiler{
|
||||
if(bridgeReplacement == null) return;
|
||||
|
||||
if(rotBridgeReplacement instanceof DirectionBridge duct){
|
||||
Placement.calculateBridges(plans, duct);
|
||||
Placement.calculateBridges(plans, duct, true);
|
||||
}else{
|
||||
Placement.calculateBridges(plans, (ItemBridge)bridgeReplacement);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user