Improved replacement system
This commit is contained in:
@@ -5,6 +5,7 @@ import arc.Graphics.*;
|
||||
import arc.Graphics.Cursor.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.ArcAnnotate.*;
|
||||
import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
@@ -62,6 +63,7 @@ public class ConstructBlock extends Block{
|
||||
if(tile == null) return;
|
||||
|
||||
float healthf = tile.build == null ? 1f : tile.build.healthf();
|
||||
Seq<Building> prev = tile.build instanceof ConstructBuild ? ((ConstructBuild)tile.build).prevBuild : null;
|
||||
|
||||
tile.setBlock(block, team, rotation);
|
||||
|
||||
@@ -71,6 +73,10 @@ public class ConstructBlock extends Block{
|
||||
if(config != null){
|
||||
tile.build.configured(builder, config);
|
||||
}
|
||||
|
||||
if(prev != null && prev.size > 0){
|
||||
tile.build.overwrote(prev);
|
||||
}
|
||||
}
|
||||
|
||||
//last builder was this local client player, call placed()
|
||||
@@ -126,6 +132,7 @@ public class ConstructBlock extends Block{
|
||||
* If there is no recipe for this block, as is the case with rocks, 'previous' is used.
|
||||
*/
|
||||
public @Nullable Block cblock;
|
||||
public @Nullable Seq<Building> prevBuild;
|
||||
|
||||
public float progress = 0;
|
||||
public float buildCost;
|
||||
|
||||
@@ -146,6 +146,20 @@ public class Conveyor extends Block implements Autotiler{
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void overwrote(Seq<Building> builds){
|
||||
if(builds.first() instanceof ConveyorBuild build){
|
||||
ids = build.ids.clone();
|
||||
xs = build.xs.clone();
|
||||
ys = build.ys.clone();
|
||||
len = build.len;
|
||||
clogHeat = build.clogHeat;
|
||||
lastInserted = build.lastInserted;
|
||||
mid = build.mid;
|
||||
minitem = build.minitem;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldIdleSound(){
|
||||
return clogHeat <= 0.5f ;
|
||||
@@ -161,11 +175,9 @@ public class Conveyor extends Block implements Autotiler{
|
||||
blendscly = bits[2];
|
||||
blending = bits[4];
|
||||
|
||||
if(front() != null && front() != null){
|
||||
next = front();
|
||||
nextc = next instanceof ConveyorBuild && next.team == team ? (ConveyorBuild)next : null;
|
||||
aligned = nextc != null && rotation == next.rotation;
|
||||
}
|
||||
next = front();
|
||||
nextc = next instanceof ConveyorBuild && next.team == team ? (ConveyorBuild)next : null;
|
||||
aligned = nextc != null && rotation == next.rotation;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -220,7 +232,7 @@ public class Conveyor extends Block implements Autotiler{
|
||||
if(ys[i] > 0.5 && i > 0) mid = i - 1;
|
||||
xs[i] = Mathf.approachDelta(xs[i], 0, speed*2);
|
||||
|
||||
if(ys[i] >= 1f && moveForward(ids[i])){
|
||||
if(ys[i] >= 1f && pass(ids[i])){
|
||||
//align X position if passing forwards
|
||||
if(aligned){
|
||||
nextc.xs[nextc.lastInserted] = xs[i];
|
||||
@@ -242,6 +254,14 @@ public class Conveyor extends Block implements Autotiler{
|
||||
noSleep();
|
||||
}
|
||||
|
||||
public boolean pass(Item item) {
|
||||
if(next != null && next.team == team && next.acceptItem(this, item)){
|
||||
next.handleItem(this, item);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int removeStack(Item item, int amount){
|
||||
noSleep();
|
||||
@@ -346,6 +366,9 @@ public class Conveyor extends Block implements Autotiler{
|
||||
ys[i] = y;
|
||||
}
|
||||
}
|
||||
|
||||
//this updates some state
|
||||
updateTile();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package mindustry.world.blocks.distribution;
|
||||
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
@@ -14,6 +15,7 @@ import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.*;
|
||||
import mindustry.world.blocks.distribution.Conveyor.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
@@ -220,6 +222,16 @@ public class StackConveyor extends Block implements Autotiler{
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void overwrote(Seq<Building> builds){
|
||||
if(builds.first() instanceof ConveyorBuild build){
|
||||
Item item = build.items.first();
|
||||
if(item != null){
|
||||
handleStack(item, build.items.get(itemCapacity), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldIdleSound(){
|
||||
return false; // has no moving parts;
|
||||
|
||||
@@ -2,6 +2,7 @@ package mindustry.world.blocks.power;
|
||||
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.gen.*;
|
||||
@@ -31,5 +32,15 @@ public class Battery extends PowerDistributor{
|
||||
|
||||
Draw.rect(topRegion, x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void overwrote(Seq<Building> previous){
|
||||
for(Building other : previous){
|
||||
if(other.power != null && other.block.consumes.hasPower() && other.block.consumes.getPower().buffered){
|
||||
float amount = other.block.consumes.getPower().capacity * other.power.status;
|
||||
power.status = Mathf.clamp(power.status + amount / block.consumes.getPower().capacity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package mindustry.world.blocks.storage;
|
||||
|
||||
import arc.struct.*;
|
||||
import arc.util.ArcAnnotate.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
@@ -40,6 +41,18 @@ public abstract class StorageBlock extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void overwrote(Seq<Building> previous){
|
||||
for(Building other : previous){
|
||||
if(other.items != null){
|
||||
items.addAll(other.items);
|
||||
}
|
||||
}
|
||||
|
||||
//ensure item counts are not too high
|
||||
items.each((i, a) -> items.set(i, Math.min(a, itemCapacity)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPickup(){
|
||||
return linkedCore == null;
|
||||
|
||||
Reference in New Issue
Block a user