L L4D2node

CPropMountedGun::Use

0x0054f220 · 1446 bytes · __cdecl

_ZN15CPropMountedGun3UseEP11CBaseEntityS1_8USE_TYPEf

Decompiled

undefined (4 params)

/* CPropMountedGun::Use(CBaseEntity*, CBaseEntity*, USE_TYPE, float) */

void CPropMountedGun::Use
               (CBaseAnimating *param_1,CBaseCombatCharacter *param_2,undefined4 param_3,int param_4
               )

{
  CBaseEdict *pCVar1;
  code *pcVar2;
  char cVar3;
  int iVar4;
  undefined4 *puVar5;
  int *piVar6;
  undefined4 uVar7;
  undefined *puVar8;
  uint uVar9;
  longdouble lVar10;
  float fVar11;
  char *pcVar12;
  undefined1 local_24 [20];
  
  uVar9 = *(uint *)(param_1 + 0x15cc);
  if ((((uVar9 == 0xffffffff) ||
       (puVar8 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar8 + 8) != uVar9 >> 0xc)) ||
     (*(CBaseCombatCharacter **)(puVar8 + 4) == (CBaseCombatCharacter *)0x0)) {
    if (param_2 == (CBaseCombatCharacter *)0x0) goto LAB_0054f5f8;
  }
  else if (param_2 != *(CBaseCombatCharacter **)(puVar8 + 4)) {
    return;
  }
  cVar3 = (**(code **)(*(int *)param_2 + 0x16c))(param_2);
  if (cVar3 != '\0') {
    uVar9 = *(uint *)(param_2 + 0x1d14);
    if (((uVar9 == 0xffffffff) ||
        (puVar8 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
       ((*(uint *)(puVar8 + 8) != uVar9 >> 0xc || (*(CBaseAnimating **)(puVar8 + 4) != param_1)))) {
      cVar3 = (**(code **)(*(int *)param_1 + 0x164))(param_1,param_2);
      if (cVar3 != '\0') {
        uVar9 = *(uint *)(param_2 + 0x1d14);
        if ((((uVar9 == 0xffffffff) ||
             (puVar8 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc))
            || (*(uint *)(puVar8 + 8) != uVar9 >> 0xc)) ||
           (*(CBaseAnimating **)(puVar8 + 4) != param_1)) {
          if (param_2[0x6c] == (CBaseCombatCharacter)0x0) {
            pCVar1 = *(CBaseEdict **)(param_2 + 0x30);
            if (pCVar1 != (CBaseEdict *)0x0) {
              *(uint *)pCVar1 = *(uint *)pCVar1 | 0x101;
              iVar4 = CBaseEdict::GetChangeAccessor(pCVar1);
              *(undefined2 *)(iVar4 + 2) = 0;
            }
          }
          else {
            param_2[0x70] = (CBaseCombatCharacter)((byte)param_2[0x70] | 1);
          }
          puVar5 = (undefined4 *)(**(code **)(*(int *)param_1 + 0xc))(param_1);
          *(undefined4 *)(param_2 + 0x1d14) = *puVar5;
        }
        (**(code **)(*(int *)param_2 + 0x76c))(param_2);
        uVar9 = *(uint *)(param_1 + 0x15cc);
        if (((uVar9 == 0xffffffff) ||
            (puVar8 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
           ((*(uint *)(puVar8 + 8) != uVar9 >> 0xc ||
            (param_2 != *(CBaseCombatCharacter **)(puVar8 + 4))))) {
          if (param_1[0x6c] == (CBaseAnimating)0x0) {
            pCVar1 = *(CBaseEdict **)(param_1 + 0x30);
            if (pCVar1 != (CBaseEdict *)0x0) {
              *(uint *)pCVar1 = *(uint *)pCVar1 | 0x101;
              iVar4 = CBaseEdict::GetChangeAccessor(pCVar1);
              *(undefined2 *)(iVar4 + 2) = 0;
            }
          }
          else {
            param_1[0x70] = (CBaseAnimating)((byte)param_1[0x70] | 1);
          }
          puVar5 = (undefined4 *)(**(code **)(*(int *)param_2 + 0xc))(param_2);
          *(undefined4 *)(param_1 + 0x15cc) = *puVar5;
        }
        iVar4 = CBaseCombatCharacter::GetActiveWeapon(param_2);
        if (iVar4 != 0) {
          piVar6 = (int *)CBaseCombatCharacter::GetActiveWeapon(param_2);
          (**(code **)(*piVar6 + 0x428))(piVar6,0);
        }
        fVar11 = *(float *)(MountedGunFireThinkInterval._28_4_ + 0x2c) + *(float *)(gpGlobals + 0xc)
        ;
        pcVar12 = "FireContext";
        CBaseEntity::ThinkSet((_func_void *)local_24,(float)param_1,(char *)FireThink);
        piVar6 = gameeventmanager;
        *(undefined4 *)(param_1 + 0x15fc) = *(undefined4 *)(gpGlobals + 0xc);
        piVar6 = (int *)(**(code **)(*piVar6 + 0x1c))(piVar6,"mounted_gun_start",0,0,fVar11,pcVar12)
        ;
        if (piVar6 != (int *)0x0) {
          pcVar2 = *(code **)(*piVar6 + 0x30);
          uVar7 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(param_2 + 0x30));
          (*pcVar2)(piVar6,"userid",uVar7);
          if (*(int *)(param_1 + 0x30) == 0) {
            iVar4 = 0;
          }
          else {
            iVar4 = *(int *)(param_1 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
          }
          (**(code **)(*piVar6 + 0x30))(piVar6,"subject",iVar4);
          (**(code **)(*gameeventmanager + 0x20))(gameeventmanager,piVar6,0);
        }
        fVar11 = *(float *)(mounted_gun_mount_cooldown_time._28_4_ + 0x2c);
        lVar10 = (longdouble)CountdownTimer::Now();
        if ((float)lVar10 + fVar11 != *(float *)(param_1 + 0x162c)) {
          (**(code **)(*(int *)(param_1 + 0x1624) + 4))(param_1 + 0x1624,param_1 + 0x162c);
          *(float *)(param_1 + 0x162c) = (float)lVar10 + fVar11;
        }
        if (fVar11 != *(float *)(param_1 + 0x1628)) {
          (**(code **)(*(int *)(param_1 + 0x1624) + 4))(param_1 + 0x1624,param_1 + 0x1628);
          *(float *)(param_1 + 0x1628) = fVar11;
        }
        if ((param_1[0x15dd] != (CBaseAnimating)0x0) &&
           (piVar6 = (int *)(**(code **)(*gameeventmanager + 0x1c))
                                      (gameeventmanager,"mounted_gun_overheated",0,0),
           piVar6 != (int *)0x0)) {
          iVar4 = 0;
          pcVar2 = *(code **)(*piVar6 + 0x30);
          uVar9 = *(uint *)(param_1 + 0x15cc);
          if ((uVar9 != 0xffffffff) &&
             ((puVar8 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc &&
              (*(uint *)(puVar8 + 8) == uVar9 >> 0xc)))) {
            iVar4 = *(int *)(puVar8 + 4);
          }
          uVar7 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(iVar4 + 0x30));
          (*pcVar2)(piVar6,"userid",uVar7);
          (**(code **)(*gameeventmanager + 0x20))(gameeventmanager,piVar6,0);
        }
        goto LAB_0054f5f8;
      }
    }
    else if (param_4 != 2) {
      if (param_2[0x6c] == (CBaseCombatCharacter)0x0) {
        pCVar1 = *(CBaseEdict **)(param_2 + 0x30);
        if (pCVar1 != (CBaseEdict *)0x0) {
          *(uint *)pCVar1 = *(uint *)pCVar1 | 0x101;
          iVar4 = CBaseEdict::GetChangeAccessor(pCVar1);
          *(undefined2 *)(iVar4 + 2) = 0;
        }
      }
      else {
        param_2[0x70] = (CBaseCombatCharacter)((byte)param_2[0x70] | 1);
      }
      *(undefined4 *)(param_2 + 0x1d14) = 0xffffffff;
      (**(code **)(*(int *)param_2 + 0x76c))(param_2);
      if (param_1[0x15dc] != (CBaseAnimating)0x0) {
        OnFireStop((CPropMountedGun *)param_1);
      }
      uVar9 = *(uint *)(param_1 + 0x15cc);
      if (((uVar9 != 0xffffffff) &&
          (puVar8 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
         ((*(uint *)(puVar8 + 8) == uVar9 >> 0xc && (*(int *)(puVar8 + 4) != 0)))) {
        if (param_1[0x6c] == (CBaseAnimating)0x0) {
          pCVar1 = *(CBaseEdict **)(param_1 + 0x30);
          if (pCVar1 != (CBaseEdict *)0x0) {
            *(uint *)pCVar1 = *(uint *)pCVar1 | 0x101;
            iVar4 = CBaseEdict::GetChangeAccessor(pCVar1);
            *(undefined2 *)(iVar4 + 2) = 0;
          }
        }
        else {
          param_1[0x70] = (CBaseAnimating)((byte)param_1[0x70] | 1);
        }
        *(undefined4 *)(param_1 + 0x15cc) = 0xffffffff;
      }
      iVar4 = CBaseCombatCharacter::GetActiveWeapon(param_2);
      if (iVar4 != 0) {
        uVar9 = *(uint *)(param_2 + 0x1a7c) & 0xfffffffe;
        if (*(uint *)(param_2 + 0x1a7c) != uVar9) {
          (**(code **)(*(int *)(param_2 + 0x1a40) + 4))(param_2 + 0x1a40,param_2 + 0x1a7c);
          *(uint *)(param_2 + 0x1a7c) = uVar9;
        }
        piVar6 = (int *)CBaseCombatCharacter::GetActiveWeapon(param_2);
                    /* WARNING: Could not recover jumptable at 0x0054f715. Too many branches */
                    /* WARNING: Treating indirect jump as call */
        (**(code **)(*piVar6 + 0x424))();
        return;
      }
    }
    return;
  }
LAB_0054f5f8:
  uVar7 = CBaseAnimating::LookupAttachment(param_1,"shell");
  *(undefined4 *)(param_1 + 0x1660) = uVar7;
  uVar7 = CBaseAnimating::LookupAttachment(param_1,"muzzle_flash");
  *(undefined4 *)(param_1 + 0x1664) = uVar7;
  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)