Here is IDA decompilation...
Code:
char __thiscall CGUnit_C_CalculateThreat(void *this, int ptrGuid, int status, int rawPercent, int scaledPercent, int threatValue)
{
int v6; // eax@1
int copyV6; // ebx@1
void *CGUnitObjPtr; // esi@1
int GuidHigh; // edx@1
int GuidHigh2; // edi@8
int v11; // edi@11
int v12; // eax@12
char result; // al@17
char v14; // [sp+Ch] [bp-Ch]@12
int GuidLow; // [sp+10h] [bp-8h]@1
int copyGuidHigh; // [sp+14h] [bp-4h]@1
float v17; // [sp+24h] [bp+Ch]@12
GuidHigh = *(_DWORD *)(ptrGuid + 4);
CGUnitObjPtr = this;
GuidLow = *(_DWORD *)ptrGuid;
copyGuidHigh = GuidHigh;
v6 = CGUnit_C__GetThreatEntry((int)((char *)this + 4064), GuidLow, (int)&GuidLow);
copyV6 = v6;
if ( *((_QWORD *)CGUnitObjPtr + 507) && v6 )
{
if ( status )
*(_BYTE *)status = *(_BYTE *)(v6 + 40);
if ( rawPercent )
*(_BYTE *)rawPercent = *(_BYTE *)(v6 + 41);
if ( scaledPercent )
{
GuidHigh2 = *(_DWORD *)(ptrGuid + 4);
if ( *(_DWORD *)ptrGuid != *((_DWORD *)CGUnitObjPtr + 1014) || GuidHigh2 != *((_DWORD *)CGUnitObjPtr + 1015) )
{
v11 = ClntObjMgrObjectPtr(*(_DWORD *)ptrGuid, GuidHigh2, 8);
if ( v11
&& (v17 = sub_49BCE0(v11 + 208),
v12 = (*(int (__thiscall **)(int, char *))(*(_DWORD *)v11 + 40))(v11, &v14),
v17 * v17 >= sub_49C170(v12)) )
*(float *)scaledPercent = (double)*(_BYTE *)(copyV6 + 41) * 0.9090908765792847;
else
*(float *)scaledPercent = (double)*(_BYTE *)(copyV6 + 41) * 0.7692307829856873;
}
else
{
*(float *)scaledPercent = 100.0;
}
}
if ( threatValue )
*(_DWORD *)threatValue = *(_DWORD *)(copyV6 + 44);
result = 1;
}
else
{
if ( status )
*(_BYTE *)status = v6 != 0;
if ( rawPercent )
*(_BYTE *)rawPercent = 0;
if ( scaledPercent )
*(float *)scaledPercent = 0.0;
if ( threatValue )
*(_DWORD *)threatValue = 0;
result = 0;
}
return result;
}
And of the Lua function that got me started on it:
Code:
signed int __cdecl lua_UnitDetailedThreatSituation(int LuaStack)
{
char *v1; // eax@1
char *v2; // eax@2
int CGUnitObjPtr; // edi@3
signed int result; // eax@9
int v5; // ST18_4@11
int ptrGuid; // [sp+10h] [bp-1Ch]@1
int GuidHigh; // [sp+14h] [bp-18h]@6
int threatValue; // [sp+18h] [bp-14h]@4
float scaledPercent; // [sp+1Ch] [bp-10h]@4
int v10; // [sp+20h] [bp-Ch]@2
int tankingStatus; // [sp+24h] [bp-8h]@3
unsigned __int8 rawPercent; // [sp+2Ah] [bp-2h]@4
unsigned __int8 rawStatus; // [sp+2Bh] [bp-1h]@4
v1 = (char *)FrameScript_ToLString(LuaStack, 1, 0);
if ( (unsigned __int8)GetGUIDByKeyword(v1, (int)&ptrGuid, 0)
&& (v2 = (char *)FrameScript_ToLString(LuaStack, 2, 0), (unsigned __int8)GetGUIDByKeyword(v2, (int)&v10, 0)) )
{
CGUnitObjPtr = ClntObjMgrObjectPtr(v10, tankingStatus, 8);
if ( CGUnitObjPtr
&& (CGUnit_C_CalculateThreat(
(void *)CGUnitObjPtr,
(int)&ptrGuid,
(int)&rawStatus,
(int)&rawPercent,
(int)&scaledPercent,
(int)&threatValue),
rawStatus) )
{
if ( *(_DWORD *)(CGUnitObjPtr + 4056) != ptrGuid || *(_DWORD *)(CGUnitObjPtr + 4060) != GuidHigh )
FrameScript_pushnil(LuaStack);
else
FrameScript_PushNumber(LuaStack, 1.0);
tankingStatus = rawStatus - 1;
FrameScript_PushNumber(LuaStack, (double)tankingStatus);
FrameScript_PushNumber(LuaStack, scaledPercent);
tankingStatus = rawPercent;
FrameScript_PushNumber(LuaStack, (double)rawPercent);
FrameScript_PushNumber(LuaStack, (double)threatValue);
result = 5;
}
else
{
result = 0;
}
}
else
{
FrameScript_DisplayError(LuaStack, "Usage: UnitDetailedThreatSituation(\"unit\" [, \"mob\"])", v5);
result = 0;
}
return result;
}