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:
parent
c6f6b8e46e
commit
f31759bb96
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -143,6 +143,7 @@ public class PayloadMassDriver extends PayloadBlock{
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
super.updateTile();
|
||||
Building link = world.build(this.link);
|
||||
boolean hasLink = linkValid();
|
||||
|
||||
|
@ -103,6 +103,7 @@ public class PayloadSource extends PayloadBlock{
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
super.updateTile();
|
||||
if(payload == null){
|
||||
scl = 0f;
|
||||
if(unit != null){
|
||||
|
@ -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){
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
@ -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{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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<>();
|
||||
|
Loading…
Reference in New Issue
Block a user