commit 8daf5ee4f60c9c6382b05172c70b386dfc435f1a Author: Rim Date: Tue May 28 13:25:29 2024 -0400 init 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 0000000..3b0d925 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/shared/array_shared.csc.gdb differ 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 0000000..cea00aa Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/shared/array_shared.gsc.gdb differ 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 0000000..aee08d6 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_bb.gsc.gdb differ diff --git a/zone_source/all/scriptgdb/scripts/zm/_load.csc.gdb b/zone_source/all/scriptgdb/scripts/zm/_load.csc.gdb new file mode 100644 index 0000000..8a827c0 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_load.csc.gdb differ 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 0000000..e2b9fa2 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_load.gsc.gdb differ 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 0000000..fe4fa72 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_zm.gsc.gdb differ 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 0000000..ea0cb7b Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_zm_bgb.gsc.gdb differ 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 0000000..7ce4d4e Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_zm_magicbox.gsc.gdb differ diff --git a/zone_source/all/scriptgdb/scripts/zm/_zm_perks.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_zm_perks.gsc.gdb new file mode 100644 index 0000000..7c7159b Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_zm_perks.gsc.gdb differ 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 0000000..9959919 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_zm_utility.csc.gdb differ diff --git a/zone_source/all/scriptgdb/scripts/zm/_zm_utility.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/_zm_utility.gsc.gdb new file mode 100644 index 0000000..083ce84 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/_zm_utility.gsc.gdb differ diff --git a/zone_source/all/scriptgdb/scripts/zm/bgb_cycle.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/bgb_cycle.gsc.gdb new file mode 100644 index 0000000..3965113 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/bgb_cycle.gsc.gdb differ 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 0000000..2496329 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/bgb_machine_override.gsc.gdb differ diff --git a/zone_source/all/scriptgdb/scripts/zm/gametypes/_clientids.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/gametypes/_clientids.gsc.gdb new file mode 100644 index 0000000..5078477 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/gametypes/_clientids.gsc.gdb differ diff --git a/zone_source/all/scriptgdb/scripts/zm/zm_usermap.gsc.gdb b/zone_source/all/scriptgdb/scripts/zm/zm_usermap.gsc.gdb new file mode 100644 index 0000000..4f01c09 Binary files /dev/null and b/zone_source/all/scriptgdb/scripts/zm/zm_usermap.gsc.gdb differ diff --git a/zone_source/core_mod.zone b/zone_source/core_mod.zone new file mode 100644 index 0000000..0d230f2 --- /dev/null +++ b/zone_source/core_mod.zone @@ -0,0 +1,18 @@ +>mode,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