private void SendClockedCall(int PeerId, ClockedRemoteCall.TypeOfCall Type, MDReliability Reliability, string NodePath, string Method, MDRemoteMode Mode, params object[] Parameters) { MDLog.Trace(LOG_CAT, $"Sending clocked call {Method} on {NodePath} with parameters ({MDStatics.GetParametersAsString(Parameters)})"); if (Reliability == MDReliability.Reliable) { if (PeerId != -1) { RpcId(PeerId, nameof(ClockedCall), GameClock.GetTick(), Type, NodePath, Method, Mode, Parameters); } else { Rpc(nameof(ClockedCall), GameClock.GetTick(), Type, NodePath, Method, Mode, Parameters); } } else { if (PeerId != -1) { RpcUnreliableId(PeerId, nameof(ClockedCall), GameClock.GetTick(), Type, NodePath, Method, Mode, Parameters); } else { RpcUnreliable(nameof(ClockedCall), GameClock.GetTick(), Type, NodePath, Method, Mode, Parameters); } } }
private void CheckAllClientsSynched(Timer timer) { if (PeerSynchInfo.Values.Where(peerInfo => peerInfo.CompletedSynch == false).ToList().Count > 0) { MDLog.Debug(LOG_CAT, "All clients are not synched yet"); return; } // Check if we still need to wait for a better confidence on the TickMsec value if (PeerSynchInfo.Values.Where(peerInfo => peerInfo.IsClientMSecConfident() == false).ToList().Count > 0) { MDLog.Debug(LOG_CAT, "Still waiting for a more secure msec value"); return; } MDLog.Debug(LOG_CAT, "All clients synched, sending unpause signal"); // Alright tell all clients to unpause in a bit foreach (int peerid in GameSession.GetAllPeerIds()) { // Get our current game tick uint tickToUnpause = GameClock?.GetTick() != null?GameClock.GetTick() : 0; if (peerid != MDStatics.GetServerId()) { RpcId(peerid, nameof(UnpauseAtTickMsec), GetPlayerTicksMsec(peerid) + GetUnpauseCountdownDurationMSec(), tickToUnpause); } } UnpauseAtTickMsec(OS.GetTicksMsec() + GetUnpauseCountdownDurationMSec(), 0); PeerSynchInfo.Values.ToList().ForEach(value => value.CompletedSynch = false); timer.RemoveAndFree(); }
/// <summary> /// Get the current game tick /// </summary> /// <returns>The current tick or 0 if game clock is not active</returns> protected uint GetGameTick() { return(GameClock.GetTick()); }