From 8daf5ee4f60c9c6382b05172c70b386dfc435f1a Mon Sep 17 00:00:00 2001 From: Rim Date: Tue, 28 May 2024 13:25:29 -0400 Subject: [PATCH] init --- gamedata/stats/zm/zm_statstable.csv | 161 + scripts/zm/_load.gsc | 241 + scripts/zm/_zm_utility.gsc | 6260 +++++++++++++++++ ui/LobbyMenuButtons.lua | 862 +++ zone_source/all/assetinfo/core_mod.csv | 9 + zone_source/all/assetinfo/core_mod.deps | 33 + .../all/assetinfo/core_mod_bulletreport.csv | 1 + .../all/assetinfo/core_mod_poolinfo.csv | 104 + zone_source/all/assetinfo/core_mod_xmodel.csv | 1 + zone_source/all/assetinfo/zm_mod.csv | 7 + zone_source/all/assetinfo/zm_mod.deps | 41 + .../all/assetinfo/zm_mod_bulletreport.csv | 1 + zone_source/all/assetinfo/zm_mod_poolinfo.csv | 104 + zone_source/all/assetinfo/zm_mod_xmodel.csv | 1 + zone_source/all/assetlist/core_mod.csv | 6 + zone_source/all/assetlist/zm_mod.csv | 3 + .../scripts/shared/array_shared.csc.gdb | Bin 0 -> 11127 bytes .../scripts/shared/array_shared.gsc.gdb | Bin 0 -> 13878 bytes .../all/scriptgdb/scripts/zm/_bb.gsc.gdb | Bin 0 -> 2700 bytes .../all/scriptgdb/scripts/zm/_load.csc.gdb | Bin 0 -> 1544 bytes .../all/scriptgdb/scripts/zm/_load.gsc.gdb | Bin 0 -> 2121 bytes .../all/scriptgdb/scripts/zm/_zm.gsc.gdb | Bin 0 -> 82283 bytes .../all/scriptgdb/scripts/zm/_zm_bgb.gsc.gdb | Bin 0 -> 645 bytes .../scriptgdb/scripts/zm/_zm_magicbox.gsc.gdb | Bin 0 -> 23959 bytes .../scriptgdb/scripts/zm/_zm_perks.gsc.gdb | Bin 0 -> 24356 bytes .../scriptgdb/scripts/zm/_zm_utility.csc.gdb | Bin 0 -> 2570 bytes .../scriptgdb/scripts/zm/_zm_utility.gsc.gdb | Bin 0 -> 67775 bytes .../scriptgdb/scripts/zm/bgb_cycle.gsc.gdb | Bin 0 -> 1845 bytes .../scripts/zm/bgb_machine_override.gsc.gdb | Bin 0 -> 1783 bytes .../scripts/zm/gametypes/_clientids.gsc.gdb | Bin 0 -> 577 bytes .../scriptgdb/scripts/zm/zm_usermap.gsc.gdb | Bin 0 -> 5749 bytes zone_source/core_mod.zone | 18 + zone_source/english/assetinfo/core_mod.csv | 4 + zone_source/english/assetinfo/core_mod.deps | 24 + .../assetinfo/core_mod_bulletreport.csv | 1 + .../english/assetinfo/core_mod_poolinfo.csv | 104 + .../english/assetinfo/core_mod_xmodel.csv | 1 + zone_source/english/assetinfo/zm_mod.csv | 4 + zone_source/english/assetinfo/zm_mod.deps | 35 + .../english/assetinfo/zm_mod_bulletreport.csv | 1 + .../english/assetinfo/zm_mod_poolinfo.csv | 104 + .../english/assetinfo/zm_mod_xmodel.csv | 1 + zone_source/english/assetlist/core_mod.csv | 1 + zone_source/english/assetlist/zm_mod.csv | 1 + zone_source/loc/core_mod.zone | 170 + zone_source/loc/zm_mod.zone | 104 + zone_source/zm_mod.zone | 11 + 47 files changed, 8419 insertions(+) create mode 100644 gamedata/stats/zm/zm_statstable.csv create mode 100644 scripts/zm/_load.gsc create mode 100644 scripts/zm/_zm_utility.gsc create mode 100644 ui/LobbyMenuButtons.lua create mode 100644 zone_source/all/assetinfo/core_mod.csv create mode 100644 zone_source/all/assetinfo/core_mod.deps create mode 100644 zone_source/all/assetinfo/core_mod_bulletreport.csv create mode 100644 zone_source/all/assetinfo/core_mod_poolinfo.csv create mode 100644 zone_source/all/assetinfo/core_mod_xmodel.csv create mode 100644 zone_source/all/assetinfo/zm_mod.csv create mode 100644 zone_source/all/assetinfo/zm_mod.deps create mode 100644 zone_source/all/assetinfo/zm_mod_bulletreport.csv create mode 100644 zone_source/all/assetinfo/zm_mod_poolinfo.csv create mode 100644 zone_source/all/assetinfo/zm_mod_xmodel.csv create mode 100644 zone_source/all/assetlist/core_mod.csv create mode 100644 zone_source/all/assetlist/zm_mod.csv create mode 100644 zone_source/all/scriptgdb/scripts/shared/array_shared.csc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/shared/array_shared.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_bb.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_load.csc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_load.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_zm.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_zm_bgb.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_zm_magicbox.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_zm_perks.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_zm_utility.csc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/_zm_utility.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/bgb_cycle.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/bgb_machine_override.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/gametypes/_clientids.gsc.gdb create mode 100644 zone_source/all/scriptgdb/scripts/zm/zm_usermap.gsc.gdb create mode 100644 zone_source/core_mod.zone create mode 100644 zone_source/english/assetinfo/core_mod.csv create mode 100644 zone_source/english/assetinfo/core_mod.deps create mode 100644 zone_source/english/assetinfo/core_mod_bulletreport.csv create mode 100644 zone_source/english/assetinfo/core_mod_poolinfo.csv create mode 100644 zone_source/english/assetinfo/core_mod_xmodel.csv create mode 100644 zone_source/english/assetinfo/zm_mod.csv create mode 100644 zone_source/english/assetinfo/zm_mod.deps create mode 100644 zone_source/english/assetinfo/zm_mod_bulletreport.csv create mode 100644 zone_source/english/assetinfo/zm_mod_poolinfo.csv create mode 100644 zone_source/english/assetinfo/zm_mod_xmodel.csv create mode 100644 zone_source/english/assetlist/core_mod.csv create mode 100644 zone_source/english/assetlist/zm_mod.csv create mode 100644 zone_source/loc/core_mod.zone create mode 100644 zone_source/loc/zm_mod.zone create mode 100644 zone_source/zm_mod.zone diff --git a/gamedata/stats/zm/zm_statstable.csv b/gamedata/stats/zm/zm_statstable.csv new file mode 100644 index 0000000..1dbde6c --- /dev/null +++ b/gamedata/stats/zm/zm_statstable.csv @@ -0,0 +1,161 @@ +version,12,#Bump this value every time you update the stats table. If you add a new weapon entry, then add the new version number in the #table version column i.e. s18.,,,,,,,,,,,,,,,,,, +a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14,p15,q16,r17,s18,t19,u20, +0,,weapon_pistol,WEAPON_NULL,weapon_null,,menu_mp_lobby_none_selected,,,,100,,-1,,100,,,,,,, +1,,weapon_pistol,WEAPON_PISTOL_STANDARD,pistol_standard,,t7_icon_weapon_pistol_standard,WEAPON_PISTOL_STANDARD_DESC,reflex reddot quickdraw steadyaim extbarrel fastreload,1,100,,-1,secondary,100,,,,,,, +2,,weapon_pistol,WEAPON_PISTOL_BURST,pistol_burst,,t7_icon_weapon_pistol_burst,WEAPON_PISTOL_BURST_DESC,reflex reddot quickdraw steadyaim extbarrel fastreload,2,8,,1,secondary,,,,1,,,, +3,,weapon_pistol,WEAPON_PISTOL_FULLAUTO,pistol_fullauto,,t7_icon_weapon_pistol_fullauto,WEAPON_PISTOL_FULLAUTO_DESC,reflex reddot quickdraw steadyaim extbarrel fastreload,3,21,,1,secondary,,,,1,,,, +4,,weapon_pistol,WEAPON_PISTOL_STANDARD_DW,pistol_standard_dw,,t7_icon_weapon_pistol_standard_dw,WEAPON_PISTOL_STANDARD_DW_DESC,damage extbarrel fastreload quickdraw reflex steadyaim suppressed,4,100,,-1,secondary,100,,,,,,, +5,,weapon_pistol,WEAPON_PISTOL_BURST_DW,pistol_burst_dw,,t7_icon_weapon_pistol_burst_dw,WEAPON_PISTOL_BURST_DW_DESC,damage extbarrel fastreload quickdraw reflex steadyaim suppressed,5,100,,-1,secondary,100,,,,,,, +6,,weapon_pistol,WEAPON_PISTOL_FULLAUTO_DW,pistol_fullauto_dw,,t7_icon_weapon_pistol_fullauto_dw,WEAPON_PISTOL_FULLAUTO_DW_DESC,damage extbarrel fastreload quickdraw reflex steadyaim suppressed,6,100,,-1,secondary,100,,,,,,, +8,,weapon_pistol,WEAPON_PISTOL_SHOTGUN,pistol_shotgun,,t7_icon_weapon_pistol_shotgun,WEAPON_PISTOL_SHOTGUN_DESC,reflex reddot quickdraw steadyaim fastreload extbarrel dw gmod6 gmod7,7,100,,-1,secondary,100,,,,4,,, +9,,weapon_pistol,WEAPON_PISTOL_SHOTGUN_DW,pistol_shotgun_dw,,t7_icon_weapon_pistol_shotgun_dw,WEAPON_PISTOL_SHOTGUN_DESC,gmod6 gmod7,8,100,,-1,secondary,100,,,,4,,, +10,,weapon_smg,WEAPON_SMG_STANDARD,smg_standard,,t7_icon_weapon_smg_standard,WEAPON_SMG_STANDARD_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,3,15,,1,primary,,,,1,,,, +11,,weapon_smg,WEAPON_SMG_BURST,smg_burst,,t7_icon_weapon_smg_burst,WEAPON_SMG_BURST_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,4,22,,1,primary,,,,1,,,, +12,,weapon_smg,WEAPON_SMG_FASTFIRE,smg_fastfire,,t7_icon_weapon_smg_fastfire,WEAPON_SMG_FASTFIRE_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,1,3,,1,primary,,,,1,,,, +13,,weapon_smg,WEAPON_SMG_LONGRANGE,smg_longrange,,t7_icon_weapon_smg_longrange,WEAPON_SMG_LONGRANGE_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,6,100,,-1,primary,100,,,,,,, +14,,weapon_smg,WEAPON_SMG_VERSATILE,smg_versatile,,t7_icon_weapon_smg_versatile,WEAPON_SMG_VERSATILE_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,2,7,,1,primary,,,,1,,,, +15,,weapon_smg,WEAPON_SMG_CAPACITY,smg_capacity,,t7_icon_weapon_smg_capacity,WEAPON_SMG_CAPACITY_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,5,28,,1,primary,,,,1,,,, +16,,weapon_smg,WEAPON_SMG_AK74U,smg_ak74u,,t7_icon_weapon_smg_ak74u,WEAPON_SMG_AK74U_DESC,reflex acog dualoptic holo reddot quickdraw grip stalker steadyaim fastreload extbarrel rf gmod6 gmod7,12,0,,-1,primary,,,,,9,,, +17,,weapon_smg,WEAPON_SMG_MP40,smg_mp40,,t7_icon_weapon_smg_capacity,WEAPON_SMG_MP40_DESC,reflex acog dualoptic holo reddot quickdraw grip stalker steadyaim fastreload extbarrel rf gmod6 gmod7,7,100,,-1,primary,100,,,,4,,, +20,,weapon_assault,WEAPON_AR_STANDARD,ar_standard,,t7_icon_weapon_ar_standard,WEAPON_AR_STANDARD_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,2,6,,1,primary,,,,1,,,, +21,,weapon_assault,WEAPON_AR_ACCURATE,ar_accurate,,t7_icon_weapon_ar_accurate,WEAPON_AR_ACCURATE_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,1,1,,1,primary,,,,1,,,, +22,,weapon_assault,WEAPON_AR_CQB,ar_cqb,,t7_icon_weapon_ar_cqb,WEAPON_AR_CQB_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,5,24,,1,primary,,,,1,,,, +23,,weapon_assault,WEAPON_AR_DAMAGE,ar_damage,,t7_icon_weapon_ar_damage,WEAPON_AR_DAMAGE_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,6,30,,1,primary,,,,1,,,, +24,,weapon_assault,WEAPON_AR_FASTBURST,ar_fastburst,,t7_icon_weapon_ar_fastburst,WEAPON_AR_FASTBURST_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,7,100,,-1,primary,100,,,,,,, +25,,weapon_assault,WEAPON_AR_LONGBURST,ar_longburst,,t7_icon_weapon_ar_longburst,WEAPON_AR_LONGBURST_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,3,16,,1,primary,,,,1,,,, +26,,weapon_assault,WEAPON_AR_MARKSMAN,ar_marksman,,t7_icon_weapon_ar_marksman,WEAPON_AR_MARKSMAN_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload,4,19,,1,primary,,,,1,,,, +28,,weapon_assault,WEAPON_AR_GARAND,ar_garand,,t7_icon_weapon_ar_garand,WEAPON_AR_GARAND_DESC,reflex acog dualoptic holo ir reddot quickdraw grip damage stalker steadyaim fastreload extbarrel rf gmod6 gmod7,8,100,,-1,primary,100,,,,4,,, +30,,weapon_lmg,WEAPON_LMG_CQB,lmg_cqb,,t7_icon_weapon_lmg_cqb,WEAPON_LMG_CQB_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload,2,18,,1,primary,,,,1,,,, +31,,weapon_lmg,WEAPON_LMG_HEAVY,lmg_heavy,,t7_icon_weapon_lmg_heavy,WEAPON_LMG_HEAVY_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload,3,26,,1,primary,,,,1,,,, +32,,weapon_lmg,WEAPON_LMG_LIGHT,lmg_light,,t7_icon_weapon_lmg_light,WEAPON_LMG_LIGHT_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload,1,11,,1,primary,,,,1,,,, +33,,weapon_lmg,WEAPON_LMG_SLOWFIRE,lmg_slowfire,,t7_icon_weapon_lmg_slowfire,WEAPON_LMG_SLOWFIRE_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload,4,30,,1,primary,,,,1,,,, +40,,weapon_sniper,WEAPON_SNIPER_FASTBOLT,sniper_fastbolt,,t7_icon_weapon_sniper_fastbolt,WEAPON_SNIPER_FASTBOLT_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload,1,10,,1,primary,,,,1,,,, +41,,weapon_sniper,WEAPON_SNIPER_FASTSEMI,sniper_fastsemi,,t7_icon_weapon_sniper_fastsemi,WEAPON_SNIPER_FASTSEMI_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload,2,13,,1,primary,,,,1,,,, +42,,weapon_sniper,WEAPON_SNIPER_POWERBOLT,sniper_powerbolt,,t7_icon_weapon_sniper_powerbolt,WEAPON_SNIPER_POWERBOLT_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload,3,23,,1,primary,,,,1,,,, +43,,weapon_sniper,WEAPON_SNIPER_CHARGESHOT,sniper_chargeshot,,t7_icon_weapon_sniper_chargeshot,WEAPON_SNIPER_CHARGESHOT_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload,4,100,,-1,primary,100,,,,,,, +48,,weapon_pistol,WEAPON_PISTOL_M1911,pistol_m1911,,t7_icon_weapon_pistol_m1911,WEAPON_PISTOL_M1911_DESC,reflex reddot quickdraw steadyaim damage fastreload extbarrel dw gmod6 gmod7,6,0,,-1,primary,,,,,9,,, +50,,weapon_cqb,WEAPON_SHOTGUN_FULLAUTO,shotgun_fullauto,,t7_icon_weapon_shotgun_fullauto,WEAPON_SHOTGUN_FULLAUTO_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload,4,32,,1,primary,,,,1,,,, +51,,weapon_cqb,WEAPON_SHOTGUN_PRECISION,shotgun_precision,,t7_icon_weapon_shotgun_precision,WEAPON_SHOTGUN_PRECISION_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload,2,12,,1,primary,,,,1,,,, +52,,weapon_cqb,WEAPON_SHOTGUN_PUMP,shotgun_pump,,t7_icon_weapon_shotgun_pump,WEAPON_SHOTGUN_PUMP_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload,1,4,,1,primary,,,,1,,,, +53,,weapon_cqb,WEAPON_SHOTGUN_SEMIAUTO,shotgun_semiauto,,t7_icon_weapon_shotgun_semiauto,WEAPON_SHOTGUN_SEMIAUTO_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload,3,17,,1,primary,,,,1,,,, +58,,weapon_launcher,WEAPON_LAUNCHER_STANDARD,launcher_standard,1,t7_icon_weapon_launcher_standard,WEAPON_LAUNCHER_STANDARD_ZM_DESC,,7,27,,1,secondary,,,,1,,,, +59,,weapon_launcher,WEAPON_LAUNCHER_LOCKONLY,launcher_lockonly,1,t7_icon_weapon_launcher_lockonly,WEAPON_LAUNCHER_LOCKONLY_DESC,,8,100,,-1,secondary,100,,,,,,, +70,,weapon_pistol,WEAPON_PISTOL_REVOLVER38,pistol_revolver38,1,t7_icon_weapon_pistol_revolver38,WEAPON_PISTOL_REVOLVER38_DESC,,1,100,,-1,secondary,100,,,,,,, +71,,weapon_smg,WEAPON_SMG_STEN,smg_sten,1,t7_icon_weapon_smg_sten,WEAPON_SMG_STEN_DESC,,2,100,,-1,primary,100,,,,,,, +72,,weapon_special,WEAPON_HERO_GRAVITYSPIKES,hero_gravityspikes_melee,,t7_icon_weapon_hero_mercenary_pu,WEAPON_HERO_GRAVITYSPIKES,,,,,-1,primary,,,,,3,,, +73,,weapon_smg,WEAPON_SMG_PPSH,smg_ppsh,,t7_icon_weapon_smg_ppsh,WEAPON_SMG_PPSH,reflex acog dualoptic holo reddot quickdraw grip stalker steadyaim fastreload extbarrel rf gmod6 gmod7,,100,,-1,primary,100,,,,4,,, +74,,weapon_special,WEAPON_SKULL_GUN,skull_gun,,menu_mp_weapons_dg2,WEAPON_SKULL_GUN,,1,100,,-1,primary,100,,,,4,,, +98,,weapon_special,WEAPON_TESLA_GUN,tesla_gun,,menu_mp_weapons_dg2,WEAPON_TESLA_GUN,,,,,-1,primary,,,,,,,, +99,,weapon_knife,WEAPON_KNIFE_LOADOUT,knife_loadout,1,t7_icon_weapon_special_knife,WEAPON_KNIFE_LOADOUT_DESC,,1,100,,-1,secondary,100,,,1,,,, +100,,weapon_knife,WEAPON_BOWIE,bowie_knife,,t7_icon_weapon_special_bowie,WEAPON_BOWIE_DESC,,1,0,,1,secondary,,,,,,,, +a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14,p15,q16,r17,s18,t19,u20, +101,,weapon_pistol,WEAPON_PISTOL_STANDARD,pistol_standard_upgraded,,t7_icon_weapon_pistol_standard,WEAPON_PISTOL_STANDARD_DESC,reflex reddot quickdraw steadyaim extbarrel fastreload fmj,101,100,,-1,secondary,100,,,,,,, +102,,weapon_pistol,WEAPON_PISTOL_BURST,pistol_burst_upgraded,,t7_icon_weapon_pistol_burst,WEAPON_PISTOL_BURST_DESC,reflex reddot quickdraw steadyaim extbarrel fastreload fmj,102,100,,-1,secondary,100,,,,,,, +103,,weapon_pistol,WEAPON_PISTOL_FULLAUTO,pistol_fullauto_upgraded,,t7_icon_weapon_pistol_fullauto,WEAPON_PISTOL_FULLAUTO_DESC,reflex reddot quickdraw steadyaim extbarrel fastreload fmj,103,100,,-1,secondary,100,,,,,,, +107,,weapon_pistol,WEAPON_PISTOL_SHOTGUN,pistol_shotgun_upgraded,,t7_icon_weapon_pistol_shotgun,WEAPON_PISTOL_SHOTGUN_DESC,reflex reddot quickdraw steadyaim fastreload extbarrel dw gmod6 gmod7,107,100,,-1,secondary,100,,,,4,,, +108,,weapon_pistol,WEAPON_PISTOL_SHOTGUN_DW,pistol_shotgun_dw_upgraded,,t7_icon_weapon_pistol_shotgun_dw,WEAPON_PISTOL_SHOTGUN_DESC,gmod6 gmod7,108,100,,-1,secondary,100,,,,4,,, +110,,weapon_smg,WEAPON_SMG_STANDARD,smg_standard_upgraded,,t7_icon_weapon_smg_standard,WEAPON_SMG_STANDARD_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,110,100,,-1,primary,100,,,,,,, +111,,weapon_smg,WEAPON_SMG_BURST,smg_burst_upgraded,,t7_icon_weapon_smg_burst,WEAPON_SMG_BURST_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,111,100,,-1,primary,100,,,,,,, +112,,weapon_smg,WEAPON_SMG_FASTFIRE,smg_fastfire_upgraded,,t7_icon_weapon_smg_fastfire,WEAPON_SMG_FASTFIRE_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,112,100,,-1,primary,100,,,,,,, +113,,weapon_smg,WEAPON_SMG_LONGRANGE,smg_longrange_upgraded,,t7_icon_weapon_smg_longrange,WEAPON_SMG_LONGRANGE_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,113,100,,-1,primary,100,,,,,,, +114,,weapon_smg,WEAPON_SMG_VERSATILE,smg_versatile_upgraded,,t7_icon_weapon_smg_versatile,WEAPON_SMG_VERSATILE_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,114,100,,-1,primary,100,,,,,,, +115,,weapon_smg,WEAPON_SMG_CAPACITY,smg_capacity_upgraded,,t7_icon_weapon_smg_capacity,WEAPON_SMG_CAPACITY_DESC,reflex dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,115,100,,-1,primary,100,,,,,,, +116,,weapon_smg,WEAPON_SMG_AK74U,smg_ak74u_upgraded,,t7_icon_weapon_smg_ak74u,WEAPON_SMG_AK74U_DESC,reflex acog dualoptic holo reddot quickdraw grip stalker steadyaim fastreload extbarrel rf gmod6 gmod7,12,0,,-1,primary,,,,,9,,, +117,,weapon_smg,WEAPON_SMG_MP40,smg_mp40_upgraded,,t7_icon_weapon_smg_capacity,WEAPON_SMG_MP40_DESC,reflex acog dualoptic holo reddot quickdraw grip stalker steadyaim fastreload extbarrel rf gmod6 gmod7,116,100,,-1,primary,100,,,,4,,, +120,,weapon_assault,WEAPON_AR_STANDARD,ar_standard_upgraded,,t7_icon_weapon_ar_standard,WEAPON_AR_STANDARD_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,120,100,,-1,primary,100,,,,,,, +121,,weapon_assault,WEAPON_AR_ACCURATE,ar_accurate_upgraded,,t7_icon_weapon_ar_standard,WEAPON_AR_ACCURATE_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,121,100,,-1,primary,100,,,,,,, +122,,weapon_assault,WEAPON_AR_CQB,ar_cqb_upgraded,,t7_icon_weapon_ar_standard,WEAPON_AR_CQB_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,122,100,,-1,primary,100,,,,,,, +123,,weapon_assault,WEAPON_AR_DAMAGE,ar_damage_upgraded,,t7_icon_weapon_ar_damage,WEAPON_AR_DAMAGE_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,123,100,,-1,primary,100,,,,,,, +124,,weapon_assault,WEAPON_AR_FASTBURST,ar_fastburst_upgraded,,t7_icon_weapon_ar_fastburst,WEAPON_AR_FASTBURST_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,124,100,,-1,primary,100,,,,,,, +125,,weapon_assault,WEAPON_AR_LONGBURST,ar_longburst_upgraded,,t7_icon_weapon_ar_longburst,WEAPON_AR_LONGBURST_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,125,100,,-1,primary,100,,,,,,, +126,,weapon_assault,WEAPON_AR_MARKSMAN,ar_marksman_upgraded,,t7_icon_weapon_ar_marksman,WEAPON_AR_MARKSMAN_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip extbarrel fastreload fmj,126,100,,-1,primary,100,,,,,,, +127,,weapon_assault,WEAPON_AR_GARAND,ar_garand_upgraded,,t7_icon_weapon_ar_garand,WEAPON_AR_GARAND_DESC,reflex acog dualoptic holo ir reddot quickdraw grip damage stalker steadyaim fastreload extbarrel rf gmod6 gmod7,127,100,,-1,primary,100,,,,4,,, +128,,weapon_lmg,WEAPON_LMG_RPK,lmg_rpk,,t7_icon_weapon_lmg_rpk,WEAPON_LMG_RPK_DESC,reflex acog dualoptic holo ir reddot quickdraw grip stalker steadyaim fastreload rf gmod6 gmod7,6,0,,-1,primary,,,,,10,,, +129,,weapon_assault,WEAPON_AR_M14,ar_m14,,t7_icon_weapon_ar_m14,WEAPON_AR_M14_DESC,reflex acog dualoptic holo ir reddot quickdraw grip damage stalker steadyaim fastreload extbarrel rf gmod6 gmod7,16,0,,-1,primary,,,,,11,,, +130,,weapon_lmg,WEAPON_LMG_CQB,lmg_cqb_upgraded,,t7_icon_weapon_lmg_cqb,WEAPON_LMG_CQB_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload fmj,130,100,,-1,primary,100,,,,,,, +131,,weapon_lmg,WEAPON_LMG_HEAVY,lmg_heavy_upgraded,,t7_icon_weapon_lmg_heavy,WEAPON_LMG_HEAVY_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload fmj,131,100,,-1,primary,100,,,,,,, +132,,weapon_lmg,WEAPON_LMG_LIGHT,lmg_light_upgraded,,t7_icon_weapon_lmg_light,WEAPON_LMG_LIGHT_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload fmj,132,100,,-1,primary,100,,,,,,, +133,,weapon_lmg,WEAPON_LMG_SLOWFIRE,lmg_slowfire_upgraded,,t7_icon_weapon_lmg_slowfire,WEAPON_LMG_SLOWFIRE_DESC,reflex ir dualoptic reddot holo acog quickdraw stalker steadyaim rf grip fastreload fmj,133,100,,-1,primary,100,,,,,,, +140,,weapon_sniper,WEAPON_SNIPER_FASTBOLT,sniper_fastbolt_upgraded,,t7_icon_weapon_sniper_fastbolt,WEAPON_SNIPER_FASTBOLT_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload fmj,140,100,,-1,primary,100,,,,,,, +141,,weapon_sniper,WEAPON_SNIPER_FASTSEMI,sniper_fastsemi_upgraded,,t7_icon_weapon_sniper_fastsemi,WEAPON_SNIPER_FASTSEMI_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload fmj,141,100,,-1,primary,100,,,,,,, +142,,weapon_sniper,WEAPON_SNIPER_POWERBOLT,sniper_powerbolt_upgraded,,t7_icon_weapon_sniper_fastbolt,WEAPON_SNIPER_POWERBOLT_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload fmj,142,100,,-1,primary,100,,,,,,, +143,,weapon_sniper,WEAPON_SNIPER_CHARGESHOT,sniper_chargeshot_upgraded,,t7_icon_weapon_sniper_chargeshot,WEAPON_SNIPER_CHARGESHOT_DESC,reddot ir dualoptic acog swayreduc stalker rf fastreload fmj,143,100,,-1,primary,100,,,,,,, +148,,weapon_pistol,WEAPON_PISTOL_M1911,pistol_m1911_upgraded,,t7_icon_weapon_pistol_m1911,WEAPON_PISTOL_M1911_DESC,reflex reddot quickdraw steadyaim damage fastreload extbarrel dw gmod6 gmod7,6,0,,-1,primary,,,,,9,,, +150,,weapon_cqb,WEAPON_SHOTGUN_FULLAUTO,shotgun_fullauto_upgraded,,t7_icon_weapon_shotgun_fullauto,WEAPON_SHOTGUN_FULLAUTO_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload extclip,150,100,,-1,primary,100,,,,,,, +151,,weapon_cqb,WEAPON_SHOTGUN_PRECISION,shotgun_precision_upgraded,,t7_icon_weapon_shotgun_precision,WEAPON_SHOTGUN_PRECISION_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload extclip,151,100,,-1,primary,100,,,,,,, +152,,weapon_cqb,WEAPON_SHOTGUN_PUMP,shotgun_pump_upgraded,,t7_icon_weapon_shotgun_pump,WEAPON_SHOTGUN_PUMP_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload extclip,152,100,,-1,primary,100,,,,,,, +153,,weapon_cqb,WEAPON_SHOTGUN_SEMIAUTO,shotgun_semiauto_upgraded,,t7_icon_weapon_shotgun_semiauto,WEAPON_SHOTGUN_SEMIAUTO_DESC,reflex reddot holo quickdraw stalker steadyaim rf extbarrel fastreload extclip,153,100,,-1,primary,100,,,,,,, +158,,weapon_launcher,WEAPON_LAUNCHER_STANDARD,launcher_standard_upgraded,1,t7_icon_weapon_launcher_standard,WEAPON_LAUNCHER_STANDARD_DESC,,158,100,,-1,secondary,100,,,,,,, +159,,weapon_launcher,WEAPON_LAUNCHER_LOCKONLY,launcher_lockonly_upgraded,1,t7_icon_weapon_launcher_standard,WEAPON_LAUNCHER_STANDARD_DESC,,159,100,,-1,secondary,100,,,,,,, +170,,weapon_pistol,WEAPON_PISTOL_REVOLVER38,pistol_revolver38_upgraded,1,t7_icon_weapon_pistol_revolver38,WEAPON_PISTOL_REVOLVER38_DESC,,170,100,,-1,secondary,100,,,,,,, +171,,weapon_smg,WEAPON_SMG_STEN,smg_sten_upgraded,1,t7_icon_weapon_smg_sten,WEAPON_SMG_STEN_DESC,,171,100,,-1,primary,100,,,,,,, +172,,weapon_smg,WEAPON_SMG_PPSH,smg_ppsh_upgraded,,t7_icon_weapon_smg_ppsh,WEAPON_SMG_PPSH,reflex acog dualoptic holo reddot quickdraw grip stalker steadyaim fastreload extbarrel rf gmod6 gmod7,172,100,,-1,primary,100,,,,4,,, +173,,weapon_special,WEAPON_SKULL_GUN,skull_gun_upgraded,,menu_mp_weapons_dg2,WEAPON_SKULL_GUN,,173,100,,-1,primary,100,,,,4,,, +178,,weapon_lmg,WEAPON_LMG_RPK,lmg_rpk_upgraded,,t7_icon_weapon_lmg_rpk,WEAPON_LMG_RPK_DESC,reflex acog dualoptic holo ir reddot quickdraw grip stalker steadyaim fastreload rf gmod6 gmod7,6,0,,-1,primary,,,,,10,,, +179,,weapon_assault,WEAPON_AR_M14,ar_m14_upgraded,,t7_icon_weapon_ar_m14,WEAPON_AR_M14_DESC,acog damage dualoptic_upgraded extbarrel_ar_power_upgraded fastreload_dualmag grip holo ir quickdraw reflex reddot rf_upgraded stalker steadyaim suppressed_ar,16,0,,-1,primary,,,,,11,,, +190,,bubblegum,zmui_bgb_tone_death,zm_bgb_tone_death,60,t7_hud_zm_bgb_tone_death,zmui_bgb_tone_death_desc,,19,,,1,equippedbubblegumpack,,dlc5,0,1,8,,event, +191,,bubblegum,zmui_bgb_soda_fountain,zm_bgb_soda_fountain,59,t7_hud_zm_bgb_soda_fountain,zmui_bgb_soda_fountain_desc,,107,,,1,equippedbubblegumpack,,,0,1,8,,event, +192,,bubblegum,zmui_bgb_reign_drops,zm_bgb_reign_drops,58,t7_hud_zm_bgb_reign_drops,zmui_bgb_reign_drops_desc,,206,,,1,equippedbubblegumpack,,,0,1,8,,activated, +193,,bubblegum,zmui_bgb_power_vacuum,zm_bgb_power_vacuum,57,t7_hud_zm_bgb_power_vacuum,zmui_bgb_power_vacuum_desc,,204,,,1,equippedbubblegumpack,,,0,1,8,,round, +194,,bubblegum,zmui_bgb_idle_eyes,zm_bgb_idle_eyes,56,t7_hud_zm_bgb_idle_eyes,zmui_bgb_idle_eyes_desc,,10,,,1,equippedbubblegumpack,,,0,1,8,,activated, +195,,bubblegum,zmui_bgb_flavor_hexed,zm_bgb_flavor_hexed,55,t7_hud_zm_bgb_flavor_hexed,zmui_bgb_flavor_hexed_desc,,9,,,1,equippedbubblegumpack,,,0,1,8,,event, +196,,bubblegum,zmui_bgb_eye_candy,zm_bgb_eye_candy,54,t7_hud_zm_bgb_eye_candy,zmui_bgb_eye_candy_desc,,16,,,1,equippedbubblegumpack,,dlc5,0,1,8,,activated, +197,,bubblegum,zmui_bgb_extra_credit,zm_bgb_extra_credit,53,t7_hud_zm_bgb_extra_credit,zmui_bgb_extra_credit_desc,,103,,,1,equippedbubblegumpack,,,0,1,8,,activated, +198,,weapon_special,WEAPON_TESLA_GUN,tesla_gun_upgraded,,menu_mp_weapons_dg2,WEAPON_TESLA_GUN,,,,,-1,primary,,,,,,,, +200,,weapon_knife,WEAPON_BOWIE,bowie_flourish,,t7_icon_weapon_special_bowie,WEAPON_BOWIE_DESC,,200,0,,-1,secondary,,,,1,,,, +a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14,p15,q16,r17,s18,t19,u20, +201,,bubblegum,zmui_bgb_alchemical_antithesis,zm_bgb_alchemical_antithesis,10,t7_hud_zm_bgb_alchemical_antithesis,zmui_bgb_alchemical_antithesis_desc,,15,34,,1,equippedbubblegumpack,,,0,1,,,activated, +202,,bubblegum,zmui_bgb_always_done_swiftly,zm_bgb_always_done_swiftly,16,t7_hud_zm_bgb_always_done_swiftly,zmui_bgb_always_done_swiftly_desc,,1,,,1,equippedbubblegumpack,,,0,0,,,round, +203,,bubblegum,zmui_bgb_anywhere_but_here,zm_bgb_anywhere_but_here,18,t7_hud_zm_bgb_anywhere_but_here,zmui_bgb_anywhere_but_here_desc,,8,9,,1,equippedbubblegumpack,,,0,1,,,activated, +204,,bubblegum,zmui_bgb_armamental_accomplishment,zm_bgb_armamental_accomplishment,19,t7_hud_zm_bgb_armamental_accomplishment,zmui_bgb_armamental_accomplishment_desc,,10,20,,1,equippedbubblegumpack,,,0,1,,,round, +205,,bubblegum,zmui_bgb_arms_grace,zm_bgb_arms_grace,34,t7_hud_zm_bgb_arms_grace,zmui_bgb_arms_grace_desc,,2,,,1,equippedbubblegumpack,,,0,0,,,event, +206,,bubblegum,zmui_bgb_arsenal_accelerator,zm_bgb_arsenal_accelerator,21,t7_hud_zm_bgb_arsenal_accelerator,zmui_bgb_arsenal_accelerator_desc,,12,29,,1,equippedbubblegumpack,,,0,1,,,time, +207,,bubblegum,zmui_bgb_coagulant,zm_bgb_coagulant,26,t7_hud_zm_bgb_coagulant,zmui_bgb_coagulant_desc,,3,,,1,equippedbubblegumpack,,,0,0,,,time, +208,,bubblegum,zmui_bgb_danger_closest,zm_bgb_danger_closest,17,t7_hud_zm_bgb_danger_closest,zmui_bgb_danger_closest_desc,,9,14,,1,equippedbubblegumpack,,,0,1,,,round, +209,,bubblegum,zmui_bgb_firing_on_all_cylinders,zm_bgb_firing_on_all_cylinders,9,t7_hud_zm_bgb_firing_on_all_cylinders,zmui_bgb_firing_on_all_cylinders_desc,,11,25,,1,equippedbubblegumpack,,,0,1,,,round, +210,,bubblegum,zmui_bgb_impatient,zm_bgb_impatient,35,t7_hud_zm_bgb_impatient,zmui_bgb_impatient_desc,,6,2,,1,equippedbubblegumpack,,,0,1,,,event, +211,,bubblegum,zmui_bgb_in_plain_sight,zm_bgb_in_plain_sight,2,t7_hud_zm_bgb_in_plain_sight,zmui_bgb_in_plain_sight_desc,,4,,,1,equippedbubblegumpack,,,0,0,,,activated, +212,,bubblegum,zmui_bgb_lucky_crit,zm_bgb_lucky_crit,36,t7_hud_zm_bgb_lucky_crit,zmui_bgb_lucky_crit_desc,,13,31,,1,equippedbubblegumpack,,,0,1,,,round, +213,,bubblegum,zmui_bgb_now_you_see_me,zm_bgb_now_you_see_me,37,t7_hud_zm_bgb_now_you_see_me,zmui_bgb_now_you_see_me_desc,,14,33,,1,equippedbubblegumpack,,,0,1,,,activated, +214,,bubblegum,zmui_bgb_stock_option,zm_bgb_stock_option,22,t7_hud_zm_bgb_stock_option,zmui_bgb_stock_option_desc,,5,,,1,equippedbubblegumpack,,,0,0,,,time, +215,,bubblegum,zmui_bgb_sword_flay,zm_bgb_sword_flay,6,t7_hud_zm_bgb_sword_flay,zmui_bgb_sword_flay_desc,,7,5,,1,equippedbubblegumpack,,,0,1,,,time, +216,,bubblegum,zmui_bgb_aftertaste,zm_bgb_aftertaste,23,t7_hud_zm_bgb_aftertaste,zmui_bgb_aftertaste_desc,,0,,,1,equippedbubblegumpack,,,0,1,,,round, +217,,bubblegum,zmui_bgb_burned_out,zm_bgb_burned_out,3,t7_hud_zm_bgb_burned_out,zmui_bgb_burned_out_desc,,3,,,1,equippedbubblegumpack,,,0,1,,,event, +218,,bubblegum,zmui_bgb_cache_back,zm_bgb_cache_back,38,t7_hud_zm_bgb_cache_back,zmui_bgb_cache_back_desc,,101,,,1,equippedbubblegumpack,,,0,1,,,activated, +219,,bubblegum,zmui_bgb_dead_of_nuclear_winter,zm_bgb_dead_of_nuclear_winter,4,t7_hud_zm_bgb_dead_of_nuclear_winter,zmui_bgb_dead_of_nuclear_winter_desc,,5,,,1,equippedbubblegumpack,,,0,1,,,activated, +220,,bubblegum,zmui_bgb_ephemeral_enhancement,zm_bgb_ephemeral_enhancement,20,t7_hud_zm_bgb_ephemeral_enhancement,zmui_bgb_ephemeral_enhancement_desc,,7,,,1,equippedbubblegumpack,,,0,1,,,activated, +221,,bubblegum,zmui_bgb_im_feelin_lucky,zm_bgb_im_feelin_lucky,7,t7_hud_zm_bgb_im_feelin_lucky,zmui_bgb_im_feelin_lucky_desc,,11,,,1,equippedbubblegumpack,,,0,1,,,activated, +222,,bubblegum,zmui_bgb_immolation_liquidation,zm_bgb_immolation_liquidation,15,t7_hud_zm_bgb_immolation_liquidation,zmui_bgb_immolation_liquidation_desc,,12,,,1,equippedbubblegumpack,,,0,1,,,activated, +223,,bubblegum,zmui_bgb_kill_joy,zm_bgb_kill_joy,1,t7_hud_zm_bgb_kill_joy,zmui_bgb_kill_joy_desc,,105,,,1,equippedbubblegumpack,,,0,1,,,activated, +224,,bubblegum,zmui_bgb_killing_time,zm_bgb_killing_time,39,t7_hud_zm_bgb_killing_time,zmui_bgb_killing_time_desc,,201,,,1,equippedbubblegumpack,,,0,1,,,activated, +225,,bubblegum,zmui_bgb_licensed_contractor,zm_bgb_licensed_contractor,40,t7_hud_zm_bgb_licensed_contractor,zmui_bgb_licensed_contractor_desc,,13,,,1,equippedbubblegumpack,,,0,1,,,activated, +226,,bubblegum,zmui_bgb_on_the_house,zm_bgb_on_the_house,41,t7_hud_zm_bgb_on_the_house,zmui_bgb_on_the_house_desc,,106,,,1,equippedbubblegumpack,,,0,1,,,activated, +227,,bubblegum,zmui_bgb_perkaholic,zm_bgb_perkaholic,27,t7_hud_zm_bgb_perkaholic,zmui_bgb_perkaholic_desc,,203,,,1,equippedbubblegumpack,,,0,1,,,event, +228,,bubblegum,zmui_bgb_phoenix_up,zm_bgb_phoenix_up,28,t7_hud_zm_bgb_phoenix_up,zmui_bgb_phoenix_up_desc,,15,,,1,equippedbubblegumpack,,,0,1,,,activated, +229,,bubblegum,zmui_bgb_pop_shocks,zm_bgb_pop_shocks,29,t7_hud_zm_bgb_pop_shocks,zmui_bgb_pop_shocks_desc,,16,,,1,equippedbubblegumpack,,,0,1,,,event, +230,,bubblegum,zmui_bgb_respin_cycle,zm_bgb_respin_cycle,30,t7_hud_zm_bgb_respin_cycle,zmui_bgb_respin_cycle_desc,,17,,,1,equippedbubblegumpack,,,0,1,,,activated, +231,,bubblegum,zmui_bgb_unquenchable,zm_bgb_unquenchable,31,t7_hud_zm_bgb_unquenchable,zmui_bgb_unquenchable_desc,,20,,,1,equippedbubblegumpack,,,0,1,,,event, +232,,bubblegum,zmui_bgb_wall_power,zm_bgb_wall_power,32,t7_hud_zm_bgb_wall_power,zmui_bgb_wall_power_desc,,110,,,1,equippedbubblegumpack,,,0,1,,,event, +233,,bubblegum,zmui_bgb_whos_keeping_score,zm_bgb_whos_keeping_score,33,t7_hud_zm_bgb_whos_keeping_score,zmui_bgb_whos_keeping_score_desc,,21,,,1,equippedbubblegumpack,,,0,1,,,activated, +234,,bubblegum,zmui_bgb_crawl_space,zm_bgb_crawl_space,43,t7_hud_zm_bgb_crawl_space,zmui_bgb_crawl_space_desc,,4,,,1,equippedbubblegumpack,,,0,1,2,,activated, +235,,bubblegum,zmui_bgb_fatal_contraption,zm_bgb_fatal_contraption,69,t7_hud_zm_bgb_fatal_contraption,zmui_bgb_fatal_contraption_desc,,8,,,1,equippedbubblegumpack,,,0,1,2,,activated, +236,,bubblegum,zmui_bgb_head_drama,zm_bgb_head_drama,70,t7_hud_zm_bgb_head_drama,zmui_bgb_head_drama_desc,,200,,,1,equippedbubblegumpack,,,0,1,2,,round, +237,,bubblegum,zmui_bgb_undead_man_walking,zm_bgb_undead_man_walking,71,t7_hud_zm_bgb_undead_man_walking,zmui_bgb_undead_man_walking_desc,,109,,,1,equippedbubblegumpack,,,0,1,2,,time, +238,,bubblegum,zmui_bgb_fear_in_headlights,zm_bgb_fear_in_headlights,72,t7_hud_zm_bgb_fear_in_headlights,zmui_bgb_fear_in_headlights_desc,,104,,,1,equippedbubblegumpack,,,0,1,5,,activated, +239,,bubblegum,zmui_bgb_secret_shopper,zm_bgb_secret_shopper,24,t7_hud_zm_bgb_secret_shopper,zmui_bgb_secret_shopper_desc,,208,,,1,equippedbubblegumpack,,,0,1,5,,time, +240,,bubblegum,zmui_bgb_temporal_gift,zm_bgb_temporal_gift,25,t7_hud_zm_bgb_temporal_gift,zmui_bgb_temporal_gift_desc,,108,,,1,equippedbubblegumpack,,,0,1,5,,round, +241,,bubblegum,zmui_bgb_unbearable,zm_bgb_unbearable,73,t7_hud_zm_bgb_unbearable,zmui_bgb_unbearable_desc,,19,,,1,equippedbubblegumpack,,,0,1,5,,event, +242,,bubblegum,zmui_bgb_crate_power,zm_bgb_crate_power,42,t7_hud_zm_bgb_crate_power,zmui_bgb_crate_power_desc,,102,,,1,equippedbubblegumpack,,,0,1,6,,event, +243,,bubblegum,zmui_bgb_disorderly_combat,zm_bgb_disorderly_combat,74,t7_hud_zm_bgb_disorderly_combat,zmui_bgb_disorderly_combat_desc,,6,,,1,equippedbubblegumpack,,,0,1,6,,time, +244,,bubblegum,zmui_bgb_projectile_vomiting,zm_bgb_projectile_vomiting,14,t7_hud_zm_bgb_projectile_vomiting,zmui_bgb_projectile_vomiting_desc,,18,,,1,equippedbubblegumpack,,dlc3,0,1,6,,round, +245,,bubblegum,zmui_bgb_shopping_free,zm_bgb_shopping_free,12,t7_hud_zm_bgb_shopping_free,zmui_bgb_shopping_free_desc,,210,,,1,equippedbubblegumpack,,,0,1,6,,time, +246,,bubblegum,zmui_bgb_slaughter_slide,zm_bgb_slaughter_slide,13,t7_hud_zm_bgb_slaughter_slide,zmui_bgb_slaughter_slide_desc,,18,,,1,equippedbubblegumpack,,,0,1,6,,event, +247,,bubblegum,zmui_bgb_bullet_boost,zm_bgb_bullet_boost,44,t7_hud_zm_bgb_bullet_boost,zmui_bgb_bullet_boost_desc,,100,,,1,equippedbubblegumpack,,,0,1,7,,activated, +248,,bubblegum,zmui_bgb_mind_blown,zm_bgb_mind_blown,45,t7_hud_zm_bgb_mind_blown,zmui_bgb_mind_blown_desc,,14,,,1,equippedbubblegumpack,,,0,1,7,,activated, +249,,bubblegum,zmui_bgb_near_death_experience,zm_bgb_near_death_experience,46,t7_hud_zm_bgb_near_death_experience,zmui_bgb_near_death_experience_desc,,202,,,1,equippedbubblegumpack,,,0,1,7,,round, +250,,bubblegum,zmui_bgb_newtonian_negation,zm_bgb_newtonian_negation,47,t7_hud_zm_bgb_newtonian_negation,zmui_bgb_newtonian_negation_desc,,17,,,1,equippedbubblegumpack,,dlc4,0,1,7,,time, +251,,bubblegum,zmui_bgb_profit_sharing,zm_bgb_profit_sharing,48,t7_hud_zm_bgb_profit_sharing,zmui_bgb_profit_sharing_desc,,205,,,1,equippedbubblegumpack,,,0,1,7,,time, +252,,bubblegum,zmui_bgb_round_robbin,zm_bgb_round_robbin,49,t7_hud_zm_bgb_round_robbin,zmui_bgb_round_robbin_desc,,207,,,1,equippedbubblegumpack,,,0,1,7,,activated, +253,,bubblegum,zmui_bgb_self_medication,zm_bgb_self_medication,50,t7_hud_zm_bgb_self_medication,zmui_bgb_self_medication_desc,,209,,,1,equippedbubblegumpack,,,0,1,7,,event, +254,,bubblegum,zmui_bgb_board_games,zm_bgb_board_games,51,t7_hud_zm_bgb_board_games,zmui_bgb_board_games_desc,,1,,,1,equippedbubblegumpack,,,0,1,8,,round, +255,,bubblegum,zmui_bgb_board_to_death,zm_bgb_board_to_death,52,t7_hud_zm_bgb_board_to_death,zmui_bgb_board_to_death_desc,,2,,,1,equippedbubblegumpack,,,0,1,8,,time, diff --git a/scripts/zm/_load.gsc b/scripts/zm/_load.gsc new file mode 100644 index 0000000..73ebd8c --- /dev/null +++ b/scripts/zm/_load.gsc @@ -0,0 +1,241 @@ +#using scripts\codescripts\struct; + +#using scripts\shared\audio_shared; +#using scripts\shared\clientfield_shared; +#using scripts\shared\exploder_shared;//DO NOT REMOVE - needed for system registration +#using scripts\shared\flag_shared; +#using scripts\shared\flagsys_shared; +#using scripts\shared\fx_shared; +#using scripts\shared\demo_shared; +#using scripts\shared\hud_message_shared; +#using scripts\shared\load_shared; +#using scripts\shared\lui_shared; +#using scripts\shared\music_shared; +#using scripts\shared\_oob; +#using scripts\shared\scene_shared; +#using scripts\shared\serverfaceanim_shared; +#using scripts\shared\system_shared; +#using scripts\shared\turret_shared; +#using scripts\shared\util_shared; +#using scripts\shared\vehicle_shared; +#using scripts\shared\archetype_shared\archetype_shared; +#using scripts\shared\callbacks_shared; +//#using scripts\zm\_zm_bgb; + +//Abilities +#using scripts\shared\abilities\_ability_player; //DO NOT REMOVE - needed for system registration + +#insert scripts\shared\shared.gsh; +#insert scripts\shared\version.gsh; + +#using scripts\shared\ai\zombie_utility; + +#using scripts\zm\_zm; +#using scripts\zm\gametypes\_spawnlogic; + +#using scripts\zm\_destructible; +#using scripts\zm\_util; + +//REGISTRATION - These scripts are initialized here +//Do not remove unless you are removing the script from the game + +//Gametypes Registration +#using scripts\zm\gametypes\_clientids; +#using scripts\zm\gametypes\_scoreboard; +#using scripts\zm\gametypes\_serversettings; +#using scripts\zm\gametypes\_shellshock; +#using scripts\zm\gametypes\_spawnlogic; +#using scripts\zm\gametypes\_spectating; +#using scripts\zm\gametypes\_weaponobjects; + +//Systems registration +#using scripts\zm\_art; +#using scripts\zm\_callbacks; +#using scripts\zm\_zm_audio; +#using scripts\zm\_zm_behavior; +#using scripts\zm\_zm_blockers; +#using scripts\zm\_zm_bot; +#using scripts\zm\_zm_clone; +#using scripts\zm\_zm_devgui; +#using scripts\zm\_zm_magicbox; +#using scripts\zm\_zm_playerhealth; +#using scripts\zm\_zm_power; +#using scripts\zm\_zm_powerups; +#using scripts\zm\_zm_score; +#using scripts\zm\_zm_stats; +#using scripts\zm\_zm_traps; +#using scripts\zm\_zm_unitrigger; +#using scripts\zm\_zm_zonemgr; + + +//Weapon registration +#using scripts\zm\gametypes\_weaponobjects; + +#precache( "fx", "_t6/bio/player/fx_footstep_dust" ); +#precache( "fx", "_t6/bio/player/fx_footstep_sand" ); +#precache( "fx", "_t6/bio/player/fx_footstep_mud" ); +#precache( "fx", "_t6/bio/player/fx_footstep_water" ); + +#namespace load; + +function main() +{ +// bgb = self.bgb; +// self.var_e610f362[bgb].var_e0b06b47 = 999; +// level.pack_a_punch_camo_index = 17; + //level.pack_a_punch_camo_index_number_variants = 1; + //thread new_pack_a_punch_camo(); + //level thread OnPlayerConnect(); + + + zm::init(); + + level._loadStarted = true; + + register_clientfields(); + + level.aiTriggerSpawnFlags = getaitriggerflags(); + level.vehicleTriggerSpawnFlags = getvehicletriggerflags(); + + level thread start_intro_screen_zm(); + + + + //thread _spawning::init(); + //thread _deployable_weapons::init(); + //thread _minefields::init(); + //thread _rotating_object::init(); + //thread _shutter::main(); + //thread _flare::init(); + //thread _pipes::main(); + //thread _vehicles::init(); + //thread _dogs::init(); + //thread _tutorial::init(); + + setup_traversals(); + + footsteps(); + + system::wait_till( "all" ); + + level thread load::art_review(); + SetDvar("scr_firstGumFree",1); + SetDvar("zm_private_rankedmatch",1); + + level flagsys::set( "load_main_complete" ); +} + + + +function footsteps() +{ + if ( IS_TRUE( level.FX_exclude_footsteps ) ) + { + return; + } + + zombie_utility::setFootstepEffect( "asphalt", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "brick", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "carpet", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "cloth", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "concrete", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "dirt", "_t6/bio/player/fx_footstep_sand" ); + zombie_utility::setFootstepEffect( "foliage", "_t6/bio/player/fx_footstep_sand" ); + zombie_utility::setFootstepEffect( "gravel", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "grass", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "metal", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "mud", "_t6/bio/player/fx_footstep_mud" ); + zombie_utility::setFootstepEffect( "paper", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "plaster", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "rock", "_t6/bio/player/fx_footstep_dust" ); + zombie_utility::setFootstepEffect( "sand", "_t6/bio/player/fx_footstep_sand" ); + zombie_utility::setFootstepEffect( "water", "_t6/bio/player/fx_footstep_water" ); + zombie_utility::setFootstepEffect( "wood", "_t6/bio/player/fx_footstep_dust" ); +} + +function setup_traversals() +{ + /* + potential_traverse_nodes = GetAllNodes(); + for (i = 0; i < potential_traverse_nodes.size; i++) + { + node = potential_traverse_nodes[i]; + if (node.type == "Begin") + { + node zombie_shared::init_traverse(); + } + } + */ +} + +function start_intro_screen_zm( ) +{ + players = GetPlayers(); + for(i = 0; i < players.size; i++) + { + players[i] lui::screen_fade_out( 0, undefined ); + players[i] freezecontrols(true); + } + wait 1; +} + +function register_clientfields() +{ + //clientfield::register( "missile", "cf_m_proximity", VERSION_SHIP, 1, "int" ); + //clientfield::register( "missile", "cf_m_emp", VERSION_SHIP, 1, "int" ); + //clientfield::register( "missile", "cf_m_stun", VERSION_SHIP, 1, "int" ); + + //clientfield::register( "scriptmover", "cf_s_emp", VERSION_SHIP, 1, "int" ); + //clientfield::register( "scriptmover", "cf_s_stun", VERSION_SHIP, 1, "int" ); + + //clientfield::register( "world", "sndPrematch", VERSION_SHIP, 1, "int" ); + //clientfield::register( "toplayer", "sndMelee", VERSION_SHIP, 1, "int" ); + //clientfield::register( "toplayer", "sndEMP", VERSION_SHIP, 1, "int" ); + + clientfield::register( "allplayers", "zmbLastStand", VERSION_SHIP, 1, "int" ); + //clientfield::register( "toplayer", "zmbLastStand", VERSION_SHIP, 1, "int" ); + + clientfield::register( "clientuimodel", "zmhud.swordEnergy", VERSION_SHIP, 7, "float" ); // energy: 0 to 1 + clientfield::register( "clientuimodel", "zmhud.swordState", VERSION_SHIP, 4, "int" ); // state: 0 = hidden, 1 = charging, 2 = ready, 3 = inuse, 4 = unavailable (grey), 5 = ele-charging, 6 = ele-ready, 7 = ele-inuse, + clientfield::register( "clientuimodel", "zmhud.swordChargeUpdate", VERSION_SHIP, 1, "counter" ); +} + +/* +//Add Pack-a-Punch Camo for All Client's (Advanced Users Only) +function new_pack_a_punch_camo() +{ + activated = ""; + while(1) + { + + + + if(GetDvarString("pack_a_punch_camo") != "") + { + + string = GetDvarString("pack_a_punch_camo"); + tokenized = StrTok(string, " "); + index = Int(tokenized[1]); + playername = ToLower(tokenized[0]); + + players = GetPlayers(); + foreach(player in players) + { + if (ToLower(player.name) == playername){ + level.pack_a_punch_camo_index = index; + IPrintLnBold("Added new pack_a_punch_camo " + index + " to player: " + playername); + } + } + if (ToLower(playername) == "all"){ + foreach(player in players){ + level.pack_a_punch_camo_index = index; + IPrintLnBold("Added new pack_a_punch_camo " + index + " to all players"); + } + } + + SetDvar("pack_a_punch_camo", ""); + } + WAIT_SERVER_FRAME; + } +} +*/ \ No newline at end of file diff --git a/scripts/zm/_zm_utility.gsc b/scripts/zm/_zm_utility.gsc new file mode 100644 index 0000000..c47955a --- /dev/null +++ b/scripts/zm/_zm_utility.gsc @@ -0,0 +1,6260 @@ +#using scripts\codescripts\struct; + +#using scripts\shared\array_shared; +#using scripts\shared\clientfield_shared; +#using scripts\shared\flag_shared; +#using scripts\shared\hud_message_shared; +#using scripts\shared\laststand_shared; +#using scripts\shared\util_shared; + +#insert scripts\shared\shared.gsh; +#insert scripts\shared\statstable_shared.gsh; + +#using scripts\shared\ai\zombie_utility; + +#using scripts\zm\_util; +#using scripts\zm\_zm; +#using scripts\zm\_zm_ai_faller; +#using scripts\zm\_zm_audio; +#using scripts\zm\_zm_bgb; +#using scripts\zm\_zm_equipment; +#using scripts\zm\_zm_laststand; +#using scripts\zm\_zm_perks; +#using scripts\zm\_zm_power; +#using scripts\zm\_zm_powerups; +#using scripts\zm\_zm_server_throttle; +#using scripts\zm\_zm_stats; +#using scripts\zm\_zm_spawner; +#using scripts\zm\_zm_weapons; + +#insert scripts\zm\_zm_perks.gsh; +#insert scripts\zm\_zm_utility.gsh; + +#namespace zm_utility; + +function init_utility() +{ +// level thread edge_fog_start(); + +// level thread hudelem_count(); +} + +function is_Classic() +{ + return true; +} + +function is_Standard() +{ + dvar = GetDvarString( "ui_gametype" ); + + if ( dvar == "zstandard" ) + { + return true; + } + + return false; +} + + +function ConvertSecondsToMilliseconds( seconds ) +{ + return ( seconds * 1000 ); +} + +function is_player() +{ + return ( IsPlayer( self ) || ( IsDefined( self.pers ) && IS_TRUE( self.pers[ "isBot" ] ) ) ); +} + +// self is Ai and chunk is selected piece +function lerp( chunk ) +{ + // anim_reach_aligned + link = Spawn( "script_origin", self GetOrigin() ); // link is a new origin of the ai + link.angles = self.first_node.angles ; // link now has the angles of itself, perhaps these angles aren't coming over.. + self LinkTo(link); // link ai + origin to chunk + origin + + // link RotateTo(chunk.origin GetTagAngles("Tag_bottom"), level._CONTEXTUAL_GRAB_LERP_TIME); // this should angle him to spot + // link MoveTo(chunk.origin GetTagOrigin("Tag_bottom"), level._CONTEXTUAL_GRAB_LERP_TIME); // this should move him over to spot + + // I need to have the offest for the bar + link RotateTo(self.first_node.angles , level._CONTEXTUAL_GRAB_LERP_TIME); // this should angle him to spot + + link MoveTo(self.attacking_spot , level._CONTEXTUAL_GRAB_LERP_TIME); // this should move him over to spot + //link RotateTo(self GetTagAngles ("Tag_player"), level._CONTEXTUAL_GRAB_LERP_TIME); // this should angle him to spot + //link MoveTo(self GetTagOrigin ("Tag_player"), level._CONTEXTUAL_GRAB_LERP_TIME); // this should move him over to spot + + link util::waittill_multiple("rotatedone", "movedone"); + + self Unlink(); + link Delete(); + + return; +} + +function recalc_zombie_array() +{ +/* + enemies = []; + level.current_zombie_array = []; + enemies = GetAiSpeciesArray( level.zombie_team, "all" ); + + for( i = 0; i < enemies.size; i++ ) + { + if ( IS_TRUE( enemies[i].ignore_enemy_count ) ) + { + continue; + } + ARRAY_ADD( level.current_zombie_array, enemies[i] ); + } + + level.current_zombie_count = level.current_zombie_array.size; +*/ +} + +function init_zombie_run_cycle() +{ + if ( isdefined( level.speed_change_round ) ) + { + if ( level.round_number >= level.speed_change_round ) + { + speed_percent = 0.2 + ( ( level.round_number - level.speed_change_round ) * 0.2 ); + speed_percent = min( speed_percent, 1 ); + + change_round_max = Int( level.speed_change_max * speed_percent ); + change_left = change_round_max - level.speed_change_num; + + if ( change_left == 0 ) + { + self zombie_utility::set_zombie_run_cycle(); + return; + } + + change_speed = RandomInt( 100 ); + if ( change_speed > 80 ) + { + self change_zombie_run_cycle(); + return; + } + + zombie_count = zombie_utility::get_current_zombie_count(); + zombie_left = level.zombie_ai_limit - zombie_count; + + if ( zombie_left == change_left ) // need to force the speed change at this point + { + self change_zombie_run_cycle(); + return; + } + } + } + + self zombie_utility::set_zombie_run_cycle(); +} + +function change_zombie_run_cycle() +{ + level.speed_change_num++; + if ( level.gamedifficulty == 0 ) + { + self zombie_utility::set_zombie_run_cycle( "sprint" ); + } + else + { + /* + iprintln( "walker round " + level.round_number + " change " + level.speed_change_num ); + */ + self zombie_utility::set_zombie_run_cycle( "walk" ); + } + + self thread speed_change_watcher(); +} + +function make_supersprinter() +{ + self zombie_utility::set_zombie_run_cycle( "super_sprint" ); +} + +function speed_change_watcher() +{ + self waittill( "death" ); + + if ( level.speed_change_num > 0 ) + { + level.speed_change_num--; + } +} + +function move_zombie_spawn_location(spot) +{ + self endon( "death" ); + + if(IsDefined(self.spawn_pos)) + { + self notify("risen", self.spawn_pos.script_string ); + return; + } + self.spawn_pos = spot; + + // give target from spawn location to spawner to path + if(IsDefined(spot.target)) + { + self.target = spot.target; + } + + if(IsDefined(spot.zone_name)) + { + self.zone_name = spot.zone_name; + self.previous_zone_name = spot.zone_name; + } + + if(IsDefined(spot.script_parameters)) + { + self.script_parameters = spot.script_parameters; + } + + if(!IsDefined(spot.script_noteworthy)) + { + spot.script_noteworthy = "spawn_location"; + } + + tokens = StrTok( spot.script_noteworthy, " " ); + foreach ( index, token in tokens ) + { + // time bomb needs to spawn zombies away from their original spawn point; this should point to a struct + if ( IsDefined( self.spawn_point_override ) ) + { + spot = self.spawn_point_override; + token = spot.script_noteworthy; + } + + if ( token == "custom_spawner_entry" ) + { + next_token = index + 1; + + if ( IsDefined( tokens[ next_token ] ) ) + { + str_spawn_entry = tokens[ next_token ]; + + if ( IsDefined( level.custom_spawner_entry ) && IsDefined( level.custom_spawner_entry[ str_spawn_entry ] ) ) + { + self thread [[ level.custom_spawner_entry[ str_spawn_entry ] ]]( spot ); + continue; + } + } + } + + if(token == "riser_location") + { + self thread zm_spawner::do_zombie_rise(spot); + } + else if (token == "faller_location") + { + self thread zm_ai_faller::do_zombie_fall(spot); + } + else if (token == "spawn_location" ) + { + // anchor defined by some other custom spawner behavior, so bypass standard behavior + if ( IsDefined( self.anchor ) ) + { + return; + } + + self.anchor = spawn("script_origin", self.origin); + self.anchor.angles = self.angles; + self linkto(self.anchor); + self.anchor thread anchor_delete_failsafe( self ); + + if( !isDefined( spot.angles ) ) + { + spot.angles = (0, 0, 0); + } + + self Ghost(); + self.anchor moveto(spot.origin, .05); + self.anchor waittill("movedone"); + + // face goal + target_org = zombie_utility::get_desired_origin(); + if (IsDefined(target_org)) + { + anim_ang = VectorToAngles(target_org - self.origin); + self.anchor RotateTo((0, anim_ang[1], 0), .05); + self.anchor waittill("rotatedone"); + } + if(isDefined(level.zombie_spawn_fx)) + { + playfx(level.zombie_spawn_fx,spot.origin); + } + self unlink(); + + if(isDefined(self.anchor)) + { + self.anchor delete(); + } + if(!IS_TRUE(self.dontShow)) + { + self Show(); + } + self notify("risen", spot.script_string ); + } + } +} + + +// self is an anchor script_origin +// There is a very small window where a zombie could be killed and the anchor would be left hanging around. +function anchor_delete_failsafe( ai_zombie ) +{ + ai_zombie endon( "risen" ); + + ai_zombie waittill( "death" ); + + if( isdefined( self ) ) + { + self Delete(); + } +} + +function run_spawn_functions() +{ + self endon( "death" ); + + waittillframeend; // spawn functions should override default settings, so they need to be last + + for (i = 0; i < level.spawn_funcs[ self.team ].size; i++) + { + func = level.spawn_funcs[ self.team ][ i ]; + util::single_thread(self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ], func[ "param5" ] ); + } + + if ( IsDefined( self.spawn_funcs )) + { + for (i = 0; i < self.spawn_funcs.size; i++) + { + func = self.spawn_funcs[ i ]; + util::single_thread(self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ] ); + } + + /# + self.saved_spawn_functions = self.spawn_funcs; + #/ + + self.spawn_funcs = undefined; + + /# + // keep them around in developer mode, for debugging + self.spawn_funcs = self.saved_spawn_functions; + self.saved_spawn_functions = undefined; + #/ + + self.spawn_funcs = undefined; + } +} + + +function create_simple_hud( client, team ) +{ + if ( IsDefined( team ) ) + { + hud = NewTeamHudElem( team ); + hud.team = team; + } + else + { + if( IsDefined( client ) ) + { + hud = NewClientHudElem( client ); + } + else + { + hud = NewHudElem(); + } + } + + level.hudelem_count++; + + hud.foreground = true; + hud.sort = 1; + hud.hidewheninmenu = false; + + return hud; +} + +function destroy_hud() +{ + level.hudelem_count--; + self Destroy(); +} + + +// self = exterior_goal which is barrier_chunks +function all_chunks_intact( barrier, barrier_chunks ) +{ + if(isdefined(barrier.zbarrier)) + { + pieces = barrier.zbarrier GetZBarrierPieceIndicesInState("closed"); + + if(pieces.size != barrier.zbarrier GetNumZBarrierPieces()) + { + return false; + } + } + else + { + for( i = 0; i < barrier_chunks.size; i++ ) // Count up barrier_chunks total size + { + if( barrier_chunks[i] get_chunk_state() != "repaired" ) // if any piece has the state of not repaired then return false + { + return false; + } + } + } + + return true; // if the board has been repaired then return true +} + + +// self = exterior_goal which is barrier_chunks +function no_valid_repairable_boards( barrier, barrier_chunks ) +{ + + if(isdefined(barrier.zbarrier)) + { + pieces = barrier.zbarrier GetZBarrierPieceIndicesInState("open"); + + if(pieces.size) + { + return false; + } + } + else + { + for( i = 0; i < barrier_chunks.size; i++ ) // Count up barrier_chunks total size + { + if( barrier_chunks[i] get_chunk_state() == "destroyed" ) // if any piece has been destroyed return false + { + return false; + } + } + } + + return true; // if any piece is not destroyed then return true +} + +function is_Survival() +{ + return false; +} + +function is_Encounter() +{ + return false; +} + +function all_chunks_destroyed( barrier, barrier_chunks ) +{ + if(isdefined(barrier.zbarrier)) + { + pieces = ArrayCombine(barrier.zbarrier GetZBarrierPieceIndicesInState("open"), barrier.zbarrier GetZBarrierPieceIndicesInState("opening"), true, false); + + if(pieces.size != barrier.zbarrier GetNumZBarrierPieces()) + { + return false; + } + } + else if( IsDefined( barrier_chunks ) ) + { + ASSERT( IsDefined(barrier_chunks), "zombie_utility::all_chunks_destroyed - Barrier chunks undefined" ); + for( i = 0; i < barrier_chunks.size; i++ ) + { + if( barrier_chunks[i] get_chunk_state() != "destroyed" ) + { + return false; + } + } + } + return true; +} + +function check_point_in_playable_area( origin ) +{ + playable_area = getentarray("player_volume","script_noteworthy"); + + if ( !IsDefined( level.check_model ) ) + { + level.check_model = spawn ("script_model", origin + (0,0,40)); + } + else + { + level.check_model.origin = origin + ( 0, 0, 40 ); + } + + valid_point = false; + for (i = 0; i < playable_area.size; i++) + { + if (level.check_model istouching(playable_area[i])) + { + valid_point = true; + } + } + + return valid_point; +} + +//***************************************************************************** +// origin - +// zone_is_active - (optional) if set the zone must also be active as well +// player_zones - (optional) optimization +//***************************************************************************** + +//aka check_point_in_active_zone( origin ) +function check_point_in_enabled_zone( origin, zone_is_active, player_zones ) +{ + if( !IsDefined(player_zones) ) + { + player_zones = getentarray("player_volume","script_noteworthy"); + } + + if( !isDefined( level.zones ) || !isDefined( player_zones ) ) + { + return true; + } + + if ( !isdefined( level.e_check_point ) ) + { + // Just spawn the checker entity once and move it around as needed instead of creating and deleting all the time + level.e_check_point = spawn( "script_origin", origin+(0, 0, 40) ); + } + else + { + level.e_check_point.origin = origin+(0,0,40); + } + + one_valid_zone = false; + for( i = 0; i < player_zones.size; i++ ) + { + if( level.e_check_point IsTouching( player_zones[i] ) ) + { + zone = level.zones[player_zones[i].targetname]; + + if( IsDefined(zone) && IS_TRUE(zone.is_enabled) ) + { + if( IsDefined(zone_is_active) && (zone_is_active == true) && !IS_TRUE(zone.is_active) ) + { + continue; + } + + one_valid_zone = true; + break; + } + } + } + + return one_valid_zone; +} + +function round_up_to_ten( score ) +{ + new_score = score - score % 10; + if( new_score < score ) + { + new_score += 10; + } + return new_score; +} + +function round_up_score( score, value ) +{ + score = int(score); // Make sure it's an int or modulus will die + + new_score = score - score % value; + if( new_score < score ) + { + new_score += value; + } + return new_score; +} + +function halve_score( n_score ) +{ + n_score = n_score / 2; + n_score = zm_utility::round_up_score( n_score, 10 ); + + return n_score; +} + +function random_tan() +{ + rand = randomint( 100 ); + + if(isDefined(level.char_percent_override) ) + { + percentNotCharred = level.char_percent_override; + } + else + { + percentNotCharred = 65; + } + +// if( rand > percentNotCharred ) +// { +// self StartTanning(); +// } + // PI_CHANGE_END +} + +// Returns the amount of places before the decimal, ie 1000 = 4, 100 = 3... +function places_before_decimal( num ) +{ + abs_num = abs( num ); + count = 0; + while( 1 ) + { + abs_num *= 0.1; // Really doing num / 10 + count += 1; + + if( abs_num < 1 ) + { + return count; + } + } +} + +function create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func,poi_team ) +{ + if( !isDefined( added_poi_value ) ) + { + self.added_poi_value = 0; + } + else + { + self.added_poi_value = added_poi_value; + } + + if( !isDefined( start_turned_on ) ) + { + start_turned_on = true; + } + + if ( !isdefined( attract_dist ) ) + { + attract_dist = 1536; // Covers all available zombies within a given district + } + + self.script_noteworthy = "zombie_poi"; + self.poi_active = start_turned_on; + + if( isDefined( attract_dist ) ) + { + self.max_attractor_dist = attract_dist; + self.poi_radius = attract_dist * attract_dist; + } + else // This poi has no maximum attract distance, it will attract all zombies + { + self.poi_radius = undefined; + } + self.num_poi_attracts = num_attractors; + self.attract_to_origin = true; + self.attractor_array = []; + self.initial_attract_func = undefined; + self.arrival_attract_func = undefined; + if(isDefined(poi_team)) + { + self._team = poi_team; + } + + // any special functions for initial reaction or arrival at the poi are stored here for get_zombie_point_of_intrest + if( IsDefined( initial_attract_func ) ) + { + self.initial_attract_func = initial_attract_func; + } + + if( IsDefined( arrival_attract_func ) ) + { + self.arrival_attract_func = arrival_attract_func; + } + + ARRAY_ADD( level.zombie_poi_array, self ); + self thread zm_utility::watch_for_poi_death(); + +} + +function watch_for_poi_death() +{ + self waittill( "death" ); + + //Remove from list + if ( IsInArray( level.zombie_poi_array, self ) ) + { + ArrayRemoveValue( level.zombie_poi_array, self ); + } +} + +function debug_draw_new_attractor_positions() +{ + self endon( "death" ); + + while ( 1 ) + { + foreach( attract in self.attractor_positions ) + { + passed = BulletTracePassed( attract[0] + (0, 0, 24), self.origin + (0, 0, 24), false, self ); + if ( passed ) + { + /# debugstar( attract[0], 6, (1,1,1) ); #/ + } + else + { + /# debugstar( attract[0], 6, (1,0,0) ); #/ + } + } + + WAIT_SERVER_FRAME; + } +} + +function create_zombie_point_of_interest_attractor_positions( num_attract_dists, attract_dist ) +{ + self endon( "death" ); + + if( !isdefined( self.num_poi_attracts ) || (isDefined(self.script_noteworthy) && self.script_noteworthy != "zombie_poi" )) + { + return; + } + + if( !isdefined( num_attract_dists ) ) // TODO Holdover from previous logic. Should be reevaluated + { + num_attract_dists = 4; + } + + // Creates matrix of attraction points and assigns them to grenade + queryResult = PositionQuery_Source_Navigation( self.origin, (attract_dist / 2), self.max_attractor_dist, (attract_dist / 2), (attract_dist / 2), true, (attract_dist / 2) ); + + if( queryResult.data.size < self.num_poi_attracts ) + { + self.num_poi_attracts = queryResult.data.size; + } + for ( i = 0; i < self.num_poi_attracts; i++ ) + { + if ( IS_TRUE( level.validate_poi_attractors ) ) + { + passed = BulletTracePassed( queryResult.data[i].origin + (0, 0, 24), self.origin + (0, 0, 24), false, self ); + if ( passed ) + { + self.attractor_positions[i][0] = queryResult.data[i].origin; + self.attractor_positions[i][1] = self; + } + } + else + { + self.attractor_positions[i][0] = queryResult.data[i].origin; + self.attractor_positions[i][1] = self; + } + } + + if( !IsDefined( self.attractor_positions ) ) + { + self.attractor_positions = []; + } + + self.num_attract_dists = num_attract_dists; + + // The last index in the attractor_position arrays for each of the possible distances. The array is a holdover from previous logic. + self.last_index = []; + for( i = 0; i < num_attract_dists; i++ ) + { + self.last_index[i] = -1; + } + + // Represents origin point TODO Holdover from previous logic. Should be reevaluated + self.last_index[0] = 1; + + // Represents total number of attraction points TODO Holdover from previous logic. Should be reevaluated + self.last_index[1] = self.attractor_positions.size; + + self.attract_to_origin = false; + + self notify( "attractor_positions_generated" ); + level notify( "attractor_positions_generated" ); + +// self thread debug_draw_new_attractor_positions(); +} + +function generated_radius_attract_positions( forward, offset, num_positions, attract_radius ) +{ + self endon( "death" ); + + epsilon = 1; + failed = 0; + degs_per_pos = 360 / num_positions; + for( i = offset; i < 360+offset; i += degs_per_pos ) + { + altforward = forward * attract_radius; + rotated_forward = ( (cos(i)*altforward[0] - sin(i)*altforward[1]), (sin(i)*altforward[0] + cos(i)*altforward[1]), altforward[2] ); + + if(isDefined(level.poi_positioning_func)) + { + pos = [[level.poi_positioning_func]](self.origin, rotated_forward); + } + else if(IS_TRUE(level.use_alternate_poi_positioning)) + { + pos = zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + ( 0, 0, 10 ) ); //only trace from 10 units above instead of 100 units + } + else + { + pos = zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + ( 0, 0, 100 ) ); + } + + if(!isDefined(pos)) + { + failed++; + continue; + } + + if(IS_TRUE(level.use_alternate_poi_positioning)) // Attractors are defined and sent to the array here + { + if ( isDefined( self ) && isDefined( self.origin ) ) + { + if( self.origin[2] >= (pos[2]-epsilon) && self.origin[2] - pos[2] <= 150 ) + { + pos_array = []; + pos_array[0] = pos; + pos_array[1] = self; + ARRAY_ADD( self.attractor_positions , pos_array ); + } + } + else + { + failed++; + } + } + else if(abs( pos[2] - self.origin[2] ) < 60 ) + { + pos_array = []; + pos_array[0] = pos; + pos_array[1] = self; + ARRAY_ADD( self.attractor_positions , pos_array ); + } + else + { + failed++; + } + } + return failed; +} + +function debug_draw_attractor_positions() +{ + /# + while( true ) + { + while( !isDefined( self.attractor_positions ) ) + { + WAIT_SERVER_FRAME; + continue; + } + for( i = 0; i < self.attractor_positions.size; i++ ) + { + Line( self.origin, self.attractor_positions[i][0], (1, 0, 0), true, 1 ); + } + WAIT_SERVER_FRAME; + if( !IsDefined( self ) ) + { + return; + } + } + #/ +} + +function debug_draw_claimed_attractor_positions() +{ + /# + while( true ) + { + while( !isDefined( self.claimed_attractor_positions ) ) + { + WAIT_SERVER_FRAME; + continue; + } + for( i = 0; i < self.claimed_attractor_positions.size; i++ ) + { + Line( self.origin, self.claimed_attractor_positions[i][0], (0, 1, 0), true, 1 ); + } + WAIT_SERVER_FRAME; + if( !IsDefined( self ) ) + { + return; + } + } + #/ +} + +function get_zombie_point_of_interest( origin, poi_array ) +{ + AIProfile_BeginEntry( "get_zombie_point_of_interest" ); + + if ( IS_TRUE( self.ignore_all_poi ) ) + { + AIProfile_EndEntry(); + return undefined; + } + + curr_radius = undefined; + + if ( isdefined( poi_array ) ) + { + ent_array = poi_array; + } + else + { + ent_array = level.zombie_poi_array;//getEntArray( "zombie_poi", "script_noteworthy" ); + } + + best_poi = undefined; + position = undefined; + best_dist = 10000 * 10000; + + for( i = 0; i < ent_array.size; i++ ) + { + if( !isDefined( ent_array[i] ) || !isDefined( ent_array[i].poi_active ) || !ent_array[i].poi_active ) + { + continue; + } + + if ( isDefined( self.ignore_poi_targetname ) && self.ignore_poi_targetname.size > 0 ) + { + if ( isDefined( ent_array[i].targetname ) ) + { + ignore = false; + for ( j = 0; j < self.ignore_poi_targetname.size; j++ ) + { + if ( ent_array[i].targetname == self.ignore_poi_targetname[j] ) + { + ignore = true; + break; + } + } + if ( ignore ) + { + continue; + } + } + } + + if ( isDefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) + { + ignore = false; + for ( j = 0; j < self.ignore_poi.size; j++ ) + { + if ( self.ignore_poi[j] == ent_array[i] ) + { + ignore = true; + break; + } + } + if ( ignore ) + { + continue; + } + } + + dist = distanceSquared( origin, ent_array[i].origin ); + + dist -= ent_array[i].added_poi_value; + + if( isDefined( ent_array[i].poi_radius ) ) + { + curr_radius = ent_array[i].poi_radius; + } + + if( (!isDefined( curr_radius ) || dist < curr_radius) && dist < best_dist && ent_array[i] can_attract(self) ) + { + best_poi = ent_array[i]; + best_dist = dist; + } + } + + if( isDefined( best_poi ) ) + { + if(isDefined(best_poi._team)) + { + if(isDefined(self._race_team) && self._race_team != best_poi._team) + { + AIProfile_EndEntry(); + return undefined; + } + } + if( IS_TRUE( best_poi._new_ground_trace ) ) // needed for the bhb so it won't trace through metal clip + { + position = []; + position[0] = groundpos_ignore_water_new( best_poi.origin + (0, 0, 100) ); + position[1] = self; + } + else if( isDefined( best_poi.attract_to_origin ) && best_poi.attract_to_origin ) // Override, currently only used for monkeys in the air. + { + position = []; + position[0] = groundpos( best_poi.origin + (0, 0, 100) ); + position[1] = self; + } + else + { + position = self add_poi_attractor( best_poi ); + } + + if( IsDefined( best_poi.initial_attract_func ) ) + { + self thread [[ best_poi.initial_attract_func ]]( best_poi ); + } + + if( IsDefined( best_poi.arrival_attract_func ) ) + { + self thread [[ best_poi.arrival_attract_func ]]( best_poi ); + } + } + + AIProfile_EndEntry(); + return position; +} + +function activate_zombie_point_of_interest() +{ + if( self.script_noteworthy != "zombie_poi" ) + { + return; + } + + self.poi_active = true; +} + +function deactivate_zombie_point_of_interest( dont_remove ) +{ + if( self.script_noteworthy != "zombie_poi" ) + { + return; + } + + self.attractor_array = array::remove_undefined( self.attractor_array ); + for( i = 0; i < self.attractor_array.size; i++ ) + { + self.attractor_array[i] notify( "kill_poi" ); + } + + self.attractor_array = []; + self.claimed_attractor_positions = []; + + self.poi_active = false; + + if ( IS_TRUE( dont_remove ) ) + { + return; + } + + //Remove from list + if ( isdefined( self ) ) + { + if ( IsInArray( level.zombie_poi_array, self ) ) + { + ArrayRemoveValue( level.zombie_poi_array, self ); + } + } +} + +//PI_CHANGE_BEGIN - 6/18/09 JV This works to help set "wait" points near the stage if all players are in the process teleportation. +//It is unlike the previous function in that you dictate the poi. +function assign_zombie_point_of_interest (origin, poi) +{ + position = undefined; + doremovalthread = false; + + if (IsDefined(poi) && poi can_attract(self)) + { + //don't want to touch add poi attractor, but yeah, this is kind of weird + if (!IsDefined(poi.attractor_array) || ( IsDefined(poi.attractor_array) && !IsInArray( poi.attractor_array, self ) )) + doremovalthread = true; + + position = self add_poi_attractor( poi ); + + //now that I know this is the first time they've been added, set up the thread to remove them from the array + if (IsDefined(position) && doremovalthread && IsInArray( poi.attractor_array, self )) + self thread update_on_poi_removal( poi ); + } + + return position; +} +//PI_CHANGE_END + +function remove_poi_attractor( zombie_poi ) +{ + if( !isDefined( zombie_poi ) || !isDefined( zombie_poi.attractor_array ) ) + { + return; + } + + for( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if( zombie_poi.attractor_array[i] == self ) + { + ArrayRemoveValue( zombie_poi.attractor_array, zombie_poi.attractor_array[i] ); + ArrayRemoveValue( zombie_poi.claimed_attractor_positions, zombie_poi.claimed_attractor_positions[i] ); + + if ( isdefined( self ) ) + { + self notify( "kill_poi" ); + } + } + } +} + +function array_check_for_dupes_using_compare( array, single, is_equal_fn ) +{ + for( i = 0; i < array.size; i++ ) + { + if( [[is_equal_fn]]( array[i], single ) ) + { + return false; + } + } + + return true; +} + +function poi_locations_equal( loc1, loc2 ) +{ + return loc1[0]==loc2[0]; +} + + +function add_poi_attractor( zombie_poi ) +{ + if( !isDefined( zombie_poi ) ) + { + return; + } + if( !isDefined( zombie_poi.attractor_array ) ) + { + zombie_poi.attractor_array = []; + } + + // If we are not yet an attractor to this poi, claim an attractor position and start attracting to it + if( !IsInArray( zombie_poi.attractor_array, self ) ) + { + if( !isDefined( zombie_poi.claimed_attractor_positions ) ) + { + zombie_poi.claimed_attractor_positions = []; + } + + if( !isDefined( zombie_poi.attractor_positions ) || zombie_poi.attractor_positions.size <= 0 ) + { + return undefined; + } + + start = -1; + end = -1; + last_index = -1; + for( i = 0; i < 4; i++ ) + { + if( zombie_poi.claimed_attractor_positions.size < zombie_poi.last_index[i] ) + { + start = last_index+1; + end = zombie_poi.last_index[i]; + break; + } + last_index = zombie_poi.last_index[i]; + } + + + best_dist = 10000*10000; + best_pos = undefined; + if( start < 0 ) + { + start = 0; + } + if( end < 0 ) + { + return undefined; + } + for( i = int(start); i <= int(end); i++ ) + { + if(!isDefined(zombie_poi.attractor_positions[i])) + { + continue; + } + //if( !IsInArray( zombie_poi.claimed_attractor_positions, zombie_poi.attractor_positions[i] ) ) + if( array_check_for_dupes_using_compare( zombie_poi.claimed_attractor_positions, zombie_poi.attractor_positions[i], &poi_locations_equal ) ) + { + + if ( isDefined( zombie_poi.attractor_positions[i][0] ) && isDefined( self.origin ) ) + { + dist = distancesquared( zombie_poi.attractor_positions[i][0], zombie_poi.origin ); + if( dist < best_dist || !isDefined( best_pos ) ) + { + best_dist = dist; + best_pos = zombie_poi.attractor_positions[i]; + } + } + } + } + + if( !isDefined( best_pos ) ) + { + if ( IS_TRUE( level.validate_poi_attractors ) ) + { + valid_pos = []; + valid_pos[0] = zombie_poi.origin; + valid_pos[1] = zombie_poi; + return valid_pos; + } + + return undefined; + } + + ARRAY_ADD( zombie_poi.attractor_array, self ); + self thread update_poi_on_death( zombie_poi ); + + ARRAY_ADD( zombie_poi.claimed_attractor_positions, best_pos ); + + return best_pos; + } + else + { + for( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if( zombie_poi.attractor_array[i] == self ) + { + if( isDefined( zombie_poi.claimed_attractor_positions ) && isDefined( zombie_poi.claimed_attractor_positions[i] ) ) + { + return zombie_poi.claimed_attractor_positions[i]; + } + } + } + } + + return undefined; +} + +function can_attract( attractor ) +{ + if( !isDefined( self.attractor_array ) ) + { + self.attractor_array = []; + } + //Raven Begin - Allow only selected zombies to be attracted + if( isDefined(self.attracted_array) && !IsInArray(self.attracted_array, attractor) ) + { + return false; + } + //Raven End + if( IsInArray( self.attractor_array, attractor ) ) + { + return true; + } + if( isDefined(self.num_poi_attracts) && self.attractor_array.size >= self.num_poi_attracts ) + { + return false; + } + + return true; +} + +function update_poi_on_death( zombie_poi ) +{ + self endon( "kill_poi" ); + + self waittill( "death" ); + self remove_poi_attractor( zombie_poi ); +} + +//PI_CHANGE_BEGIN - 6/18/09 JV This was set up to work with assign_zombie_point_of_interest (which works with the teleportation in theater). +//The poi attractor array needs to be emptied when a player is teleported out of projection room (if they were all in there). +//As a result, we wait for the poi's death (I'm sending that notify via the level script) +function update_on_poi_removal (zombie_poi ) +{ + zombie_poi waittill( "death" ); + + if( !isDefined( zombie_poi.attractor_array ) ) + return; + + for( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if( zombie_poi.attractor_array[i] == self ) + { + ArrayRemoveIndex( zombie_poi.attractor_array, i ); + ArrayRemoveIndex( zombie_poi.claimed_attractor_positions, i ); + } + } + +} +//PI_CHANGE_END + +function invalidate_attractor_pos( attractor_pos, zombie ) +{ + if( !isDefined( self ) || !isDefined( attractor_pos ) ) + { + wait( 0.1 ); + return undefined; + } + + if( isDefined( self.attractor_positions) && !array_check_for_dupes_using_compare( self.attractor_positions, attractor_pos, &poi_locations_equal ) ) + { + index = 0; + for( i = 0; i < self.attractor_positions.size; i++ ) + { + if( poi_locations_equal( self.attractor_positions[i], attractor_pos) ) + { + index = i; + } + } + + for( i = 0; i < self.last_index.size; i++ ) + { + if( index <= self.last_index[i] ) + { + self.last_index[i]--; + } + } + + ArrayRemoveValue( self.attractor_array, zombie ); + ArrayRemoveValue( self.attractor_positions, attractor_pos ); + for( i = 0; i < self.claimed_attractor_positions.size; i++ ) + { + if( self.claimed_attractor_positions[i][0] == attractor_pos[0] ) + { + ArrayRemoveValue( self.claimed_attractor_positions, self.claimed_attractor_positions[i] ); + } + } + } + else + { + wait( 0.1 ); + } + + return get_zombie_point_of_interest( zombie.origin ); +} + +function remove_poi_from_ignore_list( poi ) +{ + if ( isDefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) + { + for ( i = 0; i < self.ignore_poi.size; i++ ) + { + if ( self.ignore_poi[i] == poi ) + { + ArrayRemoveValue( self.ignore_poi, self.ignore_poi[i] ); + return; + } + } + } +} + +function add_poi_to_ignore_list( poi ) +{ + if ( !isDefined( self.ignore_poi ) ) + { + self.ignore_poi = []; + } + + add_poi = true; + if ( self.ignore_poi.size > 0 ) + { + for ( i = 0; i < self.ignore_poi.size; i++ ) + { + if ( self.ignore_poi[i] == poi ) + { + add_poi = false; + break; + } + } + } + + if ( add_poi ) + { + self.ignore_poi[self.ignore_poi.size] = poi; + } +} + + +//------------------------------------------------------------------------------- +// player should be within a couple feet of enemy +//------------------------------------------------------------------------------- +function default_validate_enemy_path_length( player ) +{ + max_dist = 1296; + + d = DistanceSquared( self.origin, player.origin ); + if ( d <= max_dist ) + { + return true; + } + + return false; +} + +function get_closest_valid_player( origin, ignore_player ) +{ + AIProfile_BeginEntry( "get_closest_valid_player" ); + + valid_player_found = false; + players = GetPlayers(); + + if( isdefined( level.get_closest_valid_player_override ) ) + { + players = [[ level.get_closest_valid_player_override ]](); + } + + b_designated_target_exists = false; + for(i = 0; i < players.size; i++ ) + { + player = players[i]; + + //if( !is_player_valid( players[i], true ) ) + if( !player.am_i_valid ) + { + continue; + } + + if( isDefined( level.evaluate_zone_path_override ) ) + { + if( ![[ level.evaluate_zone_path_override ]]( player ) ) + { + array::add( ignore_player, player ); + } + } + + // is any player a designated target? + if( IS_TRUE( player.b_is_designated_target ) ) + { + b_designated_target_exists = true; + } + } + + if( IsDefined( ignore_player ) ) + { + for(i = 0; i < ignore_player.size; i++ ) + { + ArrayRemoveValue( players, ignore_player[i] ); + } + } + + // pre-cull any players that are in last stand or not designated target when a designated target is present + done = false; + while ( players.size && !done ) + { + done = true; + for(i = 0; i < players.size; i++ ) + { + player = players[i]; + //if( !is_player_valid( player, true ) ) + if( !player.am_i_valid ) + { + ArrayRemoveValue( players, player ); + done = false; + break; + } + if( b_designated_target_exists && !IS_TRUE( player.b_is_designated_target ) ) + { + ArrayRemoveValue( players, player ); + done = false; + break; + } + } + } + + if( players.size == 0 ) + { + AIProfile_EndEntry(); + return undefined; + } + + while( !valid_player_found ) + { + // find the closest player + if( IsDefined( self.closest_player_override ) ) + { + player = [[ self.closest_player_override ]]( origin, players ); + } + else if( isdefined( level.closest_player_override ) ) + { + player = [[ level.closest_player_override ]]( origin, players ); + } + else + { + player = ArrayGetClosest( origin, players ); + } + + if( !isdefined( player ) || players.size == 0 ) + { + AIProfile_EndEntry(); + return undefined; + } + + if( IS_TRUE(level.allow_zombie_to_target_ai) || IS_TRUE(player.allow_zombie_to_target_ai) ) + { + AIProfile_EndEntry(); + return player; + } + + // make sure they're not a zombie or in last stand + //if( !is_player_valid( player, true ) ) + if( !player.am_i_valid ) + { + // unlikely to get here unless there is a wait in one of the closest player overrides + ArrayRemoveValue( players, player ); + if( players.size == 0 ) + { + AIProfile_EndEntry(); + return undefined; + } + + continue; + } + + AIProfile_EndEntry(); + return player; + } +} + +//modified version of get_closest_valid_player that gives perfect info and sets up ignoreEnts to respect the ignore_player array. + +function update_valid_players( origin, ignore_player ) +{ + AIProfile_BeginEntry( "update_valid_players" ); + + valid_player_found = false; + players = ArrayCopy( level.players ); // Have to use ArrayCopy otherwise the ArrayRemove calls below will remove the players from level.players + + //new zombie enemy selection + foreach( player in players ) + { + self SetIgnoreEnt( player, true ); + } + + b_designated_target_exists = false; + for(i = 0; i < players.size; i++ ) + { + player = players[i]; + + //if( !is_player_valid( players[i], true ) ) + if( !player.am_i_valid ) + { + continue; + } + + if( isDefined( level.evaluate_zone_path_override ) ) + { + if( ![[ level.evaluate_zone_path_override ]]( player ) ) + { + array::add( ignore_player, player ); + } + } + + // is any player a designated target? + if( IS_TRUE( player.b_is_designated_target ) ) + { + b_designated_target_exists = true; + } + } + + if( IsDefined( ignore_player ) ) + { + for(i = 0; i < ignore_player.size; i++ ) + { + ArrayRemoveValue( players, ignore_player[i] ); + } + } + + // pre-cull any players that are in last stand or not designated target when a designated target is present + done = false; + while ( players.size && !done ) + { + done = true; + for(i = 0; i < players.size; i++ ) + { + player = players[i]; + //if( !is_player_valid( player, true ) ) + if( !player.am_i_valid ) + { + ArrayRemoveValue( players, player ); + done = false; + break; + } + if( b_designated_target_exists && !IS_TRUE( player.b_is_designated_target ) ) + { + ArrayRemoveValue( players, player ); + done = false; + break; + } + } + } + + //new zombie enemy selection + foreach( player in players ) + { + self SetIgnoreEnt( player, false ); + self GetPerfectInfo( player ); + } + + AIProfile_EndEntry(); +} + +function is_player_valid( player, checkIgnoreMeFlag,ignore_laststand_players ) +{ + if( !IsDefined( player ) ) + { + return false; + } + + if( !IsAlive( player ) ) + { + return false; + } + + if( !IsPlayer( player ) ) + { + return false; + } + + if( IsDefined(player.is_zombie) && player.is_zombie == true ) + { + return false; + } + + if( player.sessionstate == "spectator" ) + { + return false; + } + + if( player.sessionstate == "intermission" ) + { + return false; + } + + if( IS_TRUE( level.intermission ) ) + { + return false; + } + + if( !IS_TRUE( ignore_laststand_players ) ) + { + if( player laststand::player_is_in_laststand() ) + { + return false; + } + } + +//T6.5todo if ( player isnotarget() ) +//T6.5todo { +//T6.5todo return false; +//T6.5todo } + + //We only want to check this from the zombie attack script + if( IS_TRUE(checkIgnoreMeFlag) && player.ignoreme ) + { + //IPrintLnBold(" ignore me "); + return false; + } + + //for additional level specific checks + if( IsDefined( level.is_player_valid_override ) ) + { + return [[ level.is_player_valid_override ]]( player ); + } + + return true; +} + +function get_number_of_valid_players() +{ + + players = GetPlayers(); + num_player_valid = 0; + for( i = 0 ; i < players.size; i++ ) + { + if( is_player_valid( players[i] ) ) + num_player_valid += 1; + } + + + return num_player_valid; + + + +} + +function in_revive_trigger() +{ + if (isdefined(self.rt_time) && self.rt_time + 100 >= GetTime()) + return self.in_rt_cached; + self.rt_time = GetTime(); + + players = level.players; //GetPlayers(); + for( i = 0; i < players.size; i++ ) + { + current_player = players[i]; + + //if( !IsDefined( current_player )) || !IsAlive( current_player ) ) + //{ + // continue; + //} + + if( IsDefined( current_player ) && IsDefined( current_player.revivetrigger ) && IsAlive( current_player ) ) + { + if( self IsTouching( current_player.revivetrigger ) ) + { + self.in_rt_cached = true; + return true; + } + } + } + + self.in_rt_cached = false; + return false; +} + +function get_closest_node( org, nodes ) +{ + return ArrayGetClosest( org, nodes ); +} + +// bars are not damaged pull them off now. +function non_destroyed_bar_board_order( origin, chunks ) +{ + //bars = getentarray("bar","script_parameters"); + first_bars = []; // first set of 2 bars to be removed + first_bars1 = []; // Added single check when combined with wood + first_bars2 = []; // Added single check when combined with wood + + //-------------------------BOARDS---------------------------------------------------------- + // If all boards do the old system + for( i=0;i 0) + { + index = temp_array[RandomIntRange(0, temp_array.size)].index; // must pick unbroken piece first! + return ents[index]; + } + else + { + for( i = 1; i < ents.size; i++ ) + { + temp_dist = Distance2d( origin, ents[i].origin ); + if( temp_dist < dist ) + { + dist = temp_dist; + index = i; + } + } + return ents[index]; + } +} + +//edge_fog_start() +//{ +// playpoint = struct::get( "edge_fog_start", "targetname" ); +// +// if( !IsDefined( playpoint ) ) +// { +// +// } +// +// while( isdefined( playpoint ) ) +// { +// playfx( level._effect["edge_fog"], playpoint.origin ); +// +// if( !isdefined( playpoint.target ) ) +// { +// return; +// } +// +// playpoint = struct::get( playpoint.target, "targetname" ); +// } +//} + + +//chris_p - fix bug with this not being an ent array! +function in_playable_area() +{ + playable_area = getentarray("player_volume","script_noteworthy"); + + if( !IsDefined( playable_area ) ) + { + /# println( "No playable area playable_area found! Assume EVERYWHERE is PLAYABLE" ); #/ + return true; + } + + for(i=0;i=0; i-- ) + { + decimal = decimal/10 + int(floatParts[1][i])/10; + } + + if ( whole >= 0 ) + return (whole + decimal); + else + return (whole - decimal); +} + +// +// TABLE LOOK SECTION ============================================================ +// + +// Read a value from a table and set the related level.zombie_var +// +function set_zombie_var( zvar, value, is_float, column, is_team_based ) +{ + if ( !IsDefined( is_float ) ) + { + is_float = false; + } + if ( !IsDefined(column) ) + { + column = 1; + } + + if ( IS_TRUE( is_team_based ) ) + { + foreach( team in level.teams ) + { + level.zombie_vars[ team ][ zvar ] = value; + } + } + else + { + level.zombie_vars[zvar] = value; + } + + return value; +} + + +// Read a value from a table and return the result +// +function get_table_var( table, var_name, value, is_float, column ) +{ + if ( !IsDefined(table) ) + { + table = "mp/zombiemode.csv"; + } + if ( !IsDefined(is_float) ) + { + is_float = false; + } + if ( !IsDefined(column) ) + { + column = 1; + } + + // First look it up in the table + table_value = TableLookUp( table, 0, var_name, column ); + if ( IsDefined( table_value ) && table_value != "" ) + { + if( is_float ) + { + value = string_to_float( table_value ); + } + else + { + value = int( table_value ); + } + } + + return value; +} + + +function hudelem_count() +{ +/# + max = 0; + curr_total = 0; + while( 1 ) + { + if( level.hudelem_count > max ) + { + max = level.hudelem_count; + } + + println( "HudElems: " + level.hudelem_count + "[Peak: " + max + "]" ); + WAIT_SERVER_FRAME; + } +#/ +} + +function debug_round_advancer() +{ +/# + while( 1 ) + { + zombs = zombie_utility::get_round_enemy_array(); + + for( i = 0; i < zombs.size; i++ ) + { + zombs[i] dodamage( zombs[i].health + 666, ( 0, 0, 0 ) ); + wait 0.5; + } + } +#/ +} + +function print_run_speed( speed ) +{ +/# + self endon( "death" ); + while( 1 ) + { + print3d( self.origin +( 0, 0, 64 ), speed, ( 1, 1, 1 ) ); + WAIT_SERVER_FRAME; + } +#/ +} + +function draw_line_ent_to_ent( ent1, ent2 ) +{ +/# + if( GetDvarInt( "zombie_debug" ) != 1 ) + { + return; + } + + ent1 endon( "death" ); + ent2 endon( "death" ); + + while( 1 ) + { + line( ent1.origin, ent2.origin ); + WAIT_SERVER_FRAME; + } +#/ +} + +function draw_line_ent_to_pos( ent, pos, end_on ) +{ +/# + if( GetDvarInt( "zombie_debug" ) != 1 ) + { + return; + } + + ent endon( "death" ); + + ent notify( "stop_draw_line_ent_to_pos" ); + ent endon( "stop_draw_line_ent_to_pos" ); + + if( IsDefined( end_on ) ) + { + ent endon( end_on ); + } + + while( 1 ) + { + line( ent.origin, pos ); + WAIT_SERVER_FRAME; + } +#/ +} + +function debug_print( msg ) +{ +/# + if( GetDvarInt( "zombie_debug" ) > 0 ) + { + println( "######### ZOMBIE: " + msg ); + } +#/ +} + +function debug_blocker( pos, rad, height ) +{ +/# + self notify( "stop_debug_blocker" ); + self endon( "stop_debug_blocker" ); + + for( ;; ) + { + if( GetDvarInt( "zombie_debug" ) != 1 ) + { + return; + } + + WAIT_SERVER_FRAME; + drawcylinder( pos, rad, height ); + + } +#/ +} + +function drawcylinder( pos, rad, height ) +{ +/# + currad = rad; + curheight = height; + + for( r = 0; r < 20; r++ ) + { + theta = r / 20 * 360; + theta2 = ( r + 1 ) / 20 * 360; + + line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); + line( pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); + line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); + } +#/ +} + +function print3d_at_pos( msg, pos, thread_endon, offset ) +{ +/# + self endon( "death" ); + + if( IsDefined( thread_endon ) ) + { + self notify( thread_endon ); + self endon( thread_endon ); + } + + if( !IsDefined( offset ) ) + { + offset = ( 0, 0, 0 ); + } + + while( 1 ) + { + print3d( self.origin + offset, msg ); + WAIT_SERVER_FRAME; + } +#/ +} + +function debug_breadcrumbs() +{ +/# + self endon( "disconnect" ); + self notify("stop_debug_breadcrumbs"); + self endon("stop_debug_breadcrumbs"); + + + while( 1 ) + { + if( GetDvarInt( "zombie_debug" ) != 1 ) + { + wait( 1 ); + continue; + } + + for( i = 0; i < self.zombie_breadcrumbs.size; i++ ) + { + drawcylinder( self.zombie_breadcrumbs[i], 5, 5 ); + } + + WAIT_SERVER_FRAME; + } +#/ +} + +/# +function debug_attack_spots_taken() +{ +// this section was totally commented out. + self notify("stop_debug_breadcrumbs"); + self endon("stop_debug_breadcrumbs"); + + while( 1 ) + { + if( GetDvarInt( "zombie_debug" ) != 2 ) + { + wait( 1 ); + continue; + } + + WAIT_SERVER_FRAME; + count = 0; + for( i = 0; i < self.attack_spots_taken.size; i++ ) + { + if( self.attack_spots_taken[i] ) + { + count++; + circle(self.attack_spots[i], 12, (1,0,0), false, true, 1); + } + else + { + circle(self.attack_spots[i], 12, (0,1,0), false, true, 1); + } + } + + msg = "" + count + " / " + self.attack_spots_taken.size; + print3d( self.origin, msg ); + } + +} +#/ + +function float_print3d( msg, time ) +{ +/# + self endon( "death" ); + + time = GetTime() + ( time * 1000 ); + offset = ( 0, 0, 72 ); + while( GetTime() < time ) + { + offset = offset + ( 0, 0, 2 ); + print3d( self.origin + offset, msg, ( 1, 1, 1 ) ); + WAIT_SERVER_FRAME; + } +#/ +} +function do_player_vo(snd, variation_count) +{ + index = get_player_index(self); + + // updated to new alias format - Steve G + sound = "zmb_vox_plr_" + index + "_" + snd; + if(IsDefined (variation_count)) + { + sound = sound + "_" + randomintrange(0, variation_count); + } + if(!isDefined(level.player_is_speaking)) + { + level.player_is_speaking = 0; + } + + if (level.player_is_speaking == 0) + { + level.player_is_speaking = 1; + self PlaySoundWithNotify(sound, "sound_done"); + self waittill("sound_done"); + //This ensures that there is at least 3 seconds waittime before playing another VO. + wait(2); + level.player_is_speaking = 0; + } +} + +function is_magic_bullet_shield_enabled( ent ) +{ + if( !IsDefined( ent ) ) + return false; + + //return ( IsDefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == true ); + return !IS_TRUE( ent.allowDeath ); +} + +function really_play_2D_sound(sound) +{ + temp_ent = spawn("script_origin", (0,0,0)); + temp_ent PlaySoundWithNotify (sound, sound + "wait"); + temp_ent waittill (sound + "wait"); + WAIT_SERVER_FRAME; + temp_ent delete(); +} + + +function play_sound_2D(sound) +{ + level thread really_play_2D_sound(sound); + + /* + if(!isdefined(level.playsound2dent)) + { + level.playsound2dent = spawn("script_origin",(0,0,0)); + } + + //players=GetPlayers(); + level.playsound2dent playsound ( sound ); + */ + /* + temp_ent = spawn("script_origin", (0,0,0)); + temp_ent PlaySoundWithNotify (sound, sound + "wait"); + temp_ent waittill (sound + "wait"); + WAIT_SERVER_FRAME; + temp_ent delete(); + */ +} + +function include_weapon( weapon_name, in_box ) +{ +/# println( "ZM >> include_weapon = " + weapon_name ); #/ + if( !isDefined( in_box ) ) + { + in_box = true; + } + + zm_weapons::include_zombie_weapon( weapon_name, in_box ); +} + +// Allows triggers to be un/seen by players +function trigger_invisible( enable ) +{ + players = GetPlayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + self SetInvisibleToPlayer( players[i], enable ); + } + } +} + + +// Print3d +function print3d_ent( text, color, scale, offset, end_msg, overwrite ) +{ + self endon("death"); + + if ( IsDefined(overwrite) && overwrite && IsDefined( self._debug_print3d_msg ) ) + { + // Kill the previous thread + self notify( "end_print3d" ); + WAIT_SERVER_FRAME; + } + + self endon("end_print3d"); + + if ( !IsDefined(color) ) + { + color = (1,1,1); + } + + if ( !IsDefined(scale) ) + { + scale = 1.0; + } + + if ( !IsDefined(offset) ) + { + offset = (0,0,0); + } + + if ( IsDefined(end_msg) ) + { + self endon(end_msg); + } + + // This way you can change the message dynamically by changing the var + self._debug_print3d_msg = text; + /# + while ( !IS_TRUE( level.disable_print3d_ent ) ) + { + print3d( self.origin+offset, self._debug_print3d_msg, color, scale ); + WAIT_SERVER_FRAME; + } + #/ +} + +// +// +function create_counter_hud( x ) +{ + if( !IsDefined( x ) ) + { + x = 0; + } + + hud = create_simple_hud(); + hud.alignX = "left"; + hud.alignY = "top"; + hud.horzAlign = "user_left"; + hud.vertAlign = "user_top"; + hud.color = ( 1, 1, 1 ); +// hud.color = ( 0.21, 0, 0 ); + hud.fontscale = 32; + hud.x = x; + hud.alpha = 0; + + hud SetShader( "hud_chalk_1", 64, 64 ); + + return hud; +} + + +// +// Get the name of the zone that the entity is currently in +// self is the entity to check on +function get_current_zone( return_zone ) +{ + level flag::wait_till( "zones_initialized" ); + + if ( IsDefined(self.cached_zone) ) + { + zone = self.cached_zone; + zone_name = self.cached_zone_name; + vol = self.cached_zone_volume; + // check most recent zone and volume + if ( self IsTouching(zone.volumes[vol]) ) + { + if ( IS_TRUE( return_zone ) ) + { + return zone; + } + return zone_name; + } + // check other volumes in the most recent zone + for (i = 0; i < zone.volumes.size; i++) + { + if ( i == vol ) + continue; + if ( self IsTouching(zone.volumes[i]) ) + { + self.cached_zone = zone; + self.cached_zone_volume = i; + if ( IS_TRUE( return_zone ) ) + { + return zone; + } + return zone_name; + } + } + } + + // clear out active zone flags + for( z=0; z= 90 ) + { + time = 4; + } + else if( scaled_damage >= 50 ) + { + time = 3; + } + else if( scaled_damage >= 25 ) + { + time = 2; + } + else if( scaled_damage > 10 ) + { + time = 1; + } + + if( time ) + { + if ( !IsDefined( shockType ) ) + { + shockType = "explosion"; + } + + self ShellShock( shockType, time ); + } + else if (IsDefined(shockLight)) + { + self ShellShock( shockLight, time ); + } +} + + +function increment_ignoreme() +{ + DEFAULT( self.ignorme_count, 0 ); + self.ignorme_count++; + self.ignoreme = ( self.ignorme_count > 0 ); +} + +function decrement_ignoreme() +{ + DEFAULT( self.ignorme_count, 0 ); + if( self.ignorme_count > 0 ) + { + self.ignorme_count--; + } + else + { + AssertMsg( "making ignorme_count less than 0" ); + } + + self.ignoreme = ( self.ignorme_count > 0 ); +} + + + + +// ww: increment the is_drinking variable on a player +function increment_is_drinking() +{ + //self endon( "death" ); + /# + if( IS_TRUE(level.devgui_dpad_watch) ) + { + self.is_drinking++; + return; + } + #/ + + if( !isdefined(self.is_drinking) ) + self.is_drinking = 0; + + if( self.is_drinking == 0 ) + { + + self DisableOffhandWeapons(); + self DisableWeaponCycling(); + } + + self.is_drinking++; +} + +// ww: checks is_drinking +//is_drinking() +//{ +// //self endon( "death" ); +// return ( self.is_drinking > 0 ); +//} + +// to check if more than one is active at once +function is_multiple_drinking() +{ + //self endon( "death" ); + return ( self.is_drinking > 1 ); +} + +// ww: decrement drinking +function decrement_is_drinking() +{ + //self endon( "death" ); + + if( self.is_drinking > 0 ) + { + self.is_drinking--; + } + else + { + AssertMsg( "making is_drinking less than 0" ); + } + + + if( self.is_drinking == 0 ) + { + self EnableOffhandWeapons(); + self EnableWeaponCycling(); + } +} + +// ww: clear the variable, used for players going in to last stand +function clear_is_drinking() +{ + //self endon( "death" ); + + self.is_drinking = 0; + + self EnableOffhandWeapons(); + self EnableWeaponCycling(); +} + +// PORTIZ 7/27/16: At this point there are multiple mechanics prolonging solo games when player doesn't have Quick Revive, so we need a +// better way of supporting them in conjunction +function increment_no_end_game_check() +{ + DEFAULT( level.n_no_end_game_check_count, 0 ); + level.n_no_end_game_check_count++; + level.no_end_game_check = ( level.n_no_end_game_check_count > 0 ); +} + +function decrement_no_end_game_check() +{ + DEFAULT( level.n_no_end_game_check_count, 0 ); + if( level.n_no_end_game_check_count > 0 ) + { + level.n_no_end_game_check_count--; + } + else + { + AssertMsg( "making no_end_game_check_count less than 0" ); + } + + level.no_end_game_check = ( level.n_no_end_game_check_count > 0 ); + + if ( !level.no_end_game_check ) + { + level zm::checkForAllDead(); // run this manually any time this is decremented back to a false state + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +function fade_out(time) +{ + if (!isDefined(time)) + { + time = 1; + } + if( !IsDefined(level.introblack) ) + { + level.introblack = NewHudElem(); + level.introblack.x = 0; + level.introblack.y = 0; + level.introblack.horzAlign = "fullscreen"; + level.introblack.vertAlign = "fullscreen"; + level.introblack.foreground = true; + level.introblack SetShader( "black", 640, 480 ); + level.introblack.alpha = 0; + wait .05; + } + + if( time > 0 ) + { + level.introblack FadeOverTime( time ); + } + level.introblack.alpha = 1; + + players = GetPlayers(); + for(i = 0; i < players.size; i++) + { + players[i] freezecontrols(true); + } + + wait time; +} + +function fade_in( hold_black_time ) +{ + if( !IsDefined(level.introblack) ) + { + level.introblack = NewHudElem(); + level.introblack.x = 0; + level.introblack.y = 0; + level.introblack.horzAlign = "fullscreen"; + level.introblack.vertAlign = "fullscreen"; + level.introblack.foreground = true; + level.introblack SetShader( "black", 640, 480 ); + level.introblack.alpha = 1; + wait .05; + } + + level.introblack.alpha = 1; + + if( IsDefined( hold_black_time ) ) + wait hold_black_time; + else + wait .2; + + level.introblack FadeOverTime( 1.5 ); + level.introblack.alpha = 0; + + level notify("fade_introblack"); + + wait 1.5; + + players = GetPlayers(); + for(i = 0; i < players.size; i++) + { + players[i] freezecontrols(false); + } + level notify("fade_in_complete"); +} +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WEAPONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +function getWeaponClassZM( weapon ) +{ + assert( isdefined( weapon ) ); + if ( !isdefined( weapon ) ) + { + return undefined; + } + + if ( !isdefined ( level.weaponClassArray ) ) + { + level.weaponClassArray = []; + } + + if ( isdefined( level.weaponClassArray[weapon] ) ) + { + return level.weaponClassArray[weapon]; + } + + baseWeaponIndex = GetBaseWeaponItemIndex( weapon ); + statsTableName = util::getStatsTableName(); + weaponClass = tableLookup( statsTableName, 0, baseWeaponIndex, STATS_TABLE_COL_GROUP); + level.weaponClassArray[weapon] = weaponClass; + return weaponClass; +} + +function spawn_weapon_model( weapon, model, origin, angles, options ) +{ + if ( !isdefined( model ) ) + { + model = weapon.worldModel; + } + + weapon_model = spawn( "script_model", origin ); + if ( isdefined( angles ) ) + { + weapon_model.angles = angles; + } + + if ( isdefined( options ) ) + { + weapon_model useweaponmodel( weapon, model, options ); + } + else + { + weapon_model useweaponmodel( weapon, model ); + } + + return weapon_model; +} + + +function spawn_buildkit_weapon_model( player, weapon, camo, origin, angles ) +{ + weapon_model = spawn( "script_model", origin ); + if ( isdefined( angles ) ) + { + weapon_model.angles = angles; + } + + upgraded = zm_weapons::is_weapon_upgraded( weapon ); + if ( upgraded && (!IsDefined( camo ) || 0 > camo) ) + { + camo = zm_weapons::get_pack_a_punch_camo_index( undefined ); + } + + weapon_model UseBuildKitWeaponModel( player, weapon, camo, upgraded ); + + return weapon_model; +} + + +function is_player_revive_tool( weapon ) +{ + if ( weapon == level.weaponReviveTool || IS_EQUAL(weapon,self.weaponReviveTool) ) + { + return true; + } + + return false; +} + +function is_limited_weapon( weapon ) +{ + if ( IsDefined( level.limited_weapons ) && IsDefined( level.limited_weapons[weapon] ) ) + { + return true; + } + + return false; +} + + +function register_lethal_grenade_for_level( weaponname ) +{ + weapon = GetWeapon( weaponname ); + if ( is_lethal_grenade( weapon ) ) + { + return; + } + + if ( !isdefined( level.zombie_lethal_grenade_list ) ) + { + level.zombie_lethal_grenade_list = []; + } + + level.zombie_lethal_grenade_list[weapon] = weapon; +} + + +function is_lethal_grenade( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( level.zombie_lethal_grenade_list ) ) + { + return false; + } + + return isdefined(level.zombie_lethal_grenade_list[weapon]); +} + + +function is_player_lethal_grenade( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( self.current_lethal_grenade ) ) + { + return false; + } + + return self.current_lethal_grenade == weapon; +} + + +function get_player_lethal_grenade() +{ + grenade = level.weaponNone; + + if(IsDefined(self.current_lethal_grenade)) + { + grenade = self.current_lethal_grenade; + } + + return grenade; +} + + +function set_player_lethal_grenade( weapon ) +{ + if ( !IsDefined( weapon ) ) + { + weapon = level.weaponNone; + } + + self notify( "new_lethal_grenade", weapon ); + self.current_lethal_grenade = weapon; +} + + +function init_player_lethal_grenade() +{ + self set_player_lethal_grenade( level.zombie_lethal_grenade_player_init ); +} + + +function register_tactical_grenade_for_level( weaponname ) +{ + weapon = GetWeapon( weaponname ); + if ( is_tactical_grenade( weapon ) ) + { + return; + } + + if ( !isdefined( level.zombie_tactical_grenade_list ) ) + { + level.zombie_tactical_grenade_list = []; + } + + level.zombie_tactical_grenade_list[weapon] = weapon; +} + + +function is_tactical_grenade( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( level.zombie_tactical_grenade_list ) ) + { + return false; + } + + return isdefined(level.zombie_tactical_grenade_list[weapon]); +} + + +function is_player_tactical_grenade( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( self.current_tactical_grenade ) ) + { + return false; + } + + return self.current_tactical_grenade == weapon; +} + + +function get_player_tactical_grenade() +{ + tactical = level.weaponNone; + + if(IsDefined(self.current_tactical_grenade)) + { + tactical = self.current_tactical_grenade; + } + + return tactical; +} + + +function set_player_tactical_grenade( weapon ) +{ + if ( !IsDefined( weapon ) ) + { + weapon = level.weaponNone; + } + + self notify( "new_tactical_grenade", weapon ); + self.current_tactical_grenade = weapon; +} + + +function init_player_tactical_grenade() +{ + self set_player_tactical_grenade( level.zombie_tactical_grenade_player_init ); +} + +function is_placeable_mine( weapon ) +{ + DEFAULT(level.placeable_mines,[]); + + if ( !isdefined( weapon ) || weapon == level.weaponNone ) + { + return false; + } + + return isdefined( level.placeable_mines[weapon.name] ); +} + + +function is_player_placeable_mine( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( self.current_placeable_mine ) ) + { + return false; + } + + return self.current_placeable_mine == weapon; +} + + +function get_player_placeable_mine() +{ + placeable_mine = level.weaponNone; + + if(IsDefined(self.current_placeable_mine)) + { + placeable_mine = self.current_placeable_mine; + } + + return placeable_mine; +} + + +function set_player_placeable_mine( weapon ) +{ + if ( !IsDefined( weapon ) ) + { + weapon = level.weaponNone; + } + + self notify( "new_placeable_mine", weapon ); + self.current_placeable_mine = weapon; +} + + +function init_player_placeable_mine() +{ + self set_player_placeable_mine( level.zombie_placeable_mine_player_init ); +} + + +function register_melee_weapon_for_level( weaponname ) +{ + weapon = GetWeapon( weaponname ); + if ( is_melee_weapon( weapon ) ) + { + return; + } + + if ( !isdefined( level.zombie_melee_weapon_list ) ) + { + level.zombie_melee_weapon_list = []; + } + + level.zombie_melee_weapon_list[weapon] = weapon; +} + + +function is_melee_weapon( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( level.zombie_melee_weapon_list ) || ( weapon == GetWeapon( "none" ) ) ) + { + return false; + } + + return isdefined(level.zombie_melee_weapon_list[weapon]); +} + + +function is_player_melee_weapon( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( self.current_melee_weapon ) ) + { + return false; + } + + return self.current_melee_weapon == weapon; +} + + +function get_player_melee_weapon() +{ + melee_weapon = level.weaponNone; + + if(IsDefined(self.current_melee_weapon)) + { + melee_weapon = self.current_melee_weapon; + } + + return melee_weapon; +} + + +function set_player_melee_weapon( weapon ) +{ + if ( !IsDefined( weapon ) ) + { + weapon = level.weaponNone; + } + + self notify( "new_melee_weapon", weapon ); + self.current_melee_weapon = weapon; +} + + +function init_player_melee_weapon() +{ + self set_player_melee_weapon( level.zombie_melee_weapon_player_init ); +} + + +function register_hero_weapon_for_level( weaponname ) +{ + weapon = GetWeapon( weaponname ); + if ( is_hero_weapon( weapon ) ) + { + return; + } + + if ( !isdefined( level.zombie_hero_weapon_list ) ) + { + level.zombie_hero_weapon_list = []; + } + + level.zombie_hero_weapon_list[weapon] = weapon; +} + +function is_hero_weapon( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( level.zombie_hero_weapon_list ) ) + { + return false; + } + + return isdefined(level.zombie_hero_weapon_list[weapon]); +} + + +function is_player_hero_weapon( weapon ) +{ + if ( !isdefined( weapon ) || !isdefined( self.current_hero_weapon ) ) + { + return false; + } + + return self.current_hero_weapon == weapon; +} + + +function get_player_hero_weapon() +{ + hero_weapon = level.weaponNone; + + if(IsDefined(self.current_hero_weapon)) + { + hero_weapon = self.current_hero_weapon; + } + + return hero_weapon; +} + + +function set_player_hero_weapon( weapon ) +{ + if ( !IsDefined( weapon ) ) + { + weapon = level.weaponNone; + } + + self notify( "new_hero_weapon", weapon ); + self.current_hero_weapon = weapon; +} + +function init_player_hero_weapon() +{ + self set_player_hero_weapon( level.zombie_hero_weapon_player_init ); +} + +function has_player_hero_weapon() +{ + return (IsDefined(self.current_hero_weapon) && self.current_hero_weapon != level.weaponNone); +} + + + +function should_watch_for_emp() +{ + return IS_TRUE( level.should_watch_for_emp ); +} + +function register_offhand_weapons_for_level_defaults() +{ + if ( isdefined( level.register_offhand_weapons_for_level_defaults_override ) ) + { + [[ level.register_offhand_weapons_for_level_defaults_override ]](); + return; + } + + register_lethal_grenade_for_level( "frag_grenade" ); + level.zombie_lethal_grenade_player_init = GetWeapon( "frag_grenade" ); + + register_tactical_grenade_for_level( "cymbal_monkey" ); + level.zombie_tactical_grenade_player_init = undefined; + + + level.zombie_placeable_mine_player_init = undefined; + + register_melee_weapon_for_level( "knife" ); + register_melee_weapon_for_level( "bowie_knife" ); + level.zombie_melee_weapon_player_init = GetWeapon( "knife" ); + + level.zombie_equipment_player_init = undefined; +} + + +function init_player_offhand_weapons() +{ + init_player_lethal_grenade(); + init_player_tactical_grenade(); + init_player_placeable_mine(); + init_player_melee_weapon(); + init_player_hero_weapon(); + zm_equipment::init_player_equipment(); +} + + +function is_offhand_weapon( weapon ) +{ + return (is_lethal_grenade( weapon ) || is_tactical_grenade( weapon ) || is_placeable_mine( weapon ) || is_melee_weapon( weapon ) || is_hero_weapon( weapon ) || zm_equipment::is_equipment( weapon ) ); +} + + +function is_player_offhand_weapon( weapon ) +{ + return (self is_player_lethal_grenade( weapon ) || self is_player_tactical_grenade( weapon ) || self is_player_placeable_mine( weapon ) || self is_player_melee_weapon( weapon ) || self is_player_hero_weapon( weapon ) || self zm_equipment::is_player_equipment( weapon ) ); +} + + +function has_powerup_weapon() +{ + return IS_TRUE( self.has_powerup_weapon ); +} + +function has_hero_weapon() +{ + weapon = self GetCurrentWeapon(); + return IS_TRUE( weapon.isheroweapon ); +} + +function give_start_weapon( b_switch_weapon ) +{ + //DEFAULT( self.hasCompletedSuperEE, self zm_stats::get_global_stat( "DARKOPS_GENESIS_SUPER_EE" ) > 0 ); + /* + if( self.hasCompletedSuperEE ) + { + self zm_weapons::weapon_give( level.start_weapon, false, false, true, false ); + self GiveMaxAmmo( level.start_weapon ); + self zm_weapons::weapon_give( level.super_ee_weapon, false, false, true, b_switch_weapon ); + } + else + { + self zm_weapons::weapon_give( level.start_weapon, false, false, true, b_switch_weapon ); + } + */ + self zm_weapons::weapon_give( level.start_weapon, false, false, true, false ); + self GiveMaxAmmo( level.start_weapon ); + self zm_weapons::weapon_give( level.super_ee_weapon, false, false, true, b_switch_weapon ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +function array_flag_wait_any( flag_array ) +{ + if( !IsDefined ( level._array_flag_wait_any_calls ) ) + { + level._n_array_flag_wait_any_calls = 0; + } + else + { + level._n_array_flag_wait_any_calls ++; // Used to ensure that we can have multiple calls to this concurrently, that don't interfere with each other. + } + + str_condition = "array_flag_wait_call_" + level._n_array_flag_wait_any_calls; + + for(index = 0; index < flag_array.size; index ++) + { + level thread array_flag_wait_any_thread ( flag_array[ index ], str_condition ); + } + + level waittill( str_condition ); + +} + +function array_flag_wait_any_thread( flag_name, condition ) +{ + level endon( condition ); + + level flag::wait_till( flag_name ); + + level notify( condition ); +} + +function groundpos( origin ) +{ + return bullettrace( origin, ( origin + ( 0, 0, -100000 ) ), 0, self )[ "position" ]; +} + +function groundpos_ignore_water( origin ) +{ + return bullettrace( origin, ( origin + ( 0, 0, -100000 ) ), 0, self, true )[ "position" ]; +} + +function groundpos_ignore_water_new( origin ) +{ + return groundtrace( origin, ( origin + ( 0, 0, -100000 ) ), 0, self, true )[ "position" ]; +} + +/@ +"Name: self_delete()" +"Summary: Just calls the delete() script command on self. Reason for this is so that we can use array::thread_all to delete entities" +"Module: Entity" +"CallOn: An entity" +"Example: ai[ 0 ] thread self_delete();" +"SPMP: singleplayer" +@/ +function self_delete() +{ + if (IsDefined(self)) + { + self delete(); + } +} + +/@ +"Name: ignore_triggers( )" +"Summary: Makes the entity that this is threaded on not able to set off triggers for a certain length of time." +"Module: Utility" +"CallOn: an entity" +"Example: guy thread ignore_triggers( 0.2 );" +"SPMP: singleplayer" +@/ +function ignore_triggers( timer ) +{ + // ignore triggers for awhile so others can trigger the trigger we're in. + self endon( "death" ); + self.ignoreTriggers = true; + if( IsDefined( timer ) ) + { + wait( timer ); + } + else + { + wait( 0.5 ); + } + self.ignoreTriggers = false; +} + + + +/@ +"Name: giveachievement_wrapper( , [all_players] )" +"Summary: Gives an Achievement to the specified player" +"Module: Mp" +"MandatoryArg: : The code string for the achievement" +"OptionalArg: [all_players]: If true, then give everyone the achievement" +"Example: player giveachievement_wrapper( "MAK_ACHIEVEMENT_RYAN" );" +"SPMP: singleplayer" +@/ +function giveachievement_wrapper( achievement, all_players ) +{ + if ( achievement == "" ) + { + return; + } + + //don't do stats stuff if stats are disabled + if ( IS_TRUE( level.zm_disable_recording_stats ) ) + { + return; + } + + achievement_lower = tolower(achievement); + global_counter = 0; + + if ( IsDefined( all_players ) && all_players ) + { + players = GetPlayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] GiveAchievement( achievement ); + + has_achievement = false; // T7 DLC5 TODO: players[i] zm_stats::get_global_stat( achievement_lower ); + if(!IS_TRUE(has_achievement)) + { + global_counter++; + } + + // T7 DLC5 TODO: players[i] zm_stats::increment_client_stat( achievement_lower,false ); + + if( issplitscreen() && i == 0 || !issplitscreen() ) + { + if(isDefined(level.achievement_sound_func)) + { + players[i] thread [[level.achievement_sound_func]](achievement_lower); + } + } + } + } + else + { + if ( !IsPlayer( self ) ) + { + /# println( "^1self needs to be a player for util::giveachievement_wrapper()" ); #/ + return; + } + + self GiveAchievement( achievement ); + + //test the stat before updating it from 0 to 1 + has_achievement = false; // T7 DLC5 TODO: self zm_stats::get_global_stat( achievement_lower ); + if(!IS_TRUE(has_achievement)) + { + global_counter++; + } + // T7 DLC5 TODO: self zm_stats::increment_client_stat( achievement_lower,false ); + + if(isDefined(level.achievement_sound_func)) + { + self thread [[level.achievement_sound_func]](achievement_lower); + } + + } + if(global_counter) + { + incrementCounter( "global_" + achievement_lower,global_counter); + } + +} + +function GetYaw(org) +{ + angles = VectorToAngles(org-self.origin); + return angles[1]; +} + + +function GetYawToSpot(spot) +{ + pos = spot; + yaw = self.angles[1] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} + +/* +============= +///ScriptDocBegin +"Name: disable_react()" +"Summary: Disables reaction behavior of given AI" +"Module: Utility" +"CallOn: An ai" +"Example: level.zakhaev disable_react();" +"SPMP: singleplayer" +///ScriptDocEnd +============= +*/ +function disable_react() +{ + assert( isalive( self ), "Tried to disable react on a non ai" ); + self.a.disableReact = true; + self.allowReact = false; +} + + +/* +============= +///ScriptDocBegin +"Name: enable_react()" +"Summary: Enables reaction behavior of given AI" +"Module: Utility" +"CallOn: An ai" +"Example: level.zakhaev enable_react();" +"SPMP: singleplayer" +///ScriptDocEnd +============= +*/ +function enable_react() +{ + assert( isalive( self ), "Tried to enable react on a non ai" ); + self.a.disableReact = false; + self.allowReact = true; +} + +// MikeD (12/15/2007): IW abandoned the auto-adjust feature, however, we can use it for stats? +// SCRIPTER_MOD: JesseS (4/14/2008): Added back in for Arcade mode +function bullet_attack( type ) +{ + if ( type == "MOD_PISTOL_BULLET" ) + { + return true; + } + return type == "MOD_RIFLE_BULLET"; +} + + + +function pick_up() +{ + player = self.owner; + self destroy_ent(); + + clip_ammo = player GetWeaponAmmoClip( self.weapon ); + clip_max_ammo = self.weapon.clipSize; + if( clip_ammo < clip_max_ammo ) + { + clip_ammo++; + } + player SetWeaponAmmoClip( self.weapon, clip_ammo ); +} + +function destroy_ent() +{ + self delete(); +} + + +/@ +"Name: waittill_not_moving()" +"Summary: waits for the object to stop moving" +"Module: Utility" +"CallOn: Object that moves like a thrown grenade" +"Example: self waittill_not_moving();" +"SPMP: singleplayer" +@/ +function waittill_not_moving() +{ + self endon("death"); + self endon( "disconnect" ); + self endon( "detonated" ); + level endon( "game_ended" ); + + if ( self.classname == "grenade" ) + { + self waittill("stationary"); + } + else + { + prevorigin = self.origin; + while(1) + { + wait .15; + if ( self.origin == prevorigin ) + break; + prevorigin = self.origin; + } + } +} + + +/@ +"Name: get_closest_player( )" +"Summary: Returns the closest player to the given origin." +"Module: Coop" +"MandatoryArg: : The vector to use to compare the distances to" +"Example: closest_player = get_closest_player( objective.origin );" +"SPMP: singleplayer" +@/ +function get_closest_player( org ) +{ + players = []; + players = GetPlayers(); + return ArrayGetClosest( org, players ); +} + + +function ent_flag_init_ai_standards() +{ + message_array = []; + + message_array[ message_array.size ] = "goal"; + message_array[ message_array.size ] = "damage"; + + for( i = 0; i < message_array.size; i++) + { + self flag::init( message_array[ i ] ); + self thread ent_flag_wait_ai_standards( message_array[ i ] ); + } +} + +function ent_flag_wait_ai_standards( message ) +{ + /* + only runs the first time on the message, so for + example if it's waiting on goal, it will only set + the goal to true the first time. It also doesn't + call ent_set_flag() because that would notify the + message possibly twice in the same frame, or worse + in the next frame. + */ + self endon("death"); + self waittill( message ); + self.ent_flag[ message ] = true; +} + + +/@ +"Name: flat_angle( )" +"Summary: Returns the specified angle as a flat angle.( 45, 90, 30 ) becomes( 0, 90, 0 ). Useful if you just need an angle around Y - axis." +"Module: Vector" +"CallOn: " +"MandatoryArg: : angles to flatten" +"Example: yaw = flat_angle( node.angles );" +"SPMP: singleplayer" +@/ +function flat_angle( angle ) +{ + rangle = ( 0, angle[ 1 ], 0 ); + return rangle; +} + +/@ +"Name: clear_run_anim()" +"Summary: Clears any set run anims " +"Module: AI" +"CallOn: an actor" +"Example: guy clear_run_anim();" +"SPMP: singleplayer" +@/ +function clear_run_anim() +{ + self.alwaysRunForward = undefined; + self.a.combatrunanim = undefined; + self.run_noncombatanim = undefined; + self.walk_combatanim = undefined; + self.walk_noncombatanim = undefined; + self.preCombatRunEnabled = true; +} + +function track_players_intersection_tracker() +{ + self endon( "disconnect" ); + self endon( "death" ); + level endon( "end_game" ); + + wait( 5 ); + + while ( 1 ) + { + killed_players = false; + players = GetPlayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] laststand::player_is_in_laststand() || "playing" != players[i].sessionstate ) + { + continue; + } + + for ( j = 0; j < players.size; j++ ) + { + if ( i == j || players[j] laststand::player_is_in_laststand() || "playing" != players[j].sessionstate ) + { + continue; + } + + if ( isDefined( level.player_intersection_tracker_override ) ) + { + if ( players[i] [[level.player_intersection_tracker_override]]( players[j] ) ) + { + continue; + } + } + + playerI_origin = players[i].origin; + playerJ_origin = players[j].origin; + + //Check height first + if ( abs(playerI_origin[2] - playerJ_origin[2] ) > 60 ) + continue; + + //Check 2d distance + distance_apart = distance2d( playerI_origin, playerJ_origin ); + //IPrintLnBold( "player=", i, ",", j, "distance_apart=", distance_apart ); + + if ( abs(distance_apart) > 18 ) + continue; + +/# + IPrintLnBold( "PLAYERS ARE TOO FRIENDLY!!!!!" ); +#/ + players[i] dodamage( 1000, (0, 0, 0) ); + players[j] dodamage( 1000, (0, 0, 0) ); + + if ( !killed_players ) + { + players[i] playlocalsound( level.zmb_laugh_alias ); + } + players[i] zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); + players[i] zm_stats::increment_client_stat( "cheat_too_friendly",false ); + players[i] zm_stats::increment_client_stat( "cheat_total",false ); + + players[j] zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); + players[j] zm_stats::increment_client_stat( "cheat_too_friendly",false ); + players[j] zm_stats::increment_client_stat( "cheat_total",false ); + + killed_players = true; + } + } + wait( .5 ); + } +} + +/@ +"Name: is_player_looking_at( , , )" +"Summary: Checks to see if the player can dot and trace to a point" +"Module: Player" +"CallOn: A Player" +"MandatoryArg: The position you're checking if the player is looking at" +"OptionalArg: Optional override dot (between 0 and 1) the higher the number, the more the player has to be looking right at the spot." +"OptionalArg: Set to false to skip the bullet trace check" +"OptionalArg: Ignore ent passed to trace check" +"Example: if ( GetPlayers()[0] is_player_looking_at( org.origin ) )" +"SPMP: zombies" +@/ +function is_player_looking_at(origin, dot, do_trace, ignore_ent) +{ + assert(IsPlayer(self), "player_looking_at must be called on a player."); + + if (!IsDefined(dot)) + { + dot = .7; + } + + if (!IsDefined(do_trace)) + { + do_trace = true; + } + + eye = self util::get_eye(); + + delta_vec = AnglesToForward(VectorToAngles(origin - eye)); + view_vec = AnglesToForward(self GetPlayerAngles()); + + new_dot = VectorDot( delta_vec, view_vec ); + if ( new_dot >= dot ) + { + if (do_trace) + { + return BulletTracePassed( origin, eye, false, ignore_ent ); + } + else + { + return true; + } + } + + return false; +} + + + +/@ +"Name: add_gametype()" +"Summary: dummy - Rex looks for these to populate the gametype pulldown" +"SPMP: zombies" +@/ + +function add_gametype( gt, dummy1, name, dummy2 ) +{ +} + +/@ +"Name: add_gameloc()" +"Summary: dummy - Rex looks for these to populate the location pulldown" +"SPMP: zombies" +@/ + +function add_gameloc( gl, dummy1, name, dummy2 ) +{ +} + +/@ +"Name: get_closest_index( , , )" +"Summary: same as getClosest but returns the closest entity's array index instead of the actual entity." +"Module: Distance" +"CallOn: " +"MandatoryArg: : Origin to be closest to." +"MandatoryArg: : Array of entities to check distance on." +"OptionalArg: : Maximum distance to check" +"Example: " +"SPMP: mp" +@/ +function get_closest_index( org, array, dist ) +{ + if( !IsDefined( dist ) ) + { + dist = 9999999; + } + distsq = dist*dist; + if( array.size < 1 ) + { + return; + } + index = undefined; + for( i = 0;i < array.size;i++ ) + { + newdistsq = distancesquared( array[ i ].origin, org ); + if( newdistsq >= distsq ) + { + continue; + } + distsq = newdistsq; + index = i; + } + return index; +} + +function is_valid_zombie_spawn_point(point) +{ + liftedorigin = point.origin + (0,0,5); + size = 48; + height = 64; + mins = (-1 * size,-1 * size,0 ); + maxs = ( size,size,height ); + absmins = liftedorigin + mins; + absmaxs = liftedorigin + maxs; + // check to see if we would telefrag any players + if ( BoundsWouldTelefrag( absmins, absmaxs ) ) + { + return false; + } + return true; +} + +/@ +"Name: get_closest_index( , , )" +"Summary: same as getClosest but returns the closest entity's array index instead of the actual entity." +"Module: Distance" +"CallOn: " +"MandatoryArg: : Origin to be closest to." +"MandatoryArg: : Array of entities to check distance on." +"OptionalArg: : Maximum distance to check" +"Example: " +"SPMP: mp" +@/ +function get_closest_index_to_entity( entity, array, dist, extra_check ) +{ + org = entity.origin; + if( !IsDefined( dist ) ) + { + dist = 9999999; + } + distsq = dist*dist; + if( array.size < 1 ) + { + return; + } + index = undefined; + for( i = 0;i < array.size;i++ ) + { + if (isdefined(extra_check) && ![[extra_check]](entity,array[ i ]) ) + continue; + newdistsq = distancesquared( array[ i ].origin, org ); + if( newdistsq >= distsq ) + { + continue; + } + distsq = newdistsq; + index = i; + } + return index; +} + +function set_gamemode_var(gvar, val) +{ + if(!isdefined(game["gamemode_match"])) + { + game["gamemode_match"] = []; + } + + game["gamemode_match"][gvar] = val; +} + +function set_gamemode_var_once(gvar, val) +{ + if(!isdefined(game["gamemode_match"])) + { + game["gamemode_match"] = []; + } + + if(!isdefined(game["gamemode_match"][gvar])) + { + game["gamemode_match"][gvar] = val; + } +} + +function set_game_var(gvar, val) +{ + game[gvar] = val; +} + +function set_game_var_once(gvar, val) +{ + if(!isdefined(game[gvar])) + { + game[gvar] = val; + } +} + +function get_game_var( gvar ) +{ + if(isdefined(game[gvar])) + { + return game[gvar]; + } + + return undefined; +} + +function get_gamemode_var( gvar ) +{ + if(isdefined(game["gamemode_match"]) && isdefined(game["gamemode_match"][gvar])) + { + return game["gamemode_match"][gvar]; + } + + return undefined; +} + +function waittill_subset(min_num, string1, string2, string3, string4, string5 ) +{ + self endon ("death"); + ent = SpawnStruct(); + ent.threads = 0; + returned_threads = 0; + + if (IsDefined (string1)) + { + self thread util::waittill_string(string1, ent); + ent.threads++; + } + if (IsDefined (string2)) + { + self thread util::waittill_string(string2, ent); + ent.threads++; + } + if (IsDefined (string3)) + { + self thread util::waittill_string(string3, ent); + ent.threads++; + } + if (IsDefined (string4)) + { + self thread util::waittill_string(string4, ent); + ent.threads++; + } + if (IsDefined (string5)) + { + self thread util::waittill_string(string5, ent); + ent.threads++; + } + + while (ent.threads) + { + ent waittill ("returned"); + ent.threads--; + returned_threads++; + if(returned_threads >= min_num ) //if we've got the minimum number of waittills returned, then that is good enough! + { + break; + } + } + + ent notify ("die"); +} + +function is_headshot( weapon, sHitLoc, sMeansOfDeath ) +{ + if( !isdefined( sHitLoc ) ) + { + return false; + } + + if( (sHitLoc != "head" && sHitLoc != "helmet") ) + { + return false; + } + + //ballsitic knives + if( sMeansofDeath == "MOD_IMPACT" && weapon.isBallisticKnife ) + { + return true; + } + + return sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_IMPACT" && sMeansofDeath != "MOD_UNKNOWN"; +} + +function is_jumping() +{ + // this probably doesn't work correctly on the bus + // checking PMF_JUMPING in code would give more accurate results + ground_ent = self GetGroundEnt(); + return (!isdefined(ground_ent)); +} + +function is_explosive_damage( mod ) +{ + if( !IsDefined( mod ) ) + return false; + + if( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" ) + return true; + + return false; +} + +function sndSwitchAnnouncerVox( who ) +{ + switch( who ) + { + case "sam": + game["zmbdialog"]["prefix"] = "vox_zmba_sam"; + level.zmb_laugh_alias = "zmb_laugh_sam"; + level.sndAnnouncerIsRich = false; + break; + } +} + +function do_player_general_vox(category,type,timer,chance) +{ + + if( isDefined(timer) && isDefined(level.votimer[type]) && level.votimer[type] > 0) + { + return; + } + + self thread zm_audio::create_and_play_dialog( category, type); + + if(isDefined(timer)) + { + level.votimer[type] = timer; + level thread general_vox_timer( level.votimer[type],type ); + } +} + +function general_vox_timer(timer,type) +{ + level endon("end_game"); + + /# println( "ZM >> VOX TIMER STARTED FOR " + type + " ( " + timer + ")" ); #/ + + while(timer > 0 ) + { + wait(1); + timer--; + } + level.votimer[type] = timer; + /# println( "ZM >> VOX TIMER ENDED FOR " + type + " ( " + timer + ")" ); #/ + + +} + +function create_vox_timer(type) +{ + level.votimer[type] = 0; +} + +function play_vox_to_player(category,type,force_variant ) +{ + //self thread zm_audio::playVoxToPlayer( category, type, force_variant ); +} + +function is_favorite_weapon(weapon_to_check) +{ + if(!isDefined(self.favorite_wall_weapons_list)) + { + return false; + } + + foreach(weapon in self.favorite_wall_weapons_list) + { + if (weapon_to_check == weapon ) + { + return true; + } + } + + return false; +} + +function add_vox_response_chance(event,chance) +{ + level.response_chances[event] = chance; +} + +function set_demo_intermission_point() +{ + spawnpoints = getentarray("mp_global_intermission", "classname"); + if ( !spawnpoints.size ) + { + return; + } + + spawnpoint = spawnpoints[0]; + match_string = ""; + + location = level.scr_zm_map_start_location; + if ( (location == "default" || location == "") && IsDefined( level.default_start_location ) ) + { + location = level.default_start_location; + } + + match_string = level.scr_zm_ui_gametype + "_" + location; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( IsDefined( spawnpoints[i].script_string ) ) + { + tokens = strtok( spawnpoints[i].script_string," " ); + foreach ( token in tokens ) + { + if ( token == match_string ) + { + spawnpoint = spawnpoints[i]; + i = spawnpoints.size; // to get out of the outer for loop + break; + } + } + } + } + + setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles ); +} + +function register_map_navcard(navcard_on_map,navcard_needed_for_computer) +{ + level.navcard_needed = navcard_needed_for_computer; + level.map_navcard = navcard_on_map; +} + +function does_player_have_map_navcard(player) +{ + return player zm_stats::get_global_stat( level.map_navcard ); +} + +function does_player_have_correct_navcard(player) +{ + if(!isDefined(level.navcard_needed )) + { + return false; + } + return player zm_stats::get_global_stat( level.navcard_needed ); +} + +function place_navcard( str_model, str_stat, org, angles ) +{ + navcard = spawn("script_model",org); + navcard setmodel( str_model ); + navcard.angles = angles; + + wait 1; // delay between spawning card and picking it up + + navcard_pickup_trig = Spawn( "trigger_radius_use", org, 0, 84, 72 ); + navcard_pickup_trig SetCursorHint( "HINT_NOICON" ); + navcard_pickup_trig SetHintString( &"ZOMBIE_NAVCARD_PICKUP" ); + navcard_pickup_trig TriggerIgnoreTeam(); + + a_navcard_stats = array( "navcard_held_zm_transit", "navcard_held_zm_highrise", "navcard_held_zm_buried" ); + + is_holding_card = false; + str_placing_stat = undefined; + + while(1) + { + navcard_pickup_trig waittill("trigger",who ); + + if( is_player_valid(who) ) + { + // check for any currently held card. If found, clear that stat and save which it was + foreach ( str_cur_stat in a_navcard_stats ) + { + if ( who zm_stats::get_global_stat( str_cur_stat ) ) + { + str_placing_stat = str_cur_stat; + is_holding_card = true; + who zm_stats::set_global_stat( str_cur_stat, 0 ); + } + } + + who playsound( "zmb_buildable_piece_add" ); + who zm_stats::set_global_stat( str_stat, 1 ); + who.navcard_grabbed = str_stat; + util::wait_network_frame(); + + is_stat = who zm_stats::get_global_stat( str_stat ); + + thread sq_refresh_player_navcard_hud(); + break; + } + } + + navcard delete(); + navcard_pickup_trig delete(); + + // if a card was held, place a new card with the stat of the one that was held (set down the old card) + if ( is_holding_card ) + { + level thread place_navcard( str_model, str_placing_stat, org, angles ); + } +} + +function sq_refresh_player_navcard_hud() +{ + if (!IsDefined(level.navcards)) + return; + players = GetPlayers(); + foreach( player in players ) + { + player thread sq_refresh_player_navcard_hud_internal(); + } +} + +function sq_refresh_player_navcard_hud_internal() +{ + self endon("disconnect"); + + navcard_bits = 0; + for(i = 0;i < level.navcards.size; i++) + { + hasit = self zm_stats::get_global_stat( level.navcards[i] ); + if (isdefined(self.navcard_grabbed) && self.navcard_grabbed == level.navcards[i] ) + hasit = 1; + if( hasit ) + { + navcard_bits +=( 1 << i ); + } + } + util::wait_network_frame(); + self clientfield::set( "navcard_held", 0 ); + if ( navcard_bits > 0 ) + { + util::wait_network_frame(); + self clientfield::set( "navcard_held", navcard_bits ); + } +} + + +function disable_player_move_states(forceStanceChange) +{ + self AllowCrouch( true ); + self AllowLean( false ); + self AllowAds( false ); + self AllowSprint( false ); + self AllowProne( false ); + self AllowMelee( false ); + + if((isdefined(forceStanceChange)) && (forceStanceChange == true)) + { + if ( self GetStance() == "prone" ) + { + self SetStance( "crouch" ); + } + } +} + +function enable_player_move_states() +{ + if((!isdefined(self._allow_lean)) || (self._allow_lean == true)) + { + self AllowLean( true ); + } + + if((!isdefined(self._allow_ads)) || (self._allow_ads == true)) + { + self AllowAds( true ); + } + + if((!isdefined(self._allow_sprint)) || (self._allow_sprint == true)) + { + self AllowSprint( true ); + } + + if((!isdefined(self._allow_prone)) || (self._allow_prone == true)) + { + self AllowProne( true ); + } + + if((!isdefined(self._allow_melee)) || (self._allow_melee == true)) + { + self AllowMelee( true ); + } + +} + +function check_and_create_node_lists() +{ + if(!isdefined(level._link_node_list)) + { + level._link_node_list = []; + } + + if(!isdefined(level._unlink_node_list)) + { + level._unlink_node_list = []; + } +} + +function link_nodes(a, b, bDontUnlinkOnMigrate = false) +{ + if(NodesAreLinked(a,b)) + { + return; + } + + check_and_create_node_lists(); + + a_index_string = "" + a.origin; + b_index_string = "" + b.origin; + + if(!isdefined(level._link_node_list[a_index_string])) + { + level._link_node_list[a_index_string] = spawnstruct(); + level._link_node_list[a_index_string].node = a; + level._link_node_list[a_index_string].links = []; + level._link_node_list[a_index_string].ignore_on_migrate = []; + } + + if(!isdefined(level._link_node_list[a_index_string].links[b_index_string])) + { + level._link_node_list[a_index_string].links[b_index_string] = b; // Add a record of the link. + level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = bDontUnlinkOnMigrate; + } + + if(isdefined(level._unlink_node_list[a_index_string])) + { + if(isdefined(level._unlink_node_list[a_index_string].links[b_index_string])) + { + level._unlink_node_list[a_index_string].links[b_index_string] = undefined; // Remove record of earlier unlink + level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; + } + } + +// /# println("Linking node at " + a.origin + " to node at " + b.origin); #/ + + LinkNodes(a,b); +} + +function unlink_nodes(a,b, bDontLinkOnMigrate = false) +{ + if(!NodesAreLinked(a,b)) + { + return; + } + + check_and_create_node_lists(); + + a_index_string = "" + a.origin; + b_index_string = "" + b.origin; + + if(!isdefined(level._unlink_node_list[a_index_string])) + { + level._unlink_node_list[a_index_string] = spawnstruct(); + level._unlink_node_list[a_index_string].node = a; + level._unlink_node_list[a_index_string].links = []; + level._unlink_node_list[a_index_string].ignore_on_migrate = []; + } + + if(!isdefined(level._unlink_node_list[a_index_string].links[b_index_string])) + { + level._unlink_node_list[a_index_string].links[b_index_string] = b; // Add a record of the unlink. + level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = bDontLinkOnMigrate; + } + + + if(isdefined(level._link_node_list[a_index_string])) + { + if(isdefined(level._link_node_list[a_index_string].links[b_index_string])) + { + level._link_node_list[a_index_string].links[b_index_string] = undefined; // Remove record of earlier link. + level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; + } + } + +// /# println("Unlinking node at " + a.origin + " from node at " + b.origin); #/ + + UnlinkNodes(a,b); +} + +//spawn_path_node( (-6392, 4329, 0), (0,0,0), "targetname", "blah" ); + +function spawn_path_node(origin, angles, k1, v1, k2, v2) +{ + if(!isdefined(level._spawned_path_nodes)) + { + level._spawned_path_nodes = []; + } + + node = spawnstruct(); + + node.origin = origin; + node.angles = angles; + node.k1 = k1; + node.v1 = v1; + node.k2 = k2; + node.v2 = v2; + + node.node = spawn_path_node_internal(origin, angles, k1, v1, k2, v2); + + level._spawned_path_nodes[level._spawned_path_nodes.size] = node; + + return node.node; +} + +function spawn_path_node_internal(origin, angles, k1, v1, k2, v2) +{ + if(isdefined(k2)) + { + return SpawnPathNode("node_pathnode", origin, angles, k1, v1, k2, v2); + } + else if(isdefined(k1)) + { + return SpawnPathNode("node_pathnode", origin, angles, k1, v1); + } + else + { + return SpawnPathNode("node_pathnode", origin, angles); + } + + return undefined; +} + +function delete_spawned_path_nodes() +{ +/* if(!isdefined(level._spawned_path_nodes)) + { + return; + } + + //for(i = 0; i < level._spawned_path_nodes.size; i ++) + for(i = level._spawned_path_nodes.size - 1; i > -1; i --) + { + /# println("Deleting spawned path node @ " + level._spawned_path_nodes[i].origin); #/ + DeletePathNode(level._spawned_path_nodes[i].node); + level._spawned_path_nodes[i].node = undefined; + }*/ +} + +function respawn_path_nodes() +{ + if(!isdefined(level._spawned_path_nodes)) + { + return; + } + + for(i = 0; i < level._spawned_path_nodes.size; i ++) + { + node_struct = level._spawned_path_nodes[i]; + + /# println("Re-spawning spawned path node @ " + node_struct.origin); #/ + node_struct.node = spawn_path_node_internal(node_struct.origin, node_struct.angles, node_struct.k1, node_struct.v1, node_struct.k2, node_struct.v2); + } +} + +function link_changes_internal_internal(list, func) +{ + keys = GetArrayKeys(list); + + for(i = 0; i < keys.size; i ++) + { + node = list[keys[i]].node; + + node_keys = GetArrayKeys(list[keys[i]].links); + + for(j = 0; j < node_keys.size; j ++) + { + if(isdefined(list[keys[i]].links[node_keys[j]])) + { + + if(IS_TRUE(list[keys[i]].ignore_on_migrate[node_keys[j]])) + { + /# println("Node at " + keys[i] + " to node at " + node_keys[j] + " - IGNORED"); #/ + } + else + { + /# println("Node at " + keys[i] + " to node at " + node_keys[j]); #/ + [[func]](node, list[keys[i]].links[node_keys[j]]); + } + } + } + } +} + +function link_changes_internal(func_for_link_list, func_for_unlink_list) +{ + if(isdefined(level._link_node_list)) + { + /# println("Link List"); #/ + link_changes_internal_internal(level._link_node_list, func_for_link_list); + } + + if(isdefined(level._unlink_node_list)) + { + /# println("UnLink List"); #/ + link_changes_internal_internal(level._unlink_node_list, func_for_unlink_list); + } +} + +function link_nodes_wrapper(a, b) +{ + if(!NodesAreLinked(a,b)) + { + LinkNodes(a,b); + } +} + +function unlink_nodes_wrapper(a, b) +{ + if(NodesAreLinked(a,b)) + { + UnlinkNodes(a,b); + } +} + +function undo_link_changes() +{ + /# println("***"); + println("***"); + println("*** Undoing link changes"); #/ + + link_changes_internal( &unlink_nodes_wrapper, &link_nodes_wrapper); + + delete_spawned_path_nodes(); + +} + +function redo_link_changes() +{ + /# println("***"); + println("***"); + println("*** Redoing link changes"); #/ + + respawn_path_nodes(); + + link_changes_internal( &link_nodes_wrapper, &unlink_nodes_wrapper); +} + +function is_gametype_active( a_gametypes ) +{ + b_is_gametype_active = false; + + if ( !IsArray( a_gametypes ) ) + { + a_gametypes = Array( a_gametypes ); + } + + for ( i = 0; i < a_gametypes.size; i++ ) + { + if ( GetDvarString( "g_gametype" ) == a_gametypes[ i ] ) + { + b_is_gametype_active = true; + } + } + + return b_is_gametype_active; +} + +function register_custom_spawner_entry( spot_noteworthy, func ) +{ + if ( !IsDefined( level.custom_spawner_entry ) ) + { + level.custom_spawner_entry = []; + } + + level.custom_spawner_entry[ spot_noteworthy ] = func; +} + +function get_player_weapon_limit( player ) +{ + if ( IsDefined( self.get_player_weapon_limit ) ) + { + return [[self.get_player_weapon_limit]]( player ); + } + + if ( IsDefined( level.get_player_weapon_limit ) ) + { + return [[level.get_player_weapon_limit]]( player ); + } + + weapon_limit = 2; + if ( player HasPerk( PERK_ADDITIONAL_PRIMARY_WEAPON ) ) + { + weapon_limit = level.additionalprimaryweapon_limit; + } + + return weapon_limit; +} + +function get_player_perk_purchase_limit() +{ + n_perk_purchase_limit_override = level.perk_purchase_limit; // start with the default value + + // level-specific override + if ( IsDefined( level.get_player_perk_purchase_limit ) ) + { + n_perk_purchase_limit_override = self [[level.get_player_perk_purchase_limit]](); + } + + return n_perk_purchase_limit_override; +} + +function can_player_purchase_perk() +{ + if ( self.num_perks < self zm_utility::get_player_perk_purchase_limit() ) + { + return true; + } + + // you can always buy one more if you currently have unquenchable + if ( self bgb::is_enabled( "zm_bgb_unquenchable" ) || self bgb::is_enabled( "zm_bgb_soda_fountain" ) ) + { + return true; + } + + return false; +} + +// Give player all perks +// b_exclude_quick_revive - if you need to prevent a solo player from getting quick revive +function give_player_all_perks( b_exclude_quick_revive = false ) // self == player +{ + // give the player all the perks in the map + a_str_perks = GetArrayKeys( level._custom_perks ); + + foreach( str_perk in a_str_perks ) + { + if ( str_perk == PERK_QUICK_REVIVE && b_exclude_quick_revive ) + { + continue; + } + + if( !self HasPerk( str_perk ) ) + { + self zm_perks::give_perk( str_perk, false ); + + if ( isdefined( level.perk_bought_func ) ) + { + self [[ level.perk_bought_func ]]( str_perk ); + } + } + } +} + +function wait_for_attractor_positions_complete() +{ + self waittill( "attractor_positions_generated" ); + + self.attract_to_origin = false; +} + +// Migrated from _zm_weapons. +function get_player_index( player ) +{ + assert( IsPlayer( player ) ); + assert( IsDefined( player.characterIndex ) ); + +/# + // used for testing to switch player's VO in-game from devgui + if ( player.entity_num == 0 && GetDvarString( "zombie_player_vo_overwrite" ) != "" ) + { + new_vo_index = GetDvarInt( "zombie_player_vo_overwrite" ); + return new_vo_index; + } +#/ + return player.characterIndex; +} + +// **************************************** +// get_specific_character() returns the player character associated with the index given. +// For zm_zod, the indices are defined as follows: +// #define FLOYD 0 +// #define JACK 1 +// #define ROSE 2 +// #define NERO 3 +// For other levels, indices will differ. +// Copied from zm_factory.gsc +function get_specific_character( n_character_index ) +{ + foreach( character in level.players ) + { + if( character.characterIndex == n_character_index ) + return character; + } + return undefined; +} + +function zombie_goto_round( n_target_round ) +{ + level notify( "restart_round" ); + + if ( n_target_round < 1 ) + { + n_target_round = 1; + } + + level.zombie_total = 0; + zombie_utility::ai_calculate_health( n_target_round ); + zm::set_round_number( n_target_round - 1 ); + + // kill all active zombies + zombies = zombie_utility::get_round_enemy_array(); + if ( isdefined( zombies ) ) + { + array::run_all( zombies, &Kill ); + } + + level.sndGotoRoundOccurred = true; + + level waittill( "between_round_over" ); +} + +// spawn ent at v_point and test if it's touching any enabled zone volume; return true/false +// this is a workaround for not having a good way of testing whether a point or struct is inside a volume for now +// ignore_zone - zone that we don't want to return true from +function is_point_inside_enabled_zone( v_origin, ignore_zone ) +{ + temp_ent = Spawn( "script_origin", v_origin ); + + foreach( zone in level.zones ) + { + // If the zone hasn't been enabled, don't even bother checking + if ( !zone.is_enabled ) + { + continue; + } + + if( isdefined( ignore_zone ) && ( zone == ignore_zone ) ) + { + continue; + } + + // Okay check to see if an entity is in one of the zone volumes + foreach( e_volume in zone.volumes ) + { + if ( temp_ent IsTouching( e_volume ) ) + { + temp_ent Delete(); + return true; + } + } + } + + temp_ent Delete(); + return false; +} + + +function clear_streamer_hint() +{ + if ( IsDefined(self.streamer_hint) ) + { + self.streamer_hint Delete(); + self.streamer_hint = undefined; + } + self notify("wait_clear_streamer_hint"); +} + +function wait_clear_streamer_hint( lifetime ) +{ + self endon("wait_clear_streamer_hint"); + wait lifetime; + if ( IsDefined(self) ) + self clear_streamer_hint(); +} + + +function create_streamer_hint( origin, angles, value, lifetime ) +{ + if ( self == level ) + { + foreach( player in GetPlayers() ) + { + player clear_streamer_hint(); + } + } + self clear_streamer_hint(); + self.streamer_hint = CreateStreamerHint( origin, value ); + if ( IsDefined(angles) ) + self.streamer_hint.angles = angles; + if ( self != level ) + { + self.streamer_hint SetInvisibleToAll(); + self.streamer_hint SetVisibleToPlayer( self ); + } + + self.streamer_hint SetIncludeMeshes( true ); + + self notify("wait_clear_streamer_hint"); + if ( IsDefined(lifetime) && lifetime > 0 ) + { + self thread wait_clear_streamer_hint(lifetime); + } +} + +function approximate_path_dist( player ) +{ + AIProfile_BeginEntry( "approximate_path_dist" ); + + goal_pos = player.origin; + if ( isdefined( player.last_valid_position ) ) + { + goal_pos = player.last_valid_position; + } + + if ( IS_TRUE( player.b_teleporting ) ) + { + if ( isdefined( player.teleport_location ) ) + { + goal_pos = player.teleport_location; + if ( !IsPointOnNavmesh( goal_pos, self ) ) + { + position = GetClosestPointOnNavMesh( goal_pos, 100, 15 ); + if ( IsDefined( position ) ) + { + goal_pos = position; + } + } + } + } + + assert( IsDefined( level.pathdist_type ), "level.pathdist_type must be set before calling PathDistance" ); + + //PathDistance( , , , , , ) + approx_dist = PathDistance( self.origin, goal_pos, true, self, level.pathdist_type ); + + AIProfile_EndEntry(); + + return approx_dist; +} + + + +// Helper function for slowdowns +function register_slowdown( str_type, n_rate, n_duration ) +{ + if ( !isdefined( level.a_n_slowdown_rates ) ) + { + level.a_n_slowdown_rates = []; + } + + level.a_s_slowdowns[ str_type ] = SpawnStruct(); + level.a_s_slowdowns[ str_type ].n_rate = n_rate; + level.a_s_slowdowns[ str_type ].n_duration = n_duration; +} + + +// All-purpose function to slow a zombie. Can handle slowdowns from multiple sources. +// The slowest rate will always be applied first, until it wears out, then the next highest one will be applied. +// str_type is the reason for the slow +// n_rate is the new animation rate +function slowdown_ai( str_type ) +{ + self notify( "starting_slowdown_ai" ); + self endon( "starting_slowdown_ai" ); + self endon( "death" ); + + Assert( isdefined( level.a_s_slowdowns[ str_type ] ), "Slowdown \"" + str_type + "\" must be registered through register_slowdown first" ); + + if ( !isdefined( self.a_n_slowdown_timeouts ) ) + { + self.a_n_slowdown_timeouts = []; + } + + n_time = GetTime(); + n_timeout = n_time + level.a_s_slowdowns[ str_type ].n_duration; + + // See if the slowdown is already being applied + if ( !isdefined( self.a_n_slowdown_timeouts[ str_type ] ) || + self.a_n_slowdown_timeouts[ str_type ] < n_timeout ) + { + self.a_n_slowdown_timeouts[ str_type ] = n_timeout; + } + + // search for the lowest rate and apply that + while ( self.a_n_slowdown_timeouts.size ) + { + str_lowest_type = undefined; + n_lowest_rate = 10.0; + foreach( str_index, n_slowdown_timeout in self.a_n_slowdown_timeouts ) + { + //TODO Make sure clearing an entry doesn't mess up the foreach + // remove old expired times + if ( n_slowdown_timeout <= n_time ) + { + self.a_n_slowdown_timeouts[ str_index ] = undefined; + continue; + } + + if ( level.a_s_slowdowns[ str_index ].n_rate < n_lowest_rate ) + { + str_lowest_type = str_index; + n_lowest_rate = level.a_s_slowdowns[ str_index ].n_rate; + } + } + + if ( isdefined ( str_lowest_type ) ) + { + // Apply the slowest rate + self ASMSetAnimationRate( n_lowest_rate ); + + n_duration = self.a_n_slowdown_timeouts[ str_lowest_type ] - n_time; + wait( n_duration ); + + // Remove slowdown + self.a_n_slowdown_timeouts[ str_lowest_type ] = undefined; + } + } + + // No more slowdowns, return to normal + self ASMSetAnimationRate( 1.0 ); +} + +//***************************************************************************** +//***************************************************************************** + +function get_player_closest_to( e_target ) +{ + a_players= ArrayCopy( level.activeplayers ); + + // If the target is also a player, remove it from the copied array of players. + ArrayRemoveValue( a_players, e_target ); + + e_closest_player = ArrayGetClosest( e_target.origin, a_players ); + + return e_closest_player; +} + +//***************************************************************************** +//***************************************************************************** + +function is_facing( facee, requiredDot = 0.5, b_2d = true ) +{ + orientation = self getPlayerAngles(); + v_forward = anglesToForward( orientation ); + v_to_facee = facee.origin - self.origin; + + if( b_2d ) + { + v_forward_computed = ( v_forward[0], v_forward[1], 0 ); + v_to_facee_computed = ( v_to_facee[0], v_to_facee[1], 0 ); + } + else + { + v_forward_computed = v_forward; + v_to_facee_computed = v_to_facee; + } + + v_unit_forward_computed = VectorNormalize( v_forward_computed ); + v_unit_to_facee_computed = VectorNormalize( v_to_facee_computed ); + + dotProduct = VectorDot( v_unit_forward_computed, v_unit_to_facee_computed ); + return ( dotProduct > requiredDot ); // reviver is facing player within given dot tolerance. +} + +//Returns true if the player is in a solo game that cannot be hotjoined +function is_solo_ranked_game() +{ + return ( level.players.size == 1 && GetDvarInt( "zm_private_rankedmatch", 0 ) ); +} + +function upload_zm_dash_counters( force_upload = false ) {} + +function upload_zm_dash_counters_end_game() {} + +function increment_zm_dash_counter( counter_name, amount ) {} + +function zm_dash_stats_game_start() {} + +function zm_dash_stats_game_end() {} + +function zm_dash_stats_wait_for_consumable_use() {} diff --git a/ui/LobbyMenuButtons.lua b/ui/LobbyMenuButtons.lua new file mode 100644 index 0000000..88703be --- /dev/null +++ b/ui/LobbyMenuButtons.lua @@ -0,0 +1,862 @@ +require( "lua.Shared.LobbyData" ) +require( "ui_mp.T6.Menus.CACUtility" ) + +Engine.SetDvar("scr_firstGumFree", 1) + +Engine.GetInventoryItemQuantity = function() + return 999 +end + +Engine.GetZMVials = function() + return 9999 +end + +Engine.GetLootItemQuantity = function() + return 999 +end + +Engine.GetRank = function() + return 1000 +end + +Engine.GetRankDisplayLevel = function() + return 1000 +end + +Engine.IsItemLocked = function() + return false +end + +Engine.IsItemLockedForAll = function() + return false +end + +Engine.IsItemLockedForRank = function() + return false +end + +Engine.IsItemPurchasedFromBuffer = function() + return true +end + +Engine.IsItemPurchased = function() + return true +end + +Engine.IsItemOptionLocked = function() + return false +end + +Engine.IsLootItemUnlockedByPreRequisites = function() + return true +end + +Engine.IsAttachmentLockedInWeaponBuildKits = function() + return false +end + +Engine.IsAttachmentSlotLocked = function() + return false +end + +Engine.IsItemAttachmentLocked = function() + return false +end + +Engine.GetItemUnlockPLevel = function() + return 0 +end + +Engine.GetItemUnlockLevel = function() + return 0 +end + +Engine.IsEmblemBackgroundLocked = function() + return false +end + +Engine.isRankedGame = function() + return true +end + +Engine.isOnlineGame = function() + return true +end + +Engine.SessionMode_IsOnlineGame = function() + return true +end + +Engine.GetChallengeCompleteForChallengeIndex = function() + return true +end + +IsLive = function() + return true +end + +IsProgressionEnabled = function() + return true +end + +CoD.LobbyButtons = {} +CoD.LobbyButtons.DISABLED = 1 +CoD.LobbyButtons.HIDDEN = 2 +CoD.LobbyButtons.STARTERPACK_UPGRADE = 3 +local f0_local0 = function ( f1_arg0 ) + local f1_local0 = Engine.GetMostRecentPlayedMode( Engine.GetPrimaryController() ) + local f1_local1 = Engine.ToUpper( Dvar.ui_gametype:get() ) + if f1_local0 == Enum.eModes.MODE_CAMPAIGN and f1_local1 == "DOA" then + return true + elseif f1_local0 == Enum.eModes.MODE_CAMPAIGN and f1_local1 == "CPZM" then + return true + elseif f1_local0 == Enum.eModes.MODE_MULTIPLAYER and f1_local1 == "FR" then + return true + else + return false + end +end + +function IsMostRecentSessionMode( f2_arg0 ) + local f2_local0 = Engine.GetMostRecentPlayedMode( Engine.GetPrimaryController() ) + if f0_local0( f2_arg0 ) then + return false + else + return f2_local0 == f2_arg0 + end +end + +function IsMpUnavailable() + if CoD.isPC then + return not Engine.IsMpOwned() + else + return Engine.IsMpInitialStillDownloading() + end +end + +local f0_local1 = function () + if CoD.isPC then + local f4_local0 = Engine.IsMpOwned() + local f4_local1 = Engine.GetLobbyNetworkMode() == Enum.LobbyNetworkMode.LOBBY_NETWORKMODE_LIVE + local f4_local2 = Engine.IsShipBuild() + local f4_local3 = Mods_IsUsingMods() + local f4_local4 + if f4_local0 then + if not f4_local3 and not f4_local1 then + f4_local4 = f4_local2 + else + f4_local4 = false + end + else + f4_local4 = true + end + return f4_local4 + end + local f4_local0 = Engine.IsMpInitialStillDownloading() + if not f4_local0 then + f4_local0 = Engine.IsMpStillDownloading() + end + return f4_local0 +end + +local f0_local2 = function () + if CoD.isPC then + return not Engine.IsZmOwned() + else + return Engine.IsZmInitialStillDownloading() + end +end + +local f0_local3 = function () + if CoD.isPC then + return not Engine.IsZmOwned() + end + local f6_local0 = Engine.IsZmInitialStillDownloading() + if not f6_local0 then + f6_local0 = Engine.IsZmStillDownloading() + end + return f6_local0 +end + +function IsCpUnavailable() + if CoD.isPC then + return not Engine.IsCpOwned() + else + return Engine.IsCpStillDownloading() + end +end + +local f0_local4 = function () + local f8_local0 = Engine.IsCpStillDownloading() + if not f8_local0 then + f8_local0 = f0_local3() + end + return f8_local0 +end + +local f0_local5 = function () + local f9_local0 = IsMpUnavailable() + if not f9_local0 then + f9_local0 = Engine.IsMpStillDownloading() + end + return f9_local0 +end + +local f0_local6 = function () + local f10_local0 = f0_local2() + if not f10_local0 then + f10_local0 = Engine.IsZmStillDownloading() + end + return f10_local0 +end + +local f0_local7 = function () + local f11_local0 = Engine.IsCpStillDownloading() + if not f11_local0 then + f11_local0 = Engine.IsZmStillDownloading() + if not f11_local0 then + f11_local0 = Engine.IsMpStillDownloading() + end + end + return f11_local0 +end + +local f0_local8 = function () + local f12_local0 + if Engine.GetLobbyClientCount( Enum.LobbyType.LOBBY_TYPE_GAME ) <= 1 and Engine.GetUsedControllerCount() <= 1 and Engine.GetLobbyClientCount( Enum.LobbyType.LOBBY_TYPE_GAME ) ~= 0 then + f12_local0 = false + else + f12_local0 = true + end + return f12_local0 +end + +function MPStartCustomButtonDisabled() + if MapVoteTimerActive() then + return true + elseif Engine.GetLobbyClientCount( Enum.LobbyModule.LOBBY_MODULE_HOST, Enum.LobbyType.LOBBY_TYPE_GAME, Enum.LobbyClientType.LOBBY_CLIENT_TYPE_SPLITSCREEN_ALL ) > 0 and CompetitiveSettingsEnabled() then + return true + else + return CoD.LobbyUtility.IsSomePlayersDoNotHaveMapTextShowing() + end +end + +function ZMStartCustomButtonDisabled() + if MapVoteTimerActive() then + return true + else + return CoD.LobbyUtility.IsSomePlayersDoNotHaveMapTextShowing() + end +end + +local f0_local9 = function () + return false +end + +function StoreButtonOpenSteamStore( f16_arg0, f16_arg1, f16_arg2, f16_arg3, f16_arg4 ) + if IsStarterPack( f16_arg2 ) then + OpenSteamStore( f16_arg0, f16_arg1, f16_arg2, 437351, f16_arg4 ) + else + OpenSteamStore( f16_arg0, f16_arg1, f16_arg2, f16_arg3, f16_arg4 ) + end +end + +CoD.LobbyButtons.BONUSMODES_ONLINE = { + stringRef = "MENU_BONUSMODES", + action = OpenBonusModesFlyout, + customId = "btnBonusModes", + selectedFunc = f0_local0 +} +CoD.LobbyButtons.BONUSMODES_LAN = { + stringRef = "MENU_BONUSMODES", + action = OpenBonusModesFlyout, + customId = "btnBonusModes", + selectedFunc = f0_local0 +} +CoD.LobbyButtons.MODS_LOAD = { + stringRef = "MENU_MODS_CAPS", + action = Mods_OpenLoadMenu, + customId = "btnModsLoad", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_ONLINE = { + stringRef = "MENU_SINGLEPLAYER_CAPS", + action = NavigateCheckForFirstTime, + param = { + targetName = "CPLobbyOnline", + mode = Enum.eModes.MODE_CAMPAIGN, + firstTimeFlowAction = OpenCPFirstTimeFlow + }, + customId = "btnCP", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_CAMPAIGN, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + disabledFunc = IsCpUnavailable +} +CoD.LobbyButtons.CP_LAN = { + stringRef = "MENU_SINGLEPLAYER_CAPS", + action = NavigateCheckForFirstTime, + param = { + targetName = "CPLobbyLANGame", + mode = Enum.eModes.MODE_CAMPAIGN, + firstTimeFlowAction = OpenCPFirstTimeFlow + }, + customId = "btnCP", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_CAMPAIGN, + demo_gamescom = CoD.LobbyButtons.HIDDEN, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + disabledFunc = IsCpUnavailable +} +CoD.LobbyButtons.CPZM_ONLINE = { + stringRef = "MENU_SINGLEPLAYER_NIGHTMARES_CAPS", + action = NavigateToLobby_SelectionListCampaignZombies, + param = { + targetName = "CP2LobbyOnline", + mode = Enum.eModes.MODE_CAMPAIGN, + firstTimeFlowAction = OpenCPFirstTimeFlow + }, + customId = "btnCPZM", + disabledFunc = f0_local4, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + visibleFunc = ShouldShowNightmares +} +CoD.LobbyButtons.CPZM_LAN = { + stringRef = "MENU_SINGLEPLAYER_NIGHTMARES_CAPS", + action = NavigateToLobby_SelectionListCampaignZombies, + param = { + targetName = "CP2LobbyLANGame", + mode = Enum.eModes.MODE_CAMPAIGN, + firstTimeFlowAction = OpenCPFirstTimeFlow + }, + customId = "btnCPZM", + demo_gamescom = CoD.LobbyButtons.HIDDEN, + disabledFunc = f0_local4, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + visibleFunc = ShouldShowNightmares +} +CoD.LobbyButtons.MP_ONLINE = { + stringRef = "MENU_MULTIPLAYER_CAPS", + action = NavigateCheckForFirstTime, + param = { + targetName = "MPLobbyMain", + mode = Enum.eModes.MODE_MULTIPLAYER, + firstTimeFlowAction = OpenMPFirstTimeFlow + }, + customId = "btnMP", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_MULTIPLAYER, + disabledFunc = f0_local1 +} +CoD.LobbyButtons.MP_PUBLIC_MATCH = { + stringRef = "MENU_MATCHMAKING_CAPS", + action = NavigateToLobby_SelectionList, + param = "MPLobbyOnline", + customId = "btnPublicMatch", + disabledFunc = f0_local1, + unloadMod = true +} +CoD.LobbyButtons.MP_ARENA = { + stringRef = "MENU_ARENA_CAPS", + action = NavigateToLobby_SelectionList, + param = "MPLobbyOnlineArena", + customId = "btnArena", + unloadMod = true +} +CoD.LobbyButtons.MP_LAN = { + stringRef = "MENU_MULTIPLAYER_CAPS", + action = NavigateToLobby_SelectionList, + param = "MPLobbyLANGame", + customId = "btnMP", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_MULTIPLAYER, + demo_gamescom = CoD.LobbyButtons.HIDDEN, + disabledFunc = f0_local1 +} +CoD.LobbyButtons.ZM_ONLINE = { + stringRef = "MENU_ZOMBIES_CAPS", + action = NavigateToLobby_SelectionList, + param = "ZMLobbyOnline", + customId = "btnZM", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_ZOMBIES, + disabledFunc = f0_local3, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_LAN = { + stringRef = "MENU_ZOMBIES_CAPS", + action = NavigateToLobby_SelectionList, + param = "ZMLobbyLANGame", + customId = "btnZM", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_ZOMBIES, + demo_gamescom = CoD.LobbyButtons.HIDDEN, + disabledFunc = f0_local2, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.FR_LAN = { + stringRef = "MENU_FREERUN_CAPS", + action = NavigateToLobby_SelectionList, + param = "FRLobbyLANGame", + customId = "btnFRLan", + selectedFunc = IsMostRecentSessionMode, + selectedParam = Enum.eModes.MODE_MULTIPLAYER, + disabledFunc = IsMpUnavailable +} +CoD.LobbyButtons.THEATER_MP = { + stringRef = "MENU_THEATER_CAPS", + action = NavigateToLobby_SelectionList, + param = "MPLobbyOnlineTheater", + customId = "btnTheater", + disabledFunc = f0_local5, + unloadMod = true +} +CoD.LobbyButtons.THEATER_ZM = { + stringRef = "MENU_THEATER_CAPS", + action = NavigateToLobby_SelectionList, + param = "ZMLobbyOnlineTheater", + customId = "btnTheater", + disabledFunc = f0_local6, + unloadMod = true +} +CoD.LobbyButtons.PLAY_LOCAL = { + stringRef = "MENU_PLAY_LOCAL_CAPS", + action = OpenLobbyToggleNetworkConfirmation, + customId = "btnPlayLocal" +} +CoD.LobbyButtons.PLAY_ONLINE = { + stringRef = "XBOXLIVE_PLAY_ONLINE_CAPS", + action = OpenLobbyToggleNetworkConfirmation, + customId = "btnPlayLocal", + disabledFunc = CoD.LobbyBase.ChunkAllDownloading +} +CoD.LobbyButtons.STORE = { + stringRef = "MENU_STORE_CAPS", + action = OpenStore, + customId = "btnStore", + param = "StoreButton", + disabledFunc = DisableStore +} +CoD.LobbyButtons.STEAM_STORE = { + stringRef = "MENU_STORE_CAPS", + action = StoreButtonOpenSteamStore, + customId = "btnSteamStore", + param = "StoreButton", + disabledFunc = DisableSteamStore +} +CoD.LobbyButtons.FIND_LAN_GAME = { + stringRef = "PLATFORM_FIND_LAN_GAME", + action = OpenFindLANGame, + customId = "btnFindGame" +} +CoD.LobbyButtons.QUIT = { + stringRef = "MENU_QUIT_CAPS", + action = OpenPCQuit, + customId = "btnQuit" +} +CoD.LobbyButtons.BLACK_MARKET = { + stringRef = "MENU_BLACK_MARKET", + action = OpenBlackMarket, + customId = "btnBlackMarket", + newBreadcrumbFunc = IsBlackMarketBreadcrumbActive, + disabledFunc = DisableBlackMarket +} +CoD.LobbyButtons.CP_START_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = StartNewGame, + customId = "btnStartMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_LAN_START_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = StartNewGame, + customId = "btnStartMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_RESUME_GAME = { + stringRef = "MENU_RESUMESTORY_CAPS", + action = ResumeFromCheckpoint, + customId = "btnResumeGame", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_GOTO_SAFEHOUSE = { + stringRef = "MENU_GOTO_SAFEHOUSE_CAPS", + action = GotoSafehouse, + customId = "btnGotoSafehouse", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_RESUME_GAME_LAN = { + stringRef = "MENU_RESUMESTORY_CAPS", + action = ResumeFromCheckpoint, + customId = "btnResumeGame", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_LAN_REPLAY_MISSION = { + stringRef = "MENU_REPLAY_MISSION_CAPS", + action = ReplaySelectedMission, + customId = "btnReplayMission", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_JOIN_PUBLIC_GAME = { + stringRef = "MENU_JOIN_PUBLIC_GAME_CAPS", + action = OpenPublicGameSelect, + customId = "btnJoinPublicGame", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + unloadMod = true +} +CoD.LobbyButtons.CP_MISSION_OVERVIEW = { + stringRef = "MENU_MISSION_OVERVIEW_CAP", + action = OpenMissionOverview, + customId = "btnMissionOverview", + disabledFunc = GrayOutMissionOverviewButton, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_SELECT_MISSION = { + stringRef = "MENU_SELECT_MISSION_CAPS", + action = OpenMissionSelect, + customId = "btnSelectMission", + disabledFunc = GrayOutReplayMissionButton, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_CHOOSE_DIFFICULTY = { + stringRef = "MENU_CHANGE_DIFFICULTY_CAPS", + action = OpenDifficultySelect, + customId = "btnChooseDifficulty", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CP_CUSTOM_START_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = LobbyOnlineCustomLaunchGame_SelectionList, + customId = "btnStartGame", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CPZM_START_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = StartNewGame, + customId = "btnStartMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CPZM_RESUME_GAME = { + stringRef = "MENU_RESUMESTORY_CAPS", + action = ResumeFromCheckpoint, + customId = "btnResumeGame", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.CPZM_FIND_MATCH = { + stringRef = "MPUI_FIND_MATCH_CAPS", + action = OpenFindMatch, + customId = "btnFindMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + unloadMod = true +} +CoD.LobbyButtons.CPZM_SELECT_MISSION = { + stringRef = "MENU_SELECT_MISSION_CAPS", + action = OpenMissionSelect, + customId = "btnSelectMission", + disabledFunc = GrayOutReplayMissionButton, + demo_CP = CoD.LobbyButtons.HIDDEN, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.MP_FIND_MATCH = { + stringRef = "MPUI_FIND_MATCH_CAPS", + action = OpenFindMatch, + customId = "btnFindMatch", + disabledFunc = f0_local1, + unloadMod = true +} +CoD.LobbyButtons.MP_CUSTOM_GAMES = { + stringRef = "MENU_CUSTOMGAMES_CAPS", + action = NavigateToLobby_SelectionList, + param = "MPLobbyOnlineCustomGame", + customId = "btnCustomMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.MP_CAC = { + stringRef = "MENU_CREATE_A_CLASS_CAPS", + action = OpenCAC, + customId = "btnCAC", + newBreadcrumbFunc = "IsCACAnythingInCACItemNew", + warningFunc = CoD.CACUtility.AnyClassContainsRestrictedItems +} +CoD.LobbyButtons.MP_CAC_NO_WARNING = { + stringRef = CoD.LobbyButtons.MP_CAC.stringRef, + action = CoD.LobbyButtons.MP_CAC.action, + customId = CoD.LobbyButtons.MP_CAC.customId, + newBreadcrumbFunc = CoD.LobbyButtons.MP_CAC.newBreadcrumbFunc +} +CoD.LobbyButtons.MP_SPECIALISTS = { + stringRef = "MPUI_HEROES_CAPS", + action = OpenChooseCharacterLoadout, + param = LuaEnums.CHOOSE_CHARACTER_OPENED_FROM.LOBBY, + customId = "btnSpecialists", + newBreadcrumbFunc = IsCACAnySpecialistsNew, + warningFunc = EquippedSpecialistBanned +} +CoD.LobbyButtons.MP_SPECIALISTS_NO_WARNING = { + stringRef = CoD.LobbyButtons.MP_SPECIALISTS.stringRef, + action = CoD.LobbyButtons.MP_SPECIALISTS.action, + param = CoD.LobbyButtons.MP_SPECIALISTS.param, + customId = CoD.LobbyButtons.MP_SPECIALISTS.customId, + newBreadcrumbFunc = CoD.LobbyButtons.MP_SPECIALISTS.newBreadcrumbFunc +} +CoD.LobbyButtons.MP_SCORESTREAKS = { + stringRef = "MENU_SCORE_STREAKS_CAPS", + action = OpenScorestreaks, + customId = "btnScorestreaks", + newBreadcrumbFunc = IsCACAnyScorestreaksNew, + warningFunc = CoD.CACUtility.AnyEquippedScorestreaksBanned +} +CoD.LobbyButtons.MP_CODCASTER_SETTINGS = { + stringRef = "CODCASTER_CAPS", + action = OpenEditCodcasterSettings, + customId = "btnCodcasterSettings", + disabledFunc = ShouldDisableEditCodCasterSettingsButton, + visibleFunc = ShouldShowEditCodCasterSettingsButton +} +CoD.LobbyButtons.MP_INVENTORY_TEST = { + stringRef = "DW Inventory Test", + action = OpenTest, + customId = "btnInventoryTest" +} +CoD.LobbyButtons.MP_PUBLIC_LOBBY_LEADERBOARD = { + stringRef = "MENU_CUSTOM_LOBBY_LEADERBOARDS_CAPS", + action = OpenMPPublicLobbyLeaderboard, + customId = "btnLobbyLeaderboard" +} +CoD.LobbyButtons.MP_CUSTOM_LOBBY_LEADERBOARD = { + stringRef = "MENU_CUSTOM_LOBBY_LEADERBOARDS_CAPS", + action = OpenMPCustomLobbyLeaderboard, + customId = "btnLobbyLeaderboard" +} +CoD.LobbyButtons.MP_CUSTOM_START_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = LobbyOnlineCustomLaunchGame_SelectionList, + customId = "btnStartGame", + disabledFunc = MPStartCustomButtonDisabled, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.MP_CUSTOM_SETUP_GAME = { + stringRef = "MPUI_SETUP_GAME_CAPS", + action = OpenSetupGameMP, + customId = "btnSetupGame", + disabledFunc = MapVoteTimerActive +} +CoD.LobbyButtons.MP_ARENA_FIND_MATCH = { + stringRef = "MENU_FIND_ARENA_MATCH_CAPS", + action = NavigateToLobby_SelectionList, + param = "MPLobbyOnlineArenaGame", + customId = "btnArenaFindMatch", + disabledFunc = f0_local1, + unloadMod = true +} +CoD.LobbyButtons.MP_ARENA_SELECT_ARENA = { + stringRef = "MENU_SELECT_ARENA_CAPS", + action = OpenCompetitivePlaylist, + customId = "btnSelectArena", + disabledFunc = f0_local1, + unloadMod = true +} +CoD.LobbyButtons.MP_ARENA_LEADERBOARD = { + stringRef = "MENU_LEADERBOARDS_CAPS", + action = OpenArenaMasterLeaderboards, + actionParam = 0, + customId = "btnLeaderboards", + disabledFunc = function () + return IsBooleanDvarSet( "tu1_build" ) + end +} +CoD.LobbyButtons.FR_ONLINE = { + stringRef = "MENU_FREERUN_CAPS", + action = NavigateToLobby_SelectionList, + param = "FRLobbyOnlineGame", + customId = "btnFROnline", + disabledFunc = IsMpUnavailable +} +CoD.LobbyButtons.FR_LEADERBOARD = { + stringRef = "MENU_LEADERBOARDS_CAPS", + action = OpenFreerunLeaderboards, + actionParam = 0, + customId = "btnLeaderboards", + disabledFunc = function () + return IsBooleanDvarSet( "tu1_build" ) + end +} +CoD.LobbyButtons.ZM_SOLO_GAME = { + stringRef = "MENU_SOLO_GAME_CAPS", + action = OpenZMMapSelectLaunch, + customId = "btnSoloMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_FIND_MATCH = { + stringRef = "MENU_JOIN_PUBLIC_GAME_CAPS", + action = OpenZMFindMatch, + customId = "btnFindMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE, + unloadMod = true +} +CoD.LobbyButtons.ZM_CUSTOM_GAMES = { + stringRef = "MENU_PRIVATE_GAME_CAPS", + action = NavigateToLobby_SelectionList, + param = "ZMLobbyOnlineCustomGame", + customId = "btnCustomMatch", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_READY_UP = { + stringRef = "MPUI_VOTE_TO_START_CAPS", + action = SetPlayerReady, + customId = "btnReadyUp", + disabledFunc = f0_local9 +} +CoD.LobbyButtons.ZM_BUBBLEGUM_BUFFS = { + stringRef = "MENU_BUBBLEGUM_BUFFS_CAPS", + action = OpenBubbleGumPacksMenu, + customId = "btnBubblegumBuffs", + newBreadcrumbFunc = IsCACAnyBubblegumNew, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_MEGACHEW_FACTORY = { + stringRef = "MENU_MEGACHEW_FACTORY_CAPS", + action = OpenMegaChewFactorymenu, + customId = "btnMegaChewFactory", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_GOBBLEGUM_RECIPES = { + stringRef = "MENU_NEWTONS_COOKBOOK_CAPS", + action = OpenGobbleGumCookbookMenu, + customId = "btnGobbleGumRecipes", + visibleFunc = function () + return IsIntDvarNonZero( "tu18_enable_newtons_cookbook" ) + end, + newBreadcrumbFunc = IsNewtonsCookbookBreadcrumbActive +} +CoD.LobbyButtons.ZM_BUILD_KITS = { + stringRef = "MENU_WEAPON_BUILD_KITS_CAPS", + action = OpenWeaponBuildKits, + customId = "btnWeaponBuildKits", + newBreadcrumbFunc = Gunsmith_AnyNewWeaponsOrAttachments, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_LOBBY_LEADERBOARD = { + stringRef = "MENU_LOBBY_LEADERBOARD_CAPS", + action = LobbyNoAction, + customId = "btnLobbyLeaderboard", + disabledFunc = function () + return IsBooleanDvarSet( "tu1_build" ) + end +} +CoD.LobbyButtons.ZM_START_CUSTOM_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = LobbyOnlineCustomLaunchGame_SelectionList, + customId = "btnStartCustomGame", + disabledFunc = ZMStartCustomButtonDisabled, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_START_LAN_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = LobbyLANLaunchGame, + customId = "btnStartLanGame", + disabledFunc = MapVoteTimerActive, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_CHANGE_MAP = { + stringRef = "MPUI_CHANGE_MAP_CAPS", + action = OpenChangeMapZM, + customId = "btnChangeMap", + disabledFunc = MapVoteTimerActive, + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_CHANGE_RANKED_SETTTINGS = { + stringRef = "MENU_CHANGE_RANKED_SETTINGS_CAPS", + action = OpenChangeRankedSettingsPopup, + customId = "btnChangeRankedSettings", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.ZM_SERVER_SETTINGS = { + stringRef = "PLATFORM_SERVER_SETTINGS_CAPS", + action = OpenServerSettings, + customId = "btnServerSettings", + starterPack = CoD.LobbyButtons.STARTERPACK_UPGRADE +} +CoD.LobbyButtons.FR_START_RUN_ONLINE = { + stringRef = "MENU_START_RUN_CAPS", + action = LobbyOnlineCustomLaunchGame_SelectionList, + customId = "btnStartRun", + disabledFunc = MapVoteTimerActive +} +CoD.LobbyButtons.FR_START_RUN_LAN = { + stringRef = "MENU_START_RUN_CAPS", + action = LobbyLANLaunchGame, + customId = "btnStartRun", + disabledFunc = MapVoteTimerActive +} +CoD.LobbyButtons.FR_CHANGE_MAP = { + stringRef = "MENU_FREERUN_COURSES_CAPS", + action = OpenFreerunMapSelection, + customId = "btnChangeMap", + disabledFunc = MapVoteTimerActive +} +CoD.LobbyButtons.TH_START_FILM = { + stringRef = "MENU_START_CAPS", + action = LobbyTheaterStartFilm, + customId = "btnStartFilm", + disabledFunc = IsStartFilmButtonDisabled +} +CoD.LobbyButtons.TH_SELECT_FILM = { + stringRef = "MENU_SELECT_CAPS", + action = OpenTheaterSelectFilm, + customId = "btnSelectFilm", + disabledFunc = MapVoteTimerActive, + selectedFunc = IsFilmNotSelected +} +CoD.LobbyButtons.TH_CREATE_HIGHLIGHT = { + stringRef = "MPUI_HIGHLIGHT_REEL_CAPS", + action = LobbyTheaterCreateHighlightReel, + customId = "btnCreateHighlightReel", + disabledFunc = IsCreateHighlightReelButtonDisabled +} +CoD.LobbyButtons.TH_SHOUTCAST = { + stringRef = "MPUI_SHOUTCAST_FILM_CAPS", + action = LobbyTheaterShoutcastFilm, + customId = "btnCoDCastFilm", + disabledFunc = IsShoutcastFilmButtonDisabled +} +CoD.LobbyButtons.TH_RENDER = { + stringRef = "MENU_DEMO_RENDER_CLIP_CAPS", + customId = "btnRenderVideo", + disabledFunc = AlwaysTrue +} +CoD.LobbyButtons.TH_OPTIONS = { + stringRef = "MENU_FILM_OPTIONS", + customId = "btnFilmOptions", + disabledFunc = AlwaysTrue +} +CoD.LobbyButtons.CP_DOA_START_GAME = { + stringRef = "MENU_START_GAME_CAPS", + action = StartDOAGame, + customId = "bthDOAStartMatch" +} +CoD.LobbyButtons.CP_DOA_JOIN_PUBLIC_GAME = { + stringRef = "MENU_JOIN_PUBLIC_GAME_CAPS", + action = LaunchDOAJoin, + customId = "btnJoinPublicGame", + unloadMod = true +} +CoD.LobbyButtons.CP_DOA_CREATE_PUBLIC_GAME = { + stringRef = "MENU_CREATE_PUBLIC_GAME_CAPS", + action = LaunchDOACreate, + customId = "btnJCreatePublicGame", + unloadMod = true, + disabledFunc = function () + local f21_local0, f21_local1 = Engine.CanHostServer( Engine.GetPrimaryController(), Engine.GetLobbyMaxClients( Enum.LobbyType.LOBBY_TYPE_GAME ) ) + return not f21_local0 + end +} +CoD.LobbyButtons.CP_DOA_LEADERBOARD = { + stringRef = "MENU_LEADERBOARDS_CAPS", + action = OpenDOALeaderboards, + actionParam = 0, + customId = "btnLeaderboards", + disabledFunc = function () + return IsBooleanDvarSet( "tu1_build" ) + end +} diff --git a/zone_source/all/assetinfo/core_mod.csv b/zone_source/all/assetinfo/core_mod.csv new file mode 100644 index 0000000..38f7815 --- /dev/null +++ b/zone_source/all/assetinfo/core_mod.csv @@ -0,0 +1,9 @@ +index,type,name,resident,streamed,parentStack +1,string,,0,0,||assetlist +2,stringtable,gamedata/stats/zm/zm_statstable.csv,75284,0,|zone_source/core_mod.zone|csv +3,rawfile,mod.cfg,13,0,|zone_source/core_mod.zone|csv +4,rawfile,cp_mod.cfg,16,0,|zone_source/core_mod.zone|csv +5,rawfile,mp_mod.cfg,16,0,|zone_source/core_mod.zone|csv +6,rawfile,zm_mod.cfg,16,0,|zone_source/core_mod.zone|csv +7,keyvaluepairs,core_mod,1095,0,||assetlist +8,assetlist,,96,0, diff --git a/zone_source/all/assetinfo/core_mod.deps b/zone_source/all/assetinfo/core_mod.deps new file mode 100644 index 0000000..665f6c4 --- /dev/null +++ b/zone_source/all/assetinfo/core_mod.deps @@ -0,0 +1,33 @@ +version,3421953,593 +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_common +stringtable,gamedata/stats/zm/zm_statstable.csv + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\gamedata\stats\zm\zm_statstable.csv,1645414572, +rawfile,mod.cfg + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\mod.cfg,1648552010, +rawfile,cp_mod.cfg + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\cp_mod.cfg,1648552010, +rawfile,mp_mod.cfg + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\mp_mod.cfg,1648552010, +rawfile,zm_mod.cfg + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\zm_mod.cfg,1648552010, +texturecombo,core_mod +assetlist,core_mod + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\gamedata\playeranim\playeranimtypes.txt,1648526392, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\zone_source\core_mod.zone,1664569776,c32d835d,d96d20f8,13121b2a,9338ea83 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\core_mod.class,1648526465, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\core.class,1648526391, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\default.class,1648526548, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\mod_default.class,1648526548, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\base_patch.zpkg,1648526553,5a76b7f7,40123946,eb5bedee,b0ac8d77 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_pre_gfx.csv,1648526740,9a291896,f3713a9b,75a0b66e,703a40af + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_patch.csv,1648526752,414521c8,b00c4bd2,1cb776ba,dd6e2742 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_gfx.csv,1648526675,eb35b869,6f0759a0,375b27d8,7e4abcbc + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_post_gfx.csv,1648526752,c5b160fe,8def529b,2bc851dc,de320c91 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_ui.csv,1648526699,6eac37ef,af745f35,9f02acd6,5ef64937 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_common.csv,1648522383,019dcec6,25201477,4f369f35,6e14d2d0 +errorcount,0 diff --git a/zone_source/all/assetinfo/core_mod_bulletreport.csv b/zone_source/all/assetinfo/core_mod_bulletreport.csv new file mode 100644 index 0000000..9bd3ec2 --- /dev/null +++ b/zone_source/all/assetinfo/core_mod_bulletreport.csv @@ -0,0 +1 @@ +xmodel,avgArea (min 50.0),triCount (max 0),dimX,dimY,dimZ,volume,refs diff --git a/zone_source/all/assetinfo/core_mod_poolinfo.csv b/zone_source/all/assetinfo/core_mod_poolinfo.csv new file mode 100644 index 0000000..089e155 --- /dev/null +++ b/zone_source/all/assetinfo/core_mod_poolinfo.csv @@ -0,0 +1,104 @@ +type,limit,total +physpreset,276,0 +physconstraints,128,0 +destructibledef,128,0 +xanim,25000,0 +xmodel,10240,0 +xmodelmesh,34816,0 +material,20480,0 +computeshaderset,256,0 +techset,1024,0 +image,49152,0 +sound,32,0 +sound_patch,16,0 +col_map,2,0 +com_map,2,0 +game_map,2,0 +map_ents,2,0 +gfx_map,2,0 +lightdef,32,0 +lensflaredef,64,0 +ui_map,0,0 +font,16,0 +fonticon,16,0 +localize,25600,0 +weapon,1536,0 +weapondef,0,0 +weaponvariant,0,0 +weaponfull,0,0 +cgmediatable,5,0 +playersoundstable,16,0 +playerfxtable,16,0 +sharedweaponsounds,64,0 +attachment,128,0 +attachmentunique,2148,0 +weaponcamo,512,0 +customizationtable,8,0 +customizationtable_feimages,8,0 +customizationtablecolor,1024,0 +snddriverglobals,1,0 +fx,1875,0 +tagfx,64,0 +klf,64,0 +impactsfxtable,256,0 +impactsoundstable,64,0 +player_character,8,0 +aitype,96,0 +character,150,0 +xmodelalias,48,0 +rawfile,5000,4 +stringtable,200,1 +structuredtable,96,0 +leaderboarddef,256,0 +ddl,64,0 +glasses,2,0 +texturelist,8,0 +scriptparsetree,1024,0 +keyvaluepairs,64,1 +vehicle,64,0 +addon_map_ents,1,0 +tracer,100,0 +slug,5,0 +surfacefxtable,64,0 +surfacesounddef,256,0 +footsteptable,32,0 +entityfximpacts,256,0 +entitysoundimpacts,256,0 +zbarrier,16,0 +vehiclefxdef,32,0 +vehiclesounddef,32,0 +typeinfo,0,0 +scriptbundle,1024,0 +scriptbundlelist,64,0 +rumble,256,0 +bulletpenetration,1,0 +locdmgtable,1,0 +aimtable,12,0 +animselectortable,64,0 +animmappingtable,64,0 +animstatemachine,64,0 +behaviortree,64,0 +behaviorstatemachine,128,0 +ttf,48,0 +sanim,1024,0 +lightdescription,500,0 +shellshock,64,0 +xcam,512,0 +bgcache,32,0 +texturecombo,16,0 +flametable,16,0 +bitfield,52,0 +attachmentcosmeticvariant,640,0 +maptable,25,0 +maptableloadingimages,25,0 +medal,768,0 +medaltable,32,0 +objective,256,0 +objectivelist,64,0 +umbra_tome,0,0 +navmesh,2,0 +navvolume,2,0 +binaryhtml,2048,0 +laser,50,0 +beam,50,0 +streamerhint,50,0 diff --git a/zone_source/all/assetinfo/core_mod_xmodel.csv b/zone_source/all/assetinfo/core_mod_xmodel.csv new file mode 100644 index 0000000..94b05d2 --- /dev/null +++ b/zone_source/all/assetinfo/core_mod_xmodel.csv @@ -0,0 +1 @@ +name,refs,radius,onePixelDist,lodCount,verts0,tris0,verts1,tris1,verts2,tris2,verts3,tris3,verts4,tris4,verts5,tris5,verts6,tris6,verts7,tris7 diff --git a/zone_source/all/assetinfo/zm_mod.csv b/zone_source/all/assetinfo/zm_mod.csv new file mode 100644 index 0000000..615358e --- /dev/null +++ b/zone_source/all/assetinfo/zm_mod.csv @@ -0,0 +1,7 @@ +index,type,name,resident,streamed,parentStack +1,string,,0,0,||assetlist +2,scriptparsetree,scripts/zm/_load.gsc,4489,0,|zone_source/zm_mod.zone|csv +3,scriptparsetree,scripts/zm/_zm_utility.gsc,80804,0,|zone_source/zm_mod.zone|csv +4,keyvaluepairs,zm_mod,1118,0,||assetlist +5,bgcache,zm_mod,529,0,||assetlist +6,assetlist,,64,0, diff --git a/zone_source/all/assetinfo/zm_mod.deps b/zone_source/all/assetinfo/zm_mod.deps new file mode 100644 index 0000000..f0a86d7 --- /dev/null +++ b/zone_source/all/assetinfo/zm_mod.deps @@ -0,0 +1,41 @@ +version,3421953,593 +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_common +ignore_missing_shipped,zm_common +ignore_missing_shipped,zm_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,zm_levelcommon +scriptparsetree,scripts/zm/_load.gsc + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\scripts\zm\_load.gsc,1664600927, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\scripts\shared\shared.gsh,1648526443, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\scripts\shared\version.gsh,1648526542, +scriptparsetree,scripts/zm/_zm_utility.gsc + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\scripts\zm\_zm_utility.gsc,1626465360, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\scripts\shared\shared.gsh,1648526443, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\scripts\shared\statstable_shared.gsh,1648526477, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\scripts\zm\_zm_perks.gsh,1648526545, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\scripts\zm\_zm_utility.gsh,1648526543, +texturecombo,zm_mod +assetlist,zm_mod + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\gamedata\playeranim\playeranimtypes.txt,1648526392, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\zone_source\zm_mod.zone,1667516705,c1daa62f,ce1b78cc,d2894cd8,92d5cc9d + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\zm_mod.class,1648526484, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\mod_default.class,1648526548, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\default.class,1648526548, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\zone_source\base_patch.zpkg,1648526553,5a76b7f7,40123946,eb5bedee,b0ac8d77 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_pre_gfx.csv,1648526740,9a291896,f3713a9b,75a0b66e,703a40af + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_patch.csv,1648526752,414521c8,b00c4bd2,1cb776ba,dd6e2742 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_gfx.csv,1648526675,eb35b869,6f0759a0,375b27d8,7e4abcbc + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_post_gfx.csv,1648526752,c5b160fe,8def529b,2bc851dc,de320c91 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_ui.csv,1648526699,6eac37ef,af745f35,9f02acd6,5ef64937 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\core_common.csv,1648522383,019dcec6,25201477,4f369f35,6e14d2d0 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\zm_common.csv,1648526773,13082a68,1dc6b820,d17e526c,1388be90 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\zm_patch.csv,1648526699,f50ca787,734c91b5,790ad58b,fcf5905b + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\all\assetlist\zm_levelcommon.csv,1648522383,06ed9fcc,ac94969d,4a91c987,d03f89de + spawn,expect,core_all + spawn,expect,zm_common_all +errorcount,0 diff --git a/zone_source/all/assetinfo/zm_mod_bulletreport.csv b/zone_source/all/assetinfo/zm_mod_bulletreport.csv new file mode 100644 index 0000000..9bd3ec2 --- /dev/null +++ b/zone_source/all/assetinfo/zm_mod_bulletreport.csv @@ -0,0 +1 @@ +xmodel,avgArea (min 50.0),triCount (max 0),dimX,dimY,dimZ,volume,refs diff --git a/zone_source/all/assetinfo/zm_mod_poolinfo.csv b/zone_source/all/assetinfo/zm_mod_poolinfo.csv new file mode 100644 index 0000000..446057e --- /dev/null +++ b/zone_source/all/assetinfo/zm_mod_poolinfo.csv @@ -0,0 +1,104 @@ +type,limit,total +physpreset,276,0 +physconstraints,128,0 +destructibledef,128,0 +xanim,25000,0 +xmodel,10240,0 +xmodelmesh,34816,0 +material,20480,0 +computeshaderset,256,0 +techset,1024,0 +image,49152,0 +sound,32,0 +sound_patch,16,0 +col_map,2,0 +com_map,2,0 +game_map,2,0 +map_ents,2,0 +gfx_map,2,0 +lightdef,32,0 +lensflaredef,64,0 +ui_map,0,0 +font,16,0 +fonticon,16,0 +localize,25600,0 +weapon,1536,0 +weapondef,0,0 +weaponvariant,0,0 +weaponfull,0,0 +cgmediatable,5,0 +playersoundstable,16,0 +playerfxtable,16,0 +sharedweaponsounds,64,0 +attachment,128,0 +attachmentunique,2148,0 +weaponcamo,512,0 +customizationtable,8,0 +customizationtable_feimages,8,0 +customizationtablecolor,1024,0 +snddriverglobals,1,0 +fx,1875,0 +tagfx,64,0 +klf,64,0 +impactsfxtable,256,0 +impactsoundstable,64,0 +player_character,8,0 +aitype,96,0 +character,150,0 +xmodelalias,48,0 +rawfile,5000,0 +stringtable,200,0 +structuredtable,96,0 +leaderboarddef,256,0 +ddl,64,0 +glasses,2,0 +texturelist,8,0 +scriptparsetree,1024,2 +keyvaluepairs,64,1 +vehicle,64,0 +addon_map_ents,1,0 +tracer,100,0 +slug,5,0 +surfacefxtable,64,0 +surfacesounddef,256,0 +footsteptable,32,0 +entityfximpacts,256,0 +entitysoundimpacts,256,0 +zbarrier,16,0 +vehiclefxdef,32,0 +vehiclesounddef,32,0 +typeinfo,0,0 +scriptbundle,1024,0 +scriptbundlelist,64,0 +rumble,256,0 +bulletpenetration,1,0 +locdmgtable,1,0 +aimtable,12,0 +animselectortable,64,0 +animmappingtable,64,0 +animstatemachine,64,0 +behaviortree,64,0 +behaviorstatemachine,128,0 +ttf,48,0 +sanim,1024,0 +lightdescription,500,0 +shellshock,64,0 +xcam,512,0 +bgcache,32,1 +texturecombo,16,0 +flametable,16,0 +bitfield,52,0 +attachmentcosmeticvariant,640,0 +maptable,25,0 +maptableloadingimages,25,0 +medal,768,0 +medaltable,32,0 +objective,256,0 +objectivelist,64,0 +umbra_tome,0,0 +navmesh,2,0 +navvolume,2,0 +binaryhtml,2048,0 +laser,50,0 +beam,50,0 +streamerhint,50,0 diff --git a/zone_source/all/assetinfo/zm_mod_xmodel.csv b/zone_source/all/assetinfo/zm_mod_xmodel.csv new file mode 100644 index 0000000..94b05d2 --- /dev/null +++ b/zone_source/all/assetinfo/zm_mod_xmodel.csv @@ -0,0 +1 @@ +name,refs,radius,onePixelDist,lodCount,verts0,tris0,verts1,tris1,verts2,tris2,verts3,tris3,verts4,tris4,verts5,tris5,verts6,tris6,verts7,tris7 diff --git a/zone_source/all/assetlist/core_mod.csv b/zone_source/all/assetlist/core_mod.csv new file mode 100644 index 0000000..2df4837 --- /dev/null +++ b/zone_source/all/assetlist/core_mod.csv @@ -0,0 +1,6 @@ +rawfile,cp_mod.cfg +rawfile,mod.cfg +rawfile,mp_mod.cfg +rawfile,zm_mod.cfg +stringtable,gamedata/stats/zm/zm_statstable.csv +keyvaluepairs,core_mod diff --git a/zone_source/all/assetlist/zm_mod.csv b/zone_source/all/assetlist/zm_mod.csv new file mode 100644 index 0000000..2b4a5a4 --- /dev/null +++ b/zone_source/all/assetlist/zm_mod.csv @@ -0,0 +1,3 @@ +scriptparsetree,scripts/zm/_load.gsc +scriptparsetree,scripts/zm/_zm_utility.gsc +keyvaluepairs,zm_mod diff --git a/zone_source/all/scriptgdb/scripts/shared/array_shared.csc.gdb b/zone_source/all/scriptgdb/scripts/shared/array_shared.csc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..3b0d9252b387a661550addc67639661984327f5f GIT binary patch literal 11127 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 literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/shared/array_shared.gsc.gdb b/zone_source/all/scriptgdb/scripts/shared/array_shared.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..cea00aa0a8f4d75a9f6612eef1c5e0218d565e5d GIT binary patch literal 13878 zcmd6ue`r}`}ct#7g zG>i%b)2=6nc($qUZf4$dGTJh&6bf;z{J=xuv0Xtm4vKy%)53ALHocJqP0#*SPuVL$ z`nRZ(1WEdAQ&>(?nXOhe|2Z%FaoT_XNe}v!B+?)ImFQ_pzI(zjaQB?tepv(h^?mUM z+9z+r$-Jyv{US?n@)+FZX~fAX__+*TM4X&~XYm^H!8C>~eJB|nC(>Q+ZJS-qj z?t)hxj>5_P@OS3n81m#a{Bj1DKVrv8w!+C*;p9#@c?3?5!#@J2z`G7t$=;@4tISfDK@C2MZ55Kg?Y<$#?i(CaKcfiShI2pmK89abEc@+L`2G1fsAE$8K^a67h z^~l0c?fj5kaB>@*+zl^-2OOS&zn8)Dh-dK<@(ay|C3c+TCOEkhPWHopDBSTg+kf%^ zeB9xuaPlIYe0-^`Lw3Q*Zul05N8#kBaB>y*74b~61%3%wf+y*B{;RnG(4v)gg6Y$dy$XOhh#fGQRe{hw< z7C6}fCtrZ?b$Aj^o`O%#!}G|KSK!w&coXq&K=oTYo-F2(Cu2By1WvvW&*BvF)AR5) z@>!fko@`ug$3Zs3UvStB-{Np5yaZO~;W+Z-EIf-1zr(r#S2=8fZ*{l}zT066-wPgE zWX_;I+1zBuLvDbRLvV6GoIDTD;zi`i8}K_08-K6Ni(CySTj68@?s5y_Jz&-07@YhN zPJRU^mo?jdkxlR{7Le~=VD3OYvL8;q1^>w5Bz&QG1@*`^f3WjIZie?{a1?R!UHB>R z6YyW)=MJyHuP+dnuCe_m8{ummz6kGj_$qw+A~8l?auj~t;Tiap!*lTIc{qza+3-g@ zFXSdT`6`@@;90C9zkeQ%Ax}=gr@_nMb%)P9WBW^Xz{wZk;$_V9)Oca;4Y6Le$C<1wOHri+6Uxj9Jk%!Za8@ue*7VE0_~79 z@T(7r%l>5NlWc)^I@}B=x59ThjN#;7_@PDS6zY?g;N(p>c?V9eZn5*woWYk7cexqy z?GK5E(GK}OoID37r{Ux`@YxKmeh$~M!)AD!!vdUq9lq-!@gUkEPs1l2&cMklaPmv| zjSPN+IH}gzd0K3)K|5qOe7nOKPL9IK9v(ehi-i&t>p)#Q*K^DxACpCzrI@aX$_=I&6lM1^7!~m&0!O_J_<-v_~F^vL7;*A5IC&fXwZpscCvtW^o4#j`qJ44*Kh6mtwX=9SH4#c_9!`C4f&DswCS_ulb>%>`jJ_c zgyp^{@N_v9CP^BL%ZELIU#*lC8bCu{Nggj%aWGgJ3hZYlYJ6yz*|`8Z9Sl~}5zmYx zk$#ym^aZI27zw3SJIrDf_~lwvh9FPT+SWp;Kdhv8UNMpfk<0#IpxE|Y#P;@{L&7Aj z)QbIjNYa*97h6tdAt%#-@z_|Hc+yI(m@0XKR_19Sw?40@%R})qB4Omjd9%jxm4=aa({hIZ6DT_@%fE}AY z<#QdnfCUOz8OY~zCS|~s5lMC0ltw+JWgy?a-lPneGBS|wFypsi%ETn~ygAFDp3<>_ z{Q3<`lTDDhHO8w|H$<*=%>YgWj6<>{Q8`^RxD87$XrpJJr}Uo zpq+Oeoofv()v6_VYJaYW^|9&B^hSQ4>=>B>^C{O3dCSeMgPl?`; zOJ$*f15XY5R=}*NG>5bW^ql#bBD>JOhuTdJ6dn!>$?N)N7 zR8cJ)l}pJ>G<+|X>6IUW!72l$5xD|`p&(9VbCzD4ehU50_73j&_Gd@`vgDN6{qri> z<4Y4#uUe_Ad`zNNj$BZQg$N=XMQQxWh7Fc{f$f0QD7ZYRV?y)$8itIUQi5`Y5kw#Iu`+ zA65JPo*>l|*W=0FA%AEhS7j_c9Sq{Wz-$xByw^{XYkjaPcOmv3LF(l6-Gtn0V3TGG zNihzqsVCEM{~6!Tt01QWne6%rs#uF-Ssh-a=gi#Nn9)hI{-BD2URgz9U%zxRER|%D z49jZSdMMEIqA!$OzTK=DknQNG-JB}1{#x{G>U~}A4(cav zFq>*FZ&*K3tSHOTmu+3&EJfjvEPq*Pa^F_#k-bY_1-Lo7?>qZ@Ei4Y`36<$nb&;)C V7Ngwfl+?gnl;54IhC`K9{SUpzo$vqv literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/_bb.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_bb.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..aee08d6bd3855fa601118d218ee3a070d3e39339 GIT binary patch literal 2700 zcmeIwKd2l<90%|zqQ;lls91?eDzT8;o&7UwAtI81MFg=3uUUUHJ9{_0+u3t>?=H_u zQUpnn!oos>g=G*+g%lR4tSnNbkf0(~spS4$hY9Vi6_VhXTy6LJw(1S@n_`GQcC9j`s04k4eRvW zxQmV%YX<+-AMeI#7)Twt@r_Y~Y1mfNs~h02IGF+P*+l#kxXmy zq2Ot)`Aqu|C8Q!HG9M})MY+mT)Nea8H=#hH;;c^H53X2I=sd{^6z;OD?#~b7uP0l8)Ugnd>23^()$1Q!zi8>B%tFHj;*>twNzHqggDXgkgDRZre_~ z-KpD+YI|cfYv^)s=8K_n$Dn_|s~B0+_<~itwY@tktIpVgb?w?#rCm4Dbx^OZI~A=h zW1>`KL=3Izjkbe-TCKazUE|#BUS^i$QmHIrQd1v#TxePj3%|@%i`bnV&W_A-*|QH? zt4m*~*M0A%>IWJ$>y_(2e3wHz(DJWVG|zG>xMr(%tGo5eS0xfUPwVi~c@js7oC!4R mtK;S{RaqXzQNhZR0#u}u zr-fLGm6OdGT?4{4V&g#g^8II$`I*zb-R|lNtV38&H_M%^z_akwtXFRVU^DPFuwMWC zn|oMUY|f3`5RcpvkK7TD+!vphJ=q_5Bt9=kvOn@%d|qD4{>Urw$ZPS)d+~=BJ4?;I zMXrfQZi}~hAbDgW-sVK|$P4kvTk*RV@5O)Oqs*U$FT%GL-^G8M-R0&UBPZgw!siy1 zsdNUZPtjtP9AU~LH5{FA(zltBQKCJ5&!6iOg`6;Sh16l_osU#TUMB`sK7s-{8)!$CLG?X)<(bmsu__!|ouP+T0Hr1i ra?DT@hf2nPcB~u@2#1gxU4*$bo)!*=H2tSG)9JG)80|USrp@33?+pnK literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/_load.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_load.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..e2b9fa2a8cc5a8f6028ce29d8178613db1490fd3 GIT binary patch literal 2121 zcmeIxzi!k(5C-t65DBCS-StQjB~qG{C<2L+3SG0T?Xg+3XIs1L`{Rl_k8l-Ag(#`e zm2~70uHXSEQ&6O0Y=0X#3yFq66HBMxedG1ccy;&o+3AymeR@E0ogcqzj>IqW>Floh z4$(vL=x!fxy*-Eihw#6C507yEf6Ei>7k!Exogzma^4Z99Cb<&vx94W|Kt zQoYbls^0J1+^u$tovB08l$pf_iT1o(?<;+yc1ET&f%>*SXcssm$A$5Mol33YGUSGB z=1H62Oi{4&wO*9D)rF^m!*zM6%=xuRE&q1u?!94s-&2_~xJt?B%%zfaM8Jns&^wt6M~ySI#A4cW#J2FfS literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/_zm.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_zm.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..fe4fa720a6e992f491d91c0d3196e9374daa49f9 GIT binary patch literal 82283 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 Es~M14!2kdN literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/_zm_bgb.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_zm_bgb.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..ea0cb7b0d7fa79d7ca33d9889fb30f29f3d59464 GIT binary patch literal 645 zcmZ{gy-LJD5P-){1VON|6m0G>L> z&%p3yC&@Rnv$?yyIX!`M$np5{bh*kr%UM|BHRn~%z8rG=$IbRFz(?ir(eB}*a#eX< z*;j5VpDW)g-zz^W@xfu!HBi!%V=#j3sj;lV_|_VgLIg^Q)W8umIqDc%OPzpY@)BCj zlzLb*jlsh_2ICXV+C-4vBpVcr`J+}iC6oP4@NB&1dypx%q&O`j1C=(ovtyV!Mxzha z;{PtnBqMu`yN0M1WsUD3vP_PDR`YGL+RO|#NWziha4=yzdG%i%$*yS;jFZpm&Pd{j zza3DFe>gx=#Qi=KliQDx2ihL@JNCF;m~4NbHAT%Dn*~T~OaVtrOKvPGL_Q1-GMEuH YyMRpygQGlx4wx5<(uahTFm&b4U$P^^xc~qF literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/_zm_magicbox.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_zm_magicbox.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..7ce4d4e5dd47597df158b04e27512ad8d19a9e61 GIT binary patch literal 23959 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 literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/_zm_utility.csc.gdb b/zone_source/all/scriptgdb/scripts/zm/_zm_utility.csc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..9959919e91eb7ad574227a90901642b3b8b4a893 GIT binary patch literal 2570 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 literal 0 HcmV?d00001 diff --git a/zone_source/all/scriptgdb/scripts/zm/bgb_machine_override.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/bgb_machine_override.gsc.gdb new file mode 100644 index 0000000000000000000000000000000000000000..249632926efdca4c48e8f240091397f6795e1434 GIT binary patch literal 1783 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,core +>type,common + +#include "core_mod.class" + +//Unlimited Megas & Mega Selection +stringtable,gamedata/stats/zm/zm_statstable.csv + +//rawfile,ui/LobbyMenuButtons.lua + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +// you should keep these defaults cfg in core_mod and always include them in your mods this is to prevent the game from hitching when it needs to execute them +rawfile,mod.cfg +rawfile,cp_mod.cfg +rawfile,mp_mod.cfg +rawfile,zm_mod.cfg +// note that if you make changes in the cfg, you need to build this fastfile for the game to get the latest +/////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/zone_source/english/assetinfo/core_mod.csv b/zone_source/english/assetinfo/core_mod.csv new file mode 100644 index 0000000..f727e70 --- /dev/null +++ b/zone_source/english/assetinfo/core_mod.csv @@ -0,0 +1,4 @@ +index,type,name,resident,streamed,parentStack +1,string,,0,0,||assetlist +2,keyvaluepairs,en_core_mod,1105,0,||assetlist +3,assetlist,,16,0, diff --git a/zone_source/english/assetinfo/core_mod.deps b/zone_source/english/assetinfo/core_mod.deps new file mode 100644 index 0000000..08084c3 --- /dev/null +++ b/zone_source/english/assetinfo/core_mod.deps @@ -0,0 +1,24 @@ +version,3421953,593 +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_common +ignore_missing_shipped,core_common +texturecombo,core_mod +assetlist,core_mod + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\gamedata\playeranim\playeranimtypes.txt,1648526392, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\zone_source\loc\core_mod.zone,1667517820,a9e2fc49,20ad71a2,ca5fdd24,5518f1ac + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_pre_gfx.csv,1648526745,4f38c8d2,54dbe0ad,a26fe6dd,7ce6fe27 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_patch.csv,1648526694,9ed99688,0848420f,a94e8a4f,6a3cab0a + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_gfx.csv,1648526736,4cd6243d,831296e2,f2d7c4d8,2e2c9159 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_post_gfx.csv,1648526740,6421ae92,8670936d,28c8f4d3,3c4bb4af + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_ui.csv,1648526699,ce3b1916,c358e78d,81b61779,aaf68da4 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_common.csv,1648526727,1d30278c,b8778087,b65b8ce5,1d066b44 +errorcount,0 diff --git a/zone_source/english/assetinfo/core_mod_bulletreport.csv b/zone_source/english/assetinfo/core_mod_bulletreport.csv new file mode 100644 index 0000000..9bd3ec2 --- /dev/null +++ b/zone_source/english/assetinfo/core_mod_bulletreport.csv @@ -0,0 +1 @@ +xmodel,avgArea (min 50.0),triCount (max 0),dimX,dimY,dimZ,volume,refs diff --git a/zone_source/english/assetinfo/core_mod_poolinfo.csv b/zone_source/english/assetinfo/core_mod_poolinfo.csv new file mode 100644 index 0000000..10e27ef --- /dev/null +++ b/zone_source/english/assetinfo/core_mod_poolinfo.csv @@ -0,0 +1,104 @@ +type,limit,total +physpreset,276,0 +physconstraints,128,0 +destructibledef,128,0 +xanim,25000,0 +xmodel,10240,0 +xmodelmesh,34816,0 +material,20480,0 +computeshaderset,256,0 +techset,1024,0 +image,49152,0 +sound,32,0 +sound_patch,16,0 +col_map,2,0 +com_map,2,0 +game_map,2,0 +map_ents,2,0 +gfx_map,2,0 +lightdef,32,0 +lensflaredef,64,0 +ui_map,0,0 +font,16,0 +fonticon,16,0 +localize,25600,0 +weapon,1536,0 +weapondef,0,0 +weaponvariant,0,0 +weaponfull,0,0 +cgmediatable,5,0 +playersoundstable,16,0 +playerfxtable,16,0 +sharedweaponsounds,64,0 +attachment,128,0 +attachmentunique,2148,0 +weaponcamo,512,0 +customizationtable,8,0 +customizationtable_feimages,8,0 +customizationtablecolor,1024,0 +snddriverglobals,1,0 +fx,1875,0 +tagfx,64,0 +klf,64,0 +impactsfxtable,256,0 +impactsoundstable,64,0 +player_character,8,0 +aitype,96,0 +character,150,0 +xmodelalias,48,0 +rawfile,5000,0 +stringtable,200,0 +structuredtable,96,0 +leaderboarddef,256,0 +ddl,64,0 +glasses,2,0 +texturelist,8,0 +scriptparsetree,1024,0 +keyvaluepairs,64,1 +vehicle,64,0 +addon_map_ents,1,0 +tracer,100,0 +slug,5,0 +surfacefxtable,64,0 +surfacesounddef,256,0 +footsteptable,32,0 +entityfximpacts,256,0 +entitysoundimpacts,256,0 +zbarrier,16,0 +vehiclefxdef,32,0 +vehiclesounddef,32,0 +typeinfo,0,0 +scriptbundle,1024,0 +scriptbundlelist,64,0 +rumble,256,0 +bulletpenetration,1,0 +locdmgtable,1,0 +aimtable,12,0 +animselectortable,64,0 +animmappingtable,64,0 +animstatemachine,64,0 +behaviortree,64,0 +behaviorstatemachine,128,0 +ttf,48,0 +sanim,1024,0 +lightdescription,500,0 +shellshock,64,0 +xcam,512,0 +bgcache,32,0 +texturecombo,16,0 +flametable,16,0 +bitfield,52,0 +attachmentcosmeticvariant,640,0 +maptable,25,0 +maptableloadingimages,25,0 +medal,768,0 +medaltable,32,0 +objective,256,0 +objectivelist,64,0 +umbra_tome,0,0 +navmesh,2,0 +navvolume,2,0 +binaryhtml,2048,0 +laser,50,0 +beam,50,0 +streamerhint,50,0 diff --git a/zone_source/english/assetinfo/core_mod_xmodel.csv b/zone_source/english/assetinfo/core_mod_xmodel.csv new file mode 100644 index 0000000..94b05d2 --- /dev/null +++ b/zone_source/english/assetinfo/core_mod_xmodel.csv @@ -0,0 +1 @@ +name,refs,radius,onePixelDist,lodCount,verts0,tris0,verts1,tris1,verts2,tris2,verts3,tris3,verts4,tris4,verts5,tris5,verts6,tris6,verts7,tris7 diff --git a/zone_source/english/assetinfo/zm_mod.csv b/zone_source/english/assetinfo/zm_mod.csv new file mode 100644 index 0000000..b2abfaa --- /dev/null +++ b/zone_source/english/assetinfo/zm_mod.csv @@ -0,0 +1,4 @@ +index,type,name,resident,streamed,parentStack +1,string,,0,0,||assetlist +2,keyvaluepairs,en_zm_mod,1130,0,||assetlist +3,assetlist,,16,0, diff --git a/zone_source/english/assetinfo/zm_mod.deps b/zone_source/english/assetinfo/zm_mod.deps new file mode 100644 index 0000000..e5f9f47 --- /dev/null +++ b/zone_source/english/assetinfo/zm_mod.deps @@ -0,0 +1,35 @@ +version,3421953,593 +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_common +ignore_missing_shipped,core_common +ignore_missing_shipped,zm_common +ignore_missing_shipped,zm_common +ignore_missing_shipped,zm_patch +ignore_missing_shipped,zm_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,zm_levelcommon +ignore_missing_shipped,zm_levelcommon +texturecombo,zm_mod +assetlist,zm_mod + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\share\raw\gamedata\playeranim\playeranimtypes.txt,1648526392, + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\offline_megas\zone_source\loc\zm_mod.zone,1667517823,fb9c0abe,ab2ebb1b,ee42f022,8b98a230 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_pre_gfx.csv,1648526745,4f38c8d2,54dbe0ad,a26fe6dd,7ce6fe27 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_patch.csv,1648526694,9ed99688,0848420f,a94e8a4f,6a3cab0a + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_gfx.csv,1648526736,4cd6243d,831296e2,f2d7c4d8,2e2c9159 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_post_gfx.csv,1648526740,6421ae92,8670936d,28c8f4d3,3c4bb4af + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_ui.csv,1648526699,ce3b1916,c358e78d,81b61779,aaf68da4 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\core_common.csv,1648526727,1d30278c,b8778087,b65b8ce5,1d066b44 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\zm_common.csv,1648526727,4764b9bb,fb3a876b,3442808c,89244d35 + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\zm_patch.csv,1648526740,251e32d9,6d7cd895,06e06a77,cf58ce0a + file,D:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\zone_source\english\assetlist\zm_levelcommon.csv,1648526755,1e17d711,32b659cd,978bd5a4,d6624ec2 +errorcount,0 diff --git a/zone_source/english/assetinfo/zm_mod_bulletreport.csv b/zone_source/english/assetinfo/zm_mod_bulletreport.csv new file mode 100644 index 0000000..9bd3ec2 --- /dev/null +++ b/zone_source/english/assetinfo/zm_mod_bulletreport.csv @@ -0,0 +1 @@ +xmodel,avgArea (min 50.0),triCount (max 0),dimX,dimY,dimZ,volume,refs diff --git a/zone_source/english/assetinfo/zm_mod_poolinfo.csv b/zone_source/english/assetinfo/zm_mod_poolinfo.csv new file mode 100644 index 0000000..10e27ef --- /dev/null +++ b/zone_source/english/assetinfo/zm_mod_poolinfo.csv @@ -0,0 +1,104 @@ +type,limit,total +physpreset,276,0 +physconstraints,128,0 +destructibledef,128,0 +xanim,25000,0 +xmodel,10240,0 +xmodelmesh,34816,0 +material,20480,0 +computeshaderset,256,0 +techset,1024,0 +image,49152,0 +sound,32,0 +sound_patch,16,0 +col_map,2,0 +com_map,2,0 +game_map,2,0 +map_ents,2,0 +gfx_map,2,0 +lightdef,32,0 +lensflaredef,64,0 +ui_map,0,0 +font,16,0 +fonticon,16,0 +localize,25600,0 +weapon,1536,0 +weapondef,0,0 +weaponvariant,0,0 +weaponfull,0,0 +cgmediatable,5,0 +playersoundstable,16,0 +playerfxtable,16,0 +sharedweaponsounds,64,0 +attachment,128,0 +attachmentunique,2148,0 +weaponcamo,512,0 +customizationtable,8,0 +customizationtable_feimages,8,0 +customizationtablecolor,1024,0 +snddriverglobals,1,0 +fx,1875,0 +tagfx,64,0 +klf,64,0 +impactsfxtable,256,0 +impactsoundstable,64,0 +player_character,8,0 +aitype,96,0 +character,150,0 +xmodelalias,48,0 +rawfile,5000,0 +stringtable,200,0 +structuredtable,96,0 +leaderboarddef,256,0 +ddl,64,0 +glasses,2,0 +texturelist,8,0 +scriptparsetree,1024,0 +keyvaluepairs,64,1 +vehicle,64,0 +addon_map_ents,1,0 +tracer,100,0 +slug,5,0 +surfacefxtable,64,0 +surfacesounddef,256,0 +footsteptable,32,0 +entityfximpacts,256,0 +entitysoundimpacts,256,0 +zbarrier,16,0 +vehiclefxdef,32,0 +vehiclesounddef,32,0 +typeinfo,0,0 +scriptbundle,1024,0 +scriptbundlelist,64,0 +rumble,256,0 +bulletpenetration,1,0 +locdmgtable,1,0 +aimtable,12,0 +animselectortable,64,0 +animmappingtable,64,0 +animstatemachine,64,0 +behaviortree,64,0 +behaviorstatemachine,128,0 +ttf,48,0 +sanim,1024,0 +lightdescription,500,0 +shellshock,64,0 +xcam,512,0 +bgcache,32,0 +texturecombo,16,0 +flametable,16,0 +bitfield,52,0 +attachmentcosmeticvariant,640,0 +maptable,25,0 +maptableloadingimages,25,0 +medal,768,0 +medaltable,32,0 +objective,256,0 +objectivelist,64,0 +umbra_tome,0,0 +navmesh,2,0 +navvolume,2,0 +binaryhtml,2048,0 +laser,50,0 +beam,50,0 +streamerhint,50,0 diff --git a/zone_source/english/assetinfo/zm_mod_xmodel.csv b/zone_source/english/assetinfo/zm_mod_xmodel.csv new file mode 100644 index 0000000..94b05d2 --- /dev/null +++ b/zone_source/english/assetinfo/zm_mod_xmodel.csv @@ -0,0 +1 @@ +name,refs,radius,onePixelDist,lodCount,verts0,tris0,verts1,tris1,verts2,tris2,verts3,tris3,verts4,tris4,verts5,tris5,verts6,tris6,verts7,tris7 diff --git a/zone_source/english/assetlist/core_mod.csv b/zone_source/english/assetlist/core_mod.csv new file mode 100644 index 0000000..2ce58c3 --- /dev/null +++ b/zone_source/english/assetlist/core_mod.csv @@ -0,0 +1 @@ +keyvaluepairs,core_mod diff --git a/zone_source/english/assetlist/zm_mod.csv b/zone_source/english/assetlist/zm_mod.csv new file mode 100644 index 0000000..5d3d204 --- /dev/null +++ b/zone_source/english/assetlist/zm_mod.csv @@ -0,0 +1 @@ +keyvaluepairs,zm_mod diff --git a/zone_source/loc/core_mod.zone b/zone_source/loc/core_mod.zone new file mode 100644 index 0000000..ca907bd --- /dev/null +++ b/zone_source/loc/core_mod.zone @@ -0,0 +1,170 @@ +>mode,core +>type,common +>mode,core +>type,common +>level.xpak_write,core_mod +>level.xpak_read,core_mod +>level.xpak_read,initial +>level.xpak_read,base +>level.xpak_read,lowmip +>scriptbundlelist.accolade,accoladelist +>scriptbundlelist.collectible,collectiblelist +>scriptbundlelist.medalcaseentry,medalcase +>scriptbundlelist.trainingsimrating,trainingsimratinglist +>scriptbundlelist.gallery_image,gallery_imagelist +>scriptbundle,aiassassination +>scriptbundle,ainames +>scriptbundle,attackables +>scriptbundle,aifxtable +>scriptbundle,accolade +>scriptbundle,botsettings +>scriptbundle,bonuszmdata +>scriptbundle,characterweaponcustomsettings +>scriptbundle,collectible +>scriptbundle,containers +>scriptbundle,destructiblecharacterdef +>scriptbundle,doors +>scriptbundle,fxcharacterdef +>scriptbundle,gallery_image +>scriptbundle,gamedifficulty +>scriptbundle,gibcharacterdef +>scriptbundle,killcam +>scriptbundle,killstreak +>scriptbundle,medalcaseentry +>scriptbundle,mpdialog +>scriptbundle,mpdialog_commander +>scriptbundle,mpdialog_player +>scriptbundle,mpdialog_scorestreak +>scriptbundle,mpdialog_taacom +>scriptbundle,postfxbundle +>scriptbundle,duprenderbundle +>scriptbundle,ragdollsettings +>scriptbundle,scriptbundle +>scriptbundle,sentientevents +>scriptbundle,sitrep +>scriptbundle,teamcolorfx +>scriptbundle,trainingsimrating +>scriptbundle,turretanims +>scriptbundle,vehiclecustomsettings +>scriptbundle,vehicleriders +>mode,core +>type,common +>level.xpak_write,core_mod +>level.xpak_read,core_mod +>level.xpak_read,initial +>level.xpak_read,base +>level.xpak_read,lowmip +>scriptbundlelist.accolade,accoladelist +>scriptbundlelist.collectible,collectiblelist +>scriptbundlelist.medalcaseentry,medalcase +>scriptbundlelist.trainingsimrating,trainingsimratinglist +>scriptbundlelist.gallery_image,gallery_imagelist +>scriptbundle,aiassassination +>scriptbundle,ainames +>scriptbundle,attackables +>scriptbundle,aifxtable +>scriptbundle,accolade +>scriptbundle,botsettings +>scriptbundle,bonuszmdata +>scriptbundle,characterweaponcustomsettings +>scriptbundle,collectible +>scriptbundle,containers +>scriptbundle,destructiblecharacterdef +>scriptbundle,doors +>scriptbundle,fxcharacterdef +>scriptbundle,gallery_image +>scriptbundle,gamedifficulty +>scriptbundle,gibcharacterdef +>scriptbundle,killcam +>scriptbundle,killstreak +>scriptbundle,medalcaseentry +>scriptbundle,mpdialog +>scriptbundle,mpdialog_commander +>scriptbundle,mpdialog_player +>scriptbundle,mpdialog_scorestreak +>scriptbundle,mpdialog_taacom +>scriptbundle,postfxbundle +>scriptbundle,duprenderbundle +>scriptbundle,ragdollsettings +>scriptbundle,scriptbundle +>scriptbundle,sentientevents +>scriptbundle,sitrep +>scriptbundle,teamcolorfx +>scriptbundle,trainingsimrating +>scriptbundle,turretanims +>scriptbundle,vehiclecustomsettings +>scriptbundle,vehicleriders +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_common +ignore_missing_shipped,core_common +>level.xpak_read,base_patch +>level.xpak_read,base_patch_tu3 +>level.xpak_read,base_patch_tu4 +>level.xpak_read,base_patch_tu5 +>level.xpak_read,base_patch_tu6 +>level.xpak_read,base_patch_tu7 +>level.xpak_read,base_patch_tu8 +>level.xpak_read,base_patch_tu9 +>level.xpak_read,base_patch_tu10 +>level.xpak_read,base_patch_tu11 +>level.xpak_read,base_patch_tu12 +>level.xpak_read,base_patch_tu13 +>level.xpak_read,base_patch_tu14 +>level.xpak_read,base_patch_tu15 +>level.xpak_read,base_patch_tu16 +>level.xpak_read,base_patch_tu17 +>level.xpak_read,base_patch_tu18 +>level.xpak_read,base_patch_tu19 +>level.xpak_read,base_patch_tu20 +>level.xpak_read,base_patch_tu21 +>level.xpak_read,base_patch_tu22 +>level.xpak_read,base_patch_tu23 +>level.xpak_read,base_patch_tu24 +>level.xpak_read,base_patch_tu25 +>level.xpak_read,base_patch_tu26 +>level.xpak_read,base_patch_tu27 +>level.xpak_read,base_patch_tu28 +>level.xpak_read,base_patch_tu29 +>level.xpak_read,base_patch_tu30 +>level.xpak_read,base_patch_tu31 +>level.xpak_read,base_patch_tu32 +>level.xpak_read,base_patch +>level.xpak_read,base_patch_tu3 +>level.xpak_read,base_patch_tu4 +>level.xpak_read,base_patch_tu5 +>level.xpak_read,base_patch_tu6 +>level.xpak_read,base_patch_tu7 +>level.xpak_read,base_patch_tu8 +>level.xpak_read,base_patch_tu9 +>level.xpak_read,base_patch_tu10 +>level.xpak_read,base_patch_tu11 +>level.xpak_read,base_patch_tu12 +>level.xpak_read,base_patch_tu13 +>level.xpak_read,base_patch_tu14 +>level.xpak_read,base_patch_tu15 +>level.xpak_read,base_patch_tu16 +>level.xpak_read,base_patch_tu17 +>level.xpak_read,base_patch_tu18 +>level.xpak_read,base_patch_tu19 +>level.xpak_read,base_patch_tu20 +>level.xpak_read,base_patch_tu21 +>level.xpak_read,base_patch_tu22 +>level.xpak_read,base_patch_tu23 +>level.xpak_read,base_patch_tu24 +>level.xpak_read,base_patch_tu25 +>level.xpak_read,base_patch_tu26 +>level.xpak_read,base_patch_tu27 +>level.xpak_read,base_patch_tu28 +>level.xpak_read,base_patch_tu29 +>level.xpak_read,base_patch_tu30 +>level.xpak_read,base_patch_tu31 +>level.xpak_read,base_patch_tu32 diff --git a/zone_source/loc/zm_mod.zone b/zone_source/loc/zm_mod.zone new file mode 100644 index 0000000..2d269b2 --- /dev/null +++ b/zone_source/loc/zm_mod.zone @@ -0,0 +1,104 @@ +>mode,zm +>type,common +>mode,zm +>type,common +>expect,core_all +>expect,zm_common_all +>level.xpak_write,zm_mod +>level.xpak_read,zm_mod +>level.xpak_read,initial +>level.xpak_read,base +>level.xpak_read,lowmip +>scriptbundlelist.accolade,accoladelist +>scriptbundlelist.collectible,collectiblelist +>scriptbundlelist.medalcaseentry,medalcase +>scriptbundlelist.trainingsimrating,trainingsimratinglist +>scriptbundlelist.gallery_image,gallery_imagelist +>scriptbundle,aiassassination +>scriptbundle,ainames +>scriptbundle,attackables +>scriptbundle,aifxtable +>scriptbundle,accolade +>scriptbundle,botsettings +>scriptbundle,bonuszmdata +>scriptbundle,characterweaponcustomsettings +>scriptbundle,collectible +>scriptbundle,containers +>scriptbundle,destructiblecharacterdef +>scriptbundle,doors +>scriptbundle,fxcharacterdef +>scriptbundle,gallery_image +>scriptbundle,gamedifficulty +>scriptbundle,gibcharacterdef +>scriptbundle,killcam +>scriptbundle,killstreak +>scriptbundle,medalcaseentry +>scriptbundle,mpdialog +>scriptbundle,mpdialog_commander +>scriptbundle,mpdialog_player +>scriptbundle,mpdialog_scorestreak +>scriptbundle,mpdialog_taacom +>scriptbundle,postfxbundle +>scriptbundle,duprenderbundle +>scriptbundle,ragdollsettings +>scriptbundle,scriptbundle +>scriptbundle,sentientevents +>scriptbundle,sitrep +>scriptbundle,teamcolorfx +>scriptbundle,trainingsimrating +>scriptbundle,turretanims +>scriptbundle,vehiclecustomsettings +>scriptbundle,vehicleriders +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_pre_gfx +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_post_gfx +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_ui +ignore_missing_shipped,core_common +ignore_missing_shipped,core_common +ignore_missing_shipped,zm_common +ignore_missing_shipped,zm_common +ignore_missing_shipped,zm_patch +ignore_missing_shipped,zm_patch +>level.xpak_read,zm_initial +>linker.animation_mode,ZM +ignore_missing_shipped,core_patch +ignore_missing_shipped,core_patch +ignore_missing_shipped,zm_levelcommon +ignore_missing_shipped,zm_levelcommon +>level.xpak_read,base_patch +>level.xpak_read,base_patch_tu3 +>level.xpak_read,base_patch_tu4 +>level.xpak_read,base_patch_tu5 +>level.xpak_read,base_patch_tu6 +>level.xpak_read,base_patch_tu7 +>level.xpak_read,base_patch_tu8 +>level.xpak_read,base_patch_tu9 +>level.xpak_read,base_patch_tu10 +>level.xpak_read,base_patch_tu11 +>level.xpak_read,base_patch_tu12 +>level.xpak_read,base_patch_tu13 +>level.xpak_read,base_patch_tu14 +>level.xpak_read,base_patch_tu15 +>level.xpak_read,base_patch_tu16 +>level.xpak_read,base_patch_tu17 +>level.xpak_read,base_patch_tu18 +>level.xpak_read,base_patch_tu19 +>level.xpak_read,base_patch_tu20 +>level.xpak_read,base_patch_tu21 +>level.xpak_read,base_patch_tu22 +>level.xpak_read,base_patch_tu23 +>level.xpak_read,base_patch_tu24 +>level.xpak_read,base_patch_tu25 +>level.xpak_read,base_patch_tu26 +>level.xpak_read,base_patch_tu27 +>level.xpak_read,base_patch_tu28 +>level.xpak_read,base_patch_tu29 +>level.xpak_read,base_patch_tu30 +>level.xpak_read,base_patch_tu31 +>level.xpak_read,base_patch_tu32 diff --git a/zone_source/zm_mod.zone b/zone_source/zm_mod.zone new file mode 100644 index 0000000..d12c075 --- /dev/null +++ b/zone_source/zm_mod.zone @@ -0,0 +1,11 @@ +>mode,zm +>type,common + +#include "zm_mod.class" + +//PAP Camo & Online Game Registration +scriptparsetree,scripts/zm/_load.gsc +scriptparsetree,scripts/zm/_zm_utility.gsc + +ignore_missing_shipped,core_patch +ignore_missing_shipped,zm_levelcommon \ No newline at end of file