using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using Networking.Server;
|
|
|
|
public class HomingMissile : Projectile
|
|
{
|
|
[SerializeField]
|
|
ClientList Clients;
|
|
|
|
|
|
|
|
public override IEnumerator ProjectileLogic(Character player, float animationTime, Vector3 direction)
|
|
{
|
|
|
|
Character target = findPlayer(player);
|
|
|
|
yield return StartCoroutine(LerpTo(transform.position + Vector3.up * 2, 0.5f));
|
|
yield return new WaitForSeconds(0.5f);
|
|
|
|
if (target != null)
|
|
{
|
|
yield return StartCoroutine(LerpTo(target.transform.position, 1f));
|
|
yield return PushPlayer(target);
|
|
}
|
|
}
|
|
|
|
private IEnumerator PushPlayer(Character player)
|
|
{
|
|
Direction[] possibleDirections = DirectionExtras.RandomOrder();
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
if (Block.isBlockAtPosition(player.CurrentBlock.position + possibleDirections[i].ToVector() + Vector3.up, 1, ~0))
|
|
continue;
|
|
|
|
Debug.Log("Pushing player " + possibleDirections[i]);
|
|
yield return StartCoroutine(player.CurrentBlock.DoPush(player, possibleDirections[i].ToVector()));
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
private Character findPlayer(Character thisCharacter)
|
|
{
|
|
Character retVal = null;
|
|
|
|
foreach (ClientData client in Clients)
|
|
{
|
|
if (client.Lives == 0 || client.playerCharacter.stuck || client.playerCharacter == thisCharacter)
|
|
continue;
|
|
|
|
if (retVal == null)
|
|
retVal = client.playerCharacter;
|
|
|
|
if (retVal.transform.position.x <= client.playerCharacter.transform.position.x)
|
|
retVal = client.playerCharacter;
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
private IEnumerator LerpTo(Vector3 endPosition,float animationTime)
|
|
{
|
|
Vector3 startPosition = transform.position;
|
|
float elapsedTime = 0;
|
|
|
|
while (elapsedTime < animationTime)
|
|
{
|
|
|
|
transform.position = Vector3.Lerp(startPosition, endPosition, elapsedTime / animationTime);
|
|
transform.LookAt(endPosition, Vector3.up);
|
|
yield return new WaitForEndOfFrame();
|
|
elapsedTime += Time.deltaTime;
|
|
|
|
|
|
}
|
|
|
|
transform.position = endPosition;
|
|
|
|
}
|
|
}
|