diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index f7b524cd95..72a76670b2 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -416,8 +416,12 @@ public abstract class SaveVersion extends SaveFileReader{ } public void writeWorldEntities(DataOutput stream) throws IOException{ + writeWorldEntities(stream, null); + } + + public void writeWorldEntities(DataOutput stream, @Nullable Boolf unitFilter) throws IOException{ //units are not included in Groups.all - stream.writeInt(Groups.all.count(Entityc::serialize) + Groups.unit.size()); + stream.writeInt(Groups.all.count(Entityc::serialize) + (unitFilter == null ? Groups.unit.size() : Groups.unit.count(unitFilter))); for(Entityc entity : Groups.all){ if(!entity.serialize()) continue; @@ -425,7 +429,9 @@ public abstract class SaveVersion extends SaveFileReader{ writeEntity(entity, stream); } - for(Entityc entity : Groups.unit){ + for(Unit entity : Groups.unit){ + if(unitFilter != null && !unitFilter.get(entity)) continue; + writeEntity(entity, stream); } } diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 60bdca1031..4ddaaa362a 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -475,7 +475,7 @@ public class TypeIO{ entity = (Unit)EntityMapping.map(typeID & 0xFF).get(); entity.id(id); - if(!netClient.isEntityUsed(entity.id())){ + if(!netClient.isEntityUsed(id)){ add = true; } created = true; diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 0499da8514..e12affda81 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -62,8 +62,11 @@ public class NetworkIO{ writer.writeContentHeader(stream); writer.writeMap(stream); - writer.writeEntities(stream); + //these three calls mimic what writeEntities has, except with a custom filter, which is a bit fragile + writer.writeEntityMapping(stream); writer.writeTeamBlocks(stream); + writer.writeWorldEntities(stream, state.rules.fog ? u -> !u.inFogTo(player.team()) : null); + writer.writeMarkers(stream); writer.writeCustomChunks(stream, true); }catch(IOException e){ @@ -102,9 +105,11 @@ public class NetworkIO{ writer.readContentHeader(stream); writer.readMap(stream, state); writer.readEntities(stream, state); - writer.readTeamBlocks(stream); writer.readMarkers(stream); writer.readCustomChunks(stream); + + Groups.all.each(e -> netClient.addRemovedEntity(e.id())); + Groups.unit.each(e -> netClient.addRemovedEntity(e.id())); }catch(IOException e){ throw new RuntimeException(e); }finally{