L L4D2node

CWeaponSpawn::Use

0x008d66c0 · 1198 bytes · __cdecl

_ZN12CWeaponSpawn3UseEP11CBaseEntityS1_8USE_TYPEf

Decompiled

undefined (4 params)

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

void CWeaponSpawn::Use(CBaseEntity *param_1,CTerrorPlayer *param_2)

{
  code *pcVar1;
  bool bVar2;
  char cVar3;
  undefined4 uVar4;
  int iVar5;
  undefined4 uVar6;
  char *pcVar7;
  int *piVar8;
  int iVar9;
  int iVar10;
  CBaseCombatWeapon *pCVar11;
  undefined4 *puVar12;
  char *pcVar13;
  int local_48;
  Vector local_34 [12];
  Vector local_28 [24];
  
  if (param_2 == (CTerrorPlayer *)0x0) {
    return;
  }
  cVar3 = (**(code **)(*(int *)param_2 + 0x16c))(param_2);
  if (cVar3 == '\0') {
    return;
  }
  uVar4 = (**(code **)(*(int *)param_1 + 0x3cc))(param_1);
  iVar5 = GetWeaponInfo(uVar4);
  if (iVar5 == 0) {
    return;
  }
  cVar3 = CTerrorPlayer::CanUseWeapon(param_2,uVar4);
  if (cVar3 == '\0') {
    return;
  }
  uVar6 = (**(code **)(*(int *)param_1 + 0x3cc))(param_1);
  pcVar7 = (char *)WeaponIDToClassname(uVar6);
  piVar8 = (int *)CTerrorPlayer::GetTerrorWeapon(param_2,uVar4);
  if (piVar8 != (int *)0x0) {
    iVar9 = CBaseCombatCharacter::GetAmmoCount
                      ((CBaseCombatCharacter *)param_2,*(int *)(iVar5 + 0x850));
    pcVar13 = "";
    if ((char *)piVar8[0x1f] != (char *)0x0) {
      pcVar13 = (char *)piVar8[0x1f];
    }
    local_48 = iVar9;
    if (pcVar7 != pcVar13) {
      iVar10 = _V_stricmp(pcVar7,pcVar13);
      local_48 = 0;
      if (iVar10 == 0) {
        local_48 = iVar9;
      }
    }
    iVar9 = piVar8[0x508];
    bVar2 = true;
    if (0 < iVar9) {
      iVar10 = (**(code **)(*piVar8 + 0x510))(piVar8);
      bVar2 = iVar9 < iVar10;
    }
    pCVar11 = (CBaseCombatWeapon *)(**(code **)(*piVar8 + 0x500))(piVar8);
    if (pCVar11 == (CBaseCombatWeapon *)0x0) {
      cVar3 = (**(code **)(*(int *)param_1 + 0x3e4))(param_1,piVar8);
      if (cVar3 == '\0') {
        return;
      }
    }
    else {
      cVar3 = (**(code **)(*(int *)pCVar11 + 0x70c))(pCVar11);
      if (cVar3 != '\0') {
        cVar3 = (**(code **)(*(int *)pCVar11 + 0x674))(pCVar11);
        if (cVar3 != '\0') {
          puVar12 = (undefined4 *)GetAmmoDef();
          iVar9 = (**(code **)*puVar12)(puVar12,*(undefined4 *)(iVar5 + 0x850),param_2);
          if (iVar9 <= local_48) {
            return;
          }
          pcVar1 = *(code **)(*(int *)param_2 + 0x44c);
          puVar12 = (undefined4 *)GetAmmoDef();
          uVar4 = *(undefined4 *)(iVar5 + 0x850);
          uVar6 = (**(code **)*puVar12)(puVar12,uVar4,param_2);
          (*pcVar1)(param_2,uVar6,uVar4,0);
          return;
        }
        cVar3 = (**(code **)(*(int *)pCVar11 + 0x71c))(pCVar11);
        if (cVar3 == '\0') {
          return;
        }
        CTerrorPlayer::OnWeaponPickedUp(param_2,pCVar11);
        goto LAB_008d6828;
      }
      pcVar13 = "";
      if ((char *)piVar8[0x1f] != (char *)0x0) {
        pcVar13 = (char *)piVar8[0x1f];
      }
      if ((pcVar7 == pcVar13) || (iVar9 = _V_stricmp(pcVar7,pcVar13), iVar9 == 0)) {
        puVar12 = (undefined4 *)GetAmmoDef();
        iVar9 = (**(code **)*puVar12)(puVar12,*(undefined4 *)(iVar5 + 0x850),param_2);
        if ((iVar9 <= local_48) && (!bVar2)) {
          return;
        }
      }
    }
  }
  iVar9 = (**(code **)(*(int *)param_1 + 0x3dc))(param_1,param_2,pcVar7);
  if (iVar9 == 0) {
    return;
  }
  cVar3 = (**(code **)(*(int *)param_2 + 0x778))(param_2);
  if ((cVar3 != '\0') && (*(int *)(iVar5 + 0x894) - 8U < 2)) {
    CCollisionProperty::CollisionAABBToWorldAABB
              ((CCollisionProperty *)(param_1 + 0x194),(Vector *)(param_1 + 0x19c),
               (Vector *)(param_1 + 0x1a8),local_34,local_28);
    piVar8 = (int *)CGlobalEntityList::FindEntityByClassnameWithin
                              ((CGlobalEntityList *)gEntList,(CBaseEntity *)0x0,
                               "prop_health_cabinet",local_34,local_28);
    if (piVar8 != (int *)0x0) {
      (**(code **)(*piVar8 + 0x1ac))(piVar8,param_2,param_2,3,0);
    }
  }
LAB_008d6828:
  piVar8 = (int *)(**(code **)(*gameeventmanager + 0x1c))(gameeventmanager,"spawner_give_item",0,0);
  if (piVar8 != (int *)0x0) {
    pcVar1 = *(code **)(*piVar8 + 0x30);
    uVar4 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(param_2 + 0x30));
    (*pcVar1)(piVar8,"userid",uVar4);
    (**(code **)(*piVar8 + 0x3c))(piVar8,"item",pcVar7);
    if (*(int *)(param_1 + 0x30) == 0) {
      iVar9 = 0;
    }
    else {
      iVar9 = *(int *)(param_1 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
    }
    (**(code **)(*piVar8 + 0x30))(piVar8,"spawner",iVar9);
    (**(code **)(*gameeventmanager + 0x20))(gameeventmanager,piVar8,0);
  }
  pcVar1 = *(code **)(*(int *)param_2 + 0x44c);
  puVar12 = (undefined4 *)GetAmmoDef();
  uVar4 = *(undefined4 *)(iVar5 + 0x850);
  uVar6 = (**(code **)*puVar12)(puVar12,uVar4,param_2);
  (*pcVar1)(param_2,uVar6,uVar4,0);
  if (*(int *)(param_1 + 0x144c) != 0) {
    iVar9 = CTerrorWeaponInfo::GetWeaponInfo(*(undefined4 *)(param_1 + 0x1458));
    cVar3 = (**(code **)(*(int *)param_1 + 0x3c4))(param_1,iVar9);
    iVar5 = *(int *)(param_1 + 0x144c);
    if (cVar3 != '\0') {
      iVar5 = iVar5 + -1;
      *(int *)(param_1 + 0x144c) = iVar5;
    }
    if (iVar5 == 0) {
      if ((iVar9 == 0) || ((*(uint *)(iVar9 + 0x158) & 0xfffffffd) != 0)) {
        UTIL_Remove(param_1);
      }
      else {
        CBaseEntity::AddEffects(param_1,0x20);
      }
      CDirectorItemManager::RemoveItemFromScavengeCache
                (*(CDirectorItemManager **)(TheDirector + 0x62c),param_1);
      VisibilityMonitor_RemoveEntity(param_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)