public void StopGame() { foreach (var moving in _movingObjects) { moving.Stop(); } OnGameStopped?.Invoke(); }
/// <summary> /// Constructor /// </summary> /// <param name="peer">Peer</param> /// <param name="token">Token</param> public ClientSynchronizer(IPeer peer, string token) : base() { Peer = peer ?? throw new ArgumentNullException(nameof(peer)); AddAutomaticMessageParserWithFatality <AuthentificationAcknowledgedMessageData> ( (_, message, __) => { if (IsAuthentificated) { SendErrorMessageToPeer <AuthentificationAcknowledgedMessageData>(peer, EErrorType.InvalidMessageContext, "Authentification has been already acknowledged.", true); } else { Token = message.Token; user = new ClientUser(message.GUID); RegisterUserEvents(user); OnAuthentificationAcknowledged?.Invoke(User); } } ); AddAutomaticMessageParser <AuthentificationFailedMessageData>((currentPeer, message, _) => OnAuthentificationFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <ListLobbyResultsMessageData> ( (_, message, __) => { ILobbyView[] lobbies = new ILobbyView[message.Lobbies.Count]; Parallel.For(0, lobbies.Length, (index) => lobbies[index] = (LobbyView)message.Lobbies[index]); OnLobbiesListed?.Invoke(lobbies); } ); AddAutomaticMessageParser <ListLobbiesFailedMessageData>((currentPeer, message, _) => OnListLobbiesFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <ListAvailableGameModeResultsMessageData>((_, message, __) => OnAvailableGameModesListed?.Invoke(message.GameModes)); AddAutomaticMessageParser <ListAvailableGameModesFailedMessageData>((currentPeer, message, _) => OnListAvailableGameModesFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <JoinLobbyAcknowledgedMessageData> ( (_, message, __) => AssertIsUserAuthentificated <JoinLobbyAcknowledgedMessageData> ( (clientUser) => { if (clientUser.Lobby == null) { Dictionary <string, IUser> users = new Dictionary <string, IUser>(); List <IInternalClientUser> user_list = new List <IInternalClientUser>(); foreach (UserData user in message.Users) { IInternalClientUser client_user; if (user.GUID == clientUser.GUID) { client_user = clientUser; this.user.SetNameInternally(user.Name, false); this.user.SetLobbyColorInternally(user.LobbyColor, false); } else { client_user = new ClientUser(user.GUID, user.GameColor, user.Name, user.LobbyColor); RegisterUserEvents(client_user); } users.Add(user.GUID.ToString(), client_user); user_list.Add(client_user); } IInternalClientLobby client_lobby = new ClientLobby(this, message.Rules.LobbyCode, message.Rules.Name, message.Rules.GameMode, message.Rules.IsPrivate, message.Rules.MinimalUserCount, message.Rules.MaximalUserCount, message.Rules.IsStartingGameAutomatically, message.Rules.GameModeRules, users[message.OwnerGUID.ToString()], users); client_lobby.OnUserJoined += (user) => OnUserJoined?.Invoke(client_lobby, user); client_lobby.OnUserLeft += (user, reason, leaveMessage) => OnUserLeft?.Invoke(client_lobby, user, reason, leaveMessage); client_lobby.OnLobbyOwnershipChanged += () => OnLobbyOwnershipChanged?.Invoke(client_lobby); client_lobby.OnLobbyRulesChanged += () => OnLobbyRulesChanged?.Invoke(client_lobby); client_lobby.OnGameStarted += () => OnGameStarted?.Invoke(client_lobby); client_lobby.OnGameStartRequested += (time) => OnGameStartRequested?.Invoke(client_lobby, time); client_lobby.OnGameRestarted += () => OnGameRestarted?.Invoke(client_lobby); client_lobby.OnGameRestartRequested += (time) => OnGameRestartRequested?.Invoke(client_lobby, time); client_lobby.OnGameStopped += (gameStopUsers, results) => OnGameStopped?.Invoke(client_lobby, gameStopUsers, results); client_lobby.OnGameStopRequested += (time) => OnGameStopRequested?.Invoke(client_lobby, time); client_lobby.OnStartGameCancelled += () => OnStartGameCancelled?.Invoke(client_lobby); client_lobby.OnRestartGameCancelled += () => OnRestartGameCancelled?.Invoke(client_lobby); client_lobby.OnStopGameCancelled += () => OnStopGameCancelled?.Invoke(client_lobby); client_lobby.OnUserEntityCreated += (user) => OnUserEntityCreated?.Invoke(client_lobby, user); client_lobby.OnUserEntityUpdated += (user) => OnUserEntityUpdated?.Invoke(client_lobby, user); client_lobby.OnUserEntityDestroyed += (user) => OnUserEntityDestroyed?.Invoke(client_lobby, user); client_lobby.OnEntityCreated += (entity) => OnEntityCreated?.Invoke(client_lobby, entity); client_lobby.OnEntityUpdated += (entity) => OnEntityUpdated?.Invoke(client_lobby, entity); client_lobby.OnEntityDestroyed += (entity) => OnEntityDestroyed?.Invoke(client_lobby, entity); user.ClientLobby = client_lobby; foreach (IInternalClientUser client_user in user_list) { client_user.ClientLobby = client_lobby; } user_list.Clear(); OnLobbyJoinAcknowledged?.Invoke(client_lobby); user.InvokeUsernameUpdatedEvent(); user.InvokeUserLobbyColorUpdatedEvent(); } else { SendInvalidMessageContextErrorMessageToPeer <JoinLobbyAcknowledgedMessageData>(peer, $"User is already in lobby \"{ clientUser.Lobby.Name }\" with lobby code \"{ clientUser.Lobby.LobbyCode }\"."); } } ) ); AddAutomaticMessageParser <JoinLobbyFailedMessageData>((currentPeer, message, _) => OnJoinLobbyFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <CreateLobbyFailedMessageData>((currentPeer, message, _) => OnCreateLobbyFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <LobbyRulesChangedMessageData> ( (_, message, __) => AssertIsUserInLobby <LobbyRulesChangedMessageData> ( (clientUser, clientLobby) => { LobbyRulesData rules = message.Rules; clientLobby.ChangeLobbyRulesInternally ( rules.LobbyCode, rules.Name, rules.GameMode, rules.IsPrivate, rules.MinimalUserCount, rules.MaximalUserCount, rules.IsStartingGameAutomatically, rules.GameModeRules ); } ) ); AddAutomaticMessageParser <UserJoinedMessageData> ( (_, message, __) => AssertIsUserInLobby <UserJoinedMessageData> ( (clientUser, clientLobby) => { IUser user = new ClientUser(message.GUID, message.GameColor, message.Name, message.LobbyColor); RegisterUserEvents(user); if (!clientLobby.AddUserInternally(user)) { SendInvalidMessageContextErrorMessageToPeer <UserJoinedMessageData>(peer, $"Failed to add user \"{ user.Name }\" with GUID \"{ user.GUID }\" to lobby \"{ clientLobby.Name }\" with lobby code \"{ clientLobby.LobbyCode }\"."); } } ) ); AddAutomaticMessageParser <UserLeftMessageData> ( (_, message, __) => AssertTargetLobbyUser <UserLeftMessageData> ( message.GUID, (clientUser, clientLobby, targetUser) => { if (!clientLobby.RemoveUserInternally(targetUser, message.Reason, message.Message)) { SendInvalidMessageContextErrorMessageToPeer <UserLeftMessageData>(peer, $"Failed to remove user \"{ targetUser.Name }\" with GUID \"{ targetUser.GUID }\" from lobby \"{ clientLobby.Name }\" with lobby code \"{ clientLobby.LobbyCode }\"."); } targetUser.ClientLobby = null; } ) ); AddAutomaticMessageParser <LobbyOwnershipChangedMessageData>((_, message, __) => AssertTargetLobbyUser <LobbyOwnershipChangedMessageData>(message.NewOwnerGUID, (clientUser, clientLobby, targetUser) => clientLobby.ChangeLobbyOwnershipInternally(targetUser))); AddAutomaticMessageParser <UsernameChangedMessageData>((_, message, __) => AssertTargetLobbyUser <UsernameChangedMessageData>(message.GUID, (clientUser, clientLobby, targetUser) => targetUser.SetNameInternally(message.NewUsername))); AddAutomaticMessageParser <ChangeUsernameFailedMessageData>((currentPeer, message, _) => OnChangeUsernameFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <UserLobbyColorChangedMessageData>((_, message, __) => AssertTargetLobbyUser <UserLobbyColorChangedMessageData>(message.GUID, (clientUser, clientLobby, targetUser) => targetUser.SetLobbyColorInternally(message.NewLobbyColor))); AddAutomaticMessageParser <ChangeUserLobbyColorFailedMessageData>((currentPeer, message, _) => OnChangeUserLobbyColorFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <ChangeLobbyRulesFailedMessageData>((currentPeer, message, _) => OnChangeLobbyRulesFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <KickUserFailedMessageData>((currentPeer, message, _) => OnKickUserFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <GameStartRequestedMessageData>((_, message, __) => AssertIsUserInLobby <GameStartRequestedMessageData>((clientUser, clientLobby) => clientLobby.InvokeGameStartRequestedEventInternally(message.Time))); AddAutomaticMessageParser <GameStartedMessageData>((_, message, __) => AssertIsUserInLobby <GameStartedMessageData>((clientUser, clientLobby) => clientLobby.InvokeGameStartedEventInternally())); AddAutomaticMessageParser <StartGameFailedMessageData>((currentPeer, message, _) => OnStartGameFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <GameRestartRequestedMessageData>((_, message, __) => AssertIsUserInLobby <GameRestartRequestedMessageData>((clientUser, clientLobby) => clientLobby.InvokeGameRestartRequestedEventInternally(message.Time))); AddAutomaticMessageParser <GameRestartedMessageData>((_, message, js__on) => AssertIsUserInLobby <GameRestartedMessageData>((clientUser, clientLobby) => clientLobby.InvokeGameRestartedEventInternally())); AddAutomaticMessageParser <RestartGameFailedMessageData>((currentPeer, message, _) => OnRestartGameFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <GameStopRequestedMessageData>((_, message, __) => AssertIsUserInLobby <GameStopRequestedMessageData>((clientUser, clientLobby) => clientLobby.InvokeGameStopRequestedEventInternally(message.Time))); AddAutomaticMessageParser <GameStoppedMessageData> ( (_, message, __) => AssertIsUserInLobby <GameStoppedMessageData> ( (clientUser, clientLobby) => { Dictionary <string, UserWithResults> users = new Dictionary <string, UserWithResults>(); foreach (GameEndUserData user in message.Users) { string key = user.GUID.ToString(); if (clientLobby.Users.ContainsKey(key)) { users.Add(key, new UserWithResults(clientLobby.Users[key], user.Results)); } else { SendErrorMessage <GameStoppedMessageData>(EErrorType.InvalidMessageContext, $"User with GUID \"{ key }\" is not in lobby \"{ clientLobby.Name }\" with lobby code \"{ clientLobby.LobbyCode }\"."); } } clientLobby.InvokeGameStoppedEventInternally(users, message.Results); } ) ); AddAutomaticMessageParser <StopGameFailedMessageData>((currentPeer, message, _) => OnStopGameFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <StartGameCancelledMessageData>((currentPeer, message, _) => AssertIsUserInLobby <GameStoppedMessageData>((__, clientLobby) => clientLobby.InvokeStartGameCancelledEventInternally())); AddAutomaticMessageParser <RestartGameCancelledMessageData>((currentPeer, message, _) => AssertIsUserInLobby <GameStoppedMessageData>((__, clientLobby) => clientLobby.InvokeRestartGameCancelledEventInternally())); AddAutomaticMessageParser <StopGameCancelledMessageData>((currentPeer, message, _) => AssertIsUserInLobby <GameStoppedMessageData>((__, clientLobby) => clientLobby.InvokeStopGameCancelledEventInternally())); AddAutomaticMessageParser <CancelStartRestartStopGameTimerFailedMessageData>((currentPeer, message, _) => OnCancelStartRestartStopGameTimerFailed?.Invoke(currentPeer, message.Message, message.Reason)); AddAutomaticMessageParser <ServerGameLoadingProcessFinishedMessageData>((currentPeer, message, _) => AssertTargetLobbyUser <ServerGameLoadingProcessFinishedMessageData>(message.UserGUID, (__, ___, targetUser) => targetUser.InvokeServerGameLoadingProcessFinishedEvent())); AddMessageParser <ServerTickMessageData> ( (_, message, __) => AssertIsUserInLobby <ServerTickMessageData>((clientUser, clientLobby) => clientLobby.ProcessServerTickInternally(message.Time, message.Entities, message.Hits)), (_, message, __) => SendServerTickFailedMessage(message, EServerTickFailedReason.Unknown), MessageParseFailedEvent <ServerTickMessageData> ); AddAutomaticMessageParser <ClientTickFailedMessageData>((currentPeer, message, _) => OnClientTickFailed?.Invoke(currentPeer, message.Message, message.Reason)); OnPeerConnected += (_) => SendAuthenticateMessage(token); }
private void DoGameStopped(bool value) { OnGameStopped?.Invoke(value); }