Example #1
0
        /// Destroys the entity, removes all its components and pushs it back to the internal ObjectPool for entities.
        public virtual void DestroyEntity(Entity <T> entity)
        {
            var removed = _entities.Remove(entity);

            if (!removed)
            {
                throw new PoolDoesNotContainEntityException <T>("'" + this + "' cannot destroy " + entity + "!",
                                                                "Did you call pool.DestroyEntity() on a wrong pool?");
            }
            _entitiesCache = null;

            OnEntityWillBeDestroyed?.Invoke(this, entity);
            entity.Destroy();
            OnEntityDestroyed?.Invoke(this, entity);

            if (entity.owners.Count == 1)
            {
                // Can be released immediately without going to _retainedEntities
                entity.OnEntityReleased -= _cachedOnEntityReleased;
                _reusableEntities.Push(entity);
                entity.Release(this);
                entity.RemoveAllOnEntityReleasedHandlers();
            }
            else
            {
                _retainedEntities.Add(entity);
                entity.Release(this);
            }
        }
Example #2
0
        private void OnDestroyEntity(IEntity entity)
        {
            var tEntity = (TEntity)entity;
            var removed = _entities.Remove(tEntity);

            if (!removed)
            {
                throw new ContextDoesNotContainEntityException(
                          "'" + this + "' cannot destroy " + tEntity + "!",
                          "This cannot happen!?!");
            }

            _entitiesCache = null;

            OnEntityWillBeDestroyed?.Invoke(this, tEntity);

            tEntity.InternalDestroy();

            OnEntityDestroyed?.Invoke(this, tEntity);

            if (tEntity.RetainCount == 1)
            {
                // Can be released immediately without
                // adding to _retainedEntities
                tEntity.OnEntityReleased -= _cachedEntityReleased;
                _reusableEntities.Push(tEntity);
                tEntity.Release(this);
                tEntity.RemoveAllOnEntityReleasedHandlers();
            }
            else
            {
                _retainedEntities.Add(tEntity);
                tEntity.Release(this);
            }
        }
Example #3
0
            public static OnEntityDestroyed build(EntityRegistrationComponent p_entityRegistrationComponent)
            {
                OnEntityDestroyed l_instance = new OnEntityDestroyed();

                l_instance.EntityRegistrationComponent = p_entityRegistrationComponent;
                return(l_instance);
            }
Example #4
0
 /// <summary>
 /// Removes the specified entity
 /// </summary>
 /// <param name="key">Key</param>
 private void RemoveEntity(string key)
 {
     if (entities.ContainsKey(key))
     {
         OnEntityDestroyed?.Invoke(entities[key]);
         entities.Remove(key);
     }
 }
Example #5
0
        public void Destroy(int entityId)
        {
            if (!Exists(entityId))
            {
                return;
            }

            _existingEntityIds.TryRemove(entityId);
            foreach (var componentType in _storageCache.Keys)
            {
                RemoveComponent(entityId, componentType);
            }

            Interlocked.Decrement(ref _entityCount);
            OnEntityDestroyed?.Invoke(this, new EntityIdEventArgs(entityId));
        }
Example #6
0
        public void DestroyEntity(int entity)
        {
            var index = GetEntityIndex(entity);

            if (index >= EntityCount)
            {
                throw new MissingEntityException("Entity " + entity + " has already been destroyed");
            }

            // Check for any children of this entity and destroy them first.
            for (var i = index + 1; i < EntityCount; ++i)
            {
                var otherEntity = entities[i];
                if (GetParent(otherEntity) == entity)
                {
                    DestroyEntity(otherEntity);
                }
            }

            // Remove all components at this entity.
            foreach (var componentsOfType in components)
            {
                if (componentsOfType.Value.ContainsKey(entity))
                {
                    componentsOfType.Value.Remove(entity);
                    Console.WriteLine("Removed " + componentsOfType.Key + " attached to " + entity);
                }
            }

            // Clear this entity's parent to the root.
            parents[entity] = ROOT_ENTITY;

            // Shift the entities after this entity back and place this entity directly after them.
            --EntityCount;
            for (var i = index; i < EntityCount; ++i)
            {
                SetEntityIndex(entities[i], i - 1);
            }
            SetEntityIndex(entity, EntityCount);

            Console.WriteLine("Destroyed " + entity);
            OnEntityDestroyed?.Invoke(entity);
        }
Example #7
0
        public void DeleteEntity(int entityId)
        {
            _deletedEntities.Add(entityId);
            var ent = FindEntity(entityId);

            if (ent != null)
            {
                if (ent.State != NetEntityState.Deleted)
                {
                    ent.Delete();
                }

                Entities.Remove(ent);

                if (Game.Live)
                {
                    BroadcastEntityDeleted(ent);
                    OnEntityDestroyed?.Invoke(ent);
                }
            }
        }
Example #8
0
        private void onEntityCreated(Entity p_entity)
        {
            AssociatedEntity = p_entity;
            AssociatedEntity.EntityGameWorldInstanceID = new EntityGameWorldInstanceID()
            {
                ID = GetInstanceID()
            };

            AssociatedEntity.EntityGameWorld = EntityGameWorld.build(TransformComponent.alloc());
            TransformComponentSynchronizer.alloc(AssociatedEntity.EntityGameWorld.RootGround);
            EntityModelTransformSynchronizer = TransformSynchronizer.alloc(transform,
                                                                           AssociatedEntity.EntityGameWorld.RootGround.TransformComponentSynchronizer);
            TransformSynchronizerContainer.TransformSynchronizers.Add(EntityModelTransformSynchronizer);

            MyEvent <Entity> .IEventCallback l_onEntityDestroyed = OnEntityDestroyed.build(this);
            MyEvent <Entity> .register(
                ref this.AssociatedEntity.OnEntityDestroyed,
                ref l_onEntityDestroyed);

            // Initializing Entity components
            EntityDefinition.Initialize(
                ref this.EntityDefinition,
                ref this.AssociatedEntity,
                this.RuntimeObject.RuntimeObjectRootComponent);

            NavigationNode l_randomNavigationNode = NavigationGraphAlgorithm.pickRandomNode(NavigationGraphComponentContainer.UniqueNavigationGraphComponent.NavigationGraph);

            EventQueue.enqueueEvent(EventQueueContainer.TurnTimelineQueue, NavigationNodeWarpEntityEvent.alloc(AssociatedEntity, l_randomNavigationNode));

            AnimationVisualFeedback l_animationVisualFeedbackComponent = EntityComponent.get_component <AnimationVisualFeedback>(AssociatedEntity);

            if (l_animationVisualFeedbackComponent != null)
            {
                EventQueue.enqueueEvent(EventQueueContainer.TurnTimelineQueue,
                                        AnimationVisualFeedbackPlayAsyncEvent.alloc(l_animationVisualFeedbackComponent, AnimationLayers.BASE,
                                                                                    l_animationVisualFeedbackComponent.AnimationVisualFeedbackData.GetAnimation(AnimationLookupTag.IDLE).GetAnimationInput()));
            }
        }
 /// <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);
 }