diff --git a/core/src/io/anuke/mindustry/entities/EntityGroup.java b/core/src/io/anuke/mindustry/entities/EntityGroup.java index d3010c84f3..a13102eac3 100644 --- a/core/src/io/anuke/mindustry/entities/EntityGroup.java +++ b/core/src/io/anuke/mindustry/entities/EntityGroup.java @@ -170,8 +170,10 @@ public class EntityGroup{ } public void clear(){ - for(T entity : entityArray) + for(T entity : entityArray){ + entity.removed(); entity.setGroup(null); + } for(T entity : entitiesToAdd) entity.setGroup(null); diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 500374994a..15f1e18476 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.*; import io.anuke.arc.util.serialization.*; +import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.*; @@ -11,10 +12,13 @@ import io.anuke.mindustry.world.*; @SuppressWarnings("unchecked") public class JsonIO{ - private static CustomJson json = new CustomJson(); + private static CustomJson jsonBase = new CustomJson(); + private static Json json = new Json(){{ + apply(this); + }}; public static String write(Object object){ - return json.toJson(object); + return json.toJson(object, object.getClass()); } public static T copy(T object){ @@ -26,66 +30,50 @@ public class JsonIO{ } public static T read(Class type, T base, String string){ - return json.fromBaseJson(type, base, string); + return jsonBase.fromBaseJson(type, base, string); } public static String print(String in){ return json.prettyPrint(in); } - static class CustomJson extends Json{ - private Object baseObject; + private static void apply(Json json){ + json.setIgnoreUnknownFields(true); + json.setElementType(Rules.class, "spawns", SpawnGroup.class); + json.setElementType(Rules.class, "loadout", ItemStack.class); - { - setIgnoreUnknownFields(true); - setElementType(Rules.class, "spawns", SpawnGroup.class); - setElementType(Rules.class, "loadout", ItemStack.class); - - setSerializer(Zone.class, new Serializer(){ - @Override - public void write(Json json, Zone object, Class knownType){ - json.writeValue(object.name); - } - - @Override - public Zone read(Json json, JsonValue jsonData, Class type){ - return Vars.content.getByName(ContentType.zone, jsonData.asString()); - } - }); - - setSerializer(Item.class, new Serializer(){ - @Override - public void write(Json json, Item object, Class knownType){ - json.writeValue(object.name); - } - - @Override - public Item read(Json json, JsonValue jsonData, Class type){ - if(jsonData.asString() == null) return Items.copper; - Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); - return i == null ? Items.copper : i; - } - }); - - //TODO extremely hacky and disgusting - for(Block block : Vars.content.blocks()){ - Class type = block.getClass(); - if(type.isAnonymousClass()) type = type.getSuperclass(); - - setSerializer(type, new Serializer(){ - @Override - public void write(Json json, Block object, Class knownType){ - json.writeValue(object.name); - } - - @Override - public Block read(Json json, JsonValue jsonData, Class type){ - return Vars.content.getByName(ContentType.block, jsonData.asString()); - } - }); + json.setSerializer(Zone.class, new Serializer(){ + @Override + public void write(Json json, Zone object, Class knownType){ + json.writeValue(object.name); } - setSerializer(Block.class, new Serializer(){ + @Override + public Zone read(Json json, JsonValue jsonData, Class type){ + return Vars.content.getByName(ContentType.zone, jsonData.asString()); + } + }); + + json.setSerializer(Item.class, new Serializer(){ + @Override + public void write(Json json, Item object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public Item read(Json json, JsonValue jsonData, Class type){ + if(jsonData.asString() == null) return Items.copper; + Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); + return i == null ? Items.copper : i; + } + }); + + //TODO extremely hacky and disgusting + for(Block block : Vars.content.blocks()){ + Class type = block.getClass(); + if(type.isAnonymousClass()) type = type.getSuperclass(); + + json.setSerializer(type, new Serializer(){ @Override public void write(Json json, Block object, Class knownType){ json.writeValue(object.name); @@ -96,40 +84,60 @@ public class JsonIO{ return Vars.content.getByName(ContentType.block, jsonData.asString()); } }); + } - setSerializer(TeamData.class, new Serializer(){ - @Override - public void write(Json json, TeamData object, Class knownType){ - json.writeObjectStart(); - json.writeValue("brokenBlocks", object.brokenBlocks.toArray()); - json.writeValue("team", object.team.ordinal()); - json.writeObjectEnd(); - } + json.setSerializer(Block.class, new Serializer(){ + @Override + public void write(Json json, Block object, Class knownType){ + json.writeValue(object.name); + } - @Override - public TeamData read(Json json, JsonValue jsonData, Class type){ - long[] blocks = jsonData.get("brokenBlocks").asLongArray(); - Team team = Team.all[jsonData.getInt("team", 0)]; - TeamData out = new TeamData(team, EnumSet.of(new Team[]{})); - out.brokenBlocks = new LongQueue(blocks); - return out; - } - }); + @Override + public Block read(Json json, JsonValue jsonData, Class type){ + return Vars.content.getByName(ContentType.block, jsonData.asString()); + } + }); - setSerializer(ItemStack.class, new Serializer(){ - @Override - public void write(Json json, ItemStack object, Class knownType){ - json.writeObjectStart(); - json.writeValue("item", object.item); - json.writeValue("amount", object.amount); - json.writeObjectEnd(); - } + json.setSerializer(TeamData.class, new Serializer(){ + @Override + public void write(Json json, TeamData object, Class knownType){ + json.writeObjectStart(); + json.writeValue("brokenBlocks", object.brokenBlocks.toArray()); + json.writeValue("team", object.team.ordinal()); + json.writeObjectEnd(); + } - @Override - public ItemStack read(Json json, JsonValue jsonData, Class type){ - return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); - } - }); + @Override + public TeamData read(Json json, JsonValue jsonData, Class type){ + long[] blocks = jsonData.get("brokenBlocks").asLongArray(); + Team team = Team.all[jsonData.getInt("team", 0)]; + TeamData out = new TeamData(team, EnumSet.of(new Team[]{})); + out.brokenBlocks = new LongQueue(blocks); + return out; + } + }); + + json.setSerializer(ItemStack.class, new Serializer(){ + @Override + public void write(Json json, ItemStack object, Class knownType){ + json.writeObjectStart(); + json.writeValue("item", object.item); + json.writeValue("amount", object.amount); + json.writeObjectEnd(); + } + + @Override + public ItemStack read(Json json, JsonValue jsonData, Class type){ + return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); + } + }); + } + + static class CustomJson extends Json{ + private Object baseObject; + + { + apply(this); } @Override diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 8eeeba9e1c..ffa388b44d 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -14,7 +14,7 @@ import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.io.SaveIO; +import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.MapException; import io.anuke.mindustry.net.Administration.PlayerInfo;