CBaseClientState::ProcessCreateStringTable
0x000ff450 · 1857 bytes · __thiscall
_ZN16CBaseClientState24ProcessCreateStringTableEP21SVC_CreateStringTable
Decompiled
undefined (2 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CBaseClientState::ProcessCreateStringTable(SVC_CreateStringTable*) */
bool __thiscall
CBaseClientState::ProcessCreateStringTable(CBaseClientState *this,SVC_CreateStringTable *param_1)
{
SVC_CreateStringTable SVar1;
uint uVar2;
undefined4 uVar3;
int iVar4;
byte bVar5;
char cVar6;
CNetworkStringTable *this_00;
uint *puVar7;
char *pcVar8;
char *pcVar9;
int iVar10;
uint *puVar11;
int iVar12;
uint uVar13;
int iVar14;
uint *puVar15;
uint local_74;
int local_68;
uint local_64;
uint local_60;
uint local_58;
undefined4 local_54;
undefined4 local_50;
undefined4 local_4c;
undefined4 local_48;
int local_44;
undefined4 local_40;
undefined1 local_3c;
undefined4 local_38;
undefined4 local_34;
local_54 = 0;
local_50 = 0;
if (_exit == 0) {
local_44 = 0;
}
else {
(**(code **)(_exit + 0x50))
(_exit,&local_54,0,0,0,0,"/data/src/engine/./baseclientstate.cpp",0x75a,
&ProcessCreateStringTable(SVC_CreateStringTable*)::tm_fmt,"(%s)%s","Unaccounted",
"ProcessCreateStringTable");
local_44 = _exit;
}
iVar14 = _DAT_0040b9d4;
local_4c = local_54;
local_48 = local_50;
/* try { // try from 000ff736 to 000ff784 has its CatchHandler @ 000ffbd6 */
if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
(iVar10 = ThreadGetCurrentId(), iVar14 == iVar10)) {
if ((char *)*_DAT_0040b030 != "ProcessCreateStringTable") {
_DAT_0040b030 =
(int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a6d7b,&DAT_00000001,0x2a054b);
}
CVProfNode::EnterScope();
DAT_0040b02c = '\0';
}
/* try { // try from 000ff518 to 000ff6ee has its CatchHandler @ 000ffbeb */
COM_TimestampedLog(" CBaseClient::ProcessCreateStringTable(%s)",*(undefined4 *)(param_1 + 0x4c));
CNetworkStringTableContainer::AllowCreation
(*(CNetworkStringTableContainer **)(this + 0x49d4),true);
if (*(int *)(param_1 + 0x8c) == 0) {
local_68 = 0;
}
else {
iVar14 = (((uint)(*(int *)(param_1 + 0x84) - *(int *)(param_1 + 0x8c)) >> 2) * 0x20 -
*(int *)(param_1 + 0x80)) + (*(uint *)(param_1 + 0x78) & 3) * 8;
local_68 = *(int *)(param_1 + 0x74);
if (iVar14 <= *(int *)(param_1 + 0x74)) {
local_68 = iVar14;
}
}
this_00 = (CNetworkStringTable *)
(**(code **)(**(int **)(this + 0x49d4) + 8))
(*(int **)(this + 0x49d4),*(undefined4 *)(param_1 + 0x4c),
*(undefined4 *)(param_1 + 0x50),*(undefined4 *)(param_1 + 0x5c),
*(undefined4 *)(param_1 + 0x60),*(undefined4 *)(param_1 + 100));
(**(code **)(*(int *)this_00 + 0x1c))(this_00,*(undefined4 *)(this + 0xb8));
(**(code **)(*(int *)this + 0xb4))(this,*(undefined4 *)(param_1 + 0x4c));
SVar1 = param_1[0xa8];
if (SVar1 == (SVC_CreateStringTable)0x0) {
CNetworkStringTable::ParseUpdate(this_00,(bf_read *)(param_1 + 0x6c),*(int *)(param_1 + 0x54));
goto LAB_000ff869;
}
iVar14 = *(int *)(param_1 + 0x80);
if (iVar14 < 0x20) {
uVar2 = *(uint *)(param_1 + 0x7c);
puVar15 = *(uint **)(param_1 + 0x88);
puVar11 = *(uint **)(param_1 + 0x84);
if (puVar11 == puVar15) {
puVar7 = puVar11 + 1;
*(undefined4 *)(param_1 + 0x7c) = 0;
*(undefined4 *)(param_1 + 0x80) = 1;
*(uint **)(param_1 + 0x84) = puVar7;
param_1[0x70] = (SVC_CreateStringTable)0x1;
local_64 = 1;
}
else {
local_64 = iVar14;
if (puVar11 < puVar15) {
puVar7 = puVar11 + 1;
*(uint **)(param_1 + 0x84) = puVar7;
local_74 = *puVar11;
*(uint *)(param_1 + 0x7c) = local_74;
if (param_1[0x70] == (SVC_CreateStringTable)0x0) {
uVar13 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar14] & local_74;
local_64._0_1_ = (byte)iVar14;
bVar5 = (byte)local_64 & 0x1f;
*(int *)(param_1 + 0x80) = iVar14;
local_74 = local_74 >> ((byte)(0x20 - iVar14) & 0x1f);
*(uint *)(param_1 + 0x7c) = local_74;
local_60 = uVar13 << bVar5 | uVar2;
}
else {
local_60 = 0;
}
goto LAB_000ff659;
}
param_1[0x70] = (SVC_CreateStringTable)0x1;
*(undefined4 *)(param_1 + 0x7c) = 0;
puVar7 = puVar11;
}
local_74 = 0;
local_60 = 0;
LAB_000ff659:
if (puVar7 == puVar15) {
*(undefined4 *)(param_1 + 0x7c) = 0;
*(undefined4 *)(param_1 + 0x80) = 1;
*(uint **)(param_1 + 0x84) = puVar7 + 1;
param_1[0x70] = (SVC_CreateStringTable)0x1;
}
else if (puVar15 < puVar7) {
param_1[0x70] = (SVC_CreateStringTable)0x1;
*(undefined4 *)(param_1 + 0x7c) = 0;
}
else {
*(uint **)(param_1 + 0x84) = puVar7 + 1;
uVar2 = *puVar7;
*(uint *)(param_1 + 0x7c) = uVar2;
if (param_1[0x70] == (SVC_CreateStringTable)0x0) {
uVar3 = *(undefined4 *)(param_1 + 0x80);
uVar13 = (&CBitBuffer::s_nMaskTable)[0x20 - local_64];
*(uint *)(param_1 + 0x80) = local_64;
*(uint *)(param_1 + 0x7c) = uVar2 >> ((byte)(0x20 - local_64) & 0x1f);
local_64 = (uVar13 & uVar2) << ((byte)uVar3 & 0x1f) | local_74;
goto LAB_000ff81d;
}
}
local_64 = 0;
local_58 = local_60;
LAB_000ff67a:
uVar2 = local_58;
if ((SVar1 != (SVC_CreateStringTable)0x0) && (local_58 < 0x7fffffff)) {
pcVar8 = operator_new__(local_58 + 3 & 0xfffffffc);
pcVar9 = operator_new__(local_64 + 3 & 0xfffffffc);
CBitRead::ReadBits((CBitRead *)(param_1 + 0x6c),pcVar9,local_64 * 8);
bVar5 = NET_BufferToBufferDecompress(pcVar8,&local_58,pcVar9,local_64);
bVar5 = bVar5 & local_58 == uVar2;
if (bVar5 != 0) {
local_3c = 0;
local_40 = 0;
local_38 = 0xffffffff;
local_34 = 0;
/* try { // try from 000ffaca to 000ffae4 has its CatchHandler @ 000ffbeb */
CBitRead::StartReading((CBitRead *)&local_40,pcVar8,local_58,0,-1);
CNetworkStringTable::ParseUpdate(this_00,(bf_read *)&local_40,*(int *)(param_1 + 0x54));
}
if (pcVar8 != (char *)0x0) {
operator_delete__(pcVar8);
}
if (pcVar9 != (char *)0x0) {
operator_delete__(pcVar9);
}
if (bVar5 != 0) goto LAB_000ff869;
}
}
else {
local_64 = iVar14 + -0x20;
*(uint *)(param_1 + 0x80) = local_64;
uVar2 = *(uint *)(param_1 + 0x7c);
local_60 = uVar2;
if (local_64 != 0) {
*(undefined4 *)(param_1 + 0x7c) = 0;
if ((int)local_64 < 0x20) {
puVar15 = *(uint **)(param_1 + 0x88);
puVar7 = *(uint **)(param_1 + 0x84);
local_74 = 0;
goto LAB_000ff659;
}
*(int *)(param_1 + 0x80) = iVar14 + -0x40;
if (iVar14 + -0x40 == 0) {
local_64 = 0;
puVar11 = *(uint **)(param_1 + 0x84);
puVar15 = *(uint **)(param_1 + 0x88);
goto LAB_000ff7f4;
}
local_64 = 0;
*(undefined4 *)(param_1 + 0x7c) = 0;
LAB_000ff97f:
SVar1 = (SVC_CreateStringTable)(local_64 < 0x7fffffff);
local_58 = local_60;
goto LAB_000ff67a;
}
*(undefined4 *)(param_1 + 0x80) = 0x20;
puVar7 = *(uint **)(param_1 + 0x84);
puVar15 = *(uint **)(param_1 + 0x88);
if (puVar7 == puVar15) {
puVar7 = puVar7 + 1;
*(undefined4 *)(param_1 + 0x7c) = 0;
*(undefined4 *)(param_1 + 0x80) = 1;
*(uint **)(param_1 + 0x84) = puVar7;
local_74 = 0;
local_64 = 1;
goto LAB_000ff659;
}
if (puVar15 < puVar7) {
param_1[0x70] = (SVC_CreateStringTable)0x1;
*(undefined4 *)(param_1 + 0x7c) = 0;
local_60 = 0;
puVar11 = puVar7;
}
else {
puVar11 = puVar7 + 1;
*(uint **)(param_1 + 0x84) = puVar11;
local_60 = *puVar7;
*(uint *)(param_1 + 0x7c) = local_60;
}
local_64 = local_60;
LAB_000ff7f4:
*(undefined4 *)(param_1 + 0x80) = 0x20;
if (puVar11 == puVar15) {
*(undefined4 *)(param_1 + 0x7c) = 0;
*(undefined4 *)(param_1 + 0x80) = 1;
*(uint **)(param_1 + 0x84) = puVar11 + 1;
local_60 = uVar2;
}
else if (puVar15 < puVar11) {
param_1[0x70] = (SVC_CreateStringTable)0x1;
*(undefined4 *)(param_1 + 0x7c) = 0;
local_60 = uVar2;
}
else {
*(uint **)(param_1 + 0x84) = puVar11 + 1;
*(uint *)(param_1 + 0x7c) = *puVar11;
local_60 = uVar2;
}
LAB_000ff81d:
local_58 = local_60;
if (local_64 <= *(uint *)(param_1 + 0x78)) goto LAB_000ff97f;
}
/* try { // try from 000ff833 to 000ff8c6 has its CatchHandler @ 000ffbeb */
Warning("Malformed message in CBaseClientState::ProcessCreateStringTable\n");
LAB_000ff869:
CNetworkStringTableContainer::AllowCreation
(*(CNetworkStringTableContainer **)(this + 0x49d4),false);
if (*(int *)(param_1 + 0x8c) == 0) {
iVar14 = 0;
}
else {
iVar10 = (((uint)(*(int *)(param_1 + 0x84) - *(int *)(param_1 + 0x8c)) >> 2) * 0x20 -
*(int *)(param_1 + 0x80)) + (*(uint *)(param_1 + 0x78) & 3) * 8;
iVar14 = *(int *)(param_1 + 0x74);
if (iVar10 <= *(int *)(param_1 + 0x74)) {
iVar14 = iVar10;
}
}
COM_TimestampedLog(" CBaseClient::ProcessCreateStringTable(%s)-done",
*(undefined4 *)(param_1 + 0x4c));
iVar4 = _DAT_0040b9d4;
iVar10 = *(int *)(param_1 + 0x68);
if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
(iVar12 = ThreadGetCurrentId(), iVar4 == iVar12)) {
cVar6 = CVProfNode::ExitScope();
if (cVar6 != '\0') {
_DAT_0040b030 = (int *)_DAT_0040b030[0x19];
}
DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
}
if (local_44 != 0) {
(**(code **)(local_44 + 0x54))(local_44,local_4c,local_48,0,0,0);
}
return iVar14 - local_68 == iVar10;
}
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.