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.

82 lines
2.2 KiB

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