From e2576f1538f5025a98c547cb4dbd05b0e6e0a48b Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 29 Nov 2021 10:02:03 -0500 Subject: [PATCH] Persistent unit IDs --- core/src/mindustry/content/Blocks.java | 4 +- .../src/mindustry/content/ErekirTechTree.java | 12 +----- core/src/mindustry/entities/EntityGroup.java | 5 +++ core/src/mindustry/game/SpawnGroup.java | 2 +- core/src/mindustry/io/SaveIO.java | 3 +- core/src/mindustry/io/SaveVersion.java | 6 +++ .../io/{legacy => versions}/LegacyIO.java | 2 +- .../LegacySaveVersion.java | 2 +- .../io/versions/LegacySaveVersion2.java | 37 +++++++++++++++++++ .../io/{legacy => versions}/Save1.java | 2 +- .../io/{legacy => versions}/Save2.java | 2 +- .../io/{legacy => versions}/Save3.java | 2 +- core/src/mindustry/io/versions/Save4.java | 12 +----- core/src/mindustry/io/versions/Save5.java | 5 +-- core/src/mindustry/io/versions/Save6.java | 10 +++++ core/src/mindustry/ui/dialogs/JoinDialog.java | 2 +- 16 files changed, 74 insertions(+), 34 deletions(-) rename core/src/mindustry/io/{legacy => versions}/LegacyIO.java (98%) rename core/src/mindustry/io/{legacy => versions}/LegacySaveVersion.java (99%) create mode 100644 core/src/mindustry/io/versions/LegacySaveVersion2.java rename core/src/mindustry/io/{legacy => versions}/Save1.java (88%) rename core/src/mindustry/io/{legacy => versions}/Save2.java (88%) rename core/src/mindustry/io/{legacy => versions}/Save3.java (96%) create mode 100644 core/src/mindustry/io/versions/Save6.java diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index c40c2da806..5da3da8026 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1083,7 +1083,7 @@ public class Blocks{ }}; slagCentrifuge = new GenericCrafter("slag-centrifuge"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 60, Items.oxide, 40)); + requirements(Category.crafting, with(Items.carbide, 70, Items.graphite, 60, Items.silicon, 40, Items.oxide, 40)); consumes.power(2f / 60f); @@ -2077,7 +2077,7 @@ public class Blocks{ //TODO awful name largePlasmaBore = new BeamDrill("large-plasma-bore"){{ //TODO requirements - requirements(Category.production, with(Items.graphite, 30, Items.beryllium, 20, Items.carbide, 30)); + requirements(Category.production, with(Items.graphite, 30, Items.oxide, 30, Items.beryllium, 20, Items.carbide, 30)); consumes.power(0.6f); drillTime = 170f; tier = 5; diff --git a/core/src/mindustry/content/ErekirTechTree.java b/core/src/mindustry/content/ErekirTechTree.java index ae1d707669..4f6dfe98c6 100644 --- a/core/src/mindustry/content/ErekirTechTree.java +++ b/core/src/mindustry/content/ErekirTechTree.java @@ -59,7 +59,6 @@ public class ErekirTechTree{ }); }); - //TODO where in the tech tree is the arc furnace placed? is it essential? node(siliconArcFurnace, () -> { node(electrolyzer, () -> { node(oxidationChamber, () -> { @@ -81,7 +80,6 @@ public class ErekirTechTree{ node(slagIncinerator, () -> { //when is this actually needed? node(slagHeater, () -> { - //TODO node(slagCentrifuge, () -> { }); @@ -97,12 +95,10 @@ public class ErekirTechTree{ //TODO move into turbine condenser? node(plasmaBore, () -> { node(cliffCrusher, () -> { - //TODO req node(largePlasmaBore, () -> { }); - //TODO req node(impactDrill, () -> { }); @@ -154,7 +150,6 @@ public class ErekirTechTree{ nodeProduce(Liquids.ozone, () -> { nodeProduce(Liquids.hydrogen, () -> { - //TODO how will nitrogen be gated behind the electrolyzer? nodeProduce(Liquids.nitrogen, () -> { nodeProduce(Liquids.cyanogen, () -> { @@ -165,12 +160,9 @@ public class ErekirTechTree{ nodeProduce(Items.tungsten, () -> { nodeProduce(Items.carbide, () -> { + nodeProduce(Liquids.gallium, () -> { - }); - - //TODO does it require carbide? - nodeProduce(Liquids.gallium, () -> { - + }); }); }); }); diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index 39ff8ee901..d3cf9bd32b 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -30,6 +30,11 @@ public class EntityGroup implements Iterable{ return lastId++; } + /** Makes sure the next ID counter is higher than this number, so future entities cannot possibly use this ID. */ + public static void checkNextId(int id){ + lastId = id + 1; + } + public EntityGroup(Class type, boolean spatial, boolean mapping){ array = new Seq<>(false, 32, type); diff --git a/core/src/mindustry/game/SpawnGroup.java b/core/src/mindustry/game/SpawnGroup.java index 79bf5164eb..1d70384a47 100644 --- a/core/src/mindustry/game/SpawnGroup.java +++ b/core/src/mindustry/game/SpawnGroup.java @@ -7,7 +7,7 @@ import arc.util.serialization.Json.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.gen.*; -import mindustry.io.legacy.*; +import mindustry.io.versions.*; import mindustry.type.*; import java.util.*; diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index d71fddbe7f..86990da28c 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -7,7 +7,6 @@ import arc.util.*; import arc.util.io.*; import mindustry.*; import mindustry.game.EventType.*; -import mindustry.io.legacy.*; import mindustry.io.versions.*; import mindustry.world.*; @@ -21,7 +20,7 @@ public class SaveIO{ /** Save format header. */ public static final byte[] header = {'M', 'S', 'A', 'V'}; public static final IntMap versions = new IntMap<>(); - public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4(), new Save5()); + public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4(), new Save5(), new Save6()); static{ for(SaveVersion version : versionArray){ diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index ec3b09d0c5..364c853b55 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -10,6 +10,7 @@ import mindustry.content.*; import mindustry.content.TechTree.*; import mindustry.core.*; import mindustry.ctype.*; +import mindustry.entities.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; @@ -316,6 +317,7 @@ public abstract class SaveVersion extends SaveFileReader{ writeChunk(stream, true, out -> { out.writeByte(entity.classId()); + out.writeInt(entity.id()); entity.write(Writes.get(out)); }); } @@ -371,7 +373,11 @@ public abstract class SaveVersion extends SaveFileReader{ return; } + int id = in.readInt(); + Entityc entity = (Entityc)mapping[typeid].get(); + EntityGroup.checkNextId(id); + entity.id(id); entity.read(Reads.get(in)); entity.add(); }); diff --git a/core/src/mindustry/io/legacy/LegacyIO.java b/core/src/mindustry/io/versions/LegacyIO.java similarity index 98% rename from core/src/mindustry/io/legacy/LegacyIO.java rename to core/src/mindustry/io/versions/LegacyIO.java index 9ca0533855..f4a865ccb5 100644 --- a/core/src/mindustry/io/legacy/LegacyIO.java +++ b/core/src/mindustry/io/versions/LegacyIO.java @@ -1,4 +1,4 @@ -package mindustry.io.legacy; +package mindustry.io.versions; import arc.*; import arc.struct.*; diff --git a/core/src/mindustry/io/legacy/LegacySaveVersion.java b/core/src/mindustry/io/versions/LegacySaveVersion.java similarity index 99% rename from core/src/mindustry/io/legacy/LegacySaveVersion.java rename to core/src/mindustry/io/versions/LegacySaveVersion.java index bb7d7eff11..6ac135f6e2 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/versions/LegacySaveVersion.java @@ -1,4 +1,4 @@ -package mindustry.io.legacy; +package mindustry.io.versions; import arc.util.*; import arc.util.io.*; diff --git a/core/src/mindustry/io/versions/LegacySaveVersion2.java b/core/src/mindustry/io/versions/LegacySaveVersion2.java new file mode 100644 index 0000000000..e5658d4096 --- /dev/null +++ b/core/src/mindustry/io/versions/LegacySaveVersion2.java @@ -0,0 +1,37 @@ +package mindustry.io.versions; + +import arc.func.*; +import arc.util.io.*; +import mindustry.gen.*; +import mindustry.io.*; + +import java.io.*; + +/** This version did not read/write entity IDs to the save. */ +public class LegacySaveVersion2 extends SaveVersion{ + + public LegacySaveVersion2(int version){ + super(version); + } + + @Override + public void readWorldEntities(DataInput stream) throws IOException{ + //entityMapping is null in older save versions, so use the default + Prov[] mapping = this.entityMapping == null ? EntityMapping.idMap : this.entityMapping; + + int amount = stream.readInt(); + for(int j = 0; j < amount; j++){ + readChunk(stream, true, in -> { + int typeid = in.readUnsignedByte(); + if(mapping[typeid] == null){ + in.skipBytes(lastRegionLength - 1); + return; + } + + Entityc entity = (Entityc)mapping[typeid].get(); + entity.read(Reads.get(in)); + entity.add(); + }); + } + } +} diff --git a/core/src/mindustry/io/legacy/Save1.java b/core/src/mindustry/io/versions/Save1.java similarity index 88% rename from core/src/mindustry/io/legacy/Save1.java rename to core/src/mindustry/io/versions/Save1.java index b0a20888fc..95a7ab558e 100644 --- a/core/src/mindustry/io/legacy/Save1.java +++ b/core/src/mindustry/io/versions/Save1.java @@ -1,4 +1,4 @@ -package mindustry.io.legacy; +package mindustry.io.versions; import java.io.*; diff --git a/core/src/mindustry/io/legacy/Save2.java b/core/src/mindustry/io/versions/Save2.java similarity index 88% rename from core/src/mindustry/io/legacy/Save2.java rename to core/src/mindustry/io/versions/Save2.java index 9a05d6e34d..95b7748ce8 100644 --- a/core/src/mindustry/io/legacy/Save2.java +++ b/core/src/mindustry/io/versions/Save2.java @@ -1,4 +1,4 @@ -package mindustry.io.legacy; +package mindustry.io.versions; import java.io.*; diff --git a/core/src/mindustry/io/legacy/Save3.java b/core/src/mindustry/io/versions/Save3.java similarity index 96% rename from core/src/mindustry/io/legacy/Save3.java rename to core/src/mindustry/io/versions/Save3.java index 7306b2bf29..387d4130e2 100644 --- a/core/src/mindustry/io/legacy/Save3.java +++ b/core/src/mindustry/io/versions/Save3.java @@ -1,4 +1,4 @@ -package mindustry.io.legacy; +package mindustry.io.versions; import mindustry.game.*; import mindustry.game.Teams.*; diff --git a/core/src/mindustry/io/versions/Save4.java b/core/src/mindustry/io/versions/Save4.java index c75268592c..dac92ee29d 100644 --- a/core/src/mindustry/io/versions/Save4.java +++ b/core/src/mindustry/io/versions/Save4.java @@ -1,22 +1,14 @@ package mindustry.io.versions; -import mindustry.io.*; - import java.io.*; -/** This version only writes entities, no entity ID mappings. */ -public class Save4 extends SaveVersion{ +/** This version only reads entities, no entity ID mappings. */ +public class Save4 extends LegacySaveVersion2{ public Save4(){ super(4); } - @Override - public void writeEntities(DataOutput stream) throws IOException{ - writeTeamBlocks(stream); - writeWorldEntities(stream); - } - @Override public void readEntities(DataInput stream) throws IOException{ readTeamBlocks(stream); diff --git a/core/src/mindustry/io/versions/Save5.java b/core/src/mindustry/io/versions/Save5.java index 98cdbad1dd..9c4416079e 100644 --- a/core/src/mindustry/io/versions/Save5.java +++ b/core/src/mindustry/io/versions/Save5.java @@ -1,8 +1,7 @@ package mindustry.io.versions; -import mindustry.io.*; - -public class Save5 extends SaveVersion{ +/** Uses the legacy readWorldEntities function without entity IDs. */ +public class Save5 extends LegacySaveVersion2{ public Save5(){ super(5); diff --git a/core/src/mindustry/io/versions/Save6.java b/core/src/mindustry/io/versions/Save6.java new file mode 100644 index 0000000000..7e0a5aff77 --- /dev/null +++ b/core/src/mindustry/io/versions/Save6.java @@ -0,0 +1,10 @@ +package mindustry.io.versions; + +import mindustry.io.*; + +public class Save6 extends SaveVersion{ + + public Save6(){ + super(6); + } +} diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 377200c711..1bccdd6890 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -16,7 +16,7 @@ import mindustry.core.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.io.legacy.*; +import mindustry.io.versions.*; import mindustry.net.*; import mindustry.net.Packets.*; import mindustry.ui.*;