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