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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.