L L4D2node

SurvivorLiberateBesiegedFriend::Update

0x0091e4a0 · 5027 bytes · __thiscall

_ZN30SurvivorLiberateBesiegedFriend6UpdateEP11SurvivorBotf

Decompiled

undefined (3 params)

/* SurvivorLiberateBesiegedFriend::Update(SurvivorBot*, float) */

SurvivorLiberateBesiegedFriend * __thiscall
SurvivorLiberateBesiegedFriend::Update
          (SurvivorLiberateBesiegedFriend *this,SurvivorBot *param_1,float param_2)

{
  float fVar1;
  code *pcVar2;
  uint *puVar3;
  bool bVar4;
  char cVar5;
  uint uVar6;
  int iVar7;
  int *piVar8;
  SurvivorLegsApproach *pSVar9;
  undefined4 *puVar10;
  SurvivorIntention *pSVar11;
  SurvivorLegsWait *pSVar12;
  CTerrorPlayer *pCVar13;
  undefined4 uVar14;
  undefined *puVar15;
  int *piVar16;
  int iVar17;
  CBaseEntity *pCVar18;
  undefined *puVar19;
  CBaseCombatCharacter *pCVar20;
  longdouble lVar21;
  uint uVar22;
  CBaseEntity *local_38;
  CBaseCombatCharacter *local_34;
  uint *local_30;
  int local_28 [6];
  
  uVar6 = *(uint *)(param_1 + 0x34);
  if ((((uVar6 == 0xffffffff) ||
       (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar15 + 8) != uVar6 >> 0xc)) ||
     ((piVar16 = *(int **)(puVar15 + 4), piVar16 == (int *)0x0 ||
      (cVar5 = (**(code **)(*piVar16 + 300))(piVar16), cVar5 == '\0')))) {
    piVar16 = *(int **)(param_1 + 0x44);
    if (piVar16 != (int *)0x0) {
      (**(code **)(*piVar16 + 4))(piVar16);
    }
    *(undefined4 *)this = 3;
    *(undefined4 *)(this + 4) = 0;
    *(char **)(this + 8) = "We\'re too late, they didn\'t make it";
    return this;
  }
  uVar6 = *(uint *)(param_1 + 0x34);
  pCVar13 = (CTerrorPlayer *)0x0;
  if (((uVar6 != 0xffffffff) &&
      (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
    pCVar13 = *(CTerrorPlayer **)(puVar15 + 4);
  }
  cVar5 = SurvivorBot::IsReachable((SurvivorBot *)param_2,pCVar13);
  if (cVar5 == '\0') {
    *(undefined4 *)this = 3;
    *(undefined4 *)(this + 4) = 0;
    *(char **)(this + 8) = "They are unreachable";
    return this;
  }
  cVar5 = CDirector::IsFinaleVehicleReady(TheDirector);
  if (cVar5 != '\0') {
    uVar6 = *(uint *)(param_1 + 0x34);
    piVar16 = (int *)0x0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      piVar16 = *(int **)(puVar15 + 4);
    }
    cVar5 = (**(code **)(*piVar16 + 0x778))(piVar16);
    if (cVar5 != '\0') {
      uVar6 = *(uint *)(param_1 + 0x34);
      piVar16 = (int *)0x0;
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        piVar16 = *(int **)(puVar15 + 4);
      }
      cVar5 = (**(code **)(*piVar16 + 0x7e8))(piVar16);
      if (cVar5 != '\0') {
        local_28[0] = 0;
        ForEachSurvivor<NumHumansInRescueVehicleScan>((NumHumansInRescueVehicleScan *)local_28);
        if (0 < local_28[0]) {
          *(undefined4 *)this = 3;
          *(undefined4 *)(this + 4) = 0;
          *(char **)(this + 8) =
               "Breaking off rescue because humans have entered the rescue vehicle.\n";
          return this;
        }
      }
    }
  }
  cVar5 = (**(code **)(*(int *)param_2 + 0x908))(param_2,10);
  if ((cVar5 == '\0') &&
     (cVar5 = (**(code **)(*(int *)param_2 + 0x908))(param_2,0xb), cVar5 == '\0')) {
    bVar4 = false;
LAB_0091e690:
    uVar6 = *(uint *)(param_1 + 0x34);
    piVar16 = (int *)0x0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      piVar16 = *(int **)(puVar15 + 4);
    }
    cVar5 = (**(code **)(*piVar16 + 0x7e8))(piVar16);
    if (cVar5 == '\0') {
LAB_0091ec80:
      uVar6 = *(uint *)(param_1 + 0x34);
    }
    else {
      uVar6 = *(uint *)(param_1 + 0x34);
      pCVar13 = (CTerrorPlayer *)0x0;
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        pCVar13 = *(CTerrorPlayer **)(puVar15 + 4);
      }
      cVar5 = CTerrorPlayer::IsDominatedBySpecialInfected(pCVar13);
      if (cVar5 != '\0') goto LAB_0091ec80;
      uVar6 = *(uint *)(param_1 + 0x34);
      local_30 = (uint *)0x0;
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        local_30 = *(uint **)(puVar15 + 4);
      }
      if ((&DAT_000039f1)[(int)local_30] == '\0') {
        if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
          uVar6 = *(uint *)(param_1 + 0x34);
        }
        fVar1 = *(float *)((int)param_2 + 0x2e8);
        pCVar18 = (CBaseEntity *)0x0;
        if (((uVar6 != 0xffffffff) &&
            (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc))
           && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
          pCVar18 = *(CBaseEntity **)(puVar15 + 4);
        }
        local_34 = (CBaseCombatCharacter *)g_pEntityList;
        if (((byte)pCVar18[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition(pCVar18);
          local_34 = (CBaseCombatCharacter *)g_pEntityList;
          uVar6 = *(uint *)(param_1 + 0x34);
        }
        uVar22 = -(uint)(12.0 <= fVar1 - *(float *)(pCVar18 + 0x2e8));
        uVar22 = ~uVar22 & 0x42480000 | uVar22 & 0x41c00000;
        goto LAB_0091e7e4;
      }
    }
    uVar22 = 0x42480000;
    local_34 = (CBaseCombatCharacter *)g_pEntityList;
  }
  else {
    uVar6 = *(uint *)(param_1 + 0x34);
    pCVar13 = (CTerrorPlayer *)0x0;
    if ((uVar6 != 0xffffffff) &&
       ((puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc &&
        (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)))) {
      pCVar13 = *(CTerrorPlayer **)(puVar15 + 4);
    }
    cVar5 = CTerrorPlayer::IsDominatedBySpecialInfected(pCVar13);
    if (cVar5 == '\0') {
      bVar4 = true;
      goto LAB_0091e690;
    }
    local_34 = (CBaseCombatCharacter *)g_pEntityList;
    bVar4 = true;
    uVar22 = 0x41c00000;
    uVar6 = *(uint *)(param_1 + 0x34);
  }
LAB_0091e7e4:
  uVar14 = 0;
  if (((uVar6 != 0xffffffff) &&
      (puVar15 = local_34 + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
    uVar14 = *(undefined4 *)(puVar15 + 4);
  }
  iVar7 = (int)param_2 + 0x4028;
  g_pEntityList = local_34;
  cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x114))(iVar7,uVar14,uVar22);
  if (cVar5 != '\0') {
    uVar6 = *(uint *)(param_1 + 0x34);
    local_34 = (CBaseCombatCharacter *)0x0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      local_34 = *(CBaseCombatCharacter **)(puVar15 + 4);
    }
    uVar22 = *(uint *)((int)local_34 + 0x33c4);
    if ((((uVar22 != 0xffffffff) &&
         (puVar15 = g_pEntityList + (uVar22 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
        (*(uint *)(puVar15 + 8) == uVar22 >> 0xc)) && (*(int *)(puVar15 + 4) != 0)) {
      lVar21 = (longdouble)CountdownTimer::Now();
      if (*(float *)(param_1 + 0x40) <= (float)lVar21) {
        piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9a4))(param_2);
        uVar6 = *(uint *)(param_1 + 0x34);
        local_30 = (uint *)0x0;
        if (((uVar6 != 0xffffffff) &&
            (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc))
           && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
          local_30 = *(uint **)(puVar15 + 4);
        }
        (**(code **)(*piVar16 + 0xc4))
                  (piVar16,local_30,3,0x3f000000,&Update(SurvivorBot*,float)::shoveReply,
                   "Shoving friend off tongue",1,0x3e800000);
        lVar21 = (longdouble)RandomFloat(0x3f800000,0x40000000);
        fVar1 = (float)lVar21;
        lVar21 = (longdouble)CountdownTimer::Now();
        if ((float)lVar21 + fVar1 != *(float *)(param_1 + 0x40)) {
          (**(code **)(*(int *)(param_1 + 0x38) + 4))(param_1 + 0x38,param_1 + 0x40);
          *(float *)(param_1 + 0x40) = (float)lVar21 + fVar1;
        }
        if (fVar1 != *(float *)(param_1 + 0x3c)) {
          (**(code **)(*(int *)(param_1 + 0x38) + 4))(param_1 + 0x38,param_1 + 0x3c);
          *(float *)(param_1 + 0x3c) = fVar1;
        }
      }
      uVar6 = *(uint *)(param_1 + 0x34);
    }
    pCVar13 = (CTerrorPlayer *)0x0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      pCVar13 = *(CTerrorPlayer **)(puVar15 + 4);
    }
    lVar21 = (longdouble)CTerrorPlayer::GetTimeSinceAttackedByEnemy(pCVar13);
    if ((float)lVar21 <= 1.5) {
      uVar6 = *(uint *)(param_1 + 0x34);
      piVar16 = (int *)0x0;
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        piVar16 = *(int **)(puVar15 + 4);
      }
      cVar5 = (**(code **)(*piVar16 + 0x778))(piVar16);
      if (cVar5 != '\0') goto LAB_0091ec58;
    }
    uVar6 = *(uint *)(param_1 + 0x34);
    iVar7 = 0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      iVar7 = *(int *)(puVar15 + 4);
    }
    if ((&DAT_000039f1)[iVar7] == '\0') {
      piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9ac))(param_2);
      local_30 = (uint *)0x0;
      uVar6 = *(uint *)(param_1 + 0x34);
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        local_30 = *(uint **)(puVar15 + 4);
      }
      cVar5 = (**(code **)(*piVar16 + 0xd0))(piVar16,local_30,1,0);
    }
    else {
      (**(code **)(*(int *)param_2 + 0x988))(param_2,0xbf800000);
      piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9ac))(param_2);
      uVar6 = *(uint *)(param_1 + 0x34);
      piVar16 = (int *)0x0;
      pcVar2 = *(code **)(*piVar8 + 0xd4);
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        piVar16 = *(int **)(puVar15 + 4);
      }
      (**(code **)(*piVar16 + 0x234))(local_28,piVar16);
      cVar5 = (*pcVar2)(piVar8,local_28,1);
    }
    if (cVar5 != '\0') {
      iVar7 = *(int *)(param_1 + 0x44);
      if (iVar7 != 0) {
        *(undefined4 *)this = 1;
        *(int *)(this + 4) = iVar7;
        *(char **)(this + 8) = "Reached our besieged friend";
        return this;
      }
      *(undefined4 *)this = 3;
      *(undefined4 *)(this + 4) = 0;
      *(char **)(this + 8) =
           "Reached our besieged friend, and have no explicit post-liberation action";
      return this;
    }
    goto LAB_0091ec58;
  }
  uVar6 = *(uint *)(param_1 + 0x34);
  iVar17 = 0;
  if (((uVar6 != 0xffffffff) &&
      (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
    iVar17 = *(int *)(puVar15 + 4);
  }
  uVar22 = *(uint *)(iVar17 + 0x33c4);
  if (((uVar22 != 0xffffffff) &&
      (puVar15 = g_pEntityList + (uVar22 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
     ((*(uint *)(puVar15 + 8) == uVar22 >> 0xc && (*(int *)(puVar15 + 4) != 0)))) {
    iVar17 = 0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      iVar17 = *(int *)(puVar15 + 4);
    }
    uVar22 = *(uint *)(iVar17 + 0x33c4);
    local_38 = (CBaseEntity *)0x0;
    if (((uVar22 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar22 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar22 >> 0xc)) {
      local_38 = *(CBaseEntity **)(puVar15 + 4);
    }
    if (((byte)local_38[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition(local_38);
      uVar6 = *(uint *)(param_1 + 0x34);
    }
    fVar1 = *(float *)(local_38 + 0x2e8);
    pCVar18 = (CBaseEntity *)0x0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      pCVar18 = *(CBaseEntity **)(puVar15 + 4);
    }
    if (((byte)pCVar18[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition(pCVar18);
    }
    if (60.0 < ABS(fVar1 - *(float *)(pCVar18 + 0x2e8))) {
      iVar17 = (**(code **)(*(int *)param_2 + 0x9a8))(param_2);
      if (0 < *(int *)(iVar17 + 0x70)) {
        puVar3 = *(uint **)(iVar17 + 100);
        uVar6 = *puVar3;
        if ((((uVar6 != 0xffffffff) &&
             (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc))
            && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) &&
           ((piVar16 = *(int **)(puVar15 + 4), piVar16 != (int *)0x0 &&
            (iVar17 = (**(code **)(*piVar16 + 0x544))(piVar16), 0 < iVar17)))) {
          uVar6 = *puVar3;
          piVar16 = (int *)0x0;
          if ((uVar6 != 0xffffffff) &&
             ((puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc
              && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)))) {
            piVar16 = *(int **)(puVar15 + 4);
          }
          iVar17 = (**(code **)(*piVar16 + 0x544))(piVar16);
          if (iVar17 < 7) {
            uVar6 = *puVar3;
            pCVar18 = (CBaseEntity *)0x0;
            if (((uVar6 != 0xffffffff) &&
                (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10,
                puVar15 != (undefined *)0xfffffffc)) && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
              pCVar18 = *(CBaseEntity **)(puVar15 + 4);
            }
            iVar17 = CBaseEntity::GetTeamNumber(pCVar18);
            if ((iVar17 != 3) ||
               (iVar17 = (**(code **)(*(int *)pCVar18 + 0x544))(pCVar18), iVar17 != 1))
            goto LAB_0091ec58;
          }
        }
      }
      if ((*(int *)(TheDirector + 0x1c0) < 1) && (*(int *)(TheDirector + 0x1bc) < 1)) {
        lVar21 = (longdouble)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0x138))(iVar7,local_38);
        if ((((float)lVar21 <= 600.0) &&
            (cVar5 = CTerrorPlayer::IsBeingHeroic((CTerrorPlayer *)param_2), cVar5 != '\0')) &&
           (!bVar4)) {
          pSVar12 = ::operator_new(0x44);
                    /* try { // try from 0091f7fb to 0091f7ff has its CatchHandler @ 0091f8cd */
          SurvivorLegsWait::SurvivorLegsWait(pSVar12,0.0);
          pSVar11 = (SurvivorIntention *)(**(code **)(*(int *)param_2 + 0x9a8))(param_2);
          SurvivorIntention::ChangeLegs(pSVar11,(Action *)pSVar12);
          param_1[0x48] = (SurvivorBot)0x0;
          piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9ac))(param_2);
          cVar5 = (**(code **)(*piVar16 + 0xd0))(piVar16,local_38,1,0);
          if (cVar5 == '\0') goto LAB_0091ec58;
        }
        piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9a4))(param_2);
        (**(code **)(*piVar16 + 0xc4))
                  (piVar16,local_38,3,0x3f000000,0,"Want to shoot the smoker holding my friend!",1,
                   0x3e800000);
      }
    }
    goto LAB_0091ec58;
  }
  uVar14 = 0;
  if (((uVar6 != 0xffffffff) &&
      (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
    uVar14 = *(undefined4 *)(puVar15 + 4);
  }
  cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x114))(iVar7,uVar14,0x43960000);
  if (cVar5 != '\0') {
    piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9ac))(param_2);
    local_30 = (uint *)0x0;
    uVar6 = *(uint *)(param_1 + 0x34);
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      local_30 = *(uint **)(puVar15 + 4);
    }
    cVar5 = (**(code **)(*piVar16 + 0xd0))(piVar16,local_30,1,0);
    if (cVar5 != '\0') {
      iVar7 = (**(code **)(*(int *)param_2 + 0x9a8))(param_2);
      if (*(int *)(iVar7 + 0x70) < 1) {
        local_30 = (uint *)0x0;
LAB_0091f298:
        puVar15 = g_pEntityList;
        if (param_1[0x48] == (SurvivorBot)0x0) {
          uVar6 = *(uint *)(param_1 + 0x34);
          pCVar18 = (CBaseEntity *)0x0;
          if (((uVar6 != 0xffffffff) &&
              (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)
              ) && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
            pCVar18 = *(CBaseEntity **)(puVar15 + 4);
          }
          pSVar9 = ::operator_new(0x9050);
                    /* try { // try from 0091f2e2 to 0091f2e6 has its CatchHandler @ 0091f8b8 */
          SurvivorLegsApproach::SurvivorLegsApproach(pSVar9,pCVar18);
          iVar7 = (**(code **)(*(int *)param_2 + 0x9a8))(param_2);
          piVar16 = *(int **)(iVar7 + 0x20 + *(int *)(iVar7 + 0x60) * 4);
          puVar10 = ::operator_new(0x38);
          *puVar10 = &PTR__Behavior_00d00308;
          puVar10[1] = &PTR__Behavior_00d003d0;
                    /* try { // try from 0091f333 to 0091f337 has its CatchHandler @ 0091f896 */
          CFmtStrN<32>::CFmtStrN((CFmtStrN<32> *)(puVar10 + 3),"%s",&DAT_00d539c2);
          puVar10[2] = pSVar9;
          *(undefined4 **)(iVar7 + 0x20 + *(int *)(iVar7 + 0x60) * 4) = puVar10;
          if (piVar16 != (int *)0x0) {
            (**(code **)(*piVar16 + 4))(piVar16);
          }
          puVar15 = g_pEntityList;
          param_1[0x48] = (SurvivorBot)0x1;
        }
        if (local_30 != (uint *)0x0) goto LAB_0091f36e;
      }
      else {
        local_30 = *(uint **)(iVar7 + 100);
        uVar6 = *local_30;
        if (((uVar6 == 0xffffffff) ||
            (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 == (undefined *)0xfffffffc))
           || ((*(uint *)(puVar15 + 8) != uVar6 >> 0xc || (*(int *)(puVar15 + 4) == 0)))) {
          local_30 = (uint *)0x0;
          goto LAB_0091f298;
        }
        if ((char)local_30[10] == '\0') goto LAB_0091f298;
        piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9a4))(param_2);
        uVar6 = *local_30;
        uVar14 = 0;
        if ((uVar6 != 0xffffffff) &&
           (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) {
          if (*(uint *)(puVar15 + 8) == uVar6 >> 0xc) {
            uVar14 = *(undefined4 *)(puVar15 + 4);
          }
          else {
            uVar14 = 0;
          }
        }
        (**(code **)(*piVar16 + 0xc4))
                  (piVar16,uVar14,3,0x3f000000,0,"Trying to face the infected that has my friend",1,
                   0x3e800000);
        puVar15 = g_pEntityList;
        if (((param_1[0x48] != (SurvivorBot)0x0) &&
            (lVar21 = (longdouble)
                      CTerrorPlayer::GetTimeSinceLastFiredWeapon((CTerrorPlayer *)param_2),
            puVar15 = g_pEntityList, (float)lVar21 < 1.0)) &&
           ((cVar5 = CTerrorPlayer::IsBeingHeroic((CTerrorPlayer *)param_2), puVar15 = g_pEntityList
            , cVar5 == '\0' && (!bVar4)))) {
          pSVar12 = ::operator_new(0x44);
                    /* try { // try from 0091f78a to 0091f78e has its CatchHandler @ 0091f8df */
          SurvivorLegsWait::SurvivorLegsWait(pSVar12,0.0);
          pSVar11 = (SurvivorIntention *)(**(code **)(*(int *)param_2 + 0x9a8))(param_2);
          SurvivorIntention::ChangeLegs(pSVar11,(Action *)pSVar12);
          param_1[0x48] = (SurvivorBot)0x0;
          puVar15 = g_pEntityList;
        }
LAB_0091f36e:
        local_34 = (CBaseCombatCharacter *)0x0;
        uVar6 = *local_30;
        if (((uVar6 != 0xffffffff) &&
            (puVar19 = puVar15 + (uVar6 & 0xfff) * 0x10, puVar19 != (undefined *)0xfffffffc)) &&
           (*(uint *)(puVar19 + 8) == uVar6 >> 0xc)) {
          local_34 = *(CBaseCombatCharacter **)(puVar19 + 4);
        }
        uVar6 = *(uint *)(param_1 + 0x34);
        pCVar13 = (CTerrorPlayer *)0x0;
        if (((uVar6 != 0xffffffff) &&
            (puVar15 = puVar15 + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
           (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
          pCVar13 = *(CTerrorPlayer **)(puVar15 + 4);
        }
        pSVar11 = (SurvivorIntention *)(**(code **)(*(int *)param_2 + 0x9a8))(param_2);
        cVar5 = SurvivorIntention::IsImmediatelyDangerousTo(pSVar11,pCVar13,local_34);
        if (cVar5 != '\0') goto LAB_0091ec58;
        pCVar20 = (CBaseCombatCharacter *)0x0;
        uVar6 = *local_30;
        if (((uVar6 != 0xffffffff) &&
            (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc))
           && (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
          pCVar20 = *(CBaseCombatCharacter **)(puVar15 + 4);
        }
        pSVar11 = (SurvivorIntention *)(**(code **)(*(int *)param_2 + 0x9a8))(param_2);
        cVar5 = SurvivorIntention::IsImmediatelyDangerousTo
                          (pSVar11,(CTerrorPlayer *)param_2,pCVar20);
        puVar15 = g_pEntityList;
        if (cVar5 != '\0') goto LAB_0091ec58;
      }
      uVar6 = *(uint *)(param_1 + 0x34);
      pCVar13 = (CTerrorPlayer *)0x0;
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = puVar15 + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
        pCVar13 = *(CTerrorPlayer **)(puVar15 + 4);
      }
      lVar21 = (longdouble)CTerrorPlayer::GetTimeSinceAttackedByEnemy(pCVar13);
      if (1.5 < (float)lVar21) {
        iVar7 = *(int *)(param_1 + 0x44);
        if (iVar7 == 0) {
          *(undefined4 *)this = 3;
          *(undefined4 *)(this + 4) = 0;
          *(char **)(this + 8) =
               "I don\'t see any enemies attacking my friend, and have no explicit post-liberation action"
          ;
        }
        else {
          *(undefined4 *)this = 1;
          *(int *)(this + 4) = iVar7;
          *(char **)(this + 8) = "I don\'t see any enemies attacking my friend";
        }
        return this;
      }
      goto LAB_0091ec58;
    }
  }
  if (param_1[0x48] == (SurvivorBot)0x0) {
    uVar6 = *(uint *)(param_1 + 0x34);
    pCVar18 = (CBaseEntity *)0x0;
    if (((uVar6 != 0xffffffff) &&
        (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar15 + 8) == uVar6 >> 0xc)) {
      pCVar18 = *(CBaseEntity **)(puVar15 + 4);
    }
    pSVar9 = ::operator_new(0x9050);
                    /* try { // try from 0091f0b6 to 0091f0ba has its CatchHandler @ 0091f8e8 */
    SurvivorLegsApproach::SurvivorLegsApproach(pSVar9,pCVar18);
    iVar7 = (**(code **)(*(int *)param_2 + 0x9a8))(param_2);
    piVar16 = *(int **)(iVar7 + 0x20 + *(int *)(iVar7 + 0x60) * 4);
    puVar10 = ::operator_new(0x38);
    *puVar10 = &PTR__Behavior_00d00308;
    puVar10[1] = &PTR__Behavior_00d003d0;
                    /* try { // try from 0091f107 to 0091f10b has its CatchHandler @ 0091f8e1 */
    CFmtStrN<32>::CFmtStrN((CFmtStrN<32> *)(puVar10 + 3),"%s",&DAT_00d539c2);
    puVar10[2] = pSVar9;
    *(undefined4 **)(iVar7 + 0x20 + *(int *)(iVar7 + 0x60) * 4) = puVar10;
    if (piVar16 != (int *)0x0) {
      (**(code **)(*piVar16 + 4))(piVar16);
    }
    param_1[0x48] = (SurvivorBot)0x1;
  }
  else {
    iVar7 = (**(code **)(*(int *)param_2 + 0x9a8))(param_2);
    if (0 < *(int *)(iVar7 + 0x70)) {
      puVar3 = *(uint **)(iVar7 + 100);
      uVar6 = *puVar3;
      if (((uVar6 != 0xffffffff) &&
          (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
         ((*(uint *)(puVar15 + 8) == uVar6 >> 0xc &&
          ((*(int *)(puVar15 + 4) != 0 && ((char)puVar3[10] != '\0')))))) {
        piVar16 = (int *)(**(code **)(*(int *)param_2 + 0x9a4))(param_2);
        uVar6 = *puVar3;
        uVar14 = 0;
        if ((uVar6 != 0xffffffff) &&
           (puVar15 = g_pEntityList + (uVar6 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) {
          if (*(uint *)(puVar15 + 8) == uVar6 >> 0xc) {
            uVar14 = *(undefined4 *)(puVar15 + 4);
          }
          else {
            uVar14 = 0;
          }
        }
        (**(code **)(*piVar16 + 0xc4))
                  (piVar16,uVar14,3,0x3f000000,0,"Trying to face the infected that has my friend",1,
                   0x3e800000);
      }
    }
  }
LAB_0091ec58:
  *(undefined4 *)this = 0;
  *(undefined4 *)(this + 4) = 0;
  *(undefined4 *)(this + 8) = 0;
  return this;
}

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)