/// <summary> /// Registers the connected client to listen on the events on the specified map. Is called from the client. /// </summary> /// <param name="serverId">The server identifier.</param> /// <param name="mapId">The map identifier.</param> /// <remarks> /// This is a bit dirty... the AdminPanel should not have the reference to GameLogic. /// Instead we need to extract some interfaces. /// TODO: It should also be possible to observe multiple maps through one connection. /// </remarks> public void Subscribe(byte serverId, ushort mapId) { IGameServer gameServer = this.servers.OfType <IGameServer>().FirstOrDefault(g => g.Id == serverId); if (gameServer == null) { throw new ArgumentException($"unknown server id {serverId}", nameof(serverId)); } if (!FreeIds.TryDequeue(out ushort observerKey)) { throw new OutOfObserverKeysException(); } var clientProxy = this.Clients.Client(this.Context.ConnectionId); WorldObserverToHubAdapter observer = new WorldObserverToHubAdapter(observerKey, serverId, mapId, clientProxy); Observers.Add(this.Context.ConnectionId, observer); try { gameServer.RegisterMapObserver(mapId, observer); } catch (ArgumentException) { Observers.Remove(this.Context.ConnectionId); observer.Dispose(); throw; } }
public ViewContainer(WorldObserverToHubAdapter adapter) { this.adapter = adapter; }