CNetChan::SendSubChannelData
0x001b1a70 · 2411 bytes · __thiscall
_ZN8CNetChan18SendSubChannelDataER8bf_write
Decompiled
undefined (2 params)
/* CNetChan::SendSubChannelData(bf_write&) */
undefined4 __thiscall CNetChan::SendSubChannelData(CNetChan *this,bf_write *param_1)
{
CNetChan *pCVar1;
CNetChan *pCVar2;
int *piVar3;
uint uVar4;
byte *pbVar5;
uint uVar6;
void *pvVar7;
uint uVar8;
int iVar9;
uint *puVar10;
int iVar11;
CNetChan *pCVar12;
int iVar13;
uint local_34;
uint local_30;
CNetChan *local_28;
CNetChan *local_20;
CompressFragments(this);
SendTCPData(this);
UpdateSubChannels(this);
pCVar12 = this + 0x344;
uVar4 = 0;
while (*(int *)(pCVar12 + 0x14) != 1) {
uVar4 = uVar4 + 1;
pCVar12 = pCVar12 + 0x1c;
if (uVar4 == 8) {
return 0;
}
}
uVar8 = *(uint *)(param_1 + 0xc);
uVar6 = *(uint *)(param_1 + 8);
if ((int)uVar6 < (int)(uVar8 + 3)) {
*(uint *)(param_1 + 0xc) = uVar6;
param_1[0x10] = (bf_write)0x1;
uVar4 = uVar6;
}
else {
iVar9 = ((int)uVar8 >> 5) * 4;
uVar8 = uVar8 & 0x1f;
puVar10 = (uint *)(iVar9 + *(int *)param_1);
*puVar10 = uVar4 << (sbyte)uVar8 | *puVar10 & *(uint *)(&DAT_003f2dac + uVar8 * 0x84);
iVar11 = 0x20 - uVar8;
if (iVar11 < 3) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
*puVar10 = uVar4 >> ((byte)iVar11 & 0x1f) | (&g_BitWriteMasks)[3 - iVar11] & *puVar10;
}
iVar9 = *(int *)(param_1 + 0xc);
uVar6 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = iVar9 + 3U;
uVar4 = iVar9 + 3U;
}
local_28 = this + 0xbc;
local_20 = pCVar12;
if (*(int *)(pCVar12 + 8) != 0) goto LAB_001b1b9c;
do {
if ((int)uVar4 < (int)uVar6) {
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
}
else {
param_1[0x10] = (bf_write)0x1;
}
while( true ) {
pCVar2 = local_20 + 4;
local_28 = local_28 + 0x14;
if (pCVar2 == pCVar12 + 8) {
return 1;
}
uVar6 = *(uint *)(param_1 + 8);
uVar4 = *(uint *)(param_1 + 0xc);
pCVar1 = local_20 + 0xc;
local_20 = pCVar2;
if (*(int *)pCVar1 == 0) break;
LAB_001b1b9c:
piVar3 = (int *)**(int **)local_28;
if ((int)uVar4 < (int)uVar6) {
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
uVar6 = *(uint *)(param_1 + 8);
uVar4 = *(int *)(param_1 + 0xc) + 1;
*(uint *)(param_1 + 0xc) = uVar4;
}
}
else {
param_1[0x10] = (bf_write)0x1;
}
local_30 = *(uint *)local_20;
iVar9 = *(int *)(local_20 + 8);
iVar11 = local_30 * 0x100;
local_34 = iVar9 * 0x100;
if ((local_30 + iVar9 == piVar3[0x49]) && (0x100 - (uint)*(byte *)(piVar3 + 0x43) != 0x100)) {
local_34 = local_34 - (0x100 - (uint)*(byte *)(piVar3 + 0x43));
}
if ((iVar9 == piVar3[0x49]) && (*piVar3 == 0)) {
if ((int)uVar4 < (int)uVar6) {
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
uVar6 = *(uint *)(param_1 + 8);
uVar4 = *(int *)(param_1 + 0xc) + 1;
*(uint *)(param_1 + 0xc) = uVar4;
if ((char)piVar3[0x46] == '\0') {
if ((int)uVar6 <= (int)uVar4) goto LAB_001b236a;
LAB_001b2324:
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
uVar6 = *(uint *)(param_1 + 8);
uVar4 = *(int *)(param_1 + 0xc) + 1;
*(uint *)(param_1 + 0xc) = uVar4;
}
goto LAB_001b20dd;
}
}
else if ((char)piVar3[0x46] == '\0') goto LAB_001b2324;
LAB_001b2033:
if ((int)uVar4 < (int)uVar6) {
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
uVar6 = *(uint *)(param_1 + 8);
uVar4 = *(int *)(param_1 + 0xc) + 1;
*(uint *)(param_1 + 0xc) = uVar4;
}
}
else {
param_1[0x10] = (bf_write)0x1;
}
uVar8 = piVar3[0x47];
if ((int)uVar6 < (int)(uVar4 + 0x1a)) {
*(uint *)(param_1 + 0xc) = uVar6;
param_1[0x10] = (bf_write)0x1;
uVar4 = uVar6;
}
else {
iVar9 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar9);
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2e08 + uVar4 * 0x84) | uVar8 << (sbyte)uVar4;
iVar13 = 0x20 - uVar4;
if (iVar13 < 0x1a) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
*puVar10 = (&g_BitWriteMasks)[0x1a - iVar13] & *puVar10 |
uVar8 >> ((byte)iVar13 & 0x1f);
}
iVar9 = *(int *)(param_1 + 0xc);
uVar6 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = iVar9 + 0x1aU;
uVar4 = iVar9 + 0x1aU;
}
}
else {
param_1[0x10] = (bf_write)0x1;
if ((char)piVar3[0x46] != '\0') goto LAB_001b2033;
LAB_001b236a:
param_1[0x10] = (bf_write)0x1;
}
LAB_001b20dd:
uVar8 = piVar3[0x43];
if ((int)uVar6 < (int)(uVar4 + 0x12)) {
*(uint *)(param_1 + 0xc) = uVar6;
param_1[0x10] = (bf_write)0x1;
}
else {
iVar13 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar13);
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2de8 + uVar4 * 0x84) | uVar8 << (sbyte)uVar4;
iVar9 = 0x20 - uVar4;
if (iVar9 < 0x12) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar13);
*puVar10 = (&g_BitWriteMasks)[0x12 - iVar9] & *puVar10 | uVar8 >> ((byte)iVar9 & 0x1f);
}
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 0x12;
}
}
else {
if ((int)uVar4 < (int)uVar6) {
if (param_1[0x10] != (bf_write)0x0) goto LAB_001b1c22;
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
iVar9 = *(int *)(param_1 + 0xc);
uVar6 = *(uint *)(param_1 + 8);
uVar4 = iVar9 + 1;
*(uint *)(param_1 + 0xc) = uVar4;
local_30 = *(uint *)local_20;
if ((int)uVar6 < iVar9 + 0x13) goto LAB_001b1f30;
LAB_001b1c2d:
iVar13 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar13);
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2de8 + uVar4 * 0x84) | local_30 << (sbyte)uVar4;
iVar9 = 0x20 - uVar4;
if (iVar9 < 0x12) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar13);
*puVar10 = (&g_BitWriteMasks)[0x12 - iVar9] & *puVar10 |
local_30 >> ((byte)iVar9 & 0x1f);
}
iVar9 = *(int *)(param_1 + 0xc);
uVar4 = iVar9 + 0x12;
uVar6 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = uVar4;
uVar8 = *(uint *)(local_20 + 8);
if (iVar9 + 0x15 <= (int)uVar6) goto LAB_001b1c9d;
LAB_001b1f4a:
*(uint *)(param_1 + 0xc) = uVar6;
param_1[0x10] = (bf_write)0x1;
}
else {
param_1[0x10] = (bf_write)0x1;
local_30 = *(uint *)local_20;
LAB_001b1c22:
if ((int)(uVar4 + 0x12) <= (int)uVar6) goto LAB_001b1c2d;
LAB_001b1f30:
*(uint *)(param_1 + 0xc) = uVar6;
param_1[0x10] = (bf_write)0x1;
uVar8 = *(uint *)(local_20 + 8);
uVar4 = uVar6;
if ((int)uVar6 < (int)(uVar6 + 3)) goto LAB_001b1f4a;
LAB_001b1c9d:
iVar9 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar9);
iVar13 = 0x20 - uVar4;
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2dac + uVar4 * 0x84) | uVar8 << (sbyte)uVar4;
if (iVar13 < 3) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
*puVar10 = (&g_BitWriteMasks)[3 - iVar13] & *puVar10 | uVar8 >> ((byte)iVar13 & 0x1f);
}
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 3;
}
if (iVar11 == 0) {
uVar4 = *(uint *)(param_1 + 0xc);
uVar8 = *(uint *)(param_1 + 8);
if (*piVar3 == 0) {
if ((int)uVar8 <= (int)uVar4) {
param_1[0x10] = (bf_write)0x1;
if ((char)piVar3[0x46] == '\0') goto LAB_001b230d;
goto LAB_001b1dcd;
}
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
uVar4 = *(int *)(param_1 + 0xc) + 1;
uVar8 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = uVar4;
goto LAB_001b1dbd;
}
if ((char)piVar3[0x46] != '\0') goto LAB_001b1dcd;
LAB_001b2218:
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
uVar4 = *(int *)(param_1 + 0xc) + 1;
uVar8 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = uVar4;
}
}
else {
if ((int)uVar4 < (int)uVar8) {
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
uVar4 = *(int *)(param_1 + 0xc) + 1;
uVar8 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = uVar4;
}
}
else {
param_1[0x10] = (bf_write)0x1;
}
uVar6 = piVar3[0x45];
if ((int)uVar8 < (int)(uVar4 + 0x20)) {
*(uint *)(param_1 + 0xc) = uVar8;
param_1[0x10] = (bf_write)0x1;
}
else {
iVar9 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar9);
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2e20 + uVar4 * 0x84) | uVar6 << (sbyte)uVar4;
iVar13 = 0x20 - uVar4;
if (iVar13 != 0x20) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
*puVar10 = (&g_BitWriteMasks)[0x20 - iVar13] & *puVar10 |
uVar6 >> ((byte)iVar13 & 0x1f);
}
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 0x20;
}
bf_write::WriteString(param_1,(char *)(piVar3 + 1));
uVar8 = *(uint *)(param_1 + 8);
uVar4 = *(uint *)(param_1 + 0xc);
LAB_001b1dbd:
if ((char)piVar3[0x46] == '\0') {
if ((int)uVar4 < (int)uVar8) goto LAB_001b2218;
LAB_001b230d:
param_1[0x10] = (bf_write)0x1;
}
else {
LAB_001b1dcd:
if ((int)uVar4 < (int)uVar8) {
if (param_1[0x10] == (bf_write)0x0) {
pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
*pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
uVar4 = *(int *)(param_1 + 0xc) + 1;
uVar8 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = uVar4;
}
}
else {
param_1[0x10] = (bf_write)0x1;
}
uVar6 = piVar3[0x47];
if ((int)uVar8 < (int)(uVar4 + 0x1a)) {
*(uint *)(param_1 + 0xc) = uVar8;
param_1[0x10] = (bf_write)0x1;
uVar4 = uVar8;
}
else {
iVar9 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar9);
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2e08 + uVar4 * 0x84) |
uVar6 << (sbyte)uVar4;
iVar13 = 0x20 - uVar4;
if (iVar13 < 0x1a) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
*puVar10 = (&g_BitWriteMasks)[0x1a - iVar13] & *puVar10 |
uVar6 >> ((byte)iVar13 & 0x1f);
}
iVar9 = *(int *)(param_1 + 0xc);
uVar8 = *(uint *)(param_1 + 8);
*(uint *)(param_1 + 0xc) = iVar9 + 0x1aU;
uVar4 = iVar9 + 0x1aU;
}
}
}
uVar6 = piVar3[0x43];
if ((int)uVar8 < (int)(uVar4 + 0x1a)) {
*(uint *)(param_1 + 0xc) = uVar8;
param_1[0x10] = (bf_write)0x1;
}
else {
iVar9 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)param_1 + iVar9);
*puVar10 = *puVar10 & *(uint *)(&DAT_003f2e08 + uVar4 * 0x84) | uVar6 << (sbyte)uVar4;
iVar13 = 0x20 - uVar4;
if (iVar13 < 0x1a) {
puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
*puVar10 = (&g_BitWriteMasks)[0x1a - iVar13] & *puVar10 |
uVar6 >> ((byte)iVar13 & 0x1f);
}
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 0x1a;
}
}
}
if (piVar3[0x42] == 0) {
uVar4 = 1;
if (local_34 != 0) {
uVar4 = local_34;
}
pvVar7 = operator_new__(uVar4);
(**(code **)(*(int *)(g_pFileSystem + 4) + 0x10))(g_pFileSystem + 4,*piVar3,iVar11,0);
(*(code *)**(undefined4 **)(g_pFileSystem + 4))(g_pFileSystem + 4,pvVar7,local_34,*piVar3);
bf_write::WriteBytes(param_1,pvVar7,local_34);
if (pvVar7 != (void *)0x0) {
operator_delete__(pvVar7);
}
}
else {
bf_write::WriteBytes(param_1,(void *)(piVar3[0x42] + iVar11),local_34);
}
if (*(int *)(net_showfragments._28_4_ + 0x30) != 0) {
ConMsg("Sending subchan %i: start %i, num %i\n",*(int *)(pCVar12 + 0x18),*(int *)local_20,
*(int *)(local_20 + 8));
}
iVar9 = *(int *)(this + 8);
*(int *)(pCVar12 + 0x14) = 2;
*(int *)(pCVar12 + 0x10) = iVar9;
}
} while( true );
}
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.