Those functions aren't called when special infected get "stuck". They actually just change their behavior state when they lose their target.
I did something like this to check if a Tank is idle:
PHP Code:
bool bIsTankIdle(int tank, const char[] search = "TankIdle")
{
if (!bIsTank(tank) || !IsFakeClient(tank) || bIsInfectedGhost(tank))
{
return false;
}
Address adTank = GetEntityAddress(tank);
if (adTank == Address_Null || g_iIntentionOffset == -1)
{
return false;
}
Address adIntention = view_as<Address>(LoadFromAddress((adTank + view_as<Address>(g_iIntentionOffset)), NumberType_Int32));
if (adIntention == Address_Null || g_iBehaviorOffset == -1)
{
return false;
}
Address adBehavior = view_as<Address>(LoadFromAddress((adIntention + view_as<Address>(g_iBehaviorOffset)), NumberType_Int32));
if (adBehavior == Address_Null || g_iActionOffset == -1)
{
return false;
}
Address adAction = view_as<Address>(LoadFromAddress((adBehavior + view_as<Address>(g_iActionOffset)), NumberType_Int32));
if (adAction == Address_Null || g_iChildActionOffset == -1)
{
return false;
}
Address adChildAction = Address_Null;
while ((adChildAction = view_as<Address>(LoadFromAddress((adAction + view_as<Address>(g_iChildActionOffset)), NumberType_Int32))) != Address_Null)
{
adAction = adChildAction;
}
if (g_hSDKGetName == null)
{
return false;
}
char sAction[64];
SDKCall(g_hSDKGetName, adAction, sAction, sizeof sAction);
return StrEqual(sAction, search);
}
You can search for "TankBehavior" (no behavior found) to check if it's "stuck".
"TankIdle" - waiting for survivors to trigger it.
"TankAttack" - target found.
"TankBehavior" - no target found.
I've only seen this method to work on Tanks and Witches/Commons (requires slightly different method). I'm not sure how to check for idle Smokers, Boomers, Hunters, Chargers, Jockeys, and Spitters since IDA doesn't show them to have an idle mode, only "JockeyAttack", "JockeyLeap", etc.
__________________