CTerrorGameRules::Think
0x0050cad0 · 3632 bytes · __thiscall
_ZN16CTerrorGameRules5ThinkEv
Decompiled
undefined (1 param)
/* CTerrorGameRules::Think() */
void __thiscall CTerrorGameRules::Think(CTerrorGameRules *this)
{
int iVar1;
code *pcVar2;
char cVar3;
CTerrorGameRules CVar4;
int iVar5;
int *piVar6;
int *piVar7;
undefined *puVar8;
uint uVar9;
undefined4 uVar10;
int *piVar11;
int iVar12;
uint uVar13;
int iVar14;
int *piVar15;
int *piVar16;
int iVar17;
bool bVar18;
longdouble lVar19;
longdouble lVar20;
float fVar21;
float fVar22;
int aiStackY_148 [3];
int local_110;
float local_10c;
float local_104;
float local_100;
float local_fc;
int local_f0;
PhysicsDamage local_e5;
int *local_e4;
int local_e0;
int *local_dc;
float local_d8;
float local_d4;
float local_d0;
float local_cc;
float local_c8;
float local_c4;
float local_c0;
float local_bc;
float local_b8;
float local_b4;
float local_b0;
float local_ac;
float local_a8;
float local_a4;
float local_a0;
float local_9c;
float local_98;
float local_94;
int *local_90;
undefined4 local_8c;
undefined4 local_88;
int local_84;
int *local_80;
float local_7c;
float local_78;
float local_74;
int local_70;
float local_6c;
piVar11 = (int *)&stack0xfffffec4;
iVar14 = *(int *)(this + 900) + -1;
iVar17 = *(int *)(this + 900) * 8;
if (-1 < iVar14) {
do {
while( true ) {
iVar1 = iVar17 + -8;
uVar13 = *(uint *)(*(int *)(this + 0x378) + iVar1);
fVar22 = (float)((uint *)(*(int *)(this + 0x378) + iVar1))[1];
fVar21 = *(float *)(gpGlobals + 0xc);
if ((((uVar13 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar13 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar8 + 8) == uVar13 >> 0xc)) &&
((*(CBaseEntity **)(puVar8 + 4) != (CBaseEntity *)0x0 &&
(CBaseEntity::AddEffects(*(CBaseEntity **)(puVar8 + 4),8), fVar21 <= fVar22 + 0.25))))
break;
iVar5 = *(int *)(this + 900);
iVar12 = (iVar5 - iVar14) + -1;
if (0 < iVar12) {
_V_memmove((void *)(*(int *)(this + 0x378) + iVar1),
(void *)(iVar17 + *(int *)(this + 0x378)),iVar12 * 8);
iVar5 = *(int *)(this + 900);
}
iVar14 = iVar14 + -1;
*(int *)(this + 900) = iVar5 + -1;
iVar17 = iVar1;
if (iVar14 == -1) goto LAB_0050cbfe;
}
iVar14 = iVar14 + -1;
iVar17 = iVar1;
} while (iVar14 != -1);
}
LAB_0050cbfe:
CCSGameRules::Think((CCSGameRules *)this);
ForEachTerrorPlayer<PhysicsDamage>(&local_e5);
local_90 = (int *)0x0;
local_8c = 0;
local_88 = 0;
local_84 = 0;
local_80 = (int *)0x0;
/* try { // try from 0050cc56 to 0050cf4d has its CatchHandler @ 0050d991 */
piVar6 = (int *)GetGlobalTeam(2);
iVar17 = 1;
do {
iVar14 = *piVar6;
*piVar11 = (int)piVar6;
pcVar2 = *(code **)(iVar14 + 0x354);
piVar11[-1] = 0x50cc81;
iVar14 = (*pcVar2)();
if (iVar14 <= iVar17 + -1) {
*piVar11 = TheDirector;
/* try { // try from 0050d2a8 to 0050d447 has its CatchHandler @ 0050d991 */
piVar11[-1] = 0x50d2ad;
CVar4 = (CTerrorGameRules)CDirector::AreTeamsFlipped((CDirector *)*piVar11);
if (CVar4 != this[0x490]) {
piVar11[-1] = 0x50d2bf;
CGameRulesProxy::NotifyNetworkStateChanged();
this[0x490] = CVar4;
}
CVar4 = *(CTerrorGameRules *)(TheDirector + 0x4e5);
if (CVar4 != this[0x491]) {
piVar11[-1] = 0x50d2e4;
CGameRulesProxy::NotifyNetworkStateChanged();
this[0x491] = CVar4;
}
*piVar11 = TheDirector;
piVar11[-1] = 0x50d2fa;
CVar4 = (CTerrorGameRules)CDirector::IsTransitioningToNextMap();
if (CVar4 != this[0x492]) {
piVar11[-1] = 0x50d30c;
CGameRulesProxy::NotifyNetworkStateChanged();
this[0x492] = CVar4;
}
CVar4 = *(CTerrorGameRules *)(*(int *)(TheDirector + 0x63c) + 0x18);
if (CVar4 != this[0x493]) {
piVar11[-1] = 0x50d334;
CGameRulesProxy::NotifyNetworkStateChanged();
this[0x493] = CVar4;
}
if (*(float *)(this + 0xdf4) <= *(float *)(gpGlobals + 0xc) &&
*(float *)(gpGlobals + 0xc) != *(float *)(this + 0xdf4)) {
/* try { // try from 0050d6bf to 0050d786 has its CatchHandler @ 0050d991 */
piVar11[-1] = 0x50d6c4;
cVar3 = IsVersusMode();
if (cVar3 != '\0') {
if (*(float *)(TheDirector + 0x270) <= 0.0) {
piVar11[1] = 0;
*piVar11 = (int)this;
piVar11[-1] = 0x50d787;
RecomputeTeamScores((CTerrorGameRules *)*piVar11,SUB41(piVar11[1],0));
}
*(float *)(this + 0xdf4) = *(float *)(gpGlobals + 0xc) + 1.0;
}
}
piVar11[-1] = 0x50d35c;
cVar3 = IsSurvivalMode();
if (cVar3 != '\0') {
fVar22 = *(float *)(this + 0x318);
if (0.0 < fVar22) {
fVar21 = fVar22 - *(float *)(this + 0x31c);
if (fVar21 <= 0.0) {
if (*(float *)(this + 800) <= *(float *)(gpGlobals + 0xc) &&
*(float *)(gpGlobals + 0xc) != *(float *)(this + 800)) {
if (8.0 <= fVar22) {
fVar22 = 8.0;
}
fVar22 = fVar22 - *(float *)(gpGlobals + 0x10);
if (fVar22 <= 0.0) {
fVar22 = 0.0;
}
*(float *)(this + 0x318) = fVar22;
*(float *)(this + 0x31c) = fVar22;
}
}
else {
if (4.0 <= fVar21) {
fVar21 = 4.0;
}
fVar21 = fVar21 + *(float *)(this + 0x31c);
*(float *)(this + 0x31c) = fVar21;
*(float *)(this + 0x318) = fVar21;
iVar17 = gpGlobals;
*(float *)(this + 800) = *(float *)(gpGlobals + 0xc) + 2.5;
if (((16.0 < fVar21) && (uVar13 = *(uint *)(this + 0x314), uVar13 != 0xffffffff)) &&
((puVar8 = g_pEntityList + (uVar13 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc
&& ((*(uint *)(puVar8 + 8) == uVar13 >> 0xc &&
(piVar6 = *(int **)(puVar8 + 4), piVar6 != (int *)0x0)))))) {
fVar22 = *(float *)(iVar17 + 0xc);
if (*(float *)(this + 0x324) <= fVar22 && fVar22 != *(float *)(this + 0x324)) {
piVar11[5] = 0;
piVar11[4] = 0;
piVar11[3] = 0x41200000;
piVar11[2] = (int)piVar6;
piVar11[1] = (int)piVar6;
*piVar11 = (int)&local_7c;
piVar11[-1] = 0x50d8fb;
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)*piVar11,(CBaseEntity *)piVar11[1],
(CBaseEntity *)piVar11[2],(float)piVar11[3],piVar11[4],piVar11[5]);
piVar11[1] = (int)&local_7c;
*piVar11 = (int)piVar6;
piVar11[-1] = 0x50d907;
CBaseEntity::TakeDamage((CBaseEntity *)*piVar11,(CTakeDamageInfo *)piVar11[1]);
iVar17 = gpGlobals;
*(float *)(this + 0x324) = *(float *)(gpGlobals + 0xc) + 1.0;
fVar22 = *(float *)(iVar17 + 0xc);
}
if (*(float *)(this + 0x328) <= fVar22 && fVar22 != *(float *)(this + 0x328)) {
*(int *)(this + 0x32c) = *(int *)(this + 0x32c) + 1;
piVar11[1] = 0x41200000;
*piVar11 = 0xc1200000;
/* try { // try from 0050d7fc to 0050d906 has its CatchHandler @ 0050d991 */
piVar11[-1] = 0x50d801;
lVar19 = (longdouble)RandomFloat();
piVar11[1] = 0x41200000;
*piVar11 = 0xc1200000;
piVar11[-1] = 0x50d821;
lVar20 = (longdouble)RandomFloat();
local_7c = (float)lVar20;
local_74 = 0.0;
local_9c = 0.0;
local_98 = 0.0;
local_94 = -5.0;
local_a8 = -90.0;
local_a4 = 0.0;
local_a0 = 0.0;
iVar17 = *piVar6;
local_78 = (float)lVar19;
*piVar11 = (int)piVar6;
pcVar2 = *(code **)(iVar17 + 0x288);
piVar11[-1] = 0x50d885;
uVar10 = (*pcVar2)();
piVar11[4] = (int)piVar6;
piVar11[3] = (int)&local_7c;
piVar11[2] = (int)&local_9c;
piVar11[1] = (int)&local_a8;
*piVar11 = uVar10;
piVar11[-1] = 0x50d8ac;
CSpitterProjectile::Create
((Vector *)*piVar11,(QAngle *)piVar11[1],(Vector *)piVar11[2],
(Vector *)piVar11[3],(CBaseCombatCharacter *)piVar11[4]);
*(float *)(this + 0x328) = *(float *)(gpGlobals + 0xc) + 7.0;
}
}
}
}
if (Think()::sv_cheats == '\0') {
*piVar11 = (int)&Think()::sv_cheats;
piVar11[-1] = 0x50d49a;
iVar17 = __cxa_guard_acquire();
if (iVar17 != 0) {
piVar11[1] = (int)"sv_cheats";
*piVar11 = (int)&Think()::sv_cheats;
/* try { // try from 0050d4b1 to 0050d4b5 has its CatchHandler @ 0050d92e */
piVar11[-1] = 0x50d4b6;
ConVarRef::ConVarRef((ConVarRef *)*piVar11,(char *)piVar11[1]);
*piVar11 = (int)&Think()::sv_cheats;
piVar11[-1] = 0x50d4c2;
__cxa_guard_release();
}
}
*piVar11 = (int)&Think()::sv_cheats;
piVar11[-1] = 0x50d425;
cVar3 = ConVarRef::IsValid((ConVarRef *)*piVar11);
if (((cVar3 != '\0') && (*(int *)(Think()::sv_cheats._4_4_ + 0x30) != 0)) ||
(3 < *(int *)(this + 0x32c))) {
piVar11[1] = 1;
*piVar11 = (int)&local_7c;
piVar11[-1] = 0x50d448;
ForEachTerrorPlayer<MarkAsNotPresentAtSurvivalStart>
((MarkAsNotPresentAtSurvivalStart *)*piVar11,SUB41(piVar11[1],0));
}
}
local_84 = 0;
*piVar11 = (int)&local_90;
piVar11[-1] = 0x50d45d;
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)*piVar11);
piVar6 = local_90;
*piVar11 = (int)&local_90;
local_80 = piVar6;
piVar11[-1] = 0x50d46e;
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)*piVar11);
return;
}
iVar14 = *piVar6;
piVar11[1] = iVar17 + -1;
*piVar11 = (int)piVar6;
pcVar2 = *(code **)(iVar14 + 0x358);
piVar11[-1] = 0x50cc98;
piVar7 = (int *)(*pcVar2)();
if (piVar7 != (int *)0x0) {
iVar14 = *piVar7;
*piVar11 = (int)piVar7;
pcVar2 = *(code **)(iVar14 + 0x16c);
piVar11[-1] = 0x50cca9;
cVar3 = (*pcVar2)();
if (((cVar3 != '\0') && (uVar13 = piVar7[0xceb], local_e4 = piVar7, uVar13 != 0xffffffff)) &&
(((puVar8 = g_pEntityList + (uVar13 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc &&
((*(uint *)(puVar8 + 8) == uVar13 >> 0xc && (iVar14 = *(int *)(puVar8 + 4), iVar14 != 0))
)) && (piVar7 = *(int **)(iVar14 + 0x238), local_e0 = iVar14, piVar7 != (int *)0x0)))) {
iVar14 = *piVar7;
piVar11[2] = (int)&local_cc;
piVar11[1] = (int)&local_d8;
*piVar11 = (int)piVar7;
pcVar2 = *(code **)(iVar14 + 0xd4);
piVar11[-1] = 0x50cd25;
(*pcVar2)();
if ((local_d4 * local_d4 + local_d8 * local_d8 + local_d0 * local_d0 <= 10000.0) &&
(local_c8 * local_c8 + local_cc * local_cc + local_c4 * local_c4 <= 10000.0)) {
uVar13 = local_e4[0x72c];
if (local_84 < 1) {
LAB_0050cde0:
piVar11[1] = local_84;
piVar11[2] = (int)&local_e0;
*piVar11 = (int)&local_90;
piVar11[-1] = 0x50cdfc;
CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)*piVar11,piVar11[1],
(CBaseEntity **)piVar11[2]);
piVar11[3] = 0;
piVar11[2] = 0;
piVar11[1] = (int)&local_b4;
local_c0 = vec3_origin;
local_bc = DAT_01053d4c;
local_b8 = DAT_01053d50;
*piVar11 = (int)local_e4;
piVar11[-1] = 0x50ce45;
CBasePlayer::EyeVectors
((CBasePlayer *)*piVar11,(Vector *)piVar11[1],(Vector *)piVar11[2],
(Vector *)piVar11[3]);
*piVar11 = (int)&local_b4;
local_ac = 0.0;
piVar11[-1] = 0x50ce57;
VectorNormalize((Vector *)*piVar11);
uVar9 = uVar13 >> 4;
uVar13 = (uVar13 >> 3 ^ 1) & 1;
if ((uVar13 != 0) && ((uVar9 & 1) != 0)) {
local_b4 = -local_b4;
local_b0 = -local_b0;
local_ac = -local_ac;
}
if (((uVar9 & 1) == 0) && ((char)uVar13 != '\0')) {
local_b4 = vec3_origin;
local_b0 = DAT_01053d4c;
local_ac = DAT_01053d50;
}
local_100 = local_b4 + vec3_origin;
local_fc = local_b0 + DAT_01053d4c;
local_104 = local_ac + DAT_01053d50;
iVar14 = *local_e4;
piVar11[1] = (int)local_e4;
*piVar11 = (int)&local_7c;
pcVar2 = *(code **)(iVar14 + 0x234);
piVar11[-1] = 0x50cee4;
(*pcVar2)();
piVar15 = piVar11 + -1;
local_c0 = local_c0 + local_7c;
local_bc = local_bc + local_78;
local_b8 = local_b8 + local_74;
iVar14 = *local_e4;
piVar11[-1] = (int)local_e4;
pcVar2 = *(code **)(iVar14 + 0x288);
piVar11[-2] = 0x50cf37;
uVar10 = (*pcVar2)();
*piVar11 = uVar10;
piVar11[-1] = local_e0 + 0x194;
piVar11[-2] = 0x50cf4e;
lVar19 = (longdouble)
CCollisionProperty::CalcDistanceFromPoint
((CCollisionProperty *)piVar11[-1],(Vector *)*piVar11);
piVar11[1] = (int)&local_e4;
*piVar11 = 0;
piVar11[-1] = (int)&local_7c;
local_7c = 0.0;
local_78 = 0.0;
local_10c = (float)(~-(uint)(64.0 < (float)lVar19) & 0x3f800000);
local_74 = 0.0;
local_70 = 0;
local_6c = 0.0;
/* try { // try from 0050cfb4 to 0050d250 has its CatchHandler @ 0050d96a */
piVar11[-2] = 0x50cfb9;
CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>>::InsertBefore
((CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>> *)piVar11[-1],
*piVar11,(CTerrorPlayer **)piVar11[1]);
local_110 = 1;
local_f0 = iVar17;
while( true ) {
iVar14 = *piVar6;
*piVar15 = (int)piVar6;
pcVar2 = *(code **)(iVar14 + 0x354);
piVar15[-1] = 0x50cff4;
iVar14 = (*pcVar2)();
if (iVar14 <= local_f0) break;
iVar14 = *piVar6;
*piVar15 = (int)piVar6;
piVar15[1] = local_f0;
pcVar2 = *(code **)(iVar14 + 0x358);
piVar15[-1] = 0x50d015;
piVar11 = (int *)(*pcVar2)();
if (piVar11 != (int *)0x0) {
iVar14 = *piVar11;
*piVar15 = (int)piVar11;
pcVar2 = *(code **)(iVar14 + 0x16c);
piVar15[-1] = 0x50d026;
cVar3 = (*pcVar2)();
if (cVar3 != '\0') {
uVar13 = piVar11[0xceb];
local_dc = piVar11;
if (((uVar13 == 0xffffffff) ||
(puVar8 = g_pEntityList + (uVar13 & 0xfff) * 0x10,
puVar8 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar8 + 8) != uVar13 >> 0xc)) {
if (local_e0 == 0) goto LAB_0050d090;
}
else if (local_e0 == *(int *)(puVar8 + 4)) {
LAB_0050d090:
uVar13 = piVar11[0x72c];
local_110 = local_110 + 1;
uVar9 = uVar13 >> 4;
piVar15[2] = (int)&local_dc;
piVar15[1] = local_70;
*piVar15 = (int)&local_7c;
piVar15[-1] = 0x50d0d3;
CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>>::InsertBefore
((CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>> *)*piVar15
,piVar15[1],(CTerrorPlayer **)piVar15[2]);
piVar15[3] = 0;
piVar15[2] = 0;
piVar15[1] = (int)&local_9c;
*piVar15 = (int)local_e4;
piVar15[-1] = 0x50d0fb;
CBasePlayer::EyeVectors
((CBasePlayer *)*piVar15,(Vector *)piVar15[1],(Vector *)piVar15[2],
(Vector *)piVar15[3]);
*piVar15 = (int)&local_9c;
local_94 = 0.0;
piVar15[-1] = 0x50d10d;
VectorNormalize((Vector *)*piVar15);
bVar18 = (uVar13 & 8) == 0;
if ((bVar18) && ((uVar9 & 1) != 0)) {
local_9c = -local_9c;
local_98 = -local_98;
local_94 = -local_94;
}
if (((uVar9 & 1) == 0) && (bVar18)) {
local_9c = vec3_origin;
local_98 = DAT_01053d4c;
local_94 = DAT_01053d50;
}
local_100 = local_9c + local_100;
local_fc = local_98 + local_fc;
local_104 = local_94 + local_104;
iVar14 = *local_e4;
piVar15[1] = (int)local_e4;
*piVar15 = (int)&local_a8;
pcVar2 = *(code **)(iVar14 + 0x234);
piVar15[-1] = 0x50d1de;
(*pcVar2)();
piVar16 = piVar15 + -1;
local_c0 = local_c0 + local_a8;
local_bc = local_bc + local_a4;
local_b8 = local_b8 + local_a0;
iVar14 = *local_dc;
piVar15[-1] = (int)local_dc;
pcVar2 = *(code **)(iVar14 + 0x288);
piVar15[-2] = 0x50d23a;
uVar10 = (*pcVar2)();
*piVar15 = uVar10;
piVar15[-1] = local_e0 + 0x194;
piVar15[-2] = 0x50d251;
lVar19 = (longdouble)
CCollisionProperty::CalcDistanceFromPoint
((CCollisionProperty *)piVar15[-1],(Vector *)*piVar15);
piVar15 = piVar15 + -1;
if ((float)lVar19 < 64.0) {
local_10c = local_10c + 1.0;
piVar15 = piVar16;
}
}
}
}
local_f0 = local_f0 + 1;
}
fVar22 = 1.0 / (float)local_110;
local_9c = *(float *)(ZombiePushForce._28_4_ + 0x2c);
local_94 = local_104 * local_10c * local_9c;
local_c0 = local_c0 * fVar22;
local_bc = local_bc * fVar22;
local_b8 = fVar22 * local_b8;
local_98 = local_fc * local_10c * local_9c;
local_9c = local_100 * local_10c * local_9c;
if ((((local_9c <= -0.01) || (0.01 <= local_9c)) || (local_98 <= -0.01)) ||
(((0.01 <= local_98 || (local_94 <= -0.01)) || (0.01 <= local_94)))) {
iVar14 = *piVar7;
*piVar15 = (int)piVar7;
/* try { // try from 0050d66b to 0050d66d has its CatchHandler @ 0050d96a */
pcVar2 = *(code **)(iVar14 + 0x78);
piVar15[-1] = 0x50d66e;
lVar19 = (longdouble)(*pcVar2)();
if ((float)lVar19 <= (float)local_110 * *(float *)(ZombiePushMaxMass._28_4_ + 0x2c)) {
iVar14 = *piVar7;
piVar15[2] = (int)&local_c0;
piVar15[1] = (int)&local_9c;
*piVar15 = (int)piVar7;
/* try { // try from 0050d7ab to 0050d7b0 has its CatchHandler @ 0050d96a */
pcVar2 = *(code **)(iVar14 + 0xf8);
piVar15[-1] = 0x50d7b1;
(*pcVar2)();
}
}
local_70 = 0;
*piVar15 = (int)&local_7c;
piVar15[-1] = 0x50d6ac;
CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)*piVar15);
*piVar15 = (int)&local_7c;
local_6c = local_7c;
piVar15[-1] = 0x50d6ba;
CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)*piVar15);
piVar11 = piVar15;
}
else if (*local_90 != local_e0) {
iVar14 = 0;
do {
iVar14 = iVar14 + 1;
if (iVar14 == local_84) goto LAB_0050cde0;
} while (local_90[iVar14] != local_e0);
if (iVar14 < 0) goto LAB_0050cde0;
}
}
}
}
iVar17 = iVar17 + 1;
} while( true );
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.