BoomerAssault::Update
0x00a65310 · 3908 bytes · __thiscall
_ZN13BoomerAssault6UpdateEP6Boomerf
Decompiled
undefined (3 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* BoomerAssault::Update(Boomer*, float) */
BoomerAssault * __thiscall BoomerAssault::Update(BoomerAssault *this,Boomer *param_1,float param_2)
{
uint uVar1;
code *pcVar2;
char cVar3;
Boomer BVar4;
int *piVar5;
int *piVar6;
int *piVar7;
uint *puVar8;
int *piVar9;
CBaseEntity *pCVar10;
int iVar11;
int iVar12;
Boomer *pBVar13;
int iVar14;
BoomerVomitOnVictim *this_00;
Vector *pVVar15;
CTerrorPlayer *pCVar16;
float fVar17;
undefined *puVar18;
float *pfVar19;
int *local_68;
float local_64;
int local_54;
int local_50;
int local_4c;
int local_48;
int local_44;
int local_40;
int local_3c;
int local_38;
undefined **local_34;
int *local_30;
CBaseEntity *local_2c;
undefined4 local_28;
undefined4 local_24;
undefined4 local_20;
pfVar19 = (float *)&stack0xffffff54;
piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9b4))();
piVar6 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
pCVar16 = (CTerrorPlayer *)0x0;
uVar1 = *(uint *)(param_1 + 0x34);
if (((uVar1 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar1 >> 0xc)) {
pCVar16 = *(CTerrorPlayer **)(puVar18 + 4);
}
piVar7 = (int *)BossZombiePlayerBot::ChooseVictim
((BossZombiePlayerBot *)param_2,pCVar16,0,(CBaseCombatCharacter *)0x0);
if (piVar7 == (int *)0x0) {
*(undefined4 *)(param_1 + 0x34) = 0xffffffff;
goto LAB_00a653c4;
}
puVar8 = (uint *)(**(code **)(*piVar7 + 0xc))();
puVar18 = g_pEntityList;
uVar1 = *puVar8;
*(uint *)(param_1 + 0x34) = uVar1;
if (((uVar1 == 0xffffffff) ||
(puVar18 = puVar18 + (uVar1 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)) ||
((*(uint *)(puVar18 + 8) != uVar1 >> 0xc ||
((*(int **)(puVar18 + 4) == (int *)0x0 ||
(cVar3 = (**(code **)(**(int **)(puVar18 + 4) + 300))(), cVar3 == '\0'))))))
goto LAB_00a653c4;
uVar1 = *(uint *)((int)param_2 + 0x30bc);
if ((uVar1 == 0xffffffff) ||
(((puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc ||
(*(uint *)(puVar18 + 8) != uVar1 >> 0xc)) ||
(piVar7 = *(int **)(puVar18 + 4), piVar7 == (int *)0x0)))) {
*(undefined4 *)this = 3;
*(undefined4 *)(this + 4) = 0;
*(char **)(this + 8) = "No ability!";
return this;
}
if (0 < *(int *)(param_1 + 0x443c)) {
piVar9 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
cVar3 = (**(code **)(*piVar9 + 0x114))();
if (cVar3 != '\0') {
iVar11 = (int)param_2 + 0x4028;
local_34 = &PTR_operator___00d20e60;
local_30 = (int *)iVar11;
local_28 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
pCVar10 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
iVar12 = (**(code **)(*(int *)pCVar10 + 0x14c))();
local_24 = 0x3f800000;
if (iVar12 != 0) {
local_24 = *(undefined4 *)(iVar12 + 0x1cec);
}
cVar3 = (**(code **)(*(int *)pCVar10 + 0x16c))();
local_2c = (CBaseEntity *)0x0;
if (cVar3 != '\0') {
local_2c = pCVar10;
}
iVar12 = CBaseEntity::GetTeamNumber(pCVar10);
local_20 = 9;
if (iVar12 == 3) {
local_20 = (**(code **)(*(int *)pCVar10 + 0x544))();
}
local_64 = 0.0;
uVar1 = *(uint *)(param_1 + 0x34);
if (((uVar1 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar1 >> 0xc)) {
local_64 = *(float *)(puVar18 + 4);
}
pBVar13 = param_1 + 0x38;
piVar5 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar5 + 0xd4))(), cVar3 == '\0')) &&
((cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0' &&
(cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0')))) {
(**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
piVar6 = (int *)&stack0xffffff50;
local_4c = local_40;
local_48 = local_3c;
local_44 = local_38;
pcVar2 = *(code **)(*piVar5 + 0x158);
(**(code **)(*piVar5 + 300))();
cVar3 = (*pcVar2)();
if (cVar3 != '\0') {
if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
pVVar15 = (Vector *)(**(code **)(*piVar5 + 300))();
cVar3 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar15,(Vector *)&local_40);
if (cVar3 == '\0') goto LAB_00a66251;
}
(**(code **)(*piVar5 + 0x120))();
(**(code **)(*piVar5 + 0xb4))();
piVar5 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
(**(code **)(*piVar5 + 0xc4))();
(**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
param_1[0x4844] = (Boomer)0x1;
goto LAB_00a65b3f;
}
LAB_00a66251:
piVar5 = &local_4c;
piVar6 = (int *)&stack0xffffff50;
}
else {
piVar5 = (int *)0x0;
piVar6 = (int *)&stack0xffffff54;
}
local_54 = 0;
local_50 = 0;
if (_towlower == 0) {
local_38 = 0;
}
else {
*piVar6 = _towlower;
piVar6[1] = (int)&local_54;
piVar6[0xb] = (int)"ChasePath::Update";
piVar6[10] = (int)"NextBot";
piVar6[9] = (int)"(%s)%s";
piVar6[8] = (int)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::tm_fmt
;
piVar6[7] = 0x68;
piVar6[6] = (int)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
piVar6[5] = 0;
piVar6[3] = 0;
piVar6[4] = 0;
piVar6[2] = 0;
pcVar2 = *(code **)(_towlower + 0x50);
piVar6[-1] = 0xa65a68;
(*pcVar2)();
local_38 = _towlower;
}
iVar12 = _DAT_0105db00;
local_40 = local_54;
local_3c = local_50;
if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
/* try { // try from 00a65a95 to 00a65a99 has its CatchHandler @ 00a662ef */
piVar6[-1] = 0xa65a9a;
iVar14 = ThreadGetCurrentId();
if (iVar12 == iVar14) {
if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
piVar6[4] = 4;
piVar6[3] = (int)"NextBot";
piVar6[2] = 0;
piVar6[1] = (int)"ChasePath::Update";
*piVar6 = (int)_DAT_0105d15c;
/* try { // try from 00a65f60 to 00a65f83 has its CatchHandler @ 00a662ef */
piVar6[-1] = 0xa65f65;
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode
((char *)*piVar6,piVar6[1],(char *)piVar6[2],piVar6[3]);
}
puVar8 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar8 = *puVar8 | 4;
*piVar6 = (int)_DAT_0105d15c;
piVar6[-1] = 0xa65f84;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
}
piVar6[4] = (int)piVar5;
piVar6[3] = (int)&local_34;
piVar6[1] = iVar11;
*piVar6 = (int)pBVar13;
piVar6[2] = (int)local_64;
/* try { // try from 00a65abe to 00a65ace has its CatchHandler @ 00a662db */
piVar6[-1] = 0xa65ac3;
ChasePath::RefreshPath
((ChasePath *)*piVar6,(INextBot *)piVar6[1],(CBaseEntity *)piVar6[2],
(IPathCost *)piVar6[3],(Vector *)piVar6[4]);
piVar6[1] = iVar11;
*piVar6 = (int)pBVar13;
piVar6[-1] = 0xa65acf;
PathFollower::Update((PathFollower *)*piVar6,(INextBot *)piVar6[1]);
iVar12 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
piVar6[-1] = 0xa65aec;
iVar14 = ThreadGetCurrentId();
if (iVar12 == iVar14) {
*piVar6 = (int)_DAT_0105d15c;
piVar6[-1] = 0xa65f9d;
cVar3 = CVProfNode::ExitScope();
if (cVar3 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_38 != 0) {
piVar6[5] = 0;
piVar6[4] = 0;
piVar6[3] = 0;
*piVar6 = local_38;
piVar6[1] = local_40;
piVar6[2] = local_3c;
pcVar2 = *(code **)(local_38 + 0x54);
piVar6[-1] = 0xa65b27;
(*pcVar2)();
}
iVar12 = *(int *)(param_1 + 0x38);
*piVar6 = (int)pBVar13;
pcVar2 = *(code **)(iVar12 + 0x44);
piVar6[-1] = 0xa65b36;
BVar4 = (Boomer)(*pcVar2)();
param_1[0x4844] = BVar4;
LAB_00a65b3f:
piVar6[1] = iVar11;
piVar6[2] = (int)local_64;
*piVar6 = (int)pBVar13;
piVar6[-1] = 0xa65b55;
DirectChasePath::NotifyVictim
((DirectChasePath *)*piVar6,(INextBot *)piVar6[1],(CBaseEntity *)piVar6[2]);
*(undefined4 *)this = 0;
*(undefined4 *)(this + 4) = 0;
*(undefined4 *)(this + 8) = 0;
return this;
}
}
(**(code **)(*piVar5 + 0xc4))();
if ((((*(int *)(ZombieAllowAIToUseAbilities._28_4_ + 0x30) != 0) &&
(*(int *)((int)param_2 + 0x4018) == 0)) &&
(cVar3 = (**(code **)(*piVar7 + 0x32c))(), cVar3 != '\0')) &&
(cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x114))(), cVar3 != '\0')) {
piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9bc))();
cVar3 = (**(code **)(*piVar5 + 0xd0))();
if (cVar3 != '\0') {
pCVar16 = (CTerrorPlayer *)0x0;
uVar1 = *(uint *)(param_1 + 0x34);
if (((uVar1 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar1 >> 0xc)) {
pCVar16 = *(CTerrorPlayer **)(puVar18 + 4);
}
this_00 = ::operator_new(0x48);
/* try { // try from 00a65edf to 00a65ee3 has its CatchHandler @ 00a662f2 */
BoomerVomitOnVictim::BoomerVomitOnVictim(this_00,pCVar16);
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 *)this = 2;
*(BoomerVomitOnVictim **)(this + 4) = this_00;
*(char **)(this + 8) = "Launching vomit attack!";
return this;
}
}
piVar5 = (int *)((int)param_2 + 0x4028);
cVar3 = (**(code **)(*piVar5 + 0x11c))();
if (cVar3 != '\0') {
local_34 = &PTR_operator___00d20e60;
local_30 = piVar5;
local_28 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
pCVar10 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
iVar11 = (**(code **)(*(int *)pCVar10 + 0x14c))();
if (iVar11 == 0) {
local_24 = 0x3f800000;
}
else {
local_24 = *(undefined4 *)(iVar11 + 0x1cec);
}
cVar3 = (**(code **)(*(int *)pCVar10 + 0x16c))();
local_2c = (CBaseEntity *)0x0;
if (cVar3 != '\0') {
local_2c = pCVar10;
}
iVar11 = CBaseEntity::GetTeamNumber(pCVar10);
local_20 = 9;
if (iVar11 == 3) {
local_20 = (**(code **)(*(int *)pCVar10 + 0x544))();
}
local_64 = 0.0;
uVar1 = *(uint *)(param_1 + 0x34);
if (((uVar1 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar1 >> 0xc)) {
local_64 = *(float *)(puVar18 + 4);
}
pBVar13 = param_1 + 0x38;
piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
if ((((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar7 + 0xd4))(), cVar3 == '\0')) &&
(cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0')) &&
(cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0')) {
(**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
pfVar19 = (float *)&stack0xffffff50;
local_4c = local_40;
local_48 = local_3c;
local_44 = local_38;
pcVar2 = *(code **)(*piVar7 + 0x158);
(**(code **)(*piVar7 + 300))();
cVar3 = (*pcVar2)();
if (cVar3 == '\0') {
LAB_00a6629c:
local_68 = &local_4c;
pfVar19 = (float *)&stack0xffffff50;
goto LAB_00a65687;
}
if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
pVVar15 = (Vector *)(**(code **)(*piVar7 + 300))();
cVar3 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar15,(Vector *)&local_40);
if (cVar3 == '\0') goto LAB_00a6629c;
}
(**(code **)(*piVar7 + 0x120))();
(**(code **)(*piVar7 + 0xb4))();
piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
(**(code **)(*piVar7 + 0xc4))();
(**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
param_1[0x4844] = (Boomer)0x1;
}
else {
local_68 = (int *)0x0;
pfVar19 = (float *)&stack0xffffff54;
LAB_00a65687:
local_54 = 0;
local_50 = 0;
if (_towlower == 0) {
local_38 = 0;
}
else {
*pfVar19 = (float)_towlower;
pfVar19[1] = (float)&local_54;
pfVar19[0xb] = (float)"ChasePath::Update";
pfVar19[10] = (float)"NextBot";
pfVar19[9] = (float)"(%s)%s";
pfVar19[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
tm_fmt;
pfVar19[7] = 1.45735e-43;
pfVar19[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
pfVar19[5] = 0.0;
pfVar19[3] = 0.0;
pfVar19[4] = 0.0;
pfVar19[2] = 0.0;
pcVar2 = *(code **)(_towlower + 0x50);
pfVar19[-1] = 1.52759e-38;
(*pcVar2)();
local_38 = _towlower;
}
iVar11 = _DAT_0105db00;
local_40 = local_54;
local_3c = local_50;
if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
/* try { // try from 00a6572f to 00a65733 has its CatchHandler @ 00a662eb */
pfVar19[-1] = 1.5275975e-38;
iVar12 = ThreadGetCurrentId();
if (iVar11 == iVar12) {
if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
pfVar19[4] = 5.60519e-45;
pfVar19[3] = (float)"NextBot";
pfVar19[2] = 0.0;
pfVar19[1] = (float)"ChasePath::Update";
*pfVar19 = (float)_DAT_0105d15c;
/* try { // try from 00a661c7 to 00a661ea has its CatchHandler @ 00a662eb */
pfVar19[-1] = 1.5279775e-38;
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode
((char *)*pfVar19,(int)pfVar19[1],(char *)pfVar19[2],
(int)pfVar19[3]);
}
puVar8 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar8 = *puVar8 | 4;
*pfVar19 = (float)_DAT_0105d15c;
pfVar19[-1] = 1.5279819e-38;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
}
pfVar19[1] = (float)piVar5;
*pfVar19 = (float)pBVar13;
pfVar19[4] = (float)local_68;
pfVar19[3] = (float)&local_34;
pfVar19[2] = local_64;
/* try { // try from 00a65759 to 00a65769 has its CatchHandler @ 00a662ba */
pfVar19[-1] = 1.5276034e-38;
ChasePath::RefreshPath
((ChasePath *)*pfVar19,(INextBot *)pfVar19[1],(CBaseEntity *)pfVar19[2],
(IPathCost *)pfVar19[3],(Vector *)pfVar19[4]);
pfVar19[1] = (float)piVar5;
*pfVar19 = (float)pBVar13;
pfVar19[-1] = 1.527605e-38;
PathFollower::Update((PathFollower *)*pfVar19,(INextBot *)pfVar19[1]);
iVar11 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
pfVar19[-1] = 1.5276095e-38;
iVar12 = ThreadGetCurrentId();
if (iVar11 == iVar12) {
*pfVar19 = (float)_DAT_0105d15c;
pfVar19[-1] = 1.5279854e-38;
cVar3 = CVProfNode::ExitScope();
if (cVar3 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_38 != 0) {
pfVar19[5] = 0.0;
pfVar19[4] = 0.0;
pfVar19[3] = 0.0;
*pfVar19 = (float)local_38;
pfVar19[1] = (float)local_40;
pfVar19[2] = (float)local_3c;
pcVar2 = *(code **)(local_38 + 0x54);
pfVar19[-1] = 1.527618e-38;
(*pcVar2)();
}
iVar11 = *(int *)(param_1 + 0x38);
*pfVar19 = (float)pBVar13;
pcVar2 = *(code **)(iVar11 + 0x44);
pfVar19[-1] = 1.5276196e-38;
BVar4 = (Boomer)(*pcVar2)();
param_1[0x4844] = BVar4;
}
pfVar19[1] = (float)piVar5;
*pfVar19 = (float)pBVar13;
pfVar19[2] = local_64;
pfVar19[-1] = 1.5276236e-38;
DirectChasePath::NotifyVictim
((DirectChasePath *)*pfVar19,(INextBot *)pfVar19[1],(CBaseEntity *)pfVar19[2]);
if (*(int *)(param_1 + 0x443c) < 1) {
iVar11 = *(int *)param_2;
*pfVar19 = param_2;
pcVar2 = *(code **)(iVar11 + 0x9b0);
pfVar19[-1] = 1.5276269e-38;
piVar7 = (int *)(*pcVar2)();
pcVar2 = *(code **)(*piVar7 + 0xb4);
uVar1 = *(uint *)(param_1 + 0x34);
iVar11 = 0;
if (((uVar1 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar1 >> 0xc)) {
iVar11 = *(int *)(puVar18 + 4);
}
if ((*(byte *)(iVar11 + 0x14d) & 8) != 0) {
*pfVar19 = (float)iVar11;
pfVar19[-1] = 1.5279984e-38;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*pfVar19);
}
pfVar19[2] = 1.0;
pfVar19[1] = (float)(iVar11 + 0x2e0);
*pfVar19 = (float)piVar7;
pfVar19[-1] = 1.5276418e-38;
(*pcVar2)();
}
}
iVar11 = *piVar6;
*pfVar19 = (float)piVar6;
pcVar2 = *(code **)(iVar11 + 0x114);
pfVar19[-1] = 1.5276437e-38;
cVar3 = (*pcVar2)();
if (cVar3 == '\0') {
fVar17 = 0.0;
pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 0x114);
uVar1 = *(uint *)(param_1 + 0x34);
if (((uVar1 != 0xffffffff) &&
(puVar18 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar18 + 8) == uVar1 >> 0xc)) {
fVar17 = *(float *)(puVar18 + 4);
}
pfVar19[2] = 50.0;
pfVar19[1] = fVar17;
*pfVar19 = (float)piVar5;
pfVar19[-1] = 1.527657e-38;
cVar3 = (*pcVar2)();
if (cVar3 != '\0') {
iVar11 = *(int *)param_2;
pfVar19[1] = -1.0;
*pfVar19 = param_2;
pcVar2 = *(code **)(iVar11 + 0x940);
pfVar19[-1] = 1.5276608e-38;
(*pcVar2)();
}
}
LAB_00a653c4:
*(undefined4 *)this = 0;
*(undefined4 *)(this + 4) = 0;
*(undefined4 *)(this + 8) = 0;
return this;
}
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.