public async Task <MatchResult> RunMatch() { if (MatchController == null) { throw new InvalidOperationException("Cannot run match without a match controller"); } Debug.Log("Starting cooldown..."); CurrentProgressionID = MatchProgressionState.Intro; await Mediator.Global.PublishAsync(new MatchStartCountdownEvent { MatchConfig = Config, MatchState = MatchController.CurrentState }); Debug.Log("Running match..."); CurrentProgressionID = MatchProgressionState.InGame; MatchTask = new TaskCompletionSource <MatchResult>(); Mediator.Global.Publish(new MatchStartEvent { MatchConfig = Config, MatchState = MatchController.CurrentState }); // TODO(james7132): Properly evaluate the match result here. var result = await MatchTask.Task; await Mediator.Global.PublishAsync(new MatchEndEvent { MatchConfig = Config, MatchState = MatchController.CurrentState }); CurrentProgressionID = MatchProgressionState.End; return(result); }
public void Deserialize(Deserializer deserializer) { var mask = deserializer.ReadByte(); PlayerCount = mask & 15; playerStates = ArrayPool <PlayerState> .Shared.Rent(PlayerCount); for (var i = 0; i < PlayerCount; i++) { var state = new PlayerState(); if ((mask & (1 << (i + 4))) != 0) { state.Deserialize(deserializer); } SetPlayerState(i, state); } StateID = (MatchProgressionState)deserializer.ReadByte(); }
public void SetPaused(bool paused) { if (!IsLocal) { return; } var pauseID = paused ? MatchProgressionState.Pause : MatchProgressionState.InGame; bool changed = pauseID != CurrentProgressionID; CurrentProgressionID = pauseID; if (changed) { Mediator.Global.Publish(new MatchPauseStateChangedEvent { MatchConfig = Config, MatchState = MatchController.CurrentState, Paused = paused }); } }