CStudioHdr::CActivityToSequenceMapping::Initialize
0x000e48b0 · 1855 bytes · __thiscall
_ZN10CStudioHdr26CActivityToSequenceMapping10InitializeEPKS_
Decompiled
undefined (2 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CStudioHdr::CActivityToSequenceMapping::Initialize(CStudioHdr const*) */
void __thiscall
CStudioHdr::CActivityToSequenceMapping::Initialize
(CActivityToSequenceMapping *this,CStudioHdr *param_1)
{
undefined4 *puVar1;
CUtlVector<CStudioHdr::CActivityToSequenceMapping::HashValueType,CUtlMemory<CStudioHdr::CActivityToSequenceMapping::HashValueType,int>>
*this_00;
code *pcVar2;
ushort uVar3;
bool bVar4;
undefined4 uVar5;
undefined4 uVar6;
char cVar7;
int iVar8;
uint uVar9;
int iVar10;
uint uVar11;
uint uVar12;
int iVar13;
uint uVar14;
int iVar15;
int *piVar16;
undefined1 *puVar17;
int in_GS_OFFSET;
undefined4 uStackY_90;
char *local_7c [5];
char *local_68;
char *local_64;
char *local_60;
uint local_58;
void *local_54;
uint local_50;
uint local_4c;
CStudioHdr *local_48;
uint local_44;
CActivityToSequenceMapping *local_40;
undefined4 local_34;
undefined4 local_30;
undefined4 local_2c;
undefined4 local_28;
int local_24;
int local_20;
local_34 = 0;
local_30 = 0;
local_40 = this;
local_48 = param_1;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (_exit == 0) {
local_24 = 0;
}
else {
local_60 = "CStudioHdr::CActivityToSequenceMapping::Initialize";
local_64 = "Unaccounted";
local_68 = "(%s)%s";
local_7c[4] = (char *)&Initialize(CStudioHdr_const*)::tm_fmt;
local_7c[3] = (char *)0x787;
local_7c[2] = "/data/src/engine/../public/studio.cpp";
local_7c[1] = (char *)0x0;
local_7c[0] = (char *)0x0;
uStackY_90 = 0xe4948;
(**(code **)(_exit + 0x50))();
local_24 = _exit;
}
iVar15 = _DAT_0040b9d4;
local_2c = local_34;
local_28 = local_30;
if ((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) {
/* try { // try from 000e49f6 to 000e4a44 has its CatchHandler @ 000e504b */
uStackY_90 = 0xe49fb;
iVar8 = ThreadGetCurrentId();
if (iVar15 == iVar8) {
if ((char *)*_DAT_0040b030 != "CStudioHdr::CActivityToSequenceMapping::Initialize") {
local_7c[0] = (char *)0x0;
uStackY_90 = 0xe4a38;
_DAT_0040b030 =
(int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a4dd0,&DAT_00000001,0x2a054b);
}
uStackY_90 = 0xe4a45;
CVProfNode::EnterScope();
DAT_0040b02c = '\0';
}
}
*(int *)(local_40 + 0x24) = *(int *)local_48;
if (*(int *)local_40 == 0) {
*(int *)(local_40 + 0x28) = *(int *)(local_48 + 4);
/* try { // try from 000e4aba to 000e4d46 has its CatchHandler @ 000e502a */
uStackY_90 = 0xe4abf;
cVar7 = SequencesAvailable(local_48);
if (cVar7 != '\0') {
if (*(int *)(local_48 + 4) == 0) {
local_4c = *(uint *)(*(int *)local_48 + 0xbc);
}
else {
local_4c = *(uint *)(*(int *)(local_48 + 4) + 0x14);
}
if (0 < (int)local_4c) {
local_44 = 0;
bVar4 = false;
do {
uStackY_90 = 0xe4b02;
iVar8 = pSeqdesc(local_48,local_44);
iVar15 = *(int *)(iVar8 + 0x10);
if (-1 < iVar15) {
local_58 = *(uint *)(iVar8 + 0x14);
uStackY_90 = 0xe4b1d;
uVar9 = HashInt(iVar15);
if (local_40[0x1e] == (CActivityToSequenceMapping)0x0) {
local_50 = *(uint *)(local_40 + 0x14);
uVar9 = uVar9 % local_50;
}
else {
uVar9 = uVar9 & *(uint *)(local_40 + 0x20);
local_50 = *(uint *)(local_40 + 0x14);
}
local_54 = *(void **)(local_40 + 8);
puVar1 = (undefined4 *)((int)local_54 + uVar9 * 0x14);
uVar14 = puVar1[3];
if ((int)uVar14 < 1) {
if (uVar14 != 0) goto LAB_000e4e7e;
LAB_000e4b7b:
uVar14 = 0xffff;
uVar9 = 0xffff;
if (0xffff < (int)local_50) goto LAB_000e4b93;
LAB_000e4e98:
/* try { // try from 000e4e9b to 000e4f16 has its CatchHandler @ 000e502a */
uStackY_90 = 0xe4ea0;
uVar9 = HashInt(iVar15);
if (local_40[0x1e] == (CActivityToSequenceMapping)0x0) {
uVar9 = uVar9 % *(uint *)(local_40 + 0x14);
}
else {
uVar9 = uVar9 & *(uint *)(local_40 + 0x20);
}
this_00 = (CUtlVector<CStudioHdr::CActivityToSequenceMapping::HashValueType,CUtlMemory<CStudioHdr::CActivityToSequenceMapping::HashValueType,int>>
*)(*(int *)(local_40 + 8) + uVar9 * 0x14);
iVar8 = *(int *)(this_00 + 0xc);
if (iVar8 < 1) {
if (iVar8 == 0) {
LAB_000e4ef3:
uStackY_90 = 0xe4f03;
CUtlVector<CStudioHdr::CActivityToSequenceMapping::HashValueType,CUtlMemory<CStudioHdr::CActivityToSequenceMapping::HashValueType,int>>
::GrowVector(this_00,1);
uStackY_90 = 0xe4f17;
CUtlVector<CStudioHdr::CActivityToSequenceMapping::HashValueType,CUtlMemory<CStudioHdr::CActivityToSequenceMapping::HashValueType,int>>
::ShiftElementsRight(this_00,iVar8,1);
piVar16 = (int *)(iVar8 * 0x10 + *(int *)this_00);
if (piVar16 != (int *)0x0) {
*piVar16 = iVar15;
piVar16[1] = 0;
piVar16[2] = 1;
piVar16[3] = local_58 ^ (int)local_58 >> 0x1f;
piVar16[3] = piVar16[3] - ((int)local_58 >> 0x1f);
}
}
}
else {
piVar16 = *(int **)this_00;
if (iVar15 != *piVar16) {
iVar10 = 0;
do {
piVar16 = piVar16 + 4;
iVar10 = iVar10 + 1;
if (iVar10 == iVar8) goto LAB_000e4ef3;
} while (iVar15 != *piVar16);
}
}
}
else {
piVar16 = (int *)*puVar1;
if (iVar15 == *piVar16) {
LAB_000e4e7e:
uVar11 = 0;
}
else {
uVar11 = 0;
do {
piVar16 = piVar16 + 4;
uVar11 = uVar11 + 1;
if (uVar11 == uVar14) goto LAB_000e4b7b;
} while (iVar15 != *piVar16);
}
uVar14 = uVar11 & 0xffff;
uVar9 = (uVar9 << 0x10 | uVar11) >> 0x10;
if ((int)local_50 <= (int)uVar9) goto LAB_000e4e98;
LAB_000e4b93:
piVar16 = (int *)((int)local_54 + uVar9 * 0x14);
if (piVar16[3] <= (int)uVar14) goto LAB_000e4e98;
iVar15 = uVar14 * 0x10 + *piVar16;
piVar16 = (int *)(iVar15 + 8);
*piVar16 = *piVar16 + 1;
uVar9 = *(int *)(iVar8 + 0x14) >> 0x1f;
piVar16 = (int *)(iVar15 + 0xc);
*piVar16 = *piVar16 + ((*(uint *)(iVar8 + 0x14) ^ uVar9) - uVar9);
}
bVar4 = true;
}
local_44 = local_44 + 1;
} while (local_44 != local_4c);
if (bVar4) {
uVar9 = *(uint *)(local_40 + 0x14);
if ((int)uVar9 < 1) {
LAB_000e4c15:
uVar14 = 0xffffffff;
}
else {
uVar14 = 0;
piVar16 = (int *)(*(int *)(local_40 + 8) + 0x20);
if (*(int *)(*(int *)(local_40 + 8) + 0xc) < 1) {
do {
uVar14 = uVar14 + 1;
if (uVar14 == uVar9) goto LAB_000e4c15;
iVar15 = *piVar16;
piVar16 = piVar16 + 5;
} while (iVar15 < 1);
uVar14 = uVar14 * 0x10000;
}
else {
uVar14 = 0;
}
}
iVar15 = 0;
uVar11 = 0;
while (uVar12 = uVar14 >> 0x10, (int)uVar12 < (int)uVar9) {
while( true ) {
piVar16 = (int *)(*(int *)(local_40 + 8) + uVar12 * 0x14);
if (piVar16[3] <= (int)(uVar14 & 0xffff)) goto LAB_000e4cbf;
piVar16 = (int *)((uVar14 & 0xffff) * 0x10 + *piVar16);
piVar16[1] = uVar11;
uVar11 = uVar11 + piVar16[2];
if (iVar15 < *piVar16) {
iVar15 = *piVar16;
}
uVar9 = *(uint *)(local_40 + 0x14);
local_44 = uVar14 + 1 >> 0x10;
uVar14 = uVar14 + 1 & 0xffff;
if ((int)uVar9 <= (int)local_44) break;
if (*(int *)(*(int *)(local_40 + 8) + 0xc + local_44 * 0x14) <= (int)uVar14) {
uVar12 = local_44;
piVar16 = (int *)(*(int *)(local_40 + 8) + 0xc + (local_44 * 5 + 5) * 4);
do {
uVar12 = uVar12 + 1;
if (uVar12 == uVar9) goto LAB_000e4fb0;
iVar8 = *piVar16;
piVar16 = piVar16 + 5;
} while (iVar8 < 1);
uVar14 = 0;
local_44 = uVar12;
}
uVar14 = local_44 << 0x10 | uVar14;
uVar12 = local_44 & 0xffff;
if ((int)uVar9 <= (int)uVar12) goto LAB_000e4cbf;
}
LAB_000e4fb0:
uVar14 = 0xffffffff;
}
LAB_000e4cbf:
uVar9 = 0xffffffff;
if (uVar11 < 0x1fc00001) {
uVar9 = uVar11 * 4;
}
uStackY_90 = 0xe4cdc;
local_54 = operator_new__(uVar9);
*(void **)local_40 = local_54;
uVar9 = iVar15 * 4 + 0x13U & 0xfffffff0;
*(uint *)(local_40 + 4) = uVar11;
iVar15 = -(uVar9 + 0x10);
*(uint *)(&stack0xffffff7c + iVar15) = uVar9;
local_50 = (int)&local_50 + iVar15;
*(undefined4 *)(&stack0xffffff78 + iVar15) = 0;
*(uint *)(&stack0xffffff74 + iVar15) = local_50;
*(undefined4 *)((int)&uStackY_90 + iVar15) = 0xe4d18;
memset(*(void **)(&stack0xffffff74 + iVar15),*(int *)(&stack0xffffff78 + iVar15),
*(size_t *)(&stack0xffffff7c + iVar15));
local_44 = 0;
do {
*(uint *)(&stack0xffffff78 + iVar15) = local_44;
*(CStudioHdr **)(&stack0xffffff74 + iVar15) = local_48;
*(undefined4 *)((int)&uStackY_90 + iVar15) = 0xe4d32;
iVar10 = pSeqdesc(*(CStudioHdr **)(&stack0xffffff74 + iVar15),
*(int *)(&stack0xffffff78 + iVar15));
iVar8 = *(int *)(iVar10 + 0x10);
if (-1 < iVar8) {
*(int *)(&stack0xffffff74 + iVar15) = iVar8;
*(undefined4 *)((int)&uStackY_90 + iVar15) = 0xe4d47;
uVar9 = HashInt(*(int *)(&stack0xffffff74 + iVar15));
if (local_40[0x1e] == (CActivityToSequenceMapping)0x0) {
uVar9 = uVar9 % *(uint *)(local_40 + 0x14);
}
else {
uVar9 = uVar9 & *(uint *)(local_40 + 0x20);
}
local_58 = *(uint *)(local_40 + 8);
puVar1 = (undefined4 *)(local_58 + uVar9 * 0x14);
uVar14 = puVar1[3];
if ((int)uVar14 < 1) {
if (uVar14 != 0) goto LAB_000e4f7b;
LAB_000e4da3:
iVar8 = 0xffff0;
iVar13 = 0x13ffec;
}
else {
piVar16 = (int *)*puVar1;
if (iVar8 == *piVar16) {
LAB_000e4f7b:
uVar11 = 0;
}
else {
uVar11 = 0;
do {
piVar16 = piVar16 + 4;
uVar11 = uVar11 + 1;
if (uVar11 == uVar14) goto LAB_000e4da3;
} while (iVar8 != *piVar16);
}
iVar13 = ((uVar9 << 0x10 | uVar11) >> 0x10) * 0x14;
iVar8 = (uVar11 & 0xffff) << 4;
}
iVar8 = iVar8 + *(int *)(local_58 + iVar13);
iVar13 = *(int *)(local_50 + *(int *)(iVar10 + 0x10) * 4);
*(undefined2 *)((int)local_54 + (*(int *)(iVar8 + 4) + iVar13) * 4) =
(undefined2)local_44;
uVar3 = (ushort)((int)*(undefined4 *)(iVar10 + 0x14) >> 0x1f);
*(ushort *)((int)local_54 + (*(int *)(iVar8 + 4) + iVar13) * 4 + 2) =
(uVar3 ^ (ushort)*(undefined4 *)(iVar10 + 0x14)) - uVar3;
iVar13 = iVar13 + *(int *)(iVar8 + 4);
if (*(short *)((int)local_54 + iVar13 * 4 + 2) == 0) {
*(undefined2 *)((int)local_54 + iVar13 * 4 + 2) = 1;
}
piVar16 = (int *)(local_50 + *(int *)(iVar10 + 0x10) * 4);
*piVar16 = *piVar16 + 1;
}
iVar8 = _DAT_0040b9d4;
local_44 = local_44 + 1;
} while (local_44 != local_4c);
if ((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) {
*(undefined4 *)((int)&uStackY_90 + iVar15) = 0xe4e34;
iVar10 = ThreadGetCurrentId();
if (iVar8 == iVar10) {
*(int **)(&stack0xffffff74 + iVar15) = _DAT_0040b030;
*(undefined4 *)((int)&uStackY_90 + iVar15) = 0xe4ff5;
cVar7 = CVProfNode::ExitScope();
if (cVar7 != '\0') {
_DAT_0040b030 = (int *)_DAT_0040b030[0x19];
}
DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
}
}
iVar8 = local_24;
uVar5 = local_2c;
puVar17 = &stack0xffffff74 + iVar15;
if (local_24 != 0) {
*(undefined4 *)((int)local_7c + iVar15 + 4) = 0;
uVar6 = local_28;
*(undefined4 *)((int)local_7c + iVar15) = 0;
*(undefined4 *)(&stack0xffffff80 + iVar15) = 0;
*(int *)(&stack0xffffff74 + iVar15) = iVar8;
*(undefined4 *)(&stack0xffffff78 + iVar15) = uVar5;
*(undefined4 *)(&stack0xffffff7c + iVar15) = uVar6;
pcVar2 = *(code **)(iVar8 + 0x54);
*(undefined4 *)((int)&uStackY_90 + iVar15) = 0xe4e73;
(*pcVar2)();
puVar17 = &stack0xffffff74 + iVar15;
}
goto LAB_000e49d5;
}
}
}
}
iVar15 = _DAT_0040b9d4;
if ((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) {
uStackY_90 = 0xe4a63;
iVar8 = ThreadGetCurrentId();
if (iVar15 == iVar8) {
uStackY_90 = 0xe4a78;
cVar7 = CVProfNode::ExitScope();
if (cVar7 != '\0') {
_DAT_0040b030 = (int *)_DAT_0040b030[0x19];
}
DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
}
}
puVar17 = &stack0xffffff74;
if (local_24 != 0) {
local_7c[1] = (char *)0x0;
local_7c[0] = (char *)0x0;
uStackY_90 = 0xe49d5;
(**(code **)(local_24 + 0x54))();
puVar17 = &stack0xffffff74;
}
LAB_000e49d5:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined1 **)(puVar17 + -4) = &LAB_000e502a;
__stack_chk_fail();
}
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.