From f31759bb965230fc15c8eb9fa5b5187ff0c08413 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 18 Oct 2021 11:37:26 -0400 Subject: [PATCH] Update/draw payload buildings (broken) --- core/src/mindustry/Vars.java | 7 +++ .../mindustry/entities/comp/BuildingComp.java | 6 ++- .../mindustry/entities/comp/PayloadComp.java | 1 + core/src/mindustry/game/Saves.java | 5 ++ .../world/blocks/distribution/Conveyor.java | 7 ++- .../world/blocks/distribution/ItemBridge.java | 5 ++ .../blocks/distribution/PayloadConveyor.java | 9 ++++ .../world/blocks/liquid/Conduit.java | 2 +- .../world/blocks/payloads/BlockProducer.java | 1 + .../world/blocks/payloads/BuildPayload.java | 14 ++++- .../world/blocks/payloads/Payload.java | 4 ++ .../world/blocks/payloads/PayloadBlock.java | 7 +++ .../blocks/payloads/PayloadDeconstructor.java | 1 + .../world/blocks/payloads/PayloadLoader.java | 37 +++++++++++-- .../blocks/payloads/PayloadMassDriver.java | 1 + .../world/blocks/payloads/PayloadSource.java | 1 + .../blocks/payloads/PayloadUnloader.java | 1 + .../world/blocks/payloads/PayloadVoid.java | 1 + .../world/blocks/power/PowerDiode.java | 2 +- .../world/blocks/power/PowerNode.java | 2 +- .../world/consumers/ConsumePower.java | 2 +- .../mindustry/world/consumers/Consumers.java | 8 +++ gradle.properties | 2 +- tests/src/test/java/ApplicationTests.java | 53 +++++++++++++++++++ 24 files changed, 166 insertions(+), 13 deletions(-) diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 3034d4e228..48458937a4 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -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(); } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index db1995e282..d5956282d3 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -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); diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index 3cc63c835d..fc22eff425 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -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)); diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 298d9a48ed..870d5a9634 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -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); } diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index a1dab8d249..d91df61d7a 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -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); diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 746ee0cfc7..9be6bb6428 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -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); diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index 8e27cee908..119d00d671 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java @@ -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; } diff --git a/core/src/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java index 11ba66255b..8e6249e828 100644 --- a/core/src/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -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 diff --git a/core/src/mindustry/world/blocks/payloads/BlockProducer.java b/core/src/mindustry/world/blocks/payloads/BlockProducer.java index a3186a0dc3..43da658451 100644 --- a/core/src/mindustry/world/blocks/payloads/BlockProducer.java +++ b/core/src/mindustry/world/blocks/payloads/BlockProducer.java @@ -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; diff --git a/core/src/mindustry/world/blocks/payloads/BuildPayload.java b/core/src/mindustry/world/blocks/payloads/BuildPayload.java index 07a501e579..21753a7d35 100644 --- a/core/src/mindustry/world/blocks/payloads/BuildPayload.java +++ b/core/src/mindustry/world/blocks/payloads/BuildPayload.java @@ -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 diff --git a/core/src/mindustry/world/blocks/payloads/Payload.java b/core/src/mindustry/world/blocks/payloads/Payload.java index 4be19f66bf..194a91a5a3 100644 --- a/core/src/mindustry/world/blocks/payloads/Payload.java +++ b/core/src/mindustry/world/blocks/payloads/Payload.java @@ -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(); diff --git a/core/src/mindustry/world/blocks/payloads/PayloadBlock.java b/core/src/mindustry/world/blocks/payloads/PayloadBlock.java index 86247f85aa..8fee45f2e6 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadBlock.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadBlock.java @@ -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); } diff --git a/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java b/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java index 445768759d..096461181b 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java @@ -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(); diff --git a/core/src/mindustry/world/blocks/payloads/PayloadLoader.java b/core/src/mindustry/world/blocks/payloads/PayloadLoader.java index 45ef4111ca..67b826d55a 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadLoader.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadLoader.java @@ -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{ + 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(); + } } } } diff --git a/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java b/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java index 1d6386bc18..922a93899b 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java @@ -143,6 +143,7 @@ public class PayloadMassDriver extends PayloadBlock{ @Override public void updateTile(){ + super.updateTile(); Building link = world.build(this.link); boolean hasLink = linkValid(); diff --git a/core/src/mindustry/world/blocks/payloads/PayloadSource.java b/core/src/mindustry/world/blocks/payloads/PayloadSource.java index 62600833b9..d1f37a436b 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadSource.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadSource.java @@ -103,6 +103,7 @@ public class PayloadSource extends PayloadBlock{ @Override public void updateTile(){ + super.updateTile(); if(payload == null){ scl = 0f; if(unit != null){ diff --git a/core/src/mindustry/world/blocks/payloads/PayloadUnloader.java b/core/src/mindustry/world/blocks/payloads/PayloadUnloader.java index 7d63380528..2746516abe 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadUnloader.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadUnloader.java @@ -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){ diff --git a/core/src/mindustry/world/blocks/payloads/PayloadVoid.java b/core/src/mindustry/world/blocks/payloads/PayloadVoid.java index 9ef2cb5800..cc429794fe 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadVoid.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadVoid.java @@ -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); diff --git a/core/src/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java index f31cf71cf6..20db770b82 100644 --- a/core/src/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -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; diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index 8ee013f6fe..cd88084f34 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -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()); diff --git a/core/src/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java index 991ad968e7..82addb8a3a 100644 --- a/core/src/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -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{ diff --git a/core/src/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java index 0b64e3d78f..9fdba8d2ec 100644 --- a/core/src/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -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; } diff --git a/gradle.properties b/gradle.properties index a54ba48d55..a1f9dbf296 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=6c228e534e3950e6254d6e7af4c6db67f834bc1d +archash=1046c67dc2f7e46539609e29e389e36e67acfead diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 01dce8947e..b200b468a4 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -24,6 +24,7 @@ import mindustry.net.*; import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.storage.*; import org.junit.jupiter.api.*; import org.junit.jupiter.params.*; @@ -791,6 +792,58 @@ public class ApplicationTests{ } } + void checkPayloads(){ + for(int x = 0; x < world.tiles.width; x++){ + for(int y = 0; y < world.tiles.height; y++){ + Tile tile = world.rawTile(x, y); + if(tile.build != null && tile.isCenter() && !(tile.block() instanceof CoreBlock)){ + try{ + tile.build.update(); + }catch(Throwable t){ + fail("Failed to update block in payload: '" + ((BuildPayload)tile.build.getPayload()).block() + "'", t); + } + assertEquals(tile.block(), tile.build.block); + assertEquals(tile.block().health, tile.build.health()); + } + } + } + } + + @Test + void allPayloadBlockTest(){ + int ts = 20; + Tiles tiles = world.resize(ts * 3, ts * 3); + + world.beginMapLoad(); + for(int x = 0; x < tiles.width; x++){ + for(int y = 0; y < tiles.height; y++){ + tiles.set(x, y, new Tile(x, y, Blocks.stone, Blocks.air, Blocks.air)); + } + } + + tiles.getn(tiles.width - 2, tiles.height - 2).setBlock(Blocks.coreShard, Team.sharded); + + Seq blocks = content.blocks().select(b -> b.canBeBuilt()); + for(int i = 0; i < blocks.size; i++){ + int x = (i % ts) * 3 + 1; + int y = (i / ts) * 3 + 1; + Tile tile = tiles.get(x, y); + tile.setBlock(Blocks.payloadConveyor, Team.sharded); + Building build = tile.build; + build.handlePayload(build, new BuildPayload(blocks.get(i), Team.sharded)); + } + world.endMapLoad(); + + checkPayloads(); + + SaveIO.write(Core.files.external("out.msav")); + SaveIO.write(saveDirectory.child("payloads.msav")); + logic.reset(); + SaveIO.load(saveDirectory.child("payloads.msav")); + + checkPayloads(); + } + @TestFactory DynamicTest[] testSectorValidity(){ Seq out = new Seq<>();