1
0
mirror of https://github.com/Anuken/Mindustry.git synced 2024-10-06 12:57:17 +03:00

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

View File

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

View File

@ -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<Block> 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<DynamicTest> out = new Seq<>();