public float GoTo(Vector3 position) { IsActionLocked = true; Timing.KillCoroutines(MovementCoroutines.ToArray()); Vector3 heading = (position - NPCPlayer.Position); heading.y = 0; Quaternion lookRot = Quaternion.LookRotation(heading.normalized); float dist = heading.magnitude; NPCPlayer.Rotations = new Vector2(lookRot.eulerAngles.x, lookRot.eulerAngles.y); Move(MovementDirection.FORWARD); float eta = Plugin.Instance.Config.MovementUpdateFrequency * (dist / (NPCPlayer.CameraTransform.forward / 10 * MovementSpeed).magnitude); position.y = NPCPlayer.Position.y; MovementCoroutines.Add(Timing.CallDelayed(eta, () => { Move(MovementDirection.NONE); if (Vector3.Distance(NPCPlayer.Position, position) >= 2f) { NPCPlayer.ReferenceHub.playerMovementSync.OverridePosition(position, 0f, true); } IsActionLocked = false; })); return(eta); }