diff --git a/zm_nuked_patch/maps/mp/zm_nuked_ffotd.gsc b/zm_nuked_patch/maps/mp/zm_nuked_ffotd.gsc new file mode 100644 index 0000000..5c9cb83 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zm_nuked_ffotd.gsc @@ -0,0 +1,117 @@ +#include maps/mp/zombies/_zm_ffotd; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +main_start() +{ + precachemodel( "collision_wall_128x128x10_standard" ); + precachemodel( "collision_player_256x256x10" ); + precachemodel( "collision_wall_64x64x10_standard" ); + if ( isDefined( level.use_swipe_protection ) ) + { + onplayerconnect_callback( ::claymore_watch_swipes ); + } +} + +main_end() +{ + setdvar( "zombiemode_path_minz_bias", 28 ); + collision7 = spawn( "script_model", ( -490, 963, 63 ) ); + collision7 setmodel( "collision_player_256x256x10" ); + collision7.angles = ( 0, 25,2, -90 ); + collision7 ghost(); + collision9 = spawn( "script_model", ( -1349, 1016, 0 ) ); + collision9 setmodel( "collision_wall_128x128x10_standard" ); + collision9.angles = vectorScale( ( 0, 1, 0 ), 339,8 ); + collision9 ghost(); + collision11 = spawn( "script_model", ( 1074, 584, 126 ) ); + collision11 setmodel( "collision_wall_64x64x10_standard" ); + collision11.angles = vectorScale( ( 0, 1, 0 ), 15 ); + collision11 ghost(); + collision12 = spawn( "script_model", ( 380, -112, 150 ) ); + collision12 setmodel( "collision_wall_128x128x10_standard" ); + collision12.angles = vectorScale( ( 0, 1, 0 ), 275 ); + collision12 ghost(); + collision13 = spawn( "script_model", ( 501, 212, 64 ) ); + collision13 setmodel( "collision_wall_64x64x10_standard" ); + collision13.angles = ( 0, 10,8, 90 ); + collision13 ghost(); + level thread prone_under_garage_door_exploit(); +} + +prone_under_garage_door_exploit() +{ + zombie_trigger_origin = ( -679, 339, -40 ); + zombie_trigger_radius = 100; + zombie_trigger_height = 128; + player_trigger_origin = ( -750, 189, -60 ); + player_trigger_radius = 72; + zombie_goto_point = ( -863, 320, -40 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( -652,6, 143,2, -58,6015 ); + zombie_trigger_radius = 85; + zombie_trigger_height = 128; + player_trigger_origin = ( -741, 177, -52 ); + player_trigger_radius = 35; + zombie_goto_point = ( -729,61, 156,24, -50 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( -863, 320, -20 ); + zombie_trigger_radius = 150; + zombie_trigger_height = 128; + player_trigger_origin = ( -750, 189, -60 ); + player_trigger_radius = 72; + zombie_goto_point = ( -804,61, 198,24, -40 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); +} + +claymore_watch_swipes() +{ + self endon( "disconnect" ); + self notify( "claymore_watch_swipes" ); + self endon( "claymore_watch_swipes" ); + while ( 1 ) + { + self waittill( "weapon_change", weapon ); + if ( is_placeable_mine( weapon ) ) + { + self.mine_damage = 0; + self thread watch_melee_swipes( weapon ); + } + } +} + +watch_melee_swipes( weapname ) +{ + self endon( "weapon_change" ); + self endon( "death" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "melee_swipe", zombie ); + self.mine_damage++; + if ( self.mine_damage > 5 ) + { + self.mine_damage = 0; + ammo = self getweaponammoclip( weapname ); + if ( ammo >= 1 ) + { + self setweaponammoclip( weapname, ammo - 1 ); + if ( ammo == 1 ) + { + self setweaponammoclip( weapname, ammo - 1 ); + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons[ 0 ] ) ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + } + break; + } + else + { + self takeweapon( weapname ); + } + } + } +} diff --git a/zm_nuked_patch/maps/mp/zm_nuked_fx.gsc b/zm_nuked_patch/maps/mp/zm_nuked_fx.gsc new file mode 100644 index 0000000..7d27adf --- /dev/null +++ b/zm_nuked_patch/maps/mp/zm_nuked_fx.gsc @@ -0,0 +1,137 @@ +#include maps/mp/_utility; + +#using_animtree( "fxanim_props" ); + +precache_util_fx() +{ +} + +precache_scripted_fx() +{ + level._effect[ "powerup_on" ] = loadfx( "misc/fx_zombie_powerup_on" ); + level._effect[ "powerup_on_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_on" ); + level._effect[ "powerup_on_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_on" ); + level._effect[ "blue_eyes" ] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" ); + level._effect[ "large_ceiling_dust" ] = loadfx( "maps/zombie/fx_dust_ceiling_impact_lg_mdbrown" ); + level._effect[ "lght_marker" ] = loadfx( "maps/zombie/fx_zombie_coast_marker" ); + level._effect[ "lght_marker_flare" ] = loadfx( "maps/zombie/fx_zombie_coast_marker_fl" ); + level._effect[ "poltergeist" ] = loadfx( "misc/fx_zombie_couch_effect" ); + level._effect[ "zomb_gib" ] = loadfx( "maps/zombie/fx_zombie_dog_explosion" ); + level._effect[ "perk_meteor" ] = loadfx( "maps/zombie/fx_zmb_trail_perk_meteor" ); + level._effect[ "fire_devil_lg" ] = loadfx( "maps/zombie/fx_zmb_fire_devil_lg" ); + level._effect[ "fire_devil_sm" ] = loadfx( "maps/zombie/fx_zmb_fire_devil_sm" ); + level._effect[ "rocket_entry" ] = loadfx( "maps/zombie/fx_zmb_nuke_reentry" ); + level._effect[ "rocket_entry_light" ] = loadfx( "maps/zombie/fx_zmb_nuke_rocket_light" ); + level._effect[ "fx_mp_elec_spark_burst_xsm_thin" ] = loadfx( "maps/mp_maps/fx_mp_elec_spark_burst_xsm_thin" ); + level._effect[ "wire_spark" ] = loadfx( "electrical/fx_elec_wire_spark_burst_xsm" ); +} + +precache_createfx_fx() +{ + level._effect[ "fx_zm_nuked_exp_perk_impact_int_shockwave" ] = loadfx( "explosions/fx_zm_nuked_exp_perk_impact_int_shockwave" ); + level._effect[ "fx_zm_nuked_exp_perk_impact_int" ] = loadfx( "explosions/fx_zm_nuked_exp_perk_impact_int" ); + level._effect[ "fx_zm_nuked_exp_perk_impact_ext" ] = loadfx( "explosions/fx_zm_nuked_exp_perk_impact_ext" ); + level._effect[ "fx_zm_nuked_perk_impact_ceiling_dust" ] = loadfx( "dirt/fx_zm_nuked_perk_impact_ceiling_dust" ); + level._effect[ "fx_lf_zmb_nuke_sun" ] = loadfx( "lens_flares/fx_lf_zmb_nuke_sun" ); + level._effect[ "fx_zm_nuked_water_stream_radioactive_thin" ] = loadfx( "water/fx_zm_nuked_water_drip_radioactive" ); + level._effect[ "fx_zm_nuked_water_stream_radioactive_spatter" ] = loadfx( "water/fx_zm_nuked_water_drip_radioactive_spatter" ); + level._effect[ "fx_zmb_nuke_nuclear_lightning_runner" ] = loadfx( "maps/zombie/fx_zmb_nuke_nuclear_lightning_runner" ); + level._effect[ "fx_zmb_nuke_radioactive_embers_crater" ] = loadfx( "maps/zombie/fx_zmb_nuke_radioactive_embers_crater" ); + level._effect[ "fx_zmb_nuke_radioactive_embers" ] = loadfx( "maps/zombie/fx_zmb_nuke_radioactive_embers" ); + level._effect[ "fx_zmb_nuke_linger_core" ] = loadfx( "maps/zombie/fx_zmb_nuke_linger_core" ); + level._effect[ "fx_zmb_nuke_sand_blowing_lg" ] = loadfx( "maps/zombie/fx_zmb_nuke_sand_blowing_lg" ); + level._effect[ "fx_zmb_nuke_debris_streamer_volume" ] = loadfx( "maps/zombie/fx_zmb_nuke_debris_streamer_volume" ); + level._effect[ "fx_zmb_nuke_burning_ash_gusty" ] = loadfx( "maps/zombie/fx_zmb_nuke_burning_ash_gusty" ); + level._effect[ "fx_zmb_nuke_radioactive_ash_gusty" ] = loadfx( "maps/zombie/fx_zmb_nuke_radioactive_ash_gusty" ); + level._effect[ "fx_zmb_nuke_sand_windy_hvy_md" ] = loadfx( "maps/zombie/fx_zmb_nuke_sand_windy_hvy_md" ); + level._effect[ "fx_zmb_nuke_sand_windy_hvy_sm" ] = loadfx( "maps/zombie/fx_zmb_nuke_sand_windy_hvy_sm" ); + level._effect[ "fx_embers_falling_md" ] = loadfx( "env/fire/fx_embers_falling_md" ); + level._effect[ "fx_embers_falling_sm" ] = loadfx( "env/fire/fx_embers_falling_sm" ); + level._effect[ "fx_ash_embers_falling_radioactive_md" ] = loadfx( "debris/fx_ash_embers_falling_radioactive_md" ); + level._effect[ "fx_ash_embers_falling_radioactive_sm" ] = loadfx( "debris/fx_ash_embers_falling_radioactive_sm" ); + level._effect[ "fx_mp_elec_spark_burst_xsm_thin_runner" ] = loadfx( "maps/mp_maps/fx_mp_elec_spark_burst_xsm_thin_runner" ); + level._effect[ "fx_elec_spark_wire_xsm_runner" ] = loadfx( "electrical/fx_elec_spark_wire_xsm_runner" ); + level._effect[ "fx_zm_elec_arc_vert" ] = loadfx( "electrical/fx_zm_elec_arc_vert" ); + level._effect[ "fx_elec_transformer_sparks_runner" ] = loadfx( "electrical/fx_elec_transformer_sparks_runner" ); + level._effect[ "fx_zmb_nuke_fire_windblown_md" ] = loadfx( "fire/fx_zmb_nuke_fire_windblown_md" ); + level._effect[ "fx_fire_xsm" ] = loadfx( "fire/fx_fire_xsm_no_flicker" ); + level._effect[ "fx_fire_line_xsm" ] = loadfx( "fire/fx_fire_line_xsm_no_flicker" ); + level._effect[ "fx_fire_sm_smolder" ] = loadfx( "fire/fx_zm_fire_sm_smolder_near" ); + level._effect[ "fx_fire_line_sm" ] = loadfx( "fire/fx_nic_fire_line_sm" ); + level._effect[ "fx_fire_wall_wood_ext_md" ] = loadfx( "fire/fx_fire_wall_wood_ext_md" ); + level._effect[ "fx_fire_ceiling_md" ] = loadfx( "fire/fx_nic_fire_ceiling_md" ); + level._effect[ "fx_fire_ceiling_edge_md" ] = loadfx( "fire/fx_nic_fire_ceiling_edge_md" ); + level._effect[ "fx_nic_fire_ceiling_edge_sm" ] = loadfx( "fire/fx_nic_fire_ceiling_edge_sm" ); + level._effect[ "fx_nic_fire_building_md_dist" ] = loadfx( "fire/fx_nic_fire_building_md_dist" ); + level._effect[ "fx_fire_fireplace_md" ] = loadfx( "fire/fx_fire_fireplace_md" ); + level._effect[ "fx_fire_wood_floor_int" ] = loadfx( "fire/fx_fire_wood_floor_int" ); + level._effect[ "fx_fire_ceiling_rafter_md" ] = loadfx( "fire/fx_nic_fire_ceiling_rafter_md" ); + level._effect[ "fx_fire_eaves_md" ] = loadfx( "fire/fx_nic_fire_eaves_md" ); + level._effect[ "fx_fire_eaves_md_left" ] = loadfx( "fire/fx_nic_fire_eaves_md_left" ); + level._effect[ "fx_fire_eaves_md_right" ] = loadfx( "fire/fx_nic_fire_eaves_md_right" ); + level._effect[ "fx_fire_line_xsm_pole" ] = loadfx( "fire/fx_nic_fire_line_xsm_pole" ); + level._effect[ "fx_fire_line_sm_pole" ] = loadfx( "fire/fx_nic_fire_line_sm_pole" ); + level._effect[ "fx_fire_pole_md_long" ] = loadfx( "fire/fx_nic_fire_pole_md_long" ); + level._effect[ "fx_fire_smolder_area_sm" ] = loadfx( "fire/fx_fire_smolder_area_sm" ); + level._effect[ "fx_smk_wood_sm_black" ] = loadfx( "smoke/fx_smk_wood_sm_black" ); + level._effect[ "fx_smk_fire_lg_black" ] = loadfx( "smoke/fx_smk_fire_lg_black" ); + level._effect[ "fx_smk_plume_md_blk_wispy_dist" ] = loadfx( "smoke/fx_smk_plume_md_blk_wispy_dist" ); + level._effect[ "fx_smk_smolder_rubble_md_int" ] = loadfx( "smoke/fx_smk_smolder_rubble_md_int_cheap" ); + level._effect[ "fx_smk_hallway_md_dark" ] = loadfx( "smoke/fx_smk_hallway_md_dark" ); + level._effect[ "fx_smk_linger_lit" ] = loadfx( "smoke/fx_smk_linger_lit" ); + level._effect[ "fx_smk_linger_lit_slow" ] = loadfx( "smoke/fx_smk_linger_lit_slow" ); + level._effect[ "fx_smk_linger_lit_slow_bright" ] = loadfx( "smoke/fx_smk_linger_lit_slow_bright" ); + level._effect[ "fx_smk_linger_lit_z" ] = loadfx( "smoke/fx_smk_linger_lit_z" ); + level._effect[ "fx_smk_smolder_gray_fast" ] = loadfx( "smoke/fx_smk_smolder_gray_fast" ); + level._effect[ "fx_smk_smolder_gray_slow" ] = loadfx( "smoke/fx_smk_smolder_gray_slow" ); + level._effect[ "fx_zmb_fog_low_radiation_140x300" ] = loadfx( "fog/fx_zmb_fog_low_radiation_140x300" ); + level._effect[ "fx_zm_nuked_light_ray_md_wide" ] = loadfx( "light/fx_zm_nuked_light_ray_md_wide" ); + level._effect[ "fx_zm_nuked_light_ray_md_wide_streak" ] = loadfx( "light/fx_zm_nuked_light_ray_md_wide_streak" ); + level._effect[ "fx_light_ray_grate_warm" ] = loadfx( "light/fx_zm_nuked_light_ray_streaks" ); + level._effect[ "fx_light_flour_glow_cool_sngl_shrt" ] = loadfx( "light/fx_light_flour_glow_cool_sngl_shrt" ); + level._effect[ "fx_zm_nuked_light_ray_streaks_1s" ] = loadfx( "light/fx_zm_nuked_light_ray_streaks_1s" ); + level._effect[ "fx_zm_nuked_light_ray_md_wide_streak_1s" ] = loadfx( "light/fx_zm_nuked_light_ray_md_wide_streak_1s" ); + level._effect[ "fx_mp_nuked_hose_spray" ] = loadfx( "maps/mp_maps/fx_mp_nuked_hose_spray" ); + level._effect[ "fx_ash_embers_up_lg" ] = loadfx( "debris/fx_ash_embers_up_lg" ); + level._effect[ "fx_ash_burning_falling_interior" ] = loadfx( "debris/fx_ash_burning_falling_interior" ); + level._effect[ "fx_zmb_nuke_fire_med" ] = loadfx( "maps/zombie/fx_zmb_nuke_fire_med" ); + level._effect[ "fx_zmb_tranzit_fire_lrg" ] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_lrg" ); + level._effect[ "fx_zmb_tranzit_fire_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_med" ); + level._effect[ "fx_cloud_cover_volume" ] = loadfx( "maps/zombie/fx_zmb_nuke_cloud_cover_volume" ); + level._effect[ "fx_cloud_cover_volume_sm" ] = loadfx( "maps/zombie/fx_zmb_nuke_cloud_cover_volume_sm" ); + level._effect[ "fx_cloud_cover_flat" ] = loadfx( "maps/zombie/fx_zmb_nuke_cloud_cover_flat" ); +} + +precache_fxanim_props() +{ + level.scr_anim[ "fxanim_props" ][ "pant01_fast" ] = %fxanim_gp_pant01_fast_anim; + level.scr_anim[ "fxanim_props" ][ "shirt01_fast" ] = %fxanim_gp_shirt01_fast_anim; + level.scr_anim[ "fxanim_props" ][ "sheet_med" ] = %fxanim_gp_cloth_sheet_med_fast_anim; + level.scr_anim[ "fxanim_props" ][ "wirespark_long" ] = %fxanim_gp_wirespark_long_anim; + level.scr_anim[ "fxanim_props" ][ "wirespark_med" ] = %fxanim_gp_wirespark_med_anim; + level.scr_anim[ "fxanim_props" ][ "roaches" ] = %fxanim_gp_roaches_anim; + level.scr_anim[ "fxanim_props" ][ "wht_shutters" ] = %fxanim_zom_nuketown_shutters_anim; + level.scr_anim[ "fxanim_props" ][ "wht_shutters02" ] = %fxanim_zom_nuketown_shutters02_anim; + level.scr_anim[ "fxanim_props" ][ "win_curtains" ] = %fxanim_zom_curtains_anim; + level.scr_anim[ "fxanim_props" ][ "cabinets_brwn" ] = %fxanim_zom_nuketown_cabinets_brwn_anim; + level.scr_anim[ "fxanim_props" ][ "cabinets_brwn02" ] = %fxanim_zom_nuketown_cabinets_brwn02_anim; + level.scr_anim[ "fxanim_props" ][ "cabinets_red" ] = %fxanim_zom_nuketown_cabinets_red_anim; + level.scr_anim[ "fxanim_props" ][ "porch" ] = %fxanim_zom_nuketown_porch_anim; + level.scr_anim[ "fxanim_props" ][ "roofvent" ] = %fxanim_gp_roofvent_small_wobble_anim; + level.nuked_fxanims = []; + level.nuked_fxanims[ "fxanim_mp_dustdevil_anim" ] = %fxanim_mp_dustdevil_anim; +} + +main() +{ + precache_util_fx(); + precache_createfx_fx(); + precache_scripted_fx(); + precache_fxanim_props(); + maps/mp/createfx/zm_nuked_fx::main(); + setdvar( "enable_global_wind", 1 ); + setdvar( "wind_global_vector", "1 0 0" ); + setdvar( "wind_global_low_altitude", 0 ); + setdvar( "wind_global_hi_altitude", 0 ); + setdvar( "wind_global_low_strength_percent", 0 ); +} diff --git a/zm_nuked_patch/maps/mp/zm_nuked_gamemodes.gsc b/zm_nuked_patch/maps/mp/zm_nuked_gamemodes.gsc new file mode 100644 index 0000000..67c69e9 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zm_nuked_gamemodes.gsc @@ -0,0 +1,13 @@ +#include maps/mp/zm_nuked_standard; +#include maps/mp/zm_nuked; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + add_map_gamemode( "zstandard", ::maps/mp/zm_nuked::zstandard_preinit, undefined, undefined ); + add_map_location_gamemode( "zstandard", "nuked", ::maps/mp/zm_nuked_standard::precache, ::maps/mp/zm_nuked_standard::main ); +} diff --git a/zm_nuked_patch/maps/mp/zm_nuked_perks.gsc b/zm_nuked_patch/maps/mp/zm_nuked_perks.gsc new file mode 100644 index 0000000..36e41b0 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zm_nuked_perks.gsc @@ -0,0 +1,407 @@ +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init_nuked_perks() +{ + level.perk_arrival_vehicle = getent( "perk_arrival_vehicle", "targetname" ); + level.perk_arrival_vehicle setmodel( "tag_origin" ); + flag_init( "perk_vehicle_bringing_in_perk" ); + structs = getstructarray( "zm_perk_machine", "targetname" ); + i = 0; + while ( i < structs.size ) + { + structs[ i ] structdelete(); + i++; + } + level.nuked_perks = []; + level.nuked_perks[ 0 ] = spawnstruct(); + level.nuked_perks[ 0 ].model = "zombie_vending_revive"; + level.nuked_perks[ 0 ].script_noteworthy = "specialty_quickrevive"; + level.nuked_perks[ 0 ].turn_on_notify = "revive_on"; + level.nuked_perks[ 1 ] = spawnstruct(); + level.nuked_perks[ 1 ].model = "zombie_vending_sleight"; + level.nuked_perks[ 1 ].script_noteworthy = "specialty_fastreload"; + level.nuked_perks[ 1 ].turn_on_notify = "sleight_on"; + level.nuked_perks[ 2 ] = spawnstruct(); + level.nuked_perks[ 2 ].model = "zombie_vending_doubletap2"; + level.nuked_perks[ 2 ].script_noteworthy = "specialty_rof"; + level.nuked_perks[ 2 ].turn_on_notify = "doubletap_on"; + level.nuked_perks[ 3 ] = spawnstruct(); + level.nuked_perks[ 3 ].model = "zombie_vending_jugg"; + level.nuked_perks[ 3 ].script_noteworthy = "specialty_armorvest"; + level.nuked_perks[ 3 ].turn_on_notify = "juggernog_on"; + level.nuked_perks[ 4 ] = spawnstruct(); + level.nuked_perks[ 4 ].model = "p6_anim_zm_buildable_pap"; + level.nuked_perks[ 4 ].script_noteworthy = "specialty_weapupgrade"; + level.nuked_perks[ 4 ].turn_on_notify = "Pack_A_Punch_on"; + players = getnumexpectedplayers(); + if ( players == 1 ) + { + level.override_perk_targetname = "zm_perk_machine_override"; + revive_perk_structs = getstructarray( "solo_revive", "targetname" ); + i = 0; + while ( i < revive_perk_structs.size ) + { + random_revive_structs[ i ] = getstruct( revive_perk_structs[ i ].target, "targetname" ); + random_revive_structs[ i ].script_int = revive_perk_structs[ i ].script_int; + i++; + } + level.random_revive_structs = array_randomize( random_revive_structs ); + level.random_revive_structs[ 0 ].targetname = "zm_perk_machine_override"; + level.random_revive_structs[ 0 ].model = level.nuked_perks[ 0 ].model; + level.random_revive_structs[ 0 ].blocker_model = getent( level.random_revive_structs[ 0 ].target, "targetname" ); + level.random_revive_structs[ 0 ].script_noteworthy = level.nuked_perks[ 0 ].script_noteworthy; + level.random_revive_structs[ 0 ].turn_on_notify = level.nuked_perks[ 0 ].turn_on_notify; + if ( !isDefined( level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] ) ) + { + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] = []; + } + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ][ level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ].size ] = level.random_revive_structs[ 0 ]; +/# + level.random_revive_structs[ 0 ] thread draw_debug_location(); +#/ + random_perk_structs = []; + perk_structs = getstructarray( "zm_random_machine", "script_noteworthy" ); + perk_structs = array_exclude( perk_structs, revive_perk_structs ); + i = 0; + while ( i < perk_structs.size ) + { + random_perk_structs[ i ] = getstruct( perk_structs[ i ].target, "targetname" ); + random_perk_structs[ i ].script_int = perk_structs[ i ].script_int; + i++; + } + level.random_perk_structs = array_randomize( random_perk_structs ); + i = 1; + while ( i < 5 ) + { + level.random_perk_structs[ i ].targetname = "zm_perk_machine_override"; + level.random_perk_structs[ i ].model = level.nuked_perks[ i ].model; + level.random_perk_structs[ i ].blocker_model = getent( level.random_perk_structs[ i ].target, "targetname" ); + level.random_perk_structs[ i ].script_noteworthy = level.nuked_perks[ i ].script_noteworthy; + level.random_perk_structs[ i ].turn_on_notify = level.nuked_perks[ i ].turn_on_notify; + if ( !isDefined( level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] ) ) + { + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] = []; + } + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ][ level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ].size ] = level.random_perk_structs[ i ]; +/# + level.random_perk_structs[ i ] thread draw_debug_location(); +#/ + i++; + } + } + else level.override_perk_targetname = "zm_perk_machine_override"; + random_perk_structs = []; + perk_structs = getstructarray( "zm_random_machine", "script_noteworthy" ); + i = 0; + while ( i < perk_structs.size ) + { + random_perk_structs[ i ] = getstruct( perk_structs[ i ].target, "targetname" ); + random_perk_structs[ i ].script_int = perk_structs[ i ].script_int; + i++; + } + level.random_perk_structs = array_randomize( random_perk_structs ); + i = 0; + while ( i < 5 ) + { + level.random_perk_structs[ i ].targetname = "zm_perk_machine_override"; + level.random_perk_structs[ i ].model = level.nuked_perks[ i ].model; + level.random_perk_structs[ i ].blocker_model = getent( level.random_perk_structs[ i ].target, "targetname" ); + level.random_perk_structs[ i ].script_noteworthy = level.nuked_perks[ i ].script_noteworthy; + level.random_perk_structs[ i ].turn_on_notify = level.nuked_perks[ i ].turn_on_notify; + if ( !isDefined( level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] ) ) + { + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] = []; + } + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ][ level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ].size ] = level.random_perk_structs[ i ]; +/# + level.random_perk_structs[ i ] thread draw_debug_location(); +#/ + i++; + } +} + +draw_debug_location() +{ +/# +#/ +} + +wait_for_round_range( start_round, end_round ) +{ + round_to_spawn = randomintrange( start_round, end_round ); + while ( level.round_number < round_to_spawn ) + { + wait 1; + } +} + +bring_random_perk( machines, machine_triggers ) +{ + count = machines.size; + if ( count <= 0 ) + { + return; + } + index = randomintrange( 0, count ); + bring_perk( machines[ index ], machine_triggers[ index ] ); + arrayremoveindex( machines, index ); + arrayremoveindex( machine_triggers, index ); +} + +bring_perk( machine, trigger ) +{ + players = get_players(); + is_doubletap = 0; + is_sleight = 0; + is_revive = 0; + is_jugger = 0; + flag_waitopen( "perk_vehicle_bringing_in_perk" ); + playsoundatposition( "zmb_perks_incoming_quad_front", ( 0, -1, 0 ) ); + playsoundatposition( "zmb_perks_incoming_alarm", ( -2198, 486, 327 ) ); + machine setclientfield( "clientfield_perk_intro_fx", 1 ); + machine.fx = spawn( "script_model", machine.origin ); + machine.fx playloopsound( "zmb_perks_incoming_loop", 6 ); + machine.fx thread perk_incoming_sound(); + machine.fx.angles = machine.angles; + machine.fx setmodel( "tag_origin" ); + machine.fx linkto( machine ); + machine linkto( level.perk_arrival_vehicle, "tag_origin", ( 0, -1, 0 ), ( 0, -1, 0 ) ); + start_node = getvehiclenode( "perk_arrival_path_" + machine.script_int, "targetname" ); +/# + level.perk_arrival_vehicle thread draw_debug_location(); +#/ + level.perk_arrival_vehicle perk_follow_path( start_node ); + machine unlink(); + offset = ( 0, -1, 0 ); + if ( issubstr( machine.targetname, "doubletap" ) ) + { + forward_dir = anglesToForward( machine.original_angles + vectorScale( ( 0, -1, 0 ), 90 ) ); + offset = vectorScale( forward_dir * -1, 20 ); + is_doubletap = 1; + } + else if ( issubstr( machine.targetname, "sleight" ) ) + { + forward_dir = anglesToForward( machine.original_angles + vectorScale( ( 0, -1, 0 ), 90 ) ); + offset = vectorScale( forward_dir * -1, 5 ); + is_sleight = 1; + } + else if ( issubstr( machine.targetname, "revive" ) ) + { + forward_dir = anglesToForward( machine.original_angles + vectorScale( ( 0, -1, 0 ), 90 ) ); + offset = vectorScale( forward_dir * -1, 10 ); + trigger.blocker_model hide(); + is_revive = 1; + } + else + { + if ( issubstr( machine.targetname, "jugger" ) ) + { + forward_dir = anglesToForward( machine.original_angles + vectorScale( ( 0, -1, 0 ), 90 ) ); + offset = vectorScale( forward_dir * -1, 10 ); + is_jugger = 1; + } + } + if ( !is_revive ) + { + trigger.blocker_model delete(); + } + machine.original_pos += ( offset[ 0 ], offset[ 1 ], 0 ); + machine.origin = machine.original_pos; + machine.angles = machine.original_angles; + if ( is_revive ) + { + level.quick_revive_final_pos = machine.origin; + level.quick_revive_final_angles = machine.angles; + } + machine.fx stoploopsound( 0,5 ); + machine setclientfield( "clientfield_perk_intro_fx", 0 ); + playsoundatposition( "zmb_perks_incoming_land", machine.origin ); + trigger trigger_on(); + machine thread bring_perk_landing_damage(); + machine.fx unlink(); + machine.fx delete(); + machine notify( machine.turn_on_notify ); + level notify( machine.turn_on_notify ); + machine vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0,3, 0,4, 3 ); + machine playsound( "zmb_perks_power_on" ); + machine maps/mp/zombies/_zm_perks::perk_fx( undefined, 1 ); + if ( is_revive ) + { + level.revive_machine_spawned = 1; + machine thread maps/mp/zombies/_zm_perks::perk_fx( "revive_light" ); + } + else if ( is_jugger ) + { + machine thread maps/mp/zombies/_zm_perks::perk_fx( "jugger_light" ); + } + else if ( is_doubletap ) + { + machine thread maps/mp/zombies/_zm_perks::perk_fx( "doubletap_light" ); + } + else + { + if ( is_sleight ) + { + machine thread maps/mp/zombies/_zm_perks::perk_fx( "sleight_light" ); + } + } +} + +perk_incoming_sound() +{ + self endon( "death" ); + wait 10; + self playsound( "zmb_perks_incoming" ); +} + +bring_perk_landing_damage() +{ + player_prone_damage_radius = 300; + earthquake( 0,7, 2,5, self.origin, 1000 ); + radiusdamage( self.origin, player_prone_damage_radius, 10, 5, undefined, "MOD_EXPLOSIVE" ); + exploder( 500 + self.script_int ); + exploder( 511 ); + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( distancesquared( players[ i ].origin, self.origin ) <= ( player_prone_damage_radius * player_prone_damage_radius ) ) + { + players[ i ] setstance( "prone" ); + players[ i ] shellshock( "default", 1,5 ); + radiusdamage( players[ i ].origin, player_prone_damage_radius / 2, 10, 5, undefined, "MOD_EXPLOSIVE" ); + } + i++; + } + zombies = getaiarray( level.zombie_team ); + i = 0; + while ( i < zombies.size ) + { + zombie = zombies[ i ]; + if ( !isDefined( zombie ) || !isalive( zombie ) ) + { + i++; + continue; + } + else + { + if ( distancesquared( zombie.origin, self.origin ) > 250000 ) + { + i++; + continue; + } + else + { + zombie thread perk_machine_knockdown_zombie( self.origin ); + } + } + i++; + } +} + +perk_machine_knockdown_zombie( origin ) +{ + self.a.gib_ref = random( array( "guts", "right_arm", "left_arm" ) ); + self thread maps/mp/animscripts/zm_death::do_gib(); + level.zombie_total++; + level.zombie_total_subtract++; + self dodamage( self.health + 100, origin ); +} + +perk_follow_path( node ) +{ + flag_set( "perk_vehicle_bringing_in_perk" ); + self notify( "newpath" ); + if ( isDefined( node ) ) + { + self.attachedpath = node; + } + pathstart = self.attachedpath; + self.currentnode = self.attachedpath; + if ( !isDefined( pathstart ) ) + { + return; + } + self attachpath( pathstart ); + self startpath(); + self waittill( "reached_end_node" ); + flag_clear( "perk_vehicle_bringing_in_perk" ); +} + +turn_perks_on() +{ + wait 3; + maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors(); +} + +perks_from_the_sky() +{ + level thread turn_perks_on(); + top_height = 8000; + machines = []; + machine_triggers = []; + machines[ 0 ] = getent( "vending_revive", "targetname" ); + if ( !isDefined( machines[ 0 ] ) ) + { + return; + } + machine_triggers[ 0 ] = getent( "vending_revive", "target" ); + move_perk( machines[ 0 ], top_height, 5, 0,001 ); + machine_triggers[ 0 ] trigger_off(); + machines[ 1 ] = getent( "vending_doubletap", "targetname" ); + machine_triggers[ 1 ] = getent( "vending_doubletap", "target" ); + move_perk( machines[ 1 ], top_height, 5, 0,001 ); + machine_triggers[ 1 ] trigger_off(); + machines[ 2 ] = getent( "vending_sleight", "targetname" ); + machine_triggers[ 2 ] = getent( "vending_sleight", "target" ); + move_perk( machines[ 2 ], top_height, 5, 0,001 ); + machine_triggers[ 2 ] trigger_off(); + machines[ 3 ] = getent( "vending_jugg", "targetname" ); + machine_triggers[ 3 ] = getent( "vending_jugg", "target" ); + move_perk( machines[ 3 ], top_height, 5, 0,001 ); + machine_triggers[ 3 ] trigger_off(); + machine_triggers[ 4 ] = getent( "specialty_weapupgrade", "script_noteworthy" ); + machines[ 4 ] = getent( machine_triggers[ 4 ].target, "targetname" ); + move_perk( machines[ 4 ], top_height, 5, 0,001 ); + machine_triggers[ 4 ] trigger_off(); + flag_wait( "initial_blackscreen_passed" ); + wait randomfloatrange( 5, 15 ); + players = get_players(); + if ( players.size == 1 ) + { + wait 4; + index = 0; + bring_perk( machines[ index ], machine_triggers[ index ] ); + arrayremoveindex( machines, index ); + arrayremoveindex( machine_triggers, index ); + } + wait_for_round_range( 3, 5 ); + wait randomintrange( 30, 60 ); + bring_random_perk( machines, machine_triggers ); + wait_for_round_range( 6, 9 ); + wait randomintrange( 30, 60 ); + bring_random_perk( machines, machine_triggers ); + wait_for_round_range( 10, 14 ); + wait randomintrange( 60, 120 ); + bring_random_perk( machines, machine_triggers ); + wait_for_round_range( 15, 19 ); + wait randomintrange( 60, 120 ); + bring_random_perk( machines, machine_triggers ); + wait_for_round_range( 20, 25 ); + wait randomintrange( 60, 120 ); + bring_random_perk( machines, machine_triggers ); +} + +move_perk( ent, dist, time, accel ) +{ + ent.original_pos = ent.origin; + ent.original_angles = ent.angles; + pos = ( ent.origin[ 0 ], ent.origin[ 1 ], ent.origin[ 2 ] + dist ); + ent moveto( pos, time, accel, accel ); +} diff --git a/zm_nuked_patch/maps/mp/zm_nuked_standard.gsc b/zm_nuked_patch/maps/mp/zm_nuked_standard.gsc new file mode 100644 index 0000000..736009f --- /dev/null +++ b/zm_nuked_patch/maps/mp/zm_nuked_standard.gsc @@ -0,0 +1,49 @@ +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +precache() +{ +} + +main() +{ + maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "nuked" ); + maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index ); + level.enemy_location_override_func = ::enemy_location_override; + flag_wait( "initial_blackscreen_passed" ); + flag_set( "power_on" ); + nuked_treasure_chest_init(); +} + +enemy_location_override( zombie, enemy ) +{ + location = enemy.origin; + if ( is_true( self.reroute ) ) + { + if ( isDefined( self.reroute_origin ) ) + { + location = self.reroute_origin; + } + } + return location; +} + +nuked_treasure_chest_init() +{ + chest1 = getstruct( "start_chest1", "script_noteworthy" ); + chest2 = getstruct( "start_chest2", "script_noteworthy" ); + chest3 = getstruct( "culdesac_chest", "script_noteworthy" ); + chest4 = getstruct( "oh2_chest", "script_noteworthy" ); + chest5 = getstruct( "oh1_chest", "script_noteworthy" ); + level.chests = []; + level.chests[ level.chests.size ] = chest1; + level.chests[ level.chests.size ] = chest2; + level.chests[ level.chests.size ] = chest3; + level.chests[ level.chests.size ] = chest4; + level.chests[ level.chests.size ] = chest5; + maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" ); +} diff --git a/zm_nuked_patch/maps/mp/zombies/_zm_melee_weapon.gsc b/zm_nuked_patch/maps/mp/zombies/_zm_melee_weapon.gsc new file mode 100644 index 0000000..ed494ee --- /dev/null +++ b/zm_nuked_patch/maps/mp/zombies/_zm_melee_weapon.gsc @@ -0,0 +1,627 @@ +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init( weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn ) +{ + precacheitem( weapon_name ); + precacheitem( flourish_weapon_name ); + add_melee_weapon( weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn ); + melee_weapon_triggers = getentarray( wallbuy_targetname, "targetname" ); + i = 0; + while ( i < melee_weapon_triggers.size ) + { + knife_model = getent( melee_weapon_triggers[ i ].target, "targetname" ); + if ( isDefined( knife_model ) ) + { + knife_model hide(); + } + melee_weapon_triggers[ i ] thread melee_weapon_think( weapon_name, cost, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name ); + if ( isDefined( level.monolingustic_prompt_format ) && !level.monolingustic_prompt_format ) + { + melee_weapon_triggers[ i ] sethintstring( hint_string, cost ); + if ( getDvarInt( #"1F0A2129" ) && isDefined( level.disable_melee_wallbuy_icons ) && !level.disable_melee_wallbuy_icons ) + { + cursor_hint = "HINT_WEAPON"; + cursor_hint_weapon = weapon_name; + melee_weapon_triggers[ i ] setcursorhint( cursor_hint, cursor_hint_weapon ); + } + else + { + melee_weapon_triggers[ i ] setcursorhint( "HINT_NOICON" ); + } + } + else + { + weapon_display = get_weapon_display_name( weapon_name ); + hint_string = &"ZOMBIE_WEAPONCOSTONLY"; + melee_weapon_triggers[ i ] sethintstring( hint_string, weapon_display, cost ); + if ( getDvarInt( #"1F0A2129" ) && isDefined( level.disable_melee_wallbuy_icons ) && !level.disable_melee_wallbuy_icons ) + { + cursor_hint = "HINT_WEAPON"; + cursor_hint_weapon = weapon_name; + melee_weapon_triggers[ i ] setcursorhint( cursor_hint, cursor_hint_weapon ); + break; + } + else + { + melee_weapon_triggers[ i ] setcursorhint( "HINT_NOICON" ); + } + } + melee_weapon_triggers[ i ] usetriggerrequirelookat(); + i++; + } + melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" ); + i = 0; + while ( i < melee_weapon_structs.size ) + { + prepare_stub( melee_weapon_structs[ i ].trigger_stub, weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn ); + i++; + } + register_melee_weapon_for_level( weapon_name ); + if ( !isDefined( level.ballistic_weapon_name ) ) + { + level.ballistic_weapon_name = []; + } + level.ballistic_weapon_name[ weapon_name ] = ballistic_weapon_name; + if ( !isDefined( level.ballistic_upgraded_weapon_name ) ) + { + level.ballistic_upgraded_weapon_name = []; + } + level.ballistic_upgraded_weapon_name[ weapon_name ] = ballistic_upgraded_weapon_name; +/# + if ( !isDefined( level.zombie_weapons[ weapon_name ] ) ) + { + if ( isDefined( level.devgui_add_weapon ) ) + { + [[ level.devgui_add_weapon ]]( weapon_name, "", weapon_name, cost ); +#/ + } + } +} + +prepare_stub( stub, weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn ) +{ + if ( isDefined( stub ) ) + { + if ( isDefined( level.monolingustic_prompt_format ) && !level.monolingustic_prompt_format ) + { + stub.hint_string = hint_string; + if ( getDvarInt( #"1F0A2129" ) && isDefined( level.disable_melee_wallbuy_icons ) && !level.disable_melee_wallbuy_icons ) + { + stub.cursor_hint = "HINT_WEAPON"; + stub.cursor_hint_weapon = weapon_name; + } + else + { + stub.cursor_hint = "HINT_NOICON"; + stub.cursor_hint_weapon = undefined; + } + } + else + { + stub.hint_parm1 = get_weapon_display_name( weapon_name ); + stub.hint_parm2 = cost; + stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY"; + if ( getDvarInt( #"1F0A2129" ) && isDefined( level.disable_melee_wallbuy_icons ) && !level.disable_melee_wallbuy_icons ) + { + stub.cursor_hint = "HINT_WEAPON"; + stub.cursor_hint_weapon = weapon_name; + } + else + { + stub.cursor_hint = "HINT_NOICON"; + stub.cursor_hint_weapon = undefined; + } + } + stub.cost = cost; + stub.weapon_name = weapon_name; + stub.vo_dialog_id = vo_dialog_id; + stub.flourish_weapon_name = flourish_weapon_name; + stub.ballistic_weapon_name = ballistic_weapon_name; + stub.ballistic_upgraded_weapon_name = ballistic_upgraded_weapon_name; + stub.trigger_func = ::melee_weapon_think; + stub.flourish_fn = flourish_fn; + } +} + +add_stub( stub, weapon_name ) +{ + melee_weapon = undefined; + i = 0; + while ( i < level._melee_weapons.size ) + { + if ( level._melee_weapons[ i ].weapon_name == weapon_name ) + { + melee_weapon = level._melee_weapons[ i ]; + break; + } + else + { + i++; + } + } + if ( isDefined( stub ) && isDefined( melee_weapon ) ) + { + prepare_stub( stub, melee_weapon.weapon_name, melee_weapon.flourish_weapon_name, melee_weapon.ballistic_weapon_name, melee_weapon.ballistic_upgraded_weapon_name, melee_weapon.cost, melee_weapon.wallbuy_targetname, melee_weapon.hint_string, melee_weapon.vo_dialog_id, melee_weapon.flourish_fn ); + } +} + +give_melee_weapon_by_name( weapon_name ) +{ + melee_weapon = undefined; + i = 0; + while ( i < level._melee_weapons.size ) + { + if ( level._melee_weapons[ i ].weapon_name == weapon_name ) + { + melee_weapon = level._melee_weapons[ i ]; + break; + } + else + { + i++; + } + } + if ( isDefined( melee_weapon ) ) + { + self thread give_melee_weapon( melee_weapon.vo_dialog_id, melee_weapon.flourish_weapon_name, melee_weapon.weapon_name, melee_weapon.ballistic_weapon_name, melee_weapon.ballistic_upgraded_weapon_name, melee_weapon.flourish_fn, undefined ); + } +} + +add_melee_weapon( weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn ) +{ + melee_weapon = spawnstruct(); + melee_weapon.weapon_name = weapon_name; + melee_weapon.flourish_weapon_name = flourish_weapon_name; + melee_weapon.ballistic_weapon_name = ballistic_weapon_name; + melee_weapon.ballistic_upgraded_weapon_name = ballistic_upgraded_weapon_name; + melee_weapon.cost = cost; + melee_weapon.wallbuy_targetname = wallbuy_targetname; + melee_weapon.hint_string = hint_string; + melee_weapon.vo_dialog_id = vo_dialog_id; + melee_weapon.flourish_fn = flourish_fn; + if ( !isDefined( level._melee_weapons ) ) + { + level._melee_weapons = []; + } + level._melee_weapons[ level._melee_weapons.size ] = melee_weapon; +} + +player_can_see_weapon_prompt( weapon_name ) +{ + if ( is_true( level._allow_melee_weapon_switching ) ) + { + return 1; + } + if ( isDefined( self get_player_melee_weapon() ) && self hasweapon( self get_player_melee_weapon() ) ) + { + return 0; + } + return 1; +} + +spectator_respawn_all() +{ + i = 0; + while ( i < level._melee_weapons.size ) + { + self spectator_respawn( level._melee_weapons[ i ].wallbuy_targetname, level._melee_weapons[ i ].weapon_name ); + i++; + } +} + +spectator_respawn( wallbuy_targetname, weapon_name ) +{ + melee_triggers = getentarray( wallbuy_targetname, "targetname" ); + players = get_players(); + i = 0; + while ( i < melee_triggers.size ) + { + melee_triggers[ i ] setvisibletoall(); + while ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching ) + { + j = 0; + while ( j < players.size ) + { + if ( !players[ j ] player_can_see_weapon_prompt( weapon_name ) ) + { + melee_triggers[ i ] setinvisibletoplayer( players[ j ] ); + } + j++; + } + } + i++; + } +} + +trigger_hide_all() +{ + i = 0; + while ( i < level._melee_weapons.size ) + { + self trigger_hide( level._melee_weapons[ i ].wallbuy_targetname ); + i++; + } +} + +trigger_hide( wallbuy_targetname ) +{ + melee_triggers = getentarray( wallbuy_targetname, "targetname" ); + i = 0; + while ( i < melee_triggers.size ) + { + melee_triggers[ i ] setinvisibletoplayer( self ); + i++; + } +} + +has_any_ballistic_knife() +{ + if ( self hasweapon( "knife_ballistic_zm" ) ) + { + return 1; + } + if ( self hasweapon( "knife_ballistic_upgraded_zm" ) ) + { + return 1; + } + i = 0; + while ( i < level._melee_weapons.size ) + { + if ( self hasweapon( level._melee_weapons[ i ].ballistic_weapon_name ) ) + { + return 1; + } + if ( self hasweapon( level._melee_weapons[ i ].ballistic_upgraded_weapon_name ) ) + { + return 1; + } + i++; + } + return 0; +} + +has_upgraded_ballistic_knife() +{ + if ( self hasweapon( "knife_ballistic_upgraded_zm" ) ) + { + return 1; + } + i = 0; + while ( i < level._melee_weapons.size ) + { + if ( self hasweapon( level._melee_weapons[ i ].ballistic_upgraded_weapon_name ) ) + { + return 1; + } + i++; + } + return 0; +} + +give_ballistic_knife( weapon_string, upgraded ) +{ + current_melee_weapon = self get_player_melee_weapon(); + if ( isDefined( current_melee_weapon ) ) + { + if ( upgraded && isDefined( level.ballistic_upgraded_weapon_name ) && isDefined( level.ballistic_upgraded_weapon_name[ current_melee_weapon ] ) ) + { + weapon_string = level.ballistic_upgraded_weapon_name[ current_melee_weapon ]; + } + if ( !upgraded && isDefined( level.ballistic_weapon_name ) && isDefined( level.ballistic_weapon_name[ current_melee_weapon ] ) ) + { + weapon_string = level.ballistic_weapon_name[ current_melee_weapon ]; + } + } + return weapon_string; +} + +change_melee_weapon( weapon_name, current_weapon ) +{ + current_melee_weapon = self get_player_melee_weapon(); + if ( isDefined( current_melee_weapon ) && current_melee_weapon != weapon_name ) + { + self takeweapon( current_melee_weapon ); + unacquire_weapon_toggle( current_melee_weapon ); + } + self set_player_melee_weapon( weapon_name ); + had_ballistic = 0; + had_ballistic_upgraded = 0; + ballistic_was_primary = 0; + primaryweapons = self getweaponslistprimaries(); + i = 0; + while ( i < primaryweapons.size ) + { + primary_weapon = primaryweapons[ i ]; + if ( issubstr( primary_weapon, "knife_ballistic_" ) ) + { + had_ballistic = 1; + if ( primary_weapon == current_weapon ) + { + ballistic_was_primary = 1; + } + self notify( "zmb_lost_knife" ); + self takeweapon( primary_weapon ); + unacquire_weapon_toggle( primary_weapon ); + if ( issubstr( primary_weapon, "upgraded" ) ) + { + had_ballistic_upgraded = 1; + } + } + i++; + } + if ( had_ballistic ) + { + if ( had_ballistic_upgraded ) + { + new_ballistic = level.ballistic_upgraded_weapon_name[ weapon_name ]; + if ( ballistic_was_primary ) + { + current_weapon = new_ballistic; + } + self giveweapon( new_ballistic, 0, self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( new_ballistic ) ); + } + else + { + new_ballistic = level.ballistic_weapon_name[ weapon_name ]; + if ( ballistic_was_primary ) + { + current_weapon = new_ballistic; + } + self giveweapon( new_ballistic, 0 ); + } + } + return current_weapon; +} + +melee_weapon_think( weapon_name, cost, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name ) +{ + self.first_time_triggered = 0; + while ( isDefined( self.stub ) ) + { + self endon( "kill_trigger" ); + if ( isDefined( self.stub.first_time_triggered ) ) + { + self.first_time_triggered = self.stub.first_time_triggered; + } + weapon_name = self.stub.weapon_name; + cost = self.stub.cost; + flourish_fn = self.stub.flourish_fn; + vo_dialog_id = self.stub.vo_dialog_id; + flourish_weapon_name = self.stub.flourish_weapon_name; + ballistic_weapon_name = self.stub.ballistic_weapon_name; + ballistic_upgraded_weapon_name = self.stub.ballistic_upgraded_weapon_name; + players = getplayers(); + while ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching ) + { + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] player_can_see_weapon_prompt( weapon_name ) ) + { + self setinvisibletoplayer( players[ i ] ); + } + i++; + } + } + } + for ( ;; ) + { + self waittill( "trigger", player ); + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0,5 ); + continue; + } + else if ( player in_revive_trigger() ) + { + wait 0,1; + continue; + } + else if ( player isthrowinggrenade() ) + { + wait 0,1; + continue; + } + else if ( player.is_drinking > 0 ) + { + wait 0,1; + continue; + } + else if ( player hasweapon( weapon_name ) || player has_powerup_weapon() ) + { + wait 0,1; + continue; + } + else + { + if ( player isswitchingweapons() ) + { + wait 0,1; + break; + } + else current_weapon = player getcurrentweapon(); + if ( !is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) && player has_powerup_weapon() ) + { + wait 0,1; + break; + } + else + { + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission ) + { + wait 0,1; + break; + } + else + { + player_has_weapon = player hasweapon( weapon_name ); + if ( !player_has_weapon ) + { + cost = self.stub.cost; + if ( player maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + cost = int( cost / 2 ); + } + if ( player.score >= cost ) + { + if ( self.first_time_triggered == 0 ) + { + model = getent( self.target, "targetname" ); + if ( isDefined( model ) ) + { + model thread melee_weapon_show( player ); + } + else + { + if ( isDefined( self.clientfieldname ) ) + { + level setclientfield( self.clientfieldname, 1 ); + } + } + self.first_time_triggered = 1; + if ( isDefined( self.stub ) ) + { + self.stub.first_time_triggered = 1; + } + } + player maps/mp/zombies/_zm_score::minus_to_player_score( cost, 1 ); + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, cost, weapon_name, self.origin, "weapon" ); + player thread give_melee_weapon( vo_dialog_id, flourish_weapon_name, weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, flourish_fn, self ); + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon", undefined, 1 ); + } + break; + } + else + { + if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching ) + { + self setinvisibletoplayer( player ); + } + } + } + } + } + } +} + +melee_weapon_show( player ) +{ + player_angles = vectorToAngle( player.origin - self.origin ); + player_yaw = player_angles[ 1 ]; + weapon_yaw = self.angles[ 1 ]; + yaw_diff = angleClamp180( player_yaw - weapon_yaw ); + if ( yaw_diff > 0 ) + { + yaw = weapon_yaw - 90; + } + else + { + yaw = weapon_yaw + 90; + } + self.og_origin = self.origin; + self.origin += anglesToForward( ( 0, yaw, 0 ) ) * 8; + wait 0,05; + self show(); + play_sound_at_pos( "weapon_show", self.origin, self ); + time = 1; + self moveto( self.og_origin, time ); +} + +give_melee_weapon( vo_dialog_id, flourish_weapon_name, weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, flourish_fn, trigger ) +{ + if ( isDefined( flourish_fn ) ) + { + self thread [[ flourish_fn ]](); + } + gun = self do_melee_weapon_flourish_begin( flourish_weapon_name ); + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", vo_dialog_id ); + self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" ); + self do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name ); + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( self.intermission ) && self.intermission ) + { + return; + } + if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching ) + { + if ( isDefined( trigger ) ) + { + trigger setinvisibletoplayer( self ); + } + self trigger_hide_all(); + } +} + +do_melee_weapon_flourish_begin( flourish_weapon_name ) +{ + self increment_is_drinking(); + self disable_player_move_states( 1 ); + gun = self getcurrentweapon(); + weapon = flourish_weapon_name; + self giveweapon( weapon ); + self switchtoweapon( weapon ); + return gun; +} + +do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name ) +{ +/# + assert( !is_zombie_perk_bottle( gun ) ); +#/ +/# + assert( gun != level.revive_tool ); +#/ + self enable_player_move_states(); + weapon = flourish_weapon_name; + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( self.intermission ) && self.intermission ) + { + self takeweapon( weapon ); + self.lastactiveweapon = "none"; + return; + } + self takeweapon( weapon ); + self giveweapon( weapon_name ); + gun = change_melee_weapon( weapon_name, gun ); + if ( self hasweapon( "knife_zm" ) ) + { + self takeweapon( "knife_zm" ); + } + if ( self is_multiple_drinking() ) + { + self decrement_is_drinking(); + return; + } + else if ( gun == "knife_zm" ) + { + self switchtoweapon( weapon_name ); + self decrement_is_drinking(); + return; + } + else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) + { + self switchtoweapon( gun ); + } + else + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + } + self waittill( "weapon_change_complete" ); + if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() && isDefined( self.intermission ) && !self.intermission ) + { + self decrement_is_drinking(); + } +} diff --git a/zm_nuked_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc b/zm_nuked_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc new file mode 100644 index 0000000..04f7af6 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc @@ -0,0 +1,308 @@ +#include maps/mp/zombies/_zm_stats; +#include common_scripts/utility; +#include maps/mp/_utility; + +init() +{ + if ( !isDefined( level.ballistic_knife_autorecover ) ) + { + level.ballistic_knife_autorecover = 1; + } + if ( isDefined( level._uses_retrievable_ballisitic_knives ) && level._uses_retrievable_ballisitic_knives == 1 ) + { + precachemodel( "t5_weapon_ballistic_knife_projectile" ); + precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" ); + } +} + +on_spawn( watcher, player ) +{ + player endon( "death" ); + player endon( "disconnect" ); + player endon( "zmb_lost_knife" ); + level endon( "game_ended" ); + self waittill( "stationary", endpos, normal, angles, attacker, prey, bone ); + isfriendly = 0; + if ( isDefined( endpos ) ) + { + retrievable_model = spawn( "script_model", endpos ); + retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" ); + retrievable_model setowner( player ); + retrievable_model.owner = player; + retrievable_model.angles = angles; + retrievable_model.name = watcher.weapon; + if ( isDefined( prey ) ) + { + if ( isplayer( prey ) && player.team == prey.team ) + { + isfriendly = 1; + } + else + { + if ( isai( prey ) && player.team == prey.team ) + { + isfriendly = 1; + } + } + if ( !isfriendly ) + { + retrievable_model linkto( prey, bone ); + retrievable_model thread force_drop_knives_to_ground_on_death( player, prey ); + } + else + { + if ( isfriendly ) + { + retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) ); + normal = ( 0, 0, 1 ); + } + } + } + watcher.objectarray[ watcher.objectarray.size ] = retrievable_model; + if ( isfriendly ) + { + retrievable_model waittill( "stationary" ); + } + retrievable_model thread drop_knives_to_ground( player ); + if ( isfriendly ) + { + player notify( "ballistic_knife_stationary" ); + } + else + { + player notify( "ballistic_knife_stationary" ); + } + retrievable_model thread wait_to_show_glowing_model( prey ); + } +} + +wait_to_show_glowing_model( prey ) +{ + level endon( "game_ended" ); + self endon( "death" ); + wait 2; + self setmodel( "t5_weapon_ballistic_knife_blade_retrieve" ); +} + +on_spawn_retrieve_trigger( watcher, player ) +{ + player endon( "death" ); + player endon( "disconnect" ); + player endon( "zmb_lost_knife" ); + level endon( "game_ended" ); + player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey ); + if ( !isDefined( retrievable_model ) ) + { + return; + } + trigger_pos = []; + if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) ) + { + trigger_pos[ 0 ] = prey.origin[ 0 ]; + trigger_pos[ 1 ] = prey.origin[ 1 ]; + trigger_pos[ 2 ] = prey.origin[ 2 ] + 10; + } + else + { + trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( 10 * normal[ 0 ] ); + trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( 10 * normal[ 1 ] ); + trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( 10 * normal[ 2 ] ); + } + if ( is_true( level.ballistic_knife_autorecover ) ) + { + trigger_pos[ 2 ] -= 50; + pickup_trigger = spawn( "trigger_radius", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ), 0, 50, 100 ); + } + else + { + pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ) ); + pickup_trigger setcursorhint( "HINT_NOICON" ); + } + pickup_trigger.owner = player; + retrievable_model.retrievabletrigger = pickup_trigger; + hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP"; + if ( isDefined( hint_string ) ) + { + pickup_trigger sethintstring( hint_string ); + } + else + { + pickup_trigger sethintstring( &"GENERIC_PICKUP" ); + } + pickup_trigger setteamfortrigger( player.team ); + player clientclaimtrigger( pickup_trigger ); + pickup_trigger enablelinkto(); + if ( isDefined( prey ) ) + { + pickup_trigger linkto( prey ); + } + else + { + pickup_trigger linkto( retrievable_model ); + } + if ( isDefined( level.knife_planted ) ) + { + [[ level.knife_planted ]]( retrievable_model, pickup_trigger, prey ); + } + retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.weapon, watcher.pickupsoundplayer, watcher.pickupsound ); + player thread watch_shutdown( pickup_trigger, retrievable_model ); +} + +debug_print( endpos ) +{ +/# + self endon( "death" ); + while ( 1 ) + { + print3d( endpos, "pickup_trigger" ); + wait 0,05; +#/ + } +} + +watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse ) +{ + self endon( "death" ); + self endon( "delete" ); + level endon( "game_ended" ); + max_ammo = weaponmaxammo( weapon ) + 1; + autorecover = is_true( level.ballistic_knife_autorecover ); + while ( 1 ) + { + trigger waittill( "trigger", player ); + while ( !isalive( player ) ) + { + continue; + } + if ( !player isonground() && !is_true( trigger.force_pickup ) ) + { + continue; + } + if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) + { + continue; + } + if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) + { + continue; + } + ammo_stock = player getweaponammostock( weapon ); + ammo_clip = player getweaponammoclip( weapon ); + current_weapon = player getcurrentweapon(); + total_ammo = ammo_stock + ammo_clip; + hasreloaded = 1; + if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == weapon ) + { + hasreloaded = 0; + } + if ( total_ammo >= max_ammo || !hasreloaded ) + { + continue; + } + if ( !autorecover && player usebuttonpressed() && !player.throwinggrenade || !player meleebuttonpressed() && is_true( trigger.force_pickup ) ) + { + if ( isDefined( playersoundonuse ) ) + { + player playlocalsound( playersoundonuse ); + } + if ( isDefined( npcsoundonuse ) ) + { + player playsound( npcsoundonuse ); + } + player thread [[ callback ]]( weapon, model, trigger ); + return; + } + else + { + } + } +} + +pick_up( weapon, model, trigger ) +{ + if ( self hasweapon( weapon ) ) + { + current_weapon = self getcurrentweapon(); + if ( current_weapon != weapon ) + { + clip_ammo = self getweaponammoclip( weapon ); + if ( !clip_ammo ) + { + self setweaponammoclip( weapon, 1 ); + } + else + { + new_ammo_stock = self getweaponammostock( weapon ) + 1; + self setweaponammostock( weapon, new_ammo_stock ); + } + } + else + { + new_ammo_stock = self getweaponammostock( weapon ) + 1; + self setweaponammostock( weapon, new_ammo_stock ); + } + } + self maps/mp/zombies/_zm_stats::increment_client_stat( "ballistic_knives_pickedup" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "ballistic_knives_pickedup" ); + model destroy_ent(); + trigger destroy_ent(); +} + +destroy_ent() +{ + if ( isDefined( self ) ) + { + if ( isDefined( self.glowing_model ) ) + { + self.glowing_model delete(); + } + self delete(); + } +} + +watch_shutdown( trigger, model ) +{ + self waittill_any( "death_or_disconnect", "zmb_lost_knife" ); + trigger destroy_ent(); + model destroy_ent(); +} + +drop_knives_to_ground( player ) +{ + player endon( "death" ); + player endon( "zmb_lost_knife" ); + for ( ;; ) + { + level waittill( "drop_objects_to_ground", origin, radius ); + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) + { + self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) ); + self thread update_retrieve_trigger( player ); + } + } +} + +force_drop_knives_to_ground_on_death( player, prey ) +{ + self endon( "death" ); + player endon( "zmb_lost_knife" ); + prey waittill( "death" ); + self unlink(); + self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) ); + self thread update_retrieve_trigger( player ); +} + +update_retrieve_trigger( player ) +{ + self endon( "death" ); + player endon( "zmb_lost_knife" ); + if ( isDefined( level.custom_update_retrieve_trigger ) ) + { + self [[ level.custom_update_retrieve_trigger ]]( player ); + return; + } + self waittill( "stationary" ); + trigger = self.retrievabletrigger; + trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 ); + trigger linkto( self ); +} diff --git a/zm_nuked_patch/maps/mp/zombies/_zm_weap_bowie.gsc b/zm_nuked_patch/maps/mp/zombies/_zm_weap_bowie.gsc new file mode 100644 index 0000000..4ad88c6 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zombies/_zm_weap_bowie.gsc @@ -0,0 +1,19 @@ +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + if ( isDefined( level.bowie_cost ) ) + { + cost = level.bowie_cost; + } + else + { + cost = 3000; + } + maps/mp/zombies/_zm_melee_weapon::init( "bowie_knife_zm", "zombie_bowie_flourish", "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", cost, "bowie_upgrade", &"ZOMBIE_WEAPON_BOWIE_BUY", "bowie", undefined ); + maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie" ); + maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie_upgraded" ); +} diff --git a/zm_nuked_patch/maps/mp/zombies/_zm_weap_claymore.gsc b/zm_nuked_patch/maps/mp/zombies/_zm_weap_claymore.gsc new file mode 100644 index 0000000..47f5b66 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zombies/_zm_weap_claymore.gsc @@ -0,0 +1,482 @@ +#include maps/mp/gametypes_zm/_weaponobjects; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + if ( !isDefined( level.claymores_max_per_player ) ) + { + level.claymores_max_per_player = 12; + } + trigs = getentarray( "claymore_purchase", "targetname" ); + i = 0; + while ( i < trigs.size ) + { + model = getent( trigs[ i ].target, "targetname" ); + if ( isDefined( model ) ) + { + model hide(); + } + i++; + } + array_thread( trigs, ::buy_claymores ); + level thread give_claymores_after_rounds(); + level.claymores_on_damage = ::satchel_damage; + level.pickup_claymores = ::pickup_claymores; + level.pickup_claymores_trigger_listener = ::pickup_claymores_trigger_listener; + level.claymore_detectiondot = cos( 70 ); + level.claymore_detectionmindist = 20; + level._effect[ "claymore_laser" ] = loadfx( "weapon/claymore/fx_claymore_laser" ); +} + +buy_claymores() +{ + self.zombie_cost = 1000; + self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" ); + self setcursorhint( "HINT_WEAPON", "claymore_zm" ); + self endon( "kill_trigger" ); + if ( !isDefined( self.stub ) ) + { + return; + } + if ( isDefined( self.stub ) && !isDefined( self.stub.claymores_triggered ) ) + { + self.stub.claymores_triggered = 0; + } + self.claymores_triggered = self.stub.claymores_triggered; + while ( 1 ) + { + self waittill( "trigger", who ); + while ( who in_revive_trigger() ) + { + continue; + } + while ( who has_powerup_weapon() ) + { + wait 0,1; + } + if ( is_player_valid( who ) ) + { + if ( who.score >= self.zombie_cost ) + { + if ( !who is_player_placeable_mine( "claymore_zm" ) ) + { + play_sound_at_pos( "purchase", self.origin ); + who maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost ); + who thread claymore_setup(); + who thread show_claymore_hint( "claymore_purchased" ); + who thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" ); + if ( isDefined( self.stub ) ) + { + self.claymores_triggered = self.stub.claymores_triggered; + } + if ( self.claymores_triggered == 0 ) + { + model = getent( self.target, "targetname" ); + if ( isDefined( model ) ) + { + model thread maps/mp/zombies/_zm_weapons::weapon_show( who ); + } + else + { + if ( isDefined( self.clientfieldname ) ) + { + level setclientfield( self.clientfieldname, 1 ); + } + } + self.claymores_triggered = 1; + if ( isDefined( self.stub ) ) + { + self.stub.claymores_triggered = 1; + } + } + trigs = getentarray( "claymore_purchase", "targetname" ); + i = 0; + while ( i < trigs.size ) + { + trigs[ i ] setinvisibletoplayer( who ); + i++; + } + } + else who thread show_claymore_hint( "already_purchased" ); + break; + } + else + { + who play_sound_on_ent( "no_purchase" ); + who maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon" ); + } + } + } +} + +claymore_unitrigger_update_prompt( player ) +{ + if ( player is_player_placeable_mine( "claymore_zm" ) ) + { + self sethintstring( "" ); + self setcursorhint( "HINT_NOICON" ); + return 0; + } + self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" ); + self setcursorhint( "HINT_WEAPON", "claymore_zm" ); + return 1; +} + +set_claymore_visible() +{ + players = get_players(); + trigs = getentarray( "claymore_purchase", "targetname" ); + while ( 1 ) + { + j = 0; + while ( j < players.size ) + { + while ( !players[ j ] is_player_placeable_mine( "claymore_zm" ) ) + { + i = 0; + while ( i < trigs.size ) + { + trigs[ i ] setinvisibletoplayer( players[ j ], 0 ); + i++; + } + } + j++; + } + wait 1; + players = get_players(); + } +} + +claymore_safe_to_plant() +{ + if ( self.owner.claymores.size >= level.claymores_max_per_player ) + { + return 0; + } + if ( isDefined( level.claymore_safe_to_plant ) ) + { + return self [[ level.claymore_safe_to_plant ]](); + } + return 1; +} + +claymore_wait_and_detonate() +{ + wait 0,1; + self detonate( self.owner ); +} + +claymore_watch() +{ + self endon( "death" ); + self notify( "claymore_watch" ); + self endon( "claymore_watch" ); + while ( 1 ) + { + self waittill( "grenade_fire", claymore, weapname ); + if ( weapname == "claymore_zm" ) + { + claymore.owner = self; + claymore.team = self.team; + self notify( "zmb_enable_claymore_prompt" ); + if ( claymore claymore_safe_to_plant() ) + { + if ( isDefined( level.claymore_planted ) ) + { + self thread [[ level.claymore_planted ]]( claymore ); + } + claymore thread claymore_detonation(); + claymore thread play_claymore_effects(); + self maps/mp/zombies/_zm_stats::increment_client_stat( "claymores_planted" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "claymores_planted" ); + break; + } + else + { + claymore thread claymore_wait_and_detonate(); + } + } + } +} + +claymore_setup() +{ + if ( !isDefined( self.claymores ) ) + { + self.claymores = []; + } + self thread claymore_watch(); + self giveweapon( "claymore_zm" ); + self set_player_placeable_mine( "claymore_zm" ); + self setactionslot( 4, "weapon", "claymore_zm" ); + self setweaponammostock( "claymore_zm", 2 ); +} + +adjust_trigger_origin( origin ) +{ + origin += vectorScale( ( 0, 0, 1 ), 20 ); + return origin; +} + +on_spawn_retrieve_trigger( watcher, player ) +{ + self maps/mp/gametypes_zm/_weaponobjects::onspawnretrievableweaponobject( watcher, player ); + if ( isDefined( self.pickuptrigger ) ) + { + self.pickuptrigger sethintlowpriority( 0 ); + } +} + +pickup_claymores() +{ + player = self.owner; + if ( !player hasweapon( "claymore_zm" ) ) + { + player thread claymore_watch(); + player giveweapon( "claymore_zm" ); + player set_player_placeable_mine( "claymore_zm" ); + player setactionslot( 4, "weapon", "claymore_zm" ); + player setweaponammoclip( "claymore_zm", 0 ); + player notify( "zmb_enable_claymore_prompt" ); + } + else + { + clip_ammo = player getweaponammoclip( self.name ); + clip_max_ammo = weaponclipsize( self.name ); + if ( clip_ammo >= clip_max_ammo ) + { + self destroy_ent(); + player notify( "zmb_disable_claymore_prompt" ); + return; + } + } + self pick_up(); + clip_ammo = player getweaponammoclip( self.name ); + clip_max_ammo = weaponclipsize( self.name ); + if ( clip_ammo >= clip_max_ammo ) + { + player notify( "zmb_disable_claymore_prompt" ); + } + player maps/mp/zombies/_zm_stats::increment_client_stat( "claymores_pickedup" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "claymores_pickedup" ); +} + +pickup_claymores_trigger_listener( trigger, player ) +{ + self thread pickup_claymores_trigger_listener_enable( trigger, player ); + self thread pickup_claymores_trigger_listener_disable( trigger, player ); +} + +pickup_claymores_trigger_listener_enable( trigger, player ) +{ + self endon( "delete" ); + self endon( "death" ); + while ( 1 ) + { + player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" ); + if ( !isDefined( trigger ) ) + { + return; + } + trigger trigger_on(); + trigger linkto( self ); + } +} + +pickup_claymores_trigger_listener_disable( trigger, player ) +{ + self endon( "delete" ); + self endon( "death" ); + while ( 1 ) + { + player waittill( "zmb_disable_claymore_prompt" ); + if ( !isDefined( trigger ) ) + { + return; + } + trigger unlink(); + trigger trigger_off(); + } +} + +shouldaffectweaponobject( object ) +{ + pos = self.origin + vectorScale( ( 0, 0, 1 ), 32 ); + dirtopos = pos - object.origin; + objectforward = anglesToForward( object.angles ); + dist = vectordot( dirtopos, objectforward ); + if ( dist < level.claymore_detectionmindist ) + { + return 0; + } + dirtopos = vectornormalize( dirtopos ); + dot = vectordot( dirtopos, objectforward ); + return dot > level.claymore_detectiondot; +} + +claymore_detonation() +{ + self endon( "death" ); + self waittill_not_moving(); + detonateradius = 96; + damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 2 ); + damagearea setexcludeteamfortrigger( self.team ); + damagearea enablelinkto(); + damagearea linkto( self ); + if ( is_true( self.isonbus ) ) + { + damagearea setmovingplatformenabled( 1 ); + } + self.damagearea = damagearea; + self thread delete_claymores_on_death( self.owner, damagearea ); + self.owner.claymores[ self.owner.claymores.size ] = self; + while ( 1 ) + { + damagearea waittill( "trigger", ent ); + if ( isDefined( self.owner ) && ent == self.owner ) + { + continue; + } + while ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == self.team ) + { + continue; + } + if ( isDefined( ent.ignore_claymore ) && ent.ignore_claymore ) + { + continue; + } + while ( !ent shouldaffectweaponobject( self ) ) + { + continue; + } + if ( ent damageconetrace( self.origin, self ) > 0 ) + { + self playsound( "wpn_claymore_alert" ); + wait 0,4; + if ( isDefined( self.owner ) ) + { + self detonate( self.owner ); + } + else + { + self detonate( undefined ); + } + return; + } + } +} + +delete_claymores_on_death( player, ent ) +{ + self waittill( "death" ); + if ( isDefined( player ) ) + { + arrayremovevalue( player.claymores, self ); + } + wait 0,05; + if ( isDefined( ent ) ) + { + ent delete(); + } +} + +satchel_damage() +{ + self endon( "death" ); + self setcandamage( 1 ); + self.health = 100000; + self.maxhealth = self.health; + attacker = undefined; + while ( 1 ) + { + self waittill( "damage", amount, attacker ); + if ( !isDefined( self ) ) + { + return; + } + self.health = self.maxhealth; + while ( !isplayer( attacker ) ) + { + continue; + } + if ( isDefined( self.owner ) && attacker == self.owner ) + { + continue; + } + while ( isDefined( attacker.pers ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] != level.zombie_team ) + { + continue; + } + } + if ( level.satchelexplodethisframe ) + { + wait ( 0,1 + randomfloat( 0,4 ) ); + } + else wait 0,05; + if ( !isDefined( self ) ) + { + return; + } + level.satchelexplodethisframe = 1; + thread reset_satchel_explode_this_frame(); + self detonate( attacker ); +} + +reset_satchel_explode_this_frame() +{ + wait 0,05; + level.satchelexplodethisframe = 0; +} + +play_claymore_effects() +{ + self endon( "death" ); + self waittill_not_moving(); + playfxontag( level._effect[ "claymore_laser" ], self, "tag_fx" ); +} + +give_claymores_after_rounds() +{ + while ( 1 ) + { + level waittill( "between_round_over" ); + while ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] is_player_placeable_mine( "claymore_zm" ) ) + { + players[ i ] giveweapon( "claymore_zm" ); + players[ i ] set_player_placeable_mine( "claymore_zm" ); + players[ i ] setactionslot( 4, "weapon", "claymore_zm" ); + players[ i ] setweaponammoclip( "claymore_zm", 2 ); + } + i++; + } + } + } +} + +show_claymore_hint( string ) +{ + self endon( "death" ); + self endon( "disconnect" ); + if ( string == "claymore_purchased" ) + { + text = &"ZOMBIE_CLAYMORE_HOWTO"; + } + else + { + text = &"ZOMBIE_CLAYMORE_ALREADY_PURCHASED"; + } + show_equipment_hint_text( text ); +} diff --git a/zm_nuked_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc b/zm_nuked_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc new file mode 100644 index 0000000..48ea6b2 --- /dev/null +++ b/zm_nuked_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc @@ -0,0 +1,120 @@ +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + registerclientfield( "toplayer", "tazer_flourish", 1, 1, "int" ); + register_melee_weapon_for_level( "tazer_knuckles_zm" ); + if ( isDefined( level.tazer_cost ) ) + { + cost = level.tazer_cost; + } + else + { + cost = 6000; + } + level.use_tazer_impact_fx = 0; + maps/mp/zombies/_zm_melee_weapon::init( "tazer_knuckles_zm", "zombie_tazer_flourish", "knife_ballistic_no_melee_zm", "knife_ballistic_no_melee_upgraded_zm", cost, "tazer_upgrade", &"ZOMBIE_WEAPON_TAZER_BUY", "tazerknuckles", ::tazer_flourish_fx ); + maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee" ); + maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee_upgraded" ); + maps/mp/zombies/_zm_spawner::add_cusom_zombie_spawn_logic( ::watch_bodily_functions ); + level._effect[ "fx_zmb_taser_vomit" ] = loadfx( "maps/zombie/fx_zmb_taser_vomit" ); + level._effect[ "fx_zmb_taser_flourish" ] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" ); + if ( level.script != "zm_transit" ) + { + level._effect[ "fx_zmb_tazer_impact" ] = loadfx( "weapon/taser/fx_taser_knuckles_impact_zmb" ); + level.use_tazer_impact_fx = 1; + } + level.tazer_flourish_delay = 0,5; +} + +watch_bodily_functions() +{ + if ( isDefined( self.isscreecher ) || self.isscreecher && isDefined( self.is_avogadro ) && self.is_avogadro ) + { + return; + } + while ( isDefined( self ) && isalive( self ) ) + { + self waittill( "damage", amount, attacker, direction_vec, point, type ); + if ( !isDefined( self ) ) + { + return; + } + if ( !isDefined( attacker ) || !isplayer( attacker ) ) + { + continue; + } + while ( type != "MOD_MELEE" ) + { + continue; + } + if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped ) + { + continue; + } + ch = randomint( 100 ); + if ( ch < 4 ) + { + playfxontag( level._effect[ "fx_zmb_taser_vomit" ], self, "j_neck" ); + } + if ( level.use_tazer_impact_fx ) + { + tags = []; + tags[ 0 ] = "J_Head"; + tags[ 1 ] = "J_Neck"; + playfxontag( level._effect[ "fx_zmb_tazer_impact" ], self, random( tags ) ); + } + } +} + +onplayerconnect() +{ + self thread onplayerspawned(); +} + +onplayerspawned() +{ + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread watchtazerknucklemelee(); + } +} + +watchtazerknucklemelee() +{ + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "weapon_melee", weapon ); + if ( weapon == "tazer_knuckles_zm" ) + { + self tazerknuckle_melee(); + } + } +} + +tazerknuckle_melee() +{ +} + +tazer_flourish_fx() +{ + self waittill( "weapon_change", newweapon ); + if ( newweapon == "zombie_tazer_flourish" ) + { + self endon( "weapon_change" ); + wait level.tazer_flourish_delay; + self thread maps/mp/zombies/_zm_audio::playerexert( "hitmed" ); + self setclientfieldtoplayer( "tazer_flourish", 1 ); + wait_network_frame(); + self setclientfieldtoplayer( "tazer_flourish", 0 ); + } +} diff --git a/zm_nuked_patch/readme.md b/zm_nuked_patch/readme.md index 00e97dc..7ded8f8 100644 --- a/zm_nuked_patch/readme.md +++ b/zm_nuked_patch/readme.md @@ -11,4 +11,19 @@ zm_nuked_patch/maps/mp/zm_nuked.gsc ### The following scripts compile but cause a minidump or other severe error: +### The following scripts are not checked yet, uploaded to setup a baseline: +``` +zm_nuked_patch/maps/mp/zombies/_zm_melee_weapon.gsc +zm_nuked_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc +zm_nuked_patch/maps/mp/zombies/_zm_weap_bowie.gsc +zm_nuked_patch/maps/mp/zombies/_zm_weap_claymore.gsc +zm_nuked_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc + +zm_nuked_patch/maps/mp/zm_nuked_ffotd.gsc +zm_nuked_patch/maps/mp/zm_nuked_fx.gsc +zm_nuked_patch/maps/mp/zm_nuked_gamemodes.gsc +zm_nuked_patch/maps/mp/zm_nuked_perks.gsc +zm_nuked_patch/maps/mp/zm_nuked_standard.gsc +``` + ### notes: