Improved replacement system

This commit is contained in:
Anuken
2020-10-02 11:14:18 -04:00
parent 138434d029
commit a3224b7082
13 changed files with 123 additions and 14 deletions

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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);
}
}
}
}
}

View File

@@ -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;