L L4D2node

TextMessageParse

0x0021b2d0 · 1905 bytes · __regparm3

_ZL16TextMessageParsePhi

Decompiled

undefined (2 params)

/* WARNING: Type propagation algorithm not settling */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* TextMessageParse(unsigned char*, int) */

void __regparm3 TextMessageParse(uchar *param_1,int param_2)

{
  bool bVar1;
  int *piVar2;
  int iVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  undefined *puVar7;
  size_t sVar8;
  void *__dest;
  char *pcVar9;
  uint *puVar10;
  uint *puVar11;
  int iVar12;
  undefined4 *puVar13;
  void *__dest_00;
  char *pcVar14;
  int iVar15;
  undefined4 *puVar16;
  int in_GS_OFFSET;
  double dVar17;
  double dVar18;
  double dVar19;
  double dVar20;
  double dVar21;
  undefined4 uVar22;
  uchar *local_dc44;
  size_t local_dc40;
  int local_dc3c;
  int local_dc34;
  int local_dc24;
  undefined4 local_dc20;
  undefined4 local_dc1c;
  undefined4 local_dc18;
  float local_dc14 [8];
  float local_dbf4;
  char local_dbf0 [4];
  float local_dbec;
  byte local_dbe8 [4];
  int local_dbe4 [9585];
  char local_4620 [512];
  char local_4420 [512];
  uint local_4220 [127];
  char acStack_4022 [16386];
  int local_20;
  
  iVar15 = 0;
  bVar1 = false;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_dc24 = 0;
  piVar2 = (int *)CommandLine_Tier0();
  iVar3 = (**(code **)(*piVar2 + 0x28))(piVar2,"-textmessagedebug");
  CharacterSetBuild((characterset_t *)g_WhiteSpace," \r\n\t");
  local_dc34 = 0;
  local_dc3c = 0;
  local_dc40 = 0;
  local_dc44 = (uchar *)0x0;
  do {
    while( true ) {
      iVar4 = memfgets(param_1,param_2,&local_dc24,local_4620,0x200);
      if (iVar4 == 0) {
        ConDMsg("Parsed %d text messages\n",iVar15);
        local_dc34 = iVar15;
        if (iVar15 != 0) goto LAB_0021b884;
        iVar3 = 0;
        goto LAB_0021b8b5;
      }
      if (599 < iVar15) {
        Sys_Error("tmessage::TextMessageParse : messageCount>=MAX_MESSAGES");
      }
      TrimSpace(local_4620,local_4420);
      if (bVar1) break;
      iVar4 = IsComment(local_4420);
      if ((iVar4 == 0) && (iVar4 = ParseDirective(local_4420), iVar4 == 0)) {
        if (local_4420[0] == '{') {
          bVar1 = true;
          local_dc44 = param_1 + local_dc24;
        }
        else {
          if (local_4420[0] == '}') {
            ConDMsg("Unexpected \'}\' found, line %d\n",local_dc3c);
            goto LAB_0021b996;
          }
          V_strncpy((char *)local_4220,local_4420,0x200);
        }
      }
LAB_0021b388:
      local_dc3c = local_dc3c + 1;
      local_dc34 = local_dc24;
      if (599 < iVar15) goto LAB_0021b83a;
    }
    if (local_4420[0] != '}') {
      if (local_4420[0] != '{') goto LAB_0021b388;
      ConDMsg("Unexpected \'{\' found, line %d\n",local_dc3c);
      goto LAB_0021b996;
    }
    puVar11 = local_4220;
    do {
      puVar10 = puVar11;
      uVar5 = *puVar10 + 0xfefefeff & ~*puVar10;
      uVar6 = uVar5 & 0x80808080;
      puVar11 = puVar10 + 1;
    } while (uVar6 == 0);
    if ((uVar5 & 0x8080) == 0) {
      puVar11 = (uint *)((int)puVar10 + 6);
      uVar6 = uVar6 >> 0x10;
    }
    if (0x2000 < (int)((int)puVar11 +
                      local_dc40 + ((-3 - (uint)CARRY1((byte)uVar6,(byte)uVar6)) - (int)local_4220))
       ) {
      ConDMsg("Error parsing file!\n");
      goto LAB_0021b996;
    }
    _V_strcpy(acStack_4022 + local_dc40 + 2,(char *)local_4220);
    if ((((local_dc44 == (uchar *)0x0) || (*local_dc44 != '#')) || (local_dc34 < 2)) ||
       (param_1[local_dc34 + -2] != '\n')) {
      param_1[local_dc34 + -1] = '\0';
    }
    else {
      param_1[local_dc34 + -2] = '\0';
    }
    (&local_dc20)[iVar15 * 0x10] = gMessageParms;
    (&local_dc1c)[iVar15 * 0x10] = DAT_003ef204;
    (&local_dc18)[iVar15 * 0x10] = DAT_003ef208;
    local_dc14[iVar15 * 0x10] = DAT_003ef20c;
    local_dc14[iVar15 * 0x10 + 1] = DAT_003ef210;
    local_dc14[iVar15 * 0x10 + 2] = DAT_003ef214;
    local_dc14[iVar15 * 0x10 + 3] = DAT_003ef218;
    local_dc14[iVar15 * 0x10 + 4] = DAT_003ef21c;
    local_dc14[iVar15 * 0x10 + 5] = DAT_003ef220;
    local_dc14[iVar15 * 0x10 + 6] = DAT_003ef224;
    local_dc14[iVar15 * 0x10 + 8] = DAT_003ef22c;
    *(undefined4 *)(local_dbf0 + iVar15 * 0x40) = DAT_003ef230;
    (&local_dbec)[iVar15 * 0x10] = DAT_003ef234;
    local_dbe4[iVar15 * 0x10 + -1] = _DAT_003ef238;
    local_dbe4[iVar15 * 0x10] = DAT_003ef23c;
    local_dc14[iVar15 * 0x10 + 7] = (float)(acStack_4022 + local_dc40 + 2);
    puVar11 = local_4220;
    do {
      puVar10 = puVar11;
      uVar5 = *puVar10 + 0xfefefeff & ~*puVar10;
      uVar6 = uVar5 & 0x80808080;
      puVar11 = puVar10 + 1;
    } while (uVar6 == 0);
    if ((uVar5 & 0x8080) == 0) {
      puVar11 = (uint *)((int)puVar10 + 6);
      uVar6 = uVar6 >> 0x10;
    }
    local_dc40 = (int)puVar11 +
                 local_dc40 + ((-2 - (uint)CARRY1((byte)uVar6,(byte)uVar6)) - (int)local_4220);
    if (DAT_003ef23c != 0) {
      pcVar14 = (char *)local_dbe4[iVar15 * 0x10];
      iVar4 = _V_strlen(pcVar14);
      pcVar9 = acStack_4022 + local_dc40 + 2;
      V_strncpy(pcVar9,pcVar14,iVar4 + 1);
      local_dbe4[iVar15 * 0x10] = (int)pcVar9;
      iVar4 = _V_strlen(pcVar9);
      local_dc40 = local_dc40 + 1 + iVar4;
    }
    iVar4 = iVar15 * 0x40;
    local_dc14[iVar15 * 0x10 + 8] = (float)local_dc44;
    if (iVar3 != 0) {
      pcVar14 = (char *)local_dc14[iVar15 * 0x10 + 7];
      if (pcVar14 == (char *)0x0) {
        pcVar14 = "(null)";
      }
      Msg("%d %s\n",iVar15,pcVar14);
      Msg("  effect %d, color1(%d,%d,%d,%d), color2(%d,%d,%d,%d)\n",(&local_dc20)[iVar15 * 0x10],
          *(undefined1 *)(&local_dc1c + iVar15 * 0x10),*(undefined1 *)((int)&local_dc1c + iVar4 + 1)
          ,*(undefined1 *)((int)&local_dc1c + iVar4 + 2),
          *(undefined1 *)((int)&local_dc1c + iVar4 + 3),*(undefined1 *)(&local_dc18 + iVar15 * 0x10)
          ,*(undefined1 *)((int)&local_dc18 + iVar4 + 1),
          *(undefined1 *)((int)&local_dc18 + iVar4 + 2),
          *(undefined1 *)((int)&local_dc18 + iVar4 + 3));
      dVar17 = (double)local_dc14[iVar15 * 0x10 + 5];
      dVar18 = (double)local_dc14[iVar15 * 0x10 + 4];
      dVar19 = (double)local_dc14[iVar15 * 0x10 + 3];
      dVar20 = (double)local_dc14[iVar15 * 0x10 + 2];
      dVar21 = (double)local_dc14[iVar15 * 0x10 + 1];
      uVar22 = (undefined4)((ulonglong)(double)local_dc14[iVar15 * 0x10] >> 0x20);
      Msg("  pos %f,%f, fadein %f fadeout %f hold %f fxtime %f\n",(double)local_dc14[iVar15 * 0x10],
          dVar21,dVar20,dVar19,dVar18,dVar17);
      pcVar14 = (char *)local_dc14[iVar15 * 0x10 + 8];
      if ((char *)local_dc14[iVar15 * 0x10 + 8] == (char *)0x0) {
        pcVar14 = "(null)";
      }
      Msg("  \'%s\'\n",pcVar14,uVar22,dVar21,dVar20,dVar19,dVar18,dVar17);
      dVar20 = (double)(&local_dbec)[iVar15 * 0x10];
      uVar6 = (uint)*(byte *)(local_dbe4 + iVar15 * 0x10 + -1);
      puVar7 = &DAT_002b6517;
      if (local_dbf0[iVar4] == '\0') {
        puVar7 = &DAT_0029fe20;
      }
      Msg("  box %s, size %f, color(%d,%d,%d,%d)\n",puVar7,dVar20,uVar6,
          *(undefined1 *)((int)local_dbe4 + iVar4 + -3),
          *(undefined1 *)((int)local_dbe4 + iVar4 + -2),
          *(undefined1 *)((int)local_dbe4 + iVar4 + -1),(int)((ulonglong)dVar19 >> 0x20),dVar18,
          dVar17);
      if (local_dbe4[iVar15 * 0x10] != 0) {
        Msg("  will clear \'%s\'\n",local_dbe4[iVar15 * 0x10],dVar20,uVar6);
      }
    }
    local_dc34 = local_dc24;
    iVar15 = iVar15 + 1;
    bVar1 = false;
    local_dc3c = local_dc3c + 1;
  } while (iVar15 < 600);
LAB_0021b83a:
  ConMsg("WARNING: TOO MANY MESSAGES IN TITLES.TXT, MAX IS %d\n",600);
  ConDMsg("Parsed %d text messages\n",iVar15);
  local_dc34 = iVar15;
LAB_0021b884:
  puVar16 = (undefined4 *)((int)local_dc14 + 0x20);
  puVar13 = (undefined4 *)((int)puVar16 + local_dc34 * 0x40U);
  iVar3 = 0;
  do {
    pcVar14 = (char *)*puVar16;
    puVar16 = puVar16 + 0x10;
    sVar8 = strlen(pcVar14);
    iVar3 = iVar3 + 1 + sVar8;
  } while (puVar16 != puVar13);
LAB_0021b8b5:
  sVar8 = local_dc34 * 0x40;
  __dest = malloc(local_dc40 + iVar3 + sVar8);
  __dest_00 = (void *)(sVar8 + (int)__dest);
  gMessageTable = __dest;
  memcpy(__dest,&local_dc20,sVar8);
  memcpy(__dest_00,acStack_4022 + 2,local_dc40);
  pcVar14 = (char *)((int)__dest_00 + local_dc40);
  iVar3 = *(int *)((int)__dest + 0x28);
  iVar15 = 0;
  if (local_dc34 != 0) {
    do {
      iVar12 = iVar15 * 0x40;
      iVar4 = *(int *)((int)__dest + iVar12 + 0x3c);
      piVar2 = (int *)((int)__dest + iVar12 + 0x28);
      *piVar2 = (int)__dest_00 + (*piVar2 - iVar3);
      if (iVar4 != 0) {
        *(int *)((int)__dest + iVar12 + 0x3c) = (int)__dest_00 + (iVar4 - iVar3);
      }
      iVar15 = iVar15 + 1;
      _V_strcpy(pcVar14,*(char **)((int)__dest + iVar12 + 0x2c));
      __dest = gMessageTable;
      *(char **)((int)gMessageTable + iVar12 + 0x2c) = pcVar14;
      sVar8 = strlen(pcVar14);
      pcVar14 = pcVar14 + sVar8 + 1;
    } while (iVar15 != local_dc34);
  }
  gMessageTableCount = local_dc34;
LAB_0021b996:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  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)