Uploaded 10 zm_nuked_patch scripts as a baseline.

This commit is contained in:
JezuzLizard 2020-10-26 07:34:10 -07:00
parent dd5046dc45
commit 93f1071e7b
11 changed files with 2294 additions and 0 deletions

View File

@ -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 );
}
}
}
}

View File

@ -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 );
}

View File

@ -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 );
}

View File

@ -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 );
}

View File

@ -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" );
}

View File

@ -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();
}
}

View File

@ -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 );
}

View File

@ -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" );
}

View File

@ -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 );
}

View File

@ -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 );
}
}

View File

@ -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: