/// <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); } }