CNetworkStringTable::WriteUpdate
0x001a6ca0 · 2781 bytes · __thiscall
_ZNK19CNetworkStringTable11WriteUpdateEP11CBaseClientR8bf_writei
Decompiled
undefined (4 params)
/* CNetworkStringTable::WriteUpdate(CBaseClient*, bf_write&, int) const */
int __thiscall
CNetworkStringTable::WriteUpdate
(CNetworkStringTable *this,CBaseClient *param_1,bf_write *param_2,int param_3)
{
uint uVar1;
bool bVar2;
int iVar3;
char cVar4;
byte bVar5;
uint uVar6;
int iVar7;
byte *pbVar8;
int iVar9;
char *pcVar10;
uint uVar11;
void *pvVar12;
undefined4 uVar13;
undefined4 uVar14;
int iVar15;
int iVar16;
uint uVar17;
uint *puVar18;
char *pcVar19;
int in_GS_OFFSET;
int local_9c;
uint local_98;
int local_8c;
uint local_88;
uint local_80;
CUtlMemory<StringHistoryEntry,int> *local_7c;
uint local_78;
uint local_6c;
uint local_60;
uint local_58;
char *local_54;
undefined4 local_50;
undefined4 local_4c;
uint local_48;
char *local_44;
StringHistoryEntry local_40 [32];
int local_20;
iVar3 = DAT_003ab3a8;
local_54 = (char *)0x0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_50 = 0;
local_4c = 0;
local_48 = 0;
local_44 = (char *)0x0;
bVar2 = false;
if ((((byte)this[0x20] & 1) != 0) && (*(int *)(stringtable_usedictionaries._28_4_ + 0x30) != 0)) {
bVar2 = 0 < DAT_003ab380;
}
/* try { // try from 001a6d24 to 001a776a has its CatchHandler @ 001a7799 */
uVar6 = (**(code **)(**(int **)(this + 0x38) + 8))(*(int **)(this + 0x38));
iVar7 = *(int *)(param_2 + 0xc);
if (iVar7 < *(int *)(param_2 + 8)) {
if (param_2[0x10] == (bf_write)0x0) {
bVar5 = (byte)(1 << ((byte)iVar7 & 7));
if (bVar2) {
pbVar8 = (byte *)(*(int *)param_2 + (iVar7 >> 3));
*pbVar8 = *pbVar8 | bVar5;
}
else {
pbVar8 = (byte *)(*(int *)param_2 + (iVar7 >> 3));
*pbVar8 = *pbVar8 & ~bVar5;
}
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
if ((int)uVar6 < 1) {
local_9c = 0;
local_8c = 0;
}
else {
local_60 = 0;
uVar17 = 0xffffffff;
local_9c = 0;
local_98 = 0xffffffff;
local_8c = 0;
do {
iVar7 = (**(code **)(**(int **)(this + 0x38) + 0x28))(*(int **)(this + 0x38),local_60);
if (param_3 < *(int *)(iVar7 + 8)) {
uVar1 = *(uint *)(param_2 + 0xc);
if (uVar17 + 1 == local_60) {
if ((int)uVar1 < *(int *)(param_2 + 8)) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)uVar1 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 | (byte)(1 << ((byte)uVar1 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
LAB_001a7343:
param_2[0x10] = (bf_write)0x1;
}
}
else {
iVar15 = *(int *)(param_2 + 8);
uVar17 = uVar1;
if ((int)uVar1 < iVar15) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)uVar1 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)uVar1 & 7));
iVar15 = *(int *)(param_2 + 8);
uVar17 = *(int *)(param_2 + 0xc) + 1;
*(uint *)(param_2 + 0xc) = uVar17;
}
iVar9 = *(int *)(this + 0x10);
if (iVar15 < (int)(iVar9 + uVar17)) {
LAB_001a7340:
*(int *)(param_2 + 0xc) = iVar15;
goto LAB_001a7343;
}
}
else {
param_2[0x10] = (bf_write)0x1;
iVar9 = *(int *)(this + 0x10);
if (iVar15 < (int)(iVar9 + uVar1)) goto LAB_001a7340;
}
iVar15 = ((int)uVar17 >> 5) * 4;
uVar17 = uVar17 & 0x1f;
puVar18 = (uint *)(iVar15 + *(int *)param_2);
*puVar18 = *puVar18 & (&g_BitWriteMasks)[uVar17 * 0x21 + iVar9] |
local_60 << (sbyte)uVar17;
iVar16 = 0x20 - uVar17;
if (iVar16 < iVar9) {
puVar18 = (uint *)(*(int *)param_2 + 4 + iVar15);
*puVar18 = (&g_BitWriteMasks)[iVar9 - iVar16] & *puVar18 |
local_60 >> ((byte)iVar16 & 0x1f);
}
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + iVar9;
}
pcVar10 = (char *)(**(code **)(**(int **)(this + 0x38) + 0x10))
(*(int **)(this + 0x38),local_60);
iVar15 = *(int *)(param_2 + 0xc);
if (param_3 < *(int *)(iVar7 + 0xc)) {
if (iVar15 < *(int *)(param_2 + 8)) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)((iVar15 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 | (byte)(1 << ((byte)iVar15 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
uVar17 = (**(code **)(**(int **)(this + 0x38) + 0x24))(*(int **)(this + 0x38),local_60);
if (uVar17 == 0xffffffff) {
if (bVar2) {
local_88 = *(uint *)(param_2 + 0xc);
local_80 = *(uint *)(param_2 + 8);
if ((int)local_88 < (int)local_80) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)local_88 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)local_88 & 7));
local_88 = *(int *)(param_2 + 0xc) + 1;
*(uint *)(param_2 + 0xc) = local_88;
local_80 = *(uint *)(param_2 + 8);
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
}
else {
LAB_001a6eea:
local_80 = *(uint *)(param_2 + 8);
local_88 = *(uint *)(param_2 + 0xc);
}
if (0 < (int)local_48) {
local_78 = 0xffffffff;
uVar17 = 0;
local_6c = 0;
pcVar19 = local_54;
do {
if (((*pcVar19 != '\0') && (*pcVar10 != '\0')) && (*pcVar19 == *pcVar10)) {
uVar11 = 0;
do {
uVar11 = uVar11 + 1;
if (((pcVar19[uVar11] == '\0') || (pcVar10[uVar11] == '\0')) ||
(pcVar19[uVar11] != pcVar10[uVar11])) {
if ((int)uVar11 < 3) goto LAB_001a6f73;
break;
}
} while (uVar11 != 0x1f);
if ((int)local_6c < (int)uVar11) {
local_78 = uVar17;
local_6c = uVar11;
}
}
LAB_001a6f73:
uVar17 = uVar17 + 1;
pcVar19 = pcVar19 + 0x20;
} while (uVar17 != local_48);
if (local_78 != 0xffffffff) {
if ((int)local_88 < (int)local_80) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)local_88 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 | (byte)(1 << ((byte)local_88 & 7));
local_88 = *(int *)(param_2 + 0xc) + 1;
*(uint *)(param_2 + 0xc) = local_88;
local_80 = *(uint *)(param_2 + 8);
}
if ((int)(local_88 + 5) <= (int)local_80) goto LAB_001a6fe3;
LAB_001a7594:
param_2[0x10] = (bf_write)0x1;
*(uint *)(param_2 + 0xc) = local_80;
uVar17 = local_80;
if ((int)local_80 < (int)(local_80 + 5)) goto LAB_001a75ac;
LAB_001a7063:
uVar17 = local_80 & 0x1f;
iVar7 = ((int)local_80 >> 5) * 4;
puVar18 = (uint *)(*(int *)param_2 + iVar7);
iVar15 = 0x20 - uVar17;
*puVar18 = *puVar18 & *(uint *)(&DAT_003f2db4 + uVar17 * 0x84) |
local_6c << (sbyte)uVar17;
if (iVar15 < 5) {
puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
*puVar18 = (&g_BitWriteMasks)[5 - iVar15] & *puVar18 |
local_6c >> ((byte)iVar15 & 0x1f);
}
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 5;
}
else {
param_2[0x10] = (bf_write)0x1;
if ((int)local_80 < (int)(local_88 + 5)) goto LAB_001a7594;
LAB_001a6fe3:
iVar7 = ((int)local_88 >> 5) * 4;
local_88 = local_88 & 0x1f;
puVar18 = (uint *)(*(int *)param_2 + iVar7);
iVar15 = 0x20 - local_88;
*puVar18 = *puVar18 & *(uint *)(&DAT_003f2db4 + local_88 * 0x84) |
local_78 << (sbyte)local_88;
if (iVar15 < 5) {
puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
*puVar18 = (&g_BitWriteMasks)[5 - iVar15] & *puVar18 |
local_78 >> ((byte)iVar15 & 0x1f);
}
iVar7 = *(int *)(param_2 + 0xc);
local_80 = iVar7 + 5;
*(uint *)(param_2 + 0xc) = local_80;
uVar17 = *(uint *)(param_2 + 8);
if (iVar7 + 10 <= (int)*(uint *)(param_2 + 8)) goto LAB_001a7063;
LAB_001a75ac:
local_80 = uVar17;
param_2[0x10] = (bf_write)0x1;
*(uint *)(param_2 + 0xc) = local_80;
}
bf_write::WriteString(param_2,pcVar10 + local_6c);
goto LAB_001a70d9;
}
}
if ((int)local_88 < (int)local_80) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)local_88 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)local_88 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
bf_write::WriteString(param_2,pcVar10);
}
else {
if (!bVar2) goto LAB_001a6eea;
uVar11 = *(uint *)(param_2 + 0xc);
iVar7 = *(int *)(param_2 + 8);
local_9c = local_9c + 1;
if ((int)uVar11 < iVar7) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)uVar11 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 | (byte)(1 << ((byte)uVar11 & 7));
iVar7 = *(int *)(param_2 + 8);
uVar11 = *(int *)(param_2 + 0xc) + 1;
*(uint *)(param_2 + 0xc) = uVar11;
if (uVar17 != local_98 + 1) {
if (iVar7 <= (int)uVar11) goto LAB_001a767f;
LAB_001a74b0:
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)uVar11 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)uVar11 & 7));
iVar7 = *(int *)(param_2 + 8);
uVar11 = *(int *)(param_2 + 0xc) + 1;
*(uint *)(param_2 + 0xc) = uVar11;
}
if ((int)(iVar3 + uVar11) <= iVar7) goto LAB_001a74f2;
goto LAB_001a7693;
}
}
else if (uVar17 != local_98 + 1) goto LAB_001a74b0;
LAB_001a76c5:
if ((int)uVar11 < iVar7) {
local_98 = uVar17;
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)(((int)uVar11 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 | (byte)(1 << ((byte)uVar11 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
goto LAB_001a70d9;
}
}
else {
param_2[0x10] = (bf_write)0x1;
if (uVar17 == local_98 + 1) goto LAB_001a76c5;
LAB_001a767f:
param_2[0x10] = (bf_write)0x1;
if ((int)(iVar3 + uVar11) <= iVar7) {
LAB_001a74f2:
iVar7 = ((int)uVar11 >> 5) * 4;
uVar11 = uVar11 & 0x1f;
puVar18 = (uint *)(iVar7 + *(int *)param_2);
*puVar18 = *puVar18 & (&g_BitWriteMasks)[uVar11 * 0x21 + iVar3] |
uVar17 << (sbyte)uVar11;
iVar15 = 0x20 - uVar11;
if (iVar15 < iVar3) {
puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
*puVar18 = (&g_BitWriteMasks)[iVar3 - iVar15] & *puVar18 |
uVar17 >> ((byte)iVar15 & 0x1f);
}
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + iVar3;
local_98 = uVar17;
goto LAB_001a70d9;
}
LAB_001a7693:
*(int *)(param_2 + 0xc) = iVar7;
}
param_2[0x10] = (bf_write)0x1;
local_98 = uVar17;
}
}
else if (iVar15 < *(int *)(param_2 + 8)) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)((iVar15 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)iVar15 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
LAB_001a70d9:
pvVar12 = (void *)(**(code **)(*(int *)this + 0x30))(this,local_60,&local_58);
if ((pvVar12 == (void *)0x0) || ((int)local_58 < 1)) {
iVar7 = *(int *)(param_2 + 0xc);
if (iVar7 < *(int *)(param_2 + 8)) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)((iVar7 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)iVar7 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
}
else {
iVar7 = *(int *)(param_2 + 0xc);
if (iVar7 < *(int *)(param_2 + 8)) {
if (param_2[0x10] == (bf_write)0x0) {
pbVar8 = (byte *)((iVar7 >> 3) + *(int *)param_2);
*pbVar8 = *pbVar8 | (byte)(1 << ((byte)iVar7 & 7));
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
}
}
else {
param_2[0x10] = (bf_write)0x1;
}
if (((byte)this[0x1c] & 8) == 0) {
uVar17 = *(uint *)(param_2 + 0xc);
if (*(int *)(param_2 + 8) < (int)(uVar17 + 0xe)) {
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 8);
param_2[0x10] = (bf_write)0x1;
}
else {
iVar7 = ((int)uVar17 >> 5) * 4;
uVar17 = uVar17 & 0x1f;
puVar18 = (uint *)(iVar7 + *(int *)param_2);
*puVar18 = *puVar18 & *(uint *)(&DAT_003f2dd8 + uVar17 * 0x84) |
local_58 << (sbyte)uVar17;
iVar15 = 0x20 - uVar17;
if (iVar15 < 0xe) {
puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
*puVar18 = (&g_BitWriteMasks)[0xe - iVar15] & *puVar18 |
local_58 >> ((byte)iVar15 & 0x1f);
}
*(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 0xe;
}
bf_write::WriteBits(param_2,pvVar12,local_58 << 3);
}
else {
bf_write::WriteBits(param_2,pvVar12,*(int *)(this + 0x28));
}
}
if (0x1f < (int)local_48) {
CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>>::ShiftElementsLeft
((CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>> *)&local_54,
0,1);
local_48 = local_48 - 1;
}
V_strncpy((char *)local_40,pcVar10,0x20);
CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>>::InsertBefore
((CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>> *)&local_54,
local_48,local_40);
local_8c = local_8c + 1;
uVar17 = local_60;
if ((param_1 != (CBaseClient *)0x0) &&
(cVar4 = CBaseClient::IsTracing(param_1), cVar4 != '\0')) {
iVar7 = *(int *)(param_2 + 0xc);
uVar13 = (**(code **)(*(int *)this + 0x28))(this,local_60);
uVar14 = (**(code **)(*(int *)this + 8))(this);
CBaseClient::TraceNetworkMsg(param_1,iVar7 - uVar1," [%s] %d:%s ",uVar14,local_60,uVar13);
}
}
local_60 = local_60 + 1;
} while (uVar6 != local_60);
}
local_7c = (CUtlMemory<StringHistoryEntry,int> *)&local_54;
if ((((param_3 == -1) && (0x14 < (int)uVar6)) && (bVar2)) &&
((float)local_9c < (float)(int)uVar6 * 0.9)) {
uVar13 = (**(code **)(*(int *)this + 8))(this);
Warning("String Table dictionary for %s should be rebuilt, only found %d of %d strings in dictionary\n"
,uVar13,local_9c,uVar6);
}
local_48 = 0;
CUtlMemory<StringHistoryEntry,int>::Purge(local_7c);
local_44 = local_54;
CUtlMemory<StringHistoryEntry,int>::Purge(local_7c);
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return local_8c;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
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.