134 lines
4.8 KiB
C#
134 lines
4.8 KiB
C#
using GamePath;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.Remoting.Messaging;
|
|
using UnityEngine;
|
|
|
|
public class EAIFollowPlayer : EAIApproachAndAttackTarget
|
|
{
|
|
private readonly List<Entity> NearbyEntities = new List<Entity>();
|
|
private EntityAlive entityTarget;
|
|
private Vector3 entityTargetPos;
|
|
private Vector3 entityTargetVel;
|
|
|
|
public bool isTargetToEat;
|
|
private bool isEating;
|
|
private float homeTimeout;
|
|
private bool hasHome;
|
|
private bool isGoingHome;
|
|
private int pathCounter;
|
|
private float chaseTimeMax;
|
|
private int relocateTicks;
|
|
private int attackTimeout;
|
|
|
|
public override bool CanExecute()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override void Start()
|
|
{
|
|
if (entityTarget != null)
|
|
{
|
|
this.entityTargetPos = this.entityTarget.position;
|
|
this.isTargetToEat = this.entityTarget.IsDead();
|
|
}
|
|
this.entityTargetVel = Vector3.zero;
|
|
this.isEating = false;
|
|
this.theEntity.IsEating = false;
|
|
this.homeTimeout = (this.theEntity.IsSleeper ? 90f : this.chaseTimeMax);
|
|
this.hasHome = (this.homeTimeout > 0f);
|
|
this.isGoingHome = false;
|
|
if (this.theEntity.ChaseReturnLocation == Vector3.zero)
|
|
{
|
|
this.theEntity.ChaseReturnLocation = (this.theEntity.IsSleeper ? this.theEntity.SleeperSpawnPosition : this.theEntity.position);
|
|
}
|
|
this.pathCounter = 0;
|
|
this.relocateTicks = 0;
|
|
this.attackTimeout = 5;
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
//Log.Out("EAIFollowPlayer-Update START");
|
|
// No entity, so no need to do anything.
|
|
if (entityTarget == null)
|
|
{
|
|
Log.Out("EAIFollowPlayer-Update entityTarget == null");
|
|
EntityPlayer closestPlayer = null;
|
|
float num = 200 * 200;
|
|
float num2 = float.MaxValue;
|
|
for (int i = this.theEntity.world.Players.list.Count - 1; i >= 0; i--)
|
|
{
|
|
EntityPlayer entityPlayer = this.theEntity.world.Players.list[i];
|
|
if (!entityPlayer.IsDead() && entityPlayer.Spawned)
|
|
{
|
|
//Log.Out("FOUND PLAYER: " + entityPlayer.EntityName);
|
|
float distanceSq = entityPlayer.GetDistanceSq(this.theEntity.position);
|
|
if (distanceSq < num2 && distanceSq <= num)
|
|
{
|
|
num2 = distanceSq;
|
|
closestPlayer = entityPlayer;
|
|
}
|
|
}
|
|
}
|
|
if (closestPlayer != null)
|
|
{
|
|
entityTarget = closestPlayer;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
entityTargetPos = entityTarget.position;
|
|
}
|
|
|
|
// Let the entity keep looking at you, otherwise it may just sping around.
|
|
theEntity.SetLookPosition(entityTargetPos);
|
|
theEntity.RotateTo(entityTargetPos.x, entityTargetPos.y + 2, entityTargetPos.z, 8f, 8f);
|
|
|
|
//Log.Out("EAIFollowPlayer-Update entityTargetPos: " + entityTargetPos);
|
|
|
|
var a = theEntity.position - entityTargetPos;
|
|
if (a.sqrMagnitude < 20f)
|
|
{
|
|
//Log.Out("EAIFollowPlayer-Update Entity is too close. Ending pathing.");
|
|
//DisplayLog("Entity is too close. Ending pathing.");
|
|
pathCounter = 0;
|
|
return;
|
|
}
|
|
|
|
theEntity.moveHelper.CalcIfUnreachablePos();
|
|
|
|
// if the entity is not calculating a path, check how many nodes are left, and reset the path counter if its too low.
|
|
if (!PathFinderThread.Instance.IsCalculatingPath(theEntity.entityId))
|
|
{
|
|
var path = theEntity.navigator.getPath();
|
|
if (path != null && path.NodeCountRemaining() <= 2)
|
|
pathCounter = 0;
|
|
}
|
|
|
|
if (--pathCounter <= 0 && !PathFinderThread.Instance.IsCalculatingPath(theEntity.entityId))
|
|
{
|
|
//DisplayLog(" Path Counter is 0: Finding new path to " + entityTargetPos);
|
|
// If its still not calculating a path, find a new path to the leader
|
|
pathCounter = 6 + theEntity.rand.RandomRange(10);
|
|
PathFinderThread.Instance.FindPath(theEntity, entityTarget.position, theEntity.GetMoveSpeedAggro(), true, this);
|
|
}
|
|
|
|
if (theEntity.Climbing)
|
|
{
|
|
//Log.Out("EAIFollowPlayer-Update Entity is climbing");
|
|
return;
|
|
}
|
|
|
|
// If there's no path, calculate one.
|
|
if (theEntity.navigator.noPathAndNotPlanningOne())
|
|
{
|
|
//DisplayLog("No Path and Not Planning One. Searching for new path to : " + entityTargetPos);
|
|
PathFinderThread.Instance.FindPath(theEntity, entityTarget.position, theEntity.GetMoveSpeedAggro(), true, this);
|
|
}
|
|
}
|
|
} |