using Mirror; using QSB.Messaging; using QSB.Player; using QSB.TriggerSync.WorldObjects; using System.Collections.Generic; using System.Linq; namespace QSB.TriggerSync.Messages { /// /// always sent by host /// public class TriggerResyncMessage : QSBWorldObjectMessage { private uint[] _playerIds; public TriggerResyncMessage(IEnumerable occupants) => _playerIds = occupants.Select(x => x.PlayerId).ToArray(); public override void Serialize(NetworkWriter writer) { base.Serialize(writer); writer.WriteArray(_playerIds); } public override void Deserialize(NetworkReader reader) { base.Deserialize(reader); _playerIds = reader.ReadArray(); } public override void OnReceiveRemote() { var serverOccupants = _playerIds.Select(QSBPlayerManager.GetPlayer).ToList(); foreach (var added in serverOccupants.Except(WorldObject.Occupants)) { WorldObject.Enter(added); } foreach (var removed in WorldObject.Occupants.Except(serverOccupants)) { WorldObject.Exit(removed); } } } }