public void SendGameStateUpdate(bool force = false, bool forceFullState = false) { //Obey the updates per second limit TimeSpan elapsed = Time - _lastStateTime; if (force || elapsed.TotalMilliseconds > (1000 / updateRate)) { //Save last state time _lastStateTime = Time; //Create a new GameState object var stateManager = IoCManager.Resolve <IGameStateManager>(); var state = new GameState(++_lastState); if (EntityManager != null) { state.EntityStates = EntityManager.GetEntityStates(); } state.PlayerStates = IoCManager.Resolve <IPlayerManager>().GetPlayerStates(); stateManager.Add(state.Sequence, state); //LogManager.Log("Update " + _lastState + " sent."); List <NetConnection> connections = IoCManager.Resolve <ISS14NetServer>().Connections; if (connections.Count == 0) { //No clients -- don't send state _oldestAckedState = _lastState; stateManager.Clear(); } else { foreach ( NetConnection c in IoCManager.Resolve <ISS14NetServer>().Connections.Where( c => c.Status == NetConnectionStatus.Connected)) { IPlayerSession session = IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(c); if (session == null || (session.status != SessionStatus.InGame && session.status != SessionStatus.InLobby)) { continue; } NetOutgoingMessage stateMessage = IoCManager.Resolve <ISS14NetServer>().CreateMessage(); uint lastStateAcked = stateManager.GetLastStateAcked(c); if (lastStateAcked == 0)// || forceFullState) { int length = state.WriteStateMessage(stateMessage); //LogManager.Log("Full state of size " + length + " sent to " + c.RemoteUniqueIdentifier); } else { stateMessage.Write((byte)NetMessage.StateUpdate); GameStateDelta delta = stateManager.GetDelta(c, _lastState); delta.WriteDelta(stateMessage); //LogManager.Log("Delta of size " + delta.Size + " sent to " + c.RemoteUniqueIdentifier); } IoCManager.Resolve <ISS14NetServer>().SendMessage(stateMessage, c, NetDeliveryMethod.Unreliable); } } stateManager.Cull(); } }
public static GameStateDelta Delta(GameState fromState, GameState toState) { var delta = new GameStateDelta(); delta.Sequence = toState.Sequence; delta.Create(fromState, toState); return delta; }
public static GameStateDelta Delta(GameState fromState, GameState toState) { var delta = new GameStateDelta(); delta.Sequence = toState.Sequence; delta.Create(fromState, toState); return(delta); }
public override void ReadFromBuffer(NetIncomingMessage buffer) { uint sequence = buffer.ReadUInt32(); uint fromSequence = buffer.ReadUInt32(); int length = buffer.ReadInt32(); byte[] bytes; buffer.ReadBytes(length, out bytes); StateDelta = new GameStateDelta(bytes); StateDelta.Sequence = sequence; StateDelta.FromSequence = fromSequence; }
public void HandleStateUpdateMessage(MsgStateUpdate message) { GameStateDelta delta = message.StateDelta; if (GameStates.ContainsKey(delta.FromSequence)) { AckGameState(delta.Sequence); GameState fromState = GameStates[delta.FromSequence]; GameState newState = fromState + delta; newState.GameTime = (float)timing.CurTime.TotalSeconds; ApplyGameState(newState); CullOldStates(delta.FromSequence); } }
public static GameState Patch(GameState fromState, GameStateDelta delta) { return delta.Apply(fromState); }
public void ApplyDeltaState(uint oldStateSeq, uint newStateSeq, GameStateDelta delta) { }
public static GameState Patch(GameState fromState, GameStateDelta delta) { return(delta.Apply(fromState)); }