private void OnForcedRotation(RotationUpdate forcedRotation) { var newPitch = Mathf.Clamp(forcedRotation.Pitch.ToFloat1k(), -cameraSettings.MaxPitch, -cameraSettings.MinPitch); pitchTransform.localRotation = Quaternion.Euler(newPitch, 0, 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); }
/// <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); }
/// <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); }
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()); }
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()); }
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); }
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)); }
private void OnRotation(RotationUpdate rotation) { fpsAnimator.SetPitch(rotation.Pitch.ToFloat1k()); }
public void OnRotationUpdate(RotationUpdate update) { WriteLog(string.Format("marker #{0} rotated to {1}", update.Id, update.Rotation)); }
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); }
/// <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); }
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); }
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); }
private void SaveRotationUpdate(RotationUpdate rotationUpdate) { SaveInterpolationUpdate(ref rotationInterpolationRoot, ref rotationUpdates, ref timeDifferentialToRotationSender, new InterpolationData <float>(rotationUpdate.yaw, rotationUpdate.timestamp)); }
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); }