internal static void DoPursuitCommandState(EntityInfo entity, long deltaTime, AbstractAiStateLogic logic)
{
AiStateInfo info = entity.GetAiStateInfo();
info.Time += deltaTime;
if (info.Time > 200)
{
EntityInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(entity, info.Target);
if (null != target)
{
float minDist = entity.GetRadius() + target.GetRadius();
float dist = (float)entity.GetActualProperty().AttackRange + minDist;
float distGoHome = entity.GohomeRange;
Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
ScriptRuntime.Vector3 srcPos = entity.GetMovementStateInfo().GetPosition3D();
float dir = Geometry.GetYRadian(new Vector2(targetPos.X, targetPos.Z), new Vector2(srcPos.X, srcPos.Z));
targetPos.X += (float)(minDist * Math.Sin(dir));
targetPos.Z += (float)(minDist * Math.Cos(dir));
float powDist = Geometry.DistanceSquare(srcPos, targetPos);
if (powDist < dist * dist)
{
logic.AiSendStoryMessage(entity, "npc_pursuit_finish:" + entity.GetUnitId(), entity.GetId());
logic.AiSendStoryMessage(entity, "obj_pursuit_finish", entity.GetId());
logic.NotifyAiStopPursue(entity);
logic.ChangeToState(entity, (int)AiStateId.Idle);
}
else
{
logic.NotifyAiPursue(entity, targetPos);
}
}
else
{
logic.AiSendStoryMessage(entity, "npc_pursuit_exit:" + entity.GetUnitId(), entity.GetId());
logic.AiSendStoryMessage(entity, "obj_pursuit_exit", entity.GetId());
logic.NotifyAiStopPursue(entity);
logic.ChangeToState(entity, (int)AiStateId.Idle);
}
}
}