Example #1
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));
        }
        /// <summary>
        /// Invoked whenever one or more WorldEntities moves, are added, or removed from the map.
        /// Sends the changes in WorldEntity positions to all players who are on the map.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void OnMapStateChanged(object sender, MapStateChangedArgs e)
        {
            var entityLocations = e.Entities.Select(kvp => new
            {
                Id       = kvp.Key.Id,
                Location = kvp.Value
            });

            try
            {
                await _hubContext.Clients.Group(MapId)
                .SendAsync("updateEntities", entityLocations);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }