mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-09 02:17:51 -05:00
added 42 scripts to zm_transit_patch as a baseline
This commit is contained in:
parent
238cfb5b71
commit
866baa824c
2473
zm_transit_patch/maps/mp/gametypes_zm/zmeat.gsc
Normal file
2473
zm_transit_patch/maps/mp/gametypes_zm/zmeat.gsc
Normal file
File diff suppressed because it is too large
Load Diff
43
zm_transit_patch/maps/mp/gametypes_zm/zstandard.gsc
Normal file
43
zm_transit_patch/maps/mp/gametypes_zm/zstandard.gsc
Normal file
@ -0,0 +1,43 @@
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/zombies/_zm_ai_dogs;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::main();
|
||||
level.onprecachegametype = ::onprecachegametype;
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level._game_module_custom_spawn_init_func = ::maps/mp/gametypes_zm/_zm_gametype::custom_spawn_init_func;
|
||||
level._game_module_stat_update_func = ::maps/mp/zombies/_zm_stats::survival_classic_custom_stat_update;
|
||||
maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zstandard" );
|
||||
}
|
||||
|
||||
onprecachegametype()
|
||||
{
|
||||
level.playersuicideallowed = 1;
|
||||
level.canplayersuicide = ::canplayersuicide;
|
||||
level.suicide_weapon = "death_self_zm";
|
||||
precacheitem( "death_self_zm" );
|
||||
maps/mp/zombies/_zm_ai_dogs::init();
|
||||
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zstandard" );
|
||||
}
|
||||
|
||||
onstartgametype()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_classic_gametype();
|
||||
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zstandard", ::zstandard_main );
|
||||
}
|
||||
|
||||
zstandard_main()
|
||||
{
|
||||
level.dog_rounds_allowed = getgametypesetting( "allowdogs" );
|
||||
if ( level.dog_rounds_allowed )
|
||||
{
|
||||
maps/mp/zombies/_zm_ai_dogs::enable_dog_rounds();
|
||||
}
|
||||
level thread maps/mp/zombies/_zm::round_start();
|
||||
level thread maps/mp/gametypes_zm/_zm_gametype::kill_all_zombies();
|
||||
}
|
3587
zm_transit_patch/maps/mp/zm_transit.gsc
Normal file
3587
zm_transit_patch/maps/mp/zm_transit.gsc
Normal file
File diff suppressed because it is too large
Load Diff
181
zm_transit_patch/maps/mp/zm_transit_achievement.gsc
Normal file
181
zm_transit_patch/maps/mp/zm_transit_achievement.gsc
Normal file
@ -0,0 +1,181 @@
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( is_classic() )
|
||||
{
|
||||
level thread achievement_transit_sidequest();
|
||||
level thread achievement_undead_mans_party_bus();
|
||||
}
|
||||
level.achievement_sound_func = ::achievement_sound_func;
|
||||
onplayerconnect_callback( ::onplayerconnect );
|
||||
}
|
||||
|
||||
init_player_achievement_stats()
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dont_fire_until_you_see", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_the_lights_of_their_eyes", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dance_on_my_grave", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_standard_equipment_may_vary", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_you_have_no_power_over_me", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_i_dont_think_they_exist", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_fuel_efficient", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_happy_hour", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_transit_sidequest", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_undead_mans_party_bus", 0 );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
self thread achievement_the_lights_of_their_eyes();
|
||||
self thread achievement_dance_on_my_grave();
|
||||
if ( is_classic() )
|
||||
{
|
||||
self thread achievement_dont_fire_until_you_see();
|
||||
self thread achievement_standard_equipment_may_vary();
|
||||
self thread achievement_you_have_no_power_over_me();
|
||||
self thread achievement_i_dont_think_they_exist();
|
||||
self thread achievement_fuel_efficient();
|
||||
self thread achievement_zm_happy_hour();
|
||||
}
|
||||
}
|
||||
|
||||
achievement_transit_sidequest()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level waittill( "transit_sidequest_achieved" );
|
||||
level giveachievement_wrapper( "ZM_TRANSIT_SIDEQUEST", 1 );
|
||||
}
|
||||
|
||||
achievement_undead_mans_party_bus()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 0,05;
|
||||
flag_wait( "ladder_attached" );
|
||||
flag_wait( "catcher_attached" );
|
||||
flag_wait( "hatch_attached" );
|
||||
/#
|
||||
#/
|
||||
level giveachievement_wrapper( "ZM_UNDEAD_MANS_PARTY_BUS", 1 );
|
||||
}
|
||||
|
||||
achievement_dont_fire_until_you_see()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "burned" );
|
||||
zombie_doors = getentarray( "zombie_door", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "door_opened" );
|
||||
num_left = 0;
|
||||
all_opened = 1;
|
||||
_a92 = zombie_doors;
|
||||
_k92 = getFirstArrayKey( _a92 );
|
||||
while ( isDefined( _k92 ) )
|
||||
{
|
||||
door = _a92[ _k92 ];
|
||||
if ( isDefined( door.has_been_opened ) && !door.has_been_opened )
|
||||
{
|
||||
num_left++;
|
||||
all_opened = 0;
|
||||
}
|
||||
_k92 = getNextArrayKey( _a92, _k92 );
|
||||
}
|
||||
if ( all_opened )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
#/
|
||||
}
|
||||
}
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_DONT_FIRE_UNTIL_YOU_SEE" );
|
||||
}
|
||||
|
||||
achievement_the_lights_of_their_eyes()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill( "the_lights_of_their_eyes" );
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_THE_LIGHTS_OF_THEIR_EYES" );
|
||||
}
|
||||
|
||||
achievement_dance_on_my_grave()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill( "dance_on_my_grave" );
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_DANCE_ON_MY_GRAVE" );
|
||||
}
|
||||
|
||||
achievement_standard_equipment_may_vary()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill_subset( 4, "equip_electrictrap_zm_given", "riotshield_zm_given", "equip_turbine_zm_given", "equip_turret_zm_given", "jetgun_zm_given" );
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_STANDARD_EQUIPMENT_MAY_VARY" );
|
||||
}
|
||||
|
||||
achievement_you_have_no_power_over_me()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "avogadro_damage_taken" );
|
||||
level waittill( "avogadro_defeated" );
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_YOU_HAVE_NO_POWER_OVER_ME" );
|
||||
}
|
||||
|
||||
achievement_i_dont_think_they_exist()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill( "i_dont_think_they_exist" );
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_I_DONT_THINK_THEY_EXIST" );
|
||||
}
|
||||
|
||||
achievement_fuel_efficient()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill( "used_screecher_hole" );
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_FUEL_EFFICIENT" );
|
||||
}
|
||||
|
||||
achievement_zm_happy_hour()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level endon( "power_on" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "perk_acquired" );
|
||||
if ( isDefined( self.perk_history ) && self.perk_history.size >= 2 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
/#
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_HAPPY_HOUR" );
|
||||
}
|
||||
|
||||
achievement_sound_func( achievement_name_lower )
|
||||
{
|
||||
self thread do_player_general_vox( "general", "achievement" );
|
||||
}
|
291
zm_transit_patch/maps/mp/zm_transit_ai_screecher.gsc
Normal file
291
zm_transit_patch/maps/mp/zm_transit_ai_screecher.gsc
Normal file
@ -0,0 +1,291 @@
|
||||
#include maps/mp/zm_transit;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_gump;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#include maps/mp/zombies/_zm_ai_screecher;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level.screecher_should_burrow = ::screecher_should_burrow;
|
||||
level.screecher_should_runaway = ::screecher_should_runaway;
|
||||
level.screecher_cleanup = ::transit_screecher_cleanup;
|
||||
level.screecher_init_done = ::screecher_init_done;
|
||||
level.portals = [];
|
||||
}
|
||||
|
||||
screecher_should_burrow()
|
||||
{
|
||||
green_light = self.green_light;
|
||||
if ( isDefined( green_light ) )
|
||||
{
|
||||
if ( isDefined( green_light.burrow_active ) && green_light.burrow_active )
|
||||
{
|
||||
/#
|
||||
screecher_print( "burrow: already active" );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( green_light.claimed ) && green_light.claimed )
|
||||
{
|
||||
/#
|
||||
screecher_print( "burrow: already claimed" );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
ground_pos = groundpos( green_light.origin );
|
||||
self.ignoreall = 1;
|
||||
green_light.claimed = 1;
|
||||
self setgoalpos( ground_pos );
|
||||
self waittill( "goal" );
|
||||
self.state = "burrow_started";
|
||||
self setfreecameralockonallowed( 0 );
|
||||
self animscripted( ground_pos, self.angles, "zm_burrow" );
|
||||
self playsound( "zmb_screecher_dig" );
|
||||
if ( isDefined( green_light.burrow_active ) && !green_light.burrow_active && isDefined( green_light.power_on ) && green_light.power_on )
|
||||
{
|
||||
green_light thread create_portal();
|
||||
}
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "burrow_anim" );
|
||||
green_light notify( "burrow_done" );
|
||||
self.state = "burrow_finished";
|
||||
self delete();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
create_portal()
|
||||
{
|
||||
self endon( "portal_stopped" );
|
||||
self.burrow_active = 1;
|
||||
ground_pos = groundpos( self.origin );
|
||||
if ( !isDefined( self.hole ) )
|
||||
{
|
||||
self.hole = spawn( "script_model", ground_pos + vectorScale( ( 0, 0, 1 ), 20 ) );
|
||||
self.hole.start_origin = self.hole.origin;
|
||||
self.hole setmodel( "p6_zm_screecher_hole" );
|
||||
self.hole playsound( "zmb_screecher_portal_spawn" );
|
||||
}
|
||||
if ( !isDefined( self.hole_fx ) )
|
||||
{
|
||||
self.hole_fx = spawn( "script_model", ground_pos );
|
||||
self.hole_fx setmodel( "tag_origin" );
|
||||
}
|
||||
wait 0,1;
|
||||
playfxontag( level._effect[ "screecher_hole" ], self.hole_fx, "tag_origin" );
|
||||
self.hole moveto( self.hole.origin + vectorScale( ( 0, 0, 1 ), 20 ), 1 );
|
||||
self waittill( "burrow_done" );
|
||||
self thread portal_think();
|
||||
}
|
||||
|
||||
portal_think()
|
||||
{
|
||||
playfxontag( level._effect[ "screecher_vortex" ], self.hole, "tag_origin" );
|
||||
self.hole_fx delete();
|
||||
self.hole playloopsound( "zmb_screecher_portal_loop", 2 );
|
||||
level.portals[ level.portals.size ] = self;
|
||||
}
|
||||
|
||||
portal_player_watcher()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !self isonground() )
|
||||
{
|
||||
self player_wait_land();
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
|
||||
player_wait_land()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( !self isonground() )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
if ( level.portals.size > 0 )
|
||||
{
|
||||
remove_portal = undefined;
|
||||
_a159 = level.portals;
|
||||
_k159 = getFirstArrayKey( _a159 );
|
||||
while ( isDefined( _k159 ) )
|
||||
{
|
||||
portal = _a159[ _k159 ];
|
||||
dist_sq = distance2dsquared( self.origin, portal.origin );
|
||||
if ( dist_sq < 4096 )
|
||||
{
|
||||
remove_portal = portal;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
_k159 = getNextArrayKey( _a159, _k159 );
|
||||
}
|
||||
}
|
||||
if ( isDefined( remove_portal ) )
|
||||
{
|
||||
arrayremovevalue( level.portals, remove_portal );
|
||||
portal portal_use( self );
|
||||
wait 0,5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
portal_use( player )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_screecher_portal_warp_2d", player );
|
||||
self thread teleport_player( player );
|
||||
playsoundatposition( "zmb_screecher_portal_end", self.hole.origin );
|
||||
self.hole delete();
|
||||
self.burrow_active = 0;
|
||||
}
|
||||
|
||||
teleport_player( player )
|
||||
{
|
||||
lights = getstructarray( "screecher_escape", "targetname" );
|
||||
lights = array_randomize( lights );
|
||||
dest_light = undefined;
|
||||
_a198 = lights;
|
||||
_k198 = getFirstArrayKey( _a198 );
|
||||
while ( isDefined( _k198 ) )
|
||||
{
|
||||
light = _a198[ _k198 ];
|
||||
if ( light == self )
|
||||
{
|
||||
}
|
||||
else if ( light other_players_close_to_light( player ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
dest_light = light;
|
||||
break;
|
||||
}
|
||||
_k198 = getNextArrayKey( _a198, _k198 );
|
||||
}
|
||||
if ( isDefined( dest_light ) )
|
||||
{
|
||||
playsoundatposition( "zmb_screecher_portal_arrive", dest_light.origin );
|
||||
player maps/mp/zombies/_zm_gump::player_teleport_blackscreen_on();
|
||||
player setorigin( dest_light.origin );
|
||||
player notify( "used_screecher_hole" );
|
||||
player maps/mp/zombies/_zm_stats::increment_client_stat( "screecher_teleporters_used", 0 );
|
||||
player maps/mp/zombies/_zm_stats::increment_player_stat( "screecher_teleporters_used" );
|
||||
}
|
||||
}
|
||||
|
||||
other_players_close_to_light( ignore_player )
|
||||
{
|
||||
players = get_players();
|
||||
while ( players.size > 1 )
|
||||
{
|
||||
_a236 = players;
|
||||
_k236 = getFirstArrayKey( _a236 );
|
||||
while ( isDefined( _k236 ) )
|
||||
{
|
||||
player = _a236[ _k236 ];
|
||||
if ( player == ignore_player )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
dist_sq = distance2dsquared( player.origin, self.origin );
|
||||
if ( dist_sq < 14400 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
_k236 = getNextArrayKey( _a236, _k236 );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
screecher_should_runaway( player )
|
||||
{
|
||||
if ( maps/mp/zm_transit::player_entered_safety_light( player ) )
|
||||
{
|
||||
/#
|
||||
screecher_print( "runaway: green light" );
|
||||
#/
|
||||
if ( !isDefined( player.screecher ) )
|
||||
{
|
||||
player thread do_player_general_vox( "general", "screecher_flee_green" );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if ( maps/mp/zm_transit::player_entered_safety_zone( player ) )
|
||||
{
|
||||
/#
|
||||
screecher_print( "runaway: safety zone" );
|
||||
#/
|
||||
if ( !isDefined( player.screecher ) )
|
||||
{
|
||||
player thread do_player_general_vox( "general", "screecher_flee" );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
bus_dist_sq = distancesquared( player.origin, level.the_bus.origin );
|
||||
if ( bus_dist_sq < 62500 )
|
||||
{
|
||||
/#
|
||||
screecher_print( "runaway: bus" );
|
||||
#/
|
||||
if ( !isDefined( player.screecher ) )
|
||||
{
|
||||
player thread do_player_general_vox( "general", "screecher_flee" );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
transit_screecher_cleanup()
|
||||
{
|
||||
green_light = self.green_light;
|
||||
if ( isDefined( green_light ) )
|
||||
{
|
||||
if ( isDefined( green_light.claimed ) )
|
||||
{
|
||||
green_light.claimed = undefined;
|
||||
}
|
||||
if ( self.state == "burrow_started" )
|
||||
{
|
||||
/#
|
||||
screecher_print( "clean up portal" );
|
||||
#/
|
||||
green_light notify( "portal_stopped" );
|
||||
green_light.hole moveto( green_light.hole.start_origin, 1 );
|
||||
green_light.burrow_active = 0;
|
||||
if ( isDefined( green_light.hole_fx ) )
|
||||
{
|
||||
green_light.hole_fx delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
screecher_init_done()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
ground_ent = self getgroundent();
|
||||
if ( isDefined( ground_ent ) && ground_ent == level.the_bus )
|
||||
{
|
||||
self dodamage( self.health + 666, self.origin );
|
||||
/#
|
||||
screecher_print( "Died on bus" );
|
||||
#/
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
295
zm_transit_patch/maps/mp/zm_transit_ambush.gsc
Normal file
295
zm_transit_patch/maps/mp/zm_transit_ambush.gsc
Normal file
@ -0,0 +1,295 @@
|
||||
#include maps/mp/zombies/_zm_powerups;
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/zm_transit_bus;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
level.numroundssincelastambushround = 0;
|
||||
level.numbusstopssincelastambushround = 0;
|
||||
level.numambushrounds = 0;
|
||||
level.ambushpercentageperstop = 10;
|
||||
level.ambushpercentageperround = 25;
|
||||
flag_init( "ambush_round", 0 );
|
||||
flag_init( "ambush_safe_area_active", 0 );
|
||||
initambusheffects();
|
||||
thread ambushroundkeeper();
|
||||
/#
|
||||
adddebugcommand( "devgui_cmd "Zombies:1/Bus:14/Ambush Round:6/Always:1" "zombie_devgui ambush_round always"\n" );
|
||||
adddebugcommand( "devgui_cmd "Zombies:1/Bus:14/Ambush Round:6/Never:2" "zombie_devgui ambush_round never"\n" );
|
||||
#/
|
||||
}
|
||||
|
||||
initambusheffects()
|
||||
{
|
||||
level._effect[ "ambush_bus_fire" ] = loadfx( "env/fire/fx_fire_md" );
|
||||
}
|
||||
|
||||
shouldstartambushround()
|
||||
{
|
||||
/#
|
||||
if ( level.ambushpercentageperstop == 100 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( getDvarInt( "zombie_cheat" ) == 2 )
|
||||
{
|
||||
return 0;
|
||||
#/
|
||||
}
|
||||
if ( level.numbusstopssincelastambushround < 2 )
|
||||
{
|
||||
}
|
||||
randint = randomintrange( 0, 100 );
|
||||
percentchance = level.numbusstopssincelastambushround * level.ambushpercentageperstop;
|
||||
if ( randint < percentchance )
|
||||
{
|
||||
}
|
||||
percentchance = level.numroundssincelastambushround * level.ambushpercentageperround;
|
||||
if ( randint < percentchance )
|
||||
{
|
||||
}
|
||||
if ( maps/mp/zm_transit_bus::busgasempty() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isambushroundactive()
|
||||
{
|
||||
if ( flag_exists( "ambush_round" ) )
|
||||
{
|
||||
return flag( "ambush_round" );
|
||||
}
|
||||
}
|
||||
|
||||
is_ambush_round_spawning_active()
|
||||
{
|
||||
if ( flag_exists( "ambush_safe_area_active" ) )
|
||||
{
|
||||
return flag( "ambush_safe_area_active" );
|
||||
}
|
||||
}
|
||||
|
||||
ambushstartround()
|
||||
{
|
||||
flag_set( "ambush_round" );
|
||||
ambushroundthink();
|
||||
}
|
||||
|
||||
ambushendround()
|
||||
{
|
||||
level.the_bus.issafe = 1;
|
||||
maps/mp/zm_transit_bus::busgasadd( 60 );
|
||||
level.numbusstopssincelastambushround = 0;
|
||||
level.numroundssincelastambushround = 0;
|
||||
flag_clear( "ambush_round" );
|
||||
}
|
||||
|
||||
cancelambushround()
|
||||
{
|
||||
flag_clear( "ambush_round" );
|
||||
flag_clear( "ambush_safe_area_active" );
|
||||
maps/mp/zm_transit_utility::try_resume_zombie_spawning();
|
||||
bbprint( "zombie_events", "category %s type %s round %d", "DOG", "stop", level.round_number );
|
||||
level.the_bus notify( "ambush_round_fail_safe" );
|
||||
}
|
||||
|
||||
ambushroundspawning()
|
||||
{
|
||||
level.numambushrounds++;
|
||||
wait 6;
|
||||
level.the_bus.issafe = 0;
|
||||
}
|
||||
|
||||
limitedambushspawn()
|
||||
{
|
||||
if ( level.numambushrounds < 3 )
|
||||
{
|
||||
dogcount = level.dog_targets.size * 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
dogcount = level.dog_targets.size * 8;
|
||||
}
|
||||
setupdogspawnlocs();
|
||||
level thread ambushroundspawnfailsafe( 20 );
|
||||
while ( get_current_zombie_count() > 0 )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level notify( "end_ambushWaitFunction" );
|
||||
}
|
||||
|
||||
ambushroundthink()
|
||||
{
|
||||
module = maps/mp/zombies/_zm_game_module::get_game_module( level.game_module_nml_index );
|
||||
if ( isDefined( module.hub_start_func ) )
|
||||
{
|
||||
level thread [[ module.hub_start_func ]]( "nml" );
|
||||
level notify( "game_mode_started" );
|
||||
}
|
||||
level thread ambushroundspawning();
|
||||
ambushwaitfunction();
|
||||
ambushendround();
|
||||
}
|
||||
|
||||
ambushwaitfunction()
|
||||
{
|
||||
}
|
||||
|
||||
ambushpointfailsafe()
|
||||
{
|
||||
level.the_bus endon( "ambush_point" );
|
||||
level.the_bus waittill( "reached_stop_point" );
|
||||
cancelambushround();
|
||||
}
|
||||
|
||||
ambushroundspawnfailsafe( timer )
|
||||
{
|
||||
ambushroundtimelimit = timer;
|
||||
currentambushtime = 0;
|
||||
while ( currentambushtime < ambushroundtimelimit )
|
||||
{
|
||||
if ( !flag( "ambush_round" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait 1;
|
||||
currentambushtime++;
|
||||
}
|
||||
level notify( "end_ambushWaitFunction" );
|
||||
wait 5;
|
||||
dogs = getaispeciesarray( "all", "zombie_dog" );
|
||||
i = 0;
|
||||
while ( i < dogs.size )
|
||||
{
|
||||
if ( isDefined( dogs[ i ].marked_for_death ) && dogs[ i ].marked_for_death )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_magic_bullet_shield_enabled( dogs[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
dogs[ i ] dodamage( dogs[ i ].health + 666, dogs[ i ].origin );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
ambushdoghealthincrease()
|
||||
{
|
||||
switch( level.numambushrounds )
|
||||
{
|
||||
case 1:
|
||||
level.dog_health = 400;
|
||||
break;
|
||||
case 2:
|
||||
level.dog_health = 900;
|
||||
break;
|
||||
case 3:
|
||||
level.dog_health = 1300;
|
||||
break;
|
||||
case 4:
|
||||
level.dog_health = 1600;
|
||||
break;
|
||||
default:
|
||||
level.dog_health = 1600;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ambushroundaftermath()
|
||||
{
|
||||
power_up_origin = level.the_bus gettagorigin( "tag_body" );
|
||||
if ( isDefined( power_up_origin ) )
|
||||
{
|
||||
level thread maps/mp/zombies/_zm_powerups::specific_powerup_drop( "full_ammo", power_up_origin );
|
||||
}
|
||||
}
|
||||
|
||||
ambushroundeffects()
|
||||
{
|
||||
wait 2;
|
||||
level thread ambushlightningeffect( "tag_body" );
|
||||
wait 0,5;
|
||||
level thread ambushlightningeffect( "tag_wheel_back_left" );
|
||||
wait 0,5;
|
||||
level thread ambushlightningeffect( "tag_wheel_back_right" );
|
||||
wait 0,5;
|
||||
level thread ambushlightningeffect( "tag_wheel_front_left" );
|
||||
wait 0,5;
|
||||
level thread ambushlightningeffect( "tag_wheel_front_right" );
|
||||
wait 1,5;
|
||||
fxent0 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_body" );
|
||||
fxent1 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_back_left" );
|
||||
fxent2 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_back_right" );
|
||||
fxent3 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_front_left" );
|
||||
fxent4 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_front_right" );
|
||||
level waittill( "end_ambushWaitFunction" );
|
||||
fxent0 delete();
|
||||
fxent1 delete();
|
||||
fxent2 delete();
|
||||
fxent3 delete();
|
||||
fxent4 delete();
|
||||
}
|
||||
|
||||
ambushlightningeffect( tag )
|
||||
{
|
||||
fxentlighting = spawnandlinkfxtotag( level._effect[ "lightning_dog_spawn" ], level.the_bus, tag );
|
||||
wait 5;
|
||||
fxentlighting delete();
|
||||
}
|
||||
|
||||
setupdogspawnlocs()
|
||||
{
|
||||
level.enemy_dog_locations = [];
|
||||
currentzone = undefined;
|
||||
ambush_zones = getentarray( "ambush_volume", "script_noteworthy" );
|
||||
i = 0;
|
||||
while ( i < ambush_zones.size )
|
||||
{
|
||||
touching = 0;
|
||||
b = 0;
|
||||
while ( b < level.the_bus.bounds_origins.size && !touching )
|
||||
{
|
||||
bounds = level.the_bus.bounds_origins[ b ];
|
||||
touching = bounds istouching( ambush_zones[ i ] );
|
||||
b++;
|
||||
}
|
||||
if ( touching )
|
||||
{
|
||||
currentzone = ambush_zones[ i ];
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
/#
|
||||
assert( isDefined( currentzone ), "Bus needs to be in an ambush zone for an ambush round: " + level.the_bus.origin );
|
||||
#/
|
||||
level.enemy_dog_locations = getstructarray( currentzone.target, "targetname" );
|
||||
}
|
||||
|
||||
ambushroundkeeper()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "between_round_over" );
|
||||
level.numroundssincelastambushround++;
|
||||
}
|
||||
}
|
654
zm_transit_patch/maps/mp/zm_transit_automaton.gsc
Normal file
654
zm_transit_patch/maps/mp/zm_transit_automaton.gsc
Normal file
@ -0,0 +1,654 @@
|
||||
#include maps/mp/zm_transit_bus;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "zm_transit_automaton" );
|
||||
|
||||
init_animtree()
|
||||
{
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
||||
initaudioaliases()
|
||||
{
|
||||
level.vox zmbvoxadd( "automaton", "scripted", "discover_bus", "near_station1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "leaving_warning", "warning_out", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "leaving", "warning_leaving", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "emp_disable", "stop_generic", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "out_of_gas", "gas_out", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "refueled_gas", "gas_full", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "doors_open", "doors_open", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "doors_close", "doors_close", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "convo", "player_enter", "player_enter", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "convo", "player_leave", "player_exit", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "zombie_on_board", "zombie_enter", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "zombie_at_window", "zombie_attack", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "zombie_on_roof", "zombie_roof", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "player_attack_1", "player_1attack", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "player_attack_2", "player_2attack", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "player_attack_3", "player_3attack", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "hint_upgrade", "hint_upgrade", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "ride_generic", "ride_generic", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_station1", "near_station2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_station2", "near_station2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_station3", "near_station3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_station4", "near_station4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_station5", "near_station5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_diner1", "near_diner1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_diner2", "near_diner2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_diner3", "near_diner3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_diner4", "near_diner4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_diner5", "near_diner5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_tunnel1", "near_tunnel1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_tunnel2", "near_tunnel2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_tunnel3", "near_tunnel3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_tunnel4", "near_tunnel4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_tunnel5", "near_tunnel5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest1_1", "near_1forest1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest1_2", "near_1forest2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest1_3", "near_1forest3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest1_4", "near_1forest4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest1_5", "near_1forest5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest2_1", "near_2forest1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest2_2", "near_2forest2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest2_3", "near_2forest3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest2_4", "near_2forest4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_forest2_5", "near_2forest5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_farm1", "near_farm1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_farm2", "near_farm2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_farm3", "near_farm3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_farm4", "near_farm4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_farm5", "near_farm5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_corn1", "near_corn1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_corn2", "near_corn2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_corn3", "near_corn3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_corn4", "near_corn4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_corn5", "near_corn5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_power1", "near_power1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_power2", "near_power2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_power3", "near_power3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_power4", "near_power4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_power5", "near_power5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_town1", "near_town1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_town2", "near_town2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_town3", "near_town3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_town4", "near_town4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_town5", "near_town5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_bridge1", "near_bridge1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_bridge2", "near_bridge2", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_bridge3", "near_bridge3", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_bridge4", "near_bridge4", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "near_bridge5", "near_bridge5", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "leave_tunnel", "exit_tunnel1", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "bridge_collapse", "bridge_collapse", undefined );
|
||||
level.vox zmbvoxadd( "automaton", "inform", "player_pissed", "player_pissed", undefined );
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
level.automaton = getent( "bus_driver_head", "targetname" );
|
||||
level.automaton thread automatonsetup();
|
||||
level.timesplayerattackingautomaton = 0;
|
||||
level.automaton.greeting_timer = 0;
|
||||
}
|
||||
|
||||
automatonsetup()
|
||||
{
|
||||
self linkto( level.the_bus );
|
||||
self setmovingplatformenabled( 1 );
|
||||
self useanimtree( -1 );
|
||||
self setanim( %ai_zombie_bus_driver_idle );
|
||||
self addasspeakernpc( 1 );
|
||||
level.vox zmbvoxinitspeaker( "automaton", "vox_bus_", self );
|
||||
self thread automatondamagecallback();
|
||||
self thread automatonanimationsspeaking();
|
||||
self thread automatonemp();
|
||||
level thread bus_upgrade_vox();
|
||||
}
|
||||
|
||||
automatondamagecallback()
|
||||
{
|
||||
self setcandamage( 1 );
|
||||
self.health = 100000;
|
||||
triggers = getentarray( "bus_door_trigger", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, directionvec, point, type );
|
||||
self.health = 100000;
|
||||
wait 1;
|
||||
while ( isDefined( self.disabled_by_emp ) && !self.disabled_by_emp && isDefined( self.isspeaking ) || self.isspeaking && isDefined( level.playerattackingautomaton ) && level.playerattackingautomaton )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
self say_player_attack_vox();
|
||||
while ( level.timesplayerattackingautomaton < 3 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
level.timesplayerattackingautomaton = 0;
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) )
|
||||
{
|
||||
wait 5;
|
||||
if ( !isDefined( self.dmgfxorigin ) )
|
||||
{
|
||||
self.dmgfxorigin = spawn( "script_model", point );
|
||||
self.dmgfxorigin setmodel( "tag_origin" );
|
||||
if ( isDefined( type ) && type == "MOD_GRENADE_SPLASH" )
|
||||
{
|
||||
self.dmgfxorigin.origin = self gettagorigin( "tag_origin" ) + vectorScale( ( 0, 0, 1 ), 40 );
|
||||
}
|
||||
self.dmgfxorigin linkto( self, "J_neck" );
|
||||
}
|
||||
wait 0,5;
|
||||
playfxontag( level._effect[ "switch_sparks" ], self.dmgfxorigin, "tag_origin" );
|
||||
_a204 = triggers;
|
||||
_k204 = getFirstArrayKey( _a204 );
|
||||
while ( isDefined( _k204 ) )
|
||||
{
|
||||
trigger = _a204[ _k204 ];
|
||||
trigger setinvisibletoall();
|
||||
_k204 = getNextArrayKey( _a204, _k204 );
|
||||
}
|
||||
level.the_bus.force_lock_doors = 1;
|
||||
if ( randomint( 100 ) > 50 )
|
||||
{
|
||||
if ( isDefined( level.the_bus.skip_next_destination ) && !level.the_bus.skip_next_destination )
|
||||
{
|
||||
level thread bus_skip_destination();
|
||||
}
|
||||
level thread automatonspeak( "inform", "player_pissed", undefined, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread automatonspeak( "inform", "player_pissed", undefined, 1 );
|
||||
}
|
||||
if ( level.the_bus.doorsclosed )
|
||||
{
|
||||
triggers[ 0 ] playsound( "zmb_bus_door_open" );
|
||||
level.the_bus maps/mp/zm_transit_bus::busdoorsopen();
|
||||
wait 1,25;
|
||||
shove_players_off_bus();
|
||||
wait 1,25;
|
||||
triggers[ 0 ] playsound( "zmb_bus_door_close" );
|
||||
level.the_bus maps/mp/zm_transit_bus::busdoorsclose();
|
||||
}
|
||||
else
|
||||
{
|
||||
shove_players_off_bus();
|
||||
wait 1,25;
|
||||
triggers[ 0 ] playsound( "zmb_bus_door_close" );
|
||||
level.the_bus maps/mp/zm_transit_bus::busdoorsclose();
|
||||
}
|
||||
wait 3,5;
|
||||
level thread automatonspeak( "inform", "player_pissed", undefined, 2 );
|
||||
wait 28;
|
||||
_a245 = triggers;
|
||||
_k245 = getFirstArrayKey( _a245 );
|
||||
while ( isDefined( _k245 ) )
|
||||
{
|
||||
trigger = _a245[ _k245 ];
|
||||
trigger setvisibletoall();
|
||||
_k245 = getNextArrayKey( _a245, _k245 );
|
||||
}
|
||||
level.the_bus.force_lock_doors = 0;
|
||||
}
|
||||
if ( isDefined( self.dmgfxorigin ) )
|
||||
{
|
||||
self.dmgfxorigin unlink();
|
||||
self.dmgfxorigin delete();
|
||||
self.dmgfxorigin = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bus_skip_destination()
|
||||
{
|
||||
level.the_bus.skip_next_destination = 1;
|
||||
level.the_bus waittill( "skipping_destination" );
|
||||
level.the_bus.skip_next_destination = 0;
|
||||
}
|
||||
|
||||
automatonanimationsspeaking()
|
||||
{
|
||||
self thread bus_driver_idle();
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "want_to_be_speaking", speakingline );
|
||||
self.isplayingspeakinganim = 1;
|
||||
while ( isDefined( self.isplayingidleanim ) && self.isplayingidleanim )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
self notify( "startspeaking" );
|
||||
while ( isDefined( self.disabled_by_emp ) && self.disabled_by_emp )
|
||||
{
|
||||
self.isplayingspeakinganim = 0;
|
||||
}
|
||||
speakinganim = %ai_zombie_bus_driver_idle_dialog;
|
||||
speakingnum = 0;
|
||||
if ( issubstr( speakingline, "attack" ) || issubstr( speakingline, "pissed" ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_idle_dialog_angry;
|
||||
speakingnum = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( speakingline, "warning_out" ) || is_true( level.bus_driver_focused ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_idle_dialog_focused;
|
||||
speakingnum = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( speakingline, "zombie_enter" ) || isDefined( level.bus_zombie_danger ) && level.bus_zombie_danger )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_idle_dialog_panicked;
|
||||
speakingnum = 3;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( speakingline, "stop_generic" ) || issubstr( speakingline, "warning_leaving" ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_idle_dialog_panicked;
|
||||
speakingnum = 3;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( speakingline, "player_enter" ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_player_enter;
|
||||
speakingnum = 4;
|
||||
break;
|
||||
}
|
||||
else if ( issubstr( speakingline, "player_leave" ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_player_exit;
|
||||
speakingnum = 5;
|
||||
break;
|
||||
}
|
||||
else if ( issubstr( speakingline, "generic" ) )
|
||||
{
|
||||
if ( randomint( 100 ) > 50 )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_forward_short_dialog;
|
||||
speakingnum = 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_turnback_short_dialog;
|
||||
speakingnum = 6;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if ( issubstr( speakingline, "discover" ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_idle_dialog;
|
||||
speakingnum = 0;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.stops ) && isDefined( level.stops[ "depot" ] ) && level.stops[ "depot" ] < 1 && issubstr( speakingline, "near_" ) )
|
||||
{
|
||||
speakinganim = %ai_zombie_bus_driver_forward_short_dialog;
|
||||
speakingnum = 7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self setanim( speakinganim );
|
||||
self thread sndspeakinganimaudio( speakingnum );
|
||||
/#
|
||||
if ( getDvar( #"96F6EBD9" ) != "" )
|
||||
{
|
||||
iprintlnbold( "" + speakinganim );
|
||||
#/
|
||||
}
|
||||
wait getanimlength( speakinganim );
|
||||
self.isplayingspeakinganim = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bus_driver_idle()
|
||||
{
|
||||
danger_anims = [];
|
||||
danger_anims[ 0 ] = %ai_zombie_bus_driver_idle_twitch_a;
|
||||
danger_anims[ 1 ] = %ai_zombie_bus_driver_idle_twitch_focused;
|
||||
danger_anims[ 2 ] = %ai_zombie_bus_driver_idle_twitch_panicked;
|
||||
danger_anims[ 3 ] = %ai_zombie_bus_driver_idle_twitch_b;
|
||||
focused_anims = [];
|
||||
focused_anims[ 0 ] = %ai_zombie_bus_driver_idle_twitch_panicked;
|
||||
focused_anims[ 1 ] = %ai_zombie_bus_driver_idle_twitch_focused;
|
||||
twitch_anims = [];
|
||||
twitch_anims[ 0 ] = %ai_zombie_bus_driver_idle_twitch_a;
|
||||
twitch_anims[ 1 ] = %ai_zombie_bus_driver_idle_twitch_b;
|
||||
idle_anims = [];
|
||||
idle_anims[ 0 ] = %ai_zombie_bus_driver_idle_a;
|
||||
idle_anims[ 1 ] = %ai_zombie_bus_driver_idle_b;
|
||||
idle_anims[ 2 ] = %ai_zombie_bus_driver_idle_c;
|
||||
idle_anims[ 3 ] = %ai_zombie_bus_driver_idle_d;
|
||||
idle_anims[ 4 ] = %ai_zombie_bus_driver_idle;
|
||||
while ( 1 )
|
||||
{
|
||||
while ( isDefined( self.isplayingspeakinganim ) || self.isplayingspeakinganim && isDefined( self.disabled_by_emp ) && self.disabled_by_emp )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
if ( isDefined( level.bus_zombie_danger ) && level.bus_zombie_danger )
|
||||
{
|
||||
driveranim = random( danger_anims );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_true( level.bus_driver_focused ) )
|
||||
{
|
||||
driveranim = random( focused_anims );
|
||||
break;
|
||||
}
|
||||
else if ( randomint( 100 ) > 90 )
|
||||
{
|
||||
driveranim = random( twitch_anims );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
driveranim = random( idle_anims );
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.previous_anim ) && self.previous_anim == driveranim && driveranim != %ai_zombie_bus_driver_idle )
|
||||
{
|
||||
driveranim = %ai_zombie_bus_driver_idle;
|
||||
}
|
||||
/#
|
||||
if ( getDvar( #"6DF184E8" ) != "" )
|
||||
{
|
||||
iprintlnbold( "Idle:" + driveranim );
|
||||
#/
|
||||
}
|
||||
self.isplayingidleanim = 1;
|
||||
self setanim( driveranim );
|
||||
self thread sndplaydriveranimsnd( driveranim );
|
||||
wait getanimlength( driveranim );
|
||||
self.previous_anim = driveranim;
|
||||
self.isplayingidleanim = 0;
|
||||
}
|
||||
}
|
||||
|
||||
automatonemp()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( level.the_bus.disabled_by_emp ) && !level.the_bus.disabled_by_emp )
|
||||
{
|
||||
level.the_bus waittill( "pre_power_off" );
|
||||
}
|
||||
level.automaton.disabled_by_emp = 1;
|
||||
level.automaton setanim( %ai_zombie_bus_driver_emp_powerdown );
|
||||
self thread sndplaydriveranimsnd( %ai_zombie_bus_driver_emp_powerdown );
|
||||
level.automaton maps/mp/zombies/_zm_audio::create_and_play_dialog( "inform", "emp_disable" );
|
||||
wait getanimlength( %ai_zombie_bus_driver_emp_powerdown );
|
||||
level.automaton setanim( %ai_zombie_bus_driver_emp_powerdown_idle );
|
||||
if ( isDefined( level.the_bus.pre_disabled_by_emp ) || level.the_bus.pre_disabled_by_emp && isDefined( level.the_bus.disabled_by_emp ) && level.the_bus.disabled_by_emp )
|
||||
{
|
||||
level.the_bus waittill( "power_on" );
|
||||
}
|
||||
level.automaton setanim( %ai_zombie_bus_driver_emp_powerup );
|
||||
self thread sndplaydriveranimsnd( %ai_zombie_bus_driver_emp_powerup );
|
||||
wait getanimlength( %ai_zombie_bus_driver_emp_powerup );
|
||||
level.automaton.disabled_by_emp = 0;
|
||||
self setanim( %ai_zombie_bus_driver_idle );
|
||||
}
|
||||
}
|
||||
|
||||
say_player_attack_vox()
|
||||
{
|
||||
if ( isDefined( level.the_bus.force_lock_doors ) && level.the_bus.force_lock_doors )
|
||||
{
|
||||
level.timesplayerattackingautomaton = 0;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.playerattackingautomaton ) && level.playerattackingautomaton )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
level.playerattackingautomaton = 1;
|
||||
if ( level.timesplayerattackingautomaton == 0 )
|
||||
{
|
||||
level thread automaton_attack_reset_timer();
|
||||
}
|
||||
level.timesplayerattackingautomaton++;
|
||||
level thread automatonspeak( "inform", "player_attack_" + level.timesplayerattackingautomaton );
|
||||
if ( level.timesplayerattackingautomaton >= 3 )
|
||||
{
|
||||
level notify( "automaton_threshold_reached" );
|
||||
}
|
||||
level thread automaton_attack_choke_timer();
|
||||
}
|
||||
|
||||
automaton_attack_choke_timer()
|
||||
{
|
||||
wait 10;
|
||||
level.playerattackingautomaton = 0;
|
||||
}
|
||||
|
||||
automaton_attack_reset_timer()
|
||||
{
|
||||
level endon( "automaton_threshold_reached" );
|
||||
wait 60;
|
||||
level.timesplayerattackingautomaton = 0;
|
||||
}
|
||||
|
||||
bus_upgrade_vox()
|
||||
{
|
||||
ladder_trig = getent( "bus_ladder_trigger", "targetname" );
|
||||
plow_trig = getent( "trigger_plow", "targetname" );
|
||||
hatch_trig = getent( "bus_hatch_bottom_trigger", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
while ( isDefined( level.stops ) && isDefined( level.stops[ "depot" ] ) && level.stops[ "depot" ] < 1 )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
should_say_upgrade = -1;
|
||||
players = get_players();
|
||||
_a534 = players;
|
||||
_k534 = getFirstArrayKey( _a534 );
|
||||
while ( isDefined( _k534 ) )
|
||||
{
|
||||
player = _a534[ _k534 ];
|
||||
if ( isDefined( player.isonbus ) && player.isonbus )
|
||||
{
|
||||
if ( distancesquared( player.origin, hatch_trig.origin ) < 5184 && !flag( "hatch_attached" ) )
|
||||
{
|
||||
should_say_upgrade = 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( distancesquared( player.origin, plow_trig.origin ) < 9216 && !flag( "catcher_attached" ) )
|
||||
{
|
||||
should_say_upgrade = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( distancesquared( player.origin, ladder_trig.origin ) < 9216 && !flag( "ladder_attached" ) )
|
||||
{
|
||||
should_say_upgrade = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
_k534 = getNextArrayKey( _a534, _k534 );
|
||||
}
|
||||
if ( should_say_upgrade > -1 )
|
||||
{
|
||||
level thread automatonspeak( "inform", "hint_upgrade", undefined, should_say_upgrade );
|
||||
wait 60;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
shove_players_off_bus()
|
||||
{
|
||||
playfxontag( level._effect[ "turbine_on" ], level.automaton, "J_neck" );
|
||||
wait 0,25;
|
||||
level.automaton playsound( "zmb_powerup_grabbed" );
|
||||
players = get_players();
|
||||
_a572 = players;
|
||||
_k572 = getFirstArrayKey( _a572 );
|
||||
while ( isDefined( _k572 ) )
|
||||
{
|
||||
player = _a572[ _k572 ];
|
||||
if ( isDefined( player.isonbus ) && player.isonbus )
|
||||
{
|
||||
dir = anglesToRight( level.the_bus.angles );
|
||||
dir = vectornormalize( dir );
|
||||
player_velocity = dir * 900;
|
||||
player setvelocity( player_velocity );
|
||||
earthquake( 0,25, 1, player.origin, 256, player );
|
||||
}
|
||||
_k572 = getNextArrayKey( _a572, _k572 );
|
||||
}
|
||||
}
|
||||
|
||||
sndspeakinganimaudio( num )
|
||||
{
|
||||
switch( num )
|
||||
{
|
||||
case 0:
|
||||
wait 0,4;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 2,4;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 2,25;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 1,1;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
break;
|
||||
case 1:
|
||||
wait 0,31;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 3,55;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
break;
|
||||
case 2:
|
||||
wait 0,18;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 4,83;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
break;
|
||||
case 3:
|
||||
wait 0,23;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 0,77;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 1,4;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 0,15;
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
wait 0,53;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
break;
|
||||
case 4:
|
||||
wait 0,3;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 3,64;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
break;
|
||||
case 5:
|
||||
wait 0,38;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 3,4;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
break;
|
||||
case 6:
|
||||
wait 0,3;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
break;
|
||||
case 7:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sndplaydriveranimsnd( the_anim )
|
||||
{
|
||||
if ( the_anim == %ai_zombie_bus_driver_idle_twitch_a )
|
||||
{
|
||||
wait 0,55;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 1,2;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
wait 0,79;
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
wait 1,1;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
}
|
||||
else if ( the_anim == %ai_zombie_bus_driver_idle_twitch_focused )
|
||||
{
|
||||
wait 0,25;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 4,8;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
}
|
||||
else if ( the_anim == %ai_zombie_bus_driver_idle_twitch_panicked )
|
||||
{
|
||||
wait 0,31;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 0,79;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 1,3;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 0,18;
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
wait 0,52;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
}
|
||||
else if ( the_anim == %ai_zombie_bus_driver_idle_twitch_b )
|
||||
{
|
||||
wait 0,22;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
wait 1,06;
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
wait 1,05;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
wait 1,07;
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
wait 0,59;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
}
|
||||
else if ( the_anim == %ai_zombie_bus_driver_idle_d )
|
||||
{
|
||||
wait 0,24;
|
||||
self playsound( "evt_zmb_robot_spin" );
|
||||
wait 1,04;
|
||||
self playsound( "evt_zmb_robot_hat" );
|
||||
}
|
||||
else if ( the_anim == %ai_zombie_bus_driver_emp_powerdown )
|
||||
{
|
||||
wait 0,1;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
wait 0,9;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( the_anim == %ai_zombie_bus_driver_emp_powerup )
|
||||
{
|
||||
wait 0,63;
|
||||
self playsound( "evt_zmb_robot_jerk" );
|
||||
}
|
||||
}
|
||||
}
|
442
zm_transit_patch/maps/mp/zm_transit_buildables.gsc
Normal file
442
zm_transit_patch/maps/mp/zm_transit_buildables.gsc
Normal file
@ -0,0 +1,442 @@
|
||||
#include maps/mp/zm_transit_sq;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init_buildables()
|
||||
{
|
||||
level.buildable_piece_count = 27;
|
||||
add_zombie_buildable( "riotshield_zm", &"ZOMBIE_BUILD_RIOT", &"ZOMBIE_BUILDING_RIOT", &"ZOMBIE_BOUGHT_RIOT" );
|
||||
add_zombie_buildable( "jetgun_zm", &"ZOMBIE_BUILD_JETGUN", &"ZOMBIE_BUILDING_JETGUN", &"ZOMBIE_BOUGHT_JETGUN" );
|
||||
add_zombie_buildable( "turret", &"ZOMBIE_BUILD_TURRET", &"ZOMBIE_BUILDING_TURRET", &"ZOMBIE_BOUGHT_TURRET" );
|
||||
add_zombie_buildable( "electric_trap", &"ZOMBIE_BUILD_ELECTRIC_TRAP", &"ZOMBIE_BUILDING_ELECTRIC_TRAP", &"ZOMBIE_BOUGHT_ELECTRIC_TRAP" );
|
||||
add_zombie_buildable( "cattlecatcher", &"ZOMBIE_BUILD_CATTLE_CATCHER", &"ZOMBIE_BUILDING_CATTLE_CATCHER" );
|
||||
add_zombie_buildable( "bushatch", &"ZOMBIE_BUILD_BUSHATCH", &"ZOMBIE_BUILDING_BUSHATCH" );
|
||||
add_zombie_buildable( "dinerhatch", &"ZOMBIE_BUILD_DINERHATCH", &"ZOMBIE_BUILDING_DINERHATCH" );
|
||||
add_zombie_buildable( "busladder", &"ZOMBIE_BUILD_BUSLADDER", &"ZOMBIE_BUILDING_BUSLADDER" );
|
||||
add_zombie_buildable( "powerswitch", &"ZOMBIE_BUILD_POWER_SWITCH", &"ZOMBIE_BUILDING_POWER_SWITCH" );
|
||||
add_zombie_buildable( "pap", &"ZOMBIE_BUILD_PAP", &"ZOMBIE_BUILDING_PAP" );
|
||||
add_zombie_buildable( "turbine", &"ZOMBIE_BUILD_TURBINE", &"ZOMBIE_BUILDING_TURBINE", &"ZOMBIE_BOUGHT_TURBINE" );
|
||||
add_zombie_buildable( "sq_common", &"ZOMBIE_BUILD_SQ_COMMON", &"ZOMBIE_BUILDING_SQ_COMMON" );
|
||||
}
|
||||
|
||||
include_buildables()
|
||||
{
|
||||
battery = generate_zombie_buildable_piece( "pap", "p6_zm_buildable_battery", 32, 64, 0, "zm_hud_icon_battery", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 1 );
|
||||
riotshield_dolly = generate_zombie_buildable_piece( "riotshield_zm", "t6_wpn_zmb_shield_dolly", 32, 64, 0, "zm_hud_icon_dolly", ::onpickup_common, ::ondrop_common, undefined, "TAG_RIOT_SHIELD_DOLLY", undefined, 2 );
|
||||
riotshield_door = generate_zombie_buildable_piece( "riotshield_zm", "t6_wpn_zmb_shield_door", 48, 15, 25, "zm_hud_icon_cardoor", ::onpickup_common, ::ondrop_common, undefined, "TAG_RIOT_SHIELD_DOOR", undefined, 3 );
|
||||
riotshield = spawnstruct();
|
||||
riotshield.name = "riotshield_zm";
|
||||
riotshield add_buildable_piece( riotshield_dolly );
|
||||
riotshield add_buildable_piece( riotshield_door );
|
||||
riotshield.onbuyweapon = ::onbuyweapon_riotshield;
|
||||
riotshield.triggerthink = ::riotshieldbuildable;
|
||||
include_buildable( riotshield );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "riotshield_zm_buildable_trigger" );
|
||||
powerswitch_arm = generate_zombie_buildable_piece( "powerswitch", "p6_zm_buildable_pswitch_hand", 32, 64, 10, "zm_hud_icon_arm", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 4 );
|
||||
powerswitch_lever = generate_zombie_buildable_piece( "powerswitch", "p6_zm_buildable_pswitch_body", 48, 64, 0, "zm_hud_icon_panel", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 5 );
|
||||
powerswitch_box = generate_zombie_buildable_piece( "powerswitch", "p6_zm_buildable_pswitch_lever", 32, 15, 0, "zm_hud_icon_lever", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 6 );
|
||||
powerswitch = spawnstruct();
|
||||
powerswitch.name = "powerswitch";
|
||||
powerswitch add_buildable_piece( powerswitch_arm );
|
||||
powerswitch add_buildable_piece( powerswitch_lever );
|
||||
powerswitch add_buildable_piece( powerswitch_box );
|
||||
powerswitch.onuseplantobject = ::onuseplantobject_powerswitch;
|
||||
powerswitch.triggerthink = ::powerswitchbuildable;
|
||||
include_buildable( powerswitch );
|
||||
packapunch_machine = generate_zombie_buildable_piece( "pap", "p6_zm_buildable_pap_body", 48, 64, 0, "zm_hud_icon_papbody", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 7 );
|
||||
packapunch_legs = generate_zombie_buildable_piece( "pap", "p6_zm_buildable_pap_table", 48, 15, 0, "zm_hud_icon_chairleg", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 8 );
|
||||
packapunch = spawnstruct();
|
||||
packapunch.name = "pap";
|
||||
packapunch add_buildable_piece( battery, "tag_part_03", 0 );
|
||||
packapunch add_buildable_piece( packapunch_machine );
|
||||
packapunch add_buildable_piece( packapunch_legs );
|
||||
packapunch.triggerthink = ::papbuildable;
|
||||
include_buildable( packapunch );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "pap_buildable_trigger" );
|
||||
turbine_fan = generate_zombie_buildable_piece( "turbine", "p6_zm_buildable_turbine_fan", 32, 64, 0, "zm_hud_icon_fan", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 9 );
|
||||
turbine_panel = generate_zombie_buildable_piece( "turbine", "p6_zm_buildable_turbine_rudder", 32, 64, 0, "zm_hud_icon_rudder", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 10 );
|
||||
turbine_body = generate_zombie_buildable_piece( "turbine", "p6_zm_buildable_turbine_mannequin", 32, 15, 0, "zm_hud_icon_mannequin", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 11 );
|
||||
turbine = spawnstruct();
|
||||
turbine.name = "turbine";
|
||||
turbine add_buildable_piece( turbine_fan );
|
||||
turbine add_buildable_piece( turbine_panel );
|
||||
turbine add_buildable_piece( turbine_body );
|
||||
turbine.onuseplantobject = ::onuseplantobject_turbine;
|
||||
turbine.triggerthink = ::turbinebuildable;
|
||||
include_buildable( turbine );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "turbine_buildable_trigger" );
|
||||
turret_barrel = generate_zombie_buildable_piece( "turret", "t6_wpn_lmg_rpd_world", 32, 64, 10, "zm_hud_icon_turrethead", ::onpickup_common, ::ondrop_common, undefined, "tag_aim", undefined, 12 );
|
||||
turret_body = generate_zombie_buildable_piece( "turret", "p6_zm_buildable_turret_mower", 48, 64, 0, "zm_hud_icon_lawnmower", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 13 );
|
||||
turret_ammo = generate_zombie_buildable_piece( "turret", "p6_zm_buildable_turret_ammo", 32, 15, 0, "zm_hud_icon_ammobox", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 14 );
|
||||
turret = spawnstruct();
|
||||
turret.name = "turret";
|
||||
turret add_buildable_piece( turret_barrel );
|
||||
turret add_buildable_piece( turret_body );
|
||||
turret add_buildable_piece( turret_ammo );
|
||||
turret.triggerthink = ::turretbuildable;
|
||||
include_buildable( turret );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "turret_buildable_trigger" );
|
||||
electric_trap_spool = generate_zombie_buildable_piece( "electric_trap", "p6_zm_buildable_etrap_base", 32, 64, 0, "zm_hud_icon_coil", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 15 );
|
||||
electric_trap_coil = generate_zombie_buildable_piece( "electric_trap", "p6_zm_buildable_etrap_tvtube", 32, 64, 10, "zm_hud_icon_tvtube", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 16 );
|
||||
electric_trap = spawnstruct();
|
||||
electric_trap.name = "electric_trap";
|
||||
electric_trap add_buildable_piece( electric_trap_spool );
|
||||
electric_trap add_buildable_piece( electric_trap_coil );
|
||||
electric_trap add_buildable_piece( battery, "tag_part_03", 0 );
|
||||
electric_trap.triggerthink = ::electrictrapbuildable;
|
||||
include_buildable( electric_trap );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "electric_trap_buildable_trigger" );
|
||||
jetgun_wires = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_wires", 32, 64, 0, "zm_hud_icon_jetgun_wires", ::onpickup_common, ::ondrop_common, undefined, "TAG_WIRES", undefined, 17 );
|
||||
jetgun_engine = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_engine", 48, 64, 0, "zm_hud_icon_jetgun_engine", ::onpickup_common, ::ondrop_common, undefined, "TAG_ENGINE", undefined, 18 );
|
||||
jetgun_gauges = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_guages", 32, 15, 0, "zm_hud_icon_jetgun_gauges", ::onpickup_common, ::ondrop_common, undefined, "TAG_DIALS", undefined, 19 );
|
||||
jetgun_handle = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_handles", 32, 15, 0, "zm_hud_icon_jetgun_handles", ::onpickup_common, ::ondrop_common, undefined, "TAG_HANDLES", undefined, 20 );
|
||||
jetgun = spawnstruct();
|
||||
jetgun.name = "jetgun_zm";
|
||||
jetgun add_buildable_piece( jetgun_wires );
|
||||
jetgun add_buildable_piece( jetgun_engine );
|
||||
jetgun add_buildable_piece( jetgun_gauges );
|
||||
jetgun add_buildable_piece( jetgun_handle );
|
||||
jetgun.onbuyweapon = ::onbuyweapon_jetgun;
|
||||
jetgun.triggerthink = ::jetgunbuildable;
|
||||
include_buildable( jetgun );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "jetgun_zm_buildable_trigger" );
|
||||
cattlecatcher_plow = generate_zombie_buildable_piece( "cattlecatcher", "veh_t6_civ_bus_zombie_cow_catcher", 72, 100, 20, "zm_hud_icon_plow", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 21 );
|
||||
bushatch_hatch = generate_zombie_buildable_piece( "bushatch", "veh_t6_civ_bus_zombie_roof_hatch", 32, 64, 5, "zm_hud_icon_hatch", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 22 );
|
||||
busladder_ladder = generate_zombie_buildable_piece( "busladder", "com_stepladder_large_closed", 32, 64, 0, "zm_hud_icon_ladder", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 23 );
|
||||
cattlecatcher = spawnstruct();
|
||||
cattlecatcher.name = "cattlecatcher";
|
||||
cattlecatcher add_buildable_piece( cattlecatcher_plow );
|
||||
cattlecatcher.triggerthink = ::cattlecatcherbuildable;
|
||||
include_buildable( cattlecatcher );
|
||||
bushatch = spawnstruct();
|
||||
bushatch.name = "bushatch";
|
||||
bushatch add_buildable_piece( bushatch_hatch, undefined, 1 );
|
||||
bushatch.triggerthink = ::bushatchbuildable;
|
||||
include_buildable( bushatch );
|
||||
dinerhatch = spawnstruct();
|
||||
dinerhatch.name = "dinerhatch";
|
||||
dinerhatch add_buildable_piece( bushatch_hatch, undefined, 1 );
|
||||
dinerhatch.triggerthink = ::dinerhatchbuildable;
|
||||
include_buildable( dinerhatch );
|
||||
busladder = spawnstruct();
|
||||
busladder.name = "busladder";
|
||||
busladder add_buildable_piece( busladder_ladder );
|
||||
busladder.triggerthink = ::busladderbuildable;
|
||||
include_buildable( busladder );
|
||||
if ( !isDefined( level.gamedifficulty ) || level.gamedifficulty != 0 )
|
||||
{
|
||||
sq_common_electricbox = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_electric_box", 32, 64, 0, "zm_hud_icon_sq_powerbox", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 24 );
|
||||
sq_common_meteor = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_meteor", 76, 64, 0, "zm_hud_icon_sq_meteor", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 25 );
|
||||
sq_common_scaffolding = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_scaffolding", 64, 96, 0, "zm_hud_icon_sq_scafold", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 26 );
|
||||
sq_common_transceiver = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_transceiver", 64, 96, 0, "zm_hud_icon_sq_tranceiver", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 27 );
|
||||
sqcommon = spawnstruct();
|
||||
sqcommon.name = "sq_common";
|
||||
sqcommon add_buildable_piece( sq_common_electricbox );
|
||||
sqcommon add_buildable_piece( sq_common_meteor );
|
||||
sqcommon add_buildable_piece( sq_common_scaffolding );
|
||||
sqcommon add_buildable_piece( sq_common_transceiver );
|
||||
sqcommon.triggerthink = ::sqcommonbuildable;
|
||||
include_buildable( sqcommon );
|
||||
maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "sq_common_buildable_trigger" );
|
||||
}
|
||||
}
|
||||
|
||||
sqcommonbuildable()
|
||||
{
|
||||
level.sq_buildable = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "sq_common_buildable_trigger", "sq_common", "sq_common", "", 1, 0 );
|
||||
}
|
||||
|
||||
busladderbuildable()
|
||||
{
|
||||
blb = maps/mp/zombies/_zm_buildables::vehicle_buildable_trigger_think( level.the_bus, "bus_ladder_trigger", "busladder", "busladder", "", 0, 0 );
|
||||
blb.require_look_at = 0;
|
||||
blb.custom_buildablestub_update_prompt = ::busisonormovingbuildableupdateprompt;
|
||||
}
|
||||
|
||||
busisonormovingbuildableupdateprompt( player, sethintstringnow, buildabletrigger )
|
||||
{
|
||||
if ( isDefined( player.isonbus ) || player.isonbus && level.the_bus getspeedmph() > 0 )
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self.hint_string = "";
|
||||
if ( isDefined( sethintstringnow ) && sethintstringnow && isDefined( buildabletrigger ) )
|
||||
{
|
||||
buildabletrigger sethintstring( self.hint_string );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
bushatchbuildable()
|
||||
{
|
||||
bhb = maps/mp/zombies/_zm_buildables::vehicle_buildable_trigger_think( level.the_bus, "bus_hatch_bottom_trigger", "bushatch", "bushatch", "", 0, 0 );
|
||||
bhb.require_look_at = 0;
|
||||
}
|
||||
|
||||
dinerhatchbuildable()
|
||||
{
|
||||
dhb = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "diner_hatch_trigger", "dinerhatch", "dinerhatch", "", 1, 0 );
|
||||
dhb.require_look_at = 0;
|
||||
}
|
||||
|
||||
cattlecatcherbuildable()
|
||||
{
|
||||
ccb = maps/mp/zombies/_zm_buildables::vehicle_buildable_trigger_think( level.the_bus, "trigger_plow", "cattlecatcher", "cattlecatcher", "", 0, 0 );
|
||||
ccb.require_look_at = 0;
|
||||
ccb.custom_buildablestub_update_prompt = ::busisonormovingbuildableupdateprompt;
|
||||
}
|
||||
|
||||
papbuildable()
|
||||
{
|
||||
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "pap_buildable_trigger", "pap", "pap", "", 1, 0 );
|
||||
}
|
||||
|
||||
riotshieldbuildable()
|
||||
{
|
||||
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "riotshield_zm_buildable_trigger", "riotshield_zm", "riotshield_zm", &"ZOMBIE_GRAB_RIOTSHIELD", 1, 1 );
|
||||
}
|
||||
|
||||
powerswitchbuildable()
|
||||
{
|
||||
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "powerswitch_buildable_trigger", "powerswitch", "powerswitch", "", 1, 0 );
|
||||
}
|
||||
|
||||
turbinebuildable()
|
||||
{
|
||||
level.turbine_buildable = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "turbine_buildable_trigger", "turbine", "equip_turbine_zm", &"ZOMBIE_GRAB_TURBINE_PICKUP_HINT_STRING", 1, 1 );
|
||||
}
|
||||
|
||||
turretbuildable()
|
||||
{
|
||||
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "turret_buildable_trigger", "turret", "equip_turret_zm", &"ZOMBIE_GRAB_TURRET_PICKUP_HINT_STRING", 1, 1 );
|
||||
}
|
||||
|
||||
electrictrapbuildable()
|
||||
{
|
||||
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "electric_trap_buildable_trigger", "electric_trap", "equip_electrictrap_zm", &"ZOMBIE_GRAB_ELECTRICTRAP", 1, 1 );
|
||||
}
|
||||
|
||||
jetgunbuildable()
|
||||
{
|
||||
level.jetgun_buildable = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "jetgun_zm_buildable_trigger", "jetgun_zm", "jetgun_zm", &"ZOMBIE_GRAB_JETGUN", 1, 1 );
|
||||
}
|
||||
|
||||
ondrop_common( player )
|
||||
{
|
||||
/#
|
||||
println( "ZM >> Common part callback onDrop()" );
|
||||
#/
|
||||
self droponbus( player );
|
||||
self.piece_owner = undefined;
|
||||
}
|
||||
|
||||
onpickup_common( player )
|
||||
{
|
||||
/#
|
||||
println( "ZM >> Common part callback onPickup()" );
|
||||
#/
|
||||
player playsound( "zmb_buildable_pickup" );
|
||||
self pickupfrombus();
|
||||
self.piece_owner = player;
|
||||
if ( isDefined( self.buildablename ) )
|
||||
{
|
||||
if ( self.buildablename == "turbine" )
|
||||
{
|
||||
check_for_buildable_turbine_vox( level.turbine_buildable, 0 );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.buildablename == "jetgun_zm" )
|
||||
{
|
||||
check_for_buildable_jetgun_vox( level.jetgun_buildable, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onbuyweapon_riotshield( player )
|
||||
{
|
||||
if ( isDefined( player.player_shield_reset_health ) )
|
||||
{
|
||||
player [[ player.player_shield_reset_health ]]();
|
||||
}
|
||||
if ( isDefined( player.player_shield_reset_location ) )
|
||||
{
|
||||
player [[ player.player_shield_reset_location ]]();
|
||||
}
|
||||
}
|
||||
|
||||
onuseplantobject_powerswitch( player )
|
||||
{
|
||||
/#
|
||||
println( "ZM >> PowerSwitch Buildable CallBack onUsePlantObject()" );
|
||||
#/
|
||||
if ( !isDefined( player player_get_buildable_piece() ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch( player player_get_buildable_piece().modelname )
|
||||
{
|
||||
case "p6_zm_buildable_pswitch_hand":
|
||||
getent( "powerswitch_p6_zm_buildable_pswitch_hand", "targetname" ) show();
|
||||
break;
|
||||
case "p6_zm_buildable_pswitch_body":
|
||||
panel = getent( "powerswitch_p6_zm_buildable_pswitch_body", "targetname" );
|
||||
panel show();
|
||||
break;
|
||||
case "p6_zm_buildable_pswitch_lever":
|
||||
getent( "powerswitch_p6_zm_buildable_pswitch_lever", "targetname" ) show();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onuseplantobject_turbine( player )
|
||||
{
|
||||
/#
|
||||
println( "ZM >> Turbine Buildable CallBack onUsePlantObject()" );
|
||||
#/
|
||||
buildable = self.buildablezone;
|
||||
first_part = "tag_part_03";
|
||||
second_part = "tag_part_02";
|
||||
i = 0;
|
||||
while ( i < buildable.pieces.size )
|
||||
{
|
||||
if ( buildable.pieces[ i ].part_name == first_part )
|
||||
{
|
||||
if ( isDefined( buildable.pieces[ i ].built ) || buildable.pieces[ i ].built && player player_get_buildable_piece().part_name == first_part )
|
||||
{
|
||||
buildable.stub.model showpart( second_part );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
buildable.stub.model hidepart( second_part );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
check_for_buildable_turbine_vox( level.turbine_buildable, 1 );
|
||||
}
|
||||
|
||||
check_for_buildable_turbine_vox( stub, start_build_counter )
|
||||
{
|
||||
if ( isDefined( level.maxis_turbine_vox_played ) && level.maxis_turbine_vox_played )
|
||||
{
|
||||
return;
|
||||
}
|
||||
buildable = stub.buildablezone;
|
||||
piece_counter = 0;
|
||||
build_counter = start_build_counter;
|
||||
i = 0;
|
||||
while ( i < buildable.pieces.size )
|
||||
{
|
||||
if ( isDefined( buildable.pieces[ i ].built ) || buildable.pieces[ i ].built && isDefined( buildable.pieces[ i ].piece_owner ) )
|
||||
{
|
||||
piece_counter++;
|
||||
}
|
||||
if ( isDefined( buildable.pieces[ i ].built ) && buildable.pieces[ i ].built )
|
||||
{
|
||||
build_counter++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( build_counter >= 2 && piece_counter == 3 )
|
||||
{
|
||||
if ( !flag( "power_on" ) )
|
||||
{
|
||||
level.maxis_turbine_vox_played = 1;
|
||||
level thread maps/mp/zm_transit_sq::maxissay( "vox_maxi_turbine_final_0", stub.origin );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onbuyweapon_jetgun( player )
|
||||
{
|
||||
player switchtoweapon( self.stub.weaponname );
|
||||
}
|
||||
|
||||
check_for_buildable_jetgun_vox( stub, start_build_counter )
|
||||
{
|
||||
if ( isDefined( level.rich_jetgun_vox_played ) || level.rich_jetgun_vox_played && !flag( "power_on" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
buildable = stub.buildablezone;
|
||||
piece_counter = 0;
|
||||
build_counter = start_build_counter;
|
||||
i = 0;
|
||||
while ( i < buildable.pieces.size )
|
||||
{
|
||||
if ( isDefined( buildable.pieces[ i ].built ) || buildable.pieces[ i ].built && isDefined( buildable.pieces[ i ].piece_owner ) )
|
||||
{
|
||||
piece_counter++;
|
||||
}
|
||||
if ( isDefined( buildable.pieces[ i ].built ) && buildable.pieces[ i ].built )
|
||||
{
|
||||
build_counter++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( build_counter == 3 && piece_counter == 4 )
|
||||
{
|
||||
level thread maps/mp/zm_transit_sq::richtofensay( "vox_zmba_sidequest_jet_last_0" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( build_counter == 4 )
|
||||
{
|
||||
level thread maps/mp/zm_transit_sq::richtofensay( "vox_zmba_sidequest_jet_complete_0" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onenduse_sidequestcommon( team, player, result )
|
||||
{
|
||||
if ( isDefined( result ) && result )
|
||||
{
|
||||
if ( isDefined( level.sq_clip ) )
|
||||
{
|
||||
level.sq_clip trigger_on();
|
||||
level.sq_clip connectpaths();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
droponbus( player )
|
||||
{
|
||||
if ( isDefined( player ) && isDefined( player.isonbus ) && player.isonbus )
|
||||
{
|
||||
self.model linkto( level.the_bus );
|
||||
self.linked_to_bus = 1;
|
||||
self.unitrigger.link_parent = level.the_bus;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.unitrigger.link_parent = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
pickupfrombus()
|
||||
{
|
||||
if ( isDefined( self.linked_to_bus ) && self.linked_to_bus )
|
||||
{
|
||||
if ( isDefined( self.model ) )
|
||||
{
|
||||
self.model unlink();
|
||||
}
|
||||
self.linked_to_bus = undefined;
|
||||
}
|
||||
if ( isDefined( self.unitrigger ) )
|
||||
{
|
||||
self.unitrigger.link_parent = undefined;
|
||||
}
|
||||
}
|
3759
zm_transit_patch/maps/mp/zm_transit_bus.gsc
Normal file
3759
zm_transit_patch/maps/mp/zm_transit_bus.gsc
Normal file
File diff suppressed because it is too large
Load Diff
359
zm_transit_patch/maps/mp/zm_transit_cling.gsc
Normal file
359
zm_transit_patch/maps/mp/zm_transit_cling.gsc
Normal file
@ -0,0 +1,359 @@
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
initializecling()
|
||||
{
|
||||
setupclingtrigger();
|
||||
}
|
||||
|
||||
setupclingtrigger()
|
||||
{
|
||||
if ( !isDefined( level.the_bus ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
enablecling();
|
||||
triggers = [];
|
||||
level.cling_triggers = [];
|
||||
triggers = getentarray( "cling_trigger", "script_noteworthy" );
|
||||
i = 0;
|
||||
while ( i < triggers.size )
|
||||
{
|
||||
level.cling_triggers[ i ] = spawnstruct();
|
||||
level.cling_triggers[ i ].trigger = triggers[ i ];
|
||||
trigger = level.cling_triggers[ i ].trigger;
|
||||
trigger sethintstring( "Hold [{+activate}] To Cling To The Bus." );
|
||||
trigger setcursorhint( "HINT_NOICON" );
|
||||
makevisibletoall( trigger );
|
||||
trigger enablelinkto();
|
||||
trigger linkto( level.the_bus, "", level.the_bus worldtolocalcoords( trigger.origin ), trigger.angles - level.the_bus.angles );
|
||||
trigger thread setclingtriggervisibility( i );
|
||||
trigger thread clingtriggerusethink( i );
|
||||
level.cling_triggers[ i ].position = getent( trigger.target, "targetname" );
|
||||
position = level.cling_triggers[ i ].position;
|
||||
position linkto( level.the_bus, "", level.the_bus worldtolocalcoords( position.origin ), position.angles - level.the_bus.angles );
|
||||
level.cling_triggers[ i ].player = undefined;
|
||||
i++;
|
||||
}
|
||||
disablecling();
|
||||
}
|
||||
|
||||
enablecling()
|
||||
{
|
||||
level.cling_enabled = 1;
|
||||
while ( isDefined( level.cling_triggers ) )
|
||||
{
|
||||
_a65 = level.cling_triggers;
|
||||
_k65 = getFirstArrayKey( _a65 );
|
||||
while ( isDefined( _k65 ) )
|
||||
{
|
||||
struct = _a65[ _k65 ];
|
||||
struct.trigger sethintstring( "Hold [{+activate}] To Cling To The Bus." );
|
||||
struct.trigger setteamfortrigger( "allies" );
|
||||
_k65 = getNextArrayKey( _a65, _k65 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
disablecling()
|
||||
{
|
||||
level.cling_enabled = 0;
|
||||
detachallplayersfromclinging();
|
||||
while ( isDefined( level.cling_triggers ) )
|
||||
{
|
||||
_a81 = level.cling_triggers;
|
||||
_k81 = getFirstArrayKey( _a81 );
|
||||
while ( isDefined( _k81 ) )
|
||||
{
|
||||
struct = _a81[ _k81 ];
|
||||
struct.trigger sethintstring( "" );
|
||||
struct.trigger setteamfortrigger( "none" );
|
||||
_k81 = getNextArrayKey( _a81, _k81 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
makevisibletoall( trigger )
|
||||
{
|
||||
players = get_players();
|
||||
playerindex = 0;
|
||||
while ( playerindex < players.size )
|
||||
{
|
||||
trigger setinvisibletoplayer( players[ playerindex ], 0 );
|
||||
playerindex++;
|
||||
}
|
||||
}
|
||||
|
||||
clingtriggerusethink( positionindex )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
while ( !level.cling_enabled )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( !who usebuttonpressed() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( who in_revive_trigger() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( who.is_drinking ) && who.is_drinking == 1 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( isDefined( level.cling_triggers[ positionindex ].player ) )
|
||||
{
|
||||
if ( level.cling_triggers[ positionindex ].player == who )
|
||||
{
|
||||
dettachplayerfrombus( who, positionindex );
|
||||
}
|
||||
}
|
||||
attachplayertobus( who, positionindex );
|
||||
thread detachfrombusonevent( who, positionindex );
|
||||
}
|
||||
}
|
||||
|
||||
setclingtriggervisibility( positionindex )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( isDefined( level.cling_triggers[ positionindex ].player ) )
|
||||
{
|
||||
is_player_clinging = level.cling_triggers[ positionindex ].player == players[ i ];
|
||||
}
|
||||
no_player_clinging = !isDefined( level.cling_triggers[ positionindex ].player );
|
||||
if ( is_player_clinging || no_player_clinging && level.cling_enabled )
|
||||
{
|
||||
self setinvisibletoplayer( players[ i ], 0 );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self setinvisibletoplayer( players[ i ], 1 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
|
||||
detachallplayersfromclinging()
|
||||
{
|
||||
positionindex = 0;
|
||||
while ( positionindex < level.cling_triggers.size )
|
||||
{
|
||||
if ( !isDefined( level.cling_triggers[ positionindex ] ) || !isDefined( level.cling_triggers[ positionindex ].player ) )
|
||||
{
|
||||
positionindex++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( level.cling_triggers[ positionindex ].player == players[ i ] )
|
||||
{
|
||||
dettachplayerfrombus( players[ i ], positionindex );
|
||||
positionindex++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
positionindex++;
|
||||
}
|
||||
}
|
||||
|
||||
attachplayertobus( player, positionindex )
|
||||
{
|
||||
turn_angle = 130;
|
||||
pitch_up = 25;
|
||||
if ( positionisupgraded( positionindex ) )
|
||||
{
|
||||
turn_angle = 180;
|
||||
pitch_up = 120;
|
||||
}
|
||||
level.cling_triggers[ positionindex ].player = player;
|
||||
if ( positionisbl( positionindex ) )
|
||||
{
|
||||
player playerlinktodelta( level.cling_triggers[ positionindex ].position, "tag_origin", 1, 180, turn_angle, pitch_up, 120, 1 );
|
||||
}
|
||||
else if ( positionisbr( positionindex ) )
|
||||
{
|
||||
player playerlinktodelta( level.cling_triggers[ positionindex ].position, "tag_origin", 1, turn_angle, 180, pitch_up, 120, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
level.cling_triggers[ positionindex ].player = undefined;
|
||||
return;
|
||||
}
|
||||
level.cling_triggers[ positionindex ].trigger sethintstring( "Hold [{+activate}] To Let Go Of The Bus." );
|
||||
player disableplayerweapons( positionindex );
|
||||
}
|
||||
|
||||
positionisbl( positionindex )
|
||||
{
|
||||
return level.cling_triggers[ positionindex ].position.script_string == "back_left";
|
||||
}
|
||||
|
||||
positionisbr( positionindex )
|
||||
{
|
||||
return level.cling_triggers[ positionindex ].position.script_string == "back_right";
|
||||
}
|
||||
|
||||
positionisupgraded( positionindex )
|
||||
{
|
||||
if ( positionisbl( positionindex ) && isDefined( level.the_bus.upgrades[ "PlatformL" ] ) && !level.the_bus.upgrades[ "PlatformL" ].installed )
|
||||
{
|
||||
if ( positionisbr( positionindex ) && isDefined( level.the_bus.upgrades[ "PlatformR" ] ) )
|
||||
{
|
||||
return level.the_bus.upgrades[ "PlatformR" ].installed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dettachplayerfrombus( player, positionindex )
|
||||
{
|
||||
level.cling_triggers[ positionindex ].trigger sethintstring( "Hold [{+activate}] To Cling To The Bus." );
|
||||
if ( !isDefined( level.cling_triggers[ positionindex ].player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player unlink();
|
||||
level.cling_triggers[ positionindex ].player = undefined;
|
||||
player enableplayerweapons( positionindex );
|
||||
player notify( "cling_dettached" );
|
||||
}
|
||||
|
||||
detachfrombusonevent( player, positionindex )
|
||||
{
|
||||
player endon( "cling_dettached" );
|
||||
player waittill_any( "fake_death", "death", "player_downed" );
|
||||
dettachplayerfrombus( player, positionindex );
|
||||
}
|
||||
|
||||
disableplayerweapons( positionindex )
|
||||
{
|
||||
weaponinventory = self getweaponslist( 1 );
|
||||
self.lastactiveweapon = self getcurrentweapon();
|
||||
self.clingpistol = undefined;
|
||||
self.hadclingpistol = 0;
|
||||
if ( !positionisupgraded( positionindex ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < weaponinventory.size )
|
||||
{
|
||||
weapon = weaponinventory[ i ];
|
||||
if ( weaponclass( weapon ) == "pistol" && isDefined( self.clingpistol ) || weapon == self.lastactiveweapon && self.clingpistol == "m1911_zm" )
|
||||
{
|
||||
self.clingpistol = weapon;
|
||||
self.hadclingpistol = 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !isDefined( self.clingpistol ) )
|
||||
{
|
||||
self giveweapon( "m1911_zm" );
|
||||
self.clingpistol = "m1911_zm";
|
||||
}
|
||||
self switchtoweapon( self.clingpistol );
|
||||
self disableweaponcycling();
|
||||
self disableoffhandweapons();
|
||||
self allowcrouch( 0 );
|
||||
}
|
||||
self allowlean( 0 );
|
||||
self allowsprint( 0 );
|
||||
self allowprone( 0 );
|
||||
}
|
||||
|
||||
enableplayerweapons( positionindex )
|
||||
{
|
||||
self allowlean( 1 );
|
||||
self allowsprint( 1 );
|
||||
self allowprone( 1 );
|
||||
if ( !positionisupgraded( positionindex ) )
|
||||
{
|
||||
if ( !self.hadclingpistol )
|
||||
{
|
||||
self takeweapon( "m1911_zm" );
|
||||
}
|
||||
self enableweaponcycling();
|
||||
self enableoffhandweapons();
|
||||
self allowcrouch( 1 );
|
||||
if ( self.lastactiveweapon != "none" && self.lastactiveweapon != "mortar_round" && self.lastactiveweapon != "mine_bouncing_betty" && self.lastactiveweapon != "claymore_zm" )
|
||||
{
|
||||
self switchtoweapon( self.lastactiveweapon );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
primaryweapons = self getweaponslistprimaries();
|
||||
if ( isDefined( primaryweapons ) && primaryweapons.size > 0 )
|
||||
{
|
||||
self switchtoweapon( primaryweapons[ 0 ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerisclingingtobus()
|
||||
{
|
||||
if ( !isDefined( level.cling_triggers ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.cling_triggers.size )
|
||||
{
|
||||
if ( !isDefined( level.cling_triggers[ i ] ) || !isDefined( level.cling_triggers[ i ].player ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.cling_triggers[ i ].player == self )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
_getnumplayersclinging()
|
||||
{
|
||||
num_clinging = 0;
|
||||
i = 0;
|
||||
while ( i < level.cling_triggers.size )
|
||||
{
|
||||
if ( isDefined( level.cling_triggers[ i ] ) && isDefined( level.cling_triggers[ i ].player ) )
|
||||
{
|
||||
num_clinging++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return num_clinging;
|
||||
}
|
||||
|
||||
_getbusattackposition( player )
|
||||
{
|
||||
pos = ( -208, 0, 48 );
|
||||
return level.the_bus localtoworldcoords( pos );
|
||||
}
|
161
zm_transit_patch/maps/mp/zm_transit_distance_tracking.gsc
Normal file
161
zm_transit_patch/maps/mp/zm_transit_distance_tracking.gsc
Normal file
@ -0,0 +1,161 @@
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
zombie_tracking_init()
|
||||
{
|
||||
level.zombie_respawned_health = [];
|
||||
if ( !isDefined( level.zombie_tracking_dist ) )
|
||||
{
|
||||
level.zombie_tracking_dist = 1500;
|
||||
}
|
||||
if ( !isDefined( level.zombie_tracking_wait ) )
|
||||
{
|
||||
level.zombie_tracking_wait = 10;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
zombies = get_round_enemy_array();
|
||||
if ( !isDefined( zombies ) || isDefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
|
||||
{
|
||||
wait level.zombie_tracking_wait;
|
||||
}
|
||||
}
|
||||
else i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( isDefined( zombies[ i ] ) && isDefined( zombies[ i ].ignore_distance_tracking ) && !zombies[ i ].ignore_distance_tracking )
|
||||
{
|
||||
zombies[ i ] thread delete_zombie_noone_looking( level.zombie_tracking_dist );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait level.zombie_tracking_wait;
|
||||
}
|
||||
}
|
||||
|
||||
delete_zombie_noone_looking( how_close )
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( !isDefined( how_close ) )
|
||||
{
|
||||
how_close = 1000;
|
||||
}
|
||||
distance_squared_check = how_close * how_close;
|
||||
too_far_dist = distance_squared_check * 3;
|
||||
if ( isDefined( level.zombie_tracking_too_far_dist ) )
|
||||
{
|
||||
too_far_dist = level.zombie_tracking_too_far_dist * level.zombie_tracking_too_far_dist;
|
||||
}
|
||||
self.inview = 0;
|
||||
self.player_close = 0;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].sessionstate == "spectator" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( isDefined( level.only_track_targeted_players ) )
|
||||
{
|
||||
if ( !isDefined( self.favoriteenemy ) || self.favoriteenemy != players[ i ] )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
can_be_seen = self player_can_see_me( players[ i ] );
|
||||
if ( can_be_seen && distancesquared( self.origin, players[ i ].origin ) < too_far_dist )
|
||||
{
|
||||
self.inview++;
|
||||
}
|
||||
if ( distancesquared( self.origin, players[ i ].origin ) < distance_squared_check )
|
||||
{
|
||||
self.player_close++;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0,1;
|
||||
if ( self.inview == 0 && self.player_close == 0 )
|
||||
{
|
||||
if ( !isDefined( self.animname ) || isDefined( self.animname ) && self.animname != "zombie" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.electrified ) && self.electrified == 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.in_the_ground ) && self.in_the_ground == 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
zombies = getaiarray( "axis" );
|
||||
if ( isDefined( self.damagemod ) && self.damagemod == "MOD_UNKNOWN" && self.health < self.maxhealth )
|
||||
{
|
||||
if ( isDefined( self.exclude_distance_cleanup_adding_to_total ) && !self.exclude_distance_cleanup_adding_to_total && isDefined( self.isscreecher ) && !self.isscreecher )
|
||||
{
|
||||
level.zombie_total++;
|
||||
level.zombie_respawned_health[ level.zombie_respawned_health.size ] = self.health;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ( zombies.size + level.zombie_total ) > 24 || ( zombies.size + level.zombie_total ) <= 24 && self.health >= self.maxhealth )
|
||||
{
|
||||
if ( isDefined( self.exclude_distance_cleanup_adding_to_total ) && !self.exclude_distance_cleanup_adding_to_total && isDefined( self.isscreecher ) && !self.isscreecher )
|
||||
{
|
||||
level.zombie_total++;
|
||||
if ( self.health < level.zombie_health )
|
||||
{
|
||||
level.zombie_respawned_health[ level.zombie_respawned_health.size ] = self.health;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self maps/mp/zombies/_zm_spawner::reset_attack_spot();
|
||||
self notify( "zombie_delete" );
|
||||
self delete();
|
||||
recalc_zombie_array();
|
||||
}
|
||||
}
|
||||
|
||||
player_can_see_me( player )
|
||||
{
|
||||
playerangles = player getplayerangles();
|
||||
playerforwardvec = anglesToForward( playerangles );
|
||||
playerunitforwardvec = vectornormalize( playerforwardvec );
|
||||
banzaipos = self.origin;
|
||||
playerpos = player getorigin();
|
||||
playertobanzaivec = banzaipos - playerpos;
|
||||
playertobanzaiunitvec = vectornormalize( playertobanzaivec );
|
||||
forwarddotbanzai = vectordot( playerunitforwardvec, playertobanzaiunitvec );
|
||||
if ( forwarddotbanzai >= 1 )
|
||||
{
|
||||
anglefromcenter = 0;
|
||||
}
|
||||
else if ( forwarddotbanzai <= -1 )
|
||||
{
|
||||
anglefromcenter = 180;
|
||||
}
|
||||
else
|
||||
{
|
||||
anglefromcenter = acos( forwarddotbanzai );
|
||||
}
|
||||
playerfov = getDvarFloat( "cg_fov" );
|
||||
banzaivsplayerfovbuffer = getDvarFloat( "g_banzai_player_fov_buffer" );
|
||||
if ( banzaivsplayerfovbuffer <= 0 )
|
||||
{
|
||||
banzaivsplayerfovbuffer = 0,2;
|
||||
}
|
||||
playercanseeme = anglefromcenter <= ( ( playerfov * 0,5 ) * ( 1 - banzaivsplayerfovbuffer ) );
|
||||
return playercanseeme;
|
||||
}
|
291
zm_transit_patch/maps/mp/zm_transit_ffotd.gsc
Normal file
291
zm_transit_patch/maps/mp/zm_transit_ffotd.gsc
Normal file
@ -0,0 +1,291 @@
|
||||
#include maps/mp/zm_transit;
|
||||
#include maps/mp/zombies/_zm_ffotd;
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
main_start()
|
||||
{
|
||||
precachemodel( "collision_wall_256x256x10_standard" );
|
||||
precachemodel( "collision_geo_32x32x10_standard" );
|
||||
precachemodel( "collision_wall_128x128x10_standard" );
|
||||
precachemodel( "collision_wall_64x64x10_standard" );
|
||||
precachemodel( "collision_wall_512x512x10_standard" );
|
||||
precachemodel( "collision_player_32x32x128" );
|
||||
precachemodel( "collision_player_256x256x256" );
|
||||
old_roof_trig = getent( "bus_roof_watch", "targetname" );
|
||||
level.roof_trig = spawn( "trigger_box", old_roof_trig.origin, 0, 464, 180, 120 );
|
||||
level.roof_trig.targetname = "bus_roof_watch";
|
||||
old_roof_trig delete();
|
||||
if ( isDefined( level.use_swipe_protection ) )
|
||||
{
|
||||
onplayerconnect_callback( ::claymore_watch_swipes );
|
||||
}
|
||||
powerdoors = getentarray( "local_electric_door", "script_noteworthy" );
|
||||
_a29 = powerdoors;
|
||||
_k29 = getFirstArrayKey( _a29 );
|
||||
while ( isDefined( _k29 ) )
|
||||
{
|
||||
door = _a29[ _k29 ];
|
||||
if ( isDefined( door.door_hold_trigger ) && door.door_hold_trigger == "zombie_door_hold_diner" )
|
||||
{
|
||||
if ( isDefined( door.script_flag ) && door.script_flag == "OnPriDoorYar" )
|
||||
{
|
||||
door.script_flag = undefined;
|
||||
}
|
||||
}
|
||||
_k29 = getNextArrayKey( _a29, _k29 );
|
||||
}
|
||||
}
|
||||
|
||||
main_end()
|
||||
{
|
||||
if ( !is_true( level.optimise_for_splitscreen ) )
|
||||
{
|
||||
maps/mp/zombies/_zm::spawn_kill_brush( ( 33, -450, -90 ), 982, 15 );
|
||||
location = level.scr_zm_map_start_location;
|
||||
type = level.scr_zm_ui_gametype;
|
||||
collision4 = spawn( "script_model", ( 12240, 8480, -720 ) );
|
||||
collision4 setmodel( "collision_wall_64x64x10_standard" );
|
||||
collision4.angles = ( 0, 1, 0 );
|
||||
collision4 ghost();
|
||||
collision5 = spawn( "script_model", ( 8320, -6679, 362 ) );
|
||||
collision5 setmodel( "collision_wall_256x256x10_standard" );
|
||||
collision5.angles = vectorScale( ( 0, 1, 0 ), 300 );
|
||||
collision5 ghost();
|
||||
collision6 = spawn( "script_model", ( 8340, -5018, 191 ) );
|
||||
collision6 setmodel( "collision_geo_32x32x10_standard" );
|
||||
collision6.angles = vectorScale( ( 0, 1, 0 ), 270 );
|
||||
collision6 ghost();
|
||||
collision7 = spawn( "script_model", ( 8340, -5018, 219 ) );
|
||||
collision7 setmodel( "collision_geo_32x32x10_standard" );
|
||||
collision7.angles = vectorScale( ( 0, 1, 0 ), 270 );
|
||||
collision7 ghost();
|
||||
collision8 = spawn( "script_model", ( 8044, -5018, 191 ) );
|
||||
collision8 setmodel( "collision_geo_32x32x10_standard" );
|
||||
collision8.angles = vectorScale( ( 0, 1, 0 ), 270 );
|
||||
collision8 ghost();
|
||||
collision9 = spawn( "script_model", ( 8044, -5018, 219 ) );
|
||||
collision9 setmodel( "collision_geo_32x32x10_standard" );
|
||||
collision9.angles = vectorScale( ( 0, 1, 0 ), 270 );
|
||||
collision9 ghost();
|
||||
if ( location == "town" && type == "zstandard" )
|
||||
{
|
||||
collision10 = spawn( "script_model", ( 1820, 126, 152 ) );
|
||||
collision10 setmodel( "collision_wall_128x128x10_standard" );
|
||||
collision10.angles = vectorScale( ( 0, 1, 0 ), 262 );
|
||||
collision10 ghost();
|
||||
}
|
||||
collision11 = spawn( "script_model", ( 11216,3, 8188, -432 ) );
|
||||
collision11 setmodel( "collision_wall_128x128x10_standard" );
|
||||
collision11.angles = vectorScale( ( 0, 1, 0 ), 180 );
|
||||
collision11 ghost();
|
||||
collision12 = spawn( "script_model", ( -454, 620,25, -1,75 ) );
|
||||
collision12 setmodel( "collision_wall_128x128x10_standard" );
|
||||
collision12.angles = vectorScale( ( 0, 1, 0 ), 330 );
|
||||
collision12 ghost();
|
||||
collision13 = spawn( "script_model", ( 11798, 8410, -734 ) );
|
||||
collision13 setmodel( "collision_wall_128x128x10_standard" );
|
||||
collision13.angles = ( 90, 260,589, -10,311 );
|
||||
collision13 ghost();
|
||||
collision14 = spawn( "script_model", ( 652, 240, 124 ) );
|
||||
collision14 setmodel( "collision_wall_128x128x10_standard" );
|
||||
collision14.angles = vectorScale( ( 0, 1, 0 ), 105 );
|
||||
collision14 ghost();
|
||||
if ( location == "farm" && type == "zgrief" )
|
||||
{
|
||||
collision15 = spawn( "script_model", ( 8052, -5204, 380 ) );
|
||||
collision15 setmodel( "collision_wall_64x64x10_standard" );
|
||||
collision15.angles = vectorScale( ( 0, 1, 0 ), 180 );
|
||||
collision15 ghost();
|
||||
}
|
||||
collision16 = spawn( "script_model", ( -448, 328, 112 ) );
|
||||
collision16 setmodel( "collision_wall_512x512x10_standard" );
|
||||
collision16.angles = ( 270, 67,822, 22,1776 );
|
||||
collision16 ghost();
|
||||
collision17 = spawn( "script_model", ( 6040, -5744, 240 ) );
|
||||
collision17 setmodel( "collision_player_256x256x256" );
|
||||
collision17.angles = vectorScale( ( 0, 1, 0 ), 90 );
|
||||
collision17 ghost();
|
||||
collision18 = spawn( "script_model", ( -6744, 4184, 64 ) );
|
||||
collision18 setmodel( "collision_wall_128x128x10_standard" );
|
||||
collision18.angles = vectorScale( ( 0, 1, 0 ), 90 );
|
||||
collision18 ghost();
|
||||
collision19 = spawn( "script_model", ( -6328, -7168, 264 ) );
|
||||
collision19 setmodel( "collision_player_256x256x256" );
|
||||
collision19.angles = vectorScale( ( 0, 1, 0 ), 90 );
|
||||
collision19 ghost();
|
||||
collision20 = spawn( "script_model", ( 9960, 7352, -136 ) );
|
||||
collision20 setmodel( "collision_player_256x256x256" );
|
||||
collision20.angles = vectorScale( ( 0, 1, 0 ), 90 );
|
||||
collision20 ghost();
|
||||
collision21 = spawn( "script_model", ( -4656, -7373, 0 ) );
|
||||
collision21 setmodel( "collision_player_32x32x128" );
|
||||
collision21.angles = vectorScale( ( 0, 1, 0 ), 341,6 );
|
||||
collision21 ghost();
|
||||
}
|
||||
apartment_exploit();
|
||||
town_truck_exploit();
|
||||
farm_porch_exploit();
|
||||
power_station_exploit();
|
||||
nacht_exploit();
|
||||
level.equipment_dead_zone_pos = [];
|
||||
level.equipment_dead_zone_rad2 = [];
|
||||
level.equipment_dead_zone_type = [];
|
||||
level.equipment_dead_zone_pos[ 0 ] = ( -6252,98, -7947,23, 149,125 );
|
||||
level.equipment_dead_zone_rad2[ 0 ] = 3600;
|
||||
level.equipment_dead_zone_pos[ 1 ] = ( -11752, -2515, 288 );
|
||||
level.equipment_dead_zone_rad2[ 1 ] = 14400;
|
||||
level.equipment_dead_zone_type[ 1 ] = "t6_wpn_zmb_shield_world";
|
||||
level.equipment_dead_zone_pos[ 2 ] = ( -6664, 4592, -48 );
|
||||
level.equipment_dead_zone_rad2[ 2 ] = 2304;
|
||||
level.equipment_dead_zone_type[ 2 ] = "t6_wpn_zmb_shield_world";
|
||||
level.equipment_dead_zone_pos[ 3 ] = ( 7656, -4741, 38 );
|
||||
level.equipment_dead_zone_rad2[ 3 ] = 2304;
|
||||
level.equipment_dead_zone_type[ 3 ] = "t6_wpn_zmb_shield_world";
|
||||
level.equipment_dead_zone_pos[ 4 ] = ( -11712, -776, 224 );
|
||||
level.equipment_dead_zone_rad2[ 4 ] = 16384;
|
||||
level.equipment_dead_zone_type[ 4 ] = "t6_wpn_zmb_shield_world";
|
||||
level.equipment_dead_zone_pos[ 5 ] = ( -4868, -7713, -42 );
|
||||
level.equipment_dead_zone_rad2[ 5 ] = 256;
|
||||
level.equipment_dead_zone_type[ 5 ] = "t6_wpn_zmb_shield_world";
|
||||
level.equipment_safe_to_drop = ::equipment_safe_to_drop_ffotd;
|
||||
}
|
||||
|
||||
apartment_exploit()
|
||||
{
|
||||
zombie_trigger_origin = ( 994, -1145, 130 );
|
||||
zombie_trigger_radius = 32;
|
||||
zombie_trigger_height = 64;
|
||||
player_trigger_origin = ( 1068, -1085, 130 );
|
||||
player_trigger_radius = 72;
|
||||
zombie_goto_point = ( 1024, -1024, 136 );
|
||||
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 );
|
||||
}
|
||||
|
||||
nacht_exploit()
|
||||
{
|
||||
zombie_trigger_origin = ( 13720, -639, -188 );
|
||||
zombie_trigger_radius = 64;
|
||||
zombie_trigger_height = 128;
|
||||
player_trigger_origin = ( 13605, -651, -188 );
|
||||
player_trigger_radius = 64;
|
||||
zombie_goto_point = ( 13671, -745, -188 );
|
||||
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 );
|
||||
}
|
||||
|
||||
town_truck_exploit()
|
||||
{
|
||||
zombie_trigger_origin = ( 1414, -1921, -42 );
|
||||
zombie_trigger_radius = 50;
|
||||
zombie_trigger_height = 64;
|
||||
player_trigger_origin = ( 1476, -1776, -42 );
|
||||
player_trigger_radius = 76;
|
||||
zombie_goto_point = ( 1476, -1867, -42 );
|
||||
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 );
|
||||
}
|
||||
|
||||
farm_porch_exploit()
|
||||
{
|
||||
zombie_trigger_origin = ( 7864, -6088, 104 );
|
||||
zombie_trigger_radius = 85,5;
|
||||
zombie_trigger_height = 64;
|
||||
player_trigger_origin = ( 7984, -6128, 168 );
|
||||
player_trigger_radius = 44;
|
||||
zombie_goto_point = ( 7960, -6072, 96 );
|
||||
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 = ( 7996, -6169, 132 );
|
||||
zombie_trigger_radius = 200,1;
|
||||
zombie_trigger_height = 64;
|
||||
player_trigger_origin = ( 7893, -6078, 121 );
|
||||
player_trigger_radius = 50;
|
||||
zombie_goto_point = ( 7828, -6052,5, 125 );
|
||||
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 );
|
||||
}
|
||||
|
||||
power_station_exploit()
|
||||
{
|
||||
zombie_trigger_origin = ( 11248, 8504, -560 );
|
||||
zombie_trigger_radius = 125;
|
||||
zombie_trigger_height = 64;
|
||||
player_trigger_origin = ( 11368, 8624, -560 );
|
||||
player_trigger_radius = 65;
|
||||
zombie_goto_point = ( 11352, 8560, -560 );
|
||||
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 = ( 11168, 8880, -568 );
|
||||
zombie_trigger_radius = 78;
|
||||
zombie_trigger_height = 64;
|
||||
player_trigger_origin = ( 11048, 8888, -568 );
|
||||
player_trigger_radius = 79;
|
||||
zombie_goto_point = ( 11072, 8912, -568 );
|
||||
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 );
|
||||
}
|
||||
|
||||
equipment_safe_to_drop_ffotd( weapon )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level.equipment_dead_zone_pos.size )
|
||||
{
|
||||
if ( distancesquared( level.equipment_dead_zone_pos[ i ], weapon.origin ) < level.equipment_dead_zone_rad2[ i ] )
|
||||
{
|
||||
if ( isDefined( level.equipment_dead_zone_type[ i ] ) || !isDefined( weapon.model ) && level.equipment_dead_zone_type[ i ] == weapon.model )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return self maps/mp/zm_transit::equipment_safe_to_drop( weapon );
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
121
zm_transit_patch/maps/mp/zm_transit_fx.gsc
Normal file
121
zm_transit_patch/maps/mp/zm_transit_fx.gsc
Normal file
@ -0,0 +1,121 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
main()
|
||||
{
|
||||
precache_createfx_fx();
|
||||
precache_scripted_fx();
|
||||
maps/mp/createfx/zm_transit_fx::main();
|
||||
maps/mp/createart/zm_transit_art::main();
|
||||
}
|
||||
|
||||
precache_scripted_fx()
|
||||
{
|
||||
level._effect[ "switch_sparks" ] = loadfx( "env/electrical/fx_elec_wire_spark_burst" );
|
||||
level._effect[ "maxis_sparks" ] = loadfx( "maps/zombie/fx_zmb_race_trail_grief" );
|
||||
level._effect[ "richtofen_sparks" ] = loadfx( "maps/zombie/fx_zmb_race_trail_neutral" );
|
||||
level._effect[ "sq_common_lightning" ] = loadfx( "maps/zombie/fx_zmb_tranzit_sq_lightning_orb" );
|
||||
level._effect[ "zapper_light_ready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_green" );
|
||||
level._effect[ "zapper_light_notready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_red" );
|
||||
level._effect[ "lght_marker" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker" );
|
||||
level._effect[ "lght_marker_flare" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" );
|
||||
level._effect[ "poltergeist" ] = loadfx( "misc/fx_zombie_couch_effect" );
|
||||
level._effect[ "zomb_gib" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" );
|
||||
level._effect[ "fx_headlight" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_headlight" );
|
||||
level._effect[ "fx_headlight_lenflares" ] = loadfx( "lens_flares/fx_lf_zmb_tranzit_bus_headlight" );
|
||||
level._effect[ "fx_brakelight" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_brakelights" );
|
||||
level._effect[ "fx_emergencylight" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_flashing_lights" );
|
||||
level._effect[ "fx_turn_signal_right" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_turnsignal_right" );
|
||||
level._effect[ "fx_turn_signal_left" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_turnsignal_left" );
|
||||
level._effect[ "fx_zbus_trans_fog" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_fog_intersect" );
|
||||
level._effect[ "bus_lava_driving" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_fire_driving" );
|
||||
level._effect[ "bus_hatch_bust" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bus_hatch_bust" );
|
||||
level._effect[ "elec_md" ] = loadfx( "electrical/fx_elec_player_md" );
|
||||
level._effect[ "elec_sm" ] = loadfx( "electrical/fx_elec_player_sm" );
|
||||
level._effect[ "elec_torso" ] = loadfx( "electrical/fx_elec_player_torso" );
|
||||
level._effect[ "blue_eyes" ] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" );
|
||||
level._effect[ "lava_burning" ] = loadfx( "env/fire/fx_fire_lava_player_torso" );
|
||||
level._effect[ "mc_trafficlight" ] = loadfx( "maps/zombie/fx_zmb_morsecode_traffic_loop" );
|
||||
level._effect[ "mc_towerlight" ] = loadfx( "maps/zombie/fx_zmb_morsecode_loop" );
|
||||
}
|
||||
|
||||
precache_createfx_fx()
|
||||
{
|
||||
level._effect[ "fx_insects_swarm_md_light" ] = loadfx( "bio/insects/fx_insects_swarm_md_light" );
|
||||
level._effect[ "fx_zmb_tranzit_flourescent_flicker" ] = loadfx( "maps/zombie/fx_zmb_tranzit_flourescent_flicker" );
|
||||
level._effect[ "fx_zmb_tranzit_flourescent_glow" ] = loadfx( "maps/zombie/fx_zmb_tranzit_flourescent_glow" );
|
||||
level._effect[ "fx_zmb_tranzit_flourescent_glow_lg" ] = loadfx( "maps/zombie/fx_zmb_tranzit_flourescent_glow_lg" );
|
||||
level._effect[ "fx_zmb_tranzit_flourescent_dbl_glow" ] = loadfx( "maps/zombie/fx_zmb_tranzit_flourescent_dbl_glow" );
|
||||
level._effect[ "fx_zmb_tranzit_depot_map_flicker" ] = loadfx( "maps/zombie/fx_zmb_tranzit_depot_map_flicker" );
|
||||
level._effect[ "fx_zmb_tranzit_light_bulb_xsm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_bulb_xsm" );
|
||||
level._effect[ "fx_zmb_tranzit_light_glow" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_glow" );
|
||||
level._effect[ "fx_zmb_tranzit_light_glow_xsm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_glow_xsm" );
|
||||
level._effect[ "fx_zmb_tranzit_light_glow_fog" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_glow_fog" );
|
||||
level._effect[ "fx_zmb_tranzit_light_depot_cans" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_depot_cans" );
|
||||
level._effect[ "fx_zmb_tranzit_light_desklamp" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_desklamp" );
|
||||
level._effect[ "fx_zmb_tranzit_light_town_cans" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_town_cans" );
|
||||
level._effect[ "fx_zmb_tranzit_light_town_cans_sm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_town_cans_sm" );
|
||||
level._effect[ "fx_zmb_tranzit_light_street_tinhat" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_street_tinhat" );
|
||||
level._effect[ "fx_zmb_tranzit_street_lamp" ] = loadfx( "maps/zombie/fx_zmb_tranzit_street_lamp" );
|
||||
level._effect[ "fx_zmb_tranzit_truck_light" ] = loadfx( "maps/zombie/fx_zmb_tranzit_truck_light" );
|
||||
level._effect[ "fx_zmb_tranzit_spark_int_runner" ] = loadfx( "maps/zombie/fx_zmb_tranzit_spark_int_runner" );
|
||||
level._effect[ "fx_zmb_tranzit_spark_ext_runner" ] = loadfx( "maps/zombie/fx_zmb_tranzit_spark_ext_runner" );
|
||||
level._effect[ "fx_zmb_tranzit_spark_blue_lg_loop" ] = loadfx( "maps/zombie/fx_zmb_tranzit_spark_blue_lg_loop" );
|
||||
level._effect[ "fx_zmb_tranzit_spark_blue_sm_loop" ] = loadfx( "maps/zombie/fx_zmb_tranzit_spark_blue_sm_loop" );
|
||||
level._effect[ "fx_zmb_tranzit_bar_glow" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bar_glow" );
|
||||
level._effect[ "fx_zmb_tranzit_transformer_on" ] = loadfx( "maps/zombie/fx_zmb_tranzit_transformer_on" );
|
||||
level._effect[ "fx_zmb_fog_closet" ] = loadfx( "fog/fx_zmb_fog_closet" );
|
||||
level._effect[ "fx_zmb_fog_low_300x300" ] = loadfx( "fog/fx_zmb_fog_low_300x300" );
|
||||
level._effect[ "fx_zmb_fog_thick_600x600" ] = loadfx( "fog/fx_zmb_fog_thick_600x600" );
|
||||
level._effect[ "fx_zmb_fog_thick_1200x600" ] = loadfx( "fog/fx_zmb_fog_thick_1200x600" );
|
||||
level._effect[ "fx_zmb_fog_transition_600x600" ] = loadfx( "fog/fx_zmb_fog_transition_600x600" );
|
||||
level._effect[ "fx_zmb_fog_transition_1200x600" ] = loadfx( "fog/fx_zmb_fog_transition_1200x600" );
|
||||
level._effect[ "fx_zmb_fog_transition_right_border" ] = loadfx( "fog/fx_zmb_fog_transition_right_border" );
|
||||
level._effect[ "fx_zmb_tranzit_smk_interior_md" ] = loadfx( "maps/zombie/fx_zmb_tranzit_smk_interior_md" );
|
||||
level._effect[ "fx_zmb_tranzit_smk_interior_heavy" ] = loadfx( "maps/zombie/fx_zmb_tranzit_smk_interior_heavy" );
|
||||
level._effect[ "fx_zmb_ash_ember_1000x1000" ] = loadfx( "maps/zombie/fx_zmb_ash_ember_1000x1000" );
|
||||
level._effect[ "fx_zmb_ash_ember_2000x1000" ] = loadfx( "maps/zombie/fx_zmb_ash_ember_2000x1000" );
|
||||
level._effect[ "fx_zmb_ash_rising_md" ] = loadfx( "maps/zombie/fx_zmb_ash_rising_md" );
|
||||
level._effect[ "fx_zmb_ash_windy_heavy_sm" ] = loadfx( "maps/zombie/fx_zmb_ash_windy_heavy_sm" );
|
||||
level._effect[ "fx_zmb_ash_windy_heavy_md" ] = loadfx( "maps/zombie/fx_zmb_ash_windy_heavy_md" );
|
||||
level._effect[ "fx_zmb_lava_detail" ] = loadfx( "maps/zombie/fx_zmb_lava_detail" );
|
||||
level._effect[ "fx_zmb_lava_edge_100" ] = loadfx( "maps/zombie/fx_zmb_lava_edge_100" );
|
||||
level._effect[ "fx_zmb_lava_50x50_sm" ] = loadfx( "maps/zombie/fx_zmb_lava_50x50_sm" );
|
||||
level._effect[ "fx_zmb_lava_100x100" ] = loadfx( "maps/zombie/fx_zmb_lava_100x100" );
|
||||
level._effect[ "fx_zmb_lava_river" ] = loadfx( "maps/zombie/fx_zmb_lava_river" );
|
||||
level._effect[ "fx_zmb_lava_creek" ] = loadfx( "maps/zombie/fx_zmb_lava_creek" );
|
||||
level._effect[ "fx_zmb_lava_crevice_glow_50" ] = loadfx( "maps/zombie/fx_zmb_lava_crevice_glow_50" );
|
||||
level._effect[ "fx_zmb_lava_crevice_glow_100" ] = loadfx( "maps/zombie/fx_zmb_lava_crevice_glow_100" );
|
||||
level._effect[ "fx_zmb_lava_crevice_smoke_100" ] = loadfx( "maps/zombie/fx_zmb_lava_crevice_smoke_100" );
|
||||
level._effect[ "fx_zmb_lava_smoke_tall" ] = loadfx( "maps/zombie/fx_zmb_lava_smoke_tall" );
|
||||
level._effect[ "fx_zmb_lava_smoke_pit" ] = loadfx( "maps/zombie/fx_zmb_lava_smoke_pit" );
|
||||
level._effect[ "fx_zmb_tranzit_bowling_sign_fog" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bowling_sign_fog" );
|
||||
level._effect[ "fx_zmb_tranzit_lava_distort" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_distort" );
|
||||
level._effect[ "fx_zmb_tranzit_lava_distort_sm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_distort_sm" );
|
||||
level._effect[ "fx_zmb_tranzit_lava_distort_detail" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_distort_detail" );
|
||||
level._effect[ "fx_zmb_tranzit_fire_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_med" );
|
||||
level._effect[ "fx_zmb_tranzit_fire_lrg" ] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_lrg" );
|
||||
level._effect[ "fx_zmb_tranzit_smk_column_lrg" ] = loadfx( "maps/zombie/fx_zmb_tranzit_smk_column_lrg" );
|
||||
level._effect[ "fx_zmb_papers_windy_slow" ] = loadfx( "maps/zombie/fx_zmb_papers_windy_slow" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_short_warm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_short_warm" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_vault" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_vault" );
|
||||
level._effect[ "fx_zmb_tranzit_key_glint" ] = loadfx( "maps/zombie/fx_zmb_tranzit_key_glint" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_interior_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_interior_med" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_interior_long" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_interior_long" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_depot_cool" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_depot_cool" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_depot_warm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_depot_warm" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_tunnel_warm" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_tunnel_warm" );
|
||||
level._effect[ "fx_zmb_tranzit_god_ray_pwr_station" ] = loadfx( "maps/zombie/fx_zmb_tranzit_god_ray_pwr_station" );
|
||||
level._effect[ "fx_zmb_tranzit_light_safety" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_safety" );
|
||||
level._effect[ "fx_zmb_tranzit_light_safety_off" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_safety_off" );
|
||||
level._effect[ "fx_zmb_tranzit_light_safety_max" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_safety_max" );
|
||||
level._effect[ "fx_zmb_tranzit_light_safety_ric" ] = loadfx( "maps/zombie/fx_zmb_tranzit_light_safety_ric" );
|
||||
level._effect[ "fx_zmb_tranzit_bridge_dest" ] = loadfx( "maps/zombie/fx_zmb_tranzit_bridge_dest" );
|
||||
level._effect[ "fx_zmb_tranzit_power_pulse" ] = loadfx( "maps/zombie/fx_zmb_tranzit_power_pulse" );
|
||||
level._effect[ "fx_zmb_tranzit_power_on" ] = loadfx( "maps/zombie/fx_zmb_tranzit_power_on" );
|
||||
level._effect[ "fx_zmb_tranzit_power_rising" ] = loadfx( "maps/zombie/fx_zmb_tranzit_power_rising" );
|
||||
level._effect[ "fx_zmb_avog_storm" ] = loadfx( "maps/zombie/fx_zmb_avog_storm" );
|
||||
level._effect[ "fx_zmb_avog_storm_low" ] = loadfx( "maps/zombie/fx_zmb_avog_storm_low" );
|
||||
level._effect[ "glass_impact" ] = loadfx( "maps/zombie/fx_zmb_tranzit_window_dest_lg" );
|
||||
level._effect[ "fx_zmb_tranzit_spark_blue_lg_os" ] = loadfx( "maps/zombie/fx_zmb_tranzit_spark_blue_lg_os" );
|
||||
level._effect[ "spawn_cloud" ] = loadfx( "maps/zombie/fx_zmb_race_zombie_spawn_cloud" );
|
||||
}
|
21
zm_transit_patch/maps/mp/zm_transit_gamemodes.gsc
Normal file
21
zm_transit_patch/maps/mp/zm_transit_gamemodes.gsc
Normal file
@ -0,0 +1,21 @@
|
||||
#include maps/mp/zm_transit;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#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( "zclassic", ::maps/mp/zm_transit::zclassic_preinit, undefined, undefined );
|
||||
add_map_gamemode( "zgrief", ::maps/mp/zm_transit::zgrief_preinit, undefined, undefined );
|
||||
add_map_gamemode( "zstandard", ::maps/mp/zm_transit::zstandard_preinit, undefined, undefined );
|
||||
add_map_location_gamemode( "zclassic", "transit", ::maps/mp/zm_transit_classic::precache, ::maps/mp/zm_transit_classic::main );
|
||||
add_map_location_gamemode( "zstandard", "transit", ::maps/mp/zm_transit_standard_station::precache, ::maps/mp/zm_transit_standard_station::main );
|
||||
add_map_location_gamemode( "zstandard", "farm", ::maps/mp/zm_transit_standard_farm::precache, ::maps/mp/zm_transit_standard_farm::main );
|
||||
add_map_location_gamemode( "zstandard", "town", ::maps/mp/zm_transit_standard_town::precache, ::maps/mp/zm_transit_standard_town::main );
|
||||
add_map_location_gamemode( "zgrief", "transit", ::maps/mp/zm_transit_grief_station::precache, ::maps/mp/zm_transit_grief_station::main );
|
||||
add_map_location_gamemode( "zgrief", "farm", ::maps/mp/zm_transit_grief_farm::precache, ::maps/mp/zm_transit_grief_farm::main );
|
||||
add_map_location_gamemode( "zgrief", "town", ::maps/mp/zm_transit_grief_town::precache, ::maps/mp/zm_transit_grief_town::main );
|
||||
}
|
98
zm_transit_patch/maps/mp/zm_transit_grief_farm.gsc
Normal file
98
zm_transit_patch/maps/mp/zm_transit_grief_farm.gsc
Normal file
@ -0,0 +1,98 @@
|
||||
#include maps/mp/gametypes_zm/zmeat;
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
precache()
|
||||
{
|
||||
}
|
||||
|
||||
farm_treasure_chest_init()
|
||||
{
|
||||
chest1 = getstruct( "farm_chest", "script_noteworthy" );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = chest1;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "farm_chest" );
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "farm" );
|
||||
init_standard_farm();
|
||||
farm_treasure_chest_init();
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
level thread maps/mp/zombies/_zm_zonemgr::enable_zone( "zone_far_ext" );
|
||||
level thread maps/mp/zombies/_zm_zonemgr::enable_zone( "zone_brn" );
|
||||
maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors();
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 1;
|
||||
level notify( "revive_on" );
|
||||
wait_network_frame();
|
||||
level notify( "doubletap_on" );
|
||||
wait_network_frame();
|
||||
level notify( "juggernog_on" );
|
||||
wait_network_frame();
|
||||
level notify( "sleight_on" );
|
||||
wait_network_frame();
|
||||
/#
|
||||
level thread maps/mp/gametypes_zm/zmeat::spawn_level_meat_manager();
|
||||
#/
|
||||
}
|
||||
|
||||
init_standard_farm()
|
||||
{
|
||||
maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index );
|
||||
ents = getentarray();
|
||||
_a81 = ents;
|
||||
_k81 = getFirstArrayKey( _a81 );
|
||||
while ( isDefined( _k81 ) )
|
||||
{
|
||||
ent = _a81[ _k81 ];
|
||||
if ( isDefined( ent.script_flag ) && ent.script_flag == "OnFarm_enter" )
|
||||
{
|
||||
ent delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( ent.script_parameters ) )
|
||||
{
|
||||
tokens = strtok( ent.script_parameters, " " );
|
||||
remove = 0;
|
||||
_a92 = tokens;
|
||||
_k92 = getFirstArrayKey( _a92 );
|
||||
while ( isDefined( _k92 ) )
|
||||
{
|
||||
token = _a92[ _k92 ];
|
||||
if ( token == "standard_remove" )
|
||||
{
|
||||
remove = 1;
|
||||
}
|
||||
_k92 = getNextArrayKey( _a92, _k92 );
|
||||
}
|
||||
if ( remove )
|
||||
{
|
||||
ent delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
_k81 = getNextArrayKey( _a81, _k81 );
|
||||
}
|
||||
}
|
||||
|
||||
enemy_location_override( zombie, enemy )
|
||||
{
|
||||
location = enemy.origin;
|
||||
if ( is_true( self.reroute ) )
|
||||
{
|
||||
if ( isDefined( self.reroute_origin ) )
|
||||
{
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
}
|
||||
return location;
|
||||
}
|
59
zm_transit_patch/maps/mp/zm_transit_grief_station.gsc
Normal file
59
zm_transit_patch/maps/mp/zm_transit_grief_station.gsc
Normal file
@ -0,0 +1,59 @@
|
||||
#include maps/mp/gametypes_zm/zmeat;
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "zm_collision_transit_busdepot_survival" );
|
||||
}
|
||||
|
||||
station_treasure_chest_init()
|
||||
{
|
||||
chest1 = getstruct( "depot_chest", "script_noteworthy" );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = chest1;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "depot_chest" );
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "station" );
|
||||
station_treasure_chest_init();
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
collision = spawn( "script_model", ( -6896, 4744, 0 ), 1 );
|
||||
collision setmodel( "zm_collision_transit_busdepot_survival" );
|
||||
collision disconnectpaths();
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
nodes = getnodearray( "classic_only_traversal", "targetname" );
|
||||
_a44 = nodes;
|
||||
_k44 = getFirstArrayKey( _a44 );
|
||||
while ( isDefined( _k44 ) )
|
||||
{
|
||||
node = _a44[ _k44 ];
|
||||
unlink_nodes( node, getnode( node.target, "targetname" ) );
|
||||
_k44 = getNextArrayKey( _a44, _k44 );
|
||||
}
|
||||
level thread maps/mp/zombies/_zm_perks::perk_machine_removal( "specialty_quickrevive", "p_glo_tools_chest_tall" );
|
||||
maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors();
|
||||
/#
|
||||
level thread maps/mp/gametypes_zm/zmeat::spawn_level_meat_manager();
|
||||
#/
|
||||
}
|
||||
|
||||
enemy_location_override( zombie, enemy )
|
||||
{
|
||||
location = enemy.origin;
|
||||
if ( is_true( self.reroute ) )
|
||||
{
|
||||
if ( isDefined( self.reroute_origin ) )
|
||||
{
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
}
|
||||
return location;
|
||||
}
|
66
zm_transit_patch/maps/mp/zm_transit_grief_town.gsc
Normal file
66
zm_transit_patch/maps/mp/zm_transit_grief_town.gsc
Normal file
@ -0,0 +1,66 @@
|
||||
#include maps/mp/gametypes_zm/zmeat;
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_race_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "zm_collision_transit_town_survival" );
|
||||
}
|
||||
|
||||
town_treasure_chest_init()
|
||||
{
|
||||
chest1 = getstruct( "town_chest", "script_noteworthy" );
|
||||
chest2 = getstruct( "town_chest_2", "script_noteworthy" );
|
||||
setdvar( "disable_rope", 1 );
|
||||
setdvar( "disableLookAtEntityLogic", 1 );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = chest1;
|
||||
level.chests[ level.chests.size ] = chest2;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "town_chest" );
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "town" );
|
||||
town_treasure_chest_init();
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
collision = spawn( "script_model", ( 1363, 471, 0 ), 1 );
|
||||
collision setmodel( "zm_collision_transit_town_survival" );
|
||||
collision disconnectpaths();
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors();
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 1;
|
||||
level notify( "revive_on" );
|
||||
wait_network_frame();
|
||||
level notify( "doubletap_on" );
|
||||
wait_network_frame();
|
||||
level notify( "marathon_on" );
|
||||
wait_network_frame();
|
||||
level notify( "juggernog_on" );
|
||||
wait_network_frame();
|
||||
level notify( "sleight_on" );
|
||||
wait_network_frame();
|
||||
level notify( "Pack_A_Punch_on" );
|
||||
/#
|
||||
level thread maps/mp/gametypes_zm/zmeat::spawn_level_meat_manager();
|
||||
#/
|
||||
}
|
||||
|
||||
enemy_location_override( zombie, enemy )
|
||||
{
|
||||
location = enemy.origin;
|
||||
if ( is_true( self.reroute ) )
|
||||
{
|
||||
if ( isDefined( self.reroute_origin ) )
|
||||
{
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
}
|
||||
return location;
|
||||
}
|
384
zm_transit_patch/maps/mp/zm_transit_lava.gsc
Normal file
384
zm_transit_patch/maps/mp/zm_transit_lava.gsc
Normal file
@ -0,0 +1,384 @@
|
||||
#include maps/mp/animscripts/zm_death;
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
object_touching_lava()
|
||||
{
|
||||
if ( !isDefined( level.lava ) )
|
||||
{
|
||||
level.lava = getentarray( "lava_damage", "targetname" );
|
||||
}
|
||||
if ( !isDefined( level.lava ) || level.lava.size < 1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.lasttouching ) && self istouching( self.lasttouching ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.lava.size )
|
||||
{
|
||||
if ( distancesquared( self.origin, level.lava[ i ].origin ) < 2250000 )
|
||||
{
|
||||
if ( isDefined( level.lava[ i ].target ) )
|
||||
{
|
||||
if ( self istouching( level.lava[ i ].volume ) )
|
||||
{
|
||||
if ( isDefined( level.lava[ i ].script_float ) && level.lava[ i ].script_float <= 0,1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.lasttouching = level.lava[ i ].volume;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self istouching( level.lava[ i ] ) )
|
||||
{
|
||||
self.lasttouching = level.lava[ i ];
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self.lasttouching = undefined;
|
||||
return 0;
|
||||
}
|
||||
|
||||
lava_damage_init()
|
||||
{
|
||||
lava = getentarray( "lava_damage", "targetname" );
|
||||
if ( !isDefined( lava ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
array_thread( lava, ::lava_damage_think );
|
||||
}
|
||||
|
||||
lava_damage_think()
|
||||
{
|
||||
self._trap_type = "";
|
||||
if ( isDefined( self.script_noteworthy ) )
|
||||
{
|
||||
self._trap_type = self.script_noteworthy;
|
||||
}
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
self.volume = getent( self.target, "targetname" );
|
||||
/#
|
||||
assert( isDefined( self.volume ), "No volume found for lava target " + self.target );
|
||||
#/
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", ent );
|
||||
if ( isDefined( ent.ignore_lava_damage ) && ent.ignore_lava_damage )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( isDefined( ent.is_burning ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( self.target ) && !ent istouching( self.volume ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isplayer( ent ) )
|
||||
{
|
||||
switch( self._trap_type )
|
||||
{
|
||||
case "fire":
|
||||
default:
|
||||
if ( !isDefined( self.script_float ) || self.script_float >= 0,1 )
|
||||
{
|
||||
ent thread player_lava_damage( self );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( ent.marked_for_death ) )
|
||||
{
|
||||
switch( self._trap_type )
|
||||
{
|
||||
case "fire":
|
||||
default:
|
||||
if ( !isDefined( self.script_float ) || self.script_float >= 0,1 )
|
||||
{
|
||||
ent thread zombie_lava_damage( self );
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player_lava_damage( trig )
|
||||
{
|
||||
self endon( "zombified" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
max_dmg = 15;
|
||||
min_dmg = 5;
|
||||
burn_time = 1;
|
||||
if ( isDefined( self.is_zombie ) && self.is_zombie )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self thread player_stop_burning();
|
||||
if ( isDefined( trig.script_float ) )
|
||||
{
|
||||
max_dmg *= trig.script_float;
|
||||
min_dmg *= trig.script_float;
|
||||
burn_time *= trig.script_float;
|
||||
if ( burn_time >= 1,5 )
|
||||
{
|
||||
burn_time = 1,5;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( self.is_burning ) && is_player_valid( self ) )
|
||||
{
|
||||
self.is_burning = 1;
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, burn_time, level.zm_transit_burn_max_duration );
|
||||
self notify( "burned" );
|
||||
if ( isDefined( trig.script_float ) && trig.script_float >= 0,1 )
|
||||
{
|
||||
self thread player_burning_fx();
|
||||
}
|
||||
if ( !self hasperk( "specialty_armorvest" ) || ( self.health - 100 ) < 1 )
|
||||
{
|
||||
radiusdamage( self.origin, 10, max_dmg, min_dmg );
|
||||
wait 0,5;
|
||||
self.is_burning = undefined;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self hasperk( "specialty_armorvest" ) )
|
||||
{
|
||||
self dodamage( 15, self.origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( 1, self.origin );
|
||||
}
|
||||
wait 0,5;
|
||||
self.is_burning = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player_stop_burning()
|
||||
{
|
||||
self notify( "player_stop_burning" );
|
||||
self endon( "player_stop_burning" );
|
||||
self endon( "death_or_disconnect" );
|
||||
self waittill( "zombified" );
|
||||
self notify( "stop_flame_damage" );
|
||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
|
||||
}
|
||||
|
||||
zombie_burning_fx()
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.is_on_fire = 1;
|
||||
self thread maps/mp/animscripts/zm_death::on_fire_timeout();
|
||||
if ( isDefined( level._effect ) && isDefined( level._effect[ "lava_burning" ] ) )
|
||||
{
|
||||
if ( !self.isdog )
|
||||
{
|
||||
playfxontag( level._effect[ "lava_burning" ], self, "J_SpineLower" );
|
||||
self thread zombie_burning_audio();
|
||||
}
|
||||
}
|
||||
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) )
|
||||
{
|
||||
wait 1;
|
||||
if ( randomint( 2 ) > 1 )
|
||||
{
|
||||
tagarray = [];
|
||||
tagarray[ 0 ] = "J_Elbow_LE";
|
||||
tagarray[ 1 ] = "J_Elbow_RI";
|
||||
tagarray[ 2 ] = "J_Knee_RI";
|
||||
tagarray[ 3 ] = "J_Knee_LE";
|
||||
tagarray = randomize_array( tagarray );
|
||||
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
tagarray[ 0 ] = "J_Wrist_RI";
|
||||
tagarray[ 1 ] = "J_Wrist_LE";
|
||||
if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" )
|
||||
{
|
||||
tagarray[ 2 ] = "J_Ankle_RI";
|
||||
tagarray[ 3 ] = "J_Ankle_LE";
|
||||
}
|
||||
tagarray = randomize_array( tagarray );
|
||||
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
zombie_burning_audio()
|
||||
{
|
||||
self playloopsound( "zmb_fire_loop" );
|
||||
self waittill_either( "stop_flame_damage", "death" );
|
||||
if ( isDefined( self ) && isalive( self ) )
|
||||
{
|
||||
self stoploopsound( 0,25 );
|
||||
}
|
||||
}
|
||||
|
||||
player_burning_fx()
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.no_burning_sfx ) && !self.no_burning_sfx )
|
||||
{
|
||||
self thread player_burning_audio();
|
||||
}
|
||||
self.is_on_fire = 1;
|
||||
self thread maps/mp/animscripts/zm_death::on_fire_timeout();
|
||||
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) )
|
||||
{
|
||||
playfxontag( level._effect[ "character_fire_death_sm" ], self, "J_SpineLower" );
|
||||
}
|
||||
}
|
||||
|
||||
player_burning_audio()
|
||||
{
|
||||
fire_ent = spawn( "script_model", self.origin );
|
||||
wait_network_frame();
|
||||
fire_ent linkto( self );
|
||||
fire_ent playloopsound( "evt_plr_fire_loop" );
|
||||
self waittill_any( "stop_flame_damage", "stop_flame_sounds", "death", "discoonect" );
|
||||
fire_ent delete();
|
||||
}
|
||||
|
||||
zombie_lava_damage( trap )
|
||||
{
|
||||
self endon( "death" );
|
||||
zombie_dmg = 1;
|
||||
if ( isDefined( self.script_float ) )
|
||||
{
|
||||
zombie_dmg *= self.script_float;
|
||||
}
|
||||
switch( trap._trap_type )
|
||||
{
|
||||
case "fire":
|
||||
default:
|
||||
if ( isDefined( self.animname ) || !isDefined( self.is_on_fire ) && !self.is_on_fire )
|
||||
{
|
||||
if ( level.burning_zombies.size < 6 && zombie_dmg >= 1 )
|
||||
{
|
||||
level.burning_zombies[ level.burning_zombies.size ] = self;
|
||||
self playsound( "ignite" );
|
||||
self thread zombie_burning_fx();
|
||||
self thread zombie_burning_watch();
|
||||
self thread zombie_burning_dmg();
|
||||
self thread zombie_exploding_death( zombie_dmg, trap );
|
||||
wait randomfloat( 1,25 );
|
||||
}
|
||||
}
|
||||
if ( self.health > ( level.zombie_health / 2 ) && self.health > zombie_dmg )
|
||||
{
|
||||
self dodamage( zombie_dmg, self.origin, trap );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
zombie_burning_watch()
|
||||
{
|
||||
self waittill_any( "stop_flame_damage", "death" );
|
||||
arrayremovevalue( level.burning_zombies, self );
|
||||
}
|
||||
|
||||
zombie_exploding_death( zombie_dmg, trap )
|
||||
{
|
||||
self endon( "stop_flame_damage" );
|
||||
if ( isDefined( self.isdog ) && self.isdog && isDefined( self.a.nodeath ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( isDefined( self ) && self.health >= zombie_dmg && isDefined( self.is_on_fire ) && self.is_on_fire )
|
||||
{
|
||||
wait 0,5;
|
||||
}
|
||||
if ( isDefined( self ) && isDefined( self.is_on_fire ) && self.is_on_fire && isDefined( self.damageweapon ) && self.damageweapon != "tazer_knuckles_zm" || self.damageweapon == "jetgun_zm" && isDefined( self.knuckles_extinguish_flames ) && self.knuckles_extinguish_flames )
|
||||
{
|
||||
return;
|
||||
}
|
||||
tag = "J_SpineLower";
|
||||
if ( isDefined( self.animname ) && self.animname == "zombie_dog" )
|
||||
{
|
||||
tag = "tag_origin";
|
||||
}
|
||||
if ( is_mature() )
|
||||
{
|
||||
if ( isDefined( level._effect[ "zomb_gib" ] ) )
|
||||
{
|
||||
playfx( level._effect[ "zomb_gib" ], self gettagorigin( tag ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level._effect[ "spawn_cloud" ] ) )
|
||||
{
|
||||
playfx( level._effect[ "spawn_cloud" ], self gettagorigin( tag ) );
|
||||
}
|
||||
}
|
||||
self radiusdamage( self.origin, 128, 30, 15, undefined, "MOD_EXPLOSIVE" );
|
||||
self ghost();
|
||||
if ( isDefined( self.isdog ) && self.isdog )
|
||||
{
|
||||
self hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
self delay_thread( 1, ::self_delete );
|
||||
}
|
||||
}
|
||||
|
||||
zombie_burning_dmg()
|
||||
{
|
||||
self endon( "death" );
|
||||
damageradius = 25;
|
||||
damage = 2;
|
||||
while ( isDefined( self.is_on_fire ) && self.is_on_fire )
|
||||
{
|
||||
eyeorigin = self geteye();
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( is_player_valid( players[ i ] ) )
|
||||
{
|
||||
playereye = players[ i ] geteye();
|
||||
if ( distancesquared( eyeorigin, playereye ) < ( damageradius * damageradius ) )
|
||||
{
|
||||
players[ i ] dodamage( damage, self.origin, self );
|
||||
players[ i ] notify( "burned" );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
2500
zm_transit_patch/maps/mp/zm_transit_openings.gsc
Normal file
2500
zm_transit_patch/maps/mp/zm_transit_openings.gsc
Normal file
File diff suppressed because it is too large
Load Diff
583
zm_transit_patch/maps/mp/zm_transit_power.gsc
Normal file
583
zm_transit_patch/maps/mp/zm_transit_power.gsc
Normal file
@ -0,0 +1,583 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
initializepower()
|
||||
{
|
||||
level thread electricswitch();
|
||||
level thread powerevent();
|
||||
registerclientfield( "toplayer", "power_rumble", 1, 1, "int" );
|
||||
if ( !isDefined( level.vsmgr_prio_visionset_zm_transit_power_high_low ) )
|
||||
{
|
||||
level.vsmgr_prio_visionset_zm_transit_power_high_low = 20;
|
||||
}
|
||||
maps/mp/_visionset_mgr::vsmgr_register_info( "visionset", "zm_power_high_low", 1, level.vsmgr_prio_visionset_zm_transit_power_high_low, 7, 1, ::vsmgr_lerp_power_up_down, 0 );
|
||||
}
|
||||
|
||||
precache_models()
|
||||
{
|
||||
}
|
||||
|
||||
elecswitchbuildable()
|
||||
{
|
||||
lever = getent( "powerswitch_p6_zm_buildable_pswitch_lever", "targetname" );
|
||||
hand = getent( "powerswitch_p6_zm_buildable_pswitch_hand", "targetname" );
|
||||
hand linkto( lever );
|
||||
hand hide();
|
||||
getent( "powerswitch_p6_zm_buildable_pswitch_body", "targetname" ) hide();
|
||||
lever hide();
|
||||
wait_for_buildable( "powerswitch" );
|
||||
}
|
||||
|
||||
electricswitch()
|
||||
{
|
||||
flag_init( "switches_on" );
|
||||
level thread wait_for_power();
|
||||
trig = getent( "powerswitch_buildable_trigger_power", "targetname" );
|
||||
trig setinvisibletoall();
|
||||
elecswitchbuildable();
|
||||
master_switch = getent( "powerswitch_p6_zm_buildable_pswitch_lever", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH" );
|
||||
trig setvisibletoall();
|
||||
trig waittill( "trigger", user );
|
||||
trig setinvisibletoall();
|
||||
master_switch rotateroll( -90, 0,3 );
|
||||
master_switch playsound( "zmb_switch_flip" );
|
||||
master_switch waittill( "rotatedone" );
|
||||
playfx( level._effect[ "switch_sparks" ], getstruct( "elec_switch_fx", "targetname" ).origin );
|
||||
master_switch playsound( "zmb_turn_on" );
|
||||
level.power_event_in_progress = 1;
|
||||
level thread power_event_rumble_and_quake();
|
||||
flag_set( "switches_on" );
|
||||
clientnotify( "pwr" );
|
||||
level thread avogadro_show_vox( user );
|
||||
level waittill( "power_event_complete" );
|
||||
clientnotify( "pwr" );
|
||||
flag_set( "power_on" );
|
||||
level.power_event_in_progress = 0;
|
||||
level thread bus_station_pa_vox();
|
||||
if ( isDefined( user ) )
|
||||
{
|
||||
user maps/mp/zombies/_zm_stats::increment_client_stat( "power_turnedon", 0 );
|
||||
user maps/mp/zombies/_zm_stats::increment_player_stat( "power_turnedon" );
|
||||
}
|
||||
trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH_OFF" );
|
||||
trig setvisibletoall();
|
||||
trig waittill( "trigger", user );
|
||||
trig setinvisibletoall();
|
||||
master_switch rotateroll( 90, 0,3 );
|
||||
master_switch playsound( "zmb_switch_flip" );
|
||||
master_switch waittill( "rotatedone" );
|
||||
level.power_event_in_progress = 1;
|
||||
level thread power_event_rumble_and_quake();
|
||||
flag_clear( "switches_on" );
|
||||
level waittill( "power_event_complete" );
|
||||
clientnotify( "pwo" );
|
||||
flag_clear( "power_on" );
|
||||
level.power_event_in_progress = 0;
|
||||
level.power_cycled = 1;
|
||||
if ( isDefined( user ) )
|
||||
{
|
||||
user maps/mp/zombies/_zm_stats::increment_client_stat( "power_turnedoff", 0 );
|
||||
user maps/mp/zombies/_zm_stats::increment_player_stat( "power_turnedoff" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vsmgr_lerp_power_up_down( player, opt_param_1, opt_param_2 )
|
||||
{
|
||||
self vsmgr_set_state_active( player, opt_param_1 );
|
||||
}
|
||||
|
||||
power_event_vision_set_post_event()
|
||||
{
|
||||
self endon( "end_vision_set_power" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
if ( flag( "power_on" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level waittill( "power_event_complete" );
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_power_high_low", self, 0 );
|
||||
}
|
||||
|
||||
power_event_vision_set()
|
||||
{
|
||||
self endon( "end_vision_set_power" );
|
||||
level endon( "end_game" );
|
||||
level endon( "power_event_complete" );
|
||||
self endon( "disconnect" );
|
||||
if ( flag( "power_on" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
duration = 2;
|
||||
startgoal = 1;
|
||||
endgoal = 0;
|
||||
self power_event_vision_set_lerp( duration, startgoal, endgoal );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( randomint( 100 ) > 50 )
|
||||
{
|
||||
duration = randomintrange( 2, 6 ) / 5;
|
||||
startgoal = endgoal;
|
||||
if ( startgoal > 0,6 )
|
||||
{
|
||||
endgoal = randomfloatrange( 0, 0,5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
endgoal = 1;
|
||||
}
|
||||
self power_event_vision_set_lerp( duration, startgoal, endgoal );
|
||||
}
|
||||
else if ( randomint( 100 ) > 75 )
|
||||
{
|
||||
x = 2;
|
||||
while ( x > 0 )
|
||||
{
|
||||
duration = 0,2;
|
||||
startgoal = endgoal;
|
||||
if ( startgoal > 0,6 )
|
||||
{
|
||||
endgoal = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
endgoal = 1;
|
||||
}
|
||||
self power_event_vision_set_lerp( duration, startgoal, endgoal );
|
||||
x--;
|
||||
|
||||
}
|
||||
}
|
||||
else duration = 0,4;
|
||||
startgoal = endgoal;
|
||||
if ( startgoal > 0,6 )
|
||||
{
|
||||
endgoal = randomfloatrange( 0, 0,5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
endgoal = randomfloatrange( 0,5, 1 );
|
||||
}
|
||||
self power_event_vision_set_lerp( duration, startgoal, endgoal );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
power_event_vision_set_lerp( duration, startgoal, endgoal )
|
||||
{
|
||||
self endon( "end_vision_set_power" );
|
||||
level endon( "end_game" );
|
||||
level endon( "power_event_complete" );
|
||||
self endon( "disconnect" );
|
||||
incs = int( duration / 0,05 );
|
||||
if ( incs == 0 )
|
||||
{
|
||||
incs = 1;
|
||||
}
|
||||
incsgoal = ( endgoal - startgoal ) / incs;
|
||||
currentgoal = startgoal;
|
||||
i = 0;
|
||||
while ( i < incs )
|
||||
{
|
||||
currentgoal += incsgoal;
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_power_high_low", self, currentgoal );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_power_high_low", self, endgoal );
|
||||
}
|
||||
|
||||
power_event_rumble_and_quake( power_on )
|
||||
{
|
||||
level endon( "end_game" );
|
||||
while ( isDefined( level.power_event_in_progress ) && level.power_event_in_progress )
|
||||
{
|
||||
players = get_players();
|
||||
_a284 = players;
|
||||
_k284 = getFirstArrayKey( _a284 );
|
||||
while ( isDefined( _k284 ) )
|
||||
{
|
||||
player = _a284[ _k284 ];
|
||||
if ( !is_player_valid( player ) )
|
||||
{
|
||||
}
|
||||
else if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) || player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_pcr", 1 ) )
|
||||
{
|
||||
if ( isDefined( player.power_rumble_active ) && !player.power_rumble_active )
|
||||
{
|
||||
player thread power_event_rumble_and_quake_player();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( player.power_rumble_active ) && player.power_rumble_active )
|
||||
{
|
||||
player setclientfieldtoplayer( "power_rumble", 0 );
|
||||
player.power_rumble_active = 0;
|
||||
}
|
||||
}
|
||||
_k284 = getNextArrayKey( _a284, _k284 );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
players = get_players();
|
||||
_a311 = players;
|
||||
_k311 = getFirstArrayKey( _a311 );
|
||||
while ( isDefined( _k311 ) )
|
||||
{
|
||||
player = _a311[ _k311 ];
|
||||
player setclientfieldtoplayer( "power_rumble", 0 );
|
||||
player notify( "end_vision_set_power" );
|
||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_power_high_low", player );
|
||||
_k311 = getNextArrayKey( _a311, _k311 );
|
||||
}
|
||||
}
|
||||
|
||||
power_event_rumble_and_quake_player()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.power_rumble_active = 1;
|
||||
self setclientfieldtoplayer( "power_rumble", 1 );
|
||||
self thread power_event_vision_set();
|
||||
self thread power_event_vision_set_post_event();
|
||||
while ( !self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) && self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_pcr", 1 ) && isDefined( level.power_event_in_progress ) && level.power_event_in_progress )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
self.power_rumble_active = 0;
|
||||
self notify( "end_vision_set_power" );
|
||||
self setclientfieldtoplayer( "power_rumble", 0 );
|
||||
}
|
||||
|
||||
avogadroreleasefromchamberevent()
|
||||
{
|
||||
exploder( 500 );
|
||||
level.zones[ "zone_prr" ].is_spawning_allowed = 0;
|
||||
level.zones[ "zone_pcr" ].is_spawning_allowed = 0;
|
||||
level thread killzombiesinpowerstation();
|
||||
while ( !flag( "power_on" ) )
|
||||
{
|
||||
waittime = randomfloatrange( 1,5, 4,5 );
|
||||
players = get_players();
|
||||
_a354 = players;
|
||||
_k354 = getFirstArrayKey( _a354 );
|
||||
while ( isDefined( _k354 ) )
|
||||
{
|
||||
player = _a354[ _k354 ];
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) )
|
||||
{
|
||||
player setelectrified( waittime - 1 );
|
||||
player shellshock( "electrocution", waittime );
|
||||
wait 0,05;
|
||||
}
|
||||
_k354 = getNextArrayKey( _a354, _k354 );
|
||||
}
|
||||
waittime += 1,5;
|
||||
level waittill_notify_or_timeout( "power_on", waittime );
|
||||
}
|
||||
players = get_players();
|
||||
_a372 = players;
|
||||
_k372 = getFirstArrayKey( _a372 );
|
||||
while ( isDefined( _k372 ) )
|
||||
{
|
||||
player = _a372[ _k372 ];
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) )
|
||||
{
|
||||
player setelectrified( 0,25 );
|
||||
player shellshock( "electrocution", 1,5 );
|
||||
wait 0,05;
|
||||
}
|
||||
_k372 = getNextArrayKey( _a372, _k372 );
|
||||
}
|
||||
level.zones[ "zone_prr" ].is_spawning_allowed = 1;
|
||||
level.zones[ "zone_pcr" ].is_spawning_allowed = 1;
|
||||
stop_exploder( 500 );
|
||||
}
|
||||
|
||||
killzombiesinpowerstation()
|
||||
{
|
||||
level endon( "power_on" );
|
||||
radiussq = 122500;
|
||||
while ( 1 )
|
||||
{
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
_a401 = zombies;
|
||||
_k401 = getFirstArrayKey( _a401 );
|
||||
while ( isDefined( _k401 ) )
|
||||
{
|
||||
zombie = _a401[ _k401 ];
|
||||
if ( !isDefined( zombie ) )
|
||||
{
|
||||
}
|
||||
else if ( isDefined( zombie.is_avogadro ) && zombie.is_avogadro )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( distancesquared( ( 11344, 7590, -729 ), zombie.origin ) < radiussq )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( zombie ) || zombie maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) && isDefined( zombie.zone_name ) && zombie.zone_name == "zone_prr" )
|
||||
{
|
||||
if ( isDefined( zombie.has_been_damaged_by_player ) && !zombie.has_been_damaged_by_player )
|
||||
{
|
||||
level.zombie_total++;
|
||||
}
|
||||
zombie dodamage( zombie.health + 100, zombie.origin );
|
||||
wait randomfloatrange( 0,05, 0,15 );
|
||||
}
|
||||
}
|
||||
}
|
||||
_k401 = getNextArrayKey( _a401, _k401 );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
wait_for_power()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
flag_wait( "power_on" );
|
||||
maps/mp/zombies/_zm_perks::perk_unpause_all_perks();
|
||||
wait_network_frame();
|
||||
level setclientfield( "zombie_power_on", 1 );
|
||||
enable_morse_code();
|
||||
raisepowerplantgates();
|
||||
flag_waitopen( "power_on" );
|
||||
level setclientfield( "zombie_power_on", 0 );
|
||||
disable_morse_code();
|
||||
}
|
||||
}
|
||||
|
||||
raisepowerplantgates()
|
||||
{
|
||||
gate1 = [];
|
||||
gate2 = [];
|
||||
gate1 = getentarray( "security_booth_gate", "targetname" );
|
||||
gate2 = getentarray( "security_booth_gate_2", "targetname" );
|
||||
while ( isDefined( gate1 ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < gate1.size )
|
||||
{
|
||||
gate1[ i ] thread raisegate( -90 );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
while ( isDefined( gate2 ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < gate2.size )
|
||||
{
|
||||
gate2[ i ] thread raisegate( 90 );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
level.the_bus notify( "OnPowerOn" );
|
||||
}
|
||||
|
||||
raisegate( degrees )
|
||||
{
|
||||
self rotatepitch( degrees, 4 );
|
||||
}
|
||||
|
||||
powerevent()
|
||||
{
|
||||
reactor_core_mover = getent( "core_mover", "targetname" );
|
||||
reactor_core_audio = spawn( "script_origin", reactor_core_mover.origin );
|
||||
if ( !isDefined( reactor_core_mover ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
thread blockstairs();
|
||||
thread linkentitiestocoremover( reactor_core_mover );
|
||||
while ( 1 )
|
||||
{
|
||||
flag_wait( "switches_on" );
|
||||
thread dropreactordoors();
|
||||
thread raisereactordoors();
|
||||
power_event_time = 30;
|
||||
reactor_core_mover playsound( "zmb_power_rise_start" );
|
||||
reactor_core_mover playloopsound( "zmb_power_rise_loop", 0,75 );
|
||||
reactor_core_mover thread coremove( power_event_time );
|
||||
if ( isDefined( level.avogadro ) && isDefined( level.avogadro.state ) && level.avogadro.state == "chamber" )
|
||||
{
|
||||
level thread avogadroreleasefromchamberevent();
|
||||
}
|
||||
wait power_event_time;
|
||||
reactor_core_mover stoploopsound( 0,5 );
|
||||
reactor_core_audio playloopsound( "zmb_power_on_loop", 2 );
|
||||
reactor_core_mover playsound( "zmb_power_rise_stop" );
|
||||
level notify( "power_event_complete" );
|
||||
flag_waitopen( "switches_on" );
|
||||
thread dropreactordoors();
|
||||
thread raisereactordoors();
|
||||
playsoundatposition( "zmb_power_off_quad", ( 0, 0, 0 ) );
|
||||
reactor_core_mover playsound( "zmb_power_rise_start" );
|
||||
reactor_core_mover playloopsound( "zmb_power_rise_loop", 0,75 );
|
||||
reactor_core_mover thread coremove( power_event_time, 1 );
|
||||
wait power_event_time;
|
||||
reactor_core_mover stoploopsound( 0,5 );
|
||||
reactor_core_audio stoploopsound( 0,5 );
|
||||
reactor_core_mover playsound( "zmb_power_rise_stop" );
|
||||
level notify( "power_event_complete" );
|
||||
}
|
||||
}
|
||||
|
||||
corerotate( time )
|
||||
{
|
||||
self rotateyaw( 180, time );
|
||||
}
|
||||
|
||||
coremove( time, down )
|
||||
{
|
||||
if ( isDefined( down ) && down )
|
||||
{
|
||||
self movez( -160, time );
|
||||
}
|
||||
else
|
||||
{
|
||||
self movez( 160, time );
|
||||
}
|
||||
}
|
||||
|
||||
blockstairs()
|
||||
{
|
||||
stairs_blocker = getent( "reactor_core_stairs_blocker", "targetname" );
|
||||
if ( !isDefined( stairs_blocker ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
stairs_blocker movez( -128, 1 );
|
||||
}
|
||||
|
||||
linkentitiestocoremover( reactor_core_mover )
|
||||
{
|
||||
core_entities = getentarray( "core_entity", "script_noteworthy" );
|
||||
i = 0;
|
||||
while ( i < core_entities.size )
|
||||
{
|
||||
next_ent = core_entities[ i ];
|
||||
if ( next_ent.classname == "trigger_use_touch" )
|
||||
{
|
||||
next_ent enablelinkto();
|
||||
}
|
||||
next_ent linkto( reactor_core_mover, "tag_origin" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dropreactordoors()
|
||||
{
|
||||
doors = getentarray( "reactor_core_door", "targetname" );
|
||||
if ( doors.size == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < doors.size )
|
||||
{
|
||||
next_door = doors[ i ];
|
||||
next_door movez( -128, 1 );
|
||||
next_door disconnectpaths();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
raisereactordoors()
|
||||
{
|
||||
level waittill( "power_event_complete" );
|
||||
doors = getentarray( "reactor_core_door", "targetname" );
|
||||
if ( doors.size == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < doors.size )
|
||||
{
|
||||
next_door = doors[ i ];
|
||||
next_door movez( 128, 1 );
|
||||
next_door connectpaths();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
avogadro_show_vox( user )
|
||||
{
|
||||
wait 1;
|
||||
if ( isDefined( user ) )
|
||||
{
|
||||
user thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "power", "power_on" );
|
||||
}
|
||||
wait 8;
|
||||
players = get_players();
|
||||
players = array_randomize( players );
|
||||
_a655 = players;
|
||||
_k655 = getFirstArrayKey( _a655 );
|
||||
while ( isDefined( _k655 ) )
|
||||
{
|
||||
player = _a655[ _k655 ];
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) || player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_pcr", 1 ) )
|
||||
{
|
||||
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "power", "power_core" );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
_k655 = getNextArrayKey( _a655, _k655 );
|
||||
}
|
||||
}
|
||||
wait 15;
|
||||
players = get_players();
|
||||
players = array_randomize( players );
|
||||
_a668 = players;
|
||||
_k668 = getFirstArrayKey( _a668 );
|
||||
while ( isDefined( _k668 ) )
|
||||
{
|
||||
player = _a668[ _k668 ];
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr", 1 ) || player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_pcr", 1 ) )
|
||||
{
|
||||
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "avogadro_reveal" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
_k668 = getNextArrayKey( _a668, _k668 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bus_station_pa_vox()
|
||||
{
|
||||
level endon( "power_off" );
|
||||
while ( 1 )
|
||||
{
|
||||
level.station_pa_vox = array_randomize( level.station_pa_vox );
|
||||
_a686 = level.station_pa_vox;
|
||||
_k686 = getFirstArrayKey( _a686 );
|
||||
while ( isDefined( _k686 ) )
|
||||
{
|
||||
line = _a686[ _k686 ];
|
||||
playsoundatposition( line, ( -6848, 5056, 56 ) );
|
||||
wait randomintrange( 12, 15 );
|
||||
_k686 = getNextArrayKey( _a686, _k686 );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
1600
zm_transit_patch/maps/mp/zm_transit_sq.gsc
Normal file
1600
zm_transit_patch/maps/mp/zm_transit_sq.gsc
Normal file
File diff suppressed because it is too large
Load Diff
95
zm_transit_patch/maps/mp/zm_transit_standard_farm.gsc
Normal file
95
zm_transit_patch/maps/mp/zm_transit_standard_farm.gsc
Normal file
@ -0,0 +1,95 @@
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_race_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
precache()
|
||||
{
|
||||
}
|
||||
|
||||
farm_treasure_chest_init()
|
||||
{
|
||||
chest1 = getstruct( "farm_chest", "script_noteworthy" );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = chest1;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "farm_chest" );
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "farm" );
|
||||
init_standard_farm();
|
||||
farm_treasure_chest_init();
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
level thread maps/mp/zombies/_zm_zonemgr::enable_zone( "zone_far_ext" );
|
||||
level thread maps/mp/zombies/_zm_zonemgr::enable_zone( "zone_brn" );
|
||||
maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors();
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 1;
|
||||
level notify( "revive_on" );
|
||||
wait_network_frame();
|
||||
level notify( "doubletap_on" );
|
||||
wait_network_frame();
|
||||
level notify( "juggernog_on" );
|
||||
wait_network_frame();
|
||||
level notify( "sleight_on" );
|
||||
wait_network_frame();
|
||||
}
|
||||
|
||||
init_standard_farm()
|
||||
{
|
||||
maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index );
|
||||
ents = getentarray();
|
||||
_a77 = ents;
|
||||
_k77 = getFirstArrayKey( _a77 );
|
||||
while ( isDefined( _k77 ) )
|
||||
{
|
||||
ent = _a77[ _k77 ];
|
||||
if ( isDefined( ent.script_flag ) && ent.script_flag == "OnFarm_enter" )
|
||||
{
|
||||
ent delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( ent.script_parameters ) )
|
||||
{
|
||||
tokens = strtok( ent.script_parameters, " " );
|
||||
remove = 0;
|
||||
_a88 = tokens;
|
||||
_k88 = getFirstArrayKey( _a88 );
|
||||
while ( isDefined( _k88 ) )
|
||||
{
|
||||
token = _a88[ _k88 ];
|
||||
if ( token == "standard_remove" )
|
||||
{
|
||||
remove = 1;
|
||||
}
|
||||
_k88 = getNextArrayKey( _a88, _k88 );
|
||||
}
|
||||
if ( remove )
|
||||
{
|
||||
ent delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
_k77 = getNextArrayKey( _a77, _k77 );
|
||||
}
|
||||
}
|
||||
|
||||
enemy_location_override( zombie, enemy )
|
||||
{
|
||||
location = enemy.origin;
|
||||
if ( is_true( self.reroute ) )
|
||||
{
|
||||
if ( isDefined( self.reroute_origin ) )
|
||||
{
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
}
|
||||
return location;
|
||||
}
|
64
zm_transit_patch/maps/mp/zm_transit_standard_town.gsc
Normal file
64
zm_transit_patch/maps/mp/zm_transit_standard_town.gsc
Normal file
@ -0,0 +1,64 @@
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/zm_transit_utility;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_race_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "zm_collision_transit_town_survival" );
|
||||
}
|
||||
|
||||
town_treasure_chest_init()
|
||||
{
|
||||
chest1 = getstruct( "town_chest", "script_noteworthy" );
|
||||
chest2 = getstruct( "town_chest_2", "script_noteworthy" );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = chest1;
|
||||
level.chests[ level.chests.size ] = chest2;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "town_chest" );
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "town" );
|
||||
town_treasure_chest_init();
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
collision = spawn( "script_model", ( 1363, 471, 0 ), 1 );
|
||||
collision setmodel( "zm_collision_transit_town_survival" );
|
||||
collision disconnectpaths();
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
level thread maps/mp/zm_transit_utility::solo_tombstone_removal();
|
||||
maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors();
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 1;
|
||||
level notify( "revive_on" );
|
||||
wait_network_frame();
|
||||
level notify( "doubletap_on" );
|
||||
wait_network_frame();
|
||||
level notify( "marathon_on" );
|
||||
wait_network_frame();
|
||||
level notify( "juggernog_on" );
|
||||
wait_network_frame();
|
||||
level notify( "sleight_on" );
|
||||
wait_network_frame();
|
||||
level notify( "tombstone_on" );
|
||||
wait_network_frame();
|
||||
level notify( "Pack_A_Punch_on" );
|
||||
}
|
||||
|
||||
enemy_location_override( zombie, enemy )
|
||||
{
|
||||
location = enemy.origin;
|
||||
if ( is_true( self.reroute ) )
|
||||
{
|
||||
if ( isDefined( self.reroute_origin ) )
|
||||
{
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
}
|
||||
return location;
|
||||
}
|
1600
zm_transit_patch/maps/mp/zombies/_zm_ai_avogadro.gsc
Normal file
1600
zm_transit_patch/maps/mp/zombies/_zm_ai_avogadro.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1254
zm_transit_patch/maps/mp/zombies/_zm_ai_screecher.gsc
Normal file
1254
zm_transit_patch/maps/mp/zombies/_zm_ai_screecher.gsc
Normal file
File diff suppressed because it is too large
Load Diff
326
zm_transit_patch/maps/mp/zombies/_zm_banking.gsc
Normal file
326
zm_transit_patch/maps/mp/zombies/_zm_banking.gsc
Normal file
@ -0,0 +1,326 @@
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm_powerups;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
onplayerconnect_callback( ::onplayerconnect_bank_deposit_box );
|
||||
if ( !isDefined( level.ta_vaultfee ) )
|
||||
{
|
||||
level.ta_vaultfee = 100;
|
||||
}
|
||||
if ( !isDefined( level.ta_tellerfee ) )
|
||||
{
|
||||
level.ta_tellerfee = 100;
|
||||
}
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
if ( !isDefined( level.banking_map ) )
|
||||
{
|
||||
level.banking_map = level.script;
|
||||
}
|
||||
level thread bank_teller_init();
|
||||
level thread bank_deposit_box();
|
||||
}
|
||||
|
||||
bank_teller_init()
|
||||
{
|
||||
level.bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
|
||||
if ( isDefined( level.bank_teller_dmg_trig ) )
|
||||
{
|
||||
level.bank_teller_transfer_trig = getent( level.bank_teller_dmg_trig.target, "targetname" );
|
||||
level.bank_teller_powerup_spot = getstruct( level.bank_teller_transfer_trig.target, "targetname" );
|
||||
level thread bank_teller_logic();
|
||||
level.bank_teller_transfer_trig.origin += vectorScale( ( 0, 0, -1 ), 25 );
|
||||
level.bank_teller_transfer_trig trigger_off();
|
||||
level.bank_teller_transfer_trig sethintstring( &"ZOMBIE_TELLER_GIVE_MONEY", level.ta_tellerfee );
|
||||
}
|
||||
}
|
||||
|
||||
bank_teller_logic()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
while ( 1 )
|
||||
{
|
||||
level.bank_teller_dmg_trig waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, blah );
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) && damage == 1500 && type == "MOD_MELEE" )
|
||||
{
|
||||
bank_teller_give_money();
|
||||
level.bank_teller_transfer_trig trigger_off();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bank_teller_give_money()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level endon( "stop_bank_teller" );
|
||||
level.bank_teller_transfer_trig trigger_on();
|
||||
bank_transfer = undefined;
|
||||
while ( 1 )
|
||||
{
|
||||
level.bank_teller_transfer_trig waittill( "trigger", player );
|
||||
if ( !is_player_valid( player, 0 ) || player.score < ( 1000 + level.ta_tellerfee ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( bank_transfer ) )
|
||||
{
|
||||
bank_transfer = maps/mp/zombies/_zm_powerups::specific_powerup_drop( "teller_withdrawl", level.bank_teller_powerup_spot.origin + vectorScale( ( 0, 0, -1 ), 40 ) );
|
||||
bank_transfer thread stop_bank_teller();
|
||||
bank_transfer.value = 0;
|
||||
}
|
||||
bank_transfer.value += 1000;
|
||||
bank_transfer notify( "powerup_reset" );
|
||||
bank_transfer thread maps/mp/zombies/_zm_powerups::powerup_timeout();
|
||||
player maps/mp/zombies/_zm_score::minus_to_player_score( 1000 + level.ta_tellerfee );
|
||||
level notify( "bank_teller_used" );
|
||||
}
|
||||
}
|
||||
|
||||
stop_bank_teller()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill( "death" );
|
||||
level notify( "stop_bank_teller" );
|
||||
}
|
||||
|
||||
delete_bank_teller()
|
||||
{
|
||||
wait 1;
|
||||
level notify( "stop_bank_teller" );
|
||||
bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
|
||||
bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" );
|
||||
bank_teller_dmg_trig delete();
|
||||
bank_teller_transfer_trig delete();
|
||||
}
|
||||
|
||||
onplayerconnect_bank_deposit_box()
|
||||
{
|
||||
online_game = sessionmodeisonlinegame();
|
||||
if ( !online_game )
|
||||
{
|
||||
self.account_value = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.account_value = self maps/mp/zombies/_zm_stats::get_map_stat( "depositBox", level.banking_map );
|
||||
}
|
||||
}
|
||||
|
||||
bank_deposit_box()
|
||||
{
|
||||
level.bank_deposit_max_amount = 250000;
|
||||
level.bank_deposit_ddl_increment_amount = 1000;
|
||||
level.bank_account_max = level.bank_deposit_max_amount / level.bank_deposit_ddl_increment_amount;
|
||||
level.bank_account_increment = int( level.bank_deposit_ddl_increment_amount / 1000 );
|
||||
deposit_triggers = getstructarray( "bank_deposit", "targetname" );
|
||||
array_thread( deposit_triggers, ::bank_deposit_unitrigger );
|
||||
withdraw_triggers = getstructarray( "bank_withdraw", "targetname" );
|
||||
array_thread( withdraw_triggers, ::bank_withdraw_unitrigger );
|
||||
}
|
||||
|
||||
bank_deposit_unitrigger()
|
||||
{
|
||||
bank_unitrigger( "bank_deposit", ::trigger_deposit_update_prompt, ::trigger_deposit_think, 5, 5, undefined, 5 );
|
||||
}
|
||||
|
||||
bank_withdraw_unitrigger()
|
||||
{
|
||||
bank_unitrigger( "bank_withdraw", ::trigger_withdraw_update_prompt, ::trigger_withdraw_think, 5, 5, undefined, 5 );
|
||||
}
|
||||
|
||||
bank_unitrigger( name, prompt_fn, think_fn, override_length, override_width, override_height, override_radius )
|
||||
{
|
||||
unitrigger_stub = spawnstruct();
|
||||
unitrigger_stub.origin = self.origin;
|
||||
if ( isDefined( self.script_angles ) )
|
||||
{
|
||||
unitrigger_stub.angles = self.script_angles;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.angles = self.angles;
|
||||
}
|
||||
unitrigger_stub.script_angles = unitrigger_stub.angles;
|
||||
if ( isDefined( override_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = override_length;
|
||||
}
|
||||
else if ( isDefined( self.script_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = self.script_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_length = 32;
|
||||
}
|
||||
if ( isDefined( override_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = override_width;
|
||||
}
|
||||
else if ( isDefined( self.script_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = self.script_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_width = 32;
|
||||
}
|
||||
if ( isDefined( override_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = override_height;
|
||||
}
|
||||
else if ( isDefined( self.script_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = self.script_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_height = 64;
|
||||
}
|
||||
if ( isDefined( override_radius ) )
|
||||
{
|
||||
unitrigger_stub.script_radius = override_radius;
|
||||
}
|
||||
else if ( isDefined( self.radius ) )
|
||||
{
|
||||
unitrigger_stub.radius = self.radius;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.radius = 32;
|
||||
}
|
||||
if ( isDefined( self.script_unitrigger_type ) )
|
||||
{
|
||||
unitrigger_stub.script_unitrigger_type = self.script_unitrigger_type;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
|
||||
unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length / 2 );
|
||||
}
|
||||
unitrigger_stub.cursor_hint = "HINT_NOICON";
|
||||
unitrigger_stub.targetname = name;
|
||||
maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
|
||||
unitrigger_stub.prompt_and_visibility_func = prompt_fn;
|
||||
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, think_fn );
|
||||
}
|
||||
|
||||
trigger_deposit_update_prompt( player )
|
||||
{
|
||||
if ( player.score < level.bank_deposit_ddl_increment_amount || player.account_value >= level.bank_account_max )
|
||||
{
|
||||
player show_balance();
|
||||
self sethintstring( "" );
|
||||
return 0;
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount );
|
||||
return 1;
|
||||
}
|
||||
|
||||
trigger_deposit_think()
|
||||
{
|
||||
self endon( "kill_trigger" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
while ( !is_player_valid( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( player.score >= level.bank_deposit_ddl_increment_amount && player.account_value < level.bank_account_max )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_vault_bank_deposit", player );
|
||||
player.score -= level.bank_deposit_ddl_increment_amount;
|
||||
player.account_value += level.bank_account_increment;
|
||||
player maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
|
||||
if ( isDefined( level.custom_bank_deposit_vo ) )
|
||||
{
|
||||
player thread [[ level.custom_bank_deposit_vo ]]();
|
||||
}
|
||||
if ( player.account_value >= level.bank_account_max )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
|
||||
}
|
||||
player show_balance();
|
||||
}
|
||||
}
|
||||
|
||||
trigger_withdraw_update_prompt( player )
|
||||
{
|
||||
if ( player.account_value <= 0 )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
player show_balance();
|
||||
return 0;
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee );
|
||||
return 1;
|
||||
}
|
||||
|
||||
trigger_withdraw_think()
|
||||
{
|
||||
self endon( "kill_trigger" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
while ( !is_player_valid( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( player.account_value >= level.bank_account_increment )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_vault_bank_withdraw", player );
|
||||
player.score += level.bank_deposit_ddl_increment_amount;
|
||||
level notify( "bank_withdrawal" );
|
||||
player.account_value -= level.bank_account_increment;
|
||||
player maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
|
||||
if ( isDefined( level.custom_bank_withdrawl_vo ) )
|
||||
{
|
||||
player thread [[ level.custom_bank_withdrawl_vo ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread do_player_general_vox( "general", "exert_laugh", 10, 50 );
|
||||
}
|
||||
player thread player_withdraw_fee();
|
||||
if ( player.account_value < level.bank_account_increment )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
|
||||
}
|
||||
player show_balance();
|
||||
}
|
||||
}
|
||||
|
||||
player_withdraw_fee()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
wait_network_frame();
|
||||
self.score -= level.ta_vaultfee;
|
||||
}
|
||||
|
||||
show_balance()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "DEBUG BANKER: " + self.name + " account worth " + self.account_value );
|
||||
#/
|
||||
}
|
414
zm_transit_patch/maps/mp/zombies/_zm_equip_electrictrap.gsc
Normal file
414
zm_transit_patch/maps/mp/zombies/_zm_equip_electrictrap.gsc
Normal file
@ -0,0 +1,414 @@
|
||||
#include maps/mp/zombies/_zm_traps;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_power;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/gametypes_zm/_weaponobjects;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_electrictrap_zm" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.electrictrap_name = "equip_electrictrap_zm";
|
||||
maps/mp/zombies/_zm_equipment::register_equipment( "equip_electrictrap_zm", &"ZOMBIE_EQUIP_ELECTRICTRAP_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_ELECTRICTRAP_HOWTO", "etrap_zm_icon", "electrictrap", undefined, ::transfertrap, ::droptrap, ::pickuptrap, ::placetrap );
|
||||
maps/mp/zombies/_zm_equipment::add_placeable_equipment( "equip_electrictrap_zm", "p6_anim_zm_buildable_etrap" );
|
||||
level thread onplayerconnect();
|
||||
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "equip_electrictrap", &"ZOMBIE_EQUIP_ELECTRICTRAP_PICKUP_HINT_STRING" );
|
||||
level._effect[ "etrap_on" ] = loadfx( "maps/zombie/fx_zmb_tranzit_electric_trap_on" );
|
||||
thread wait_init_damage();
|
||||
}
|
||||
|
||||
wait_init_damage()
|
||||
{
|
||||
while ( !isDefined( level.zombie_vars ) || !isDefined( level.zombie_vars[ "zombie_health_start" ] ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level.etrap_damage = maps/mp/zombies/_zm::ai_zombie_health( 50 );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread setupwatchers();
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread watchelectrictrapuse();
|
||||
}
|
||||
}
|
||||
|
||||
setupwatchers()
|
||||
{
|
||||
self waittill( "weapon_watchers_created" );
|
||||
watcher = maps/mp/gametypes_zm/_weaponobjects::getweaponobjectwatcher( "equip_electrictrap" );
|
||||
watcher.onspawnretrievetriggers = ::maps/mp/zombies/_zm_equipment::equipment_onspawnretrievableweaponobject;
|
||||
}
|
||||
|
||||
watchelectrictrapuse()
|
||||
{
|
||||
self notify( "watchElectricTrapUse" );
|
||||
self endon( "watchElectricTrapUse" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "equipment_placed", weapon, weapname );
|
||||
if ( weapname == level.electrictrap_name )
|
||||
{
|
||||
self cleanupoldtrap();
|
||||
self.buildableelectrictrap = weapon;
|
||||
self thread startelectrictrapdeploy( weapon );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cleanupoldtrap()
|
||||
{
|
||||
if ( isDefined( self.buildableelectrictrap ) )
|
||||
{
|
||||
if ( isDefined( self.buildableelectrictrap.stub ) )
|
||||
{
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableelectrictrap.stub );
|
||||
self.buildableelectrictrap.stub = undefined;
|
||||
}
|
||||
self.buildableelectrictrap delete();
|
||||
}
|
||||
if ( isDefined( level.electrap_sound_ent ) )
|
||||
{
|
||||
level.electrap_sound_ent delete();
|
||||
level.electrap_sound_ent = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
watchforcleanup()
|
||||
{
|
||||
self notify( "etrap_cleanup" );
|
||||
self endon( "etrap_cleanup" );
|
||||
self waittill_any( "death_or_disconnect", "equip_electrictrap_zm_taken", "equip_electrictrap_zm_pickup" );
|
||||
cleanupoldtrap();
|
||||
}
|
||||
|
||||
placetrap( origin, angles )
|
||||
{
|
||||
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_etrap", "equip_electrictrap_zm", origin, angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.owner = self;
|
||||
item.zombie_attack_callback = ::zombie_attacked_trap;
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
droptrap()
|
||||
{
|
||||
item = self maps/mp/zombies/_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_etrap", "equip_electrictrap_zm", self.origin, self.angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.electrictrap_health = self.electrictrap_health;
|
||||
}
|
||||
self.electrictrap_health = undefined;
|
||||
return item;
|
||||
}
|
||||
|
||||
pickuptrap( item )
|
||||
{
|
||||
item.owner = self;
|
||||
self.electrictrap_health = item.electrictrap_health;
|
||||
item.electrictrap_health = undefined;
|
||||
}
|
||||
|
||||
transfertrap( fromplayer, toplayer )
|
||||
{
|
||||
buildableelectrictrap = toplayer.buildableelectrictrap;
|
||||
electrictrap_health = toplayer.electrictrap_health;
|
||||
toplayer.buildableelectrictrap = fromplayer.buildableelectrictrap;
|
||||
toplayer.buildableelectrictrap.original_owner = toplayer;
|
||||
toplayer notify( "equip_electrictrap_zm_taken" );
|
||||
toplayer thread startelectrictrapdeploy( toplayer.buildableelectrictrap );
|
||||
toplayer.electrictrap_health = fromplayer.electrictrap_health;
|
||||
fromplayer.buildableelectrictrap = buildableelectrictrap;
|
||||
fromplayer notify( "equip_electrictrap_zm_taken" );
|
||||
if ( isDefined( fromplayer.buildableelectrictrap ) )
|
||||
{
|
||||
fromplayer thread startelectrictrapdeploy( fromplayer.buildableelectrictrap );
|
||||
fromplayer.buildableelectrictrap.original_owner = fromplayer;
|
||||
fromplayer.buildableelectrictrap.owner = fromplayer;
|
||||
}
|
||||
else
|
||||
{
|
||||
fromplayer maps/mp/zombies/_zm_equipment::equipment_release( "equip_electrictrap_zm" );
|
||||
}
|
||||
fromplayer.electrictrap_health = electrictrap_health;
|
||||
}
|
||||
|
||||
startelectrictrapdeploy( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_electrictrap_zm_taken" );
|
||||
self thread watchforcleanup();
|
||||
electricradius = 45;
|
||||
if ( !isDefined( self.electrictrap_health ) )
|
||||
{
|
||||
self.electrictrap_health = 60;
|
||||
}
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
/#
|
||||
weapon thread debugelectrictrap( electricradius );
|
||||
#/
|
||||
if ( isDefined( level.equipment_etrap_needs_power ) && level.equipment_etrap_needs_power )
|
||||
{
|
||||
weapon.power_on = 0;
|
||||
maps/mp/zombies/_zm_power::add_temp_powered_item( ::trap_power_on, ::trap_power_off, ::trap_in_range, ::maps/mp/zombies/_zm_power::cost_high, 1, weapon.power_on, weapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
weapon.power_on = 1;
|
||||
}
|
||||
if ( !weapon.power_on )
|
||||
{
|
||||
self iprintlnbold( &"ZOMBIE_NEED_LOCAL_POWER" );
|
||||
}
|
||||
self thread electrictrapthink( weapon, electricradius );
|
||||
if ( isDefined( level.equipment_etrap_needs_power ) && !level.equipment_etrap_needs_power )
|
||||
{
|
||||
self thread electrictrapdecay( weapon );
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( weapon );
|
||||
weapon waittill( "death" );
|
||||
if ( isDefined( level.electrap_sound_ent ) )
|
||||
{
|
||||
level.electrap_sound_ent playsound( "wpn_zmb_electrap_stop" );
|
||||
level.electrap_sound_ent delete();
|
||||
level.electrap_sound_ent = undefined;
|
||||
}
|
||||
self notify( "etrap_cleanup" );
|
||||
}
|
||||
}
|
||||
|
||||
trap_in_range( delta, origin, radius )
|
||||
{
|
||||
if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
trap_power_on( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: trap on\n" );
|
||||
#/
|
||||
if ( !isDefined( self.target ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.target.power_on = 1;
|
||||
self.target.power_on_time = getTime();
|
||||
self.target notify( "stop_attracting_zombies" );
|
||||
if ( !isDefined( level.electrap_sound_ent ) )
|
||||
{
|
||||
level.electrap_sound_ent = spawn( "script_origin", self.target.origin );
|
||||
}
|
||||
level.electrap_sound_ent playsound( "wpn_zmb_electrap_start" );
|
||||
level.electrap_sound_ent playloopsound( "wpn_zmb_electrap_loop", 2 );
|
||||
self.target thread trapfx();
|
||||
}
|
||||
|
||||
trap_power_off( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: trap off\n" );
|
||||
#/
|
||||
if ( !isDefined( self.target ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.target.power_on = 0;
|
||||
self.target thread item_attract_zombies();
|
||||
if ( isDefined( level.electrap_sound_ent ) )
|
||||
{
|
||||
level.electrap_sound_ent playsound( "wpn_zmb_electrap_stop" );
|
||||
level.electrap_sound_ent delete();
|
||||
level.electrap_sound_ent = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
trapfx()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( isDefined( self ) && isDefined( self.power_on ) && self.power_on )
|
||||
{
|
||||
playfxontag( level._effect[ "etrap_on" ], self, "tag_origin" );
|
||||
wait 0,3;
|
||||
}
|
||||
}
|
||||
|
||||
zombie_attacked_trap( zombie )
|
||||
{
|
||||
if ( isDefined( self.power_on ) && self.power_on )
|
||||
{
|
||||
self zap_zombie( zombie );
|
||||
}
|
||||
}
|
||||
|
||||
electrocution_lockout( time )
|
||||
{
|
||||
level.electrocuting_zombie = 1;
|
||||
wait time;
|
||||
level.electrocuting_zombie = 0;
|
||||
}
|
||||
|
||||
zap_zombie( zombie )
|
||||
{
|
||||
if ( isDefined( zombie.ignore_electric_trap ) && zombie.ignore_electric_trap )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( zombie.health > level.etrap_damage )
|
||||
{
|
||||
zombie dodamage( level.etrap_damage, self.origin );
|
||||
zombie.ignore_electric_trap = 1;
|
||||
return;
|
||||
}
|
||||
self playsound( "wpn_zmb_electrap_zap" );
|
||||
if ( isDefined( level.electrocuting_zombie ) && !level.electrocuting_zombie )
|
||||
{
|
||||
thread electrocution_lockout( 2 );
|
||||
zombie thread play_elec_vocals();
|
||||
zombie thread maps/mp/zombies/_zm_traps::electroctute_death_fx();
|
||||
zombie.is_on_fire = 0;
|
||||
zombie notify( "stop_flame_damage" );
|
||||
}
|
||||
zombie thread electrictrapkill( self );
|
||||
}
|
||||
|
||||
etrap_choke()
|
||||
{
|
||||
if ( !isDefined( level.etrap_choke_count ) )
|
||||
{
|
||||
level.etrap_choke_count = 0;
|
||||
}
|
||||
level.etrap_choke_count++;
|
||||
if ( level.etrap_choke_count >= 5 )
|
||||
{
|
||||
wait 0,05;
|
||||
level.etrap_choke_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
electrictrapthink( weapon, electricradius )
|
||||
{
|
||||
weapon endon( "death" );
|
||||
radiussquared = electricradius * electricradius;
|
||||
while ( isDefined( weapon ) )
|
||||
{
|
||||
while ( weapon.power_on && ( getTime() - weapon.power_on_time ) > 2000 )
|
||||
{
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
_a354 = zombies;
|
||||
_k354 = getFirstArrayKey( _a354 );
|
||||
while ( isDefined( _k354 ) )
|
||||
{
|
||||
zombie = _a354[ _k354 ];
|
||||
if ( !isDefined( zombie ) || !isalive( zombie ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( zombie.ignore_electric_trap ) && zombie.ignore_electric_trap )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( distancesquared( weapon.origin, zombie.origin ) < radiussquared )
|
||||
{
|
||||
weapon zap_zombie( zombie );
|
||||
wait 0,15;
|
||||
}
|
||||
etrap_choke();
|
||||
}
|
||||
}
|
||||
_k354 = getNextArrayKey( _a354, _k354 );
|
||||
}
|
||||
players = get_players();
|
||||
_a373 = players;
|
||||
_k373 = getFirstArrayKey( _a373 );
|
||||
while ( isDefined( _k373 ) )
|
||||
{
|
||||
player = _a373[ _k373 ];
|
||||
if ( is_player_valid( player ) && distancesquared( weapon.origin, player.origin ) < radiussquared )
|
||||
{
|
||||
player thread maps/mp/zombies/_zm_traps::player_elec_damage();
|
||||
etrap_choke();
|
||||
}
|
||||
etrap_choke();
|
||||
_k373 = getNextArrayKey( _a373, _k373 );
|
||||
}
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
|
||||
electrictrapkill( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait randomfloatrange( 0,1, 0,4 );
|
||||
self dodamage( self.health + 666, self.origin );
|
||||
}
|
||||
|
||||
electrictrapdecay( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_electrictrap_zm_taken" );
|
||||
while ( isDefined( weapon ) )
|
||||
{
|
||||
if ( weapon.power_on )
|
||||
{
|
||||
self.electrictrap_health--;
|
||||
|
||||
if ( self.electrictrap_health <= 0 )
|
||||
{
|
||||
self cleanupoldtrap();
|
||||
self.electrictrap_health = undefined;
|
||||
self thread maps/mp/zombies/_zm_equipment::equipment_release( "equip_electrictrap_zm" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
debugelectrictrap( radius )
|
||||
{
|
||||
/#
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
if ( getDvarInt( #"EB512CB7" ) )
|
||||
{
|
||||
circle( self.origin, radius, ( 1, 1, 1 ), 0, 1, 1 );
|
||||
}
|
||||
wait 0,05;
|
||||
#/
|
||||
}
|
||||
}
|
350
zm_transit_patch/maps/mp/zombies/_zm_equip_turret.gsc
Normal file
350
zm_transit_patch/maps/mp/zombies/_zm_equip_turret.gsc
Normal file
@ -0,0 +1,350 @@
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_mgturret;
|
||||
#include maps/mp/zombies/_zm_power;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/gametypes_zm/_weaponobjects;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_turret_zm" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
precachemodel( "p6_anim_zm_buildable_turret" );
|
||||
precacheturret( "zombie_bullet_crouch_zm" );
|
||||
level.turret_name = "equip_turret_zm";
|
||||
maps/mp/zombies/_zm_equipment::register_equipment( "equip_turret_zm", &"ZOMBIE_EQUIP_TURRET_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_TURRET_HOWTO", "turret_zm_icon", "turret", undefined, ::transferturret, ::dropturret, ::pickupturret, ::placeturret );
|
||||
maps/mp/zombies/_zm_equipment::add_placeable_equipment( "equip_turret_zm", "p6_anim_zm_buildable_turret" );
|
||||
level thread onplayerconnect();
|
||||
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "equip_turret", &"ZOMBIE_EQUIP_TURRET_PICKUP_HINT_STRING" );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread setupwatchers();
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread watchturretuse();
|
||||
}
|
||||
}
|
||||
|
||||
setupwatchers()
|
||||
{
|
||||
self waittill( "weapon_watchers_created" );
|
||||
watcher = maps/mp/gametypes_zm/_weaponobjects::getweaponobjectwatcher( "equip_turret" );
|
||||
watcher.onspawnretrievetriggers = ::maps/mp/zombies/_zm_equipment::equipment_onspawnretrievableweaponobject;
|
||||
}
|
||||
|
||||
watchturretuse()
|
||||
{
|
||||
self notify( "watchTurretUse" );
|
||||
self endon( "watchTurretUse" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "equipment_placed", weapon, weapname );
|
||||
if ( weapname == level.turret_name )
|
||||
{
|
||||
self cleanupoldturret();
|
||||
self.buildableturret = weapon;
|
||||
self thread startturretdeploy( weapon );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cleanupoldturret()
|
||||
{
|
||||
if ( isDefined( self.buildableturret ) )
|
||||
{
|
||||
if ( isDefined( self.buildableturret.stub ) )
|
||||
{
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturret.stub );
|
||||
self.buildableturret.stub = undefined;
|
||||
}
|
||||
if ( isDefined( self.buildableturret.turret ) )
|
||||
{
|
||||
if ( isDefined( self.buildableturret.turret.sound_ent ) )
|
||||
{
|
||||
self.buildableturret.turret.sound_ent delete();
|
||||
}
|
||||
self.buildableturret.turret delete();
|
||||
}
|
||||
if ( isDefined( self.buildableturret.sound_ent ) )
|
||||
{
|
||||
self.buildableturret.sound_ent delete();
|
||||
self.buildableturret.sound_ent = undefined;
|
||||
}
|
||||
self.buildableturret delete();
|
||||
self.turret_health = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turret ) )
|
||||
{
|
||||
self.turret notify( "stop_burst_fire_unmanned" );
|
||||
self.turret delete();
|
||||
}
|
||||
}
|
||||
self.turret = undefined;
|
||||
self notify( "turret_cleanup" );
|
||||
}
|
||||
|
||||
watchforcleanup()
|
||||
{
|
||||
self notify( "turret_cleanup" );
|
||||
self endon( "turret_cleanup" );
|
||||
self waittill_any( "death_or_disconnect", "equip_turret_zm_taken", "equip_turret_zm_pickup" );
|
||||
cleanupoldturret();
|
||||
}
|
||||
|
||||
placeturret( origin, angles )
|
||||
{
|
||||
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_turret", "equip_turret_zm", origin, angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.owner = self;
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
dropturret()
|
||||
{
|
||||
item = self maps/mp/zombies/_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_turret", "equip_turret_zm", self.origin, self.angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.turret_health = self.turret_health;
|
||||
}
|
||||
self.turret_health = undefined;
|
||||
return item;
|
||||
}
|
||||
|
||||
pickupturret( item )
|
||||
{
|
||||
item.owner = self;
|
||||
self.turret_health = item.turret_health;
|
||||
item.turret_health = undefined;
|
||||
}
|
||||
|
||||
transferturret( fromplayer, toplayer )
|
||||
{
|
||||
buildableturret = toplayer.buildableturret;
|
||||
turret = toplayer.turret;
|
||||
toplayer.buildableturret = fromplayer.buildableturret;
|
||||
toplayer.turret = fromplayer.turret;
|
||||
fromplayer.buildableturret = buildableturret;
|
||||
fromplayer.turret = turret;
|
||||
toplayer.buildableturret.original_owner = toplayer;
|
||||
toplayer notify( "equip_turret_zm_taken" );
|
||||
toplayer thread startturretdeploy( toplayer.buildableturret );
|
||||
fromplayer notify( "equip_turret_zm_taken" );
|
||||
if ( isDefined( fromplayer.buildableturret ) )
|
||||
{
|
||||
fromplayer thread startturretdeploy( fromplayer.buildableturret );
|
||||
fromplayer.buildableturret.original_owner = fromplayer;
|
||||
fromplayer.buildableturret.owner = fromplayer;
|
||||
}
|
||||
else
|
||||
{
|
||||
fromplayer maps/mp/zombies/_zm_equipment::equipment_release( "equip_turret_zm" );
|
||||
}
|
||||
turret_health = toplayer.turret_health;
|
||||
toplayer.turret_health = fromplayer.turret_health;
|
||||
fromplayer.turret_health = turret_health;
|
||||
}
|
||||
|
||||
startturretdeploy( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turret_zm_taken" );
|
||||
self thread watchforcleanup();
|
||||
if ( !isDefined( self.turret_health ) )
|
||||
{
|
||||
self.turret_health = 60;
|
||||
}
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
weapon hide();
|
||||
wait 0,1;
|
||||
if ( isDefined( weapon.power_on ) && weapon.power_on )
|
||||
{
|
||||
weapon.turret notify( "stop_burst_fire_unmanned" );
|
||||
}
|
||||
if ( !isDefined( weapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.turret ) )
|
||||
{
|
||||
self.turret notify( "stop_burst_fire_unmanned" );
|
||||
self.turret notify( "turret_deactivated" );
|
||||
self.turret delete();
|
||||
}
|
||||
turret = spawnturret( "misc_turret", weapon.origin, "zombie_bullet_crouch_zm" );
|
||||
turret.turrettype = "sentry";
|
||||
turret setturrettype( turret.turrettype );
|
||||
turret setmodel( "p6_anim_zm_buildable_turret" );
|
||||
turret.origin = weapon.origin;
|
||||
turret.angles = weapon.angles;
|
||||
turret linkto( weapon );
|
||||
turret makeunusable();
|
||||
turret.owner = self;
|
||||
turret setowner( turret.owner );
|
||||
turret maketurretunusable();
|
||||
turret setmode( "auto_nonai" );
|
||||
turret setdefaultdroppitch( 45 );
|
||||
turret setconvergencetime( 0,3 );
|
||||
turret setturretteam( self.team );
|
||||
turret.team = self.team;
|
||||
turret.damage_own_team = 1;
|
||||
turret.turret_active = 1;
|
||||
weapon.turret = turret;
|
||||
self.turret = turret;
|
||||
if ( isDefined( level.equipment_turret_needs_power ) && level.equipment_turret_needs_power )
|
||||
{
|
||||
weapon.power_on = 0;
|
||||
maps/mp/zombies/_zm_power::add_temp_powered_item( ::turret_power_on, ::turret_power_off, ::turret_in_range, ::maps/mp/zombies/_zm_power::cost_high, 1, weapon.power_on, weapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
weapon.power_on = 1;
|
||||
}
|
||||
if ( weapon.power_on )
|
||||
{
|
||||
turret thread maps/mp/zombies/_zm_mgturret::burst_fire_unmanned();
|
||||
}
|
||||
else
|
||||
{
|
||||
self iprintlnbold( &"ZOMBIE_NEED_LOCAL_POWER" );
|
||||
}
|
||||
if ( isDefined( level.equipment_turret_needs_power ) && !level.equipment_turret_needs_power )
|
||||
{
|
||||
self thread turretdecay( weapon );
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( weapon );
|
||||
while ( isDefined( weapon ) )
|
||||
{
|
||||
if ( !is_true( weapon.power_on ) )
|
||||
{
|
||||
if ( isDefined( self.buildableturret.sound_ent ) )
|
||||
{
|
||||
self.buildableturret.sound_ent playsound( "wpn_zmb_turret_stop" );
|
||||
self.buildableturret.sound_ent delete();
|
||||
self.buildableturret.sound_ent = undefined;
|
||||
}
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
if ( isDefined( self.buildableturret.sound_ent ) )
|
||||
{
|
||||
self.buildableturret.sound_ent playsound( "wpn_zmb_turret_stop" );
|
||||
self.buildableturret.sound_ent delete();
|
||||
self.buildableturret.sound_ent = undefined;
|
||||
}
|
||||
if ( isDefined( turret ) )
|
||||
{
|
||||
turret notify( "stop_burst_fire_unmanned" );
|
||||
turret notify( "turret_deactivated" );
|
||||
turret delete();
|
||||
}
|
||||
self.turret = undefined;
|
||||
self notify( "turret_cleanup" );
|
||||
}
|
||||
}
|
||||
|
||||
turret_in_range( delta, origin, radius )
|
||||
{
|
||||
if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
turret_power_on( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: turret on\n" );
|
||||
#/
|
||||
if ( !isDefined( self.target ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.target.power_on = 1;
|
||||
self.target.turret thread maps/mp/zombies/_zm_mgturret::burst_fire_unmanned();
|
||||
player = self.target.turret.owner;
|
||||
if ( !isDefined( player.buildableturret.sound_ent ) )
|
||||
{
|
||||
player.buildableturret.sound_ent = spawn( "script_origin", self.target.turret.origin );
|
||||
}
|
||||
player.buildableturret.sound_ent playsound( "wpn_zmb_turret_start" );
|
||||
player.buildableturret.sound_ent playloopsound( "wpn_zmb_turret_loop", 2 );
|
||||
}
|
||||
|
||||
turret_power_off( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: turret off\n" );
|
||||
#/
|
||||
if ( !isDefined( self.target ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.target.power_on = 0;
|
||||
self.target.turret notify( "stop_burst_fire_unmanned" );
|
||||
player = self.target.turret.owner;
|
||||
if ( isDefined( player.buildableturret.sound_ent ) )
|
||||
{
|
||||
player.buildableturret.sound_ent playsound( "wpn_zmb_turret_stop" );
|
||||
player.buildableturret.sound_ent delete();
|
||||
player.buildableturret.sound_ent = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
turretdecay( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
while ( isDefined( weapon ) )
|
||||
{
|
||||
if ( weapon.power_on )
|
||||
{
|
||||
self.turret_health--;
|
||||
|
||||
if ( self.turret_health <= 0 )
|
||||
{
|
||||
self cleanupoldturret();
|
||||
self thread maps/mp/zombies/_zm_equipment::equipment_release( "equip_turret_zm" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
debugturret( radius )
|
||||
{
|
||||
/#
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
circle( self.origin, radius, ( 1, 1, 1 ), 0, 1, 1 );
|
||||
wait 0,05;
|
||||
#/
|
||||
}
|
||||
}
|
11
zm_transit_patch/maps/mp/zombies/_zm_game_module_grief.gsc
Normal file
11
zm_transit_patch/maps/mp/zombies/_zm_game_module_grief.gsc
Normal file
@ -0,0 +1,11 @@
|
||||
#include maps/mp/zombies/_zm_game_module_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
register_game_module()
|
||||
{
|
||||
level.game_module_grief_index = 9;
|
||||
maps/mp/zombies/_zm_game_module::register_game_module( level.game_module_grief_index, "zgrief", ::onpreinitgametype, ::onpostinitgametype, undefined, ::onspawnzombie, ::onstartgametype );
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
#include maps/mp/zombies/_zm_game_module_utility;
|
||||
#include maps/mp/zombies/_zm_game_module_meat_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
@ -0,0 +1,685 @@
|
||||
#include maps/mp/zombies/_zm_powerups;
|
||||
#include maps/mp/gametypes_zm/zmeat;
|
||||
#include maps/mp/zombies/_zm_audio_announcer;
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_game_module_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
award_grenades_for_team( team )
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !isDefined( players[ i ]._meat_team ) || players[ i ]._meat_team != team )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
lethal_grenade = players[ i ] get_player_lethal_grenade();
|
||||
players[ i ] giveweapon( lethal_grenade );
|
||||
players[ i ] setweaponammoclip( lethal_grenade, 4 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
get_players_on_meat_team( team )
|
||||
{
|
||||
players = get_players();
|
||||
players_on_team = [];
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !isDefined( players[ i ]._meat_team ) || players[ i ]._meat_team != team )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
players_on_team[ players_on_team.size ] = players[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return players_on_team;
|
||||
}
|
||||
|
||||
get_alive_players_on_meat_team( team )
|
||||
{
|
||||
players = get_players();
|
||||
players_on_team = [];
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !isDefined( players[ i ]._meat_team ) || players[ i ]._meat_team != team )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( players[ i ].sessionstate == "spectator" || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
players_on_team[ players_on_team.size ] = players[ i ];
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return players_on_team;
|
||||
}
|
||||
|
||||
init_minigun_ring()
|
||||
{
|
||||
if ( isDefined( level._minigun_ring ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
ring_pos = getstruct( level._meat_location + "_meat_minigun", "script_noteworthy" );
|
||||
if ( !isDefined( ring_pos ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level._minigun_ring = spawn( "script_model", ring_pos.origin );
|
||||
level._minigun_ring.angles = ring_pos.angles;
|
||||
level._minigun_ring setmodel( ring_pos.script_parameters );
|
||||
level._minigun_ring_clip = getent( level._meat_location + "_meat_minigun_clip", "script_noteworthy" );
|
||||
if ( isDefined( level._minigun_ring_clip ) )
|
||||
{
|
||||
level._minigun_ring_clip linkto( level._minigun_ring );
|
||||
}
|
||||
else
|
||||
{
|
||||
iprintlnbold( "BUG: no level._minigun_ring_clip" );
|
||||
}
|
||||
level._minigun_ring_trig = getent( level._meat_location + "_meat_minigun_trig", "targetname" );
|
||||
if ( isDefined( level._minigun_ring_trig ) )
|
||||
{
|
||||
level._minigun_ring_trig enablelinkto();
|
||||
level._minigun_ring_trig linkto( level._minigun_ring );
|
||||
level._minigun_icon = spawn( "script_model", level._minigun_ring_trig.origin );
|
||||
level._minigun_icon setmodel( getweaponmodel( "minigun_zm" ) );
|
||||
level._minigun_icon linkto( level._minigun_ring );
|
||||
level._minigun_icon setclientfield( "ring_glowfx", 1 );
|
||||
level thread ring_toss( level._minigun_ring_trig, "minigun" );
|
||||
}
|
||||
else
|
||||
{
|
||||
iprintlnbold( "BUG: no level._minigun_ring_trig" );
|
||||
}
|
||||
level._minigun_ring thread move_ring( ring_pos );
|
||||
level._minigun_ring thread rotate_ring( 1 );
|
||||
}
|
||||
|
||||
init_ammo_ring()
|
||||
{
|
||||
if ( isDefined( level._ammo_ring ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
name = level._meat_location + "_meat_ammo";
|
||||
ring_pos = getstruct( name, "script_noteworthy" );
|
||||
if ( !isDefined( ring_pos ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level._ammo_ring = spawn( "script_model", ring_pos.origin );
|
||||
level._ammo_ring.angles = ring_pos.angles;
|
||||
level._ammo_ring setmodel( ring_pos.script_parameters );
|
||||
name = level._meat_location + "_meat_ammo_clip";
|
||||
level._ammo_ring_clip = getent( name, "script_noteworthy" );
|
||||
if ( isDefined( level._ammo_ring_clip ) )
|
||||
{
|
||||
level._ammo_ring_clip linkto( level._ammo_ring );
|
||||
}
|
||||
else
|
||||
{
|
||||
iprintlnbold( "BUG: no level._ammo_ring_clip" );
|
||||
}
|
||||
name = level._meat_location + "_meat_ammo_trig";
|
||||
level._ammo_ring_trig = getent( name, "targetname" );
|
||||
if ( isDefined( level._ammo_ring_clip ) )
|
||||
{
|
||||
level._ammo_ring_trig enablelinkto();
|
||||
level._ammo_ring_trig linkto( level._ammo_ring );
|
||||
level._ammo_icon = spawn( "script_model", level._ammo_ring_trig.origin );
|
||||
level._ammo_icon setmodel( "zombie_ammocan" );
|
||||
level._ammo_icon linkto( level._ammo_ring );
|
||||
level._ammo_icon setclientfield( "ring_glowfx", 1 );
|
||||
level thread ring_toss( level._ammo_ring_trig, "ammo" );
|
||||
}
|
||||
else
|
||||
{
|
||||
iprintlnbold( "BUG: no level._ammo_ring_trig" );
|
||||
}
|
||||
level._ammo_ring thread move_ring( ring_pos );
|
||||
level._ammo_ring thread rotate_ring( 1 );
|
||||
}
|
||||
|
||||
init_splitter_ring()
|
||||
{
|
||||
if ( isDefined( level._splitter_ring ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
ring_pos = getstruct( level._meat_location + "_meat_splitter", "script_noteworthy" );
|
||||
if ( !isDefined( ring_pos ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level._splitter_ring = spawn( "script_model", ring_pos.origin );
|
||||
level._splitter_ring.angles = ring_pos.angles;
|
||||
level._splitter_ring setmodel( ring_pos.script_parameters );
|
||||
level._splitter_ring_trig1 = getent( level._meat_location + "_meat_splitter_trig_1", "targetname" );
|
||||
level._splitter_ring_trig2 = getent( level._meat_location + "_meat_splitter_trig_2", "targetname" );
|
||||
if ( isDefined( level._splitter_ring_trig1 ) && isDefined( level._splitter_ring_trig2 ) )
|
||||
{
|
||||
level._splitter_ring_trig1 enablelinkto();
|
||||
level._splitter_ring_trig2 enablelinkto();
|
||||
}
|
||||
else
|
||||
{
|
||||
iprintlnbold( "BUG: missing at least one level._splitter_ring_trig" );
|
||||
}
|
||||
level._splitter_ring notsolid();
|
||||
level._meat_icon = spawn( "script_model", level._splitter_ring.origin );
|
||||
level._meat_icon setmodel( getweaponmodel( get_gamemode_var( "item_meat_name" ) ) );
|
||||
level._meat_icon linkto( level._splitter_ring );
|
||||
level._meat_icon setclientfield( "ring_glow_meatfx", 1 );
|
||||
if ( isDefined( level._splitter_ring_trig1 ) && isDefined( level._splitter_ring_trig2 ) )
|
||||
{
|
||||
level._splitter_ring_trig1 linkto( level._splitter_ring );
|
||||
level._splitter_ring_trig2 linkto( level._splitter_ring );
|
||||
level thread ring_toss( level._splitter_ring_trig1, "splitter" );
|
||||
level thread ring_toss( level._splitter_ring_trig2, "splitter" );
|
||||
}
|
||||
level._splitter_ring thread move_ring( ring_pos );
|
||||
}
|
||||
|
||||
ring_toss( trig, type )
|
||||
{
|
||||
level endon( "end_game" );
|
||||
while ( 1 )
|
||||
{
|
||||
while ( isDefined( level._ring_triggered ) && level._ring_triggered )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
if ( isDefined( level.item_meat ) && isDefined( level.item_meat.meat_is_moving ) && level.item_meat.meat_is_moving )
|
||||
{
|
||||
if ( level.item_meat istouching( trig ) )
|
||||
{
|
||||
level thread ring_toss_prize( type, trig );
|
||||
level._ring_triggered = 1;
|
||||
level thread ring_cooldown();
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
ring_cooldown()
|
||||
{
|
||||
wait 3;
|
||||
level._ring_triggered = 0;
|
||||
}
|
||||
|
||||
ring_toss_prize( type, trig )
|
||||
{
|
||||
switch( type )
|
||||
{
|
||||
case "splitter":
|
||||
level thread meat_splitter( trig );
|
||||
break;
|
||||
case "minigun":
|
||||
level thread minigun_prize( trig );
|
||||
break;
|
||||
case "ammo":
|
||||
level thread ammo_prize( trig );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
meat_splitter( trig )
|
||||
{
|
||||
level endon( "meat_grabbed" );
|
||||
level endon( "meat_kicked" );
|
||||
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
exit_trig = getent( trig.target, "targetname" );
|
||||
exit_struct = getstruct( trig.target, "targetname" );
|
||||
while ( isDefined( level.item_meat ) && !level.item_meat istouching( exit_trig ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
while ( isDefined( level.item_meat ) && level.item_meat istouching( exit_trig ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
if ( !isDefined( level.item_meat ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
playfx( level._effect[ "fw_burst" ], exit_trig.origin );
|
||||
flare_dir = vectornormalize( anglesToForward( exit_struct.angles ) );
|
||||
velocity = vectorScale( flare_dir, randomintrange( 400, 600 ) );
|
||||
velocity1 = ( velocity[ 0 ] + 75, velocity[ 1 ] + 75, randomintrange( 75, 125 ) );
|
||||
velocity2 = ( velocity[ 0 ] - 75, velocity[ 1 ] - 75, randomintrange( 75, 125 ) );
|
||||
velocity3 = ( velocity[ 0 ], velocity[ 1 ], 100 );
|
||||
level._fake_meats = [];
|
||||
level._meat_splitter_activated = 1;
|
||||
org = exit_trig.origin;
|
||||
player = get_players()[ 0 ];
|
||||
player._spawning_meat = 1;
|
||||
player endon( "disconnect" );
|
||||
thread split_meat( player, org, velocity1, velocity2, velocity );
|
||||
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "meat_ring_splitter", undefined, undefined, 1 );
|
||||
wait 0,1;
|
||||
while ( isDefined( level.splitting_meat ) && level.splitting_meat )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
player._spawning_meat = 0;
|
||||
}
|
||||
|
||||
split_meat( player, org, vel1, vel2, vel3 )
|
||||
{
|
||||
level.splitting_meat = 1;
|
||||
level.item_meat cleanup_meat();
|
||||
wait_network_frame();
|
||||
level._fake_meats[ level._fake_meats.size ] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel1 );
|
||||
wait_network_frame();
|
||||
level._fake_meats[ level._fake_meats.size ] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel2 );
|
||||
wait_network_frame();
|
||||
level._fake_meats[ level._fake_meats.size ] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel3 );
|
||||
real_meat = random( level._fake_meats );
|
||||
_a330 = level._fake_meats;
|
||||
_k330 = getFirstArrayKey( _a330 );
|
||||
while ( isDefined( _k330 ) )
|
||||
{
|
||||
meat = _a330[ _k330 ];
|
||||
if ( real_meat != meat )
|
||||
{
|
||||
meat._fake_meat = 1;
|
||||
meat thread maps/mp/gametypes_zm/zmeat::delete_on_real_meat_pickup();
|
||||
}
|
||||
else
|
||||
{
|
||||
meat._fake_meat = 0;
|
||||
level.item_meat = meat;
|
||||
}
|
||||
_k330 = getNextArrayKey( _a330, _k330 );
|
||||
}
|
||||
level.splitting_meat = 0;
|
||||
}
|
||||
|
||||
minigun_prize( trig )
|
||||
{
|
||||
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
if ( !isDefined( level.item_meat ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( level._minigun_toss_cooldown ) && level._minigun_toss_cooldown )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level thread minigun_toss_cooldown();
|
||||
if ( !is_player_valid( level._last_person_to_throw_meat ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level._last_person_to_throw_meat thread maps/mp/zombies/_zm_powerups::powerup_vo( "minigun" );
|
||||
level thread maps/mp/zombies/_zm_powerups::minigun_weapon_powerup( level._last_person_to_throw_meat );
|
||||
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "meat_ring_minigun", undefined, undefined, 1 );
|
||||
}
|
||||
|
||||
ammo_prize( trig )
|
||||
{
|
||||
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
if ( !isDefined( level.item_meat ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( level._ammo_toss_cooldown ) && level._ammo_toss_cooldown )
|
||||
{
|
||||
return;
|
||||
}
|
||||
playfx( level._effect[ "poltergeist" ], trig.origin );
|
||||
level thread ammo_toss_cooldown();
|
||||
level._last_person_to_throw_meat thread maps/mp/zombies/_zm_powerups::powerup_vo( "full_ammo" );
|
||||
level thread maps/mp/zombies/_zm_powerups::full_ammo_powerup( undefined, level._last_person_to_throw_meat );
|
||||
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "meat_ring_ammo", undefined, undefined, 1 );
|
||||
}
|
||||
|
||||
minigun_toss_cooldown()
|
||||
{
|
||||
level._minigun_toss_cooldown = 1;
|
||||
if ( isDefined( level._minigun_icon ) )
|
||||
{
|
||||
level._minigun_icon delete();
|
||||
}
|
||||
waittill_any_or_timeout( 120, "meat_end" );
|
||||
playfx( level._effect[ "poltergeist" ], level._minigun_ring_trig.origin );
|
||||
level._minigun_icon = spawn( "script_model", level._minigun_ring_trig.origin );
|
||||
level._minigun_icon setmodel( getweaponmodel( "minigun_zm" ) );
|
||||
level._minigun_icon linkto( level._minigun_ring );
|
||||
level._minigun_icon setclientfield( "ring_glowfx", 1 );
|
||||
level._minigun_toss_cooldown = 0;
|
||||
}
|
||||
|
||||
ammo_toss_cooldown()
|
||||
{
|
||||
level._ammo_toss_cooldown = 1;
|
||||
if ( isDefined( level._ammo_icon ) )
|
||||
{
|
||||
level._ammo_icon delete();
|
||||
}
|
||||
waittill_any_or_timeout( 60, "meat_end" );
|
||||
playfx( level._effect[ "poltergeist" ], level._ammo_ring_trig.origin );
|
||||
level._ammo_icon = spawn( "script_model", level._ammo_ring_trig.origin );
|
||||
level._ammo_icon setmodel( "zombie_ammocan" );
|
||||
level._ammo_icon linkto( level._ammo_ring );
|
||||
level._ammo_icon setclientfield( "ring_glowfx", 1 );
|
||||
level._ammo_toss_cooldown = 0;
|
||||
}
|
||||
|
||||
wait_for_team_death( team )
|
||||
{
|
||||
level endon( "meat_end" );
|
||||
encounters_team = undefined;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 1;
|
||||
while ( isDefined( level._checking_for_save ) && level._checking_for_save )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
alive_team_players = get_alive_players_on_meat_team( team );
|
||||
while ( alive_team_players.size > 0 )
|
||||
{
|
||||
encounters_team = alive_team_players[ 0 ]._encounters_team;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( encounters_team ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
winning_team = "A";
|
||||
if ( encounters_team == "A" )
|
||||
{
|
||||
winning_team = "B";
|
||||
}
|
||||
level notify( "meat_end" );
|
||||
}
|
||||
|
||||
check_should_save_player( team )
|
||||
{
|
||||
if ( !isDefined( level._meat_on_team ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
level._checking_for_save = 1;
|
||||
players = get_players_on_meat_team( team );
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
if ( isDefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == player )
|
||||
{
|
||||
while ( isDefined( level.item_meat.meat_is_moving ) && !level.item_meat.meat_is_moving && isDefined( level._meat_splitter_activated ) || level._meat_splitter_activated && isDefined( level.item_meat.meat_is_flying ) && level.item_meat.meat_is_flying )
|
||||
{
|
||||
if ( level._meat_on_team != player._meat_team )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( isDefined( level.item_meat.meat_is_rolling ) && level.item_meat.meat_is_rolling && level._meat_on_team == player._meat_team )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
level._checking_for_save = 0;
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( player.last_damage_from_zombie_or_player ) && !player.last_damage_from_zombie_or_player )
|
||||
{
|
||||
level._checking_for_save = 0;
|
||||
return 0;
|
||||
}
|
||||
if ( level._meat_on_team != player._meat_team && isDefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == player )
|
||||
{
|
||||
if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
level thread revive_saved_player( player );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
level._checking_for_save = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
watch_save_player()
|
||||
{
|
||||
if ( !isDefined( level._meat_on_team ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( level._last_person_to_throw_meat ) || level._last_person_to_throw_meat != self )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
level._checking_for_save = 1;
|
||||
while ( isDefined( level.splitting_meat ) || level.splitting_meat && isDefined( level.item_meat ) && isDefined( level.item_meat.meat_is_moving ) || level.item_meat.meat_is_moving && isDefined( level.item_meat.meat_is_flying ) && level.item_meat.meat_is_flying )
|
||||
{
|
||||
if ( level._meat_on_team != self._meat_team )
|
||||
{
|
||||
}
|
||||
else if ( isDefined( level.item_meat ) && isDefined( level.item_meat.meat_is_rolling ) && level.item_meat.meat_is_rolling && level._meat_on_team == self._meat_team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
if ( level._meat_on_team != self._meat_team && isDefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == self )
|
||||
{
|
||||
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
level thread revive_saved_player( self );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
level._checking_for_save = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
revive_saved_player( player )
|
||||
{
|
||||
player endon( "disconnect" );
|
||||
player iprintlnbold( &"ZOMBIE_PLAYER_SAVED" );
|
||||
player playsound( level.zmb_laugh_alias );
|
||||
wait 0,25;
|
||||
playfx( level._effect[ "poltergeist" ], player.origin );
|
||||
playsoundatposition( "zmb_bolt", player.origin );
|
||||
earthquake( 0,5, 0,75, player.origin, 1000 );
|
||||
player thread maps/mp/zombies/_zm_laststand::auto_revive( player );
|
||||
player._saved_by_throw++;
|
||||
level._checking_for_save = 0;
|
||||
}
|
||||
|
||||
get_game_module_players( player )
|
||||
{
|
||||
return get_players_on_meat_team( player._meat_team );
|
||||
}
|
||||
|
||||
item_meat_spawn( origin )
|
||||
{
|
||||
org = origin;
|
||||
player = get_players()[ 0 ];
|
||||
player._spawning_meat = 1;
|
||||
player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, ( 0, 0, 1 ) );
|
||||
playsoundatposition( "zmb_spawn_powerup", org );
|
||||
wait 0,1;
|
||||
player._spawning_meat = undefined;
|
||||
}
|
||||
|
||||
init_item_meat( gametype )
|
||||
{
|
||||
if ( gametype == "zgrief" )
|
||||
{
|
||||
set_gamemode_var_once( "item_meat_name", "item_meat_zm" );
|
||||
set_gamemode_var_once( "item_meat_model", "t6_wpn_zmb_meat_world" );
|
||||
}
|
||||
else
|
||||
{
|
||||
set_gamemode_var_once( "item_meat_name", "item_head_zm" );
|
||||
set_gamemode_var_once( "item_meat_model", "t6_wpn_zmb_severedhead_world" );
|
||||
}
|
||||
precacheitem( get_gamemode_var( "item_meat_name" ) );
|
||||
set_gamemode_var_once( "start_item_meat_name", get_gamemode_var( "item_meat_name" ) );
|
||||
level.meat_weaponidx = getweaponindexfromname( get_gamemode_var( "item_meat_name" ) );
|
||||
level.meat_pickupsound = getweaponpickupsound( level.meat_weaponidx );
|
||||
level.meat_pickupsoundplayer = getweaponpickupsoundplayer( level.meat_weaponidx );
|
||||
}
|
||||
|
||||
meat_intro( launch_spot )
|
||||
{
|
||||
flag_wait( "start_encounters_match_logic" );
|
||||
wait 3;
|
||||
level thread multi_launch( launch_spot );
|
||||
launch_meat( launch_spot );
|
||||
drop_meat( level._meat_start_point );
|
||||
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "meat_drop", undefined, undefined, 1 );
|
||||
}
|
||||
|
||||
launch_meat( launch_spot )
|
||||
{
|
||||
level waittill( "launch_meat" );
|
||||
spots = getstructarray( launch_spot, "targetname" );
|
||||
if ( isDefined( spots ) && spots.size > 0 )
|
||||
{
|
||||
spot = random( spots );
|
||||
meat = spawn( "script_model", spot.origin );
|
||||
meat setmodel( "tag_origin" );
|
||||
wait_network_frame();
|
||||
playfxontag( level._effect[ "fw_trail" ], meat, "tag_origin" );
|
||||
meat playloopsound( "zmb_souls_loop", 0,75 );
|
||||
dest = spot;
|
||||
while ( isDefined( dest ) && isDefined( dest.target ) )
|
||||
{
|
||||
new_dest = getstruct( dest.target, "targetname" );
|
||||
dest = new_dest;
|
||||
dist = distance( new_dest.origin, meat.origin );
|
||||
time = dist / 700;
|
||||
meat moveto( new_dest.origin, time );
|
||||
meat waittill( "movedone" );
|
||||
}
|
||||
meat playsound( "zmb_souls_end" );
|
||||
playfx( level._effect[ "fw_burst" ], meat.origin );
|
||||
wait randomfloatrange( 0,2, 0,5 );
|
||||
meat playsound( "zmb_souls_end" );
|
||||
playfx( level._effect[ "fw_burst" ], meat.origin + ( randomintrange( 50, 150 ), randomintrange( 50, 150 ), randomintrange( -20, 20 ) ) );
|
||||
wait randomfloatrange( 0,5, 0,75 );
|
||||
meat playsound( "zmb_souls_end" );
|
||||
playfx( level._effect[ "fw_burst" ], meat.origin + ( randomintrange( -150, -50 ), randomintrange( -150, 50 ), randomintrange( -20, 20 ) ) );
|
||||
wait randomfloatrange( 0,5, 0,75 );
|
||||
meat playsound( "zmb_souls_end" );
|
||||
playfx( level._effect[ "fw_burst" ], meat.origin );
|
||||
meat delete();
|
||||
}
|
||||
}
|
||||
|
||||
multi_launch( launch_spot )
|
||||
{
|
||||
spots = getstructarray( launch_spot, "targetname" );
|
||||
if ( isDefined( spots ) && spots.size > 0 )
|
||||
{
|
||||
x = 0;
|
||||
while ( x < 3 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < spots.size )
|
||||
{
|
||||
delay = randomfloatrange( 0,1, 0,25 );
|
||||
level thread fake_launch( spots[ i ], delay );
|
||||
i++;
|
||||
}
|
||||
wait randomfloatrange( 0,25, 0,75 );
|
||||
if ( x > 1 )
|
||||
{
|
||||
level notify( "launch_meat" );
|
||||
}
|
||||
x++;
|
||||
}
|
||||
}
|
||||
else wait randomfloatrange( 0,25, 0,75 );
|
||||
level notify( "launch_meat" );
|
||||
}
|
||||
|
||||
fake_launch( launch_spot, delay )
|
||||
{
|
||||
wait delay;
|
||||
wait randomfloatrange( 0,1, 4 );
|
||||
meat = spawn( "script_model", launch_spot.origin + ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ) );
|
||||
meat setmodel( "tag_origin" );
|
||||
wait_network_frame();
|
||||
playfxontag( level._effect[ "fw_trail_cheap" ], meat, "tag_origin" );
|
||||
meat playloopsound( "zmb_souls_loop", 0,75 );
|
||||
dest = launch_spot;
|
||||
while ( isDefined( dest ) && isDefined( dest.target ) )
|
||||
{
|
||||
random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 );
|
||||
new_dest = getstruct( dest.target, "targetname" );
|
||||
dest = new_dest;
|
||||
dist = distance( new_dest.origin + random_offset, meat.origin );
|
||||
time = dist / 700;
|
||||
meat moveto( new_dest.origin + random_offset, time );
|
||||
meat waittill( "movedone" );
|
||||
}
|
||||
meat playsound( "zmb_souls_end" );
|
||||
playfx( level._effect[ "fw_pre_burst" ], meat.origin );
|
||||
meat delete();
|
||||
}
|
||||
|
||||
drop_meat( drop_spot )
|
||||
{
|
||||
meat = spawn( "script_model", drop_spot + vectorScale( ( 0, 0, 1 ), 600 ) );
|
||||
meat setmodel( "tag_origin" );
|
||||
dist = distance( meat.origin, drop_spot );
|
||||
time = dist / 400;
|
||||
wait 2;
|
||||
meat moveto( drop_spot, time );
|
||||
wait_network_frame();
|
||||
playfxontag( level._effect[ "fw_drop" ], meat, "tag_origin" );
|
||||
meat waittill( "movedone" );
|
||||
playfx( level._effect[ "fw_impact" ], drop_spot );
|
||||
level notify( "reset_meat" );
|
||||
meat delete();
|
||||
}
|
46
zm_transit_patch/maps/mp/zombies/_zm_game_module_utility.gsc
Normal file
46
zm_transit_patch/maps/mp/zombies/_zm_game_module_utility.gsc
Normal file
@ -0,0 +1,46 @@
|
||||
#include maps/mp/zombies/_zm_game_module_meat;
|
||||
#include maps/mp/zombies/_zm_game_module_meat_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init_item_meat()
|
||||
{
|
||||
level.item_meat_name = "item_meat_zm";
|
||||
precacheitem( level.item_meat_name );
|
||||
}
|
||||
|
||||
move_ring( ring )
|
||||
{
|
||||
positions = getstructarray( ring.target, "targetname" );
|
||||
positions = array_randomize( positions );
|
||||
level endon( "end_game" );
|
||||
while ( 1 )
|
||||
{
|
||||
_a23 = positions;
|
||||
_k23 = getFirstArrayKey( _a23 );
|
||||
while ( isDefined( _k23 ) )
|
||||
{
|
||||
position = _a23[ _k23 ];
|
||||
self moveto( position.origin, randomintrange( 30, 45 ) );
|
||||
self waittill( "movedone" );
|
||||
_k23 = getNextArrayKey( _a23, _k23 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rotate_ring( forward )
|
||||
{
|
||||
level endon( "end_game" );
|
||||
dir = -360;
|
||||
if ( forward )
|
||||
{
|
||||
dir = 360;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self rotateyaw( dir, 9 );
|
||||
wait 9;
|
||||
}
|
||||
}
|
627
zm_transit_patch/maps/mp/zombies/_zm_melee_weapon.gsc
Normal file
627
zm_transit_patch/maps/mp/zombies/_zm_melee_weapon.gsc
Normal 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();
|
||||
}
|
||||
}
|
665
zm_transit_patch/maps/mp/zombies/_zm_riotshield.gsc
Normal file
665
zm_transit_patch/maps/mp/zombies/_zm_riotshield.gsc
Normal file
@ -0,0 +1,665 @@
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_weap_riotshield;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level.riotshield_name = "riotshield_zm";
|
||||
level.deployedshieldmodel = [];
|
||||
level.stowedshieldmodel = [];
|
||||
level.carriedshieldmodel = [];
|
||||
level.deployedshieldmodel[ 0 ] = "t6_wpn_zmb_shield_world";
|
||||
level.deployedshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dmg1_world";
|
||||
level.deployedshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dmg2_world";
|
||||
level.stowedshieldmodel[ 0 ] = "t6_wpn_zmb_shield_stow";
|
||||
level.stowedshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dmg1_stow";
|
||||
level.stowedshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dmg2_stow";
|
||||
level.carriedshieldmodel[ 0 ] = "t6_wpn_zmb_shield_world";
|
||||
level.carriedshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dmg1_world";
|
||||
level.carriedshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dmg2_world";
|
||||
level.viewshieldmodel[ 0 ] = "t6_wpn_zmb_shield_view";
|
||||
level.viewshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dmg1_view";
|
||||
level.viewshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dmg2_view";
|
||||
precachemodel( level.stowedshieldmodel[ 0 ] );
|
||||
precachemodel( level.stowedshieldmodel[ 2 ] );
|
||||
precachemodel( level.stowedshieldmodel[ 3 ] );
|
||||
precachemodel( level.carriedshieldmodel[ 0 ] );
|
||||
precachemodel( level.carriedshieldmodel[ 2 ] );
|
||||
precachemodel( level.carriedshieldmodel[ 3 ] );
|
||||
precachemodel( level.viewshieldmodel[ 0 ] );
|
||||
precachemodel( level.viewshieldmodel[ 2 ] );
|
||||
precachemodel( level.viewshieldmodel[ 3 ] );
|
||||
level.riotshield_placement_zoffset = 26;
|
||||
}
|
||||
|
||||
attachriotshield( model, tag )
|
||||
{
|
||||
if ( isDefined( self.prev_shield_model ) && isDefined( self.prev_shield_tag ) )
|
||||
{
|
||||
self detachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
|
||||
}
|
||||
self.prev_shield_model = model;
|
||||
self.prev_shield_tag = tag;
|
||||
if ( isDefined( self.prev_shield_model ) && isDefined( self.prev_shield_tag ) )
|
||||
{
|
||||
self attachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
|
||||
}
|
||||
}
|
||||
|
||||
removeriotshield()
|
||||
{
|
||||
if ( isDefined( self.prev_shield_model ) && isDefined( self.prev_shield_tag ) )
|
||||
{
|
||||
self detachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
|
||||
}
|
||||
self.prev_shield_model = undefined;
|
||||
self.prev_shield_tag = undefined;
|
||||
if ( self getcurrentweapon() != level.riotshield_name )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self setheldweaponmodel( 0 );
|
||||
}
|
||||
|
||||
setriotshieldviewmodel( modelnum )
|
||||
{
|
||||
self.prev_shield_viewmodel = modelnum;
|
||||
if ( self getcurrentweapon() != level.riotshield_name )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.prev_shield_viewmodel ) )
|
||||
{
|
||||
self setheldweaponmodel( self.prev_shield_viewmodel );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setheldweaponmodel( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
specialriotshieldviewmodel()
|
||||
{
|
||||
if ( self getcurrentweapon() != level.riotshield_name )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self setheldweaponmodel( 3 );
|
||||
}
|
||||
|
||||
restoreriotshieldviewmodel()
|
||||
{
|
||||
if ( self getcurrentweapon() != level.riotshield_name )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.prev_shield_viewmodel ) )
|
||||
{
|
||||
self setheldweaponmodel( self.prev_shield_viewmodel );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setheldweaponmodel( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
updateriotshieldmodel()
|
||||
{
|
||||
if ( !isDefined( self.shield_damage_level ) )
|
||||
{
|
||||
if ( isDefined( self.player_shield_reset_health ) )
|
||||
{
|
||||
self [[ self.player_shield_reset_health ]]();
|
||||
}
|
||||
}
|
||||
update = 0;
|
||||
if ( !isDefined( self.prev_shield_damage_level ) || self.prev_shield_damage_level != self.shield_damage_level )
|
||||
{
|
||||
self.prev_shield_damage_level = self.shield_damage_level;
|
||||
update = 1;
|
||||
}
|
||||
if ( !isDefined( self.prev_shield_placement ) || self.prev_shield_placement != self.shield_placement )
|
||||
{
|
||||
self.prev_shield_placement = self.shield_placement;
|
||||
update = 1;
|
||||
}
|
||||
if ( update )
|
||||
{
|
||||
if ( self.prev_shield_placement == 0 )
|
||||
{
|
||||
self attachriotshield();
|
||||
return;
|
||||
}
|
||||
else if ( self.prev_shield_placement == 1 )
|
||||
{
|
||||
self attachriotshield( level.carriedshieldmodel[ self.prev_shield_damage_level ], "tag_weapon_left" );
|
||||
self setriotshieldviewmodel( self.prev_shield_damage_level );
|
||||
return;
|
||||
}
|
||||
else if ( self.prev_shield_placement == 2 )
|
||||
{
|
||||
self attachriotshield( level.stowedshieldmodel[ self.prev_shield_damage_level ], "tag_stowed_back" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.prev_shield_placement == 3 )
|
||||
{
|
||||
self attachriotshield();
|
||||
if ( isDefined( self.shield_ent ) )
|
||||
{
|
||||
self.shield_ent setmodel( level.deployedshieldmodel[ self.prev_shield_damage_level ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updatestandaloneriotshieldmodel()
|
||||
{
|
||||
update = 0;
|
||||
if ( !isDefined( self.prev_shield_damage_level ) || self.prev_shield_damage_level != self.shield_damage_level )
|
||||
{
|
||||
self.prev_shield_damage_level = self.shield_damage_level;
|
||||
update = 1;
|
||||
}
|
||||
if ( update )
|
||||
{
|
||||
self setmodel( level.deployedshieldmodel[ self.prev_shield_damage_level ] );
|
||||
}
|
||||
}
|
||||
|
||||
watchshieldlaststand()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self notify( "watchShieldLastStand" );
|
||||
self endon( "watchShieldLastStand" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "weapons_taken_for_last_stand" );
|
||||
self.riotshield_hidden = 0;
|
||||
if ( isDefined( self.hasriotshield ) && self.hasriotshield )
|
||||
{
|
||||
if ( self.prev_shield_placement == 1 || self.prev_shield_placement == 2 )
|
||||
{
|
||||
self.riotshield_hidden = 2;
|
||||
self.shield_placement = 0;
|
||||
self updateriotshieldmodel();
|
||||
}
|
||||
}
|
||||
str_notify = self waittill_any_return( "player_revived", "bled_out" );
|
||||
if ( str_notify == "player_revived" )
|
||||
{
|
||||
if ( isDefined( self.riotshield_hidden ) && self.riotshield_hidden > 0 )
|
||||
{
|
||||
self.shield_placement = self.riotshield_hidden;
|
||||
self updateriotshieldmodel();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/zombies/_zm_weap_riotshield::player_take_riotshield();
|
||||
}
|
||||
self.riotshield_hidden = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
trackriotshield()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
self.shield_placement = 0;
|
||||
if ( self.hasriotshield )
|
||||
{
|
||||
if ( self.hasriotshieldequipped )
|
||||
{
|
||||
self.shield_placement = 1;
|
||||
self updateriotshieldmodel();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.shield_placement = 2;
|
||||
self updateriotshieldmodel();
|
||||
}
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "weapon_change", newweapon );
|
||||
if ( newweapon == level.riotshield_name )
|
||||
{
|
||||
if ( self.hasriotshieldequipped )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( isDefined( self.riotshieldentity ) )
|
||||
{
|
||||
self notify( "destroy_riotshield" );
|
||||
}
|
||||
self.shield_placement = 1;
|
||||
self updateriotshieldmodel();
|
||||
if ( self.hasriotshield )
|
||||
{
|
||||
break;
|
||||
}
|
||||
self.hasriotshield = 1;
|
||||
self.hasriotshieldequipped = 1;
|
||||
continue;
|
||||
}
|
||||
else if ( self ismantling() && newweapon == "none" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.hasriotshieldequipped )
|
||||
{
|
||||
/#
|
||||
assert( self.hasriotshield );
|
||||
#/
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
if ( isDefined( self.riotshield_hidden ) && self.riotshield_hidden )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.hasriotshield )
|
||||
{
|
||||
self.shield_placement = 2;
|
||||
break;
|
||||
}
|
||||
else if ( isDefined( self.shield_ent ) )
|
||||
{
|
||||
/#
|
||||
assert( self.shield_placement == 3 );
|
||||
#/
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.shield_placement = 0;
|
||||
}
|
||||
}
|
||||
self updateriotshieldmodel();
|
||||
self.hasriotshieldequipped = 0;
|
||||
break;
|
||||
}
|
||||
else if ( self.hasriotshield )
|
||||
{
|
||||
if ( !self hasweapon( level.riotshield_name ) )
|
||||
{
|
||||
self.shield_placement = 0;
|
||||
self updateriotshieldmodel();
|
||||
self.hasriotshield = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self hasweapon( level.riotshield_name ) )
|
||||
{
|
||||
self.shield_placement = 2;
|
||||
self updateriotshieldmodel();
|
||||
self.hasriotshield = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trackequipmentchange()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "equipment_dropped", equipname );
|
||||
self notify( "weapon_change" );
|
||||
}
|
||||
}
|
||||
|
||||
updateriotshieldplacement()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "deploy_riotshield" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
self endon( "weapon_change" );
|
||||
while ( 1 )
|
||||
{
|
||||
placement = self canplaceriotshield( "raise_riotshield" );
|
||||
if ( placement[ "result" ] && riotshielddistancetest( placement[ "origin" ] ) )
|
||||
{
|
||||
self restoreriotshieldviewmodel();
|
||||
self setplacementhint( 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self specialriotshieldviewmodel();
|
||||
self setplacementhint( 0 );
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
startriotshielddeploy()
|
||||
{
|
||||
self notify( "start_riotshield_deploy" );
|
||||
self thread updateriotshieldplacement();
|
||||
self thread watchriotshielddeploy();
|
||||
}
|
||||
|
||||
spawnriotshieldcover( origin, angles )
|
||||
{
|
||||
shield_ent = spawn( "script_model", origin, 1 );
|
||||
shield_ent.angles = angles;
|
||||
shield_ent setowner( self );
|
||||
shield_ent.owner = self;
|
||||
shield_ent.owner.shield_ent = shield_ent;
|
||||
shield_ent.isriotshield = 1;
|
||||
self.shield_placement = 3;
|
||||
self updateriotshieldmodel();
|
||||
shield_ent setscriptmoverflag( 0 );
|
||||
self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( shield_ent, "destroy_riotshield", 1 );
|
||||
maps/mp/zombies/_zm_equipment::destructible_equipment_list_add( shield_ent );
|
||||
return shield_ent;
|
||||
}
|
||||
|
||||
watchriotshielddeploy()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
self waittill( "deploy_riotshield", deploy_attempt );
|
||||
self restoreriotshieldviewmodel();
|
||||
self setplacementhint( 1 );
|
||||
placement_hint = 0;
|
||||
if ( deploy_attempt )
|
||||
{
|
||||
placement = self canplaceriotshield( "deploy_riotshield" );
|
||||
if ( placement[ "result" ] && riotshielddistancetest( placement[ "origin" ] ) && self check_plant_position( placement[ "origin" ], placement[ "angles" ] ) )
|
||||
{
|
||||
self doriotshielddeploy( placement[ "origin" ], placement[ "angles" ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
placement_hint = 1;
|
||||
clip_max_ammo = weaponclipsize( level.riotshield_name );
|
||||
self setweaponammoclip( level.riotshield_name, clip_max_ammo );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
placement_hint = 1;
|
||||
}
|
||||
if ( placement_hint )
|
||||
{
|
||||
self setriotshieldfailhint();
|
||||
}
|
||||
}
|
||||
|
||||
check_plant_position( origin, angles )
|
||||
{
|
||||
if ( isDefined( level.equipment_safe_to_drop ) )
|
||||
{
|
||||
ret = 1;
|
||||
test_ent = spawn( "script_model", origin );
|
||||
test_ent setmodel( level.deployedshieldmodel[ 0 ] );
|
||||
test_ent.angles = angles;
|
||||
if ( !( self [[ level.equipment_safe_to_drop ]]( test_ent ) ) )
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
test_ent delete();
|
||||
return ret;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
doriotshielddeploy( origin, angles )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
self notify( "deployed_riotshield" );
|
||||
self maps/mp/zombies/_zm_buildables::track_placed_buildables( level.riotshield_name );
|
||||
if ( isDefined( self.current_equipment ) && self.current_equipment == level.riotshield_name )
|
||||
{
|
||||
self maps/mp/zombies/_zm_equipment::equipment_to_deployed( level.riotshield_name );
|
||||
}
|
||||
zoffset = level.riotshield_placement_zoffset;
|
||||
shield_ent = self spawnriotshieldcover( origin + ( 0, 0, zoffset ), angles );
|
||||
item_ent = deployriotshield( self, shield_ent );
|
||||
primaries = self getweaponslistprimaries();
|
||||
/#
|
||||
assert( isDefined( item_ent ) );
|
||||
assert( !isDefined( self.riotshieldretrievetrigger ) );
|
||||
assert( !isDefined( self.riotshieldentity ) );
|
||||
#/
|
||||
self maps/mp/zombies/_zm_weapons::switch_back_primary_weapon( primaries[ 0 ] );
|
||||
if ( isDefined( level.equipment_planted ) )
|
||||
{
|
||||
self [[ level.equipment_planted ]]( shield_ent, level.riotshield_name, self );
|
||||
}
|
||||
if ( isDefined( level.equipment_safe_to_drop ) )
|
||||
{
|
||||
if ( !( self [[ level.equipment_safe_to_drop ]]( shield_ent ) ) )
|
||||
{
|
||||
self notify( "destroy_riotshield" );
|
||||
shield_ent delete();
|
||||
item_ent delete();
|
||||
return;
|
||||
}
|
||||
}
|
||||
self.riotshieldretrievetrigger = item_ent;
|
||||
self.riotshieldentity = shield_ent;
|
||||
self thread watchdeployedriotshieldents();
|
||||
self thread deleteshieldondamage( self.riotshieldentity );
|
||||
self thread deleteshieldmodelonweaponpickup( self.riotshieldretrievetrigger );
|
||||
self thread deleteriotshieldonplayerdeath();
|
||||
self thread watchshieldtriggervisibility( self.riotshieldretrievetrigger );
|
||||
self.riotshieldentity thread watchdeployedriotshielddamage();
|
||||
return shield_ent;
|
||||
}
|
||||
|
||||
riotshielddistancetest( origin )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( origin ) );
|
||||
#/
|
||||
min_dist_squared = getDvarFloat( "riotshield_deploy_limit_radius" );
|
||||
min_dist_squared *= min_dist_squared;
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
if ( isDefined( level.players[ i ].riotshieldentity ) )
|
||||
{
|
||||
dist_squared = distancesquared( level.players[ i ].riotshieldentity.origin, origin );
|
||||
if ( min_dist_squared > dist_squared )
|
||||
{
|
||||
/#
|
||||
println( "Shield placement denied! Failed distance check to other riotshields." );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
watchdeployedriotshieldents()
|
||||
{
|
||||
/#
|
||||
assert( isDefined( self.riotshieldretrievetrigger ) );
|
||||
assert( isDefined( self.riotshieldentity ) );
|
||||
#/
|
||||
riotshieldretrievetrigger = self.riotshieldretrievetrigger;
|
||||
riotshieldentity = self.riotshieldentity;
|
||||
self waittill_any( "destroy_riotshield", "disconnect", "riotshield_zm_taken" );
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self.shield_placement = 0;
|
||||
self updateriotshieldmodel();
|
||||
}
|
||||
if ( isDefined( riotshieldretrievetrigger ) )
|
||||
{
|
||||
riotshieldretrievetrigger delete();
|
||||
}
|
||||
if ( isDefined( riotshieldentity ) )
|
||||
{
|
||||
riotshieldentity delete();
|
||||
}
|
||||
}
|
||||
|
||||
watchdeployedriotshielddamage()
|
||||
{
|
||||
self endon( "death" );
|
||||
damagemax = getDvarInt( "riotshield_deployed_health" );
|
||||
self.damagetaken = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
if ( isDefined( level.players_can_damage_riotshields ) && !level.players_can_damage_riotshields )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( attacker ) || !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/#
|
||||
if ( isDefined( self.owner ) )
|
||||
{
|
||||
assert( isDefined( self.owner.team ) );
|
||||
}
|
||||
#/
|
||||
while ( is_encounter() && attacker.team == self.owner.team && attacker != self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( level.riotshield_damage_callback ) )
|
||||
{
|
||||
self.owner [[ level.riotshield_damage_callback ]]( damage, 0 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type == "MOD_MELEE" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_melee_damage_scale" );
|
||||
}
|
||||
else if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_bullet_damage_scale" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type != "MOD_GRENADE" && type != "MOD_GRENADE_SPLASH" && type != "MOD_EXPLOSIVE" && type != "MOD_EXPLOSIVE_SPLASH" || type == "MOD_PROJECTILE" && type == "MOD_PROJECTILE_SPLASH" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_explosive_damage_scale" );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type == "MOD_IMPACT" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_projectile_damage_scale" );
|
||||
}
|
||||
}
|
||||
}
|
||||
self.damagetaken += damage;
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
self damagethendestroyriotshield();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
damagethendestroyriotshield()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.owner.riotshieldretrievetrigger delete();
|
||||
self notsolid();
|
||||
self setclientflag( 14 );
|
||||
wait getDvarFloat( "riotshield_destroyed_cleanup_time" );
|
||||
self.owner notify( "destroy_riotshield" );
|
||||
}
|
||||
|
||||
deleteshieldondamage( shield_ent )
|
||||
{
|
||||
shield_ent waittill( "death" );
|
||||
self notify( "destroy_riotshield" );
|
||||
}
|
||||
|
||||
deleteshieldmodelonweaponpickup( shield_trigger )
|
||||
{
|
||||
shield_trigger waittill( "trigger", player );
|
||||
self maps/mp/zombies/_zm_equipment::equipment_from_deployed( level.riotshield_name );
|
||||
self notify( "destroy_riotshield" );
|
||||
if ( self != player )
|
||||
{
|
||||
if ( isDefined( level.transferriotshield ) )
|
||||
{
|
||||
[[ level.transferriotshield ]]( self, player );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchshieldtriggervisibility( trigger )
|
||||
{
|
||||
self endon( "death" );
|
||||
trigger endon( "death" );
|
||||
while ( isDefined( trigger ) )
|
||||
{
|
||||
players = get_players();
|
||||
_a759 = players;
|
||||
_k759 = getFirstArrayKey( _a759 );
|
||||
while ( isDefined( _k759 ) )
|
||||
{
|
||||
player = _a759[ _k759 ];
|
||||
pickup = 1;
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.cantransferriotshield ) )
|
||||
{
|
||||
pickup = [[ level.cantransferriotshield ]]( self, player );
|
||||
}
|
||||
if ( !isDefined( trigger ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( pickup )
|
||||
{
|
||||
trigger setvisibletoplayer( player );
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger setinvisibletoplayer( player );
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
_k759 = getNextArrayKey( _a759, _k759 );
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
deleteriotshieldonplayerdeath()
|
||||
{
|
||||
self.riotshieldentity endon( "death" );
|
||||
self waittill( "death" );
|
||||
self notify( "destroy_riotshield" );
|
||||
}
|
308
zm_transit_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc
Normal file
308
zm_transit_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc
Normal 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 );
|
||||
}
|
19
zm_transit_patch/maps/mp/zombies/_zm_weap_bowie.gsc
Normal file
19
zm_transit_patch/maps/mp/zombies/_zm_weap_bowie.gsc
Normal 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" );
|
||||
}
|
482
zm_transit_patch/maps/mp/zombies/_zm_weap_claymore.gsc
Normal file
482
zm_transit_patch/maps/mp/zombies/_zm_weap_claymore.gsc
Normal 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 );
|
||||
}
|
369
zm_transit_patch/maps/mp/zombies/_zm_weap_emp_bomb.gsc
Normal file
369
zm_transit_patch/maps/mp/zombies/_zm_weap_emp_bomb.gsc
Normal file
@ -0,0 +1,369 @@
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_ai_basic;
|
||||
#include maps/mp/zombies/_zm_power;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !emp_bomb_exists() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
set_zombie_var( "emp_stun_range", 600 );
|
||||
set_zombie_var( "emp_stun_time", 20 );
|
||||
set_zombie_var( "emp_perk_off_range", 420 );
|
||||
set_zombie_var( "emp_perk_off_time", 90 );
|
||||
precacheshellshock( "frag_grenade_mp" );
|
||||
/#
|
||||
level.zombiemode_devgui_emp_bomb_give = ::player_give_emp_bomb;
|
||||
#/
|
||||
level thread onplayerconnect();
|
||||
level._equipment_emp_destroy_fx = loadfx( "weapon/emp/fx_emp_explosion_equip" );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread watch_for_grenade_throw();
|
||||
}
|
||||
}
|
||||
|
||||
player_give_emp_bomb()
|
||||
{
|
||||
self giveweapon( "emp_grenade_zm" );
|
||||
self set_player_tactical_grenade( "emp_grenade_zm" );
|
||||
}
|
||||
|
||||
emp_bomb_exists()
|
||||
{
|
||||
return isDefined( level.zombie_weapons[ "emp_grenade_zm" ] );
|
||||
}
|
||||
|
||||
watch_for_grenade_throw()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_fire", grenade, weapname );
|
||||
while ( weapname != "emp_grenade_zm" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
grenade.use_grenade_special_bookmark = 1;
|
||||
grenade.grenade_multiattack_bookmark_count = 1;
|
||||
grenade.owner = self;
|
||||
self thread emp_detonate( grenade );
|
||||
}
|
||||
}
|
||||
|
||||
emp_detonate( grenade )
|
||||
{
|
||||
grenade_owner = undefined;
|
||||
if ( isDefined( grenade.owner ) )
|
||||
{
|
||||
grenade_owner = grenade.owner;
|
||||
}
|
||||
grenade waittill( "explode", grenade_origin );
|
||||
emp_radius = level.zombie_vars[ "emp_perk_off_range" ];
|
||||
emp_time = level.zombie_vars[ "emp_perk_off_time" ];
|
||||
origin = grenade_origin;
|
||||
if ( !isDefined( origin ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level notify( "emp_detonate" );
|
||||
self thread emp_detonate_zombies( grenade_origin, grenade_owner );
|
||||
if ( isDefined( level.custom_emp_detonate ) )
|
||||
{
|
||||
thread [[ level.custom_emp_detonate ]]( grenade_origin );
|
||||
}
|
||||
if ( isDefined( grenade_owner ) )
|
||||
{
|
||||
grenade_owner thread destroyequipment( origin, emp_radius );
|
||||
}
|
||||
players_emped = emp_players( origin, emp_radius );
|
||||
disabled_list = maps/mp/zombies/_zm_power::change_power_in_radius( -1, origin, emp_radius );
|
||||
wait emp_time;
|
||||
maps/mp/zombies/_zm_power::revert_power_to_list( 1, origin, emp_radius, disabled_list );
|
||||
unemp_players( players_emped );
|
||||
}
|
||||
|
||||
emp_detonate_zombies( grenade_origin, grenade_owner )
|
||||
{
|
||||
zombies = get_array_of_closest( grenade_origin, getaispeciesarray( level.zombie_team, "all" ), undefined, undefined, level.zombie_vars[ "emp_stun_range" ] );
|
||||
if ( !isDefined( zombies ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( !isDefined( zombies[ i ] ) || isDefined( zombies[ i ].ignore_inert ) && zombies[ i ].ignore_inert )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
zombies[ i ].becoming_inert = 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
stunned = 0;
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( !isDefined( zombies[ i ] ) || isDefined( zombies[ i ].ignore_inert ) && zombies[ i ].ignore_inert )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
stunned++;
|
||||
zombies[ i ] thread stun_zombie();
|
||||
wait 0,05;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( stunned >= 10 && isDefined( grenade_owner ) )
|
||||
{
|
||||
grenade_owner notify( "the_lights_of_their_eyes" );
|
||||
}
|
||||
}
|
||||
|
||||
stun_zombie()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "stun_zombie" );
|
||||
self endon( "stun_zombie" );
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
/#
|
||||
iprintln( "trying to stun a dead zombie" );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.stun_zombie ) )
|
||||
{
|
||||
self thread [[ self.stun_zombie ]]();
|
||||
return;
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_ai_basic::start_inert();
|
||||
}
|
||||
|
||||
emp_players( origin, radius )
|
||||
{
|
||||
players_emped = [];
|
||||
players = get_players();
|
||||
rsquared = radius * radius;
|
||||
_a192 = players;
|
||||
_k192 = getFirstArrayKey( _a192 );
|
||||
while ( isDefined( _k192 ) )
|
||||
{
|
||||
player = _a192[ _k192 ];
|
||||
if ( isalive( player ) && distancesquared( origin, player.origin ) < rsquared )
|
||||
{
|
||||
player player_emp_on();
|
||||
players_emped[ players_emped.size ] = player;
|
||||
}
|
||||
_k192 = getNextArrayKey( _a192, _k192 );
|
||||
}
|
||||
return players_emped;
|
||||
}
|
||||
|
||||
unemp_players( players_emped )
|
||||
{
|
||||
_a206 = players_emped;
|
||||
_k206 = getFirstArrayKey( _a206 );
|
||||
while ( isDefined( _k206 ) )
|
||||
{
|
||||
player = _a206[ _k206 ];
|
||||
player player_emp_off();
|
||||
_k206 = getNextArrayKey( _a206, _k206 );
|
||||
}
|
||||
}
|
||||
|
||||
player_emp_on()
|
||||
{
|
||||
self.empgrenaded = 1;
|
||||
self setempjammed( 1 );
|
||||
self shellshock( "frag_grenade_mp", 2 );
|
||||
}
|
||||
|
||||
player_emp_off()
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self stopshellshock();
|
||||
self setempjammed( 0 );
|
||||
self.empgrenaded = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
getwatcherforweapon( weapname )
|
||||
{
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.weaponobjectwatcherarray.size )
|
||||
{
|
||||
if ( self.weaponobjectwatcherarray[ i ].weapon != weapname )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return self.weaponobjectwatcherarray[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
destroyequipment( origin, radius )
|
||||
{
|
||||
grenades = getentarray( "grenade", "classname" );
|
||||
rsquared = radius * radius;
|
||||
i = 0;
|
||||
while ( i < grenades.size )
|
||||
{
|
||||
item = grenades[ i ];
|
||||
if ( distancesquared( origin, item.origin ) > rsquared )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( item.name ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( !is_offhand_weapon( item.name ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else watcher = item.owner getwatcherforweapon( item.name );
|
||||
if ( !isDefined( watcher ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
watcher thread waitanddetonate( item, 0, self, "emp_grenade_zm" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
equipment = maps/mp/zombies/_zm_equipment::get_destructible_equipment_list();
|
||||
i = 0;
|
||||
while ( i < equipment.size )
|
||||
{
|
||||
item = equipment[ i ];
|
||||
if ( !isDefined( item ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( distancesquared( origin, item.origin ) > rsquared )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( isDefined( item.isriotshield ) && item.isriotshield )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
waitanddamage( item, 505 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
isempweapon( weaponname )
|
||||
{
|
||||
if ( isDefined( weaponname ) && weaponname != "emp_mp" || weaponname == "emp_grenade_mp" && weaponname == "emp_grenade_zm" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
waitanddetonate( object, delay, attacker, weaponname )
|
||||
{
|
||||
object endon( "death" );
|
||||
object endon( "hacked" );
|
||||
from_emp = isempweapon( weaponname );
|
||||
if ( from_emp )
|
||||
{
|
||||
object.stun_fx = 1;
|
||||
if ( isDefined( level._equipment_emp_destroy_fx ) )
|
||||
{
|
||||
playfx( level._equipment_emp_destroy_fx, object.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) );
|
||||
}
|
||||
delay = 1,1;
|
||||
}
|
||||
if ( delay )
|
||||
{
|
||||
wait delay;
|
||||
}
|
||||
if ( isDefined( object.detonated ) && object.detonated == 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.detonate ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) && isDefined( attacker.pers[ "team" ] ) && isDefined( object.owner ) && isDefined( object.owner.pers[ "team" ] ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( attacker.pers[ "team" ] != object.owner.pers[ "team" ] )
|
||||
{
|
||||
attacker notify( "destroyed_explosive" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( attacker != object.owner )
|
||||
{
|
||||
attacker notify( "destroyed_explosive" );
|
||||
}
|
||||
}
|
||||
}
|
||||
object.detonated = 1;
|
||||
object [[ self.detonate ]]( attacker, weaponname );
|
||||
}
|
||||
|
||||
waitanddamage( object, damage )
|
||||
{
|
||||
object endon( "death" );
|
||||
object endon( "hacked" );
|
||||
object.stun_fx = 1;
|
||||
if ( isDefined( level._equipment_emp_destroy_fx ) )
|
||||
{
|
||||
playfx( level._equipment_emp_destroy_fx, object.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) );
|
||||
}
|
||||
delay = 1,1;
|
||||
if ( delay )
|
||||
{
|
||||
wait delay;
|
||||
}
|
||||
object maps/mp/zombies/_zm_equipment::item_damage( damage );
|
||||
}
|
778
zm_transit_patch/maps/mp/zombies/_zm_weap_riotshield.gsc
Normal file
778
zm_transit_patch/maps/mp/zombies/_zm_weap_riotshield.gsc
Normal file
@ -0,0 +1,778 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/animscripts/zm_death;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/gametypes_zm/_weaponobjects;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
maps/mp/zombies/_zm_riotshield::init();
|
||||
set_zombie_var( "riotshield_cylinder_radius", 360 );
|
||||
set_zombie_var( "riotshield_fling_range", 90 );
|
||||
set_zombie_var( "riotshield_gib_range", 90 );
|
||||
set_zombie_var( "riotshield_gib_damage", 75 );
|
||||
set_zombie_var( "riotshield_knockdown_range", 90 );
|
||||
set_zombie_var( "riotshield_knockdown_damage", 15 );
|
||||
set_zombie_var( "riotshield_hit_points", 2250 );
|
||||
set_zombie_var( "riotshield_fling_damage_shield", 100 );
|
||||
set_zombie_var( "riotshield_knockdown_damage_shield", 15 );
|
||||
level.riotshield_network_choke_count = 0;
|
||||
level.riotshield_gib_refs = [];
|
||||
level.riotshield_gib_refs[ level.riotshield_gib_refs.size ] = "guts";
|
||||
level.riotshield_gib_refs[ level.riotshield_gib_refs.size ] = "right_arm";
|
||||
level.riotshield_gib_refs[ level.riotshield_gib_refs.size ] = "left_arm";
|
||||
level.riotshield_damage_callback = ::player_damage_shield;
|
||||
level.deployed_riotshield_damage_callback = ::deployed_damage_shield;
|
||||
level.transferriotshield = ::transferriotshield;
|
||||
level.cantransferriotshield = ::cantransferriotshield;
|
||||
maps/mp/zombies/_zm_spawner::register_zombie_damage_callback( ::riotshield_zombie_damage_response );
|
||||
maps/mp/zombies/_zm_equipment::register_equipment( "riotshield_zm", &"ZOMBIE_EQUIP_RIOTSHIELD_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_RIOTSHIELD_HOWTO", "riotshield_zm_icon", "riotshield", ::riotshield_activation_watcher_thread, undefined, ::dropshield, ::pickupshield );
|
||||
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "riotshield", &"ZOMBIE_EQUIP_RIOTSHIELD_PICKUP_HINT_STRING" );
|
||||
onplayerconnect_callback( ::onplayerconnect );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
self.player_shield_reset_health = ::player_init_shield_health;
|
||||
self.player_shield_apply_damage = ::player_damage_shield;
|
||||
self.player_shield_reset_location = ::player_init_shield_location;
|
||||
self thread watchriotshielduse();
|
||||
self thread watchriotshieldmelee();
|
||||
self thread player_watch_laststand();
|
||||
}
|
||||
|
||||
dropshield()
|
||||
{
|
||||
self.shield_placement = 0;
|
||||
self maps/mp/zombies/_zm_riotshield::updateriotshieldmodel();
|
||||
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "t6_wpn_zmb_shield_world", "riotshield_zm", self.origin + vectorScale( ( 0, 0, 1 ), 30 ), self.angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.shielddamagetaken = self.shielddamagetaken;
|
||||
item.original_owner = self;
|
||||
item.owner = undefined;
|
||||
item.name = level.riotshield_name;
|
||||
item.isriotshield = 1;
|
||||
item deployed_damage_shield( 0 );
|
||||
item setscriptmoverflag( 0 );
|
||||
item.requires_pickup = 1;
|
||||
item thread watchtoofriendly( self );
|
||||
}
|
||||
self takeweapon( level.riotshield_name );
|
||||
return item;
|
||||
}
|
||||
|
||||
watchtoofriendly( player )
|
||||
{
|
||||
wait 1;
|
||||
if ( isDefined( self ) && isDefined( player ) && distance2dsquared( self.origin, player.origin ) < 36 )
|
||||
{
|
||||
if ( isalive( player ) )
|
||||
{
|
||||
player playlocalsound( level.zmb_laugh_alias );
|
||||
}
|
||||
player maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 );
|
||||
self deployed_damage_shield( 2000 );
|
||||
}
|
||||
}
|
||||
|
||||
pickupshield( item )
|
||||
{
|
||||
item.owner = self;
|
||||
damage = item.shielddamagetaken;
|
||||
damagemax = level.zombie_vars[ "riotshield_hit_points" ];
|
||||
self.shielddamagetaken = damage;
|
||||
self player_set_shield_health( damage, damagemax );
|
||||
}
|
||||
|
||||
placeshield( origin, angles )
|
||||
{
|
||||
if ( self getcurrentweapon() != level.riotshield_name )
|
||||
{
|
||||
self switchtoweapon( level.riotshield_name );
|
||||
self waittill( "weapon_change" );
|
||||
}
|
||||
item = self maps/mp/zombies/_zm_riotshield::doriotshielddeploy( origin, angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.origin = self.origin + vectorScale( ( 0, 0, 1 ), 30 );
|
||||
item.angles = self.angles;
|
||||
item.owner = self;
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
cantransferriotshield( fromplayer, toplayer )
|
||||
{
|
||||
if ( isDefined( toplayer.screecher_weapon ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( toplayer.is_drinking ) && toplayer.is_drinking > 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( toplayer maps/mp/zombies/_zm_laststand::player_is_in_laststand() || toplayer in_revive_trigger() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( toplayer isthrowinggrenade() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( fromplayer == toplayer )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( toplayer is_player_equipment( level.riotshield_name ) && toplayer.shield_placement != 3 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( fromplayer.session_team != toplayer.session_team )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
transferriotshield( fromplayer, toplayer )
|
||||
{
|
||||
damage = fromplayer.shielddamagetaken;
|
||||
toplayer player_take_riotshield();
|
||||
fromplayer player_take_riotshield();
|
||||
toplayer.shielddamagetaken = damage;
|
||||
toplayer.shield_placement = 3;
|
||||
toplayer.shield_damage_level = 0;
|
||||
toplayer maps/mp/zombies/_zm_equipment::equipment_give( "riotshield_zm" );
|
||||
toplayer switchtoweapon( "riotshield_zm" );
|
||||
damagemax = level.zombie_vars[ "riotshield_hit_points" ];
|
||||
toplayer player_set_shield_health( damage, damagemax );
|
||||
}
|
||||
|
||||
player_take_riotshield()
|
||||
{
|
||||
self notify( "destroy_riotshield" );
|
||||
if ( self getcurrentweapon() == "riotshield_zm" )
|
||||
{
|
||||
new_primary = "";
|
||||
if ( isDefined( self.laststand ) && self.laststand )
|
||||
{
|
||||
new_primary = self.laststandpistol;
|
||||
self giveweapon( new_primary );
|
||||
}
|
||||
else
|
||||
{
|
||||
primaryweapons = self getweaponslistprimaries();
|
||||
i = 0;
|
||||
while ( i < primaryweapons.size )
|
||||
{
|
||||
if ( primaryweapons[ i ] != "riotshield_zm" )
|
||||
{
|
||||
new_primary = primaryweapons[ i ];
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( new_primary == "" )
|
||||
{
|
||||
self maps/mp/zombies/_zm_weapons::give_fallback_weapon();
|
||||
new_primary = "zombie_fists_zm";
|
||||
}
|
||||
}
|
||||
self switchtoweaponimmediate( new_primary );
|
||||
self playsound( "wpn_riotshield_zm_destroy" );
|
||||
self waittill( "weapon_change" );
|
||||
}
|
||||
self maps/mp/zombies/_zm_riotshield::removeriotshield();
|
||||
self maps/mp/zombies/_zm_equipment::equipment_take( "riotshield_zm" );
|
||||
self.hasriotshield = 0;
|
||||
self.hasriotshieldequipped = 0;
|
||||
}
|
||||
|
||||
player_watch_laststand()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "entering_last_stand" );
|
||||
if ( self getcurrentweapon() == "riotshield_zm" )
|
||||
{
|
||||
new_primary = self.laststandpistol;
|
||||
self giveweapon( new_primary );
|
||||
self switchtoweaponimmediate( new_primary );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player_init_shield_health()
|
||||
{
|
||||
retval = self.shielddamagetaken > 0;
|
||||
self.shielddamagetaken = 0;
|
||||
self.shield_damage_level = 0;
|
||||
self maps/mp/zombies/_zm_riotshield::updateriotshieldmodel();
|
||||
return retval;
|
||||
}
|
||||
|
||||
player_init_shield_location()
|
||||
{
|
||||
self.hasriotshield = 1;
|
||||
self.hasriotshieldequipped = 0;
|
||||
self.shield_placement = 2;
|
||||
self maps/mp/zombies/_zm_riotshield::updateriotshieldmodel();
|
||||
}
|
||||
|
||||
player_set_shield_health( damage, max_damage )
|
||||
{
|
||||
shieldhealth = int( ( 100 * ( max_damage - damage ) ) / max_damage );
|
||||
if ( shieldhealth >= 50 )
|
||||
{
|
||||
self.shield_damage_level = 0;
|
||||
}
|
||||
else if ( shieldhealth >= 25 )
|
||||
{
|
||||
self.shield_damage_level = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.shield_damage_level = 3;
|
||||
}
|
||||
self maps/mp/zombies/_zm_riotshield::updateriotshieldmodel();
|
||||
}
|
||||
|
||||
deployed_set_shield_health( damage, max_damage )
|
||||
{
|
||||
shieldhealth = int( ( 100 * ( max_damage - damage ) ) / max_damage );
|
||||
if ( shieldhealth >= 50 )
|
||||
{
|
||||
self.shield_damage_level = 0;
|
||||
}
|
||||
else if ( shieldhealth >= 25 )
|
||||
{
|
||||
self.shield_damage_level = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.shield_damage_level = 3;
|
||||
}
|
||||
self maps/mp/zombies/_zm_riotshield::updatestandaloneriotshieldmodel();
|
||||
}
|
||||
|
||||
player_damage_shield( idamage, bheld )
|
||||
{
|
||||
damagemax = level.zombie_vars[ "riotshield_hit_points" ];
|
||||
if ( !isDefined( self.shielddamagetaken ) )
|
||||
{
|
||||
self.shielddamagetaken = 0;
|
||||
}
|
||||
self.shielddamagetaken += idamage;
|
||||
if ( self.shielddamagetaken >= damagemax )
|
||||
{
|
||||
if ( bheld || !isDefined( self.shield_ent ) )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
earthquake( 1, 0,75, self.origin, 100 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.shield_ent ) )
|
||||
{
|
||||
if ( is_true( self.shield_ent.destroy_begun ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.shield_ent.destroy_begun = 1;
|
||||
shield_origin = self.shield_ent.origin;
|
||||
level thread maps/mp/zombies/_zm_equipment::equipment_disappear_fx( shield_origin, level._riotshield_dissapear_fx );
|
||||
wait 1;
|
||||
playsoundatposition( "wpn_riotshield_zm_destroy", shield_origin );
|
||||
}
|
||||
}
|
||||
self thread player_take_riotshield();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( bheld )
|
||||
{
|
||||
self playrumbleonentity( "damage_light" );
|
||||
earthquake( 0,5, 0,5, self.origin, 100 );
|
||||
}
|
||||
self player_set_shield_health( self.shielddamagetaken, damagemax );
|
||||
self playsound( "fly_riotshield_zm_impact_zombies" );
|
||||
}
|
||||
}
|
||||
|
||||
deployed_damage_shield( idamage )
|
||||
{
|
||||
damagemax = level.zombie_vars[ "riotshield_hit_points" ];
|
||||
if ( !isDefined( self.shielddamagetaken ) )
|
||||
{
|
||||
self.shielddamagetaken = 0;
|
||||
}
|
||||
self.shielddamagetaken += idamage;
|
||||
if ( self.shielddamagetaken >= damagemax )
|
||||
{
|
||||
shield_origin = self.origin;
|
||||
if ( isDefined( self.stub ) )
|
||||
{
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.stub );
|
||||
}
|
||||
if ( isDefined( self.original_owner ) )
|
||||
{
|
||||
self.original_owner maps/mp/zombies/_zm_equipment::equipment_take( "riotshield_zm" );
|
||||
}
|
||||
maps/mp/zombies/_zm_equipment::equipment_disappear_fx( shield_origin, level._riotshield_dissapear_fx );
|
||||
playsoundatposition( "wpn_riotshield_zm_destroy", shield_origin );
|
||||
self_delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
self deployed_set_shield_health( self.shielddamagetaken, damagemax );
|
||||
}
|
||||
}
|
||||
|
||||
riotshield_activation_watcher_thread()
|
||||
{
|
||||
self endon( "zombified" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "riotshield_zm_taken" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill_either( "riotshield_zm_activate", "riotshield_zm_deactivate" );
|
||||
}
|
||||
}
|
||||
|
||||
watchriotshielduse()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self.shielddamagetaken = 0;
|
||||
self thread maps/mp/zombies/_zm_riotshield::trackriotshield();
|
||||
self thread maps/mp/zombies/_zm_riotshield::trackequipmentchange();
|
||||
self thread maps/mp/zombies/_zm_riotshield::watchshieldlaststand();
|
||||
self thread trackstuckzombies();
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "raise_riotshield" );
|
||||
self thread maps/mp/zombies/_zm_riotshield::startriotshielddeploy();
|
||||
}
|
||||
}
|
||||
|
||||
watchriotshieldmelee()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "weapon_melee", weapon );
|
||||
if ( weapon == level.riotshield_name )
|
||||
{
|
||||
self riotshield_melee();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is_riotshield_damage( mod, player, amount )
|
||||
{
|
||||
if ( mod == "MOD_MELEE" && player hasweapon( level.riotshield_name ) && amount < 10 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
riotshield_damage( amount )
|
||||
{
|
||||
}
|
||||
|
||||
riotshield_fling_zombie( player, fling_vec, index )
|
||||
{
|
||||
if ( !isDefined( self ) || !isalive( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.ignore_riotshield ) && self.ignore_riotshield )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.riotshield_fling_func ) )
|
||||
{
|
||||
self [[ self.riotshield_fling_func ]]( player );
|
||||
return;
|
||||
}
|
||||
damage = 2500;
|
||||
self dodamage( damage, player.origin, player, player, "", "MOD_IMPACT" );
|
||||
if ( self.health < 1 )
|
||||
{
|
||||
self.riotshield_death = 1;
|
||||
self startragdoll();
|
||||
self launchragdoll( fling_vec );
|
||||
}
|
||||
}
|
||||
|
||||
zombie_knockdown( player, gib )
|
||||
{
|
||||
damage = level.zombie_vars[ "riotshield_knockdown_damage" ];
|
||||
if ( isDefined( level.override_riotshield_damage_func ) )
|
||||
{
|
||||
self [[ level.override_riotshield_damage_func ]]( player, gib );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( gib )
|
||||
{
|
||||
self.a.gib_ref = random( level.riotshield_gib_refs );
|
||||
self thread maps/mp/animscripts/zm_death::do_gib();
|
||||
}
|
||||
self dodamage( damage, player.origin, player );
|
||||
}
|
||||
}
|
||||
|
||||
riotshield_knockdown_zombie( player, gib )
|
||||
{
|
||||
self endon( "death" );
|
||||
playsoundatposition( "vox_riotshield_forcehit", self.origin );
|
||||
playsoundatposition( "wpn_riotshield_proj_impact", self.origin );
|
||||
if ( !isDefined( self ) || !isalive( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.riotshield_knockdown_func ) )
|
||||
{
|
||||
self [[ self.riotshield_knockdown_func ]]( player, gib );
|
||||
}
|
||||
else
|
||||
{
|
||||
self zombie_knockdown( player, gib );
|
||||
}
|
||||
self dodamage( level.zombie_vars[ "riotshield_knockdown_damage" ], player.origin, player );
|
||||
self playsound( "fly_riotshield_forcehit" );
|
||||
}
|
||||
|
||||
riotshield_get_enemies_in_range()
|
||||
{
|
||||
view_pos = self geteye();
|
||||
zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, 2 * level.zombie_vars[ "riotshield_knockdown_range" ] );
|
||||
if ( !isDefined( zombies ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
knockdown_range_squared = level.zombie_vars[ "riotshield_knockdown_range" ] * level.zombie_vars[ "riotshield_knockdown_range" ];
|
||||
gib_range_squared = level.zombie_vars[ "riotshield_gib_range" ] * level.zombie_vars[ "riotshield_gib_range" ];
|
||||
fling_range_squared = level.zombie_vars[ "riotshield_fling_range" ] * level.zombie_vars[ "riotshield_fling_range" ];
|
||||
cylinder_radius_squared = level.zombie_vars[ "riotshield_cylinder_radius" ] * level.zombie_vars[ "riotshield_cylinder_radius" ];
|
||||
forward_view_angles = self getweaponforwarddir();
|
||||
end_pos = view_pos + vectorScale( forward_view_angles, level.zombie_vars[ "riotshield_knockdown_range" ] );
|
||||
/#
|
||||
if ( getDvarInt( #"BF480CE9" ) == 2 )
|
||||
{
|
||||
near_circle_pos = view_pos + vectorScale( forward_view_angles, 2 );
|
||||
circle( near_circle_pos, level.zombie_vars[ "riotshield_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 );
|
||||
line( near_circle_pos, end_pos, ( 0, 0, 1 ), 1, 0, 100 );
|
||||
circle( end_pos, level.zombie_vars[ "riotshield_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 );
|
||||
#/
|
||||
}
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( !isDefined( zombies[ i ] ) || !isalive( zombies[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
test_origin = zombies[ i ] getcentroid();
|
||||
test_range_squared = distancesquared( view_pos, test_origin );
|
||||
if ( test_range_squared > knockdown_range_squared )
|
||||
{
|
||||
zombies[ i ] riotshield_debug_print( "range", ( 0, 0, 1 ) );
|
||||
return;
|
||||
}
|
||||
normal = vectornormalize( test_origin - view_pos );
|
||||
dot = vectordot( forward_view_angles, normal );
|
||||
if ( dot <= 0 )
|
||||
{
|
||||
zombies[ i ] riotshield_debug_print( "dot", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
|
||||
if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
|
||||
{
|
||||
zombies[ i ] riotshield_debug_print( "cylinder", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( zombies[ i ] damageconetrace( view_pos, self ) == 0 )
|
||||
{
|
||||
zombies[ i ] riotshield_debug_print( "cone", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( test_range_squared < fling_range_squared )
|
||||
{
|
||||
level.riotshield_fling_enemies[ level.riotshield_fling_enemies.size ] = zombies[ i ];
|
||||
dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared;
|
||||
fling_vec = vectornormalize( test_origin - view_pos );
|
||||
if ( test_range_squared >= 5000 )
|
||||
{
|
||||
fling_vec += vectornormalize( test_origin - radial_origin );
|
||||
}
|
||||
fling_vec = ( fling_vec[ 0 ], fling_vec[ 1 ], abs( fling_vec[ 2 ] ) );
|
||||
fling_vec = vectorScale( fling_vec, 100 + ( 100 * dist_mult ) );
|
||||
level.riotshield_fling_vecs[ level.riotshield_fling_vecs.size ] = fling_vec;
|
||||
zombies[ i ] riotshield_debug_print( "fling", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.riotshield_knockdown_enemies[ level.riotshield_knockdown_enemies.size ] = zombies[ i ];
|
||||
level.riotshield_knockdown_gib[ level.riotshield_knockdown_gib.size ] = 0;
|
||||
zombies[ i ] riotshield_debug_print( "knockdown", ( 0, 0, 1 ) );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
riotshield_network_choke()
|
||||
{
|
||||
level.riotshield_network_choke_count++;
|
||||
if ( level.riotshield_network_choke_count % 10 )
|
||||
{
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
}
|
||||
}
|
||||
|
||||
riotshield_melee()
|
||||
{
|
||||
if ( !isDefined( level.riotshield_knockdown_enemies ) )
|
||||
{
|
||||
level.riotshield_knockdown_enemies = [];
|
||||
level.riotshield_knockdown_gib = [];
|
||||
level.riotshield_fling_enemies = [];
|
||||
level.riotshield_fling_vecs = [];
|
||||
}
|
||||
self riotshield_get_enemies_in_range();
|
||||
shield_damage = 0;
|
||||
level.riotshield_network_choke_count = 0;
|
||||
i = 0;
|
||||
while ( i < level.riotshield_fling_enemies.size )
|
||||
{
|
||||
riotshield_network_choke();
|
||||
if ( isDefined( level.riotshield_fling_enemies[ i ] ) )
|
||||
{
|
||||
level.riotshield_fling_enemies[ i ] thread riotshield_fling_zombie( self, level.riotshield_fling_vecs[ i ], i );
|
||||
shield_damage += level.zombie_vars[ "riotshield_fling_damage_shield" ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.riotshield_knockdown_enemies.size )
|
||||
{
|
||||
riotshield_network_choke();
|
||||
level.riotshield_knockdown_enemies[ i ] thread riotshield_knockdown_zombie( self, level.riotshield_knockdown_gib[ i ] );
|
||||
shield_damage += level.zombie_vars[ "riotshield_knockdown_damage_shield" ];
|
||||
i++;
|
||||
}
|
||||
level.riotshield_knockdown_enemies = [];
|
||||
level.riotshield_knockdown_gib = [];
|
||||
level.riotshield_fling_enemies = [];
|
||||
level.riotshield_fling_vecs = [];
|
||||
if ( shield_damage )
|
||||
{
|
||||
self player_damage_shield( shield_damage, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
trackstuckzombies()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "deployed_riotshield" );
|
||||
if ( isDefined( self.riotshieldentity ) )
|
||||
{
|
||||
self thread watchstuckzombies();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
attack_shield( shield )
|
||||
{
|
||||
self endon( "death" );
|
||||
shield.owner endon( "death" );
|
||||
shield.owner endon( "disconnect" );
|
||||
shield.owner endon( "start_riotshield_deploy" );
|
||||
shield.owner endon( "destroy_riotshield" );
|
||||
if ( isDefined( self.doing_shield_attack ) && self.doing_shield_attack )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.old_origin = self.origin;
|
||||
if ( getDvar( "zombie_shield_attack_freq" ) == "" )
|
||||
{
|
||||
setdvar( "zombie_shield_attack_freq", "15" );
|
||||
}
|
||||
freq = getDvarInt( "zombie_shield_attack_freq" );
|
||||
self.doing_shield_attack = 1;
|
||||
self.enemyoverride[ 0 ] = shield.origin;
|
||||
self.enemyoverride[ 1 ] = shield;
|
||||
wait ( randomint( 100 ) / 100 );
|
||||
self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "attack", self.animname );
|
||||
attackanim = "zm_riotshield_melee";
|
||||
if ( !self.has_legs )
|
||||
{
|
||||
attackanim += "_crawl";
|
||||
}
|
||||
self orientmode( "face point", shield.origin );
|
||||
self animscripted( self.origin, flat_angle( vectorToAngle( shield.origin - self.origin ) ), attackanim );
|
||||
if ( isDefined( shield.owner.player_shield_apply_damage ) )
|
||||
{
|
||||
shield.owner [[ shield.owner.player_shield_apply_damage ]]( 100, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
shield.owner player_damage_shield( 100, 0 );
|
||||
}
|
||||
self thread attack_shield_stop( shield );
|
||||
wait ( randomint( 100 ) / 100 );
|
||||
self.doing_shield_attack = 0;
|
||||
self orientmode( "face default" );
|
||||
}
|
||||
|
||||
attack_shield_stop( shield )
|
||||
{
|
||||
self notify( "attack_shield_stop" );
|
||||
self endon( "attack_shield_stop" );
|
||||
self endon( "death" );
|
||||
shield waittill( "death" );
|
||||
self stopanimscripted();
|
||||
if ( isDefined( self.doing_shield_attack ) && self.doing_shield_attack )
|
||||
{
|
||||
breachanim = "zm_riotshield_breakthrough";
|
||||
if ( !self.has_legs )
|
||||
{
|
||||
breachanim += "_crawl";
|
||||
}
|
||||
self animscripted( self.origin, flat_angle( self.angles ), breachanim );
|
||||
}
|
||||
}
|
||||
|
||||
window_notetracks( msg, player )
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( msg, notetrack );
|
||||
if ( notetrack == "end" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( notetrack == "fire" )
|
||||
{
|
||||
player player_damage_shield( 100, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchstuckzombies()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
self endon( "destroy_riotshield" );
|
||||
self endon( "deployed_riotshield" );
|
||||
level endon( "intermission" );
|
||||
self.riotshieldentity maps/mp/zombies/_zm_equipment::item_attract_zombies();
|
||||
}
|
||||
|
||||
riotshield_active()
|
||||
{
|
||||
return self maps/mp/zombies/_zm_equipment::is_equipment_active( "riotshield_zm" );
|
||||
}
|
||||
|
||||
riotshield_debug_print( msg, color )
|
||||
{
|
||||
/#
|
||||
if ( !getDvarInt( #"BF480CE9" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( color ) )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
|
||||
#/
|
||||
}
|
||||
|
||||
shield_zombie_attract_func( poi )
|
||||
{
|
||||
}
|
||||
|
||||
shield_zombie_arrive_func( poi )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "zombie_acquire_enemy" );
|
||||
self endon( "path_timer_done" );
|
||||
self waittill( "goal" );
|
||||
if ( isDefined( poi.owner ) )
|
||||
{
|
||||
poi.owner player_damage_shield( 100, 0 );
|
||||
if ( isDefined( poi.owner.player_shield_apply_damage ) )
|
||||
{
|
||||
poi.owner [[ poi.owner.player_shield_apply_damage ]]( 100, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
createriotshieldattractor()
|
||||
{
|
||||
self create_zombie_point_of_interest( 50, 8, 0, 1, ::shield_zombie_attract_func, ::shield_zombie_arrive_func );
|
||||
self thread create_zombie_point_of_interest_attractor_positions( 4, 15, 15 );
|
||||
return get_zombie_point_of_interest( self.origin );
|
||||
}
|
||||
|
||||
riotshield_zombie_damage_response( mod, hit_location, hit_origin, player, amount )
|
||||
{
|
||||
if ( self is_riotshield_damage( mod, player, amount ) )
|
||||
{
|
||||
self riotshield_damage( amount );
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
watchriotshieldattractor()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
self endon( "destroy_riotshield" );
|
||||
self endon( "deployed_riotshield" );
|
||||
poi = self.riotshieldentity createriotshieldattractor();
|
||||
}
|
||||
|
||||
trackriotshieldattractor()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "deployed_riotshield" );
|
||||
self thread watchriotshieldattractor();
|
||||
}
|
||||
}
|
120
zm_transit_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc
Normal file
120
zm_transit_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc
Normal 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 );
|
||||
}
|
||||
}
|
338
zm_transit_patch/maps/mp/zombies/_zm_weapon_locker.gsc
Normal file
338
zm_transit_patch/maps/mp/zombies/_zm_weapon_locker.gsc
Normal file
@ -0,0 +1,338 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
if ( !isDefined( level.weapon_locker_map ) )
|
||||
{
|
||||
level.weapon_locker_map = level.script;
|
||||
}
|
||||
level.weapon_locker_online = sessionmodeisonlinegame();
|
||||
weapon_lockers = getstructarray( "weapons_locker", "targetname" );
|
||||
array_thread( weapon_lockers, ::triggerweaponslockerwatch );
|
||||
}
|
||||
|
||||
wl_has_stored_weapondata()
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
return self has_stored_weapondata( level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
return isDefined( self.stored_weapon_data );
|
||||
}
|
||||
}
|
||||
|
||||
wl_get_stored_weapondata()
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
return self get_stored_weapondata( level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
return self.stored_weapon_data;
|
||||
}
|
||||
}
|
||||
|
||||
wl_clear_stored_weapondata()
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
self clear_stored_weapondata( level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stored_weapon_data = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
wl_set_stored_weapondata( weapondata )
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
self set_stored_weapondata( weapondata, level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stored_weapon_data = weapondata;
|
||||
}
|
||||
}
|
||||
|
||||
triggerweaponslockerwatch()
|
||||
{
|
||||
unitrigger_stub = spawnstruct();
|
||||
unitrigger_stub.origin = self.origin;
|
||||
if ( isDefined( self.script_angles ) )
|
||||
{
|
||||
unitrigger_stub.angles = self.script_angles;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.angles = self.angles;
|
||||
}
|
||||
unitrigger_stub.script_angles = unitrigger_stub.angles;
|
||||
if ( isDefined( self.script_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = self.script_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_length = 16;
|
||||
}
|
||||
if ( isDefined( self.script_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = self.script_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_width = 32;
|
||||
}
|
||||
if ( isDefined( self.script_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = self.script_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_height = 64;
|
||||
}
|
||||
unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length / 2 );
|
||||
unitrigger_stub.targetname = "weapon_locker";
|
||||
unitrigger_stub.cursor_hint = "HINT_NOICON";
|
||||
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
|
||||
unitrigger_stub.clientfieldname = "weapon_locker";
|
||||
maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
|
||||
unitrigger_stub.prompt_and_visibility_func = ::triggerweaponslockerthinkupdateprompt;
|
||||
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::triggerweaponslockerthink );
|
||||
}
|
||||
|
||||
triggerweaponslockerisvalidweapon( weaponname )
|
||||
{
|
||||
weaponname = get_base_weapon_name( weaponname, 1 );
|
||||
if ( !is_weapon_included( weaponname ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
triggerweaponslockerisvalidweaponpromptupdate( player, weaponname )
|
||||
{
|
||||
retrievingweapon = player wl_has_stored_weapondata();
|
||||
if ( !retrievingweapon )
|
||||
{
|
||||
weaponname = player get_nonalternate_weapon( weaponname );
|
||||
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_STORE" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weapondata = player wl_get_stored_weapondata();
|
||||
if ( isDefined( level.remap_weapon_locker_weapons ) )
|
||||
{
|
||||
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
|
||||
}
|
||||
weapontogive = weapondata[ "name" ];
|
||||
primaries = player getweaponslistprimaries();
|
||||
maxweapons = get_player_weapon_limit( player );
|
||||
weaponname = player get_nonalternate_weapon( weaponname );
|
||||
if ( isDefined( primaries ) || primaries.size >= maxweapons && weapontogive == weaponname )
|
||||
{
|
||||
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_GRAB" );
|
||||
}
|
||||
}
|
||||
|
||||
triggerweaponslockerthinkupdateprompt( player )
|
||||
{
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
return 1;
|
||||
}
|
||||
|
||||
triggerweaponslockerthink()
|
||||
{
|
||||
self.parent_player thread triggerweaponslockerweaponchangethink( self );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
retrievingweapon = player wl_has_stored_weapondata();
|
||||
if ( !retrievingweapon )
|
||||
{
|
||||
curweapon = player getcurrentweapon();
|
||||
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
|
||||
while ( !triggerweaponslockerisvalidweapon( curweapon ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
weapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player );
|
||||
player wl_set_stored_weapondata( weapondata );
|
||||
/#
|
||||
assert( curweapon == weapondata[ "name" ], "weapon data does not match" );
|
||||
#/
|
||||
player takeweapon( curweapon );
|
||||
primaries = player getweaponslistprimaries();
|
||||
if ( isDefined( primaries[ 0 ] ) )
|
||||
{
|
||||
player switchtoweapon( primaries[ 0 ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
player maps/mp/zombies/_zm_weapons::give_fallback_weapon();
|
||||
}
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
player playsoundtoplayer( "evt_fridge_locker_close", player );
|
||||
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "weapon_storage" );
|
||||
}
|
||||
else
|
||||
{
|
||||
curweapon = player getcurrentweapon();
|
||||
primaries = player getweaponslistprimaries();
|
||||
weapondata = player wl_get_stored_weapondata();
|
||||
if ( isDefined( level.remap_weapon_locker_weapons ) )
|
||||
{
|
||||
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
|
||||
}
|
||||
weapontogive = weapondata[ "name" ];
|
||||
while ( !triggerweaponslockerisvalidweapon( weapontogive ) )
|
||||
{
|
||||
player playlocalsound( level.zmb_laugh_alias );
|
||||
player wl_clear_stored_weapondata();
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
curweap_base = maps/mp/zombies/_zm_weapons::get_base_weapon_name( curweapon, 1 );
|
||||
weap_base = maps/mp/zombies/_zm_weapons::get_base_weapon_name( weapontogive, 1 );
|
||||
while ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
wait 3;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
maxweapons = get_player_weapon_limit( player );
|
||||
if ( isDefined( primaries ) || primaries.size >= maxweapons && weapontogive == curweapon )
|
||||
{
|
||||
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
|
||||
while ( !triggerweaponslockerisvalidweapon( curweapon ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
wait 3;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
curweapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player );
|
||||
player takeweapon( curweapondata[ "name" ] );
|
||||
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata );
|
||||
player wl_clear_stored_weapondata();
|
||||
player wl_set_stored_weapondata( curweapondata );
|
||||
player switchtoweapon( weapondata[ "name" ] );
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "wall_withdrawl" );
|
||||
player wl_clear_stored_weapondata();
|
||||
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata );
|
||||
player switchtoweapon( weapondata[ "name" ] );
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
level notify( "weapon_locker_grab" );
|
||||
player playsoundtoplayer( "evt_fridge_locker_open", player );
|
||||
}
|
||||
wait 0,5;
|
||||
}
|
||||
}
|
||||
|
||||
triggerweaponslockerweaponchangethink( trigger )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
trigger endon( "kill_trigger" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "weapon_change", newweapon );
|
||||
trigger triggerweaponslockerisvalidweaponpromptupdate( self, newweapon );
|
||||
}
|
||||
}
|
||||
|
||||
add_weapon_locker_mapping( fromweapon, toweapon )
|
||||
{
|
||||
if ( !isDefined( level.remap_weapon_locker_weapons ) )
|
||||
{
|
||||
level.remap_weapon_locker_weapons = [];
|
||||
}
|
||||
level.remap_weapon_locker_weapons[ fromweapon ] = toweapon;
|
||||
}
|
||||
|
||||
remap_weapon( weapondata, maptable )
|
||||
{
|
||||
name = get_base_name( weapondata[ "name" ] );
|
||||
att = get_attachment_name( weapondata[ "name" ] );
|
||||
if ( isDefined( maptable[ name ] ) )
|
||||
{
|
||||
weapondata[ "name" ] = maptable[ name ];
|
||||
name = weapondata[ "name" ];
|
||||
if ( is_weapon_upgraded( name ) )
|
||||
{
|
||||
if ( isDefined( att ) && weapon_supports_attachments( name ) )
|
||||
{
|
||||
base = get_base_weapon_name( name, 1 );
|
||||
if ( !weapon_supports_this_attachment( base, att ) )
|
||||
{
|
||||
att = random_attachment( base );
|
||||
}
|
||||
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( weapon_supports_default_attachment( name ) )
|
||||
{
|
||||
att = default_attachment( name );
|
||||
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return weapondata;
|
||||
}
|
||||
name = weapondata[ "name" ];
|
||||
dw_name = weapondualwieldweaponname( name );
|
||||
alt_name = weaponaltweaponname( name );
|
||||
if ( name != "none" )
|
||||
{
|
||||
weapondata[ "clip" ] = int( min( weapondata[ "clip" ], weaponclipsize( name ) ) );
|
||||
weapondata[ "stock" ] = int( min( weapondata[ "stock" ], weaponmaxammo( name ) ) );
|
||||
}
|
||||
if ( dw_name != "none" )
|
||||
{
|
||||
weapondata[ "lh_clip" ] = int( min( weapondata[ "lh_clip" ], weaponclipsize( dw_name ) ) );
|
||||
}
|
||||
if ( alt_name != "none" )
|
||||
{
|
||||
weapondata[ "alt_clip" ] = int( min( weapondata[ "alt_clip" ], weaponclipsize( alt_name ) ) );
|
||||
weapondata[ "alt_stock" ] = int( min( weapondata[ "alt_stock" ], weaponmaxammo( alt_name ) ) );
|
||||
}
|
||||
weapondata[ "dw_name" ] = dw_name;
|
||||
weapondata[ "alt_name" ] = alt_name;
|
||||
return weapondata;
|
||||
}
|
@ -15,6 +15,54 @@ zm_transit_patch/maps/mp/zombies/_zm_weap_jetgun.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_transit_patch/maps/mp/gametypes_zm/zmeat.gsc
|
||||
zm_transit_patch/maps/mp/gametypes_zm/zstandard.gsc
|
||||
|
||||
zm_transit_patch/maps/mp/zombies/_zm_ai_avogadro.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_ai_screecher.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_banking.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_equip_electrictrap.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_equip_turret.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_game_module_grief.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_game_module_meat.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_game_module_meat_utility.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_game_module_standard.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_game_module_utility.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_melee_weapon.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_riotshield.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weap_ballistic_knife.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weap_bowie.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weap_claymore.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weap_emp_bomb.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weap_riotshield.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weap_tazer_knuckles.gsc
|
||||
zm_transit_patch/maps/mp/zombies/_zm_weapon_locker.gsc
|
||||
|
||||
zm_transit_patch/maps/mp/zm_transit.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_achievement.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_ai_screecher.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_ambush.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_automaton.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_buildables.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_bus.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_cling.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_distance_tracking.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_ffotd.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_fx.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_gamemodes.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_grief_farm.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_grief_station.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_grief_town.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_lava.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_openings.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_power.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_sq.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_standard_farm.gsc
|
||||
zm_transit_patch/maps/mp/zm_transit_standard_town.gsc
|
||||
```
|
||||
|
||||
### notes:
|
||||
```
|
||||
zm_transit_utility.gsc can be recompiled to fix tombstone
|
||||
|
Loading…
x
Reference in New Issue
Block a user