diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index aa5fe5ba44..3a3fe0d2a3 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -167,10 +167,6 @@ public class ContentLoader{ } public void handleContent(Content content){ - if(content instanceof Item && content.id > 255){ - throw new IllegalArgumentException("You may not have more than 255 different items total. Remove some mods."); - } - this.lastAdded = content; contentMap[content.getContentType().ordinal()].add(content); } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index f77183dba4..e498ab4701 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -135,8 +135,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public final void writeBase(Writes write){ write.f(health); - write.b(rotation); + write.b(rotation | 0b10000000); write.b(team.id); + write.b(0); //extra padding for later use if(items != null) items.write(write); if(power != null) power.write(write); if(liquids != null) liquids.write(write); @@ -145,12 +146,20 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public final void readBase(Reads read){ health = read.f(); - rotation = read.b(); + byte rot = read.b(); team = Team.get(read.b()); - if(items != null) items.read(read); - if(power != null) power.read(read); - if(liquids != null) liquids.read(read); - if(cons != null) cons.read(read); + + rotation = rot & 0b01111111; + boolean legacy = true; + if((rot & 0b10000000) != 0){ + read.b(); //padding + legacy = false; + } + + if(items != null) items.read(read, legacy); + if(power != null) power.read(read, legacy); + if(liquids != null) liquids.read(read, legacy); + if(cons != null) cons.read(read, legacy); } public void writeAll(Writes write){ diff --git a/core/src/mindustry/io/legacy/LegacySaveVersion.java b/core/src/mindustry/io/legacy/LegacySaveVersion.java index 7e78855f7e..74e4a12286 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/legacy/LegacySaveVersion.java @@ -74,10 +74,10 @@ public abstract class LegacySaveVersion extends SaveVersion{ tile.setTeam(Team.get(team)); tile.build.rotation = rotation; - if(tile.build.items != null) tile.build.items.read(Reads.get(stream)); - if(tile.build.power != null) tile.build.power.read(Reads.get(stream)); - if(tile.build.liquids != null) tile.build.liquids.read(Reads.get(stream)); - if(tile.build.cons != null) tile.build.cons.read(Reads.get(stream)); + if(tile.build.items != null) tile.build.items.read(Reads.get(stream), true); + if(tile.build.power != null) tile.build.power.read(Reads.get(stream), true); + if(tile.build.liquids != null) tile.build.liquids.read(Reads.get(stream), true); + if(tile.build.cons != null) tile.build.cons.read(Reads.get(stream), true); //read only from subclasses! tile.build.read(Reads.get(in), version); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 5fa0e70947..8a902510bc 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -138,13 +138,18 @@ public class ItemTurret extends Turret{ return ammoTypes.get(item) != null && totalAmmo + ammoTypes.get(item).ammoMultiplier <= maxAmmo; } + @Override + public byte version(){ + return 2; + } + @Override public void write(Writes write){ super.write(write); write.b(ammo.size); for(AmmoEntry entry : ammo){ ItemEntry i = (ItemEntry)entry; - write.b(i.item.id); + write.s(i.item.id); write.s(i.amount); } } @@ -154,7 +159,7 @@ public class ItemTurret extends Turret{ super.read(read, revision); int amount = read.ub(); for(int i = 0; i < amount; i++){ - Item item = Vars.content.item(read.ub()); + Item item = Vars.content.item(revision < 2 ? read.ub() : read.s()); short a = read.s(); totalAmmo += a; ammo.add(new ItemEntry(item, a)); diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 99de204e4e..af49518ac3 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -436,7 +436,7 @@ public abstract class Turret extends Block{ public void read(Reads read, byte revision){ super.read(read, revision); - if(revision == 1){ + if(revision >= 1){ reload = read.f(); rotation = read.f(); } diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java index 10f7ff2710..ce5d657527 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java @@ -87,16 +87,21 @@ public class LiquidSource extends Block{ return source; } + @Override + public byte version(){ + return 1; + } + @Override public void write(Writes write){ super.write(write); - write.b(source == null ? -1 : source.id); + write.s(source == null ? -1 : source.id); } @Override public void read(Reads read, byte revision){ super.read(read, revision); - byte id = read.b(); + int id = revision == 1 ? read.s() : read.b(); source = id == -1 ? null : content.liquid(id); } } diff --git a/core/src/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java index cb1c40b860..1ca83e08d4 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -107,16 +107,21 @@ public class Unloader extends Block{ return sortItem; } + @Override + public byte version(){ + return 1; + } + @Override public void write(Writes write){ super.write(write); - write.b(sortItem == null ? -1 : sortItem.id); + write.s(sortItem == null ? -1 : sortItem.id); } @Override public void read(Reads read, byte revision){ super.read(read, revision); - byte id = read.b(); + int id = revision == 1 ? read.s() : read.b(); sortItem = id == -1 ? null : content.items().get(id); } } diff --git a/core/src/mindustry/world/modules/BlockModule.java b/core/src/mindustry/world/modules/BlockModule.java index 974f43656f..fc61966a46 100644 --- a/core/src/mindustry/world/modules/BlockModule.java +++ b/core/src/mindustry/world/modules/BlockModule.java @@ -5,5 +5,12 @@ import arc.util.io.*; /** A class that represents compartmentalized tile entity state. */ public abstract class BlockModule{ public abstract void write(Writes write); - public abstract void read(Reads read); + + public void read(Reads read, boolean legacy){ + read(read); + } + + public void read(Reads read){ + read(read, false); + } } diff --git a/core/src/mindustry/world/modules/ItemModule.java b/core/src/mindustry/world/modules/ItemModule.java index 23a2b88745..52fdd63dfd 100644 --- a/core/src/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -276,30 +276,30 @@ public class ItemModule extends BlockModule{ @Override public void write(Writes write){ - byte amount = 0; + int amount = 0; for(int item : items){ if(item > 0) amount++; } - write.b(amount); //amount of items + write.s(amount); //amount of items for(int i = 0; i < items.length; i++){ if(items[i] > 0){ - write.b(i); //item ID + write.s(i); //item ID write.i(items[i]); //item amount } } } @Override - public void read(Reads read){ + public void read(Reads read, boolean legacy){ //just in case, reset items Arrays.fill(items, 0); - int count = read.ub(); + int count = legacy ? read.ub() : read.s(); total = 0; for(int j = 0; j < count; j++){ - int itemid = read.ub(); + int itemid = legacy ? read.ub() : read.s(); int itemamount = read.i(); items[content.item(itemid).id] = itemamount; total += itemamount; diff --git a/core/src/mindustry/world/modules/LiquidModule.java b/core/src/mindustry/world/modules/LiquidModule.java index b2fbb3407a..292df3198a 100644 --- a/core/src/mindustry/world/modules/LiquidModule.java +++ b/core/src/mindustry/world/modules/LiquidModule.java @@ -114,29 +114,29 @@ public class LiquidModule extends BlockModule{ @Override public void write(Writes write){ - byte amount = 0; + int amount = 0; for(float liquid : liquids){ if(liquid > 0) amount++; } - write.b(amount); //amount of liquids + write.s(amount); //amount of liquids for(int i = 0; i < liquids.length; i++){ if(liquids[i] > 0){ - write.b(i); //liquid ID - write.f(liquids[i]); //item amount + write.s(i); //liquid ID + write.f(liquids[i]); //liquid amount } } } @Override - public void read(Reads read){ + public void read(Reads read, boolean legacy){ Arrays.fill(liquids, 0); total = 0f; - int count = read.ub(); + int count = legacy ? read.ub() : read.s(); for(int j = 0; j < count; j++){ - int liquidid = read.ub(); + int liquidid = legacy ? read.ub() : read.s(); float amount = read.f(); liquids[liquidid] = amount; if(amount > 0){