L L4D2node

WriteUsercmd

0x0057b0f0 · 834 bytes · __cdecl

_Z12WriteUsercmdP8bf_writePK8CUserCmdS3_

Decompiled

undefined (3 params)

/* WriteUsercmd(bf_write*, CUserCmd const*, CUserCmd const*) */

void WriteUsercmd(bf_write *param_1,CUserCmd *param_2,CUserCmd *param_3)

{
  char cVar1;
  int iVar2;
  int iVar3;
  float extraout_ECX;
  float extraout_ECX_00;
  float extraout_ECX_01;
  float extraout_ECX_02;
  float extraout_ECX_03;
  float extraout_ECX_04;
  int iVar4;
  float extraout_ECX_05;
  float extraout_ECX_06;
  float extraout_ECX_07;
  char *extraout_EDX;
  char *extraout_EDX_00;
  char *extraout_EDX_01;
  char *extraout_EDX_02;
  char *extraout_EDX_03;
  char *extraout_EDX_04;
  byte *pbVar5;
  float fVar6;
  bf_write *pbVar7;
  int in_stack_ffffffd8;
  int local_20;
  
  WriteUserCmdDeltaInt
            (param_1,(char *)(*(int *)(param_3 + 4) + 1),*(int *)(param_2 + 4),0x20,
             in_stack_ffffffd8);
  fVar6 = 4.48416e-44;
  WriteUserCmdDeltaInt
            (param_1,(char *)(*(int *)(param_3 + 8) + 1),*(int *)(param_2 + 8),0x20,
             in_stack_ffffffd8);
  WriteUserCmdDeltaFloat(param_1,extraout_EDX,extraout_ECX,fVar6);
  WriteUserCmdDeltaFloat(param_1,extraout_EDX_00,extraout_ECX_00,fVar6);
  WriteUserCmdDeltaFloat(param_1,extraout_EDX_01,extraout_ECX_01,fVar6);
  WriteUserCmdDeltaFloat(param_1,extraout_EDX_02,extraout_ECX_02,fVar6);
  WriteUserCmdDeltaFloat(param_1,extraout_EDX_03,extraout_ECX_03,fVar6);
  WriteUserCmdDeltaFloat(param_1,extraout_EDX_04,extraout_ECX_04,fVar6);
  WriteUserCmdDeltaInt
            (param_1,*(char **)(param_3 + 0x24),*(int *)(param_2 + 0x24),0x20,in_stack_ffffffd8);
  WriteUserCmdDeltaInt
            (param_1,(char *)(uint)(byte)param_3[0x28],(uint)(byte)param_2[0x28],8,in_stack_ffffffd8
            );
  pbVar7 = (bf_write *)0xb;
  cVar1 = WriteUserCmdDeltaInt
                    (param_1,*(char **)(param_3 + 0x2c),*(int *)(param_2 + 0x2c),0xb,
                     in_stack_ffffffd8);
  local_20 = in_stack_ffffffd8;
  if (cVar1 != '\0') {
    pbVar7 = (bf_write *)0x6;
    WriteUserCmdDeltaInt
              (param_1,*(char **)(param_3 + 0x30),*(int *)(param_2 + 0x30),6,in_stack_ffffffd8);
    local_20 = in_stack_ffffffd8;
  }
  iVar2 = (int)*(short *)(param_2 + 0x38);
  iVar4 = *(int *)(param_1 + 0xc);
  if (iVar2 == *(short *)(param_3 + 0x38)) {
    iVar3 = *(int *)(param_1 + 8);
    if (iVar4 < iVar3) {
      if (param_1[0x10] == (bf_write)0x0) {
        pbVar5 = (byte *)((iVar4 >> 3) + *(int *)param_1);
        *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)iVar4 & 7));
        iVar4 = *(int *)(param_1 + 0xc) + 1;
        iVar3 = *(int *)(param_1 + 8);
        *(int *)(param_1 + 0xc) = iVar4;
        goto LAB_0057b22e;
      }
      iVar2 = (int)*(short *)(param_2 + 0x3a);
      if ((int)*(short *)(param_2 + 0x3a) != (int)*(short *)(param_3 + 0x3a)) goto LAB_0057b242;
      goto LAB_0057b384;
    }
    param_1[0x10] = (bf_write)0x1;
    iVar2 = (int)*(short *)(param_2 + 0x3a);
    if ((int)*(short *)(param_2 + 0x3a) == (int)*(short *)(param_3 + 0x3a)) goto LAB_0057b3cf;
  }
  else {
    if (iVar4 < *(int *)(param_1 + 8)) {
      if (param_1[0x10] == (bf_write)0x0) {
        pbVar5 = (byte *)((iVar4 >> 3) + *(int *)param_1);
        local_20._0_1_ = (byte)(1 << ((byte)iVar4 & 7));
        *pbVar5 = *pbVar5 | (byte)local_20;
        *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
      }
    }
    else {
      param_1[0x10] = (bf_write)0x1;
    }
    pbVar7 = param_1;
    bf_write::WriteShort(param_1,iVar2);
    iVar4 = *(int *)(param_1 + 0xc);
    iVar3 = *(int *)(param_1 + 8);
    local_20 = iVar2;
LAB_0057b22e:
    iVar2 = (int)*(short *)(param_2 + 0x3a);
    if ((int)*(short *)(param_2 + 0x3a) == (int)*(short *)(param_3 + 0x3a)) {
      if (iVar3 <= iVar4) {
LAB_0057b3cf:
        param_1[0x10] = (bf_write)0x1;
        goto LAB_0057b276;
      }
LAB_0057b384:
      if (param_1[0x10] == (bf_write)0x0) {
        pbVar5 = (byte *)((iVar4 >> 3) + *(int *)param_1);
        *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)iVar4 & 7));
        *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
      }
      goto LAB_0057b276;
    }
  }
LAB_0057b242:
  local_20 = iVar2;
  if (iVar4 < iVar3) {
    if (param_1[0x10] == (bf_write)0x0) {
      pbVar5 = (byte *)((iVar4 >> 3) + *(int *)param_1);
      *pbVar5 = *pbVar5 | (byte)(1 << ((byte)iVar4 & 7));
      *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
    }
  }
  else {
    param_1[0x10] = (bf_write)0x1;
  }
  pbVar7 = param_1;
  bf_write::WriteShort(param_1,local_20);
LAB_0057b276:
  cVar1 = IsHeadTrackingEnabled();
  if (cVar1 != '\0') {
    WriteUserCmdDeltaAngle(param_1,(char *)0x10,extraout_ECX_05,(float)pbVar7,local_20);
    WriteUserCmdDeltaAngle(param_1,(char *)0x10,extraout_ECX_06,(float)pbVar7,local_20);
    WriteUserCmdDeltaAngle(param_1,(char *)0x8,extraout_ECX_07,(float)pbVar7,local_20);
    if (((*(float *)(param_2 + 0x4c) != *(float *)(param_3 + 0x4c)) ||
        (*(float *)(param_2 + 0x50) != *(float *)(param_3 + 0x50))) ||
       (*(float *)(param_2 + 0x54) != *(float *)(param_3 + 0x54))) {
      iVar4 = *(int *)(param_1 + 0xc);
      if (iVar4 < *(int *)(param_1 + 8)) {
        if (param_1[0x10] == (bf_write)0x0) {
          pbVar5 = (byte *)((iVar4 >> 3) + *(int *)param_1);
          *pbVar5 = *pbVar5 | (byte)(1 << ((byte)iVar4 & 7));
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
        }
      }
      else {
        param_1[0x10] = (bf_write)0x1;
      }
      bf_write::WriteBitVec3Coord(param_1,(Vector *)(param_2 + 0x4c));
      return;
    }
    iVar4 = *(int *)(param_1 + 0xc);
    if (*(int *)(param_1 + 8) <= iVar4) {
      param_1[0x10] = (bf_write)0x1;
      return;
    }
    if (param_1[0x10] == (bf_write)0x0) {
      pbVar5 = (byte *)((iVar4 >> 3) + *(int *)param_1);
      *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)iVar4 & 7));
      *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
    }
  }
  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)