Vocalizer::Update
0x00a09ba0 · 6950 bytes · __thiscall
_ZN9Vocalizer6UpdateEv
Decompiled
undefined (1 param)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* Vocalizer::Update() */
void __thiscall Vocalizer::Update(Vocalizer *this)
{
Vocalizer *pVVar1;
float fVar2;
float fVar3;
code *pcVar4;
CBaseEntity *this_00;
int *piVar5;
int *piVar6;
char cVar7;
int iVar8;
int iVar9;
QAngle *pQVar10;
CBaseCombatCharacter *pCVar11;
Checkpoint *this_01;
uint *puVar12;
uint uVar13;
int iVar14;
undefined4 uVar15;
undefined4 *puVar16;
undefined4 uVar17;
int *piVar18;
undefined *puVar19;
undefined *puVar20;
CBaseEntity *this_02;
char *pcVar21;
int *piVar22;
float *pfVar23;
float *pfVar24;
int in_GS_OFFSET;
longdouble lVar25;
float fVar26;
float afStack_288 [3];
float local_26c [10];
int local_244;
CBaseEntity *local_240;
int *local_230;
int local_22c;
int local_228;
int local_224;
int local_220;
int local_21c;
int local_218;
int local_214;
float local_210;
float local_20c;
float local_208;
int local_204;
int local_200;
int local_1fc;
float local_1f8;
float local_1f4;
float local_1f0;
float local_1ec;
float local_1e8;
float local_1e4;
float local_1e0;
float local_1dc;
float local_1d8;
undefined1 local_1d4 [12];
float local_1c8;
float local_1c4;
float local_1c0;
float local_1bc;
int *local_1b8;
float local_1b4;
undefined4 local_1b0;
char local_1ac;
undefined **local_1a8;
int *local_1a4;
float local_1a0;
float local_19c;
float local_198;
int local_194;
float local_190;
float local_18c;
float local_188;
float local_184;
char local_180;
int *local_17c;
undefined4 local_178;
undefined4 local_174;
undefined4 local_170;
float local_16c;
undefined4 local_168;
undefined **local_164;
int *local_160;
float local_15c [3];
undefined4 local_150;
float local_14c;
float local_148;
undefined4 local_144;
undefined4 local_140;
undefined1 local_13c;
int *local_138;
undefined4 local_134;
undefined4 local_130;
undefined4 local_12c;
undefined4 local_128;
undefined4 local_124;
char local_120 [5];
undefined1 local_11b [251];
int local_20;
piVar18 = (int *)&stack0xfffffd84;
local_22c = 0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_228 = 0;
if (___atan2f_finite == 0) {
local_214 = 0;
}
else {
(**(code **)(___atan2f_finite + 0x50))();
local_214 = ___atan2f_finite;
}
iVar9 = _DAT_0105db00;
local_21c = local_22c;
local_218 = local_228;
/* try { // try from 00a09d06 to 00a09d54 has its CatchHandler @ 00a0b7d2 */
if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
(iVar8 = ThreadGetCurrentId(), iVar9 == iVar8)) {
if ((char *)*_DAT_0105d15c != "Vocalizer::Update") {
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd1fb5f,(char *)0x1,0xbfafa1);
}
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
/* try { // try from 00a09c81 to 00a09c86 has its CatchHandler @ 00a0b7d6 */
cVar7 = (**(code **)(**(int **)this + 300))();
piVar22 = (int *)&stack0xfffffd84;
if (cVar7 != '\0') {
/* try { // try from 00a09dc5 to 00a0a06b has its CatchHandler @ 00a0b7d6 */
iVar9 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)this);
cVar7 = IsASurvivorTeam(iVar9);
piVar22 = (int *)&stack0xfffffd84;
if (cVar7 != '\0') {
uVar13 = *(uint *)(this + 0xf4);
if (uVar13 == 0xffffffff) {
uVar13 = 0xffffffff;
LAB_00a09e0d:
this_02 = (CBaseEntity *)0x0;
LAB_00a09e0f:
local_240 = (CBaseEntity *)0x0;
}
else {
puVar19 = g_pEntityList + (uVar13 & 0xfff) * 0x10;
if ((puVar19 == (undefined *)0xfffffffc) || (*(uint *)(puVar19 + 8) != uVar13 >> 0xc))
goto LAB_00a09e0d;
this_02 = *(CBaseEntity **)(puVar19 + 4);
if (this_02 == (CBaseEntity *)0x0) goto LAB_00a09e0f;
cVar7 = (**(code **)(*(int *)this_02 + 0x16c))();
uVar13 = *(uint *)(this + 0xf4);
local_240 = this_02;
if (cVar7 == '\0') goto LAB_00a09e0f;
}
puVar19 = g_pEntityList;
if (((uVar13 == 0xffffffff) ||
(puVar20 = g_pEntityList + (uVar13 & 0xfff) * 0x10, puVar20 == (undefined *)0xfffffffc))
|| ((*(uint *)(puVar20 + 8) != uVar13 >> 0xc || (*(int *)(puVar20 + 4) == 0)))) {
lVar25 = (longdouble)IntervalTimer::Now();
puVar19 = g_pEntityList;
if ((float)lVar25 != *(float *)(this + 0x100)) {
(**(code **)(*(int *)(this + 0xfc) + 4))();
*(float *)(this + 0x100) = (float)lVar25;
puVar19 = g_pEntityList;
}
}
else {
*(undefined4 *)(this + 0xf4) = 0xffffffff;
}
uVar13 = *(uint *)(this + 0xf8);
if (((uVar13 == 0xffffffff) ||
(puVar19 = puVar19 + (uVar13 & 0xfff) * 0x10, puVar19 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar19 + 8) != uVar13 >> 0xc)) {
iVar9 = 0;
LAB_00a09ee2:
lVar25 = (longdouble)IntervalTimer::Now();
if ((float)lVar25 != *(float *)(this + 0x108)) {
(**(code **)(*(int *)(this + 0x104) + 4))();
*(float *)(this + 0x108) = (float)lVar25;
}
}
else {
iVar9 = *(int *)(puVar19 + 4);
if (iVar9 == 0) goto LAB_00a09ee2;
*(undefined4 *)(this + 0xf8) = 0xffffffff;
}
/* try { // try from 00a0a277 to 00a0a7db has its CatchHandler @ 00a0b7d6 */
if (((this_02 != (CBaseEntity *)0x0) && (*(char *)(*(int *)this + 0x2edc) == '\0')) &&
(((*(uint *)(*(int *)this + 0x1cb0) & 0x618) != 0 &&
(lVar25 = (longdouble)CountdownTimer::Now(), *(float *)(this + 0x114) <= (float)lVar25))))
{
this_00 = *(CBaseEntity **)this;
if (((byte)this_00[0x14d] & 0x10) != 0) {
CBaseEntity::CalcAbsoluteVelocity(this_00);
}
if ((SQRT(*(float *)(this_00 + 0x27c) * *(float *)(this_00 + 0x27c) +
*(float *)(this_00 + 0x274) * *(float *)(this_00 + 0x274) +
*(float *)(this_00 + 0x278) * *(float *)(this_00 + 0x278)) < 30.0) &&
(((*(float *)(this + 0x100) <= 0.0 ||
(lVar25 = (longdouble)IntervalTimer::Now(),
0.5 < (float)lVar25 - *(float *)(this + 0x100))) || (iVar9 != 0)))) {
if (local_240 == (CBaseEntity *)0x0) {
if (((*(float *)(this + 0x100) <= 0.0) ||
(lVar25 = (longdouble)IntervalTimer::Now(), piVar22 = (int *)&stack0xfffffd84,
1.0 < (float)lVar25 - *(float *)(this + 0x100))) &&
(this_01 = (Checkpoint *)TerrorNavMesh::GetInitialCheckpoint(TheNavMesh),
piVar22 = (int *)&stack0xfffffd84, this_01 != (Checkpoint *)0x0)) {
Checkpoint::GetSpawnPosition
(this_01,(Vector *)&local_1a8,(QAngle *)&local_164,(TerrorNavArea **)0x0);
local_164 = (undefined **)0x0;
local_15c[0] = 0.0;
CBaseEntity::SetAbsOrigin(this_02,(Vector *)&local_1a8);
CBaseEntity::SetAbsAngles(this_02,(QAngle *)&local_164);
piVar22 = (int *)&stack0xfffffd84;
}
}
else {
cVar7 = Say();
if (cVar7 == '\0') goto LAB_00a09f70;
fVar26 = *(float *)(MakeWayInterval._28_4_ + 0x2c);
lVar25 = (longdouble)CountdownTimer::Now();
if ((float)lVar25 + fVar26 != *(float *)(this + 0x114)) {
(**(code **)(*(int *)(this + 0x10c) + 4))();
*(float *)(this + 0x114) = (float)lVar25 + fVar26;
}
if (fVar26 != *(float *)(this + 0x110)) {
/* try { // try from 00a0aed8 to 00a0af26 has its CatchHandler @ 00a0b7d6 */
(**(code **)(*(int *)(this + 0x10c) + 4))();
*(float *)(this + 0x110) = fVar26;
}
piVar18 = (int *)(**(code **)(*gameeventmanager + 0x1c))();
piVar22 = (int *)&stack0xfffffd84;
if (piVar18 != (int *)0x0) {
pcVar4 = *(code **)(*piVar18 + 0x30);
(**(code **)(*engine + 0x40))();
(*pcVar4)();
pcVar4 = *(code **)(*piVar18 + 0x30);
(**(code **)(*engine + 0x40))();
(*pcVar4)();
(**(code **)(*gameeventmanager + 0x20))();
piVar22 = (int *)&stack0xfffffd84;
}
}
goto LAB_00a09c8f;
}
}
LAB_00a09f70:
lVar25 = (longdouble)CountdownTimer::Now();
piVar22 = (int *)&stack0xfffffd84;
if (((*(float *)(this + 0x20) <= (float)lVar25) &&
(iVar9 = *(int *)this, piVar22 = (int *)&stack0xfffffd84,
*(char *)(iVar9 + 0x2edc) == '\0')) &&
((((uVar13 = *(uint *)(iVar9 + 0x3e68), uVar13 == 0xffffffff ||
((puVar19 = g_pEntityList + (uVar13 & 0xfff) * 0x10, puVar19 == (undefined *)0xfffffffc
|| (*(uint *)(puVar19 + 8) != uVar13 >> 0xc)))) ||
(piVar22 = (int *)&stack0xfffffd84, *(int *)(puVar19 + 4) == 0)) &&
((((uVar13 = *(uint *)(iVar9 + 0x33c4), uVar13 == 0xffffffff ||
(puVar19 = g_pEntityList + (uVar13 & 0xfff) * 0x10, puVar19 == (undefined *)0xfffffffc)
) || (*(uint *)(puVar19 + 8) != uVar13 >> 0xc)) ||
(piVar22 = (int *)&stack0xfffffd84, *(int *)(puVar19 + 4) == 0)))))) {
lVar25 = (longdouble)CountdownTimer::Now();
if ((float)lVar25 + 0.2 != *(float *)(this + 0x20)) {
(**(code **)(*(int *)(this + 0x18) + 4))();
*(float *)(this + 0x20) = (float)lVar25 + 0.2;
}
if (*(float *)(this + 0x1c) != 0.2) {
(**(code **)(*(int *)(this + 0x18) + 4))();
*(undefined4 *)(this + 0x1c) = 0x3e4ccccd;
}
CBasePlayer::EyeVectors
(*(CBasePlayer **)this,(Vector *)&local_210,(Vector *)0x0,(Vector *)0x0);
*(undefined4 *)(this + 0x118) = 0xffffffff;
*(undefined4 *)(this + 0x11c) = 0xffffffff;
fVar26 = *(float *)(this + 8);
fVar2 = *(float *)(this + 4);
*(float *)(this + 8) = local_20c;
*(float *)(this + 4) = local_210;
fVar3 = *(float *)(this + 0xc);
*(float *)(this + 0xc) = local_208;
if (fVar26 * local_20c + fVar2 * local_210 + fVar3 * local_208 <=
1.0 - *(float *)(ViewMotionThreshold._28_4_ + 0x2c)) {
lVar25 = (longdouble)IntervalTimer::Now();
piVar22 = (int *)&stack0xfffffd84;
if ((float)lVar25 != *(float *)(this + 0x14)) {
(**(code **)(*(int *)(this + 0x10) + 4))();
*(float *)(this + 0x14) = (float)lVar25;
piVar22 = (int *)&stack0xfffffd84;
}
}
else {
if ((0.0 < *(float *)(this + 0x14)) &&
(lVar25 = (longdouble)IntervalTimer::Now(), piVar22 = (int *)&stack0xfffffd84,
(float)lVar25 - *(float *)(this + 0x14) < 0.2)) goto LAB_00a09c8f;
fVar2 = *(float *)(MaxWarnRange._28_4_ + 0x2c);
fVar26 = *(float *)(AimTolerance._28_4_ + 0x2c);
local_1a8 = &PTR_operator___00c53020;
local_178 = 0;
local_1a4 = *(int **)this;
local_174 = 0;
local_170 = 0;
local_16c = 0.0;
local_168 = 0;
/* try { // try from 00a0a155 to 00a0a16c has its CatchHandler @ 00a0b793 */
pQVar10 = (QAngle *)(**(code **)(*local_1a4 + 0x238))();
AngleVectors(pQVar10,(Vector *)&local_1a0);
iVar9 = 1;
local_194 = 3;
local_190 = 1.0 - fVar26;
local_17c = (int *)0x0;
local_184 = 50.0;
local_180 = '\0';
local_18c = local_190;
local_188 = fVar2;
if (0 < *(int *)(gpGlobals + 0x14)) {
do {
pCVar11 = (CBaseCombatCharacter *)UTIL_PlayerByIndex(iVar9);
/* try { // try from 00a0a1e1 to 00a0a23c has its CatchHandler @ 00a0b7c6 */
/* try { // try from 00a0af48 to 00a0afb4 has its CatchHandler @ 00a0b7c6 */
if ((((pCVar11 != (CBaseCombatCharacter *)0x0) && (*(int *)(pCVar11 + 0x30) != 0)) &&
((*(int *)(pCVar11 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4 != 0 &&
(((cVar7 = (**(code **)(*(int *)pCVar11 + 0x16c))(), cVar7 != '\0' &&
(*(int *)(pCVar11 + 0x1f6c) != 2)) &&
(iVar8 = (**(code **)(*(int *)pCVar11 + 0x148))(), iVar8 == 0)))))) &&
(cVar7 = TargetScan<CBaseCombatCharacter>::operator()
((TargetScan<CBaseCombatCharacter> *)&local_1a8,pCVar11),
cVar7 == '\0')) goto LAB_00a0af61;
iVar9 = iVar9 + 1;
} while (iVar9 <= *(int *)(gpGlobals + 0x14));
}
/* try { // try from 00a0a85a to 00a0a8ef has its CatchHandler @ 00a0b7c6 */
iVar9 = TheNextBots();
uVar13 = (uint)*(ushort *)(iVar9 + 0x10);
piVar18 = (int *)&stack0xfffffd84;
if (uVar13 != 0xffff) {
iVar8 = *(int *)(iVar9 + 4);
pfVar24 = (float *)&stack0xfffffd84;
do {
piVar18 = *(int **)(iVar8 + uVar13 * 8);
iVar8 = *piVar18;
*pfVar24 = (float)piVar18;
/* try { // try from 00a0aa15 to 00a0aa1a has its CatchHandler @ 00a0b7c6 */
pcVar4 = *(code **)(iVar8 + 0xb4);
pfVar24[-1] = 1.4754702e-38;
local_230 = (int *)(*pcVar4)();
local_224 = 0;
local_220 = 0;
if (___atan2f_finite == 0) {
local_1fc = 0;
}
else {
pfVar24[0xb] = (float)"TargetScan()";
pfVar24[10] = (float)"Unaccounted";
pfVar24[9] = (float)"(%s)%s";
pfVar24[8] = (float)&TargetScan<CBaseCombatCharacter>::
operator()(CBaseCombatCharacter*)::tm_fmt;
pfVar24[7] = 6.5861e-44;
pfVar24[6] = (float)"/data/src/game/shared/sharedfunctorutils.h";
pfVar24[5] = 0.0;
pfVar24[3] = 0.0;
pfVar24[4] = 0.0;
pfVar24[2] = 0.0;
pfVar24[1] = (float)&local_224;
*pfVar24 = (float)___atan2f_finite;
pcVar4 = *(code **)(___atan2f_finite + 0x50);
pfVar24[-1] = 1.4754283e-38;
(*pcVar4)();
local_1fc = ___atan2f_finite;
}
iVar8 = _DAT_0105db00;
local_204 = local_224;
local_200 = local_220;
if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
/* try { // try from 00a0a92c to 00a0a930 has its CatchHandler @ 00a0b7cd */
pfVar24[-1] = 1.4754374e-38;
iVar14 = ThreadGetCurrentId();
if (iVar8 == iVar14) {
if ((char *)*_DAT_0105d15c != "TargetScan()") {
pfVar24[4] = 0.0;
pfVar24[3] = (float)"Unaccounted";
pfVar24[2] = 1.4013e-45;
pfVar24[1] = (float)"TargetScan()";
*pfVar24 = (float)_DAT_0105d15c;
/* try { // try from 00a0aab0 to 00a0aac1 has its CatchHandler @ 00a0b7cd */
pfVar24[-1] = 1.4754918e-38;
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode
((char *)*pfVar24,(int)pfVar24[1],(char *)pfVar24[2],
(int)pfVar24[3]);
}
*pfVar24 = (float)_DAT_0105d15c;
pfVar24[-1] = 1.4754936e-38;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
}
pfVar23 = pfVar24;
if (local_1a4 != local_230) {
iVar8 = *local_230;
*pfVar24 = (float)local_230;
/* try { // try from 00a0a94c to 00a0a970 has its CatchHandler @ 00a0b7a5 */
pcVar4 = *(code **)(iVar8 + 300);
pfVar24[-1] = 1.475442e-38;
cVar7 = (*pcVar4)();
if (cVar7 != '\0') {
if (local_194 != -1) {
*pfVar24 = (float)local_230;
pfVar24[-1] = 1.4754464e-38;
iVar8 = CBaseEntity::GetTeamNumber((CBaseEntity *)*pfVar24);
if (iVar8 != local_194) goto LAB_00a0a980;
}
iVar8 = *local_230;
*pfVar24 = (float)local_230;
/* try { // try from 00a0aadb to 00a0aeac has its CatchHandler @ 00a0b7a5 */
pcVar4 = *(code **)(iVar8 + 0x558);
pfVar24[-1] = 1.4754979e-38;
cVar7 = (*pcVar4)();
if (cVar7 == '\0') {
iVar8 = *local_1a4;
pfVar24[1] = (float)local_1a4;
*pfVar24 = (float)&local_1ec;
pcVar4 = *(code **)(iVar8 + 0x234);
pfVar24[-1] = 1.4755028e-38;
(*pcVar4)();
local_1dc = local_19c * local_184 + local_1e8;
local_1d8 = local_198 * local_184 + local_1e4;
local_1e0 = local_184 * local_1a0 + local_1ec;
iVar8 = *local_230;
pfVar24[-1] = (float)local_230;
pcVar4 = *(code **)(iVar8 + 0x288);
pfVar24[-2] = 1.475518e-38;
uVar15 = (*pcVar4)();
pfVar24[3] = 0.0;
pfVar24[2] = (float)local_1d4;
*pfVar24 = (float)&local_1ec;
pfVar24[1] = (float)&local_1e0;
pfVar24[-1] = (float)uVar15;
pfVar24[-2] = 1.4755244e-38;
CalcClosestPointOnLineSegment
((Vector *)pfVar24[-1],(Vector *)*pfVar24,(Vector *)pfVar24[1],
(Vector *)pfVar24[2],(float *)pfVar24[3]);
piVar18 = local_230;
if ((*(byte *)((int)local_230 + 0x14d) & 8) != 0) {
pfVar24[-1] = (float)local_230;
pfVar24[-2] = 1.4755282e-38;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)pfVar24[-1]);
}
iVar8 = local_230[0x65];
local_1ec = (float)piVar18[0xb8];
local_1e8 = (float)piVar18[0xb9];
local_1e4 = (float)piVar18[0xba];
pfVar24[-1] = (float)(local_230 + 0x65);
pcVar4 = *(code **)(iVar8 + 8);
pfVar24[-2] = 1.4755416e-38;
local_1e0 = local_1ec;
local_1dc = local_1e8;
local_1d8 = local_1e4;
iVar8 = (*pcVar4)();
fVar26 = *(float *)(iVar8 + 8);
pfVar24[2] = (float)&local_1f8;
*pfVar24 = (float)&local_1ec;
pfVar24[3] = 0.0;
pfVar24[1] = (float)&local_1e0;
pfVar24[-1] = (float)local_1d4;
local_1d8 = local_1d8 + fVar26;
pfVar24[-2] = 1.475551e-38;
CalcClosestPointOnLineSegment
((Vector *)pfVar24[-1],(Vector *)*pfVar24,(Vector *)pfVar24[1],
(Vector *)pfVar24[2],(float *)pfVar24[3]);
if (local_180 != '\0') {
pfVar24[5] = -1.0;
pfVar24[4] = 1.4013e-45;
pfVar24[3] = 3.57331e-43;
pfVar24[2] = 3.57331e-43;
pfVar24[1] = 3.57331e-43;
*pfVar24 = 1.0;
pfVar24[-1] = (float)&local_1f8;
pfVar24[-2] = 1.4755601e-38;
NDebugOverlay::Cross3D
((Vector *)pfVar24[-1],*pfVar24,(int)pfVar24[1],(int)pfVar24[2],
(int)pfVar24[3],*(bool *)(pfVar24 + 4),pfVar24[5]);
pfVar24[5] = -1.0;
pfVar24[4] = 1.4013e-45;
pfVar24[3] = 0.0;
pfVar24[2] = 0.0;
pfVar24[1] = 3.57331e-43;
*pfVar24 = (float)&local_1ec;
pfVar24[-1] = (float)&local_1e0;
pfVar24[-2] = 1.4755683e-38;
NDebugOverlay::Line((Vector *)pfVar24[-1],(Vector *)*pfVar24,(int)pfVar24[1],
(int)pfVar24[2],(int)pfVar24[3],*(bool *)(pfVar24 + 4),
pfVar24[5]);
}
iVar8 = *local_1a4;
*pfVar24 = (float)local_1a4;
pfVar24[-1] = (float)&local_1bc;
pcVar4 = *(code **)(iVar8 + 0x234);
pfVar24[-2] = 1.475572e-38;
(*pcVar4)();
pfVar24[-2] = (float)&local_1c8;
local_1c8 = local_1f8 - local_1bc;
local_1c4 = local_1f4 - (float)local_1b8;
local_1c0 = local_1f0 - local_1b4;
pfVar24[-3] = 1.4755845e-38;
VectorNormalize((Vector *)pfVar24[-2]);
*pfVar24 = (float)&local_1bc;
pfVar24[-1] = (float)&local_1f8;
pfVar24[-2] = (float)(local_1a4 + 0x65);
pfVar24[-3] = 1.4755886e-38;
CCollisionProperty::CalcNearestPoint
((CCollisionProperty *)pfVar24[-2],(Vector *)pfVar24[-1],
(Vector *)*pfVar24);
pfVar24[-1] = (float)&local_1bc;
*pfVar24 = (float)&local_164;
pfVar24[-2] = (float)(local_230 + 0x65);
pfVar24[-3] = 1.4755932e-38;
CCollisionProperty::CalcNearestPoint
((CCollisionProperty *)pfVar24[-2],(Vector *)pfVar24[-1],
(Vector *)*pfVar24);
pfVar23 = pfVar24 + -2;
if ((SQRT((local_1bc - (float)local_164) * (local_1bc - (float)local_164) +
((float)local_1b8 - (float)local_160) *
((float)local_1b8 - (float)local_160) +
(local_1b4 - local_15c[0]) * (local_1b4 - local_15c[0])) <= local_188)
&& (fVar26 = local_1c0 * local_198 +
local_1c8 * local_1a0 + local_1c4 * local_19c,
pfVar23 = pfVar24 + -2, local_190 < fVar26)) {
*pfVar24 = 1.4013e-45;
pfVar24[-1] = (float)local_230;
pfVar24[-2] = (float)local_1a4;
pfVar24[-3] = 1.475623e-38;
cVar7 = CBaseCombatCharacter::IsAbleToSee();
pfVar23 = pfVar24 + -2;
if (cVar7 != '\0') {
if (local_18c <= fVar26) {
local_18c = fVar26;
local_17c = local_230;
}
*pfVar24 = (float)&local_230;
pfVar24[-1] = local_16c;
pfVar24[-2] = (float)&local_178;
pfVar24[-3] = 1.4756341e-38;
CUtlVector<CBaseCombatCharacter*,CUtlMemory<CBaseCombatCharacter*,int>>::
InsertBefore((CUtlVector<CBaseCombatCharacter*,CUtlMemory<CBaseCombatCharacter*,int>>
*)pfVar24[-2],(int)pfVar24[-1],
(CBaseCombatCharacter **)*pfVar24);
pfVar23 = pfVar24 + -2;
}
}
}
}
}
LAB_00a0a980:
iVar8 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
pfVar23[-1] = 1.4754525e-38;
iVar14 = ThreadGetCurrentId();
if (iVar8 == iVar14) {
*pfVar23 = (float)_DAT_0105d15c;
pfVar23[-1] = 1.4754794e-38;
cVar7 = CVProfNode::ExitScope();
if (cVar7 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_1fc != 0) {
pfVar23[5] = 0.0;
pfVar23[4] = 0.0;
pfVar23[3] = 0.0;
*pfVar23 = (float)local_1fc;
pfVar23[1] = (float)local_204;
pfVar23[2] = (float)local_200;
pcVar4 = *(code **)(local_1fc + 0x54);
pfVar23[-1] = 1.475462e-38;
(*pcVar4)();
}
iVar8 = *(int *)(iVar9 + 4);
uVar13 = (uint)*(ushort *)(iVar8 + 6 + uVar13 * 8);
piVar18 = (int *)pfVar23;
pfVar24 = pfVar23;
} while (uVar13 != 0xffff);
}
LAB_00a0af61:
piVar6 = local_17c;
local_240 = (CBaseEntity *)&local_178;
piVar22 = piVar18;
if (local_17c != (int *)0x0) {
piVar5 = *(int **)this;
iVar9 = *piVar5;
piVar18[1] = (int)local_17c;
*piVar18 = (int)piVar5;
pcVar4 = *(code **)(iVar9 + 0x410);
piVar18[-1] = 0xa0af80;
lVar25 = (longdouble)(*pcVar4)();
if (*(float *)(SurvivorFogVocalizePercent._28_4_ + 0x2c) <= (float)lVar25 &&
(float)lVar25 != *(float *)(SurvivorFogVocalizePercent._28_4_ + 0x2c))
goto LAB_00a0aff4;
iVar9 = *piVar6;
*piVar18 = (int)piVar6;
pcVar4 = *(code **)(iVar9 + 0xc);
piVar18[-1] = 0xa0afa1;
puVar16 = (undefined4 *)(*pcVar4)();
*(undefined4 *)(this + 0x118) = *puVar16;
piVar18[1] = (int)piVar6;
*piVar18 = (int)this;
piVar18[-1] = 0xa0afb5;
cVar7 = TryToWarnAboutSpecial((Vocalizer *)*piVar18,(CBaseCombatCharacter *)piVar18[1]);
if (cVar7 == '\0') goto LAB_00a0aff4;
LAB_00a0afb9:
local_1a8 = &PTR_operator___00c53020;
local_16c = 0.0;
*piVar18 = (int)local_240;
piVar18[-1] = 0xa0afdb;
CUtlMemory<CBaseCombatCharacter*,int>::Purge
((CUtlMemory<CBaseCombatCharacter*,int> *)*piVar18);
uVar15 = local_178;
*piVar18 = (int)local_240;
local_168 = uVar15;
piVar18[-1] = 0xa0afef;
CUtlMemory<CBaseCombatCharacter*,int>::Purge
((CUtlMemory<CBaseCombatCharacter*,int> *)*piVar18);
goto LAB_00a09c8f;
}
LAB_00a0aff4:
uVar15 = *(undefined4 *)(MaxWarnRange._28_4_ + 0x2c);
fVar26 = *(float *)(AimTolerance._28_4_ + 0x2c);
local_164 = &PTR_operator___00c22340;
local_134 = 0;
local_160 = *(int **)this;
local_130 = 0;
local_12c = 0;
local_128 = 0;
local_124 = 0;
iVar9 = *local_160;
*piVar18 = (int)local_160;
/* try { // try from 00a0b057 to 00a0b06e has its CatchHandler @ 00a0b72d */
pcVar4 = *(code **)(iVar9 + 0x238);
piVar18[-1] = 0xa0b05d;
uVar17 = (*pcVar4)();
*piVar18 = uVar17;
piVar18[1] = (int)local_15c;
piVar18[-1] = 0xa0b06f;
AngleVectors((QAngle *)*piVar18,(Vector *)piVar18[1]);
local_150 = 2;
*piVar18 = (int)&local_164;
local_14c = 1.0 - fVar26;
local_144 = uVar15;
local_138 = (int *)0x0;
local_140 = 0x42480000;
local_148 = local_14c;
local_13c = 0;
/* try { // try from 00a0b0c3 to 00a0b14b has its CatchHandler @ 00a0b777 */
piVar18[-1] = 0xa0b0c8;
ForEachTerrorPlayer<TargetScan<CTerrorPlayer>>((TargetScan *)*piVar18);
if (local_138 == (int *)0x0) {
*(undefined4 *)(this + 0x11c) = 0xffffffff;
}
else {
iVar9 = *local_138;
*piVar18 = (int)local_138;
pcVar4 = *(code **)(iVar9 + 0xc);
piVar18[-1] = 0xa0b0de;
puVar16 = (undefined4 *)(*pcVar4)();
*(undefined4 *)(this + 0x11c) = *puVar16;
}
*piVar18 = (int)(this + 0xa8);
piVar18[-1] = 0xa0b0f4;
lVar25 = (longdouble)CountdownTimer::Now();
if ((*(float *)(this + 0xb0) <= (float)lVar25) && (local_138 != (int *)0x0)) {
fVar26 = *(float *)this;
local_1b8 = local_138;
*piVar18 = (int)&local_1bc;
local_1b4 = 0.0;
local_1b0 = 0x497423fe;
local_1bc = fVar26;
local_1ac = '\0';
piVar18[-1] = 0xa0b14c;
ForEachActor<FriendThreatenedScan>((FriendThreatenedScan *)*piVar18);
if ((local_1b4 != 0.0) && (local_1ac != '\0')) {
piVar18[3] = 0;
piVar18[2] = 1;
piVar18[1] = (int)"PlayerLookOut";
*piVar18 = (int)this;
/* try { // try from 00a0b61e to 00a0b63e has its CatchHandler @ 00a0b777 */
piVar18[-1] = 0xa0b623;
cVar7 = Say();
if (cVar7 != '\0') {
iVar9 = *(int *)(MinWarnInterval._28_4_ + 0x2c);
*piVar18 = (int)(this + 0xa8);
piVar18[1] = iVar9;
piVar18[-1] = 0xa0b63f;
CountdownTimer::Start((CountdownTimer *)*piVar18,(float)piVar18[1]);
}
local_164 = &PTR_operator___00c22340;
*piVar18 = (int)&local_134;
piVar18[-1] = 0xa0b657;
CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>>::~CUtlVector
((CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>> *)*piVar18);
goto LAB_00a0afb9;
}
}
local_164 = &PTR_operator___00c22340;
*piVar18 = (int)&local_134;
local_128 = 0;
piVar18[-1] = 0xa0b185;
CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)*piVar18);
uVar15 = local_134;
*piVar18 = (int)&local_134;
local_124 = uVar15;
piVar18[-1] = 0xa0b199;
CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)*piVar18);
local_1a8 = &PTR_operator___00c53020;
local_16c = 0.0;
*piVar18 = (int)local_240;
piVar18[-1] = 0xa0b1bb;
CUtlMemory<CBaseCombatCharacter*,int>::Purge
((CUtlMemory<CBaseCombatCharacter*,int> *)*piVar18);
uVar15 = local_178;
*piVar18 = (int)local_240;
local_168 = uVar15;
piVar18[-1] = 0xa0b1cf;
CUtlMemory<CBaseCombatCharacter*,int>::Purge
((CUtlMemory<CBaseCombatCharacter*,int> *)*piVar18);
}
pVVar1 = this + 0xcc;
*piVar22 = (int)pVVar1;
piVar22[-1] = 0xa0a683;
lVar25 = (longdouble)CountdownTimer::Now();
if (*(float *)(this + 0xd4) <= (float)lVar25) {
*piVar22 = (int)pVVar1;
piVar22[-1] = 0xa0a6a2;
lVar25 = (longdouble)CountdownTimer::Now();
if ((float)lVar25 + 10.0 != *(float *)(this + 0xd4)) {
iVar9 = *(int *)(this + 0xcc);
*piVar22 = (int)pVVar1;
piVar22[1] = (int)(this + 0xd4);
pcVar4 = *(code **)(iVar9 + 4);
piVar22[-1] = 0xa0b30d;
(*pcVar4)();
*(float *)(this + 0xd4) = (float)lVar25 + 10.0;
}
if (*(float *)(this + 0xd0) != 10.0) {
iVar9 = *(int *)(this + 0xcc);
*piVar22 = (int)pVVar1;
piVar22[1] = (int)(this + 0xd0);
pcVar4 = *(code **)(iVar9 + 4);
piVar22[-1] = 0xa0b26d;
(*pcVar4)();
*(undefined4 *)(this + 0xd0) = 0x41200000;
}
iVar9 = *(int *)this;
if ((*(byte *)(iVar9 + 0x14d) & 8) != 0) {
*piVar22 = iVar9;
piVar22[-1] = 0xa0a6f3;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar22);
}
*piVar22 = 8;
piVar22[1] = iVar9 + 0x2e0;
piVar22[-1] = 0xa0a709;
puVar12 = (uint *)CSoundEnt::GetLoudestSoundOfType(*piVar22,(Vector *)piVar22[1]);
if ((puVar12 != (uint *)0x0) && (puVar12[8] == 10)) {
local_240 = (CBaseEntity *)0x0;
uVar13 = *(uint *)(this + 0xf0);
if ((uVar13 != 0xffffffff) &&
((puVar19 = g_pEntityList + (uVar13 & 0xfff) * 0x10,
puVar19 != (undefined *)0xfffffffc && (*(uint *)(puVar19 + 8) == uVar13 >> 0xc)))) {
local_240 = *(CBaseEntity **)(puVar19 + 4);
}
local_244 = 0;
uVar13 = *puVar12;
if (((uVar13 != 0xffffffff) &&
(puVar19 = g_pEntityList + (uVar13 & 0xfff) * 0x10,
puVar19 != (undefined *)0xfffffffc)) && (*(uint *)(puVar19 + 8) == uVar13 >> 0xc)) {
local_244 = *(int *)(puVar19 + 4);
}
if (local_240 != (CBaseEntity *)local_244) {
local_120[0] = '\0';
uVar13 = *puVar12;
if (((uVar13 != 0xffffffff) &&
(puVar19 = g_pEntityList + (uVar13 & 0xfff) * 0x10,
puVar19 != (undefined *)0xfffffffc)) &&
((*(uint *)(puVar19 + 8) == uVar13 >> 0xc &&
(piVar18 = *(int **)(puVar19 + 4), piVar18 != (int *)0x0)))) {
iVar9 = *piVar18;
*piVar22 = (int)piVar18;
pcVar4 = *(code **)(iVar9 + 0x144);
piVar22[-1] = 0xa0b528;
piVar18 = (int *)(*pcVar4)();
if (piVar18 != (int *)0x0) {
iVar9 = *piVar18;
*piVar22 = (int)piVar18;
pcVar4 = *(code **)(iVar9 + 300);
piVar22[-1] = 0xa0b539;
cVar7 = (*pcVar4)();
if (cVar7 != '\0') {
*piVar22 = (int)piVar18;
piVar22[-1] = 0xa0b545;
iVar9 = CTerrorPlayer::ClassifyZombie((CBaseEntity *)*piVar22);
if ((iVar9 != 9) && (iVar9 != 0)) {
piVar22[1] = (int)"zombieclass:";
*piVar22 = (int)local_120;
piVar22[-1] = 0xa0b6fe;
_V_strcpy((char *)*piVar22,(char *)piVar22[1]);
*piVar22 = iVar9;
piVar22[-1] = 0xa0b706;
iVar9 = ZombieClassName();
piVar22[1] = iVar9;
piVar22[3] = -1;
piVar22[2] = 0x100;
*piVar22 = (int)local_120;
piVar22[-1] = 0xa0b728;
V_strncat((char *)*piVar22,(char *)piVar22[1],piVar22[2],piVar22[3]);
}
}
}
if (local_120[0] != '\0') {
piVar22[2] = 1;
piVar22[3] = (int)local_120;
piVar22[1] = (int)"PlayerWarnHearZombie";
*piVar22 = (int)this;
piVar22[-1] = 0xa0b581;
cVar7 = Say();
if (cVar7 != '\0') {
*(uint *)(this + 0xf0) = *puVar12;
goto LAB_00a09c8f;
}
}
}
}
}
}
pVVar1 = this + 0xd8;
*piVar22 = (int)pVVar1;
piVar22[-1] = 0xa0a727;
lVar25 = (longdouble)CountdownTimer::Now();
piVar18 = *(int **)this;
if (((float)lVar25 < *(float *)(this + 0xe0)) || ((char)piVar18[0xcbf] == '\0')) {
LAB_00a0a74d:
iVar9 = *piVar18;
*piVar22 = (int)piVar18;
pcVar4 = *(code **)(iVar9 + 0x7e8);
piVar22[-1] = 0xa0a758;
cVar7 = (*pcVar4)();
if (cVar7 != '\0') {
fVar26 = *(float *)(this + 0xe0);
*piVar22 = (int)pVVar1;
piVar22[-1] = 0xa0b423;
lVar25 = (longdouble)CountdownTimer::Now();
if (fVar26 - (float)lVar25 < 1.0) {
piVar22[1] = 0x3f800000;
*piVar22 = (int)pVVar1;
piVar22[-1] = 0xa0b45a;
CountdownTimer::Start((CountdownTimer *)*piVar22,(float)piVar22[1]);
}
}
}
else {
iVar9 = *piVar18;
*piVar22 = (int)piVar18;
pcVar4 = *(code **)(iVar9 + 0x7e8);
piVar22[-1] = 0xa0b323;
cVar7 = (*pcVar4)();
if (cVar7 != '\0') {
LAB_00a0b34d:
piVar18 = *(int **)this;
goto LAB_00a0a74d;
}
iVar9 = *(int *)this;
if (0.0 < *(float *)(iVar9 + 0x3120)) {
*piVar22 = iVar9 + 0x311c;
/* try { // try from 00a0b66f to 00a0b727 has its CatchHandler @ 00a0b7d6 */
piVar22[-1] = 0xa0b674;
lVar25 = (longdouble)IntervalTimer::Now();
if ((float)lVar25 - *(float *)(iVar9 + 0x3120) <= 5.0) goto LAB_00a0b34d;
iVar9 = *(int *)this;
}
piVar22[1] = 1;
*piVar22 = iVar9;
piVar22[-1] = 0xa0b349;
cVar7 = CTerrorPlayer::IsActionBeingPerformedOnMe();
if (cVar7 != '\0') goto LAB_00a0b34d;
piVar22[1] = 1;
*piVar22 = *(undefined4 *)this;
piVar22[-1] = 0xa0b366;
cVar7 = CTerrorPlayer::IsPerformingActionOnSelf();
if (cVar7 != '\0') goto LAB_00a0b34d;
piVar22[3] = 0;
piVar22[2] = 1;
piVar22[1] = (int)"PlayerGoingToDie";
*piVar22 = (int)this;
piVar22[-1] = 0xa0b38a;
cVar7 = Say();
if (cVar7 != '\0') {
fVar26 = *(float *)(GoingToDieInterval._28_4_ + 0x2c);
*piVar22 = (int)pVVar1;
piVar22[-1] = 0xa0b3ac;
lVar25 = (longdouble)CountdownTimer::Now();
if ((float)lVar25 + fVar26 != *(float *)(this + 0xe0)) {
iVar9 = *(int *)(this + 0xd8);
*piVar22 = (int)pVVar1;
piVar22[1] = (int)(this + 0xe0);
pcVar4 = *(code **)(iVar9 + 4);
piVar22[-1] = 0xa0b6b4;
(*pcVar4)();
*(float *)(this + 0xe0) = (float)lVar25 + fVar26;
}
if (fVar26 != *(float *)(this + 0xdc)) {
iVar9 = *(int *)(this + 0xd8);
*piVar22 = (int)pVVar1;
piVar22[1] = (int)(this + 0xdc);
pcVar4 = *(code **)(iVar9 + 4);
piVar22[-1] = 0xa0b400;
(*pcVar4)();
*(float *)(this + 0xdc) = fVar26;
}
goto LAB_00a09c8f;
}
}
if (this[0x120] == (Vocalizer)0x0) {
*piVar22 = 2;
/* try { // try from 00a0b1db to 00a0b580 has its CatchHandler @ 00a0b7d6 */
piVar22[-1] = 0xa0b1e0;
iVar9 = GetGlobalTeam(*piVar22);
if (iVar9 == 0) {
LAB_00a0b204:
pcVar21 = "ScenarioJoin";
}
else {
*piVar22 = 2;
piVar22[-1] = 0xa0b1f0;
piVar18 = (int *)GetGlobalTeam(*piVar22);
iVar9 = *piVar18;
*piVar22 = (int)piVar18;
pcVar4 = *(code **)(iVar9 + 0x354);
piVar22[-1] = 0xa0b1fb;
iVar9 = (*pcVar4)();
if (iVar9 != 4) goto LAB_00a0b204;
pcVar21 = "ScenarioJoinLast";
}
piVar22[1] = (int)"ScenarioName:%s";
piVar22[2] = TheDirector + 0x3b4;
*piVar22 = (int)local_120;
piVar22[-1] = 0xa0b22d;
CFmtStrN<64>::CFmtStrN((CFmtStrN<64> *)*piVar22,(char *)piVar22[1]);
piVar22[2] = 1;
piVar22[3] = (int)local_11b;
piVar22[1] = (int)pcVar21;
*piVar22 = (int)this;
piVar22[-1] = 0xa0b24b;
Say();
this[0x120] = (Vocalizer)0x1;
}
if (*(int *)(this + 0x124) != 0) {
iVar9 = **(int **)this;
*piVar22 = (int)*(int **)this;
pcVar4 = *(code **)(iVar9 + 0x52c);
piVar22[-1] = 0xa0a784;
iVar9 = (*pcVar4)();
if ((iVar9 == 0) || ((*(uint *)(iVar9 + 300) & 0x840) == 0)) {
if (s_bAnyoneHasSaidCheckpointLine == '\0') {
piVar22[3] = 0;
piVar22[2] = 1;
iVar9 = *(int *)(this + 0x124);
*piVar22 = (int)this;
piVar22[1] = iVar9;
/* try { // try from 00a0b5f1 to 00a0b5f5 has its CatchHandler @ 00a0b7d6 */
piVar22[-1] = 0xa0b5f6;
cVar7 = Say();
if (cVar7 == '\0') goto LAB_00a0a7cf;
}
s_bAnyoneHasSaidCheckpointLine = '\x01';
*(undefined4 *)(this + 0x124) = 0;
this[0x121] = (Vocalizer)0x1;
goto LAB_00a09c8f;
}
*(undefined4 *)(this + 0x124) = 0;
this[0x121] = (Vocalizer)0x1;
}
LAB_00a0a7cf:
iVar9 = **(int **)this;
*piVar22 = (int)*(int **)this;
pcVar4 = *(code **)(iVar9 + 0x7e8);
piVar22[-1] = 0xa0a7dc;
cVar7 = (*pcVar4)();
if (cVar7 == '\0') {
*piVar22 = TheDirector;
piVar22[-1] = 0xa0b289;
cVar7 = CDirector::IsFinaleVehicleReady((CDirector *)*piVar22);
if (cVar7 != '\0') {
*piVar22 = (int)(this + 0xe4);
piVar22[-1] = 0xa0b29f;
lVar25 = (longdouble)CountdownTimer::Now();
if (*(float *)(this + 0xec) <= (float)lVar25) {
piVar22[3] = 0;
piVar22[2] = 1;
piVar22[1] = (int)"PlayerGetToRescueVehicle";
*piVar22 = (int)this;
piVar22[-1] = 0xa0b2da;
cVar7 = Say();
if (cVar7 != '\0') {
piVar22[1] = 0x40a00000;
*piVar22 = (int)(this + 0xe4);
piVar22[-1] = 0xa0b2f2;
CountdownTimer::Start((CountdownTimer *)*piVar22,(float)piVar22[1]);
}
}
}
}
iVar9 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
piVar22[-1] = 0xa0a801;
iVar8 = ThreadGetCurrentId();
if (iVar9 == iVar8) {
*piVar22 = (int)_DAT_0105d15c;
piVar22[-1] = 0xa0b5b2;
cVar7 = CVProfNode::ExitScope();
if (cVar7 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
iVar8 = local_214;
iVar9 = local_21c;
if (local_214 != 0) {
piVar22[5] = 0;
iVar14 = local_218;
piVar22[4] = 0;
piVar22[3] = 0;
*piVar22 = iVar8;
piVar22[1] = iVar9;
piVar22[2] = iVar14;
pcVar4 = *(code **)(iVar8 + 0x54);
piVar22[-1] = 0xa0a849;
(*pcVar4)();
}
goto LAB_00a09ce6;
}
}
}
LAB_00a09c8f:
iVar9 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
piVar22[-1] = 0xa09d73;
iVar8 = ThreadGetCurrentId();
if (iVar9 == iVar8) {
*piVar22 = (int)_DAT_0105d15c;
piVar22[-1] = 0xa09d88;
cVar7 = CVProfNode::ExitScope();
if (cVar7 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
iVar8 = local_214;
iVar9 = local_21c;
if (local_214 != 0) {
piVar22[5] = 0;
iVar14 = local_218;
piVar22[4] = 0;
piVar22[3] = 0;
*piVar22 = iVar8;
piVar22[1] = iVar9;
piVar22[2] = iVar14;
pcVar4 = *(code **)(iVar8 + 0x54);
piVar22[-1] = 0xa09ce6;
(*pcVar4)();
}
LAB_00a09ce6:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
*(undefined4 *)((int)piVar22 + -4) = 0xa0b6c4;
__stack_chk_fail();
}
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.