CNetChan::ProcessControlMessage
0x001b2e50 · 1132 bytes · __thiscall
_ZN8CNetChan21ProcessControlMessageEiR7bf_read
Decompiled
undefined (3 params)
/* CNetChan::ProcessControlMessage(int, bf_read&) */
undefined4 __thiscall CNetChan::ProcessControlMessage(CNetChan *this,int param_1,bf_read *param_2)
{
int iVar1;
uint *puVar2;
undefined4 *puVar3;
char cVar4;
undefined4 uVar5;
uint uVar6;
uint uVar7;
uint uVar8;
int iVar9;
uint *puVar10;
int iVar11;
int in_GS_OFFSET;
byte local_434;
uint local_430;
char local_420 [1024];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (*(int *)(param_2 + 0x20) == 0) {
iVar11 = 0;
}
else {
iVar11 = (((uint)(*(int *)(param_2 + 0x18) - *(int *)(param_2 + 0x20)) >> 2) * 0x20 -
*(int *)(param_2 + 0x14)) + (*(uint *)(param_2 + 0xc) & 3) * 8;
if (*(int *)(param_2 + 8) < iVar11) {
iVar11 = *(int *)(param_2 + 8);
}
}
if (param_1 == 1) {
CBitRead::ReadString((CBitRead *)param_2,local_420,0x400,false,(int *)0x0);
CNetchanParanoidMode::AddControlMessage
((CNetchanParanoidMode *)g_NetParanoid,1,iVar11,"net_Disconnect",local_420);
(**(code **)(**(int **)(this + 0x4208) + 0xc))(*(int **)(this + 0x4208),local_420);
uVar5 = 0;
goto LAB_001b2f00;
}
if (param_1 != 2) {
if (param_1 == 0) {
CNetchanParanoidMode::AddControlMessage
((CNetchanParanoidMode *)g_NetParanoid,0,iVar11,"net_NOP","");
uVar5 = 1;
}
else {
uVar5 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
ConMsg("CNetChan: received bad control cmd %i from %s.\n",param_1,uVar5);
CNetchanParanoidMode::Dump((CNetchanParanoidMode *)g_NetParanoid,this,"bad control cmd");
uVar5 = 0;
}
goto LAB_001b2f00;
}
iVar1 = *(int *)(param_2 + 0x14);
if (iVar1 < 0x20) {
local_430 = *(uint *)(param_2 + 0x10);
puVar10 = *(uint **)(param_2 + 0x18);
if (puVar10 == *(uint **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar10 + 1;
param_2[4] = (bf_read)0x1;
}
else if (*(uint **)(param_2 + 0x1c) < puVar10) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar10 + 1;
uVar6 = *puVar10;
*(uint *)(param_2 + 0x10) = uVar6;
if (param_2[4] == (bf_read)0x0) {
uVar8 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar1];
local_434 = (byte)iVar1;
*(int *)(param_2 + 0x14) = iVar1;
*(uint *)(param_2 + 0x10) = uVar6 >> ((byte)(0x20 - iVar1) & 0x1f);
local_430 = (uVar8 & uVar6) << (local_434 & 0x1f) | local_430;
goto LAB_001b2f92;
}
}
local_430 = 0;
}
else {
local_430 = *(uint *)(param_2 + 0x10);
*(int *)(param_2 + 0x14) = iVar1 + -0x20;
if (iVar1 + -0x20 == 0) {
puVar3 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar3 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar3 + 1;
}
else {
if (*(undefined4 **)(param_2 + 0x1c) < puVar3) {
param_2[4] = (bf_read)0x1;
goto LAB_001b3125;
}
*(undefined4 **)(param_2 + 0x18) = puVar3 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar3;
}
}
else {
LAB_001b3125:
*(undefined4 *)(param_2 + 0x10) = 0;
}
}
LAB_001b2f92:
CBitRead::ReadString((CBitRead *)param_2,local_420,0x400,false,(int *)0x0);
iVar9 = *(int *)(param_2 + 0x14);
uVar6 = *(uint *)(param_2 + 0x10) & 1;
iVar1 = iVar9 + -1;
*(int *)(param_2 + 0x14) = iVar1;
if (iVar1 == 0) {
puVar2 = *(uint **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
puVar10 = *(uint **)(param_2 + 0x1c);
if (puVar2 != puVar10) {
if (puVar10 < puVar2) {
param_2[4] = (bf_read)0x1;
uVar8 = 0;
uVar7 = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar2 + 1;
uVar8 = *puVar2;
uVar7 = uVar8 & 1;
}
*(undefined4 *)(param_2 + 0x14) = 0x1f;
goto LAB_001b3003;
}
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar10 + 1;
uVar7 = 0;
LAB_001b316b:
puVar2 = *(uint **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == puVar10) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar10 + 1;
}
else if (puVar10 < puVar2) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar2 + 1;
*(uint *)(param_2 + 0x10) = *puVar2;
}
}
else {
uVar8 = *(uint *)(param_2 + 0x10) >> 1;
iVar9 = iVar9 + -2;
*(uint *)(param_2 + 0x10) = uVar8;
uVar7 = uVar8 & 1;
*(int *)(param_2 + 0x14) = iVar9;
if (iVar9 == 0) {
puVar10 = *(uint **)(param_2 + 0x1c);
goto LAB_001b316b;
}
LAB_001b3003:
*(uint *)(param_2 + 0x10) = uVar8 >> 1;
}
if (uVar7 == 0) {
LAB_001b3010:
(**(code **)(**(int **)(this + 0x4208) + 0x24))
(*(int **)(this + 0x4208),local_420,local_430,uVar6);
}
else {
cVar4 = IsValidFileForTransfer(local_420);
if (cVar4 == '\0') goto LAB_001b3010;
(**(code **)(**(int **)(this + 0x4208) + 0x1c))
(*(int **)(this + 0x4208),local_420,local_430,uVar6);
}
CNetchanParanoidMode::AddControlMessage
((CNetchanParanoidMode *)g_NetParanoid,2,iVar11,"net_File",local_420);
uVar5 = 1;
LAB_001b2f00:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return uVar5;
}
/* 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.