L L4D2node

bf_write::WriteBitCoordMP

0x00241820 · 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_00241af0:
        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_003f2dcc + 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_003f2dd8 + 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_00241a4e;
    }
    else if (param_3 == 2) goto LAB_00241af0;
    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_00241a4e;
    }
    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_00241af0;
LAB_00241a4e:
    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_003f2dcc + 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_00241970;
      }
    }
    else if ((int)(uVar4 + 0xe) <= (int)uVar9) {
      iVar11 = ((int)uVar4 >> 5) * 4;
      uVar4 = uVar4 & 0x1f;
      puVar10 = (uint *)(*(int *)this + iVar11);
      *puVar10 = *puVar10 & *(uint *)(&DAT_003f2dd8 + 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_00241970;
    }
    *(uint *)(this + 0xc) = uVar9;
    this[0x10] = (bf_write)0x1;
    uVar4 = uVar9;
  }
LAB_00241970:
  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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)