SimThink_EntityChanged
0x0067b750 · 613 bytes · __cdecl
_Z22SimThink_EntityChangedP11CBaseEntity
Decompiled
undefined (1 param)
/* SimThink_EntityChanged(CBaseEntity*) */
void SimThink_EntityChanged(CBaseEntity *param_1)
{
undefined4 *puVar1;
undefined4 *puVar2;
ushort uVar3;
undefined4 uVar4;
uint *puVar5;
uint uVar6;
undefined4 uVar7;
uint uVar8;
uint uVar9;
int iVar10;
int iVar11;
if (((byte)param_1[0x14c] & 1) != 0) {
return;
}
puVar5 = (uint *)(**(code **)(*(int *)param_1 + 0xc))(param_1);
uVar7 = g_SimThinkManager._8208_4_;
if (*puVar5 == 0xffffffff) {
return;
}
uVar9 = *puVar5 & 0xfff;
if ((*(uint *)(param_1 + 0x14c) & 0xc00000) == 0xc00000) {
uVar3 = *(ushort *)(g_SimThinkManager + uVar9 * 2 + 4);
uVar6 = (uint)uVar3;
if (uVar6 == 0xffff) {
return;
}
if (0 < (int)g_SimThinkManager._8208_4_) {
uVar8 = g_SimThinkManager._8208_4_ - 1;
if (uVar6 != uVar8) {
puVar1 = (undefined4 *)(g_SimThinkManager._8196_4_ + uVar8 * 8);
puVar2 = (undefined4 *)(g_SimThinkManager._8196_4_ + uVar6 * 8);
*puVar2 = *puVar1;
puVar2[1] = puVar1[1];
uVar8 = g_SimThinkManager._8208_4_ - 1;
}
g_SimThinkManager._8208_4_ = uVar8;
*(undefined2 *)(g_SimThinkManager + uVar9 * 2 + 4) = 0xffff;
if ((int)uVar8 <= (int)uVar6) {
return;
}
*(ushort *)
(g_SimThinkManager + (uint)*(ushort *)(g_SimThinkManager._8196_4_ + uVar6 * 8) * 2 + 4) =
uVar3;
return;
}
*(undefined2 *)(g_SimThinkManager + uVar9 * 2 + 4) = 0xffff;
return;
}
uVar3 = *(ushort *)(g_SimThinkManager + uVar9 * 2 + 4);
if (uVar3 != 0xffff) {
if ((*(uint *)(param_1 + 0x14c) & 0x800000) != 0) {
iVar11 = g_SimThinkManager._8196_4_ + (uint)uVar3 * 8;
uVar7 = CBaseEntity::GetFirstThinkTick(param_1);
*(undefined4 *)(iVar11 + 4) = uVar7;
return;
}
*(undefined4 *)(g_SimThinkManager._8196_4_ + 4 + (uint)uVar3 * 8) = 0;
return;
}
iVar11 = g_SimThinkManager._8208_4_ + 1;
if ((iVar11 <= (int)g_SimThinkManager._8200_4_) || ((int)g_SimThinkManager._8204_4_ < 0))
goto LAB_0067b883;
if (g_SimThinkManager._8204_4_ == 0) {
if (g_SimThinkManager._8200_4_ == 0) {
if (iVar11 < 5) {
g_SimThinkManager._8200_4_ = 4;
goto LAB_0067b94f;
}
g_SimThinkManager._8200_4_ = 4;
}
do {
g_SimThinkManager._8200_4_ = g_SimThinkManager._8200_4_ * 2;
} while ((int)g_SimThinkManager._8200_4_ < iVar11);
}
else {
for (g_SimThinkManager._8200_4_ =
((int)g_SimThinkManager._8208_4_ / (int)g_SimThinkManager._8204_4_ + 1) *
g_SimThinkManager._8204_4_; (int)g_SimThinkManager._8200_4_ < iVar11;
g_SimThinkManager._8200_4_ = (g_SimThinkManager._8200_4_ + iVar11) / 2) {
}
}
LAB_0067b94f:
if (g_SimThinkManager._8196_4_ == 0) {
g_SimThinkManager._8196_4_ = malloc(g_SimThinkManager._8200_4_ << 3);
}
else {
g_SimThinkManager._8196_4_ =
realloc((void *)g_SimThinkManager._8196_4_,g_SimThinkManager._8200_4_ << 3);
iVar11 = g_SimThinkManager._8208_4_ + 1;
}
LAB_0067b883:
iVar10 = (iVar11 - uVar7) + -1;
g_SimThinkManager._8208_4_ = iVar11;
g_SimThinkManager._8212_4_ = g_SimThinkManager._8196_4_;
if (0 < iVar10) {
_V_memmove((void *)(g_SimThinkManager._8196_4_ + 8 + uVar7 * 8),
(void *)(g_SimThinkManager._8196_4_ + uVar7 * 8),iVar10 * 8);
}
uVar4 = g_SimThinkManager._8196_4_;
*(short *)(g_SimThinkManager + uVar9 * 2 + 4) = (short)uVar7;
*(short *)(uVar4 + (uVar7 & 0xffff) * 8) = (short)uVar9;
*(undefined4 *)
(g_SimThinkManager._8196_4_ + 4 + (uint)*(ushort *)(g_SimThinkManager + uVar9 * 2 + 4) * 8) = 0;
if (((byte)param_1[0x14e] & 0x80) != 0) {
iVar11 = g_SimThinkManager._8196_4_ + (uint)*(ushort *)(g_SimThinkManager + uVar9 * 2 + 4) * 8;
uVar7 = CBaseEntity::GetFirstThinkTick(param_1);
*(undefined4 *)(iVar11 + 4) = uVar7;
}
return;
}
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.