public static RunStatus FunkyTPBehavior(object ret)
{
//Init
if (!initizedTPBehavior)
{
InitTPBehavior();
return RunStatus.Running;
}
double ElapsedTime = DateTime.Now.Subtract(FunkyTP_LastCastAttempt).TotalSeconds;
//Check world transfer start
if (worldtransferStarted)
{
if (ElapsedTime < 10 || worldChanged)
{
//Logger.Write(LogLevel.OutOfCombat,"Waiting for world change!");
if (!FunkyGame.Hero.bIsInTown)
return RunStatus.Running;
Logger.Write(LogLevel.OutOfCombat, "Casting Behavior Finished, we are in town!", true);
ResetTPBehavior();
//UpdateSearchGridProvider(true);
return RunStatus.Success;
}
if (ElapsedTime >= 10 && !FunkyGame.Hero.bIsInTown)
{
//Retry?
worldtransferStarted = false;
CastAttempted = false;
Vector3 UnstuckPos;
if (FunkyGame.Navigation.AttemptFindSafeSpot(out UnstuckPos, Vector3.Zero, FunkyBaseExtension.Settings.Plugin.AvoidanceFlags))
{
Logger.Write(LogLevel.OutOfCombat, "Generated Unstuck Position at {0}", UnstuckPos.ToString());
ZetaDia.Me.UsePower(SNOPower.Walk, UnstuckPos, FunkyGame.Hero.CurrentWorldDynamicID);
}
}
return RunStatus.Running;
}
//Precheck - Ingame, not dead..
if (!TPActionIsValid())
{
ResetTPBehavior();
return RunStatus.Success;
}
if (ZetaDia.IsLoadingWorld) //Loading.. we just wait!
return RunStatus.Running;
if (!CanCastTP()) //Not loading but is valid.. see if we can cast?
{
ResetTPBehavior();
return RunStatus.Success;
}
//Set our flag which is used to setup the refreshing specific for this/similar behaviors.
FunkyTPBehaviorFlag = true;
//Handle Targeting..
if (FunkyGame.Targeting.CheckHandleTarget() == RunStatus.Running)
return RunStatus.Running;
if (MovementOccured)
{
//Backtrack to orginal location...
bool isMoving = false;
try
{
isMoving = ZetaDia.Me.Movement.IsMoving;
}
catch (NullReferenceException) { }
//Use simple checking of movement, with UsePower on our last location.
if (!isMoving)
{
double DistanceFromStart = StartingPosition.Distance(FunkyGame.Hero.Position);
if (DistanceFromStart > 15f && DistanceFromStart < 50f)
{
//Logger.DBLog.InfoFormat("[FunkyTP] Backtracking!");
//Move back to starting position..
//ZetaDia.Me.UsePower(SNOPower.Walk, StartingPosition);
//return RunStatus.Running;
}
else if (DistanceFromStart >= 50f)
{
//Logger.DBLog.InfoFormat("[FunkyTP] Range from our starting position is {0}. Now using Navigator to move.", DistanceFromStart);
//Navigator.MoveTo(StartingPosition, "Backtracking to Orginal Position", true);
}
}
else
return RunStatus.Running;
MovementOccured = false;
}
//Make sure we are not moving..
if (FunkyGame.Hero.IsMoving)
return RunStatus.Running;
//Check if we are casting, if not cast, else if casting but time has elapsed then cancel cast.
if (!CastingRecall())
{
//Check last time cast..
if (ElapsedTime > 5 && CastAttempted)
{
worldtransferStarted = true;
return RunStatus.Running;
}
if (ElapsedTime > 8 || !CastAttempted)
{
//Recast
Logger.Write(LogLevel.OutOfCombat, "Casting TP..");
ZetaDia.Me.UseTownPortal();
CastAttempted = true;
FunkyTP_LastCastAttempt = DateTime.Now;
}
return RunStatus.Running;
}
if (ElapsedTime > 8)
{
//Void Cast?
Logger.Write(LogLevel.OutOfCombat, "Attempting to void cast with movement..");
Vector3 V3loc;
bool success = FunkyGame.Navigation.AttemptFindSafeSpot(out V3loc, Vector3.Zero, FunkyBaseExtension.Settings.Plugin.AvoidanceFlags);
if (success)
{
Navigator.MoveTo(V3loc, "Void Cast Movement", false);
}
return RunStatus.Running;
}
return RunStatus.Running;
}