CGameEventManager::WriteEventList
0x00160b20 · 648 bytes · __thiscall
_ZN17CGameEventManager14WriteEventListEP17SVC_GameEventList
Decompiled
undefined (2 params)
/* CGameEventManager::WriteEventList(SVC_GameEventList*) */
void __thiscall
CGameEventManager::WriteEventList(CGameEventManager *this,SVC_GameEventList *param_1)
{
int iVar1;
int iVar2;
KeyValues *this_00;
uint uVar3;
char *pcVar4;
uint uVar5;
uint uVar6;
uint *puVar7;
uint *puVar8;
int local_24;
int local_20;
local_24 = 0;
local_20 = 0;
*(undefined4 *)(param_1 + 0x4c) = 0;
if (0 < *(int *)(this + 0x10)) {
do {
puVar8 = (uint *)(local_24 + *(int *)(this + 4));
if ((char)puVar8[8] == '\0') {
uVar3 = *puVar8;
uVar6 = *(uint *)(param_1 + 0x84);
if (*(int *)(param_1 + 0x80) < (int)(uVar6 + 9)) {
*(int *)(param_1 + 0x84) = *(int *)(param_1 + 0x80);
param_1[0x88] = (SVC_GameEventList)0x1;
}
else {
uVar5 = uVar6 & 0x1f;
iVar1 = ((int)uVar6 >> 5) * 4;
puVar7 = (uint *)(*(int *)(param_1 + 0x78) + iVar1);
*puVar7 = *puVar7 & *(uint *)(&DAT_003f2dc4 + uVar5 * 0x84) | uVar3 << (sbyte)uVar5;
iVar2 = 0x20 - uVar5;
if (iVar2 < 9) {
puVar7 = (uint *)(*(int *)(param_1 + 0x78) + 4 + iVar1);
*puVar7 = (&g_BitWriteMasks)[9 - iVar2] & *puVar7 | uVar3 >> ((byte)iVar2 & 0x1f);
}
*(int *)(param_1 + 0x84) = *(int *)(param_1 + 0x84) + 9;
}
bf_write::WriteString
((bf_write *)(param_1 + 0x78),
*(char **)(puVar8[1] * 0x18 + *(int *)(this + 0x7c) + 0x10));
for (this_00 = (KeyValues *)KeyValues::GetFirstSubKey((KeyValues *)puVar8[2]);
this_00 != (KeyValues *)0x0; this_00 = (KeyValues *)KeyValues::GetNextKey(this_00)) {
while (uVar3 = KeyValues::GetInt(this_00,(char *)0x0,0), uVar3 != 0) {
uVar6 = *(uint *)(param_1 + 0x84);
if (*(int *)(param_1 + 0x80) < (int)(uVar6 + 3)) {
*(int *)(param_1 + 0x84) = *(int *)(param_1 + 0x80);
param_1[0x88] = (SVC_GameEventList)0x1;
}
else {
iVar1 = ((int)uVar6 >> 5) * 4;
uVar6 = uVar6 & 0x1f;
puVar8 = (uint *)(iVar1 + *(int *)(param_1 + 0x78));
*puVar8 = uVar3 << (sbyte)uVar6 | *puVar8 & *(uint *)(&DAT_003f2dac + uVar6 * 0x84);
iVar2 = 0x20 - uVar6;
if (iVar2 < 3) {
puVar8 = (uint *)(*(int *)(param_1 + 0x78) + 4 + iVar1);
*puVar8 = uVar3 >> ((byte)iVar2 & 0x1f) | (&g_BitWriteMasks)[3 - iVar2] & *puVar8;
}
*(int *)(param_1 + 0x84) = *(int *)(param_1 + 0x84) + 3;
}
pcVar4 = (char *)KeyValues::GetName(this_00);
bf_write::WriteString((bf_write *)(param_1 + 0x78),pcVar4);
this_00 = (KeyValues *)KeyValues::GetNextKey(this_00);
if (this_00 == (KeyValues *)0x0) goto LAB_00160d16;
}
}
LAB_00160d16:
uVar3 = *(uint *)(param_1 + 0x84);
if (*(int *)(param_1 + 0x80) < (int)(uVar3 + 3)) {
*(int *)(param_1 + 0x84) = *(int *)(param_1 + 0x80);
param_1[0x88] = (SVC_GameEventList)0x1;
}
else {
iVar2 = ((int)uVar3 >> 5) * 4;
puVar8 = (uint *)(*(int *)(param_1 + 0x78) + iVar2);
*puVar8 = *puVar8 & *(uint *)(&DAT_003f2dac + (uVar3 & 0x1f) * 0x84);
iVar1 = 0x20 - (uVar3 & 0x1f);
if (iVar1 < 3) {
puVar8 = (uint *)(*(int *)(param_1 + 0x78) + 4 + iVar2);
*puVar8 = *puVar8 & (&g_BitWriteMasks)[3 - iVar1];
}
*(int *)(param_1 + 0x84) = *(int *)(param_1 + 0x84) + 3;
}
*(int *)(param_1 + 0x4c) = *(int *)(param_1 + 0x4c) + 1;
}
local_20 = local_20 + 1;
local_24 = local_24 + 0x34;
} while (local_20 < *(int *)(this + 0x10));
}
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.