From 62ad78ace904d93353a8f1f16535903e916ff283 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 30 Sep 2019 20:48:02 -0400 Subject: [PATCH] Saving of broken blocks --- core/src/io/anuke/mindustry/io/SaveIO.java | 5 ++-- .../io/anuke/mindustry/io/SaveVersion.java | 28 ++++++++++++++++++- .../io/anuke/mindustry/io/versions/Save1.java | 12 ++++---- .../io/anuke/mindustry/io/versions/Save2.java | 28 ++++++++++++++++++- .../io/anuke/mindustry/io/versions/Save3.java | 9 ++++++ .../world/blocks/distribution/ItemBridge.java | 1 - 6 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 core/src/io/anuke/mindustry/io/versions/Save3.java diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index cb79c0222d..8a6035363a 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -5,8 +5,7 @@ import io.anuke.arc.files.FileHandle; import io.anuke.arc.util.io.CounterInputStream; import io.anuke.arc.util.io.FastDeflaterOutputStream; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.io.versions.Save1; -import io.anuke.mindustry.io.versions.Save2; +import io.anuke.mindustry.io.versions.*; import io.anuke.mindustry.world.WorldContext; import java.io.*; @@ -19,7 +18,7 @@ public class SaveIO{ /** Format header. This is the string 'MSAV' in ASCII. */ public static final byte[] header = {77, 83, 65, 86}; public static final IntMap versions = new IntMap<>(); - public static final Array versionArray = Array.with(new Save1(), new Save2()); + public static final Array versionArray = Array.with(new Save1(), new Save2(), new Save3()); static{ for(SaveVersion version : versionArray){ diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 2b12bf96f2..6b5f49db26 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -6,6 +6,7 @@ import io.anuke.arc.util.io.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -15,7 +16,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public abstract class SaveVersion extends SaveFileReader{ - public final int version; + public int version; //HACK stores the last read build of the save file, valid after read meta call protected int lastReadBuild; @@ -207,6 +208,21 @@ public abstract class SaveVersion extends SaveFileReader{ } public void writeEntities(DataOutput stream) throws IOException{ + //write team data with entities. + Array data = state.teams.getActive(); + stream.writeInt(data.size); + for(TeamData team : data){ + stream.writeInt(team.team.ordinal()); + stream.writeInt(team.brokenBlocks.size); + for(BrokenBlock block : team.brokenBlocks){ + stream.writeShort(block.x); + stream.writeShort(block.y); + stream.writeShort(block.rotation); + stream.writeShort(block.block); + stream.writeInt(block.config); + } + } + //write entity chunk int groups = 0; @@ -235,6 +251,16 @@ public abstract class SaveVersion extends SaveFileReader{ } public void readEntities(DataInput stream) throws IOException{ + int teamc = stream.readInt(); + for(int i = 0; i < teamc; i++){ + Team team = Team.all[stream.readInt()]; + TeamData data = state.teams.get(team); + int blocks = stream.readInt(); + for(int j = 0; j < blocks; j++){ + data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), stream.readShort(), stream.readInt())); + } + } + byte groups = stream.readByte(); for(int i = 0; i < groups; i++){ diff --git a/core/src/io/anuke/mindustry/io/versions/Save1.java b/core/src/io/anuke/mindustry/io/versions/Save1.java index 545ae99eb2..554bf7c94a 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save1.java +++ b/core/src/io/anuke/mindustry/io/versions/Save1.java @@ -1,16 +1,14 @@ package io.anuke.mindustry.io.versions; -import io.anuke.arc.function.Supplier; -import io.anuke.mindustry.entities.traits.SaveTrait; -import io.anuke.mindustry.io.SaveVersion; +import io.anuke.arc.function.*; +import io.anuke.mindustry.entities.traits.*; -import java.io.DataInput; -import java.io.IOException; +import java.io.*; -public class Save1 extends SaveVersion{ +public class Save1 extends Save2{ public Save1(){ - super(1); + version = 1; } @Override diff --git a/core/src/io/anuke/mindustry/io/versions/Save2.java b/core/src/io/anuke/mindustry/io/versions/Save2.java index 66d61964c5..4fb9954b0c 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save2.java +++ b/core/src/io/anuke/mindustry/io/versions/Save2.java @@ -1,9 +1,35 @@ package io.anuke.mindustry.io.versions; -import io.anuke.mindustry.io.SaveVersion; +import io.anuke.mindustry.entities.traits.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.io.*; +import io.anuke.mindustry.type.*; + +import java.io.*; + +import static io.anuke.mindustry.Vars.content; public class Save2 extends SaveVersion{ + public Save2(){ super(2); } + + @Override + public void readEntities(DataInput stream) throws IOException{ + byte groups = stream.readByte(); + + for(int i = 0; i < groups; i++){ + int amount = stream.readInt(); + for(int j = 0; j < amount; j++){ + //TODO throw exception on read fail + readChunk(stream, true, in -> { + byte typeid = in.readByte(); + byte version = in.readByte(); + SaveTrait trait = (SaveTrait)content.getByID(ContentType.typeid, typeid).constructor.get(); + trait.readSave(in, version); + }); + } + } + } } diff --git a/core/src/io/anuke/mindustry/io/versions/Save3.java b/core/src/io/anuke/mindustry/io/versions/Save3.java new file mode 100644 index 0000000000..c418a1bf46 --- /dev/null +++ b/core/src/io/anuke/mindustry/io/versions/Save3.java @@ -0,0 +1,9 @@ +package io.anuke.mindustry.io.versions; + +import io.anuke.mindustry.io.*; + +public class Save3 extends SaveVersion{ + public Save3(){ + super(3); + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index baa528452c..46acbc1420 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -168,7 +168,6 @@ public class ItemBridge extends Block{ Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ - entity.link = Pos.invalid; tryDump(tile); entity.uptime = 0f; }else{