protected void UpdateKinematics(ITransformComponent transform, IMoverComponent mover, IPhysicsComponent physics, ICollidableComponent?collider = null) { physics.EnsureController <MoverController>(); var weightless = !transform.Owner.HasComponent <MovementIgnoreGravityComponent>() && _physicsManager.IsWeightless(transform.GridPosition); if (weightless && collider != null) { // No gravity: is our entity touching anything? var touching = IsAroundCollider(transform, mover, collider); if (!touching) { return; } } // TODO: movement check. var(walkDir, sprintDir) = mover.VelocityDir; var combined = walkDir + sprintDir; if (combined.LengthSquared < 0.001 || !ActionBlockerSystem.CanMove(mover.Owner) && !weightless) { if (physics.TryGetController(out MoverController controller)) { controller.StopMoving(); } } else { //Console.WriteLine($"{IoCManager.Resolve<IGameTiming>().TickStamp}: {combined}"); if (weightless) { if (physics.TryGetController(out MoverController controller)) { controller.Push(combined, mover.CurrentPushSpeed); } transform.LocalRotation = walkDir.GetDir().ToAngle(); return; } var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed; //Console.WriteLine($"{walkDir} ({mover.CurrentWalkSpeed}) + {sprintDir} ({mover.CurrentSprintSpeed}): {total}"); { if (physics.TryGetController(out MoverController controller)) { controller.Move(total, 1); } } transform.LocalRotation = total.GetDir().ToAngle(); HandleFootsteps(mover); } }
protected void UpdateKinematics(ITransformComponent transform, IMoverComponent mover, IPhysicsComponent physics) { physics.EnsureController <MoverController>(); var weightless = transform.Owner.IsWeightless(); if (weightless) { // No gravity: is our entity touching anything? var touching = IsAroundCollider(transform, mover, physics); if (!touching) { transform.LocalRotation = physics.LinearVelocity.GetDir().ToAngle(); return; } } // TODO: movement check. var(walkDir, sprintDir) = mover.VelocityDir; var combined = walkDir + sprintDir; if (combined.LengthSquared < 0.001 || !ActionBlockerSystem.CanMove(mover.Owner) && !weightless) { if (physics.TryGetController(out MoverController controller)) { controller.StopMoving(); } } else { if (weightless) { if (physics.TryGetController(out MoverController controller)) { controller.Push(combined, mover.CurrentPushSpeed); } transform.LocalRotation = physics.LinearVelocity.GetDir().ToAngle(); return; } var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed; { if (physics.TryGetController(out MoverController controller)) { controller.Move(total, 1); } } transform.LocalRotation = total.GetDir().ToAngle(); HandleFootsteps(mover); } }