L L4D2node

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 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)