public static ReplicationData ReadReplicationData(this ByteReader reader) { var data = new ReplicationData(); uint primaryIdArray = reader.ReadByte(); data.UnitNetID = reader.ReadUInt32(); for (var primaryId = 0; primaryId < 8; primaryId++) { if ((primaryIdArray & (1 << primaryId)) == 0) { continue; } uint secondaryIdArray = reader.ReadUInt32(); var array = new Dictionary <int, uint>(); data.Values.Add(primaryId, array); for (var secondaryId = 0; secondaryId < 32; secondaryId++) { if ((secondaryIdArray & (1 << secondaryId)) == 0) { continue; } var value = reader.ReadUInt32(); array.Add(secondaryId, value); } } return(data); }
public static void WriteReplicationData(this ByteWriter writer, ReplicationData data) { if (data == null) { data = new ReplicationData(); } byte primaryIdArray = 0; foreach (var kvp in data.Values) { if (kvp.Key > 7 || kvp.Key < 0) { throw new IOException("PrimaryID too big!"); } primaryIdArray |= (byte)(1u << kvp.Key); } writer.WriteByte(primaryIdArray); writer.WriteUInt32(data.UnitNetID); for (var primaryId = 0; primaryId < 8; primaryId++) { if ((primaryIdArray & (1 << primaryId)) == 0) { continue; } var array = data.Values[primaryId]; uint secondaryIdArray = 0; foreach (var kvp in array) { if (kvp.Key > 31 || kvp.Key < 0) { throw new IOException("Secondary ID too big!"); } secondaryIdArray |= (1u << kvp.Key); } writer.WriteUInt32(secondaryIdArray); for (var secondaryId = 0; secondaryId < 32; secondaryId++) { if ((secondaryIdArray & (1 << secondaryId)) == 0) { continue; } writer.WriteUInt32(array[secondaryId]); } } }