L L4D2node

CCoreDispInfo::SurfToBaseFacePlane

0x000c3450 · 741 bytes · __thiscall

_ZN13CCoreDispInfo19SurfToBaseFacePlaneERK6VectorRS0_

Decompiled

undefined (3 params)

/* CCoreDispInfo::SurfToBaseFacePlane(Vector const&, Vector&) */

undefined4 __thiscall
CCoreDispInfo::SurfToBaseFacePlane(CCoreDispInfo *this,Vector *param_1,Vector *param_2)

{
  float fVar1;
  uint uVar2;
  uint uVar3;
  CoreDispBBox_t *pCVar4;
  int iVar5;
  undefined4 uVar6;
  int iVar7;
  int *piVar8;
  Vector *pVVar9;
  Vector *pVVar10;
  int *piVar11;
  int iVar12;
  CoreDispBBox_t *pCVar13;
  float local_88;
  float local_84;
  float local_80;
  int local_7c [6];
  Vector local_64 [12];
  Vector local_58 [12];
  Vector local_4c [12];
  float local_40;
  float local_3c;
  float local_38;
  float local_34;
  float local_30;
  float local_2c;
  float local_28;
  float local_24;
  float local_20;
  Vector local_1c [12];
  
  iVar12 = 1 << ((byte)*(undefined4 *)(this + 0xc) & 0x1f);
  uVar2 = iVar12 * iVar12;
  uVar3 = 0xffffffff;
  if (uVar2 < 0x5500001) {
    uVar3 = uVar2 * 0x18;
  }
  pCVar4 = operator_new__(uVar3);
  CreateBoundingBoxes(this,pCVar4,uVar2);
  if (0 < (int)uVar2) {
    uVar3 = 0;
    pCVar13 = pCVar4;
    do {
      if ((((pCVar13 != (CoreDispBBox_t *)0x0) &&
           (fVar1 = *(float *)param_1, *(float *)pCVar13 <= fVar1)) &&
          (fVar1 < *(float *)(pCVar13 + 0xc) || fVar1 == *(float *)(pCVar13 + 0xc))) &&
         (((fVar1 = *(float *)(param_1 + 4), *(float *)(pCVar13 + 4) <= fVar1 &&
           (fVar1 < *(float *)(pCVar13 + 0x10) || fVar1 == *(float *)(pCVar13 + 0x10))) &&
          ((fVar1 = *(float *)(param_1 + 8), *(float *)(pCVar13 + 8) <= fVar1 &&
           (fVar1 < *(float *)(pCVar13 + 0x14) || fVar1 == *(float *)(pCVar13 + 0x14))))))) {
        GetTriangleIndicesForDispBBox
                  (this,(int)uVar3 / (1 << ((byte)*(undefined4 *)(this + 0xc) & 0x1f)) + uVar3,
                   local_7c);
        piVar11 = local_7c;
        iVar12 = 0;
        do {
          iVar7 = *(int *)(this + 0x1b8);
          piVar8 = piVar11;
          pVVar10 = local_64;
          do {
            iVar5 = *piVar8;
            pVVar9 = pVVar10 + 0xc;
            piVar8 = piVar8 + 1;
            iVar5 = iVar5 * 0x90 + iVar7;
            *(undefined4 *)pVVar10 = *(undefined4 *)(iVar5 + 0x28);
            *(undefined4 *)(pVVar10 + 4) = *(undefined4 *)(iVar5 + 0x2c);
            *(undefined4 *)(pVVar10 + 8) = *(undefined4 *)(iVar5 + 0x30);
            pVVar10 = pVVar9;
          } while (pVVar9 != (Vector *)&local_40);
          uVar6 = CalcBarycentricCooefs
                            (local_64,local_58,local_4c,param_1,&local_88,&local_84,&local_80);
          if ((char)uVar6 != '\0') {
            piVar11 = local_7c + iVar12 * 3;
            iVar12 = *(int *)(this + 0x1b8);
            do {
              iVar7 = *piVar11;
              pVVar10 = pVVar9 + 0xc;
              piVar11 = piVar11 + 1;
              iVar7 = iVar7 * 0x90 + iVar12;
              *(undefined4 *)pVVar9 = *(undefined4 *)(iVar7 + 0x34);
              *(undefined4 *)(pVVar9 + 4) = *(undefined4 *)(iVar7 + 0x38);
              *(undefined4 *)(pVVar9 + 8) = *(undefined4 *)(iVar7 + 0x3c);
              pVVar9 = pVVar10;
            } while (pVVar10 != local_1c);
            *(float *)(param_2 + 4) =
                 local_30 * local_84 + local_24 * local_80 + local_3c * local_88;
            *(float *)(param_2 + 8) =
                 local_2c * local_84 + local_20 * local_80 + local_38 * local_88;
            *(float *)param_2 = local_84 * local_34 + local_80 * local_28 + local_88 * local_40;
            if (pCVar4 == (CoreDispBBox_t *)0x0) {
              return uVar6;
            }
            operator_delete__(pCVar4);
            return uVar6;
          }
          iVar12 = iVar12 + 1;
          piVar11 = piVar11 + 3;
        } while (iVar12 != 2);
      }
      uVar3 = uVar3 + 1;
      pCVar13 = pCVar13 + 0x18;
    } while (uVar3 != uVar2);
  }
  if (pCVar4 != (CoreDispBBox_t *)0x0) {
    operator_delete__(pCVar4);
  }
  return 0;
}

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)