|
|
@ -0,0 +1,82 @@ |
|
|
|
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.transform.position + possibleDirections[i].ToVector() + Vector3.up, 1, ~0)) |
|
|
|
continue; |
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
} |