Script_ZSpawn
0x00a5ecd0 · 2101 bytes · __cdecl
_Z13Script_ZSpawnP9HSCRIPT__
Decompiled
undefined (1 param)
/* Script_ZSpawn(HSCRIPT__*) */
undefined4 Script_ZSpawn(HSCRIPT__ *param_1)
{
char cVar1;
undefined4 uVar2;
int iVar3;
uint uVar4;
char *pcVar5;
char *pcVar6;
char *local_64;
undefined4 local_60;
ushort local_5c;
ushort local_5a;
undefined4 local_58;
undefined4 local_54;
undefined4 local_50;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
char *local_40;
undefined4 local_3c;
ushort local_38;
ushort local_36;
char *local_34;
undefined4 local_30;
ushort local_2c;
ushort local_2a;
char *local_28;
undefined4 local_24;
ushort local_20;
ushort local_1e;
local_5c = 0;
local_5a = 0;
local_64 = (char *)0x0;
/* try { // try from 00a5ed0f to 00a5ed26 has its CatchHandler @ 00a5f5aa */
uVar2 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,param_1,"type",&local_64);
pcVar6 = local_64;
if ((char)uVar2 == '\0') goto LAB_00a5ed1b;
local_38 = local_5c;
local_40 = (char *)0x0;
local_36 = 0;
local_3c = 0;
switch(local_5c) {
case 3:
local_38 = 3;
local_40 = malloc(0xc);
*(undefined4 *)local_40 = *(undefined4 *)pcVar6;
*(undefined4 *)(local_40 + 4) = *(undefined4 *)(pcVar6 + 4);
*(undefined4 *)(local_40 + 8) = *(undefined4 *)(pcVar6 + 8);
local_36 = 1;
uVar4 = 3;
break;
case 4:
local_38 = 4;
local_40 = malloc(0x10);
*(undefined4 *)local_40 = *(undefined4 *)pcVar6;
*(undefined4 *)(local_40 + 4) = *(undefined4 *)(pcVar6 + 4);
*(undefined4 *)(local_40 + 8) = *(undefined4 *)(pcVar6 + 8);
*(undefined4 *)(local_40 + 0xc) = *(undefined4 *)(pcVar6 + 0xc);
local_36 = 1;
uVar4 = 4;
break;
default:
local_40 = local_64;
local_3c = local_60;
goto LAB_00a5efa1;
case 0x1c:
local_38 = 0x1c;
local_40 = malloc(8);
*(undefined4 *)local_40 = *(undefined4 *)pcVar6;
local_36 = 1;
*(undefined4 *)(local_40 + 4) = *(undefined4 *)(pcVar6 + 4);
uVar4 = 0x1c;
break;
case 0x1f:
local_38 = 0x1f;
iVar3 = _V_strlen(local_64);
local_40 = malloc(iVar3 + 1U);
memcpy(local_40,pcVar6,iVar3 + 1U);
local_36 = local_36 | 1;
LAB_00a5efa1:
uVar4 = (uint)local_38;
if (local_38 != 5) {
pcVar6 = "unknown_variant_type";
if (local_38 < 0x29) break;
goto LAB_00a5edcf;
}
goto LAB_00a5ede9;
case 0x28:
local_38 = 0x28;
local_40 = malloc(0xc);
*(undefined4 *)local_40 = *(undefined4 *)pcVar6;
*(undefined4 *)(local_40 + 4) = *(undefined4 *)(pcVar6 + 4);
*(undefined4 *)(local_40 + 8) = *(undefined4 *)(pcVar6 + 8);
local_36 = 1;
uVar4 = 0x28;
}
pcVar6 = *(char **)(CSWTCH_2275 + uVar4 * 4);
LAB_00a5edcf:
/* try { // try from 00a5ede2 to 00a5ede6 has its CatchHandler @ 00a5f59b */
Warning("Wrong field type (%s) for <%s> in HUD Table",pcVar6,"type");
uVar2 = 0;
LAB_00a5ede9:
if ((local_36 & 1) != 0) {
free(local_40);
}
if ((char)uVar2 == '\0') {
LAB_00a5ed1b:
Msg("ScriptWarning: Can\'t ZSpawn without a type\n");
goto LAB_00a5ed27;
}
pcVar6 = (char *)(int)(float)local_64;
if (local_5c == 5) {
pcVar6 = local_64;
}
/* try { // try from 00a5ee31 to 00a5ef73 has its CatchHandler @ 00a5f5aa */
cVar1 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,param_1,"pos",&local_64);
pcVar5 = local_64;
if (cVar1 == '\0') {
if (pcVar6 == (char *)0xb) {
pcVar5 = (char *)0x7;
}
else {
if (pcVar6 == (char *)0x0) {
SpawnBackgroundZombies(1,false);
goto LAB_00a5ed29;
}
pcVar5 = pcVar6;
if ((char *)0x7 < pcVar6 + -1) {
Warning("Can\'t auto_pos for type %d\n",pcVar6);
goto LAB_00a5ed27;
}
}
cVar1 = ZombieManager::GetRandomPZSpawnPosition(TheZombieManager,pcVar5,5,0,&local_58);
if (cVar1 == '\0') {
Warning("Couldn\'t find a spawn pos for type %d in %d tries\n",pcVar5,5);
goto LAB_00a5ed27;
}
goto LAB_00a5f0b9;
}
local_2c = local_5c;
local_34 = (char *)0x0;
local_2a = 0;
local_30 = 0;
switch(local_5c) {
case 3:
local_2c = 3;
local_34 = malloc(0xc);
*(undefined4 *)local_34 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_34 + 4) = *(undefined4 *)(pcVar5 + 4);
*(undefined4 *)(local_34 + 8) = *(undefined4 *)(pcVar5 + 8);
local_2a = 1;
goto LAB_00a5f278;
case 4:
local_2c = 4;
local_34 = malloc(0x10);
*(undefined4 *)local_34 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_34 + 4) = *(undefined4 *)(pcVar5 + 4);
*(undefined4 *)(local_34 + 8) = *(undefined4 *)(pcVar5 + 8);
*(undefined4 *)(local_34 + 0xc) = *(undefined4 *)(pcVar5 + 0xc);
local_2a = 1;
uVar4 = 4;
break;
default:
local_34 = local_64;
local_30 = local_60;
goto LAB_00a5f191;
case 0x1c:
local_2c = 0x1c;
local_34 = malloc(8);
*(undefined4 *)local_34 = *(undefined4 *)pcVar5;
local_2a = 1;
*(undefined4 *)(local_34 + 4) = *(undefined4 *)(pcVar5 + 4);
uVar4 = 0x1c;
break;
case 0x1f:
local_2c = 0x1f;
iVar3 = _V_strlen(local_64);
local_34 = malloc(iVar3 + 1U);
memcpy(local_34,pcVar5,iVar3 + 1U);
local_2a = local_2a | 1;
LAB_00a5f191:
uVar4 = (uint)local_2c;
if (local_2c != 3) {
pcVar5 = "unknown_variant_type";
if (local_2c < 0x29) break;
goto LAB_00a5f05f;
}
goto LAB_00a5f07b;
case 0x28:
local_2c = 0x28;
local_34 = malloc(0xc);
*(undefined4 *)local_34 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_34 + 4) = *(undefined4 *)(pcVar5 + 4);
*(undefined4 *)(local_34 + 8) = *(undefined4 *)(pcVar5 + 8);
local_2a = 1;
uVar4 = 0x28;
}
pcVar5 = *(char **)(CSWTCH_2275 + uVar4 * 4);
LAB_00a5f05f:
/* try { // try from 00a5f072 to 00a5f076 has its CatchHandler @ 00a5f58c */
Warning("Wrong field type (%s) for <%s> in HUD Table",pcVar5,"pos");
cVar1 = '\0';
LAB_00a5f07b:
if ((local_2a & 1) != 0) {
LAB_00a5f278:
free(local_34);
}
if (cVar1 == '\0') {
Msg("ScriptWarning: Can\'t ZSpawn without a position\n");
LAB_00a5ed27:
uVar2 = 0;
goto LAB_00a5ed29;
}
pcVar5 = (char *)&vec3_origin;
if (local_64 != (char *)0x0) {
pcVar5 = local_64;
}
local_58 = *(undefined4 *)pcVar5;
local_54 = *(undefined4 *)(pcVar5 + 4);
local_50 = *(undefined4 *)(pcVar5 + 8);
LAB_00a5f0b9:
/* try { // try from 00a5f0d6 to 00a5f415 has its CatchHandler @ 00a5f5aa */
cVar1 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,param_1,"ang",&local_64);
pcVar5 = local_64;
if (cVar1 == '\0') {
local_4c = 0;
local_48 = 0;
local_44 = 0;
goto LAB_00a5f0fb;
}
local_20 = local_5c;
uVar4 = (uint)local_5c;
local_28 = (char *)0x0;
local_1e = 0;
local_24 = 0;
switch(uVar4 - 3 & 0xffff) {
case 0:
local_20 = 3;
local_28 = malloc(0xc);
uVar4 = 3;
*(undefined4 *)local_28 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_28 + 4) = *(undefined4 *)(pcVar5 + 4);
*(undefined4 *)(local_28 + 8) = *(undefined4 *)(pcVar5 + 8);
local_1e = 1;
break;
case 1:
local_20 = 4;
local_28 = malloc(0x10);
*(undefined4 *)local_28 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_28 + 4) = *(undefined4 *)(pcVar5 + 4);
*(undefined4 *)(local_28 + 8) = *(undefined4 *)(pcVar5 + 8);
*(undefined4 *)(local_28 + 0xc) = *(undefined4 *)(pcVar5 + 0xc);
local_1e = 1;
uVar4 = 4;
break;
default:
local_28 = local_64;
local_24 = local_60;
goto LAB_00a5f446;
case 0x19:
local_20 = 0x1c;
local_28 = malloc(8);
uVar4 = 0x1c;
*(undefined4 *)local_28 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_28 + 4) = *(undefined4 *)(pcVar5 + 4);
local_1e = 1;
break;
case 0x1c:
local_20 = 0x1f;
iVar3 = _V_strlen(local_64);
local_28 = malloc(iVar3 + 1U);
memcpy(local_28,pcVar5,iVar3 + 1U);
uVar4 = (uint)local_20;
local_1e = local_1e | 1;
LAB_00a5f446:
if ((ushort)uVar4 != 0x28) {
pcVar5 = "unknown_variant_type";
if ((ushort)uVar4 < 0x29) break;
goto LAB_00a5f45a;
}
goto LAB_00a5f474;
case 0x25:
local_20 = 0x28;
local_28 = malloc(0xc);
*(undefined4 *)local_28 = *(undefined4 *)pcVar5;
*(undefined4 *)(local_28 + 4) = *(undefined4 *)(pcVar5 + 4);
*(undefined4 *)(local_28 + 8) = *(undefined4 *)(pcVar5 + 8);
local_1e = 1;
goto LAB_00a5f3bd;
}
pcVar5 = *(char **)(CSWTCH_2275 + uVar4 * 4);
LAB_00a5f45a:
/* try { // try from 00a5f46d to 00a5f471 has its CatchHandler @ 00a5f56f */
Warning("Wrong field type (%s) for <%s> in HUD Table",pcVar5,"ang");
cVar1 = '\0';
LAB_00a5f474:
if ((local_1e & 1) != 0) {
LAB_00a5f3bd:
free(local_28);
}
if (cVar1 != '\0') {
pcVar5 = (char *)&vec3_angle;
if (local_64 != (char *)0x0) {
pcVar5 = local_64;
}
local_4c = *(undefined4 *)pcVar5;
local_48 = *(undefined4 *)(pcVar5 + 4);
local_44 = *(undefined4 *)(pcVar5 + 8);
}
LAB_00a5f0fb:
uVar2 = ZSpawnCore(pcVar6,local_58,local_54,local_50,local_4c,local_48,local_44,0xffffffff,0,0);
LAB_00a5ed29:
if ((local_5a & 1) != 0) {
free(local_64);
}
return uVar2;
}
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.