Beispiel #1
0
        public async Task <IActionResult> JoinZoneProximityChat([FromServices] ICharacterSessionRepository characterSessionRepository,
                                                                [FromServices] IFactoryCreatable <VivoxTokenClaims, VivoxTokenClaimsCreationContext> claimsFactory,
                                                                [FromServices] IVivoxTokenSignService signService)
        {
            int accountId = this.ClaimsReader.GetAccountIdInt(User);

            //If the user doesn't actually have a claimed session in the game
            //then we shouldn't log them into Vivox.
            if (!await characterSessionRepository.AccountHasActiveSession(accountId))
            {
                return(BuildFailedResponseModel(VivoxLoginResponseCode.NoActiveCharacterSession));
            }

            int characterId = await RetrieveSessionCharacterIdAsync(characterSessionRepository, accountId);

            CharacterSessionModel session = await characterSessionRepository.RetrieveAsync(characterId);

            //Players in the same zone will all join the same proximity channel such as Prox-1.
            //They can use this for proximity text and voice chat.
            //TODO: Use a factory for channel name generation maybe?
            VivoxTokenClaims claims = claimsFactory.Create(new VivoxTokenClaimsCreationContext(characterId, VivoxAction.JoinChannel, new VivoxChannelData(true, $"Prox-{session.ZoneId}")));

            //We don't send it back in a JSON form even though it's technically a JSON object
            //because the client just needs it as a raw string anyway to put through the Vivox client API.
            return(BuildSuccessfulResponseModel(new VivoxChannelJoinResponse(signService.CreateSignature(claims), claims.DestinationSIPURI)));
        }
Beispiel #2
0
        public virtual async Task <IActionResult> CreateObjectInstance([FromRoute(Name = "world")] long worldId,
                                                                       [FromServices][NotNull] TInstanceRepositoryType instanceObjectRepository,
                                                                       [FromServices][NotNull] IFactoryCreatable <TInstanceEntryModelType, WorldInstanceableEntryModelCreationContext> defaultInstanceEntryModelFactory,
                                                                       [FromServices][NotNull] ITypeConverterProvider <TInstanceEntryModelType, TInstanceTransportModelType> tableToNetworkModelConverter)
        {
            if (instanceObjectRepository == null)
            {
                throw new ArgumentNullException(nameof(instanceObjectRepository));
            }
            if (defaultInstanceEntryModelFactory == null)
            {
                throw new ArgumentNullException(nameof(defaultInstanceEntryModelFactory));
            }
            if (tableToNetworkModelConverter == null)
            {
                throw new ArgumentNullException(nameof(tableToNetworkModelConverter));
            }

            TInstanceEntryModelType entry = defaultInstanceEntryModelFactory.Create(new WorldInstanceableEntryModelCreationContext(worldId));

            bool result = await instanceObjectRepository.TryCreateAsync(entry);

            //No known reason that this should fail.
            if (!result)
            {
                return(BuildFailedResponseModel(SceneContentQueryResponseCode.GeneralServerError));
            }

            //Otherwise, it has been created so let's get it
            return(await GetObjectInstance(entry.ObjectInstanceId, instanceObjectRepository, tableToNetworkModelConverter));
        }
Beispiel #3
0
 /// <inheritdoc />
 public SpawnPlayerOnBurstingFinishedEventListener([NotNull] IClientFinishedBurstingEventSubscribable subscriptionService, [NotNull] ILocalPlayerData playerData, [NotNull] IReadonlyEntityGuidMappable <PlayerZoneData> zoneMappable, [NotNull] IFactoryCreatable <GameObject, RemotePlayerWorldRepresentationCreationContext> remotePlayerFactory)
     : base(subscriptionService)
 {
     PlayerData          = playerData ?? throw new ArgumentNullException(nameof(playerData));
     ZoneMappable        = zoneMappable ?? throw new ArgumentNullException(nameof(zoneMappable));
     RemotePlayerFactory = remotePlayerFactory ?? throw new ArgumentNullException(nameof(remotePlayerFactory));
 }
 /// <inheritdoc />
 public GuildMessageBroadcastMessageHandler(
     [JetBrains.Annotations.NotNull] IFactoryCreatable <GuildChatMessageEventModel, GenericChatMessageContext <GuildChatMessageRequestModel> > outgoingMessageFactory,
     [JetBrains.Annotations.NotNull] IEntityGuidMappable <CharacterGuildMembershipStatusResponse> guildStatusMappable)
     : base(ChatChannels.GuildChannel, outgoingMessageFactory)
 {
     GuildStatusMappable = guildStatusMappable ?? throw new ArgumentNullException(nameof(guildStatusMappable));
 }
Beispiel #5
0
 public override Task <IActionResult> CreateObjectInstance([FromRoute(Name = "id")] long worldId,
                                                           [FromServices] TInstanceRepositoryType instanceObjectRepository,
                                                           [FromServices] IFactoryCreatable <TInstanceEntryModelType, WorldInstanceableEntryModelCreationContext> defaultInstanceEntryModelFactory,
                                                           [FromServices] ITypeConverterProvider <TInstanceEntryModelType, TInstanceTransportModelType> tableToNetworkModelConverter)
 {
     return(Task.FromResult((IActionResult)BadRequest($"This request is not valid for {typeof(TInstanceTransportModelType).Name}.")));
 }
Beispiel #6
0
        public async Task <IActionResult> JoinGuildChat([FromServices] ICharacterSessionRepository characterSessionRepository,
                                                        [FromServices] IFactoryCreatable <VivoxTokenClaims, VivoxTokenClaimsCreationContext> claimsFactory,
                                                        [FromServices] IGuildCharacterMembershipRepository guildMembershipRepository,
                                                        [FromServices] IVivoxTokenSignService signService)
        {
            int accountId = this.ClaimsReader.GetAccountIdInt(User);

            //If the user doesn't actually have a claimed session in the game
            //then we shouldn't log them into Vivox.
            if (!await characterSessionRepository.AccountHasActiveSession(accountId))
            {
                return(BuildFailedResponseModel(VivoxLoginResponseCode.NoActiveCharacterSession));
            }

            int characterId = await RetrieveSessionCharacterIdAsync(characterSessionRepository, accountId);

            if (!await guildMembershipRepository.ContainsAsync(characterId))
            {
                return(BuildFailedResponseModel(VivoxLoginResponseCode.ChannelUnavailable));
            }

            int guildId = (await guildMembershipRepository.RetrieveAsync(characterId)).GuildId;

            //TODO: Use a factory for channel name generation maybe?
            VivoxTokenClaims claims = claimsFactory.Create(new VivoxTokenClaimsCreationContext(characterId, VivoxAction.JoinChannel, new VivoxChannelData(false, $"Guild-{guildId}")));

            //We don't send it back in a JSON form even though it's technically a JSON object
            //because the client just needs it as a raw string anyway to put through the Vivox client API.
            return(BuildSuccessfulResponseModel(new VivoxChannelJoinResponse(signService.CreateSignature(claims), claims.DestinationSIPURI)));
        }
Beispiel #7
0
 public ClientInitializeDefaultMovementGeneratorEventListener(IEntityCreationFinishedEventSubscribable subscriptionService,
                                                              IEntityGuidMappable <IMovementGenerator <GameObject> > movementGeneratorMappable,
                                                              IFactoryCreatable <IMovementGenerator <GameObject>, EntityAssociatedData <IMovementData> > movementGeneratorFactory,
                                                              IReadonlyEntityGuidMappable <IMovementData> movementDataMappable)
     : base(subscriptionService, movementGeneratorMappable, movementGeneratorFactory, movementDataMappable)
 {
 }
Beispiel #8
0
 public LoadSelectedCharacterAvatarEventListener(ICharacterSelectionButtonClickedEventSubscribable subscriptionService,
                                                 [NotNull] IReadonlyEntityGuidMappable <CharacterAppearanceResponse> characterAppearanceMappable,
                                                 [NotNull] IFactoryCreatable <CustomModelLoaderCancelable, CustomModelLoaderCreationContext> avatarLoaderFactory)
     : base(subscriptionService)
 {
     CharacterAppearanceMappable = characterAppearanceMappable ?? throw new ArgumentNullException(nameof(characterAppearanceMappable));
     AvatarLoaderFactory         = avatarLoaderFactory ?? throw new ArgumentNullException(nameof(avatarLoaderFactory));
 }
Beispiel #9
0
 public ClientOnEntityCreatingCreateWorldObjectRepresentationEventListener(IEntityCreationStartingEventSubscribable subscriptionService,
                                                                           IFactoryCreatable <GameObject, EntityPrefab> prefabFactory,
                                                                           IReadonlyEntityGuidMappable <IMovementData> movementDataMappable,
                                                                           ILocalCharacterDataRepository characterDataRepository)
     : base(subscriptionService, prefabFactory, movementDataMappable)
 {
     CharacterDataRepository = characterDataRepository;
 }
 public PlayerSelfSpawnEventPayloadHandler(ILog logger,
                                           [NotNull] IFactoryCreatable <NetworkEntityNowVisibleEventArgs, EntityCreationData> visibileEventFactory
                                           , [NotNull] INetworkEntityVisibilityEventPublisher visibilityEventPublisher)
     : base(logger)
 {
     VisibileEventFactory     = visibileEventFactory ?? throw new ArgumentNullException(nameof(visibileEventFactory));
     VisibilityEventPublisher = visibilityEventPublisher ?? throw new ArgumentNullException(nameof(visibilityEventPublisher));
 }
Beispiel #11
0
 protected SharedOnEntityCreatingCreateWorldObjectRepresentationEventListener(IEntityCreationStartingEventSubscribable subscriptionService,
                                                                              [NotNull] IFactoryCreatable <GameObject, EntityPrefab> prefabFactory,
                                                                              [NotNull] IReadonlyEntityGuidMappable <IMovementData> movementDataMappable)
     : base(subscriptionService)
 {
     PrefabFactory        = prefabFactory ?? throw new ArgumentNullException(nameof(prefabFactory));
     MovementDataMappable = movementDataMappable ?? throw new ArgumentNullException(nameof(movementDataMappable));
 }
Beispiel #12
0
        /// <summary>
        /// Simplified creation API that creates a type <typeparamref name="TConstructionType"/> with provided <see cref="factory"/>.
        /// Only for creation contexts of <see cref="EmptyFactoryContext"/>.
        /// </summary>
        /// <typeparam name="TConstructionType">The construction type.</typeparam>
        /// <param name="factory">The factory instance.</param>
        /// <returns>An instance of the construction type.</returns>
        public static TConstructionType Create <TConstructionType>(this IFactoryCreatable <TConstructionType, EmptyFactoryContext> factory)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            return(factory.Create(EmptyFactoryContext.Instance));
        }
 /// <inheritdoc />
 public InterestChangedPacketBuilder(
     [NotNull] IReadonlyEntityGuidMappable <IMovementData> movementMapper,
     [NotNull] IReadonlyEntityGuidMappable <IChangeTrackableEntityDataCollection> entityDataMapper,
     [NotNull] IFactoryCreatable <FieldValueUpdate, EntityFieldUpdateCreationContext> fieldUpdateFactory)
 {
     MovementMapper     = movementMapper ?? throw new ArgumentNullException(nameof(movementMapper));
     EntityDataMapper   = entityDataMapper ?? throw new ArgumentNullException(nameof(entityDataMapper));
     FieldUpdateFactory = fieldUpdateFactory ?? throw new ArgumentNullException(nameof(fieldUpdateFactory));
 }
Beispiel #14
0
 public ClientInitializeDefaultMovementGeneratorEventListener(IEntityCreationFinishedEventSubscribable subscriptionService,
                                                              [NotNull] IEntityGuidMappable <IMovementGenerator <IWorldObject> > movementGeneratorMappable,
                                                              [NotNull] IFactoryCreatable <IMovementGenerator <IWorldObject>, EntityAssociatedData <IMovementData> > movementGeneratorFactory,
                                                              [NotNull] IReadonlyEntityGuidMappable <IMovementData> movementDataMappable)
     : base(subscriptionService)
 {
     MovementGeneratorMappable = movementGeneratorMappable ?? throw new ArgumentNullException(nameof(movementGeneratorMappable));
     MovementGeneratorFactory  = movementGeneratorFactory ?? throw new ArgumentNullException(nameof(movementGeneratorFactory));
     MovementDataMappable      = movementDataMappable ?? throw new ArgumentNullException(nameof(movementDataMappable));
 }
Beispiel #15
0
        /// <inheritdoc />
        protected BaseTextChatGroupBroadcastSignalRMessageHandler(ChatChannels targetChannel, [JetBrains.Annotations.NotNull] IFactoryCreatable <TSendMessageType, GenericChatMessageContext <TMessageType> > outgoingMessageFactory)
        {
            if (!Enum.IsDefined(typeof(ChatChannels), targetChannel))
            {
                throw new InvalidEnumArgumentException(nameof(targetChannel), (int)targetChannel, typeof(ChatChannels));
            }

            TargetChannel          = targetChannel;
            OutgoingMessageFactory = outgoingMessageFactory ?? throw new ArgumentNullException(nameof(outgoingMessageFactory));
        }
Beispiel #16
0
 public DefaultAvatarPedestalGameObjectBehaviour(NetworkEntityGuid targetEntity,
                                                 GameObject rootSceneObject,
                                                 IEntityDataFieldContainer data,
                                                 [NotNull] IFactoryCreatable <CustomModelLoaderCancelable, CustomModelLoaderCreationContext> avatarLoaderFactory,
                                                 [NotNull] ILog logger)
     : base(targetEntity, rootSceneObject, data)
 {
     AvatarLoaderFactory = avatarLoaderFactory ?? throw new ArgumentNullException(nameof(avatarLoaderFactory));
     Logger = logger ?? throw new ArgumentNullException(nameof(logger));
 }
 /// <inheritdoc />
 public PlayerSelfSpawnEventHandler(
     ILog logger,
     IFactoryCreatable <GameObject, DefaultEntityCreationContext> playerFactory,
     IReadOnlyCollection <IGameInitializable> initializables,
     ILocalPlayerDetails localPlayerDetails)
     : base(logger)
 {
     PlayerFactory      = playerFactory ?? throw new ArgumentNullException(nameof(playerFactory));
     Initializables     = initializables ?? throw new ArgumentNullException(nameof(initializables));
     LocalPlayerDetails = localPlayerDetails ?? throw new ArgumentNullException(nameof(localPlayerDetails));
 }
Beispiel #18
0
 /// <inheritdoc />
 public VisibilityChangeMessageSender(
     [NotNull] IReadonlyEntityGuidMappable <IMovementData> movementDataMappable,
     [NotNull] IReadonlyEntityGuidMappable <IPeerPayloadSendService <GameServerPacketPayload> > sessionMappable,
     [NotNull] IReadonlyEntityGuidMappable <IChangeTrackableEntityDataCollection> entityDataMapper,
     [NotNull] IFactoryCreatable <FieldValueUpdate, EntityFieldUpdateCreationContext> fieldUpdateFactory)
 {
     MovementDataMappable = movementDataMappable ?? throw new ArgumentNullException(nameof(movementDataMappable));
     SessionMappable      = sessionMappable ?? throw new ArgumentNullException(nameof(sessionMappable));
     EntityDataMapper     = entityDataMapper ?? throw new ArgumentNullException(nameof(entityDataMapper));
     FieldUpdateFactory   = fieldUpdateFactory ?? throw new ArgumentNullException(nameof(fieldUpdateFactory));
 }
 /// <inheritdoc />
 public AdditionalServerRegisterationPlayerEntityFactoryDecorator(
     IFactoryCreatable <GameObject, PlayerEntityCreationContext> decoratedFactory,
     IEntityGuidMappable <IPeerPayloadSendService <GameServerPacketPayload> > guidToSessionMappable,
     IEntityGuidMappable <InterestCollection> guidToInterestCollectionMappable,
     IDictionary <int, NetworkEntityGuid> connectionIdToControllingEntityMap)
 {
     DecoratedFactory                   = decoratedFactory;
     GuidToSessionMappable              = guidToSessionMappable;
     GuidToInterestCollectionMappable   = guidToInterestCollectionMappable;
     ConnectionIdToControllingEntityMap = connectionIdToControllingEntityMap;
 }
Beispiel #20
0
 public RequestStaticGameObjectSpawnsEventListener(IServerStartingEventSubscribable subscriptionService,
                                                   [NotNull] IEventPublisher <IEntityCreationRequestedEventSubscribable, EntityCreationRequestedEventArgs> entityCreationRequester,
                                                   [NotNull] IFactoryCreatable <NetworkEntityGuid, GameObjectInstanceModel> gameObjectGuidFactory,
                                                   [NotNull] IGameObjectDataService gameObjectDataService,
                                                   [NotNull] ILog logger)
     : base(subscriptionService)
 {
     EntityCreationRequester = entityCreationRequester ?? throw new ArgumentNullException(nameof(entityCreationRequester));
     GameObjectGuidFactory   = gameObjectGuidFactory ?? throw new ArgumentNullException(nameof(gameObjectGuidFactory));
     GameObjectDataService   = gameObjectDataService ?? throw new ArgumentNullException(nameof(gameObjectDataService));
     Logger = logger ?? throw new ArgumentNullException(nameof(logger));
 }
Beispiel #21
0
 public OnEntityCreatingRegisterModelChangeListenerEventListener(IEntityCreationStartingEventSubscribable subscriptionService,
                                                                 [NotNull] IEntityDataChangeCallbackRegisterable entityDataCallbackRegister,
                                                                 [NotNull] ILog logger,
                                                                 [NotNull] IFactoryCreatable <CustomModelLoaderCancelable, CustomModelLoaderCreationContext> avatarLoaderFactory,
                                                                 [NotNull] IEntityGuidMappable <CustomModelLoaderCancelable> avatarLoaderMappable)
     : base(subscriptionService)
 {
     EntityDataCallbackRegister = entityDataCallbackRegister ?? throw new ArgumentNullException(nameof(entityDataCallbackRegister));
     Logger = logger ?? throw new ArgumentNullException(nameof(logger));
     AvatarLoaderFactory  = avatarLoaderFactory ?? throw new ArgumentNullException(nameof(avatarLoaderFactory));
     AvatarLoaderMappable = avatarLoaderMappable ?? throw new ArgumentNullException(nameof(avatarLoaderMappable));
 }
Beispiel #22
0
 public PlayerCreatedSendPlayerCreationPayloadToPlayerEventListener(IEntityCreationFinishedEventSubscribable subscriptionService,
                                                                    INetworkMessageSender <GenericSingleTargetMessageContext <PlayerSelfSpawnEventPayload> > sender,
                                                                    IReadonlyEntityGuidMappable <IMovementData> movementDataMappable,
                                                                    IFactoryCreatable <FieldValueUpdate, EntityFieldUpdateCreationContext> entityDataUpdateFactory,
                                                                    IReadonlyEntityGuidMappable <IEntityDataFieldContainer> entityDataMappable)
     : base(subscriptionService)
 {
     Sender = sender;
     MovementDataMappable    = movementDataMappable;
     EntityDataUpdateFactory = entityDataUpdateFactory;
     EntityDataMappable      = entityDataMappable;
 }
Beispiel #23
0
 /// <inheritdoc />
 public PlayerCreatedSendPlayerCreationPayloadToPlayerEventListener(
     IPlayerWorldSessionCreatedEventSubscribable subscriptionService,
     [NotNull] INetworkMessageSender <GenericSingleTargetMessageContext <PlayerSelfSpawnEventPayload> > sender,
     [NotNull] IReadonlyEntityGuidMappable <IMovementData> movementDataMappable,
     [NotNull] IFactoryCreatable <FieldValueUpdate, EntityFieldUpdateCreationContext> entityDataUpdateFactory,
     [NotNull] IReadonlyEntityGuidMappable <IEntityDataFieldContainer> entityDataMappable)
     : base(subscriptionService)
 {
     Sender = sender ?? throw new ArgumentNullException(nameof(sender));
     MovementDataMappable    = movementDataMappable ?? throw new ArgumentNullException(nameof(movementDataMappable));
     EntityDataUpdateFactory = entityDataUpdateFactory ?? throw new ArgumentNullException(nameof(entityDataUpdateFactory));
     EntityDataMappable      = entityDataMappable ?? throw new ArgumentNullException(nameof(entityDataMappable));
 }
Beispiel #24
0
 /// <inheritdoc />
 public GameRemotePlayerWarpAckedSpawnEventListener(
     IRemoteClientAcknowledgedWarpEventSubscribable subscriptionService,
     [NotNull] IZoneSettings zoneSettings,
     [NotNull] ILog logger,
     [NotNull] IFactoryCreatable <GameObject, RemotePlayerWorldRepresentationCreationContext> remotePlayerFactory,
     IReadonlyEntityGuidMappable <PlayerZoneData> zoneDataMappable)
     : base(subscriptionService)
 {
     ZoneSettings        = zoneSettings ?? throw new ArgumentNullException(nameof(zoneSettings));
     Logger              = logger ?? throw new ArgumentNullException(nameof(logger));
     RemotePlayerFactory = remotePlayerFactory ?? throw new ArgumentNullException(nameof(remotePlayerFactory));
     ZoneDataMappable    = zoneDataMappable;
 }
Beispiel #25
0
 /// <inheritdoc />
 public EntityDataUpdateManager(
     IReadonlyEntityGuidMappable <IPeerPayloadSendService <GameServerPacketPayload> > sessionMappable,
     IReadonlyEntityGuidMappable <InterestCollection> guidToInterestCollectionMappable,
     IFactoryCreatable <FieldValueUpdate, EntityFieldUpdateCreationContext> updateFactory,
     IReadonlyEntityGuidMappable <IChangeTrackableEntityDataCollection> changeTrackingCollections,
     [NotNull] IReadonlyKnownEntitySet knownEntities)
 {
     SessionMappable = sessionMappable;
     GuidToInterestCollectionMappable = guidToInterestCollectionMappable;
     UpdateFactory             = updateFactory;
     ChangeTrackingCollections = changeTrackingCollections;
     KnownEntities             = knownEntities ?? throw new ArgumentNullException(nameof(knownEntities));
 }
 /// <inheritdoc />
 public MovementUpdateMessageHandler(
     ILog logger,
     [NotNull] IFactoryCreatable <IMovementGenerator <IWorldObject>, EntityAssociatedData <IMovementData> > movementGeneratorFactory,
     [NotNull] IEntityGuidMappable <IMovementGenerator <IWorldObject> > movementGeneratorMappable,
     [NotNull] IEntityGuidMappable <IMovementData> movementDataMappable,
     [NotNull] IKnownEntitySet knownEntities)
     : base(logger)
 {
     MovementGeneratorFactory  = movementGeneratorFactory ?? throw new ArgumentNullException(nameof(movementGeneratorFactory));
     MovementGeneratorMappable = movementGeneratorMappable ?? throw new ArgumentNullException(nameof(movementGeneratorMappable));
     MovementDataMappable      = movementDataMappable ?? throw new ArgumentNullException(nameof(movementDataMappable));
     KnownEntities             = knownEntities ?? throw new ArgumentNullException(nameof(knownEntities));
 }
 public ClientInitializeDefaultMovementGeneratorEventListener(IEntityWorldObjectCreatedEventSubscribable subscriptionService,
                                                              [NotNull] IEntityGuidMappable <IMovementGenerator <IWorldObject> > movementGeneratorMappable,
                                                              [NotNull] IFactoryCreatable <IMovementGenerator <IWorldObject>, EntityAssociatedData <IMovementData> > movementGeneratorFactory,
                                                              [NotNull] IReadonlyEntityGuidMappable <IMovementData> movementDataMappable,
                                                              [JetBrains.Annotations.NotNull] RsUnityClient client,
                                                              [JetBrains.Annotations.NotNull] IReadonlyNetworkTimeService timeService)
     : base(subscriptionService)
 {
     MovementGeneratorMappable = movementGeneratorMappable ?? throw new ArgumentNullException(nameof(movementGeneratorMappable));
     MovementGeneratorFactory  = movementGeneratorFactory ?? throw new ArgumentNullException(nameof(movementGeneratorFactory));
     MovementDataMappable      = movementDataMappable ?? throw new ArgumentNullException(nameof(movementDataMappable));
     Client      = client ?? throw new ArgumentNullException(nameof(client));
     TimeService = timeService ?? throw new ArgumentNullException(nameof(timeService));
 }
Beispiel #28
0
        public LocalPlayerSpawnedBroadcastTrackerStateChangesTickable(ILocalPlayerSpawnedEventSubscribable subscriptionService,
                                                                      [NotNull] ICameraInputChangedEventSubscribable cameraInputSubscriptionService,
                                                                      [NotNull] IFactoryCreatable <PlayerNetworkTrackerChangeUpdateRequest, NetworkMovementTrackerTypeFlags> networkTrackerUpdateFactory,
                                                                      [NotNull] IPeerPayloadSendService <GameClientPacketPayload> sendService)
            : base(subscriptionService)
        {
            if (cameraInputSubscriptionService == null)
            {
                throw new ArgumentNullException(nameof(cameraInputSubscriptionService));
            }

            NetworkTrackerUpdateFactory = networkTrackerUpdateFactory ?? throw new ArgumentNullException(nameof(networkTrackerUpdateFactory));
            SendService = sendService ?? throw new ArgumentNullException(nameof(sendService));
            cameraInputSubscriptionService.OnCameraInputChange += OnCameraInputChanged;
        }
        /// <inheritdoc />
        public PlayerEntityEntryManager(
            IPlayerSessionClaimedEventSubscribable subscriptionService,
            ISessionDisconnectionEventSubscribable disconnectionSubscriptionService,
            IFactoryCreatable <GameObject, PlayerEntityCreationContext> playerFactory,
            INetworkMessageSender <GenericSingleTargetMessageContext <PlayerSelfSpawnEventPayload> > spawnPayloadSender,
            ILog logger,
            GlobalEntityCollectionsLockingPolicy lockingPolicy)
            : base(subscriptionService, false, logger)
        {
            PlayerFactory      = playerFactory;
            SpawnPayloadSender = spawnPayloadSender;
            LockingPolicy      = lockingPolicy;

            disconnectionSubscriptionService.OnSessionDisconnection += OnSessionDisconnection;
        }
 /// <inheritdoc />
 public EntityDataUpdateManager(
     [NotNull] IPlayerEntityGuidEnumerable playerGuids,
     IReadonlyEntityGuidMappable <IPeerPayloadSendService <GameServerPacketPayload> > sessionMappable,
     IReadonlyEntityGuidMappable <InterestCollection> guidToInterestCollectionMappable,
     IFactoryCreatable <FieldValueUpdate, EntityFieldUpdateCreationContext> updateFactory,
     IReadonlyEntityGuidMappable <IChangeTrackableEntityDataCollection> changeTrackingCollections,
     [NotNull] GlobalEntityCollectionsLockingPolicy lockingPolicy)
 {
     PlayerGuids     = playerGuids ?? throw new ArgumentNullException(nameof(playerGuids));
     SessionMappable = sessionMappable;
     GuidToInterestCollectionMappable = guidToInterestCollectionMappable;
     UpdateFactory             = updateFactory;
     ChangeTrackingCollections = changeTrackingCollections;
     LockingPolicy             = lockingPolicy ?? throw new ArgumentNullException(nameof(lockingPolicy));
 }