SurvivorLegsMoveOn::Update
0x009600a0 · 3726 bytes · __thiscall
_ZN18SurvivorLegsMoveOn6UpdateEP11SurvivorBotf
Decompiled
undefined (3 params)
/* SurvivorLegsMoveOn::Update(SurvivorBot*, float) */
SurvivorLegsMoveOn * __thiscall
SurvivorLegsMoveOn::Update(SurvivorLegsMoveOn *this,SurvivorBot *param_1,float param_2)
{
char cVar1;
SurvivorTeamSituation *this_00;
int iVar2;
CNavArea *pCVar3;
Vector *pVVar4;
int *piVar5;
int iVar6;
undefined4 *puVar7;
undefined4 uVar8;
undefined4 uVar9;
SurvivorLegsCoverOrphan *this_01;
undefined4 *puVar10;
SurvivorLegsCoverFriendInCombat *this_02;
CTerrorPlayer *pCVar11;
undefined *puVar12;
uint uVar13;
SurvivorTeamSituation *pSVar14;
uint uVar15;
longdouble lVar16;
float fVar17;
CTerrorPlayer *local_4c;
float local_48;
int local_30;
undefined4 local_2c;
undefined4 local_28;
int local_24;
int local_20;
this_00 = (SurvivorTeamSituation *)SurvivorBot::GetTeamSituation((SurvivorBot *)param_2);
piVar5 = *(int **)(TheDirector + 0x638);
if (*piVar5 == 5) {
if (((char)piVar5[0x44] == '\0') || (*(char *)((int)piVar5 + 0x111) != '\0')) goto LAB_009600d1;
}
else if (piVar5[1] != 6) {
LAB_009600d1:
lVar16 = (longdouble)CountdownTimer::Now();
if ((*(float *)(param_1 + 0x54) <= (float)lVar16) && (*(int *)(TheDirector + 0x1c0) < 1)) {
lVar16 = (longdouble)RandomFloat(0x40400000,0x40a00000);
fVar17 = (float)lVar16;
lVar16 = (longdouble)CountdownTimer::Now();
if ((float)lVar16 + fVar17 != *(float *)(param_1 + 0x54)) {
(**(code **)(*(int *)(param_1 + 0x4c) + 4))(param_1 + 0x4c,param_1 + 0x54);
*(float *)(param_1 + 0x54) = (float)lVar16 + fVar17;
}
if (fVar17 != *(float *)(param_1 + 0x50)) {
(**(code **)(*(int *)(param_1 + 0x4c) + 4))(param_1 + 0x4c,param_1 + 0x50);
*(float *)(param_1 + 0x50) = fVar17;
}
pCVar3 = (CNavArea *)(**(code **)(*(int *)param_2 + 0x52c))(param_2);
if ((pCVar3 != (CNavArea *)0x0) && ((*(uint *)(pCVar3 + 300) & 0x140) != 0)) {
local_30 = 0;
local_2c = 0;
local_28 = 0;
local_24 = 0;
local_20 = 0;
/* try { // try from 00960436 to 009604c3 has its CatchHandler @ 00960fbf */
pVVar4 = (Vector *)
(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xd4))((int)param_2 + 0x4028);
SearchSurroundingAreas<FindBattlestationScan>
(pCVar3,pVVar4,(FindBattlestationScan *)&local_30,500.0,0,-1);
iVar2 = 0;
if (0 < local_24) {
do {
fVar17 = *(float *)(*(int *)(local_30 + iVar2 * 4) + 0x154);
lVar16 = (longdouble)CTerrorPlayer::GetFlowDistance((CTerrorPlayer *)param_2,0);
if (fVar17 <= (float)lVar16) {
puVar7 = ::operator_new(0x483c);
puVar7[8] = 0;
puVar7[9] = 0;
puVar7[10] = 0;
puVar7[3] = 0;
puVar7[4] = 0;
puVar7[5] = 0;
puVar7[6] = 0;
puVar7[7] = 0;
puVar7[2] = 0;
*(undefined1 *)(puVar7 + 0xc) = 0;
*(undefined1 *)((int)puVar7 + 0x31) = 0;
puVar7[0xb] = 0;
*puVar7 = &PTR__SurvivorLegsBattleStations_00d0ae48;
puVar7[1] = &PTR__SurvivorLegsBattleStations_00d0afb0;
/* try { // try from 00960528 to 0096052c has its CatchHandler @ 00960fe6 */
PathFollower::PathFollower((PathFollower *)(puVar7 + 0xd));
puVar7[0x1206] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x1207] = 0;
puVar7[0x1208] = 0xbf800000;
puVar7[0x1209] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120a] = 0;
puVar7[0x120b] = 0xbf800000;
puVar7[0x120c] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120d] = 0;
puVar7[0x120e] = 0xbf800000;
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
local_24 = 0;
*(undefined4 **)(this + 4) = puVar7;
*(undefined4 *)this = 2;
*(char **)(this + 8) = "I\'ve entered a battlefield";
CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_30);
local_20 = local_30;
CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_30);
return this;
}
iVar2 = iVar2 + 1;
} while (iVar2 < local_24);
}
local_24 = 0;
CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_30);
local_20 = local_30;
CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_30);
}
}
}
if (*(int *)(this_00 + 0xc4) == 0) goto LAB_00960105;
piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9a0))(param_2);
cVar1 = (**(code **)(*piVar5 + 0xd4))(piVar5);
if (cVar1 != '\0') goto LAB_00960105;
cVar1 = SurvivorBot::IsAvailable((SurvivorBot *)param_2);
if (cVar1 != '\0') {
if (*(int *)(this_00 + 0xc4) < 1) {
local_4c = (CTerrorPlayer *)0x0;
}
else {
iVar2 = 0;
local_4c = (CTerrorPlayer *)0x0;
local_48 = 3.4028235e+38;
pSVar14 = this_00;
do {
uVar15 = *(uint *)(pSVar14 + 0x88);
pCVar11 = (CTerrorPlayer *)0x0;
if (((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) {
pCVar11 = *(CTerrorPlayer **)(puVar12 + 4);
}
cVar1 = CTerrorPlayer::IsInCombat(pCVar11,true);
if (cVar1 != '\0') {
uVar15 = *(uint *)(pSVar14 + 0x88);
pCVar11 = (CTerrorPlayer *)0x0;
if (((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc
)) && (*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) {
pCVar11 = *(CTerrorPlayer **)(puVar12 + 4);
}
cVar1 = SurvivorBot::IsAbleToCoverFriend((SurvivorBot *)param_2,pCVar11);
if (cVar1 == '\0') {
uVar15 = *(uint *)(pSVar14 + 0x88);
pCVar11 = (CTerrorPlayer *)0x0;
if (((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
puVar12 != (undefined *)0xfffffffc)) && (*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) {
pCVar11 = *(CTerrorPlayer **)(puVar12 + 4);
}
piVar5 = (int *)SurvivorTeamSituation::GetPathToFriend(this_00,pCVar11);
if (piVar5 == (int *)0x0) {
cVar1 = INextBot::IsDebugging((INextBot *)((int)param_2 + 0x4028),0x100);
if (cVar1 != '\0') {
uVar15 = *(uint *)(pSVar14 + 0x88);
piVar5 = (int *)0x0;
if (((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
puVar12 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) {
piVar5 = *(int **)(puVar12 + 4);
}
uVar8 = (**(code **)(*piVar5 + 0xb8))(piVar5);
uVar9 = (**(code **)(*(int *)param_2 + 0x9b8))(param_2);
DevMsg("%3.2f: ERROR SurvivorBot %s can\'t move to help %s - no path\n",
(double)*(float *)(gpGlobals + 0xc),uVar9,uVar8);
}
}
else {
lVar16 = (longdouble)(**(code **)(*piVar5 + 8))(piVar5);
if ((float)lVar16 < local_48) {
lVar16 = (longdouble)(**(code **)(*piVar5 + 8))(piVar5);
uVar15 = *(uint *)(pSVar14 + 0x88);
local_4c = (CTerrorPlayer *)0x0;
local_48 = (float)lVar16;
if (((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
puVar12 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) {
local_4c = *(CTerrorPlayer **)(puVar12 + 4);
}
}
}
}
}
iVar2 = iVar2 + 1;
pSVar14 = pSVar14 + 4;
} while (iVar2 < *(int *)(this_00 + 0xc4));
}
cVar1 = CTerrorGameRules::IsScavengeMode();
if ((cVar1 == '\0') && (cVar1 = CTerrorGameRules::IsVersusMode(), cVar1 == '\0')) {
if (((local_4c != (CTerrorPlayer *)0x0) &&
((cVar1 = (**(code **)(*(int *)local_4c + 0x778))(local_4c), cVar1 == '\0' ||
((cVar1 = SurvivorTeamSituation::IsAnyTeammateNearCheckpoint(this_00), cVar1 == '\0' &&
(cVar1 = CDirector::IsFinaleVehicleReady(TheDirector), cVar1 == '\0')))))) &&
(cVar1 = SurvivorBot::IsReachable((SurvivorBot *)param_2,local_4c), cVar1 != '\0')) {
this_02 = ::operator_new(0x484c);
/* try { // try from 00960f40 to 00960f44 has its CatchHandler @ 00960f96 */
SurvivorLegsCoverFriendInCombat::SurvivorLegsCoverFriendInCombat(this_02,local_4c);
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 *)this = 2;
*(SurvivorLegsCoverFriendInCombat **)(this + 4) = this_02;
*(char **)(this + 8) = "A friend is in combat and I\'m not - moving to assist";
return this;
}
uVar15 = *(uint *)(this_00 + 0xd710);
if (uVar15 != 0xffffffff) {
uVar13 = uVar15 & 0xfff;
puVar7 = (undefined4 *)(g_pEntityList + uVar13 * 0x10 + 4);
if (((puVar7 != (undefined4 *)0x0) &&
(*(uint *)(g_pEntityList + uVar13 * 0x10 + 8) == uVar15 >> 0xc)) &&
(iVar2 = *(int *)(g_pEntityList + uVar13 * 0x10 + 4), iVar2 != 0)) {
if (0.0 < *(float *)(iVar2 + 0x2f64)) {
lVar16 = (longdouble)IntervalTimer::Now();
if ((float)lVar16 - *(float *)(iVar2 + 0x2f64) <= 3.0) goto LAB_009606dd;
uVar15 = *(uint *)(this_00 + 0xd710);
piVar5 = (int *)0x0;
if ((uVar15 != 0xffffffff) &&
(puVar7 = (undefined4 *)(g_pEntityList + (uVar15 & 0xfff) * 0x10 + 4),
puVar7 != (undefined4 *)0x0)) goto LAB_00960a2f;
}
else {
LAB_00960a2f:
if (puVar7[1] == uVar15 >> 0xc) {
piVar5 = (int *)*puVar7;
}
else {
piVar5 = (int *)0x0;
}
}
cVar1 = (**(code **)(*piVar5 + 0x778))(piVar5);
if ((cVar1 == '\0') &&
(cVar1 = SurvivorBot::IsEscortingHumanPlayers((SurvivorBot *)param_2), cVar1 == '\0'))
{
pCVar11 = (CTerrorPlayer *)0x0;
uVar15 = *(uint *)(this_00 + 0xd710);
if ((uVar15 != 0xffffffff) &&
((puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
puVar12 != (undefined *)0xfffffffc && (*(uint *)(puVar12 + 8) == uVar15 >> 0xc)))) {
pCVar11 = *(CTerrorPlayer **)(puVar12 + 4);
}
this_01 = ::operator_new(0x484c);
/* try { // try from 00960aad to 00960ab1 has its CatchHandler @ 00960faa */
SurvivorLegsCoverOrphan::SurvivorLegsCoverOrphan(this_01,pCVar11);
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 *)this = 2;
*(SurvivorLegsCoverOrphan **)(this + 4) = this_01;
*(char **)(this + 8) = "A friend is orphaned, and I\'m the closest to him";
return this;
}
}
}
}
LAB_009606dd:
fVar17 = *(float *)(SurvivorBotSeparationDangerMaxRange._28_4_ + 0x2c);
cVar1 = SurvivorBot::IsEscortingHumanPlayers((SurvivorBot *)param_2);
if (cVar1 != '\0') {
lVar16 = (longdouble)SurvivorBot::GetEscortRange();
fVar17 = (float)lVar16 + 48.0;
}
uVar15 = *(uint *)(this_00 + 0x30);
if (((((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) &&
((*(CTerrorPlayer **)(puVar12 + 4) != (CTerrorPlayer *)0x0 &&
(fVar17 < *(float *)(this_00 + 0x34))))) &&
(cVar1 = SurvivorBot::IsReachable((SurvivorBot *)param_2,*(CTerrorPlayer **)(puVar12 + 4)),
cVar1 != '\0')) {
piVar5 = (int *)0x0;
uVar15 = *(uint *)(this_00 + 0x30);
if (((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) {
piVar5 = *(int **)(puVar12 + 4);
}
puVar7 = ::operator_new(0x484c);
puVar7[8] = 0;
puVar7[9] = 0;
puVar7[10] = 0;
puVar7[3] = 0;
puVar7[4] = 0;
puVar7[5] = 0;
puVar7[6] = 0;
puVar7[7] = 0;
puVar7[2] = 0;
*(undefined1 *)(puVar7 + 0xc) = 0;
*(undefined1 *)((int)puVar7 + 0x31) = 0;
puVar7[0xb] = 0;
*puVar7 = &PTR__SurvivorLegsRegroup_00d0c528;
puVar7[1] = &PTR__SurvivorLegsRegroup_00d0c690;
puVar7[0xd] = 0xffffffff;
/* try { // try from 00960e1b to 00960e1f has its CatchHandler @ 00960f7c */
PathFollower::PathFollower((PathFollower *)(puVar7 + 0xe));
puVar7[0xe] = &PTR__ChasePath_00bfaa48;
puVar7[0x1206] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x1207] = 0;
puVar7[0x1208] = 0xbf800000;
puVar7[0x1209] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120a] = 0;
puVar7[0x120b] = 0xbf800000;
puVar7[0x120c] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120d] = 0;
puVar7[0x120e] = 0xbf800000;
puVar7[0x120f] = 0xffffffff;
puVar7[0x1210] = 1;
puVar7[0x1211] = &PTR_NetworkStateChanged_00c23e10;
puVar7[0x1212] = 0xbf800000;
if (piVar5 == (int *)0x0) {
puVar7[0xd] = 0xffffffff;
}
else {
/* try { // try from 00960eb4 to 00960eb6 has its CatchHandler @ 00960fac */
puVar10 = (undefined4 *)(**(code **)(*piVar5 + 0xc))(piVar5);
puVar7[0xd] = *puVar10;
}
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 *)this = 2;
*(undefined4 **)(this + 4) = puVar7;
*(char **)(this + 8) = "I\'m too far away from the closest human survivor";
return this;
}
}
lVar16 = (longdouble)SurvivorTeamSituation::GetTimeSinceAnyFriendVisible(this_00);
if ((3.0 < (float)lVar16) &&
(iVar2 = SurvivorTeamSituation::GetClosestReachableFriend(this_00), iVar2 != 0)) {
puVar7 = ::operator_new(0x484c);
puVar7[8] = 0;
puVar7[9] = 0;
puVar7[10] = 0;
puVar7[3] = 0;
puVar7[4] = 0;
puVar7[5] = 0;
puVar7[6] = 0;
puVar7[7] = 0;
puVar7[2] = 0;
*(undefined1 *)(puVar7 + 0xc) = 0;
*(undefined1 *)((int)puVar7 + 0x31) = 0;
puVar7[0xb] = 0;
*puVar7 = &PTR__SurvivorLegsRegroup_00d0c528;
puVar7[1] = &PTR__SurvivorLegsRegroup_00d0c690;
puVar7[0xd] = 0xffffffff;
/* try { // try from 00960b82 to 00960b86 has its CatchHandler @ 00960fa8 */
PathFollower::PathFollower((PathFollower *)(puVar7 + 0xe));
puVar7[0xe] = &PTR__ChasePath_00bfaa48;
puVar7[0x1206] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x1207] = 0;
puVar7[0x1208] = 0xbf800000;
puVar7[0x1209] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120a] = 0;
puVar7[0x120b] = 0xbf800000;
puVar7[0x120c] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120d] = 0;
puVar7[0x120e] = 0xbf800000;
puVar7[0x120f] = 0xffffffff;
puVar7[0x1210] = 1;
puVar7[0x1211] = &PTR_NetworkStateChanged_00c23e10;
puVar7[0x1212] = 0xbf800000;
puVar7[0xd] = 0xffffffff;
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 *)this = 2;
*(undefined4 **)(this + 4) = puVar7;
*(char **)(this + 8) = "I\'ve lost sight of the team";
return this;
}
uVar15 = *(uint *)(this_00 + 0x50);
if (((((uVar15 != 0xffffffff) &&
(puVar12 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar12 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar12 + 8) == uVar15 >> 0xc)) &&
((*(CTerrorPlayer **)(puVar12 + 4) != (CTerrorPlayer *)0x0 &&
(iVar2 = CTerrorPlayer::GetMovingPlatform(*(CTerrorPlayer **)(puVar12 + 4)), iVar2 != 0))))
&& (iVar6 = CTerrorPlayer::GetMovingPlatform((CTerrorPlayer *)param_2), iVar2 != iVar6)) {
puVar7 = ::operator_new(0x4840);
puVar7[8] = 0;
puVar7[9] = 0;
puVar7[10] = 0;
puVar7[3] = 0;
puVar7[4] = 0;
puVar7[5] = 0;
puVar7[6] = 0;
puVar7[7] = 0;
puVar7[2] = 0;
*(undefined1 *)(puVar7 + 0xc) = 0;
*(undefined1 *)((int)puVar7 + 0x31) = 0;
puVar7[0xb] = 0;
*puVar7 = &PTR__SurvivorLegsApproachElevator_00d0cba8;
puVar7[1] = &PTR__SurvivorLegsApproachElevator_00d0cd10;
/* try { // try from 00960822 to 00960826 has its CatchHandler @ 00960ffc */
PathFollower::PathFollower((PathFollower *)(puVar7 + 0xd));
puVar7[0xd] = &PTR__ChasePath_00bfaa48;
puVar7[0x1205] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x1206] = 0;
puVar7[0x1207] = 0xbf800000;
puVar7[0x1208] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x1209] = 0;
puVar7[0x120a] = 0xbf800000;
puVar7[0x120b] = &PTR_NetworkStateChanged_00c0b6e0;
puVar7[0x120c] = 0;
puVar7[0x120d] = 0xbf800000;
puVar7[0x120e] = 0xffffffff;
puVar7[0x120f] = 1;
*(undefined4 *)(param_1 + 0x20) = 0;
*(undefined4 *)(param_1 + 0x24) = 0;
*(undefined4 *)(param_1 + 0x28) = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 *)this = 2;
*(undefined4 **)(this + 4) = puVar7;
*(char **)(this + 8) = "Joining team leader on a platform";
return this;
}
LAB_00960105:
iVar2 = SurvivorBot::GetPace((SurvivorBot *)param_2);
if (iVar2 != 0) {
if (iVar2 == 1) {
(**(code **)(*(int *)param_2 + 0x988))(param_2,0xbf800000);
cVar1 = SurvivorBot::IsEscortingHumanPlayers((SurvivorBot *)param_2);
}
else {
cVar1 = SurvivorBot::IsEscortingHumanPlayers((SurvivorBot *)param_2);
}
if ((cVar1 == '\0') || (cVar1 = SurvivorBot::AreAnyHumanSurvivorsInCheckpoint(), cVar1 != '\0'))
{
MoveTowardsNextCheckpoint((SurvivorLegsMoveOn *)param_1,(SurvivorBot *)param_2);
}
*(undefined4 *)this = 0;
*(undefined4 *)(this + 4) = 0;
*(undefined4 *)(this + 8) = 0;
return this;
}
piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9a0))(param_2);
(**(code **)(*piVar5 + 0x170))(piVar5,"Pace == STOP");
*(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.