bf_write::WriteBitCoordMP
0x00b64970 · 1295 bytes · __thiscall
_ZN8bf_write15WriteBitCoordMPEf13EBitCoordType
Decompiled
undefined (3 params)
/* bf_write::WriteBitCoordMP(float, EBitCoordType) */
void __thiscall bf_write::WriteBitCoordMP(bf_write *this,float param_1,int param_3)
{
byte *pbVar1;
bool bVar2;
bool bVar3;
uint uVar4;
int iVar5;
uint uVar6;
int iVar7;
byte bVar8;
uint uVar9;
uint *puVar10;
int iVar11;
uint local_1c;
int local_18;
if (param_3 != 1) {
bVar3 = param_1 <= -0.03125;
uVar4 = (int)(param_1 * 32.0) >> 0x1f;
local_1c = ((int)(param_1 * 32.0) ^ uVar4) - uVar4 & 0x1f;
}
else {
bVar3 = param_1 <= -0.125;
uVar4 = (int)(param_1 * 8.0) >> 0x1f;
local_1c = ((int)(param_1 * 8.0) ^ uVar4) - uVar4 & 7;
}
local_18 = (int)ABS(param_1);
uVar4 = *(uint *)(this + 0xc);
uVar9 = *(uint *)(this + 8);
bVar2 = local_18 < 0x800;
if ((int)uVar4 < (int)uVar9) {
if (this[0x10] == (bf_write)0x0) {
bVar8 = (byte)(1 << ((byte)uVar4 & 7));
if (bVar2) {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 | bVar8;
}
else {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 & ~bVar8;
}
uVar9 = *(uint *)(this + 8);
uVar4 = *(int *)(this + 0xc) + 1;
*(uint *)(this + 0xc) = uVar4;
if (param_3 == 2) {
LAB_00b64c40:
if ((int)uVar4 < (int)uVar9) {
if (this[0x10] == (bf_write)0x0) {
bVar8 = (byte)(1 << ((byte)uVar4 & 7));
if (local_18 == 0) {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 & ~bVar8;
}
else {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 | bVar8;
}
*(int *)(this + 0xc) = *(int *)(this + 0xc) + 1;
}
}
else {
this[0x10] = (bf_write)0x1;
}
if (local_18 == 0) {
return;
}
uVar4 = *(uint *)(this + 0xc);
iVar5 = *(int *)(this + 8);
if ((int)uVar4 < iVar5) {
if (this[0x10] == (bf_write)0x0) {
bVar8 = (byte)(1 << ((byte)uVar4 & 7));
if (bVar3) {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 | bVar8;
}
else {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 & ~bVar8;
}
uVar4 = *(int *)(this + 0xc) + 1;
iVar5 = *(int *)(this + 8);
*(uint *)(this + 0xc) = uVar4;
}
}
else {
this[0x10] = (bf_write)0x1;
}
uVar9 = local_18 - 1;
if (bVar2) {
if ((int)(uVar4 + 0xb) <= iVar5) {
iVar5 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)this + iVar5);
iVar11 = 0x20 - uVar4;
*puVar10 = *puVar10 & *(uint *)(&DAT_0104430c + uVar4 * 0x84) | uVar9 << (sbyte)uVar4;
if (iVar11 < 0xb) {
puVar10 = (uint *)(*(int *)this + 4 + iVar5);
*puVar10 = (&g_BitWriteMasks)[0xb - iVar11] & *puVar10 |
uVar9 >> ((byte)iVar11 & 0x1f);
}
*(int *)(this + 0xc) = *(int *)(this + 0xc) + 0xb;
return;
}
}
else if ((int)(uVar4 + 0xe) <= iVar5) {
iVar5 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)this + iVar5);
iVar11 = 0x20 - uVar4;
*puVar10 = *puVar10 & *(uint *)(&DAT_01044318 + uVar4 * 0x84) | uVar9 << (sbyte)uVar4;
if (iVar11 < 0xe) {
puVar10 = (uint *)(*(int *)this + 4 + iVar5);
*puVar10 = (&g_BitWriteMasks)[0xe - iVar11] & *puVar10 | uVar9 >> ((byte)iVar11 & 0x1f);
}
*(int *)(this + 0xc) = *(int *)(this + 0xc) + 0xe;
return;
}
*(int *)(this + 0xc) = iVar5;
this[0x10] = (bf_write)0x1;
return;
}
if ((int)uVar9 <= (int)uVar4) goto LAB_00b64b9e;
}
else if (param_3 == 2) goto LAB_00b64c40;
if (this[0x10] == (bf_write)0x0) {
bVar8 = (byte)(1 << ((byte)uVar4 & 7));
if (local_18 == 0) {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 & ~bVar8;
}
else {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 | bVar8;
}
uVar9 = *(uint *)(this + 8);
uVar4 = *(int *)(this + 0xc) + 1;
*(uint *)(this + 0xc) = uVar4;
if ((int)uVar9 <= (int)uVar4) goto LAB_00b64b9e;
}
if (this[0x10] == (bf_write)0x0) {
bVar8 = (byte)(1 << ((byte)uVar4 & 7));
if (bVar3) {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 | bVar8;
}
else {
pbVar1 = (byte *)(*(int *)this + ((int)uVar4 >> 3));
*pbVar1 = *pbVar1 & ~bVar8;
}
uVar9 = *(uint *)(this + 8);
uVar4 = *(int *)(this + 0xc) + 1;
*(uint *)(this + 0xc) = uVar4;
}
}
else {
this[0x10] = (bf_write)0x1;
if (param_3 == 2) goto LAB_00b64c40;
LAB_00b64b9e:
this[0x10] = (bf_write)0x1;
}
if (local_18 != 0) {
uVar6 = local_18 - 1;
if (bVar2) {
if ((int)(uVar4 + 0xb) <= (int)uVar9) {
iVar11 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)this + iVar11);
*puVar10 = *puVar10 & *(uint *)(&DAT_0104430c + uVar4 * 0x84) | uVar6 << (sbyte)uVar4;
iVar5 = 0x20 - uVar4;
if (iVar5 < 0xb) {
puVar10 = (uint *)(*(int *)this + 4 + iVar11);
*puVar10 = (&g_BitWriteMasks)[0xb - iVar5] & *puVar10 | uVar6 >> ((byte)iVar5 & 0x1f);
}
iVar5 = *(int *)(this + 0xc);
uVar9 = *(uint *)(this + 8);
*(uint *)(this + 0xc) = iVar5 + 0xbU;
uVar4 = iVar5 + 0xbU;
goto LAB_00b64ac0;
}
}
else if ((int)(uVar4 + 0xe) <= (int)uVar9) {
iVar11 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)this + iVar11);
*puVar10 = *puVar10 & *(uint *)(&DAT_01044318 + uVar4 * 0x84) | uVar6 << (sbyte)uVar4;
iVar5 = 0x20 - uVar4;
if (iVar5 < 0xe) {
puVar10 = (uint *)(*(int *)this + 4 + iVar11);
*puVar10 = (&g_BitWriteMasks)[0xe - iVar5] & *puVar10 | uVar6 >> ((byte)iVar5 & 0x1f);
}
uVar9 = *(uint *)(this + 8);
uVar4 = *(int *)(this + 0xc) + 0xe;
*(uint *)(this + 0xc) = uVar4;
goto LAB_00b64ac0;
}
*(uint *)(this + 0xc) = uVar9;
this[0x10] = (bf_write)0x1;
uVar4 = uVar9;
}
LAB_00b64ac0:
iVar5 = (-(uint)(param_3 != 1) & 2) + 3;
if ((int)(iVar5 + uVar4) <= (int)uVar9) {
iVar11 = ((int)uVar4 >> 5) * 4;
uVar4 = uVar4 & 0x1f;
puVar10 = (uint *)(*(int *)this + iVar11);
*puVar10 = (&g_BitWriteMasks)[uVar4 * 0x21 + iVar5] & *puVar10 | local_1c << (sbyte)uVar4;
iVar7 = 0x20 - uVar4;
if (iVar7 < iVar5) {
puVar10 = (uint *)(*(int *)this + 4 + iVar11);
*puVar10 = (&g_BitWriteMasks)[iVar5 - iVar7] & *puVar10 | local_1c >> ((byte)iVar7 & 0x1f);
}
*(int *)(this + 0xc) = *(int *)(this + 0xc) + iVar5;
return;
}
*(uint *)(this + 0xc) = uVar9;
this[0x10] = (bf_write)0x1;
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.