Update/draw payload buildings (broken)

This commit is contained in:
Anuken
2021-10-18 11:37:26 -04:00
parent c6f6b8e46e
commit f31759bb96
24 changed files with 166 additions and 13 deletions

View File

@@ -26,6 +26,7 @@ import mindustry.maps.*;
import mindustry.mod.*;
import mindustry.net.*;
import mindustry.service.*;
import mindustry.world.*;
import java.io.*;
import java.nio.charset.*;
@@ -195,6 +196,8 @@ public class Vars implements Loadable{
public static Fi launchIDFile;
/** empty map, indicates no current map */
public static Map emptyMap;
/** empty tile for payloads */
public static Tile emptyTile;
/** map file extension */
public static final String mapExtension = "msav";
/** save file extension */
@@ -310,6 +313,10 @@ public class Vars implements Loadable{
modDirectory.mkdirs();
Events.on(ContentInitEvent.class, e -> {
emptyTile = new Tile(Short.MAX_VALUE - 20, Short.MAX_VALUE - 20);
});
mods.load();
maps.load();
}

View File

@@ -291,7 +291,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
}
public byte relativeTo(Building tile){
return relativeTo(tile.tile());
return relativeTo(tile.tile);
}
public byte relativeToEdge(Tile other){
@@ -923,6 +923,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
drawTeamTop();
}
public void payloadDraw(){
draw();
}
public void drawTeamTop(){
if(block.teamRegion.found()){
if(block.teamRegions[team.id] == block.teamRegion) Draw.color(team.color);

View File

@@ -61,6 +61,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
void pickup(Building tile){
tile.pickedUp();
tile.tile.remove();
tile.tile = Vars.emptyTile;
payloads.add(new BuildPayload(tile));
Fx.unitPickup.at(tile);
Events.fire(new PickupEvent(self(), tile));

View File

@@ -155,6 +155,7 @@ public class Saves{
SaveSlot slot = new SaveSlot(getNextSlotFile());
slot.importFile(file);
slot.setName(file.nameWithoutExtension());
saves.add(slot);
slot.meta = SaveIO.getMeta(slot.file);
current = slot;
@@ -330,6 +331,10 @@ public class Saves{
public void importFile(Fi from) throws IOException{
try{
from.copyTo(file);
if(previewFile().exists()){
requestedPreview = false;
previewFile().delete();
}
}catch(Exception e){
throw new IOException(e);
}

View File

@@ -132,7 +132,7 @@ public class Conveyor extends Block implements Autotiler{
public float minitem = 1;
public int blendbits, blending;
public int blendsclx, blendscly;
public int blendsclx = 1, blendscly = 1;
public float clogHeat = 0f;
@@ -169,6 +169,11 @@ public class Conveyor extends Block implements Autotiler{
}
}
@Override
public void payloadDraw(){
Draw.rect(block.fullIcon,x, y);
}
@Override
public void drawCracks(){
Draw.z(Layer.block - 0.15f);

View File

@@ -184,6 +184,11 @@ public class ItemBridge extends Block{
public boolean wasMoved, moved;
public float transportCounter;
@Override
public void pickedUp(){
link = -1;
}
@Override
public void playerPlaced(Object config){
super.playerPlaced(config);

View File

@@ -126,6 +126,10 @@ public class PayloadConveyor extends Block{
public void updateTile(){
if(!enabled) return;
if(item != null){
item.update();
}
lastInterp = curInterp;
curInterp = fract();
//rollover skip
@@ -231,6 +235,11 @@ public class PayloadConveyor extends Block{
}
}
@Override
public void payloadDraw(){
Draw.rect(block.fullIcon,x, y);
}
public float time(){
return Time.time;
}

View File

@@ -97,7 +97,7 @@ public class Conduit extends LiquidBlock implements Autotiler{
public class ConduitBuild extends LiquidBuild implements ChainedBuilding{
public float smoothLiquid;
public int blendbits, xscl, yscl, blending;
public int blendbits, xscl = 1, yscl = 1, blending;
public boolean capped;
@Override

View File

@@ -78,6 +78,7 @@ public abstract class BlockProducer extends PayloadBlock{
@Override
public void updateTile(){
super.updateTile();
var recipe = recipe();
boolean produce = recipe != null && consValid() && payload == null;

View File

@@ -1,6 +1,7 @@
package mindustry.world.blocks.payloads;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.util.io.*;
import mindustry.game.*;
import mindustry.gen.*;
@@ -15,6 +16,7 @@ public class BuildPayload implements Payload{
public BuildPayload(Block block, Team team){
this.build = block.newBuilding().create(block, team);
this.build.tile = emptyTile;
}
public BuildPayload(Building build){
@@ -34,6 +36,12 @@ public class BuildPayload implements Payload{
build.dropped();
}
@Override
public void update(){
if(build.tile == null) build.tile = emptyTile;
build.update();
}
@Override
public ItemStack[] requirements(){
return build.block.requirements;
@@ -80,8 +88,10 @@ public class BuildPayload implements Payload{
@Override
public void draw(){
drawShadow(1f);
//build.draw(); //TODO broken for blocks that change layers, such as conveyors, but would be nice...
Draw.rect(build.block.fullIcon, build.x, build.y);
float prevZ = Draw.z();
Draw.zTransform(z -> 0.0011f + Mathf.clamp(z, prevZ - 0.001f, prevZ + 0.9f));
build.payloadDraw();
Draw.zTransform();
}
@Override

View File

@@ -36,6 +36,9 @@ public interface Payload extends Position{
/** @return the time taken to build this payload. */
float buildTime();
/** update this payload if it is a block */
default void update(){}
/** @return whether this payload was dumped. */
default boolean dump(){
return false;
@@ -94,6 +97,7 @@ public interface Payload extends Position{
BuildPayload payload = new BuildPayload(block, Team.derelict);
byte version = read.b();
payload.build.readAll(read, version);
payload.build.tile = emptyTile;
return (T)payload;
}else if(type == payloadUnit){
byte id = read.b();

View File

@@ -135,6 +135,13 @@ public class PayloadBlock extends Block{
if(payload != null && !carried) payload.dump();
}
@Override
public void updateTile(){
if(payload != null){
payload.update();
}
}
public boolean blends(int direction){
return PayloadBlock.blends(this, direction);
}

View File

@@ -103,6 +103,7 @@ public class PayloadDeconstructor extends PayloadBlock{
@Override
public void updateTile(){
super.updateTile();
if(items.total() > 0){
for(int i = 0; i < dumpRate; i++){
dumpAccumulate();

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.payloads;
import arc.*;
import arc.graphics.g2d.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@@ -58,6 +59,7 @@ public class PayloadLoader extends PayloadBlock{
}
public class PayloadLoaderBuild extends PayloadBlockBuild<BuildPayload>{
public boolean exporting = false;
@Override
public boolean acceptPayload(Building source, Payload payload){
@@ -68,6 +70,12 @@ public class PayloadLoader extends PayloadBlock{
build.build.block().hasLiquids && build.block().liquidCapacity >= 10f);
}
@Override
public void handlePayload(Building source, Payload payload){
super.handlePayload(source, payload);
exporting = false;
}
@Override
public boolean acceptItem(Building source, Item item){
return items.total() < itemCapacity;
@@ -103,6 +111,7 @@ public class PayloadLoader extends PayloadBlock{
@Override
public void updateTile(){
super.updateTile();
if(shouldExport()){
moveOutPayload();
}else if(moveInPayload()){
@@ -120,6 +129,9 @@ public class PayloadLoader extends PayloadBlock{
payload.build.handleItem(payload.build, item);
items.remove(item, 1);
break;
}else if(payload.block().separateItemCapacity || payload.block().consumes.consumesItem(item)){
exporting = true;
break;
}
}
}
@@ -147,11 +159,28 @@ public class PayloadLoader extends PayloadBlock{
public boolean shouldExport(){
return payload != null && (
exporting ||
(payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
(payload.block().hasItems &&
(payload.block().separateItemCapacity ?
content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity) :
payload.build.items.total() >= payload.block().itemCapacity)));
(payload.block().hasItems && payload.block().separateItemCapacity && content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity)));
}
@Override
public byte version(){
return 1;
}
@Override
public void write(Writes write){
super.write(write);
write.bool(exporting);
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
if(revision >= 1){
exporting = read.bool();
}
}
}
}

View File

@@ -143,6 +143,7 @@ public class PayloadMassDriver extends PayloadBlock{
@Override
public void updateTile(){
super.updateTile();
Building link = world.build(this.link);
boolean hasLink = linkValid();

View File

@@ -103,6 +103,7 @@ public class PayloadSource extends PayloadBlock{
@Override
public void updateTile(){
super.updateTile();
if(payload == null){
scl = 0f;
if(unit != null){

View File

@@ -36,6 +36,7 @@ public class PayloadUnloader extends PayloadLoader{
@Override
public void updateTile(){
super.updateTile();
if(shouldExport()){
//one-use, disposable block
if(payload.block().instantDeconstruct){

View File

@@ -55,6 +55,7 @@ public class PayloadVoid extends PayloadBlock{
@Override
public void updateTile(){
super.updateTile();
if(moveInPayload(false) && cons.valid()){
payload = null;
incinerateEffect.at(this);

View File

@@ -56,7 +56,7 @@ public class PowerDiode extends Block{
public void updateTile(){
super.updateTile();
if(front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return;
if(tile == null || front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return;
PowerGraph backGraph = back().power.graph;
PowerGraph frontGraph = front().power.graph;

View File

@@ -444,7 +444,7 @@ public class PowerNode extends PowerBlock{
public void draw(){
super.draw();
if(Mathf.zero(Renderer.laserOpacity)) return;
if(Mathf.zero(Renderer.laserOpacity) || tile == emptyTile) return;
Draw.z(Layer.power);
setupColor(power.graph.getSatisfaction());

View File

@@ -68,7 +68,7 @@ public class ConsumePower extends Consume{
* @return The amount of power which is requested per tick.
*/
public float requestedPower(Building entity){
if(entity.tile().build == null) return 0f;
if(entity.tile == null || entity.tile.build == null) return 0f;
if(buffered){
return (1f-entity.power.status)*capacity;
}else{

View File

@@ -16,6 +16,14 @@ public class Consumers{
public final Bits itemFilters = new Bits(Vars.content.items().size);
public final Bits liquidfilters = new Bits(Vars.content.liquids().size);
public boolean consumesItem(Item item){
return itemFilters.get(item.id);
}
public boolean consumesLiquid(Liquid liq){
return liquidfilters.get(liq.id);
}
public boolean any(){
return results != null && results.length > 0;
}