Exemplo n.º 1
0
        /// <summary>
        /// Invoked whenever WorldEntities are added to the map this listener is listening to. Converts
        /// the new entities into DisplayEntities and sends them to all players who are on the current map.
        /// Sends currently existing DisplayEntities to newly connected players.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void OnWorldEntitiesAdded(object sender, WorldEntityAddedArgs e)
        {
            var entities = new List <DisplayEntity>();

            foreach (var entity in e.AddedEntities)
            {
                entities.Add(new DisplayEntity
                {
                    Id       = entity.Id,
                    IconUris = entity.IconUris,
                    Name     = entity.Name,
                    OwnerId  = entity.OwnerGuid
                });
            }
            _displayEntities.AddRange(entities);

            var tasks = new List <Task>
            {
                _hubContext.Clients.Group(MapId).SendAsync("addEntities", entities)
            };

            foreach (var entity in e.AddedEntities)
            {
                // Skip sending messages to the owner of Ai controlled entities.
                if (entity.OwnerGuid == GameplayConstants.AiId)
                {
                    continue;
                }
                tasks.Add(_hubContext.Clients.User(entity.OwnerGuid.ToString()).SendAsync("addEntities", _displayEntities));
                tasks.Add(_hubContext.Clients.User(entity.OwnerGuid.ToString()).SendAsync("getMyEntity", entity.Id));
            }

            await Task.WhenAll(tasks.ToArray());
        }
Exemplo n.º 2
0
        /// <summary>
        /// Checks to see if the map state has changed, if so invokes the events.
        /// </summary>
        public Task CheckChangesAsync()
        {
            WorldEntityAddedArgs   entityAddedArgs     = null;
            WorldEntityRemovedArgs entityRemovedArgs   = null;
            MapStateChangedArgs    mapStateChangedArgs = null;

            lock (_lock)
            {
                if (_worldEntityAdded)
                {
                    var newEntities = _newEntities;
                    entityAddedArgs = new WorldEntityAddedArgs
                    {
                        AddedEntities    = newEntities,
                        ConnectedPlayers = _connectedPlayers
                    };
                    _newEntities      = new List <WorldEntity>();
                    _worldEntityAdded = false;
                }
                if (_worldEntityRemoved)
                {
                    var removedEntities = _removedEntityIds;
                    entityRemovedArgs = new WorldEntityRemovedArgs
                    {
                        RemovedEntityIds = removedEntities,
                        ConnectedPlayers = _connectedPlayers
                    };
                    _removedEntityIds   = new List <int>();
                    _worldEntityRemoved = false;
                }
                if (_isStateChanged)
                {
                    mapStateChangedArgs = new MapStateChangedArgs
                    {
                        Entities         = _allEntities,
                        ConnectedPlayers = _connectedPlayers
                    };
                    _isStateChanged = false;
                }
            }

            var tasks = new List <Task>();

            if (entityAddedArgs != null)
            {
                tasks.Add(Task.Run(() => WorldEntityAdded?.Invoke(this, entityAddedArgs)));
            }
            if (entityRemovedArgs != null)
            {
                tasks.Add(Task.Run(() => WorldEntityRemoved?.Invoke(this, entityRemovedArgs)));
            }
            if (mapStateChangedArgs != null)
            {
                tasks.Add(Task.Run(() => MapStateChanged?.Invoke(this, mapStateChangedArgs)));
            }
            tasks.Add(Task.Run(() => GameTick?.Invoke(this, new GameTickEventArgs())));

            return(Task.WhenAll(tasks));
        }