コード例 #1
0
        private void OnForcedRotation(RotationUpdate forcedRotation)
        {
            var newPitch = Mathf.Clamp(forcedRotation.Pitch.ToFloat1k(), -cameraSettings.MaxPitch,
                                       -cameraSettings.MinPitch);

            pitchTransform.localRotation = Quaternion.Euler(newPitch, 0, 0);
        }
コード例 #2
0
        private void OnClientUpdate(RotationUpdate rotation)
        {
            var x = rotationConstraints.XAxisRotation ? rotation.Pitch.ToFloat1k() : 0;
            var y = rotationConstraints.YAxisRotation ? rotation.Yaw.ToFloat1k() : 0;
            var z = rotationConstraints.ZAxisRotation ? rotation.Roll.ToFloat1k() : 0;

            UpdateRotation(Quaternion.Euler(x, y, z), rotation.TimeDelta);
        }
コード例 #3
0
ファイル: RotationUpdate.cs プロジェクト: thijser/ARGAME
        /// <summary>
        /// Tests whether this RotationUpdate is equal to the given object
        /// </summary>
        /// <param name="obj">The object to test against.</param>
        /// <returns>True if this RotationObject is equal to <c>obj</c>, false otherwise.</returns>
        public override bool Equals(object obj)
        {
            RotationUpdate that = obj as RotationUpdate;

            if (that == null)
            {
                return(false);
            }

            return(this.Id == that.Id && this.Rotation == that.Rotation);
        }
コード例 #4
0
        /// <summary>
        /// Sends a message with the current rotation of the selected mirror.
        /// <para>
        /// The selected mirror should not be null.
        /// </para>
        /// </summary>
        public void SendRotationUpdate()
        {
            Assert.IsNotNull(this.SelectedMirror, "SendRotationUpdate: No Mirror Selected");
            RemoteMarker marker   = this.SelectedMirror.GetComponent <RemoteMarker>();
            float        rotation = marker.ObjectRotation;

            RotationUpdate update = new RotationUpdate(UpdateType.UpdateRotation, rotation, marker.Id);

            this.SendMessage("OnRotationChanged", update);
            this.SendMessage("OnRotationUpdate", update);
        }
コード例 #5
0
        public static EntityTemplate Player(string workerId, Vector3f position)
        {
            const string gameLogic = WorkerUtils.UnityGameLogic;
            var          client    = $"workerId:{workerId}";

            var(spawnPosition, spawnYaw, spawnPitch) = SpawnPoints.GetRandomSpawnPoint();

            var serverResponse = new ServerResponse
            {
                Position = spawnPosition.ToIntAbsolute()
            };

            var serverMovement     = ServerMovement.Component.CreateSchemaComponentData(serverResponse);
            var clientMovementData = new ClientRequest();
            var rotationUpdate     = new RotationUpdate
            {
                Yaw   = spawnYaw.ToInt1k(),
                Pitch = spawnPitch.ToInt1k()
            };
            var clientMovement    = ClientMovement.Component.CreateSchemaComponentData(clientMovementData);
            var clientRotation    = ClientRotation.Component.CreateSchemaComponentData(rotationUpdate);
            var shootingComponent = ShootingComponent.Component.CreateSchemaComponentData();
            var gunStateComponent = GunStateComponent.Component.CreateSchemaComponentData(false);
            var gunComponent      = GunComponent.Component.CreateSchemaComponentData(PlayerGunSettings.DefaultGunIndex);
            var maxHealth         = PlayerHealthSettings.MaxHealth;

            var healthComponent      = HealthComponent.Component.CreateSchemaComponentData(maxHealth, maxHealth);
            var healthRegenComponent = HealthRegenComponent.Component.CreateSchemaComponentData(false,
                                                                                                0,
                                                                                                PlayerHealthSettings.SpatialCooldownSyncInterval,
                                                                                                PlayerHealthSettings.RegenAfterDamageCooldown,
                                                                                                PlayerHealthSettings.RegenInterval,
                                                                                                PlayerHealthSettings.RegenAmount);

            return(EntityBuilder.Begin()
                   .AddPosition(spawnPosition.x, spawnPosition.y, spawnPosition.z, gameLogic)
                   .AddMetadata("Player", gameLogic)
                   .SetPersistence(false)
                   .SetReadAcl(AllWorkerAttributes)
                   .AddComponent(serverMovement, gameLogic)
                   .AddComponent(clientMovement, client)
                   .AddComponent(clientRotation, client)
                   .AddComponent(shootingComponent, client)
                   .AddComponent(gunComponent, gameLogic)
                   .AddComponent(gunStateComponent, client)
                   .AddComponent(healthComponent, gameLogic)
                   .AddComponent(healthRegenComponent, gameLogic)
                   .AddPlayerLifecycleComponents(workerId, client, gameLogic)
                   .Build());
        }
コード例 #6
0
        private void OnRequestRespawn(HealthComponent.RequestRespawn.RequestResponder request)
        {
            // Reset the player's health.
            var healthUpdate = new HealthComponent.Update
            {
                Health = health.Data.MaxHealth
            };

            health.Send(healthUpdate);

            // Move to a spawn point (position and rotation)
            var(spawnPosition, spawnYaw, spawnPitch) = SpawnPoints.GetRandomSpawnPoint();
            var newLatest = new ServerResponse
            {
                Position     = spawnPosition.ToIntAbsolute(),
                IncludesJump = false,
                Timestamp    = serverMovement.Data.Latest.Timestamp,
                TimeDelta    = 0
            };

            var serverMovementUpdate = new ServerMovement.Update
            {
                Latest = newLatest
            };

            serverMovement.Send(serverMovementUpdate);

            // Update the spatial position on respawn.
            var spatialPositionUpdate = new Position.Update
            {
                Coords = spawnPosition.ToSpatialCoordinates()
            };

            spatialPosition.Send(spatialPositionUpdate);

            transform.position = spawnPosition + spatial.Worker.Origin;

            var forceRotationRequest = new RotationUpdate
            {
                Yaw       = spawnYaw.ToInt1k(),
                Pitch     = spawnPitch.ToInt1k(),
                TimeDelta = 0
            };

            serverMovement.SendForcedRotation(forceRotationRequest);

            // Trigger the respawn event.
            health.SendRespawn(new Empty());
        }
コード例 #7
0
        private void OnRotation(RotationUpdate rotation)
        {
            var pitch = rotation.Pitch.ToFloat1k();

            if (pitch < -180)
            {
                pitch += 360;
            }

            if (pitch > 180)
            {
                pitch -= 360;
            }

            // AnimController treats negative pitch as pointing downwards
            fpsAnimator.SetPitch(-pitch);
        }
コード例 #8
0
        private void OnRequestRespawn(HealthComponent.RequestRespawn.ReceivedRequest request)
        {
            // Reset the player's health.
            var healthUpdate = new HealthComponent.Update
            {
                Health = health.Data.MaxHealth
            };

            health.SendUpdate(healthUpdate);

            // Move to a spawn point (position and rotation)
            var(spawnPosition, spawnYaw, spawnPitch) = Respawning.SpawnPoints.GetRandomSpawnPoint();
            var newLatest = new ServerResponse
            {
                Position     = spawnPosition.ToVector3Int(),
                IncludesJump = false,
                Timestamp    = serverMovement.Data.Latest.Timestamp,
                TimeDelta    = 0
            };

            var serverMovementUpdate = new ServerMovement.Update
            {
                Latest = newLatest
            };

            serverMovement.SendUpdate(serverMovementUpdate);

            transform.position = spawnPosition + spatial.Worker.Origin;

            var forceRotationRequest = new RotationUpdate
            {
                Yaw       = spawnYaw.ToInt1k(),
                Pitch     = spawnPitch.ToInt1k(),
                TimeDelta = 0
            };

            serverMovement.SendForcedRotationEvent(forceRotationRequest);

            // Trigger the respawn event.
            health.SendRespawnEvent(new Empty());

            // Update spatial position in the next frame.
            StartCoroutine(SetSpatialPosition(spawnPosition));
        }
コード例 #9
0
 private void OnRotation(RotationUpdate rotation)
 {
     fpsAnimator.SetPitch(rotation.Pitch.ToFloat1k());
 }
コード例 #10
0
ファイル: Logger.cs プロジェクト: thijser/ARGAME
 public void OnRotationUpdate(RotationUpdate update)
 {
     WriteLog(string.Format("marker #{0} rotated to {1}", update.Id, update.Rotation));
 }
コード例 #11
0
        public static EntityTemplate PolEntity(Vector3f position, uint tribe)
        {
            var metadata = new Metadata.Snapshot {
                EntityType = "PolEntity"
            };


            var rotationUpdate = new RotationUpdate
            {
                Yaw   = 0,
                Pitch = 0
            };

            var serverResponse = new ServerResponse
            {
                Position = position.ToUnityVector3().ToIntAbsolute()
            };

            var template = new EntityTemplate();

            template.AddComponent(new Position.Snapshot(new Coordinates(position.X, position.Y, position.Z)), WorkerUtils.UnityGameLogic);
            template.AddComponent(metadata, WorkerUtils.UnityGameLogic);
            var clientRotation = new ClientRotation.Snapshot {
                Latest = rotationUpdate
            };

            template.AddComponent(new Persistence.Snapshot(), WorkerUtils.UnityGameLogic);
            template.AddComponent(new Pol.PolEntityData.Snapshot(true, tribe, 1, Behaviors.Behavior1), WorkerUtils.UnityGameLogic);
            var serverMovement = new ServerMovement.Snapshot {
                Latest = serverResponse
            };
            var clientMovement = new ClientMovement.Snapshot {
                Latest = new ClientRequest()
            };

            template.SetReadAccess(WorkerUtils.UnityGameLogic, WorkerUtils.UnityClient);
            template.SetComponentWriteAccess(EntityAcl.ComponentId, WorkerUtils.UnityGameLogic);

            var playerInterest = new ComponentInterest
            {
                Queries = new List <ComponentInterest.Query>
                {
                    new ComponentInterest.Query
                    {
                        Constraint = new ComponentInterest.QueryConstraint
                        {
                            ComponentConstraint = Pol.PolController.ComponentId,
                            AndConstraint       = new List <ComponentInterest.QueryConstraint>(),
                            OrConstraint        = new List <ComponentInterest.QueryConstraint>()
                        }, FullSnapshotResult = true,
                        ResultComponentId     = new List <uint>(),
                    }
                }
            };

            var interestComponent = new Interest.Snapshot
            {
                ComponentInterest = new Dictionary <uint, ComponentInterest>
                {
                    { PolEntityData.ComponentId, playerInterest },
                },
            };

            template.AddComponent(interestComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(serverMovement, WorkerUtils.UnityGameLogic);
            template.AddComponent(clientMovement, WorkerUtils.UnityGameLogic);
            template.AddComponent(clientRotation, WorkerUtils.UnityGameLogic);

            return(template);
        }
コード例 #12
0
ファイル: MarkerHolder.cs プロジェクト: thijser/ARGAME
 /// <summary>
 /// Applies the <see cref="RotationUpdate"/> to the corresponding <see cref="Marker"/>
 /// in this <see cref="MarkerHolder"/>.
 /// </summary>
 /// <param name="update">The <see cref="RotationUpdate"/>, not null.</param>
 public virtual void OnRotationUpdate(RotationUpdate update)
 {
     Assert.IsNotNull(update);
     this.GetMarkerOrCreate(update.Id).ObjectRotation = update.Rotation;
 }
        public static EntityTemplate Player(string workerId, byte[] args)
        {
            var client = EntityTemplate.GetWorkerAccessAttribute(workerId);

            var(spawnPosition, spawnYaw, spawnPitch) = SpawnPoints.GetRandomSpawnPoint();

            var serverResponse = new ServerResponse
            {
                Position = spawnPosition.ToIntAbsolute()
            };

            var rotationUpdate = new RotationUpdate
            {
                Yaw   = spawnYaw.ToInt1k(),
                Pitch = spawnPitch.ToInt1k()
            };

            var pos = new Position.Snapshot {
                Coords = spawnPosition.ToSpatialCoordinates()
            };
            var serverMovement = new ServerMovement.Snapshot {
                Latest = serverResponse
            };
            var clientMovement = new ClientMovement.Snapshot {
                Latest = new ClientRequest()
            };
            var clientRotation = new ClientRotation.Snapshot {
                Latest = rotationUpdate
            };
            var shootingComponent = new ShootingComponent.Snapshot();
            var gunComponent      = new GunComponent.Snapshot {
                GunId = PlayerGunSettings.DefaultGunIndex
            };
            var gunStateComponent = new GunStateComponent.Snapshot {
                IsAiming = false
            };
            var healthComponent = new HealthComponent.Snapshot
            {
                Health    = PlayerHealthSettings.MaxHealth,
                MaxHealth = PlayerHealthSettings.MaxHealth,
            };

            var healthRegenComponent = new HealthRegenComponent.Snapshot
            {
                CooldownSyncInterval = PlayerHealthSettings.SpatialCooldownSyncInterval,
                DamagedRecently      = false,
                RegenAmount          = PlayerHealthSettings.RegenAmount,
                RegenCooldownTimer   = PlayerHealthSettings.RegenAfterDamageCooldown,
                RegenInterval        = PlayerHealthSettings.RegenInterval,
                RegenPauseTime       = 0,
            };

            var template = new EntityTemplate();

            template.AddComponent(pos, WorkerUtils.UnityGameLogic);
            template.AddComponent(new Metadata.Snapshot {
                EntityType = "Player"
            }, WorkerUtils.UnityGameLogic);
            template.AddComponent(serverMovement, WorkerUtils.UnityGameLogic);
            template.AddComponent(clientMovement, client);
            template.AddComponent(clientRotation, client);
            template.AddComponent(shootingComponent, client);
            template.AddComponent(gunComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(gunStateComponent, client);
            template.AddComponent(healthComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(healthRegenComponent, WorkerUtils.UnityGameLogic);
            PlayerLifecycleHelper.AddPlayerLifecycleComponents(template, workerId, WorkerUtils.UnityGameLogic);

            template.SetReadAccess(WorkerUtils.UnityClient, WorkerUtils.UnityGameLogic, WorkerUtils.AndroidClient, WorkerUtils.iOSClient);
            template.SetComponentWriteAccess(EntityAcl.ComponentId, WorkerUtils.UnityGameLogic);

            return(template);
        }
コード例 #14
0
        public static EntityTemplate Player(string workerId, byte[] args)
        {
            var client = EntityTemplate.GetWorkerAccessAttribute(workerId);

            var(spawnPosition, spawnYaw, spawnPitch) = SpawnPoints.GetRandomSpawnPoint();

            var serverResponse = new ServerResponse
            {
                Position = spawnPosition.ToIntAbsolute()
            };

            var rotationUpdate = new RotationUpdate
            {
                Yaw   = spawnYaw.ToInt1k(),
                Pitch = spawnPitch.ToInt1k()
            };

            var pos = new Position.Snapshot {
                Coords = spawnPosition.ToSpatialCoordinates()
            };
            var serverMovement = new ServerMovement.Snapshot {
                Latest = serverResponse
            };
            var clientMovement = new ClientMovement.Snapshot {
                Latest = new ClientRequest()
            };
            var clientRotation = new ClientRotation.Snapshot {
                Latest = rotationUpdate
            };
            var shootingComponent = new ShootingComponent.Snapshot();
            var gunComponent      = new GunComponent.Snapshot {
                GunId = PlayerGunSettings.DefaultGunIndex
            };
            var gunStateComponent = new GunStateComponent.Snapshot {
                IsAiming = false
            };
            var healthComponent = new HealthComponent.Snapshot
            {
                Health    = PlayerHealthSettings.MaxHealth,
                MaxHealth = PlayerHealthSettings.MaxHealth,
            };

            var healthRegenComponent = new HealthRegenComponent.Snapshot
            {
                CooldownSyncInterval = PlayerHealthSettings.SpatialCooldownSyncInterval,
                DamagedRecently      = false,
                RegenAmount          = PlayerHealthSettings.RegenAmount,
                RegenCooldownTimer   = PlayerHealthSettings.RegenAfterDamageCooldown,
                RegenInterval        = PlayerHealthSettings.RegenInterval,
                RegenPauseTime       = 0,
            };

            var sessionQuery  = InterestQuery.Query(Constraint.Component <Session.Component>());
            var checkoutQuery = InterestQuery.Query(Constraint.RelativeCylinder(150));

            var interestTemplate  = InterestTemplate.Create().AddQueries <ClientMovement.Component>(sessionQuery, checkoutQuery);
            var interestComponent = interestTemplate.ToSnapshot();

            var playerName = Encoding.ASCII.GetString(args);

            var playerStateComponent = new PlayerState.Snapshot
            {
                Name   = playerName,
                Kills  = 0,
                Deaths = 0,
            };


            var playerResComponent      = new Pickups.PlayerRes.Snapshot(0);
            var soldierManagerComponent = new Soldiers.SoldierManager.Snapshot();


            var template = new EntityTemplate();

            template.AddComponent(pos, WorkerUtils.UnityGameLogic);
            template.AddComponent(new Metadata.Snapshot {
                EntityType = "Player"
            }, WorkerUtils.UnityGameLogic);
            template.AddComponent(serverMovement, WorkerUtils.UnityGameLogic);
            template.AddComponent(clientMovement, client);
            template.AddComponent(clientRotation, client);

            template.AddComponent(shootingComponent, client);
            template.AddComponent(gunComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(gunStateComponent, client);
            template.AddComponent(healthComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(healthRegenComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(playerStateComponent, WorkerUtils.UnityGameLogic);

            template.AddComponent(interestComponent, WorkerUtils.UnityGameLogic);

            template.AddComponent(playerResComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(soldierManagerComponent, WorkerUtils.UnityGameLogic);


            PlayerLifecycleHelper.AddPlayerLifecycleComponents(template, workerId, WorkerUtils.UnityGameLogic);

            template.SetReadAccess(WorkerUtils.UnityClient, WorkerUtils.UnityGameLogic, WorkerUtils.MobileClient);
            template.SetComponentWriteAccess(EntityAcl.ComponentId, WorkerUtils.UnityGameLogic);

            return(template);
        }
コード例 #15
0
        public static EntityTemplate Soldier(Vector3f position, long ownentityid)
        {
            var healthComponent = new HealthComponent.Snapshot
            {
                Health    = PlayerHealthSettings.MaxHealth,
                MaxHealth = PlayerHealthSettings.MaxHealth,
            };

            var healthRegenComponent = new HealthRegenComponent.Snapshot
            {
                CooldownSyncInterval = PlayerHealthSettings.SpatialCooldownSyncInterval,
                DamagedRecently      = false,
                RegenAmount          = PlayerHealthSettings.RegenAmount,
                RegenCooldownTimer   = PlayerHealthSettings.RegenAfterDamageCooldown,
                RegenInterval        = PlayerHealthSettings.RegenInterval,
                RegenPauseTime       = 0,
            };


            var playerStateComponent = new PlayerState.Snapshot
            {
                Name   = "Soldier",
                Kills  = 0,
                Deaths = 0,
            };


            var serverResponse = new ServerResponse
            {
                Position = position.ToUnityVector3().ToIntAbsolute()
            };

            var rotationUpdate = new RotationUpdate
            {
                Yaw   = 0,
                Pitch = 0
            };

            var soldierData = new SoldierData.Snapshot
            {
                OwnEntityId = ownentityid
            };


            var serverMovement = new ServerMovement.Snapshot {
                Latest = serverResponse
            };
            var clientMovement = new ClientMovement.Snapshot {
                Latest = new ClientRequest()
            };
            var clientRotation = new ClientRotation.Snapshot {
                Latest = rotationUpdate
            };


            var shootingComponent = new ShootingComponent.Snapshot();
            var gunComponent      = new GunComponent.Snapshot {
                GunId = PlayerGunSettings.DefaultGunIndex
            };
            var gunStateComponent = new GunStateComponent.Snapshot {
                IsAiming = false
            };


            var entityTemplate = new EntityTemplate();

            entityTemplate.AddComponent(new Position.Snapshot(new Coordinates(position.X, position.Y, position.Z)), WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(new Metadata.Snapshot("Soldier"), WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(new Persistence.Snapshot(), WorkerUtils.UnityGameLogic);

            entityTemplate.AddComponent(shootingComponent, WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(gunComponent, WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(gunStateComponent, WorkerUtils.UnityGameLogic);

            entityTemplate.AddComponent(healthComponent, WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(healthRegenComponent, WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(playerStateComponent, WorkerUtils.UnityGameLogic);


            entityTemplate.AddComponent(serverMovement, WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(clientMovement, WorkerUtils.UnityGameLogic);
            entityTemplate.AddComponent(clientRotation, WorkerUtils.UnityGameLogic);

            entityTemplate.AddComponent(soldierData, WorkerUtils.UnityGameLogic);



            entityTemplate.SetReadAccess(WorkerUtils.UnityGameLogic, WorkerUtils.UnityClient);
            entityTemplate.SetComponentWriteAccess(EntityAcl.ComponentId, WorkerUtils.UnityGameLogic);
            return(entityTemplate);
        }
コード例 #16
0
 private void SaveRotationUpdate(RotationUpdate rotationUpdate)
 {
     SaveInterpolationUpdate(ref rotationInterpolationRoot, ref rotationUpdates, ref timeDifferentialToRotationSender, new InterpolationData <float>(rotationUpdate.yaw, rotationUpdate.timestamp));
 }
コード例 #17
0
        public static EntityTemplate Player(EntityId entityId, string workerId, byte[] args)
        {
            var client = EntityTemplate.GetWorkerAccessAttribute(workerId);

            var(spawnPosition, spawnYaw, spawnPitch) = SpawnPoints.GetRandomSpawnPoint();

            var serverResponse = new ServerResponse
            {
                Position = spawnPosition.ToVector3Int()
            };

            var rotationUpdate = new RotationUpdate
            {
                Yaw   = spawnYaw.ToInt1k(),
                Pitch = spawnPitch.ToInt1k()
            };

            var pos = new Position.Snapshot {
                Coords = Coordinates.FromUnityVector(spawnPosition)
            };
            var serverMovement = new ServerMovement.Snapshot {
                Latest = serverResponse
            };
            var clientMovement = new ClientMovement.Snapshot {
                Latest = new ClientRequest()
            };
            var clientRotation = new ClientRotation.Snapshot {
                Latest = rotationUpdate
            };
            var shootingComponent = new ShootingComponent.Snapshot();
            var gunComponent      = new GunComponent.Snapshot {
                GunId = PlayerGunSettings.DefaultGunIndex
            };
            var gunStateComponent = new GunStateComponent.Snapshot {
                IsAiming = false
            };
            var healthComponent = new HealthComponent.Snapshot
            {
                Health    = PlayerHealthSettings.MaxHealth,
                MaxHealth = PlayerHealthSettings.MaxHealth,
            };

            var healthRegenComponent = new HealthRegenComponent.Snapshot
            {
                CooldownSyncInterval = PlayerHealthSettings.SpatialCooldownSyncInterval,
                DamagedRecently      = false,
                RegenAmount          = PlayerHealthSettings.RegenAmount,
                RegenCooldownTimer   = PlayerHealthSettings.RegenAfterDamageCooldown,
                RegenInterval        = PlayerHealthSettings.RegenInterval,
                RegenPauseTime       = 0,
            };

            var template = new EntityTemplate();

            template.AddComponent(pos, WorkerUtils.UnityGameLogic);
            template.AddComponent(new Metadata.Snapshot {
                EntityType = "Player"
            }, WorkerUtils.UnityGameLogic);
            template.AddComponent(serverMovement, WorkerUtils.UnityGameLogic);
            template.AddComponent(clientMovement, client);
            template.AddComponent(clientRotation, client);
            template.AddComponent(shootingComponent, client);
            template.AddComponent(gunComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(gunStateComponent, client);
            template.AddComponent(healthComponent, WorkerUtils.UnityGameLogic);
            template.AddComponent(healthRegenComponent, WorkerUtils.UnityGameLogic);

            PlayerLifecycleHelper.AddPlayerLifecycleComponents(template, workerId, WorkerUtils.UnityGameLogic);

            const int serverRadius = 150;
            var       clientRadius = workerId.Contains(WorkerUtils.MobileClient) ? 60 : 150;

            // Position, Metadata, OwningWorker and ServerMovement are included in all queries, since these
            // components are required by the GameObject creator.

            // HealthComponent is needed by the LookAtRagdoll script for respawn behaviour.
            // GunComponent is needed by the GunManager script.
            var clientSelfInterest = InterestQuery.Query(Constraint.EntityId(entityId)).FilterResults(new[]
            {
                Position.ComponentId, Metadata.ComponentId, OwningWorker.ComponentId,
                ServerMovement.ComponentId, HealthComponent.ComponentId, GunComponent.ComponentId
            });

            // ClientRotation is used for rendering other players.
            // GunComponent is required by the GunManager script.
            // GunStateComponent and ShootingComponent are needed for rendering other players' shots.
            var clientRangeInterest = InterestQuery.Query(Constraint.RelativeCylinder(clientRadius)).FilterResults(new[]
            {
                Position.ComponentId, Metadata.ComponentId, OwningWorker.ComponentId,
                ServerMovement.ComponentId, ClientRotation.ComponentId, HealthComponent.ComponentId,
                GunComponent.ComponentId, GunStateComponent.ComponentId, ShootingComponent.ComponentId
            });

            // ClientMovement is used by the ServerMovementDriver script.
            // ShootingComponent is used by the ServerShootingSystem.
            var serverSelfInterest = InterestQuery.Query(Constraint.EntityId(entityId)).FilterResults(new[]
            {
                ClientMovement.ComponentId, ShootingComponent.ComponentId
            });

            // ClientRotation is used for driving player proxies.
            // HealthComponent is required by the VisiblityAndCollision script.
            // ShootingComponent is used by the ServerShootingSystem.
            var serverRangeInterest = InterestQuery.Query(Constraint.RelativeCylinder(serverRadius)).FilterResults(new[]
            {
                Position.ComponentId, Metadata.ComponentId, OwningWorker.ComponentId,
                ServerMovement.ComponentId, ClientRotation.ComponentId, HealthComponent.ComponentId,
                ShootingComponent.ComponentId
            });

            var interest = InterestTemplate.Create()
                           .AddQueries <ClientMovement.Component>(clientSelfInterest, clientRangeInterest)
                           .AddQueries <ServerMovement.Component>(serverSelfInterest, serverRangeInterest);

            template.AddComponent(interest.ToSnapshot());

            template.SetReadAccess(WorkerUtils.UnityClient, WorkerUtils.UnityGameLogic, WorkerUtils.MobileClient);

            return(template);
        }