Just a fun script i came across a few days ago, have it laying around for ages but not going to use it myself prob so why not upload it?
Instructions included in the dl as well.
Add this to a .csv:
// mortar strike sound,mortar_strike,,, weapon,sp/mortar_strike material,hud_icon_m8_white_smoke xmodel,projectile_us_smoke_grenade xmodel,mortar_shell fx,weapon/satchel/fx_explosion_satchel_generic fx,blst_custom/streak_marker_smoke fx,misc/fx_ui_airstrike_smk_green
Open _zombiemode, around line 60-70 you'll see similar line's. Add this one:
maps\_blst_mortar_strike::init();
( this might be a bit different in your version of _weapons, so pay attention! )
open _zombiemode_weapons, and look for this line inside the treasure_chest_give_weapon() function:
if( !( weapon_string == "fraggrenade" || weapon_string == "stielhandgranate" || weapon_string == "molotov" || weapon_string == "zombie_cymbal_monkey" ) )
Add this part to it:
|| weapon_string == "mortar_strike"
So it looks like:
if( !( weapon_string == "fraggrenade" || weapon_string == "stielhandgranate" || weapon_string == "molotov" || weapon_string == "zombie_cymbal_monkey" || weapon_string == "mortar_strike" ) )
Next a few lines down, you'll see this line:
if( weapon_string != "fraggrenade" && weapon_string != "stielhandgranate" && weapon_string != "molotov" && weapon_string != "zombie_cymbal_monkey" )
This time we're going to add:
&& weapon_string != "mortar_strike"
So in the end it looks like:
if( weapon_string != "fraggrenade" && weapon_string != "stielhandgranate" && weapon_string != "molotov" && weapon_string != "zombie_cymbal_monkey" && weapon_string != "mortar_strike" )
Next look for the function treasure_chest_give_weapon(), and in there look for these lines:
self GiveWeapon( weapon_string, 0 ); self GiveMaxAmmo( weapon_string ); self SwitchToWeapon( weapon_string );
Right ABOVE those lines, paste in these new ones:
if( weapon_string == "mortar_strike" ) { self thread maps\_blst_mortar_strike::player_give_mortar(); play_weapon_vo("zombie_cymbal_monkey"); return; }
Dont forget to add the weapon 'mortar_strike" to both dlc3_code and _zombiemode_weapons, like you would with any other weapon.
If you want to give the players a mortar strike in another way then through the box, use this line of code ( using 'give' in the console will not work!! ):
player thread maps\_blst_mortar_strike::player_give_mortar();
The Script:
#include maps\_utility; #include common_scripts\utility; #include maps\_zombiemode_utility; //////////////////////////////////////////////// ///// Mortar Strike: ///// ///// by: BluntStuffy ///// ///// Please give credit when used.. ///// //////////////////////////////////////////////// init() { // level thread test_mortar_strike(); // put this line back in to get a mortar strike 3 seconds after the game starts ( for testing ) level.mortar_drop_count = 35; // amount of mortars that will be launched level.mortar_damages_other_players = false; // if other players can take damage from your mortar strike level.player_mortar_radius = 250; // radius of effect of the mortars on the players level.player_mortar_damage = 50; // max damage from a mortar, when a player is in the center of the radius level.zombie_mortar_radius = 300; // radius of effect of the mortars on zombies level.zombie_mortar_damage = 1200; // max damage from a mortar, when a zombie is in the center of the radius level._effect[ "marker_explode" ] = loadfx( "misc/fx_ui_airstrike_smk_green"); level._effect[ "mortar_explosion" ] = loadfx( "weapon/satchel/fx_explosion_satchel_generic"); level._effect[ "mortar_trail" ] = loadfx( "weapon/grenade/fx_trail_rifle_grenade" ); precachemodel( "mortar_shell" ); } test_mortar_strike() { wait 3; player = get_players(); for( i=0 ;i<player.size ; i++ ) { player[i] thread player_give_mortar(); } } player_give_mortar() { self giveweapon("mortar_strike"); self setactionslot(3,"weapon","mortar_strike"); self setweaponammostock("mortar_strike",1); self thread player_marker_fired(); } player_marker_fired() { self notify( "starting_mortar_watch" ); self endon( "starting_mortar_watch" ); while( 1 ) { grenade = get_thrown_marker(); if( isdefined( grenade ) ) { if( self maps\_laststand::player_is_in_laststand() ) { grenade delete(); continue; } grenade hide(); model = spawn( "script_model", grenade.origin ); model SetModel( "projectile_us_smoke_grenade" ); model linkTo( grenade ); model.angles = grenade.angles; velocitySq = 100000; oldPos = grenade.origin; while( velocitySq != 0 ) { wait( 0.05 ); velocitySq = distanceSquared( grenade.origin, oldPos ); oldPos = grenade.origin; } model unlink(); model thread marker_model_cleanup( grenade ); level thread mortar_strike( grenade.origin, self ); } wait 0.05; } } get_thrown_marker() { self endon( "starting_mortar_watch" ); while( true ) { self waittill( "grenade_fire", grenade, weapname ); if( weapname == "mortar_strike" ) { return grenade; } wait 0.05; } } marker_model_cleanup( grenade ) { while( 1 ) { if( !isDefined( grenade ) ) { if( isDefined( self ) ) { playfx( level._effect["marker_explode"], self.origin ); self delete(); } break; } wait 0.05; } } mortar_strike( origin, player ) { mortar_count = level.mortar_drop_count; mortar_impacts = []; mortar = []; for( i=0;i<mortar_count;i++ ) { offset1 = randomintrange( -400, 401 ); offset2 = randomintrange( -400, 401 ); offset3 = origin+(0,0,75); mortar_impacts[mortar_impacts.size] = (groundpos( origin+(offset1,offset2,offset3[2]) ) + (0,0,15) ); } wait 3; offset1 = randomintrange( 600, 701 ); offset2 = randomintrange( 600, 701 ); for( i=0;i<mortar_impacts.size;i++ ) { mortar_angle = vectortoangles( mortar_impacts[i]+(offset1,offset2,2500) - mortar_impacts[i] ); mortar[i] = spawn( "script_model", mortar_impacts[i]+(offset1,offset2,2500) ); mortar[i] setmodel( "mortar_shell" ); mortar[i].angles = (mortar_angle-(90,0,90)); mortar[i] hide(); wait randomfloatrange( 0.10, 0.35 ); mortar[i] thread fire_mortar( mortar_impacts[i], player ); } } fire_mortar( impact_origin, player ) { self show(); self.fx_tag = spawn( "script_model", self.origin ); self.fx_tag setmodel( "tag_origin" ); self.fx_tag.angles = self.angles; self.fx_tag linkto( self ); playfxontag( level._effect["mortar_trail"], self.fx_tag, "tag_origin" ); self moveto( impact_origin, 0.8, 0.15, 0 ); playsoundatposition( "mortar_incoming", impact_origin ); wait 0.9; self.fx_tag unlink(); self.fx_tag delete(); Earthquake( 0.6, 0.5, impact_origin, 450); playfx( level._effect["mortar_explosion"], impact_origin ); playsoundatposition( "grenade_explode", impact_origin ); mortar_damage_players(impact_origin, player); mortar_damage_zombies(impact_origin, player); physicsexplosioncylinder( impact_origin, 400, 75, 1 ); self delete(); } mortar_damage_players(impact_origin, player) { players = get_array_of_closest(impact_origin, get_players(), undefined, undefined, level.player_mortar_radius); if( isdefined( players ) && players.size != 0 ) { for(i=0;i<players.size;i++) { if( players[i] != player && !level.mortar_damages_other_players ) { continue; } dist_mult = 1 - ( (distance( players[i].origin, impact_origin ))/level.player_mortar_radius ); damage = int( dist_mult*level.player_mortar_damage ); if( damage < 15 ) { damage = 15; } RadiusDamage( players[i].origin, 10, damage, (damage-10) ); // iprintln( "player damage: "+damage ); } } } mortar_damage_zombies(impact_origin, player) { zombs = get_array_of_closest(impact_origin, getaispeciesarray( "axis" ), undefined, undefined, level.zombie_mortar_radius); if( isdefined( zombs ) && zombs.size != 0 ) { for(i=0;i<zombs.size;i++) { dist_mult = 1 - ( (distance( zombs[i].origin, impact_origin ))/level.zombie_mortar_radius ); damage = int( dist_mult*level.zombie_mortar_damage ); if( damage < 75 ) { damage = 75; } if( !zombs[i].gibbed && dist_mult > 0.3 ) { refs = []; refs[refs.size] = "guts"; refs[refs.size] = "right_arm"; refs[refs.size] = "left_arm"; refs[refs.size] = "right_leg"; refs[refs.size] = "left_leg"; refs[refs.size] = "no_legs"; zombs[i].a.gib_ref = animscripts\death::get_random( refs ); zombs[i] thread animscripts\death::do_gib(); } zombs[i] dodamage( damage, self.origin, player ); // iprintln( "zombie damage: "+damage ); } } }