MinigunFire
0x005490e0 · 5979 bytes · __cdecl
_Z11MinigunFireP13CTerrorPlayerP12CPropMinigunRK6VectorS5_RK6QAnglefb
Decompiled
undefined (7 params)
/* MinigunFire(CTerrorPlayer*, CPropMinigun*, Vector const&, Vector const&, QAngle const&, float,
bool) */
void MinigunFire(CTerrorPlayer *param_1,CPropMinigun *param_2,Vector *param_3,Vector *param_4,
QAngle *param_5,float param_6,bool param_7)
{
float fVar1;
code *pcVar2;
char cVar3;
CAmmoDef *this;
int iVar4;
CBaseEntity *this_00;
int iVar5;
uint uVar6;
CTakeDamageInfo *pCVar7;
Vector *pVVar8;
float *pfVar9;
int *piVar10;
undefined4 uVar11;
int iVar12;
longdouble lVar13;
Vector *pVVar14;
Vector *pVVar15;
Vector *pVVar16;
CTraceFilterSimple *pCVar17;
Vector *pVVar18;
float local_168;
float local_164;
float local_160 [3];
float local_154;
float local_150;
float local_14c;
float local_148;
Vector local_144 [12];
float local_138;
float local_134;
float local_130;
float local_12c;
float local_128;
float local_124;
float local_120;
float local_11c;
float local_118;
undefined **local_114;
float local_110;
float local_10c;
CPropMinigun *local_100;
CBaseEntity *local_fc;
float local_f8;
float local_f4;
float local_f0;
float local_ec;
float local_e8;
float local_e4;
int local_e0;
float local_dc;
float local_d8;
char local_d4;
float local_d0;
float local_cc;
float local_c8;
undefined4 local_c4;
undefined4 local_c0;
undefined4 local_bc;
float local_a4;
ushort local_8e;
CTakeDamageInfo *local_84;
float local_7c;
float local_78;
float local_74;
float local_6c;
float local_68;
float local_64;
undefined4 local_5c;
undefined4 local_58;
undefined4 local_54;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_3c;
undefined1 local_38;
undefined1 local_37;
int local_28;
CCSPlayer::StartNewBulletGroup();
this = (CAmmoDef *)GetAmmoDef();
iVar4 = CAmmoDef::Index(this,"AMMO_TYPE_MINIGUN");
pVVar16 = (Vector *)0x0;
pVVar14 = (Vector *)&local_150;
pVVar15 = (Vector *)0x0;
AngleVectors(param_5,pVVar14,(Vector *)0x0,(Vector *)0x0);
local_d4 = '\0';
local_d8 = 10000.0;
local_ec = local_150;
local_100 = param_2;
local_e8 = local_14c;
local_e4 = local_148;
local_fc = (CBaseEntity *)param_1;
local_f8 = *(float *)param_3;
local_f4 = *(float *)(param_3 + 4);
local_f0 = *(float *)(param_3 + 8);
local_dc = 1.0 - param_6;
local_e0 = iVar4;
if (0 < *(int *)(gpGlobals + 0x14)) {
iVar12 = 1;
do {
this_00 = (CBaseEntity *)UTIL_PlayerByIndex(iVar12);
if ((((((this_00 != (CBaseEntity *)0x0) && (*(int *)(this_00 + 0x30) != 0)) &&
(*(int *)(this_00 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4 != 0)) &&
((cVar3 = (**(code **)(*(int *)this_00 + 0x16c))(this_00), cVar3 != '\0' &&
(*(int *)(this_00 + 0x1f6c) != 2)))) &&
((iVar5 = (**(code **)(*(int *)this_00 + 0x148))(this_00), iVar5 == 0 &&
((this_00 != local_fc &&
(cVar3 = (**(code **)(*(int *)this_00 + 300))(this_00), cVar3 != '\0')))))) &&
((cVar3 = (**(code **)(*(int *)this_00 + 0x16c))(this_00), cVar3 == '\0' ||
(cVar3 = (**(code **)(*(int *)this_00 + 0x558))(this_00), cVar3 == '\0')))) {
pVVar14 = (Vector *)0x64;
iVar5 = RandomInt(0,100);
if (iVar5 < 0x1a) {
local_138 = local_f8;
local_12c = local_ec * local_d8;
local_128 = local_e8 * local_d8;
local_124 = local_d8 * local_e4;
local_134 = local_f4;
local_120 = local_12c + local_f8;
local_11c = local_128 + local_f4;
local_130 = local_f0;
local_118 = local_124 + local_f0;
pVVar8 = (Vector *)(**(code **)(*(int *)this_00 + 0x288))(this_00);
pVVar16 = local_144;
pVVar15 = (Vector *)&local_120;
pVVar14 = (Vector *)&local_138;
CalcClosestPointOnLineSegment(pVVar8,(Vector *)&local_138,pVVar15,pVVar16,&local_154);
local_12c = local_12c * local_154;
local_128 = local_128 * local_154;
local_124 = local_124 * local_154;
if ((0.0 <= local_154) && (local_154 <= 1.0)) {
local_114 = (undefined **)(local_12c + local_138);
local_110 = local_128 + local_134;
local_10c = local_124 + local_130;
pfVar9 = (float *)(**(code **)(*(int *)(this_00 + 0x194) + 8))(this_00 + 0x194);
if (((byte)this_00[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(this_00);
}
local_d0 = *pfVar9 + *(float *)(this_00 + 0x2e0);
local_cc = pfVar9[1] + *(float *)(this_00 + 0x2e4);
local_c8 = pfVar9[2] + *(float *)(this_00 + 0x2e8);
pfVar9 = (float *)(**(code **)(*(int *)(this_00 + 0x194) + 4))(this_00 + 0x194);
if (((byte)this_00[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(this_00);
}
pCVar17 = (CTraceFilterSimple *)&local_114;
local_7c = *pfVar9 + *(float *)(this_00 + 0x2e0);
local_78 = pfVar9[1] + *(float *)(this_00 + 0x2e4);
pVVar8 = (Vector *)&local_7c;
local_74 = pfVar9[2] + *(float *)(this_00 + 0x2e8);
pVVar18 = (Vector *)&local_d0;
pVVar14 = pVVar18;
pVVar15 = (Vector *)pCVar17;
lVar13 = (longdouble)CalcSqrDistanceToAABB(pVVar8,pVVar18,(Vector *)pCVar17);
if (0.0 < (float)lVar13) {
pfVar9 = (float *)(**(code **)(*(int *)this_00 + 0x288))(this_00);
local_128 = pfVar9[1] - local_134;
local_124 = pfVar9[2] - local_130;
local_12c = *pfVar9 - local_138;
}
lVar13 = (longdouble)VectorNormalize((Vector *)&local_12c);
fVar1 = (float)lVar13;
if (local_dc < local_128 * local_e8 + local_12c * local_ec + local_124 * local_e4) {
CTraceFilterSimple::CTraceFilterSimple
(pCVar17,(IHandleEntity *)local_100,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
pVVar15 = (Vector *)0x200400b;
local_114 = &PTR_ShouldHitEntity_00c54558;
local_78 = local_128 * fVar1 + local_134;
local_74 = local_124 * fVar1 + local_130;
local_7c = fVar1 * local_12c + local_138;
pVVar14 = pVVar8;
UTIL_TraceLine((Vector *)&local_138,pVVar8,0x200400b,(ITraceFilter *)pCVar17,
(CGameTrace *)pVVar18);
pVVar16 = (Vector *)pCVar17;
if (local_a4 == 1.0) {
ClearMultiDamage();
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)pVVar8,(CBaseEntity *)local_100,local_fc,
*(float *)(MinigunDamageRate._28_4_ + 0x2c) /
*(float *)(MinigunRateOfFire._28_4_ + 0x2c),-0x7ffffffe,0);
pVVar15 = (Vector *)&local_ec;
CalculateBulletDamageForce
((CTakeDamageInfo *)pVVar8,local_e0,pVVar15,(Vector *)&local_c4,1.0);
local_28 = local_e0;
CBaseEntity::DispatchTraceAttack
((CTakeDamageInfo *)this_00,pVVar8,(CGameTrace *)pVVar15);
ApplyMultiDamage();
pVVar14 = pVVar8;
pVVar16 = pVVar18;
}
}
}
}
}
iVar12 = iVar12 + 1;
} while (iVar12 <= *(int *)(gpGlobals + 0x14));
}
iVar12 = TheNextBots();
uVar6 = (uint)*(ushort *)(iVar12 + 0x10);
if (uVar6 != 0xffff) {
iVar5 = *(int *)(iVar12 + 4);
do {
piVar10 = *(int **)(iVar5 + uVar6 * 8);
pCVar7 = (CTakeDamageInfo *)(**(code **)(*piVar10 + 0xb4))(piVar10,pVVar14,pVVar15,pVVar16);
if (((pCVar7 != (CTakeDamageInfo *)local_fc) &&
(cVar3 = (**(code **)(*(int *)pCVar7 + 300))(pCVar7), cVar3 != '\0')) &&
((cVar3 = (**(code **)(*(int *)pCVar7 + 0x16c))(pCVar7), cVar3 == '\0' ||
(cVar3 = (**(code **)(*(int *)pCVar7 + 0x558))(pCVar7), cVar3 == '\0')))) {
pVVar14 = (Vector *)0x64;
iVar5 = RandomInt(0);
if (iVar5 < 0x1a) {
local_138 = local_f8;
local_12c = local_ec * local_d8;
local_128 = local_e8 * local_d8;
local_124 = local_d8 * local_e4;
local_134 = local_f4;
local_120 = local_12c + local_f8;
local_11c = local_128 + local_f4;
local_130 = local_f0;
local_118 = local_124 + local_f0;
pVVar8 = (Vector *)(**(code **)(*(int *)pCVar7 + 0x288))(pCVar7);
pVVar15 = (Vector *)&local_120;
pVVar16 = local_144;
pVVar14 = (Vector *)&local_138;
CalcClosestPointOnLineSegment(pVVar8,pVVar14,pVVar15,pVVar16,&local_154);
local_12c = local_12c * local_154;
local_128 = local_128 * local_154;
local_124 = local_124 * local_154;
if ((0.0 <= local_154) && (local_154 <= 1.0)) {
local_114 = (undefined **)(local_12c + local_138);
local_110 = local_128 + local_134;
local_10c = local_124 + local_130;
pfVar9 = (float *)(**(code **)(*(int *)(pCVar7 + 0x194) + 8))(pCVar7 + 0x194);
if (((byte)pCVar7[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)pCVar7);
}
local_d0 = *pfVar9 + *(float *)(pCVar7 + 0x2e0);
local_cc = pfVar9[1] + *(float *)(pCVar7 + 0x2e4);
local_c8 = pfVar9[2] + *(float *)(pCVar7 + 0x2e8);
pfVar9 = (float *)(**(code **)(*(int *)(pCVar7 + 0x194) + 4))(pCVar7 + 0x194);
if (((byte)pCVar7[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)pCVar7);
}
local_7c = *pfVar9 + *(float *)(pCVar7 + 0x2e0);
local_78 = pfVar9[1] + *(float *)(pCVar7 + 0x2e4);
pCVar17 = (CTraceFilterSimple *)&local_114;
local_74 = pfVar9[2] + *(float *)(pCVar7 + 0x2e8);
pVVar18 = (Vector *)&local_d0;
pVVar8 = (Vector *)&local_7c;
pVVar14 = pVVar18;
pVVar15 = (Vector *)pCVar17;
lVar13 = (longdouble)CalcSqrDistanceToAABB(pVVar8,pVVar18,(Vector *)pCVar17);
if (0.0 < (float)lVar13) {
pfVar9 = (float *)(**(code **)(*(int *)pCVar7 + 0x288))(pCVar7);
local_128 = pfVar9[1] - local_134;
local_124 = pfVar9[2] - local_130;
local_12c = *pfVar9 - local_138;
}
lVar13 = (longdouble)VectorNormalize((Vector *)&local_12c);
fVar1 = (float)lVar13;
if (local_dc < local_128 * local_e8 + local_12c * local_ec + local_124 * local_e4) {
CTraceFilterSimple::CTraceFilterSimple
(pCVar17,(IHandleEntity *)local_100,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
local_114 = &PTR_ShouldHitEntity_00c54558;
local_44 = 0;
local_48 = 0;
local_6c = local_12c * fVar1;
local_38 = 1;
local_68 = local_128 * fVar1;
local_4c = 0;
local_64 = fVar1 * local_124;
local_3c = 0;
local_54 = 0;
local_58 = 0;
local_5c = 0;
local_37 = local_68 * local_68 + local_6c * local_6c + local_64 * local_64 != 0.0;
local_7c = local_138;
local_78 = local_134;
local_74 = local_130;
pVVar15 = (Vector *)0x200400b;
pVVar14 = pVVar8;
(**(code **)(*enginetrace + 0x14))(enginetrace);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
pVVar14 = (Vector *)&local_c4;
pCVar17 = (CTraceFilterSimple *)0x0;
pVVar15 = (Vector *)0xff;
DebugDrawLine(pVVar18,pVVar14,0xff,0,0,true,-1.0);
}
pVVar16 = (Vector *)pCVar17;
if (local_a4 == 1.0) {
ClearMultiDamage();
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)pVVar8,(CBaseEntity *)local_100,local_fc,
*(float *)(MinigunDamageRate._28_4_ + 0x2c) /
*(float *)(MinigunRateOfFire._28_4_ + 0x2c),-0x7ffffffe,0);
pVVar15 = (Vector *)&local_ec;
CalculateBulletDamageForce
((CTakeDamageInfo *)pVVar8,local_e0,pVVar15,(Vector *)&local_c4,1.0);
local_28 = local_e0;
CBaseEntity::DispatchTraceAttack(pCVar7,pVVar8,(CGameTrace *)pVVar15);
ApplyMultiDamage();
pVVar14 = pVVar8;
pVVar16 = pVVar18;
}
}
}
}
}
iVar5 = *(int *)(iVar12 + 4);
uVar6 = (uint)*(ushort *)(iVar5 + 6 + uVar6 * 8);
} while (uVar6 != 0xffff);
}
pVVar14 = (Vector *)0xc23804;
piVar10 = (int *)CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)gEntList,(CBaseEntity *)0x0,"tank_rock");
if (((((piVar10 != (int *)0x0) &&
(pCVar7 = (CTakeDamageInfo *)(**(code **)(*piVar10 + 0x144))(piVar10),
pCVar7 != (CTakeDamageInfo *)0x0)) && (pCVar7 != (CTakeDamageInfo *)local_fc)) &&
((cVar3 = (**(code **)(*(int *)pCVar7 + 300))(pCVar7), cVar3 != '\0' &&
((cVar3 = (**(code **)(*(int *)pCVar7 + 0x16c))(pCVar7), cVar3 == '\0' ||
(cVar3 = (**(code **)(*(int *)pCVar7 + 0x558))(pCVar7), cVar3 == '\0')))))) &&
(iVar12 = RandomInt(0,100), iVar12 < 0x1a)) {
local_138 = local_f8;
local_12c = local_ec * local_d8;
local_128 = local_e8 * local_d8;
local_124 = local_d8 * local_e4;
local_134 = local_f4;
local_120 = local_12c + local_f8;
local_11c = local_128 + local_f4;
local_130 = local_f0;
local_118 = local_124 + local_f0;
pVVar15 = (Vector *)(**(code **)(*(int *)pCVar7 + 0x288))(pCVar7);
pVVar16 = local_144;
pVVar14 = (Vector *)&local_120;
CalcClosestPointOnLineSegment(pVVar15,(Vector *)&local_138,pVVar14,pVVar16,&local_154);
local_12c = local_12c * local_154;
local_128 = local_128 * local_154;
local_124 = local_124 * local_154;
if ((0.0 <= local_154) && (local_154 <= 1.0)) {
local_114 = (undefined **)(local_12c + local_138);
local_110 = local_128 + local_134;
local_10c = local_124 + local_130;
pfVar9 = (float *)(**(code **)(*(int *)(pCVar7 + 0x194) + 8))(pCVar7 + 0x194);
if (((byte)pCVar7[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)pCVar7);
}
local_d0 = *pfVar9 + *(float *)(pCVar7 + 0x2e0);
local_cc = pfVar9[1] + *(float *)(pCVar7 + 0x2e4);
local_c8 = pfVar9[2] + *(float *)(pCVar7 + 0x2e8);
pfVar9 = (float *)(**(code **)(*(int *)(pCVar7 + 0x194) + 4))(pCVar7 + 0x194);
if (((byte)pCVar7[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)pCVar7);
}
pVVar15 = (Vector *)&local_d0;
local_7c = *pfVar9 + *(float *)(pCVar7 + 0x2e0);
local_78 = pfVar9[1] + *(float *)(pCVar7 + 0x2e4);
pCVar17 = (CTraceFilterSimple *)&local_114;
local_74 = pfVar9[2] + *(float *)(pCVar7 + 0x2e8);
pVVar14 = (Vector *)pCVar17;
lVar13 = (longdouble)CalcSqrDistanceToAABB((Vector *)&local_7c,pVVar15,(Vector *)pCVar17);
if (0.0 < (float)lVar13) {
pfVar9 = (float *)(**(code **)(*(int *)pCVar7 + 0x288))(pCVar7);
local_128 = pfVar9[1] - local_134;
local_124 = pfVar9[2] - local_130;
local_12c = *pfVar9 - local_138;
}
lVar13 = (longdouble)VectorNormalize((Vector *)&local_12c);
fVar1 = (float)lVar13;
if (local_dc < local_128 * local_e8 + local_12c * local_ec + local_124 * local_e4) {
CTraceFilterSimple::CTraceFilterSimple
(pCVar17,(IHandleEntity *)local_100,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
pVVar14 = (Vector *)0x200400b;
local_114 = &PTR_ShouldHitEntity_00c54558;
local_78 = local_128 * fVar1 + local_134;
local_74 = local_124 * fVar1 + local_130;
local_7c = fVar1 * local_12c + local_138;
UTIL_TraceLine((Vector *)&local_138,(Vector *)&local_7c,0x200400b,(ITraceFilter *)pCVar17,
(CGameTrace *)pVVar15);
pVVar16 = (Vector *)pCVar17;
if (local_a4 == 1.0) {
ClearMultiDamage();
pVVar14 = (Vector *)&local_ec;
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)&local_7c,(CBaseEntity *)local_100,local_fc,
*(float *)(MinigunDamageRate._28_4_ + 0x2c) /
*(float *)(MinigunRateOfFire._28_4_ + 0x2c),-0x7ffffffe,0);
CalculateBulletDamageForce
((CTakeDamageInfo *)&local_7c,local_e0,pVVar14,(Vector *)&local_c4,1.0);
local_28 = local_e0;
CBaseEntity::DispatchTraceAttack(pCVar7,(Vector *)&local_7c,(CGameTrace *)pVVar14);
ApplyMultiDamage();
pVVar16 = pVVar15;
}
}
}
}
if ((local_d4 == '\0') && (param_7)) {
local_120 = *(float *)param_5;
local_11c = *(float *)(param_5 + 4);
local_118 = *(float *)(param_5 + 8);
lVar13 = (longdouble)RandomFloat(0,0x40c90fdb,pVVar14,pVVar16);
sincosf((float)lVar13,local_160,&local_164);
lVar13 = (longdouble)RandomFloat(0,*(float *)(MinigunSpread._28_4_ + 0x2c) * 0.5);
local_11c = local_164 * (float)lVar13 + local_11c;
local_120 = (float)lVar13 * local_160[0] + local_120;
AngleVectors((QAngle *)&local_120,(Vector *)&local_150,(Vector *)0x0,(Vector *)0x0);
CTraceFilterSkipClassname::CTraceFilterSkipClassname
((CTraceFilterSkipClassname *)&local_114,(IHandleEntity *)param_2,"player",0);
local_3c = 0;
local_38 = 1;
local_6c = local_150 * 10000.0;
local_68 = local_14c * 10000.0;
local_64 = local_148 * 10000.0;
local_44 = 0;
local_7c = *(float *)param_3;
local_78 = *(float *)(param_3 + 4);
local_74 = *(float *)(param_3 + 8);
local_48 = 0;
local_4c = 0;
local_54 = 0;
local_58 = 0;
local_5c = 0;
local_37 = local_6c * local_6c + local_64 * local_64 + local_68 * local_68 != 0.0;
(**(code **)(*enginetrace + 0x14))
(enginetrace,(Vector *)&local_7c,0x200400b,(CTraceFilterSkipClassname *)&local_114,
(Vector *)&local_d0);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine((Vector *)&local_d0,(Vector *)&local_c4,0xff,0,0,true,-1.0);
}
if (*(int *)(MinigunDebug._28_4_ + 0x30) != 0) {
local_7c = local_d0;
local_78 = local_cc;
local_74 = local_c8 - 10.0;
NDebugOverlay::Line((Vector *)&local_7c,(Vector *)&local_c4,0xff,0,0,false,0.1);
}
piVar10 = (int *)(**(code **)(*gameeventmanager + 0x1c))(gameeventmanager,"bullet_impact",0,0);
if (piVar10 != (int *)0x0) {
pcVar2 = *(code **)(*piVar10 + 0x30);
uVar11 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(param_1 + 0x30));
(*pcVar2)(piVar10,"userid",uVar11);
(**(code **)(*piVar10 + 0x38))(piVar10,&DAT_00c147b6,local_c4);
(**(code **)(*piVar10 + 0x38))(piVar10,&DAT_00ca1f7c,local_c0);
(**(code **)(*piVar10 + 0x38))(piVar10,&DAT_00ca1f82,local_bc);
(**(code **)(*gameeventmanager + 0x20))(gameeventmanager,piVar10,0);
}
if ((local_8e & 900) == 0) {
if (local_84 == (CTakeDamageInfo *)0x0) {
return;
}
iVar12 = (**(code **)(*(int *)local_84 + 0x144))(local_84);
if (iVar12 == 0) {
UTIL_ImpactTrace((CGameTrace *)&local_d0,-0x7ffffffe,(char *)0x0);
}
}
if (local_84 != (CTakeDamageInfo *)0x0) {
ClearMultiDamage();
local_168 = 0.0013333333;
piVar10 = *(int **)(local_84 + 0x238);
if (piVar10 != (int *)0x0) {
lVar13 = (longdouble)(**(code **)(*piVar10 + 0x78))(piVar10);
local_168 = (float)lVar13;
if (local_168 <= 1000.0) {
local_168 = local_168 * 0.0013333333;
}
else {
local_168 = local_168 * 0.0033333334;
}
}
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)&local_7c,(CBaseEntity *)param_2,(CBaseEntity *)param_1,
(*(float *)(MinigunDamageRate._28_4_ + 0x2c) /
*(float *)(MinigunRateOfFire._28_4_ + 0x2c)) * 10.0,-0x7ffffffe,0);
CalculateMeleeDamageForce
((CTakeDamageInfo *)&local_7c,(Vector *)&local_150,(Vector *)&local_c4,local_168);
local_28 = iVar4;
CBaseEntity::DispatchTraceAttack(local_84,(Vector *)&local_7c,(CGameTrace *)&local_150);
CBaseEntity::TraceAttackToTriggers
((CBaseEntity *)param_1,(CTakeDamageInfo *)&local_7c,(Vector *)&local_d0,
(Vector *)&local_c4,(Vector *)&local_150);
ApplyMultiDamage();
}
}
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.