You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.2 KiB

  1. using System.Collections;
  2. using UnityEngine;
  3. using Networking.Server;
  4. public class HomingMissile : Projectile
  5. {
  6. [SerializeField]
  7. ClientList Clients;
  8. public override IEnumerator ProjectileLogic(Character player, float animationTime, Vector3 direction)
  9. {
  10. Character target = findPlayer(player);
  11. yield return StartCoroutine(LerpTo(transform.position + Vector3.up * 2, 0.5f));
  12. yield return new WaitForSeconds(0.5f);
  13. if (target != null)
  14. {
  15. yield return StartCoroutine(LerpTo(target.transform.position, 1f));
  16. yield return PushPlayer(target);
  17. }
  18. }
  19. private IEnumerator PushPlayer(Character player)
  20. {
  21. Direction[] possibleDirections = DirectionExtras.RandomOrder();
  22. for (int i = 0; i < 4; i++)
  23. {
  24. if (Block.isBlockAtPosition(player.CurrentBlock.position + possibleDirections[i].ToVector() + Vector3.up, 1, ~0))
  25. continue;
  26. Debug.Log("Pushing player " + possibleDirections[i]);
  27. yield return StartCoroutine(player.CurrentBlock.DoPush(player, possibleDirections[i].ToVector()));
  28. break;
  29. }
  30. }
  31. private Character findPlayer(Character thisCharacter)
  32. {
  33. Character retVal = null;
  34. foreach (ClientData client in Clients)
  35. {
  36. if (client.Lives == 0 || client.playerCharacter.stuck || client.playerCharacter == thisCharacter)
  37. continue;
  38. if (retVal == null)
  39. retVal = client.playerCharacter;
  40. if (retVal.transform.position.x <= client.playerCharacter.transform.position.x)
  41. retVal = client.playerCharacter;
  42. }
  43. return retVal;
  44. }
  45. private IEnumerator LerpTo(Vector3 endPosition,float animationTime)
  46. {
  47. Vector3 startPosition = transform.position;
  48. float elapsedTime = 0;
  49. while (elapsedTime < animationTime)
  50. {
  51. transform.position = Vector3.Lerp(startPosition, endPosition, elapsedTime / animationTime);
  52. transform.LookAt(endPosition, Vector3.up);
  53. yield return new WaitForEndOfFrame();
  54. elapsedTime += Time.deltaTime;
  55. }
  56. transform.position = endPosition;
  57. }
  58. }