L L4D2node

GCSDK::CMessageList::GetMessage

0x00070a30 · 563 bytes · __thiscall

_ZN5GCSDK12CMessageList10GetMessageEjPPKci

Decompiled

undefined (4 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* GCSDK::CMessageList::GetMessage(unsigned int, char const**, int) */

bool __thiscall
GCSDK::CMessageList::GetMessage(CMessageList *this,uint param_1,char **param_2,int param_3)

{
  uint *puVar1;
  short sVar2;
  int iVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  char cVar6;
  int iVar7;
  int iVar8;
  bool bVar9;
  undefined4 local_24;
  undefined4 local_20;
  
  local_24 = 0;
  local_20 = 0;
  if (_strstr == 0) {
    iVar8 = 0;
  }
  else {
    (**(code **)(_strstr + 0x50))
              (_strstr,&local_24,0,0,0,0,"/data/src/gcsdk/messagelist.cpp",0xec,
               &GetMessage(unsigned_int,char_const**,int)::tm_fmt,"(%s)%s","Jobs/Coroutines",
               "GetMessage");
    iVar8 = _strstr;
  }
  uVar5 = local_20;
  uVar4 = local_24;
  iVar3 = _DAT_000e89f8;
  if ((_DAT_000e804c != 0) || (DAT_000e8050 == '\0')) {
                    /* try { // try from 00070b60 to 00070bc1 has its CatchHandler @ 00070c75 */
    iVar7 = ThreadGetCurrentId();
    if (iVar3 == iVar7) {
      if ((char *)*_DAT_000e8054 != "GetMessage") {
        _DAT_000e8054 =
             (int *)CVProfNode::GetSubNode((char *)_DAT_000e8054,0xb59b0,(char *)0x0,0xb561c);
      }
      puVar1 = (uint *)(_DAT_000e80e0 + 4 + _DAT_000e8054[0x1c] * 8);
      *puVar1 = *puVar1 | 4;
      CVProfNode::EnterScope();
      DAT_000e8050 = '\0';
    }
  }
  if (param_2 != (char **)0x0) {
    *param_2 = "Unknown";
  }
  if (((*(int *)(this + 0xc) < (int)(param_1 >> 4)) ||
      (iVar3 = *(int *)(*(int *)this + (param_1 >> 4) * 4), iVar3 == 0)) ||
     (sVar2 = *(short *)(iVar3 + (param_1 & 0xf) * 2), sVar2 == -1)) {
    *param_2 = "Unknown MsgType - Not Found";
    bVar9 = false;
  }
  else {
    iVar3 = *(int *)(this + 0x14) + sVar2 * 0x18;
    if (param_2 != (char **)0x0) {
      *param_2 = *(char **)(iVar3 + 4);
    }
    bVar9 = (*(uint *)(iVar3 + 8) & param_3) != 0;
  }
  iVar3 = _DAT_000e89f8;
  if ((DAT_000e8050 == '\0') || (_DAT_000e804c != 0)) {
    iVar7 = ThreadGetCurrentId();
    if (iVar3 == iVar7) {
      cVar6 = CVProfNode::ExitScope();
      if (cVar6 != '\0') {
        _DAT_000e8054 = (int *)_DAT_000e8054[0x19];
      }
      DAT_000e8050 = _DAT_000e8054 == (int *)0xe8058;
    }
  }
  if (iVar8 != 0) {
    (**(code **)(iVar8 + 0x54))(iVar8,uVar4,uVar5,0,0,0);
  }
  return bVar9;
}

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)