[ZM] Added zm_prison and zm_highrise GSCs

This commit is contained in:
JezuzLizard 2022-03-09 12:30:35 -08:00
parent 8ccce7f949
commit f97389d9da
93 changed files with 39579 additions and 41338 deletions

View File

@ -1,13 +0,0 @@
//checked includes match cerberus output
#include common_scripts/utility;
#include maps/mp/_utility;
init() //checked matches cerberus output
{
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
}
watch_bolt_detonation( owner ) //checked matches cerberus output
{
}

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,14 +1,12 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{
if ( isDefined( self.isdog ) && self.isdog )
{
if ( isdefined( self.isdog ) && self.isdog )
dog_jump_down( 72, 7 );
}
else
{
dosimpletraverse( "jump_down_72" );
}
}

View File

@ -1,14 +1,12 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{
if ( isDefined( self.isdog ) && self.isdog )
{
if ( isdefined( self.isdog ) && self.isdog )
dog_jump_down( 96, 7 );
}
else
{
dosimpletraverse( "jump_down_96" );
}
}

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,5 +1,7 @@
#include maps/mp/animscripts/traverse/zm_shared;
#include maps/mp/animscripts/traverse/shared;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main()
{

View File

@ -1,31 +1,34 @@
#include maps/mp/zombies/_zm_equipment;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_audio_announcer;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/_demo;
#include maps/mp/zombies/_zm_laststand;
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/zombies/_zm;
#include maps/mp/zombies/_zm_game_module_meat_utility;
#include maps/mp/zombies/_zm_powerups;
#include maps/mp/gametypes_zm/zmeat;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\gametypes_zm\zmeat;
#include maps\mp\zombies\_zm_powerups;
#include maps\mp\zombies\_zm_game_module_meat_utility;
#include maps\mp\zombies\_zm;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zombies\_zm_weap_cymbal_monkey;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\_demo;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_audio_announcer;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_equipment;
main()
{
maps/mp/gametypes_zm/_zm_gametype::main();
maps\mp\gametypes_zm\_zm_gametype::main();
level.onprecachegametype = ::onprecachegametype;
level.onstartgametype = ::onstartgametype;
level.custom_spectate_permissions = ::setspectatepermissionsgrief;
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::grief_custom_stat_update;
level._game_module_player_damage_callback = ::maps/mp/gametypes_zm/_zm_gametype::game_module_player_damage_callback;
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::grief_custom_stat_update;
level._game_module_player_damage_callback = maps\mp\gametypes_zm\_zm_gametype::game_module_player_damage_callback;
level.custom_end_screen = ::custom_end_screen;
level.gamemode_map_postinit["zgrief"] = ::postinit_func;
level._supress_survived_screen = 1;
@ -38,13 +41,13 @@ main()
level.game_module_onplayerconnect = ::grief_onplayerconnect;
level.game_mode_spawn_player_logic = ::game_mode_spawn_player_logic;
level.game_mode_custom_onplayerdisconnect = ::grief_onplayerdisconnect;
maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zgrief" );
maps\mp\gametypes_zm\_zm_gametype::post_gametype_main( "zgrief" );
}
grief_onplayerconnect()
{
self thread move_team_icons();
self thread maps/mp/gametypes_zm/zmeat::create_item_meat_watcher();
self thread maps\mp\gametypes_zm\zmeat::create_item_meat_watcher();
self thread zgrief_player_bled_out_msg();
}
@ -64,8 +67,8 @@ setspectatepermissionsgrief()
custom_end_screen()
{
players = get_players();
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
players[i].game_over_hud = newclienthudelem( players[i] );
players[i].game_over_hud.alignx = "center";
@ -81,11 +84,13 @@ custom_end_screen()
players[i].game_over_hud settext( &"ZOMBIE_GAME_OVER" );
players[i].game_over_hud fadeovertime( 1 );
players[i].game_over_hud.alpha = 1;
if ( players[i] issplitscreen() )
{
players[i].game_over_hud.fontscale = 2;
players[i].game_over_hud.y += 40;
}
players[i].survived_hud = newclienthudelem( players[i] );
players[i].survived_hud.alignx = "center";
players[i].survived_hud.aligny = "middle";
@ -97,37 +102,31 @@ custom_end_screen()
players[i].survived_hud.alpha = 0;
players[i].survived_hud.color = ( 1, 1, 1 );
players[i].survived_hud.hidewheninmenu = 1;
if ( players[i] issplitscreen() )
{
players[ i ].survived_hud.fontscale = 1,5;
players[i].survived_hud.fontscale = 1.5;
players[i].survived_hud.y += 40;
}
winner_text = &"ZOMBIE_GRIEF_WIN";
loser_text = &"ZOMBIE_GRIEF_LOSE";
if ( level.round_number < 2 )
{
winner_text = &"ZOMBIE_GRIEF_WIN_SINGLE";
loser_text = &"ZOMBIE_GRIEF_LOSE_SINGLE";
}
if ( isDefined( level.host_ended_game ) && level.host_ended_game )
{
if ( isdefined( level.host_ended_game ) && level.host_ended_game )
players[i].survived_hud settext( &"MP_HOST_ENDED_GAME" );
}
else
{
if ( isDefined( level.gamemodulewinningteam ) && players[ i ]._encounters_team == level.gamemodulewinningteam )
{
else if ( isdefined( level.gamemodulewinningteam ) && players[i]._encounters_team == level.gamemodulewinningteam )
players[i].survived_hud settext( winner_text, level.round_number );
break;
}
else
{
players[i].survived_hud settext( loser_text, level.round_number );
}
}
players[i].survived_hud fadeovertime( 1 );
players[i].survived_hud.alpha = 1;
i++;
}
}
@ -148,7 +147,7 @@ postinit_func()
level._effect["meat_stink_camera"] = loadfx( "maps/zombie/fx_zmb_meat_stink_camera" );
level._effect["meat_stink_torso"] = loadfx( "maps/zombie/fx_zmb_meat_stink_torso" );
include_powerup( "meat_stink" );
maps/mp/zombies/_zm_powerups::add_zombie_powerup( "meat_stink", "t6_wpn_zmb_meat_world", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_meat, 0, 0, 0 );
maps\mp\zombies\_zm_powerups::add_zombie_powerup( "meat_stink", "t6_wpn_zmb_meat_world", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_meat, 0, 0, 0 );
setmatchtalkflag( "DeadChatWithDead", 1 );
setmatchtalkflag( "DeadChatWithTeam", 1 );
setmatchtalkflag( "DeadHearTeamLiving", 1 );
@ -159,29 +158,25 @@ postinit_func()
func_should_drop_meat()
{
if ( minigun_no_drop() )
{
return 0;
}
return 1;
return false;
return true;
}
minigun_no_drop()
{
players = get_players();
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
if ( players[i].ignoreme == 1 )
{
return 1;
return true;
}
i++;
}
if ( isDefined( level.meat_on_ground ) && level.meat_on_ground )
{
return 1;
}
return 0;
if ( isdefined( level.meat_on_ground ) && level.meat_on_ground )
return true;
return false;
}
grief_game_end_check_func()
@ -191,21 +186,19 @@ grief_game_end_check_func()
player_prevent_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
{
if ( isDefined( eattacker ) && isplayer( eattacker ) && self != eattacker && !eattacker hasperk( "specialty_noname" ) && isDefined( self.is_zombie ) && !self.is_zombie )
{
return 1;
}
return 0;
if ( isdefined( eattacker ) && isplayer( eattacker ) && self != eattacker && !eattacker hasperk( "specialty_noname" ) && !( isdefined( self.is_zombie ) && self.is_zombie ) )
return true;
return false;
}
game_module_player_damage_grief_callback( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
{
penalty = 10;
if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker != self && eattacker.team != self.team && smeansofdeath == "MOD_MELEE" )
{
if ( isdefined( eattacker ) && isplayer( eattacker ) && eattacker != self && eattacker.team != self.team && smeansofdeath == "MOD_MELEE" )
self applyknockback( idamage, vdir );
}
}
onprecachegametype()
{
@ -219,9 +212,9 @@ onprecachegametype()
precacheshader( "waypoint_revive_cdc_zm" );
precacheshader( "waypoint_revive_cia_zm" );
level._effect["butterflies"] = loadfx( "maps/zombie/fx_zmb_impact_noharm" );
level thread maps/mp/zombies/_zm_game_module_meat_utility::init_item_meat( "zgrief" );
level thread maps/mp/gametypes_zm/_zm_gametype::init();
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zgrief" );
level thread maps\mp\zombies\_zm_game_module_meat_utility::init_item_meat( "zgrief" );
level thread maps\mp\gametypes_zm\_zm_gametype::init();
maps\mp\gametypes_zm\_zm_gametype::rungametypeprecache( "zgrief" );
}
onstartgametype()
@ -229,34 +222,30 @@ onstartgametype()
level.no_end_game_check = 1;
level._game_module_game_end_check = ::grief_game_end_check_func;
level.round_end_custom_logic = ::grief_round_end_custom_logic;
maps/mp/gametypes_zm/_zm_gametype::setup_classic_gametype();
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zgrief", ::zgrief_main );
maps\mp\gametypes_zm\_zm_gametype::setup_classic_gametype();
maps\mp\gametypes_zm\_zm_gametype::rungametypemain( "zgrief", ::zgrief_main );
}
zgrief_main()
{
level thread maps/mp/zombies/_zm::round_start();
level thread maps/mp/gametypes_zm/_zm_gametype::kill_all_zombies();
level thread maps\mp\zombies\_zm::round_start();
level thread maps\mp\gametypes_zm\_zm_gametype::kill_all_zombies();
flag_wait( "initial_blackscreen_passed" );
level thread maps/mp/zombies/_zm_game_module::wait_for_team_death_and_round_end();
level thread maps\mp\zombies\_zm_game_module::wait_for_team_death_and_round_end();
players = get_players();
_a302 = players;
_k302 = getFirstArrayKey( _a302 );
while ( isDefined( _k302 ) )
{
player = _a302[ _k302 ];
foreach ( player in players )
player.is_hotjoin = 0;
_k302 = getNextArrayKey( _a302, _k302 );
}
wait 1;
playsoundatposition( "vox_zmba_grief_intro_0", ( 1, 1, 1 ) );
playsoundatposition( "vox_zmba_grief_intro_0", ( 0, 0, 0 ) );
}
move_team_icons()
{
self endon( "disconnect" );
flag_wait( "initial_blackscreen_passed" );
wait 0,5;
wait 0.5;
}
kill_start_chest()
@ -264,7 +253,7 @@ kill_start_chest()
flag_wait( "initial_blackscreen_passed" );
wait 2;
start_chest = getstruct( "start_chest", "script_noteworthy" );
start_chest maps/mp/zombies/_zm_magicbox::hide_chest();
start_chest maps\mp\zombies\_zm_magicbox::hide_chest();
}
meat_stink_powerup_grab( powerup, who )
@ -281,21 +270,16 @@ meat_stink( who )
{
weapons = who getweaponslist();
has_meat = 0;
_a353 = weapons;
_k353 = getFirstArrayKey( _a353 );
while ( isDefined( _k353 ) )
foreach ( weapon in weapons )
{
weapon = _a353[ _k353 ];
if ( weapon == "item_meat_zm" )
{
has_meat = 1;
}
_k353 = getNextArrayKey( _a353, _k353 );
}
if ( has_meat )
{
return;
}
who.pre_meat_weapon = who getcurrentweapon();
level notify( "meat_grabbed" );
who notify( "meat_grabbed" );
@ -312,29 +296,30 @@ meat_stink_on_ground( position_to_play )
attractor_point = spawn( "script_model", position_to_play );
attractor_point setmodel( "tag_origin" );
attractor_point playsound( "zmb_land_meat" );
wait 0,2;
wait 0.2;
playfxontag( level._effect["meat_stink_torso"], attractor_point, "tag_origin" );
attractor_point playloopsound( "zmb_meat_flies" );
attractor_point create_zombie_point_of_interest( 1536, 32, 10000 );
attractor_point.attract_to_origin = 1;
attractor_point thread create_zombie_point_of_interest_attractor_positions( 4, 45 );
attractor_point thread maps/mp/zombies/_zm_weap_cymbal_monkey::wait_for_attractor_positions_complete();
attractor_point thread maps\mp\zombies\_zm_weap_cymbal_monkey::wait_for_attractor_positions_complete();
attractor_point delay_thread( 15, ::self_delete );
wait 16;
wait 16.0;
level.meat_on_ground = undefined;
}
meat_bounce_override( pos, normal, ent )
{
if ( isDefined( ent ) && isplayer( ent ) )
if ( isdefined( ent ) && isplayer( ent ) )
{
if ( !ent maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
if ( !ent maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
{
level thread meat_stink_player( ent );
if ( isDefined( self.owner ) )
if ( isdefined( self.owner ) )
{
maps/mp/_demo::bookmark( "zm_player_meat_stink", getTime(), ent, self.owner, 0, self );
self.owner maps/mp/zombies/_zm_stats::increment_client_stat( "contaminations_given" );
maps\mp\_demo::bookmark( "zm_player_meat_stink", gettime(), ent, self.owner, 0, self );
self.owner maps\mp\zombies\_zm_stats::increment_client_stat( "contaminations_given" );
}
}
}
@ -342,52 +327,51 @@ meat_bounce_override( pos, normal, ent )
{
players = getplayers();
closest_player = undefined;
closest_player_dist = 10000;
player_index = 0;
while ( player_index < players.size )
closest_player_dist = 10000.0;
for ( player_index = 0; player_index < players.size; player_index++ )
{
player_to_check = players[player_index];
if ( self.owner == player_to_check )
{
player_index++;
continue;
}
else if ( player_to_check maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{
player_index++;
if ( player_to_check maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
continue;
}
else
{
distsq = distancesquared( pos, player_to_check.origin );
if ( distsq < closest_player_dist )
{
closest_player = player_to_check;
closest_player_dist = distsq;
}
}
player_index++;
}
if ( isDefined( closest_player ) )
if ( isdefined( closest_player ) )
{
level thread meat_stink_player( closest_player );
if ( isDefined( self.owner ) )
if ( isdefined( self.owner ) )
{
maps/mp/_demo::bookmark( "zm_player_meat_stink", getTime(), closest_player, self.owner, 0, self );
self.owner maps/mp/zombies/_zm_stats::increment_client_stat( "contaminations_given" );
maps\mp\_demo::bookmark( "zm_player_meat_stink", gettime(), closest_player, self.owner, 0, self );
self.owner maps\mp\zombies\_zm_stats::increment_client_stat( "contaminations_given" );
}
}
else
{
valid_poi = check_point_in_enabled_zone( pos, undefined, undefined );
if ( valid_poi )
{
self hide();
level thread meat_stink_on_ground( self.origin );
}
}
playfx( level._effect["meat_impact"], self.origin );
}
self delete();
}
@ -397,88 +381,84 @@ meat_stink_player( who )
level endon( "new_meat_stink_player" );
who.ignoreme = 0;
players = get_players();
_a486 = players;
_k486 = getFirstArrayKey( _a486 );
while ( isDefined( _k486 ) )
foreach ( player in players )
{
player = _a486[ _k486 ];
player thread meat_stink_player_cleanup();
if ( player != who )
{
player.ignoreme = 1;
}
_k486 = getNextArrayKey( _a486, _k486 );
}
who thread meat_stink_player_create();
who waittill_any_or_timeout( 30, "disconnect", "player_downed", "bled_out" );
players = get_players();
_a501 = players;
_k501 = getFirstArrayKey( _a501 );
while ( isDefined( _k501 ) )
foreach ( player in players )
{
player = _a501[ _k501 ];
player thread meat_stink_player_cleanup();
player.ignoreme = 0;
_k501 = getNextArrayKey( _a501, _k501 );
}
}
meat_stink_player_create()
{
self maps/mp/zombies/_zm_stats::increment_client_stat( "contaminations_received" );
self maps\mp\zombies\_zm_stats::increment_client_stat( "contaminations_received" );
self endon( "disconnect" );
self endon( "death" );
tagname = "J_SpineLower";
self.meat_stink_3p = spawn( "script_model", self gettagorigin( tagname ) );
self.meat_stink_3p setmodel( "tag_origin" );
self.meat_stink_3p linkto( self, tagname );
wait 0,5;
wait 0.5;
playfxontag( level._effect["meat_stink_torso"], self.meat_stink_3p, "tag_origin" );
self setclientfieldtoplayer( "meat_stink", 1 );
}
meat_stink_player_cleanup()
{
if ( isDefined( self.meat_stink_3p ) )
if ( isdefined( self.meat_stink_3p ) )
{
self.meat_stink_3p unlink();
self.meat_stink_3p delete();
}
self setclientfieldtoplayer( "meat_stink", 0 );
}
door_close_zombie_think()
{
self endon( "death" );
while ( isalive( self ) )
{
if ( isDefined( self.enemy ) && isplayer( self.enemy ) )
if ( isdefined( self.enemy ) && isplayer( self.enemy ) )
{
insamezone = 0;
keys = getarraykeys( level.zones );
i = 0;
while ( i < keys.size )
{
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( keys[ i ] ) && self.enemy maps/mp/zombies/_zm_zonemgr::entity_in_zone( keys[ i ] ) )
for ( i = 0; i < keys.size; i++ )
{
if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( keys[i] ) && self.enemy maps\mp\zombies\_zm_zonemgr::entity_in_zone( keys[i] ) )
insamezone = 1;
}
i++;
}
while ( insamezone )
if ( insamezone )
{
wait 3;
continue;
}
nearestzombienode = getnearestnode( self.origin );
nearestplayernode = getnearestnode( self.enemy.origin );
if ( isDefined( nearestzombienode ) && isDefined( nearestplayernode ) )
if ( isdefined( nearestzombienode ) && isdefined( nearestplayernode ) )
{
if ( !nodesvisible( nearestzombienode, nearestplayernode ) && !nodescanpath( nearestzombienode, nearestplayernode ) )
{
self silentlyremovezombie();
}
}
}
wait 1;
}
}
@ -497,9 +477,11 @@ zgrief_player_bled_out_msg()
{
level endon( "end_game" );
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "bled_out" );
level thread update_players_on_bleedout_or_disconnect( self );
}
}
@ -507,79 +489,84 @@ zgrief_player_bled_out_msg()
show_grief_hud_msg( msg, msg_parm, offset, cleanup_end_game )
{
self endon( "disconnect" );
while ( isdefined( level.hostmigrationtimer ) )
wait 0.05;
zgrief_hudmsg = newclienthudelem( self );
zgrief_hudmsg.alignx = "center";
zgrief_hudmsg.aligny = "middle";
zgrief_hudmsg.horzalign = "center";
zgrief_hudmsg.vertalign = "middle";
zgrief_hudmsg.y -= 130;
if ( self issplitscreen() )
{
zgrief_hudmsg.y += 70;
}
if ( isDefined( offset ) )
{
if ( isdefined( offset ) )
zgrief_hudmsg.y += offset;
}
zgrief_hudmsg.foreground = 1;
zgrief_hudmsg.fontscale = 5;
zgrief_hudmsg.alpha = 0;
zgrief_hudmsg.color = ( 1, 1, 1 );
zgrief_hudmsg.hidewheninmenu = 1;
zgrief_hudmsg.font = "default";
if ( isDefined( cleanup_end_game ) && cleanup_end_game )
if ( isdefined( cleanup_end_game ) && cleanup_end_game )
{
level endon( "end_game" );
zgrief_hudmsg thread show_grief_hud_msg_cleanup();
}
if ( isDefined( msg_parm ) )
{
if ( isdefined( msg_parm ) )
zgrief_hudmsg settext( msg, msg_parm );
}
else
{
zgrief_hudmsg settext( msg );
}
zgrief_hudmsg changefontscaleovertime( 0,25 );
zgrief_hudmsg fadeovertime( 0,25 );
zgrief_hudmsg changefontscaleovertime( 0.25 );
zgrief_hudmsg fadeovertime( 0.25 );
zgrief_hudmsg.alpha = 1;
zgrief_hudmsg.fontscale = 2;
wait 3,25;
wait 3.25;
zgrief_hudmsg changefontscaleovertime( 1 );
zgrief_hudmsg fadeovertime( 1 );
zgrief_hudmsg.alpha = 0;
zgrief_hudmsg.fontscale = 5;
wait 1;
zgrief_hudmsg notify( "death" );
if ( isDefined( zgrief_hudmsg ) )
{
if ( isdefined( zgrief_hudmsg ) )
zgrief_hudmsg destroy();
}
}
show_grief_hud_msg_cleanup()
{
self endon( "death" );
level waittill( "end_game" );
if ( isDefined( self ) )
{
if ( isdefined( self ) )
self destroy();
}
}
grief_reset_message()
{
msg = &"ZOMBIE_GRIEF_RESET";
players = get_players();
_a681 = players;
_k681 = getFirstArrayKey( _a681 );
while ( isDefined( _k681 ) )
if ( isdefined( level.hostmigrationtimer ) )
{
player = _a681[ _k681 ];
player thread show_grief_hud_msg( msg );
_k681 = getNextArrayKey( _a681, _k681 );
while ( isdefined( level.hostmigrationtimer ) )
wait 0.05;
wait 4;
}
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "grief_restarted" );
foreach ( player in players )
player thread show_grief_hud_msg( msg );
level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "grief_restarted" );
}
grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration )
@ -589,140 +576,145 @@ grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweap
self.grief_savedweapon_weaponsammo_clip = [];
self.grief_savedweapon_currentweapon = self getcurrentweapon();
self.grief_savedweapon_grenades = self get_player_lethal_grenade();
if ( isDefined( self.grief_savedweapon_grenades ) )
{
if ( isdefined( self.grief_savedweapon_grenades ) )
self.grief_savedweapon_grenades_clip = self getweaponammoclip( self.grief_savedweapon_grenades );
}
self.grief_savedweapon_tactical = self get_player_tactical_grenade();
if ( isDefined( self.grief_savedweapon_tactical ) )
{
if ( isdefined( self.grief_savedweapon_tactical ) )
self.grief_savedweapon_tactical_clip = self getweaponammoclip( self.grief_savedweapon_tactical );
}
i = 0;
while ( i < self.grief_savedweapon_weapons.size )
for ( i = 0; i < self.grief_savedweapon_weapons.size; i++ )
{
self.grief_savedweapon_weaponsammo_clip[i] = self getweaponammoclip( self.grief_savedweapon_weapons[i] );
self.grief_savedweapon_weaponsammo_stock[i] = self getweaponammostock( self.grief_savedweapon_weapons[i] );
i++;
}
if ( isDefined( self.hasriotshield ) && self.hasriotshield )
{
if ( isdefined( self.hasriotshield ) && self.hasriotshield )
self.grief_hasriotshield = 1;
}
if ( self hasweapon( "claymore_zm" ) )
{
self.grief_savedweapon_claymore = 1;
self.grief_savedweapon_claymore_clip = self getweaponammoclip( "claymore_zm" );
}
if ( isdefined( self.current_equipment ) )
self.grief_savedweapon_equipment = self.current_equipment;
}
grief_laststand_weapons_return()
{
if ( isDefined( level.isresetting_grief ) && !level.isresetting_grief )
if ( !( isdefined( level.isresetting_grief ) && level.isresetting_grief ) )
return false;
if ( !isdefined( self.grief_savedweapon_weapons ) )
return false;
primary_weapons_returned = 0;
foreach ( index, weapon in self.grief_savedweapon_weapons )
{
return 0;
if ( isdefined( self.grief_savedweapon_grenades ) && weapon == self.grief_savedweapon_grenades || isdefined( self.grief_savedweapon_tactical ) && weapon == self.grief_savedweapon_tactical )
continue;
if ( isweaponprimary( weapon ) )
{
if ( primary_weapons_returned >= 2 )
continue;
primary_weapons_returned++;
}
if ( !isDefined( self.grief_savedweapon_weapons ) )
{
return 0;
}
_a742 = self.grief_savedweapon_weapons;
index = getFirstArrayKey( _a742 );
while ( isDefined( index ) )
{
weapon = _a742[ index ];
if ( isDefined( self.grief_savedweapon_grenades ) || weapon == self.grief_savedweapon_grenades && isDefined( self.grief_savedweapon_tactical ) && weapon == self.grief_savedweapon_tactical )
{
}
else
{
self giveweapon( weapon, 0, self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) );
if ( isDefined( self.grief_savedweapon_weaponsammo_clip[ index ] ) )
{
if ( "item_meat_zm" == weapon )
continue;
self giveweapon( weapon, 0, self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( weapon ) );
if ( isdefined( self.grief_savedweapon_weaponsammo_clip[index] ) )
self setweaponammoclip( weapon, self.grief_savedweapon_weaponsammo_clip[index] );
}
if ( isDefined( self.grief_savedweapon_weaponsammo_stock[ index ] ) )
{
if ( isdefined( self.grief_savedweapon_weaponsammo_stock[index] ) )
self setweaponammostock( weapon, self.grief_savedweapon_weaponsammo_stock[index] );
}
}
index = getNextArrayKey( _a742, index );
}
if ( isDefined( self.grief_savedweapon_grenades ) )
if ( isdefined( self.grief_savedweapon_grenades ) )
{
self giveweapon( self.grief_savedweapon_grenades );
if ( isDefined( self.grief_savedweapon_grenades_clip ) )
{
if ( isdefined( self.grief_savedweapon_grenades_clip ) )
self setweaponammoclip( self.grief_savedweapon_grenades, self.grief_savedweapon_grenades_clip );
}
}
if ( isDefined( self.grief_savedweapon_tactical ) )
if ( isdefined( self.grief_savedweapon_tactical ) )
{
self giveweapon( self.grief_savedweapon_tactical );
if ( isDefined( self.grief_savedweapon_tactical_clip ) )
{
if ( isdefined( self.grief_savedweapon_tactical_clip ) )
self setweaponammoclip( self.grief_savedweapon_tactical, self.grief_savedweapon_tactical_clip );
}
if ( isdefined( self.current_equipment ) )
self maps\mp\zombies\_zm_equipment::equipment_take( self.current_equipment );
if ( isdefined( self.grief_savedweapon_equipment ) )
{
self.do_not_display_equipment_pickup_hint = 1;
self maps\mp\zombies\_zm_equipment::equipment_give( self.grief_savedweapon_equipment );
self.do_not_display_equipment_pickup_hint = undefined;
}
if ( isDefined( self.grief_hasriotshield ) && self.grief_hasriotshield )
{
self maps/mp/zombies/_zm_equipment::equipment_give( "riotshield_zm" );
if ( isDefined( self.player_shield_reset_health ) )
if ( isdefined( self.grief_hasriotshield ) && self.grief_hasriotshield )
{
if ( isdefined( self.player_shield_reset_health ) )
self [[ self.player_shield_reset_health ]]();
}
}
if ( isDefined( self.grief_savedweapon_claymore ) && self.grief_savedweapon_claymore )
if ( isdefined( self.grief_savedweapon_claymore ) && self.grief_savedweapon_claymore )
{
self giveweapon( "claymore_zm" );
self set_player_placeable_mine( "claymore_zm" );
self setactionslot( 4, "weapon", "claymore_zm" );
self setweaponammoclip( "claymore_zm", self.grief_savedweapon_claymore_clip );
}
primaries = self getweaponslistprimaries();
_a806 = primaries;
_k806 = getFirstArrayKey( _a806 );
while ( isDefined( _k806 ) )
foreach ( weapon in primaries )
{
weapon = _a806[ _k806 ];
if ( isDefined( self.grief_savedweapon_currentweapon ) && self.grief_savedweapon_currentweapon == weapon )
if ( isdefined( self.grief_savedweapon_currentweapon ) && self.grief_savedweapon_currentweapon == weapon )
{
self switchtoweapon( weapon );
return 1;
return true;
}
_k806 = getNextArrayKey( _a806, _k806 );
}
if ( primaries.size > 0 )
{
self switchtoweapon( primaries[0] );
return 1;
return true;
}
/#
assert( primaries.size > 0, "GRIEF: There was a problem restoring the weapons" );
#/
return 0;
return false;
}
grief_store_player_scores()
{
players = get_players();
_a830 = players;
_k830 = getFirstArrayKey( _a830 );
while ( isDefined( _k830 ) )
{
player = _a830[ _k830 ];
foreach ( player in players )
player._pre_round_score = player.score;
_k830 = getNextArrayKey( _a830, _k830 );
}
}
grief_restore_player_score()
{
if ( !isDefined( self._pre_round_score ) )
{
if ( !isdefined( self._pre_round_score ) )
self._pre_round_score = self.score;
}
if ( isDefined( self._pre_round_score ) )
if ( isdefined( self._pre_round_score ) )
{
self.score = self._pre_round_score;
self.pers["score"] = self._pre_round_score;
@ -731,12 +723,13 @@ grief_restore_player_score()
game_mode_spawn_player_logic()
{
if ( flag( "start_zombie_round_logic" ) && !isDefined( self.is_hotjoin ) )
if ( flag( "start_zombie_round_logic" ) && !isdefined( self.is_hotjoin ) )
{
self.is_hotjoin = 1;
return 1;
return true;
}
return 0;
return false;
}
update_players_on_bleedout_or_disconnect( excluded_player )
@ -744,71 +737,79 @@ update_players_on_bleedout_or_disconnect( excluded_player )
other_team = undefined;
players = get_players();
players_remaining = 0;
_a867 = players;
_k867 = getFirstArrayKey( _a867 );
while ( isDefined( _k867 ) )
foreach ( player in players )
{
player = _a867[ _k867 ];
if ( player == excluded_player )
{
}
else if ( player.team == excluded_player.team )
continue;
if ( player.team == excluded_player.team )
{
if ( is_player_valid( player ) )
{
players_remaining++;
continue;
}
break;
}
_k867 = getNextArrayKey( _a867, _k867 );
}
_a884 = players;
_k884 = getFirstArrayKey( _a884 );
while ( isDefined( _k884 ) )
foreach ( player in players )
{
player = _a884[ _k884 ];
if ( player == excluded_player )
{
}
else if ( player.team != excluded_player.team )
continue;
if ( player.team != excluded_player.team )
{
other_team = player.team;
if ( players_remaining < 1 )
{
player thread show_grief_hud_msg( &"ZOMBIE_ZGRIEF_ALL_PLAYERS_DOWN", undefined, undefined, 1 );
player delay_thread( 2, ::show_grief_hud_msg, &"ZOMBIE_ZGRIEF_SURVIVE", undefined, 30, 1 );
break;
player delay_thread_watch_host_migrate( 2, ::show_grief_hud_msg, &"ZOMBIE_ZGRIEF_SURVIVE", undefined, 30, 1 );
continue;
}
else
{
player thread show_grief_hud_msg( &"ZOMBIE_ZGRIEF_PLAYER_BLED_OUT", players_remaining );
}
}
_k884 = getNextArrayKey( _a884, _k884 );
}
if ( players_remaining == 1 )
{
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "last_player", excluded_player.team );
}
if ( !isDefined( other_team ) )
{
level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "last_player", excluded_player.team );
if ( !isdefined( other_team ) )
return;
}
if ( players_remaining < 1 )
{
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "4_player_down", other_team );
}
level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "4_player_down", other_team );
else
{
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( players_remaining + "_player_left", other_team );
level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( players_remaining + "_player_left", other_team );
}
delay_thread_watch_host_migrate( timer, func, param1, param2, param3, param4, param5, param6 )
{
self thread _delay_thread_watch_host_migrate_proc( func, timer, param1, param2, param3, param4, param5, param6 );
}
_delay_thread_watch_host_migrate_proc( func, timer, param1, param2, param3, param4, param5, param6 )
{
self endon( "death" );
self endon( "disconnect" );
wait( timer );
if ( isdefined( level.hostmigrationtimer ) )
{
while ( isdefined( level.hostmigrationtimer ) )
wait 0.05;
wait( timer );
}
single_thread( self, func, param1, param2, param3, param4, param5, param6 );
}
grief_round_end_custom_logic()
{
waittillframeend;
if ( isDefined( level.gamemodulewinningteam ) )
{
if ( isdefined( level.gamemodulewinningteam ) )
level notify( "end_round_think" );
}
}

View File

@ -1,45 +1,46 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm;
#include maps/mp/zombies/_zm_ai_dogs;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/gametypes_zm/_zm_gametype;
#include common_scripts/utility;
#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include common_scripts\utility;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_ai_dogs;
#include maps\mp\zombies\_zm;
main() //checked matches cerberus output
main()
{
maps/mp/gametypes_zm/_zm_gametype::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" );
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() //checked matches cerberus output
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" );
maps\mp\zombies\_zm_ai_dogs::init();
maps\mp\gametypes_zm\_zm_gametype::rungametypeprecache( "zstandard" );
}
onstartgametype() //checked matches cerberus output
onstartgametype()
{
maps/mp/gametypes_zm/_zm_gametype::setup_classic_gametype();
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zstandard", ::zstandard_main );
maps\mp\gametypes_zm\_zm_gametype::setup_classic_gametype();
maps\mp\gametypes_zm\_zm_gametype::rungametypemain( "zstandard", ::zstandard_main );
}
zstandard_main() //checked matches cerberus output
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();
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();
}

View File

@ -1,11 +1,13 @@
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_audio;
#include maps/mp/_ambientpackage;
#include maps/mp/zm_alcatraz_utility;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\_ambientpackage;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_sidequests;
main()
{
@ -15,36 +17,31 @@ main()
thread sndlastlifesetup();
thread sndsetupendgamemusicstates();
thread sndspectatorsetup();
if ( is_classic() )
{
thread sndmusicegg();
}
}
sndspectatorsetup()
{
flag_wait( "initial_players_connected" );
players = getplayers();
_a31 = players;
_k31 = getFirstArrayKey( _a31 );
while ( isDefined( _k31 ) )
{
player = _a31[ _k31 ];
foreach ( player in players )
player thread sndspectatorafterliferevert();
_k31 = getNextArrayKey( _a31, _k31 );
}
}
sndspectatorafterliferevert()
{
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "spawned_spectator" );
while ( self.sessionstate == "spectator" )
{
wait 1;
}
self clientnotify( "sndSR" );
}
}
@ -52,31 +49,30 @@ sndspectatorafterliferevert()
sndsetupendgamemusicstates()
{
flag_wait( "start_zombie_round_logic" );
level thread maps/mp/zombies/_zm_audio::setupmusicstate( "game_over_final_good", "mus_zombie_game_over_final_good", 1, 0, undefined, "SILENCE" );
level thread maps/mp/zombies/_zm_audio::setupmusicstate( "game_over_final_bad", "mus_zombie_game_over_final_bad", 1, 0, undefined, "SILENCE" );
level thread maps/mp/zombies/_zm_audio::setupmusicstate( "game_over_nomove", "mus_zombie_game_over_nomove", 1, 0, undefined, "SILENCE" );
level thread maps\mp\zombies\_zm_audio::setupmusicstate( "game_over_final_good", "mus_zombie_game_over_final_good", 1, 0, undefined, "SILENCE" );
level thread maps\mp\zombies\_zm_audio::setupmusicstate( "game_over_final_bad", "mus_zombie_game_over_final_bad", 1, 0, undefined, "SILENCE" );
level thread maps\mp\zombies\_zm_audio::setupmusicstate( "game_over_nomove", "mus_zombie_game_over_nomove", 1, 0, undefined, "SILENCE" );
}
sndperksacolajingle( perksacola )
{
if ( !isDefined( self.jingle_is_playing ) )
{
if ( !isdefined( self.jingle_is_playing ) )
self.jingle_is_playing = 0;
}
if ( !isDefined( self.script_sound ) )
{
if ( !isdefined( self.script_sound ) )
return;
}
if ( !isDefined( self.sndent ) )
{
if ( !isdefined( self.sndent ) )
return;
}
if ( self.jingle_is_playing == 0 && level.music_override == 0 )
{
self.jingle_is_playing = 1;
self.sndent stoploopsound( 1 );
self.sndent playsoundwithnotify( self.script_sound, "sndJingleDone" );
self.sndent waittill( "sndJingleDone" );
self.sndent playloopsound( "zmb_perksacola_alcatraz_loop", 1 );
self.jingle_is_playing = 0;
}
@ -87,38 +83,35 @@ sndperksacolaloop()
self endon( "death" );
self.sndent = spawn( "script_origin", self.origin );
self.sndent playloopsound( "zmb_perksacola_alcatraz_loop", 1 );
while ( 1 )
while ( true )
{
wait randomfloatrange( 31, 45 );
wait( randomfloatrange( 31, 45 ) );
if ( randomint( 100 ) < 15 )
{
self thread sndperksacolajingle();
}
}
}
sndeventstingertriggers()
{
flag_wait( "start_zombie_round_logic" );
triggers = getentarray( "sndMusicEventStinger", "targetname" );
_a105 = triggers;
_k105 = getFirstArrayKey( _a105 );
while ( isDefined( _k105 ) )
{
trigger = _a105[ _k105 ];
foreach ( trigger in triggers )
trigger thread sndeventstingertriggerthink();
_k105 = getNextArrayKey( _a105, _k105 );
}
}
sndeventstingertriggerthink()
{
struct = getstruct( self.target, "targetname" );
while ( 1 )
while ( true )
{
self waittill( "trigger" );
playsoundatposition( struct.script_sound, struct.origin );
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "trigger_stinger" );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "trigger_stinger" );
wait 5;
}
}
@ -128,12 +121,14 @@ sndeventtension()
flag_wait( "start_zombie_round_logic" );
wait 30;
struct = spawnstruct();
while ( 1 )
while ( true )
{
tension = sndgettensionlevel( struct );
waittime = tension.waittime;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( tension.tension_level );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( tension.tension_level );
level thread waitfornexttension( waittime );
level waittill( "sndNextTensionEvent" );
}
}
@ -142,34 +137,26 @@ sndgettensionlevel( struct )
{
tension_level = 0;
players = getplayers();
_a148 = players;
_k148 = getFirstArrayKey( _a148 );
while ( isDefined( _k148 ) )
foreach ( player in players )
{
player = _a148[ _k148 ];
if ( is_true( player.laststand ) )
{
tension_level++;
}
_k148 = getNextArrayKey( _a148, _k148 );
}
num_zombs = get_current_zombie_count();
if ( num_zombs >= 12 )
{
tension_level++;
}
enemies = getaispeciesarray( "axis", "all" );
_a161 = enemies;
_k161 = getFirstArrayKey( _a161 );
while ( isDefined( _k161 ) )
foreach ( enemy in enemies )
{
enemy = _a161[ _k161 ];
if ( enemy.animname == "brutus_zombie" )
{
tension_level++;
}
_k161 = getNextArrayKey( _a161, _k161 );
}
if ( tension_level > 2 )
{
struct.tension_level = "tension_high";
@ -180,36 +167,32 @@ sndgettensionlevel( struct )
struct.tension_level = "tension_low";
struct.waittime = 140;
}
return struct;
}
waitfornexttension( time )
{
level endon( "sndNextTensionEvent" );
wait time;
wait( time );
level notify( "sndNextTensionEvent" );
}
sndboardmonitor()
{
while ( 1 )
while ( true )
{
level waittill( "last_board_torn", barrier_origin );
players = getplayers();
_a194 = players;
_k194 = getFirstArrayKey( _a194 );
while ( isDefined( _k194 ) )
foreach ( player in players )
{
player = _a194[ _k194 ];
if ( distancesquared( player.origin, barrier_origin ) <= 22500 )
{
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "boards_gone" );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "boards_gone" );
break;
}
else
{
_k194 = getNextArrayKey( _a194, _k194 );
}
}
}
}
@ -226,39 +209,35 @@ locationstingerwait( zone_name, type )
numcut = 0;
level.sndlastzone = undefined;
level thread sndlocationbetweenroundswait();
for ( ;; )
{
while ( 1 )
while ( true )
{
level waittill( "newzoneActive", activezone );
while ( !sndlocationshouldplay( array, activezone ) )
{
if ( !sndlocationshouldplay( array, activezone ) )
continue;
}
if ( is_true( level.sndroundwait ) )
{
}
}
else while ( is_true( level.sndstinger.isplaying ) )
continue;
else if ( is_true( level.sndstinger.isplaying ) )
{
level thread sndlocationqueue( activezone );
continue;
}
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( activezone );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( activezone );
array = sndcurrentlocationarray( array, activezone, numcut, sndnorepeats );
level.sndlastzone = activezone;
if ( numcut >= sndnorepeats )
{
numcut = 0;
}
else
{
numcut++;
}
level waittill( "between_round_over" );
while ( is_true( level.sndroundwait ) )
{
wait 0,1;
}
wait 0.1;
}
}
@ -279,137 +258,106 @@ sndlocationsarray()
sndlocationshouldplay( array, activezone )
{
shouldplay = 0;
_a280 = array;
_k280 = getFirstArrayKey( _a280 );
while ( isDefined( _k280 ) )
foreach ( place in array )
{
place = _a280[ _k280 ];
if ( place == activezone )
{
shouldplay = 1;
}
_k280 = getNextArrayKey( _a280, _k280 );
}
if ( shouldplay == 0 )
{
return shouldplay;
}
playersinlocal = 0;
players = getplayers();
_a291 = players;
_k291 = getFirstArrayKey( _a291 );
while ( isDefined( _k291 ) )
foreach ( player in players )
{
player = _a291[ _k291 ];
if ( player maps/mp/zombies/_zm_zonemgr::is_player_in_zone( activezone ) )
if ( player maps\mp\zombies\_zm_zonemgr::is_player_in_zone( activezone ) )
{
if ( !is_true( player.afterlife ) )
{
playersinlocal++;
}
}
_k291 = getNextArrayKey( _a291, _k291 );
}
if ( playersinlocal >= 1 )
{
shouldplay = 1;
}
else
{
shouldplay = 0;
}
return shouldplay;
}
sndcurrentlocationarray( current_array, activezone, numcut, max_num_removed )
{
if ( numcut >= max_num_removed )
{
current_array = sndlocationsarray();
}
_a314 = current_array;
_k314 = getFirstArrayKey( _a314 );
while ( isDefined( _k314 ) )
foreach ( place in current_array )
{
place = _a314[ _k314 ];
if ( place == activezone )
{
arrayremovevalue( current_array, place );
break;
}
else
{
_k314 = getNextArrayKey( _a314, _k314 );
}
}
return current_array;
}
sndlocationbetweenrounds()
{
level endon( "newzoneActive" );
activezones = maps/mp/zombies/_zm_zonemgr::get_active_zone_names();
_a331 = activezones;
_k331 = getFirstArrayKey( _a331 );
while ( isDefined( _k331 ) )
{
zone = _a331[ _k331 ];
if ( isDefined( level.sndlastzone ) && zone == level.sndlastzone )
{
}
else
activezones = maps\mp\zombies\_zm_zonemgr::get_active_zone_names();
foreach ( zone in activezones )
{
if ( isdefined( level.sndlastzone ) && zone == level.sndlastzone )
continue;
players = getplayers();
_a337 = players;
_k337 = getFirstArrayKey( _a337 );
while ( isDefined( _k337 ) )
foreach ( player in players )
{
player = _a337[ _k337 ];
if ( is_true( player.afterlife ) )
continue;
if ( player maps\mp\zombies\_zm_zonemgr::is_player_in_zone( zone ) )
{
}
else
{
if ( player maps/mp/zombies/_zm_zonemgr::is_player_in_zone( zone ) )
{
wait 0,1;
level notify( "newzoneActive" );
wait 0.1;
level notify( "newzoneActive", zone );
return;
}
}
_k337 = getNextArrayKey( _a337, _k337 );
}
}
_k331 = getNextArrayKey( _a331, _k331 );
}
}
sndlocationbetweenroundswait()
{
flag_wait( "afterlife_start_over" );
while ( is_true( level.sndroundwait ) )
{
wait 0,1;
}
while ( 1 )
wait 0.1;
while ( true )
{
level thread sndlocationbetweenrounds();
level waittill( "between_round_over" );
while ( is_true( level.sndroundwait ) )
{
wait 0,1;
}
wait 0.1;
}
}
sndlocationqueue( zone )
{
level endon( "newzoneActive" );
while ( is_true( level.sndstinger.isplaying ) )
{
wait 0,5;
}
level notify( "newzoneActive" );
wait 0.5;
level notify( "newzoneActive", zone );
}
sndstingersetup()
@ -421,22 +369,22 @@ sndstingersetup()
level.sndstinger.isplaying = 0;
level.sndstinger.states = [];
level.sndroundwait = 1;
createstingerstate( "door_open", "mus_event_group_03", 2,5, "ignore" );
createstingerstate( "gondola", "mus_event_tension_strings_01", 0,1, "reject" );
createstingerstate( "boards_gone", "mus_event_group_02", 0,5, "ignore" );
createstingerstate( "trigger_stinger", "mus_event_group_02", 0,1, "ignore" );
createstingerstate( "brutus_spawn", "mus_event_brutus_spawn", 1,5, "queue" );
createstingerstate( "brutus_death", "mus_event_brutus_death", 0,1, "ignore" );
createstingerstate( "tension_low", "mus_event_tension_piano_01", 0,75, "reject" );
createstingerstate( "tension_high", "mus_event_tension_piano_02", 0,75, "reject" );
createstingerstate( "zone_cellblock_east", "mus_event_location_cellblock", 0,75, "queue" );
createstingerstate( "zone_infirmary", "mus_event_location_infirmary", 0,75, "queue" );
createstingerstate( "zone_studio", "mus_event_location_powerroom", 0,75, "queue" );
createstingerstate( "zone_roof", "mus_event_location_roof", 0,75, "queue" );
createstingerstate( "cellblock_shower", "mus_event_location_shower", 0,75, "queue" );
createstingerstate( "zone_citadel_stairs", "mus_event_location_stairwell", 0,75, "queue" );
createstingerstate( "zone_dock", "mus_event_location_dock", 0,75, "queue" );
createstingerstate( "zone_warden_office", "mus_event_location_warden", 0,75, "queue" );
createstingerstate( "door_open", "mus_event_group_03", 2.5, "ignore" );
createstingerstate( "gondola", "mus_event_tension_strings_01", 0.1, "reject" );
createstingerstate( "boards_gone", "mus_event_group_02", 0.5, "ignore" );
createstingerstate( "trigger_stinger", "mus_event_group_02", 0.1, "ignore" );
createstingerstate( "brutus_spawn", "mus_event_brutus_spawn", 1.5, "queue" );
createstingerstate( "brutus_death", "mus_event_brutus_death", 0.1, "ignore" );
createstingerstate( "tension_low", "mus_event_tension_piano_01", 0.75, "reject" );
createstingerstate( "tension_high", "mus_event_tension_piano_02", 0.75, "reject" );
createstingerstate( "zone_cellblock_east", "mus_event_location_cellblock", 0.75, "queue" );
createstingerstate( "zone_infirmary", "mus_event_location_infirmary", 0.75, "queue" );
createstingerstate( "zone_studio", "mus_event_location_powerroom", 0.75, "queue" );
createstingerstate( "zone_roof", "mus_event_location_roof", 0.75, "queue" );
createstingerstate( "cellblock_shower", "mus_event_location_shower", 0.75, "queue" );
createstingerstate( "zone_citadel_stairs", "mus_event_location_stairwell", 0.75, "queue" );
createstingerstate( "zone_dock", "mus_event_location_dock", 0.75, "queue" );
createstingerstate( "zone_warden_office", "mus_event_location_warden", 0.75, "queue" );
createstingerstate( "piece_1", "mus_event_piece_1", 0, "queue" );
createstingerstate( "piece_2", "mus_event_piece_2", 0, "queue" );
createstingerstate( "piece_3", "mus_event_piece_3", 0, "queue" );
@ -454,10 +402,10 @@ sndstingersetup()
createstingerstate( "plane_crafted_4", "mus_event_plane_4", 0, "reject" );
createstingerstate( "plane_crafted_5", "mus_event_plane_5", 0, "reject" );
createstingerstate( "trap", "mus_event_trap", 0, "reject" );
createstingerstate( "tomahawk_1", "mus_event_tomahawk_2", 0,5, "ignore" );
createstingerstate( "tomahawk_2", "mus_event_tomahawk_3", 0,5, "ignore" );
createstingerstate( "tomahawk_3", "mus_event_tomahawk_4", 0,5, "ignore" );
createstingerstate( "quest_generic", "mus_event_quest_generic", 0,5, "reject" );
createstingerstate( "tomahawk_1", "mus_event_tomahawk_2", 0.5, "ignore" );
createstingerstate( "tomahawk_2", "mus_event_tomahawk_3", 0.5, "ignore" );
createstingerstate( "tomahawk_3", "mus_event_tomahawk_4", 0.5, "ignore" );
createstingerstate( "quest_generic", "mus_event_quest_generic", 0.5, "reject" );
createstingerstate( "laundry_defend", "mus_laundry_defend", 0, "ignore" );
createstingerstate( "plane_takeoff", "mus_event_plane_takeoff", 0, "ignore" );
createstingerstate( "at_golden_gate", "mus_event_golden_gate", 0, "ignore" );
@ -471,7 +419,8 @@ sndstingersetup()
createstingerstate( state, alias, prewait, interrupt )
{
s = level.sndstinger;
if ( !isDefined( s.states[ state ] ) )
if ( !isdefined( s.states[state] ) )
{
s.states[state] = spawnstruct();
s.states[state].alias = alias;
@ -483,64 +432,55 @@ createstingerstate( state, alias, prewait, interrupt )
sndplaystinger( state, player )
{
s = level.sndstinger;
if ( !isDefined( s.states[ state ] ) )
{
if ( !isdefined( s.states[state] ) )
return;
}
interrupt = s.states[state].interrupt == "ignore";
if ( !is_true( s.isplaying ) || is_true( interrupt ) )
{
if ( interrupt )
{
wait s.states[ state ].prewait;
wait( s.states[state].prewait );
playstinger( state, player, 1 );
}
else if ( !level.sndroundwait )
{
s.isplaying = 1;
wait s.states[ state ].prewait;
wait( s.states[state].prewait );
playstinger( state, player, 0 );
level notify( "sndStingerDone" );
s.isplaying = 0;
}
else
{
if ( s.states[ state ].interrupt == "queue" )
{
else if ( s.states[state].interrupt == "queue" )
level thread sndqueuestinger( state, player );
}
}
return;
}
if ( s.states[state].interrupt == "queue" )
{
level thread sndqueuestinger( state, player );
}
}
playstinger( state, player, ignore )
{
s = level.sndstinger;
if ( !isDefined( s.states[ state ] ) )
{
if ( !isdefined( s.states[state] ) )
return;
}
if ( is_true( level.music_override ) )
{
return;
}
if ( is_true( ignore ) )
{
if ( isDefined( player ) )
{
if ( isdefined( player ) )
player playsoundtoplayer( s.states[state].alias, player );
}
else
{
s.ent playsound( s.states[state].alias );
}
}
else if ( isDefined( player ) )
else if ( isdefined( player ) )
{
player playsoundtoplayer( s.states[state].alias, player );
wait 8;
@ -548,6 +488,7 @@ playstinger( state, player, ignore )
else
{
s.ent playsoundwithnotify( s.states[state].alias, "sndStingerDone" );
s.ent waittill( "sndStingerDone" );
}
}
@ -555,24 +496,21 @@ playstinger( state, player, ignore )
sndqueuestinger( state, player )
{
s = level.sndstinger;
if ( is_true( s.queue ) )
{
return;
}
else
{
s.queue = 1;
while ( 1 )
while ( true )
{
if ( is_true( level.sndroundwait ) || is_true( s.isplaying ) )
{
wait 0,5;
continue;
}
wait 0.5;
else
{
}
break;
}
level thread sndplaystinger( state, player );
s.queue = 0;
}
@ -583,9 +521,11 @@ sndstingerroundwait()
flag_wait( "afterlife_start_over" );
wait 28;
level.sndroundwait = 0;
while ( 1 )
while ( true )
{
level waittill( "end_of_round" );
level notify( "sndStopBrutusLoop" );
level thread sndstingerroundwait_start();
}
@ -594,14 +534,16 @@ sndstingerroundwait()
sndstingerroundwait_start()
{
level.sndroundwait = 1;
wait 0,05;
wait 0.05;
level thread sndstingerroundwait_end();
}
sndstingerroundwait_end()
{
level endon( "end_of_round" );
level waittill( "between_round_over" );
wait 28;
level.sndroundwait = 0;
}
@ -609,31 +551,30 @@ sndstingerroundwait_end()
sndlastlifesetup()
{
flag_wait( "start_zombie_round_logic" );
if ( flag( "solo_game" ) )
{
level thread sndlastlife_solo();
}
else
{
level thread sndlastlife_multi();
}
}
sndlastlife_solo()
{
return;
player = getplayers()[0];
while ( 1 )
while ( true )
{
player waittill( "sndLifeGone" );
if ( player.lives == 0 )
{
while ( is_true( player.afterlife ) )
{
wait 0,1;
}
wait 0.1;
level notify( "sndStopBrutusLoop" );
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "last_life" );
level thread maps\mp\zombies\_zm_audio::change_zombie_music( "last_life" );
level waittill( "end_of_round" );
}
}
@ -644,24 +585,26 @@ sndlastlife_multi()
level endon( "end_of_round" );
level thread sndlastlife_multi_reset();
sndplayersdead = 0;
while ( 1 )
while ( true )
{
level waittill( "bleed_out" );
sndplayersdead++;
players = getplayers();
if ( ( players.size - sndplayersdead ) <= 1 )
if ( players.size - sndplayersdead <= 1 )
{
last_alive = sndlastlife_multi_getlastplayer();
while ( last_alive.lives > 0 )
{
wait 0,1;
}
wait 0.1;
while ( is_true( last_alive.afterlife ) )
{
wait 0,1;
}
wait 0.1;
level notify( "sndStopBrutusLoop" );
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "last_life" );
level thread maps\mp\zombies\_zm_audio::change_zombie_music( "last_life" );
return;
}
}
@ -670,27 +613,22 @@ sndlastlife_multi()
sndlastlife_multi_getlastplayer()
{
level endon( "end_of_round" );
wait 0,5;
wait 0.5;
players = getplayers();
_a645 = players;
_k645 = getFirstArrayKey( _a645 );
while ( isDefined( _k645 ) )
foreach ( dude in players )
{
dude = _a645[ _k645 ];
if ( dude.sessionstate == "spectator" )
{
}
else
{
continue;
return dude;
}
_k645 = getNextArrayKey( _a645, _k645 );
}
}
sndlastlife_multi_reset()
{
level waittill( "end_of_round" );
level thread sndlastlife_multi();
}
@ -702,23 +640,23 @@ sndmusicegg()
origins[2] = ( -1157, 5217, -72 );
level.meteor_counter = 0;
level.music_override = 0;
i = 0;
while ( i < origins.size )
{
for ( i = 0; i < origins.size; i++ )
level thread sndmusicegg_wait( origins[i] );
i++;
}
}
sndmusicegg_wait( bottle_origin )
{
temp_ent = spawn( "script_origin", bottle_origin );
temp_ent playloopsound( "zmb_meteor_loop" );
temp_ent thread maps/mp/zombies/_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override );
temp_ent thread maps\mp\zombies\_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override );
temp_ent waittill( "main_music_egg_hit", player );
temp_ent stoploopsound( 1 );
player playsound( "zmb_meteor_activate" );
level.meteor_counter += 1;
if ( level.meteor_counter == 3 )
{
level thread sndmuseggplay( temp_ent, "mus_zmb_secret_song", 170 );
@ -726,7 +664,7 @@ sndmusicegg_wait( bottle_origin )
}
else
{
wait 1,5;
wait 1.5;
temp_ent delete();
}
}
@ -734,10 +672,9 @@ sndmusicegg_wait( bottle_origin )
sndmusicegg_override()
{
if ( is_true( level.music_override ) )
{
return 0;
}
return 1;
return false;
return true;
}
sndmuseggplay( ent, alias, time )
@ -748,7 +685,7 @@ sndmuseggplay( ent, alias, time )
level thread sndeggmusicwait( time );
level waittill_either( "end_game", "sndSongDone" );
ent stopsounds();
wait 0,05;
wait 0.05;
ent delete();
level.music_override = 0;
}
@ -756,6 +693,6 @@ sndmuseggplay( ent, alias, time )
sndeggmusicwait( time )
{
level endon( "end_game" );
wait time;
wait( time );
level notify( "sndSongDone" );
}

View File

@ -1,69 +1,71 @@
//checked includes changed to match cerberus output
#include maps/mp/zm_prison_sq_wth;
#include maps/mp/zm_prison_sq_fc;
#include maps/mp/zm_prison_sq_final;
#include maps/mp/zombies/_zm_powerups;
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zm_alcatraz_travel;
#include maps/mp/zm_alcatraz_traps;
#include maps/mp/zm_prison;
#include maps/mp/zm_alcatraz_sq;
#include maps/mp/zm_prison_sq_bg;
#include maps/mp/zm_prison_spoon;
#include maps/mp/zm_prison_achievement;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/zombies/_zm_afterlife;
#include maps/mp/zombies/_zm_ai_brutus;
#include maps/mp/zm_alcatraz_craftables;
#include maps/mp/zombies/_zm_craftables;
#include maps/mp/zm_alcatraz_utility;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\zombies\_zm_craftables;
#include maps\mp\zm_alcatraz_craftables;
#include maps\mp\zombies\_zm_ai_brutus;
#include maps\mp\zombies\_zm_afterlife;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\zm_prison_achievement;
#include maps\mp\zm_prison_spoon;
#include maps\mp\zm_prison_sq_bg;
#include maps\mp\zm_alcatraz_sq;
#include maps\mp\zm_prison;
#include maps\mp\zm_alcatraz_traps;
#include maps\mp\zm_alcatraz_travel;
#include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zombies\_zm_powerups;
#include maps\mp\zm_prison_sq_final;
#include maps\mp\zm_prison_sq_fc;
#include maps\mp\zm_prison_sq_wth;
precache() //checked matches cerberus output
{
if ( isDefined( level.createfx_enabled ) && level.createfx_enabled )
precache()
{
if ( isdefined( level.createfx_enabled ) && level.createfx_enabled )
return;
}
maps/mp/zombies/_zm_craftables::init();
maps/mp/zm_alcatraz_craftables::include_craftables();
maps/mp/zm_alcatraz_craftables::init_craftables();
maps/mp/zombies/_zm_ai_brutus::precache();
maps/mp/zombies/_zm_afterlife::init();
maps\mp\zombies\_zm_craftables::init();
maps\mp\zm_alcatraz_craftables::include_craftables();
maps\mp\zm_alcatraz_craftables::init_craftables();
maps\mp\zombies\_zm_ai_brutus::precache();
maps\mp\zombies\_zm_afterlife::init();
precacheshader( "waypoint_kill_red" );
level._effect["powerup_on"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_powerup" );
}
main() //checked changed to match cerberus output
main()
{
level thread sq_main_controller();
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "zclassic" );
maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index );
maps/mp/zombies/_zm_ai_brutus::init();
level thread maps/mp/zombies/_zm_craftables::think_craftables();
maps/mp/zm_prison_achievement::init();
level thread maps/mp/zm_prison_spoon::init();
level thread maps/mp/zm_prison_sq_bg::init();
maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "zclassic" );
maps\mp\zombies\_zm_game_module::set_current_game_module( level.game_module_standard_index );
maps\mp\zombies\_zm_ai_brutus::init();
level thread maps\mp\zombies\_zm_craftables::think_craftables();
maps\mp\zm_prison_achievement::init();
level thread maps\mp\zm_prison_spoon::init();
level thread maps\mp\zm_prison_sq_bg::init();
a_grief_clips = getentarray( "grief_clips", "targetname" );
foreach ( clip in a_grief_clips )
{
clip connectpaths();
clip delete();
}
level thread give_afterlife();
level thread maps/mp/zm_alcatraz_sq::start_alcatraz_sidequest();
level thread maps\mp\zm_alcatraz_sq::start_alcatraz_sidequest();
onplayerconnect_callback( ::player_quest_vfx );
flag_wait( "initial_blackscreen_passed" );
level notify( "Pack_A_Punch_on" );
flag_wait( "start_zombie_round_logic" );
level thread maps/mp/zm_prison::delete_perk_machine_clip();
level thread maps/mp/zm_alcatraz_traps::init_fan_trap_trigs();
level thread maps/mp/zm_alcatraz_traps::init_acid_trap_trigs();
level thread maps/mp/zm_alcatraz_traps::init_tower_trap_trigs();
level thread maps/mp/zm_alcatraz_travel::init_alcatraz_zipline();
level thread maps\mp\zm_prison::delete_perk_machine_clip();
level thread maps\mp\zm_alcatraz_traps::init_fan_trap_trigs();
level thread maps\mp\zm_alcatraz_traps::init_acid_trap_trigs();
level thread maps\mp\zm_alcatraz_traps::init_tower_trap_trigs();
level thread maps\mp\zm_alcatraz_travel::init_alcatraz_zipline();
level thread power_on_perk_machines();
level thread afterlife_powerups();
level thread afterlife_intro_door();
@ -72,24 +74,25 @@ main() //checked changed to match cerberus output
level thread blundergat_upgrade_station();
}
zm_treasure_chest_init() //checked matches cerberus output
zm_treasure_chest_init()
{
chest1 = getstruct( "start_chest", "script_noteworthy" );
level.chests = [];
level.chests[level.chests.size] = chest1;
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" );
maps\mp\zombies\_zm_magicbox::treasure_chest_init( "start_chest" );
}
give_afterlife() //checked changed to match cerberus output
give_afterlife()
{
onplayerconnect_callback( maps/mp/zombies/_zm_afterlife::init_player );
onplayerconnect_callback( maps\mp\zombies\_zm_afterlife::init_player );
flag_wait( "initial_players_connected" );
wait 0.5;
n_start_pos = 1;
a_players = getplayers();
foreach ( player in a_players )
{
if ( isDefined( player.afterlife ) && !player.afterlife )
if ( isdefined( player.afterlife ) && !player.afterlife )
{
player thread fake_kill_player( n_start_pos );
n_start_pos++;
@ -97,26 +100,28 @@ give_afterlife() //checked changed to match cerberus output
}
}
fake_kill_player( n_start_pos ) //checked changed to match cerberus output
fake_kill_player( n_start_pos )
{
self afterlife_remove();
self.afterlife = 1;
self thread afterlife_laststand();
self waittill( "player_fake_corpse_created" );
self thread afterlife_tutorial();
e_corpse_location = getstruct( "corpse_starting_point_" + n_start_pos, "targetname" );
trace_start = e_corpse_location.origin;
trace_end = e_corpse_location.origin + vectorScale( ( 0, 0, -1 ), 100 );
corpse_trace = physicstrace( trace_start, trace_end, vectorScale( ( -1, -1, 0 ), 10 ), vectorScale( ( 1, 1, 0 ), 10 ), self.e_afterlife_corpse );
trace_end = e_corpse_location.origin + vectorscale( ( 0, 0, -1 ), 100.0 );
corpse_trace = physicstrace( trace_start, trace_end, vectorscale( ( -1, -1, 0 ), 10.0 ), vectorscale( ( 1, 1, 0 ), 10.0 ), self.e_afterlife_corpse );
self.e_afterlife_corpse.origin = corpse_trace["position"];
vec_to_target = self.e_afterlife_corpse.origin - self.origin;
vec_to_target = vectorToAngles( vec_to_target );
vec_to_target = vectortoangles( vec_to_target );
vec_to_target = ( 0, vec_to_target[1], 0 );
self setplayerangles( vec_to_target );
self notify( "al_all_setup" );
}
afterlife_tutorial() //checked matches cerberus output
afterlife_tutorial()
{
self endon( "disconnect" );
level endon( "end_game" );
@ -127,7 +132,8 @@ afterlife_tutorial() //checked matches cerberus output
waittill_notify_or_timeout( "stop_tutorial", 5 );
self thread destroy_tutorial_message();
wait 1;
if ( isDefined( self.afterlife ) && self.afterlife )
if ( isdefined( self.afterlife ) && self.afterlife )
{
self create_tutorial_message( &"ZM_PRISON_AFTERLIFE_HOWTO_2" );
self thread afterlife_tutorial_jump_watch();
@ -136,105 +142,109 @@ afterlife_tutorial() //checked matches cerberus output
}
}
afterlife_tutorial_attack_watch() //checked matches cerberus output
afterlife_tutorial_attack_watch()
{
self endon( "stop_tutorial" );
self endon( "disconnect" );
while ( isDefined( self.afterlife ) && self.afterlife && !self isfiring() )
{
while ( isdefined( self.afterlife ) && self.afterlife && !self isfiring() )
wait 0.05;
}
wait 0.2;
self notify( "stop_tutorial" );
}
afterlife_tutorial_jump_watch() //checked matches cerberus output
afterlife_tutorial_jump_watch()
{
self endon( "stop_tutorial" );
self endon( "disconnect" );
while ( isDefined( self.afterlife ) && self.afterlife && !self is_jumping() )
{
while ( isdefined( self.afterlife ) && self.afterlife && !self is_jumping() )
wait 0.05;
}
wait 0.2;
self notify( "stop_tutorial" );
}
afterlife_powerups() //checked matches cerberus output
afterlife_powerups()
{
level._powerup_grab_check = ::cell_grab_check;
s_powerup_loc = getstruct( "powerup_start", "targetname" );
spawn_infinite_powerup_drop( s_powerup_loc.origin, "double_points" );
s_powerup_loc = getstruct( "powerup_cell_1", "targetname" );
if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
{
if ( isdefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
spawn_infinite_powerup_drop( s_powerup_loc.origin, "double_points" );
}
else
{
spawn_infinite_powerup_drop( s_powerup_loc.origin, "insta_kill" );
}
s_powerup_loc = getstruct( "powerup_cell_2", "targetname" );
if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
{
if ( isdefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
spawn_infinite_powerup_drop( s_powerup_loc.origin, "double_points" );
}
else
{
spawn_infinite_powerup_drop( s_powerup_loc.origin, "full_ammo" );
}
}
cell_grab_check( player ) //checked matches cerberus output
cell_grab_check( player )
{
cell_powerup = getstruct( "powerup_start", "targetname" );
if ( self.origin == ( cell_powerup.origin + vectorScale( ( 0, 0, 1 ), 40 ) ) )
if ( self.origin == cell_powerup.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) )
{
m_door = getent( "powerup_door", "targetname" );
if ( !isDefined( m_door.opened ) )
{
return 0;
}
}
cell_powerup = getstruct( "powerup_cell_1", "targetname" );
if ( self.origin == ( cell_powerup.origin + vectorScale( ( 0, 0, 1 ), 40 ) ) )
{
m_door = getent( "powerup_cell_door_1", "targetname" );
if ( !isDefined( m_door.opened ) )
{
return 0;
}
}
cell_powerup = getstruct( "powerup_cell_2", "targetname" );
if ( self.origin == ( cell_powerup.origin + vectorScale( ( 0, 0, 1 ), 40 ) ) )
{
m_door = getent( "powerup_cell_door_2", "targetname" );
if ( !isDefined( m_door.opened ) )
{
return 0;
}
}
return 1;
if ( !isdefined( m_door.opened ) )
return false;
}
afterlife_intro_door() //checked matches cerberus output
cell_powerup = getstruct( "powerup_cell_1", "targetname" );
if ( self.origin == cell_powerup.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) )
{
m_door = getent( "powerup_cell_door_1", "targetname" );
if ( !isdefined( m_door.opened ) )
return false;
}
cell_powerup = getstruct( "powerup_cell_2", "targetname" );
if ( self.origin == cell_powerup.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) )
{
m_door = getent( "powerup_cell_door_2", "targetname" );
if ( !isdefined( m_door.opened ) )
return false;
}
return true;
}
afterlife_intro_door()
{
m_door = getent( "powerup_door", "targetname" );
level waittill( "intro_powerup_activate" );
wait 1;
array_delete( getentarray( "wires_cell_dblock", "script_noteworthy" ) );
m_door.opened = 1;
m_door movex( 34, 2, 1 );
m_door playsound( "zmb_jail_door" );
level waittill( "intro_powerup_restored" );
s_powerup_loc = getstruct( "powerup_start", "targetname" );
spawn_infinite_powerup_drop( s_powerup_loc.origin );
}
afterlife_cell_door_1() //checked matches cerberus output
afterlife_cell_door_1()
{
m_door = getent( "powerup_cell_door_1", "targetname" );
level waittill( "cell_1_powerup_activate" );
wait 1;
array_delete( getentarray( "wires_cell_cafeteria", "script_noteworthy" ) );
m_door.opened = 1;
@ -242,10 +252,12 @@ afterlife_cell_door_1() //checked matches cerberus output
m_door playsound( "zmb_jail_door" );
}
afterlife_cell_door_2() //checked matches cerberus output
afterlife_cell_door_2()
{
m_door = getent( "powerup_cell_door_2", "targetname" );
level waittill( "cell_2_powerup_activate" );
wait 1;
array_delete( getentarray( "wires_cell_michigan", "script_noteworthy" ) );
m_door.opened = 1;
@ -253,52 +265,50 @@ afterlife_cell_door_2() //checked matches cerberus output
m_door playsound( "zmb_jail_door" );
}
spawn_infinite_powerup_drop( v_origin, str_type ) //checked matches cerberus output
spawn_infinite_powerup_drop( v_origin, str_type )
{
level._powerup_timeout_override = ::powerup_infinite_time;
if ( isDefined( str_type ) )
{
intro_powerup = maps/mp/zombies/_zm_powerups::specific_powerup_drop( str_type, v_origin );
}
if ( isdefined( str_type ) )
intro_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( str_type, v_origin );
else
{
intro_powerup = maps/mp/zombies/_zm_powerups::powerup_drop( v_origin );
}
intro_powerup = maps\mp\zombies\_zm_powerups::powerup_drop( v_origin );
level._powerup_timeout_override = undefined;
}
powerup_infinite_time() //checked matches cerberus output
powerup_infinite_time()
{
}
power_on_perk_machines() //checked changed to match cerberus output
power_on_perk_machines()
{
level waittill_any( "unlock_all_perk_machines", "open_sesame" );
a_shockboxes = getentarray( "perk_afterlife_trigger", "script_noteworthy" );
foreach ( e_shockbox in a_shockboxes )
{
e_shockbox notify( "damage" );
e_shockbox notify( "damage", 1, level );
wait 1;
}
}
sq_main_controller() //checked matches cerberus output
sq_main_controller()
{
precacheshader( "zm_al_wth_zombie" );
onplayerconnect_callback( maps/mp/zm_prison_sq_final::onplayerconnect_sq_final );
level thread maps/mp/zm_prison_sq_final::stage_one();
onplayerconnect_callback( maps/mp/zm_prison_sq_fc::onplayerconnect_sq_fc );
level thread maps/mp/zm_prison_sq_fc::watch_for_trigger_condition();
onplayerconnect_callback( maps/mp/zm_prison_sq_wth::onplayerconnect_sq_wth );
onplayerconnect_callback( maps\mp\zm_prison_sq_final::onplayerconnect_sq_final );
level thread maps\mp\zm_prison_sq_final::stage_one();
onplayerconnect_callback( maps\mp\zm_prison_sq_fc::onplayerconnect_sq_fc );
level thread maps\mp\zm_prison_sq_fc::watch_for_trigger_condition();
onplayerconnect_callback( maps\mp\zm_prison_sq_wth::onplayerconnect_sq_wth );
}
player_quest_vfx() //checked matches cerberus output
player_quest_vfx()
{
flag_wait( "initial_blackscreen_passed" );
wait 1;
if ( !flag( "generator_challenge_completed" ) )
{
exploder( 2000 );
}
}

View File

@ -1,13 +1,15 @@
#include maps/mp/zm_alcatraz_travel;
#include maps/mp/zm_alcatraz_sq_vo;
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_unitrigger;
#include maps/mp/zombies/_zm_craftables;
#include maps/mp/zm_alcatraz_utility;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\zombies\_zm_craftables;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zm_alcatraz_sq_vo;
#include maps\mp\zm_alcatraz_travel;
init_craftables()
{
@ -16,10 +18,10 @@ init_craftables()
register_clientfields();
add_zombie_craftable( "alcatraz_shield_zm", &"ZM_PRISON_CRAFT_RIOT", undefined, &"ZOMBIE_BOUGHT_RIOT", undefined, 1 );
add_zombie_craftable_vox_category( "alcatraz_shield_zm", "build_zs" );
make_zombie_craftable_open( "alcatraz_shield_zm", "t6_wpn_zmb_shield_dlc2_dmg0_world", vectorScale( ( 0, 0, 0 ), 90 ), ( 0, 0, level.riotshield_placement_zoffset ) );
make_zombie_craftable_open( "alcatraz_shield_zm", "t6_wpn_zmb_shield_dlc2_dmg0_world", vectorscale( ( 0, -1, 0 ), 90.0 ), ( 0, 0, level.riotshield_placement_zoffset ) );
add_zombie_craftable( "packasplat", &"ZM_PRISON_CRAFT_PACKASPLAT", undefined, undefined, ::onfullycrafted_packasplat, 1 );
add_zombie_craftable_vox_category( "packasplat", "build_bsm" );
make_zombie_craftable_open( "packasplat", "p6_anim_zm_al_packasplat", vectorScale( ( 0, 0, 0 ), 90 ) );
make_zombie_craftable_open( "packasplat", "p6_anim_zm_al_packasplat", vectorscale( ( 0, -1, 0 ), 90.0 ) );
level.craftable_piece_swap_allowed = 0;
add_zombie_craftable( "quest_key1" );
add_zombie_craftable( "plane", &"ZM_PRISON_CRAFT_PLANE", &"ZM_PRISON_CRAFTING_PLANE", undefined, ::onfullycrafted_plane );
@ -33,7 +35,7 @@ include_key_craftable( craftable_name, model_name )
part = spawnstruct();
part.name = craftable_name;
part add_craftable_piece( part_key );
part.triggerthink = ::maps/mp/zombies/_zm_craftables::setup_craftable_pieces;
part.triggerthink = maps\mp\zombies\_zm_craftables::setup_craftable_pieces;
include_craftable( part );
}
@ -70,6 +72,7 @@ include_craftables()
plane_engine = generate_zombie_craftable_piece( craftable_name, "engine", "veh_t6_dlc_zombie_part_engine", 32, 62, 0, undefined, ::onpickup_plane, ::ondrop_plane, ::oncrafted_plane, undefined, "tag_origin", undefined, 3 );
plane_steering = generate_zombie_craftable_piece( craftable_name, "steering", "veh_t6_dlc_zombie_part_control", 32, 15, 0, undefined, ::onpickup_plane, ::ondrop_plane, ::oncrafted_plane, undefined, "tag_control_mechanism", undefined, 4 );
plane_rigging = generate_zombie_craftable_piece( craftable_name, "rigging", "veh_t6_dlc_zombie_part_rigging", 32, 15, 0, undefined, ::onpickup_plane, ::ondrop_plane, ::oncrafted_plane, undefined, "tag_origin", undefined, 5 );
if ( level.is_forever_solo_game )
{
plane_cloth.is_shared = 1;
@ -83,6 +86,7 @@ include_craftables()
plane_steering.client_field_state = undefined;
plane_rigging.client_field_state = undefined;
}
plane_cloth.pickup_alias = "sidequest_sheets";
plane_fueltanks.pickup_alias = "sidequest_oxygen";
plane_engine.pickup_alias = "sidequest_engine";
@ -104,6 +108,7 @@ include_craftables()
refuelable_plane_gas3 = generate_zombie_craftable_piece( craftable_name, "fuel3", "accessories_gas_canister_1", 32, 15, 0, undefined, ::onpickup_fuel, ::ondrop_fuel, ::oncrafted_fuel, undefined, undefined, undefined, 8 );
refuelable_plane_gas4 = generate_zombie_craftable_piece( craftable_name, "fuel4", "accessories_gas_canister_1", 32, 15, 0, undefined, ::onpickup_fuel, ::ondrop_fuel, ::oncrafted_fuel, undefined, undefined, undefined, 9 );
refuelable_plane_gas5 = generate_zombie_craftable_piece( craftable_name, "fuel5", "accessories_gas_canister_1", 32, 15, 0, undefined, ::onpickup_fuel, ::ondrop_fuel, ::oncrafted_fuel, undefined, undefined, undefined, 10 );
if ( level.is_forever_solo_game )
{
refuelable_plane_gas1.is_shared = 1;
@ -117,6 +122,7 @@ include_craftables()
refuelable_plane_gas4.client_field_state = undefined;
refuelable_plane_gas5.client_field_state = undefined;
}
refuelable_plane = spawnstruct();
refuelable_plane.name = craftable_name;
refuelable_plane add_craftable_piece( refuelable_plane_gas1 );
@ -156,24 +162,21 @@ register_clientfields()
riotshieldcraftable()
{
maps/mp/zombies/_zm_craftables::craftable_trigger_think( "riotshield_zm_craftable_trigger", "alcatraz_shield_zm", "alcatraz_shield_zm", &"ZOMBIE_GRAB_RIOTSHIELD", 1, 1 );
maps\mp\zombies\_zm_craftables::craftable_trigger_think( "riotshield_zm_craftable_trigger", "alcatraz_shield_zm", "alcatraz_shield_zm", &"ZOMBIE_GRAB_RIOTSHIELD", 1, 1 );
}
packasplatcraftable()
{
maps/mp/zombies/_zm_craftables::craftable_trigger_think( "packasplat_craftable_trigger", "packasplat", "packasplat", undefined, 1, 0 );
maps\mp\zombies\_zm_craftables::craftable_trigger_think( "packasplat_craftable_trigger", "packasplat", "packasplat", undefined, 1, 0 );
}
planecraftable()
{
level thread alcatraz_craftable_trigger_think( "plane_craftable_trigger", "plane", "plane", "", 1, 0 );
level setclientfield( "quest_plane_craft_complete", 0 );
i = 1;
while ( i <= 5 )
{
for ( i = 1; i <= 5; i++ )
level setclientfield( "quest_state" + i, 2 );
i++;
}
}
planefuelable()
@ -186,12 +189,10 @@ planefuelable_think()
flag_wait( "spawn_fuel_tanks" );
t_plane_fuelable = getent( "plane_fuelable_trigger", "targetname" );
t_plane_fuelable trigger_on();
i = 1;
while ( i <= 5 )
{
for ( i = 1; i <= 5; i++ )
level setclientfield( "quest_state" + i, 5 );
i++;
}
alcatraz_craftable_trigger_think( "plane_fuelable_trigger", "refuelable_plane", "refuelable_plane", "", 1, 0 );
}
@ -219,7 +220,9 @@ ondisconnect_common( player )
level endon( "crafted_" + self.piecename );
level endon( "dropped_" + self.piecename );
player_num = player getentitynumber() + 1;
player waittill( "disconnect" );
switch ( self.piecename )
{
case "cloth":
@ -243,59 +246,51 @@ ondisconnect_common( player )
in_game_checklist_plane_piece_dropped( "rigging" );
break;
}
level setclientfield( field_name, 2 );
level setclientfield( "piece_player" + player_num, 0 );
m_plane_piece = get_craftable_piece_model( "plane", self.piecename );
if ( isDefined( m_plane_piece ) )
{
if ( isdefined( m_plane_piece ) )
playfxontag( level._effect["quest_item_glow"], m_plane_piece, "tag_origin" );
}
m_fuel_can = get_craftable_piece_model( "refuelable_plane", self.piecename );
if ( isDefined( m_fuel_can ) )
{
if ( isdefined( m_fuel_can ) )
playfxontag( level._effect["quest_item_glow"], m_fuel_can, "tag_origin" );
}
}
prison_open_craftablestub_update_prompt( player, b_set_hint_string_now, trigger )
{
valid = maps/mp/zombies/_zm_craftables::open_craftablestub_update_prompt( player );
valid = maps\mp\zombies\_zm_craftables::open_craftablestub_update_prompt( player );
return valid;
}
onpickup_key( player )
{
flag_set( "key_found" );
if ( level.is_master_key_west )
{
level clientnotify( "fxanim_west_pulley_up_start" );
}
else
{
level clientnotify( "fxanim_east_pulley_up_start" );
}
a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a429 = a_m_checklist;
_k429 = getFirstArrayKey( _a429 );
while ( isDefined( _k429 ) )
foreach ( m_checklist in a_m_checklist )
{
m_checklist = _a429[ _k429 ];
m_checklist showpart( "j_check_key" );
m_checklist showpart( "j_strike_key" );
_k429 = getNextArrayKey( _a429, _k429 );
}
a_door_structs = getstructarray( "quest_trigger", "script_noteworthy" );
_a437 = a_door_structs;
_k437 = getFirstArrayKey( _a437 );
while ( isDefined( _k437 ) )
foreach ( struct in a_door_structs )
{
struct = _a437[ _k437 ];
if ( isDefined( struct.unitrigger_stub ) )
{
struct.unitrigger_stub maps/mp/zombies/_zm_unitrigger::run_visibility_function_for_all_triggers();
}
_k437 = getNextArrayKey( _a437, _k437 );
if ( isdefined( struct.unitrigger_stub ) )
struct.unitrigger_stub maps\mp\zombies\_zm_unitrigger::run_visibility_function_for_all_triggers();
}
player playsound( "evt_key_pickup" );
player thread do_player_general_vox( "quest", "sidequest_key_response", undefined, 100 );
level setclientfield( "piece_key_warden", 1 );
@ -316,6 +311,7 @@ ondrop_plane( player )
self droponmover( player );
self.piece_owner = undefined;
playfxontag( level._effect["quest_item_glow"], self.model, "tag_origin" );
switch ( self.piecename )
{
case "cloth":
@ -339,7 +335,9 @@ ondrop_plane( player )
in_game_checklist_plane_piece_dropped( "rigging" );
break;
}
level setclientfield( field_name, 2 );
if ( !level.is_forever_solo_game )
{
player_num = player getentitynumber() + 1;
@ -352,26 +350,29 @@ onpickup_plane( player )
/#
println( "ZM >> Common part callback onPickup()" );
#/
if ( !isDefined( level.plane_pieces_picked_up ) )
if ( !isdefined( level.plane_pieces_picked_up ) )
{
level.plane_pieces_picked_up = 0;
level.sndplanepieces = 1;
}
level.plane_pieces_picked_up += 1;
if ( level.plane_pieces_picked_up == 5 )
{
level thread roof_nag_vo();
}
if ( level.sndplanepieces == level.plane_pieces_picked_up )
{
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "piece_" + level.sndplanepieces );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "piece_" + level.sndplanepieces );
level.sndplanepieces++;
}
player playsound( "zmb_craftable_pickup" );
vo_alias_call = undefined;
vo_alias_response = undefined;
self pickupfrommover();
self.piece_owner = player;
switch ( self.piecename )
{
case "cloth":
@ -396,17 +397,20 @@ onpickup_plane( player )
in_game_checklist_plane_piece_picked_up( "rigging" );
break;
}
level setclientfield( field_name, 3 );
if ( !level.is_forever_solo_game )
{
player_num = player getentitynumber() + 1;
level setclientfield( "piece_player" + player_num, self.client_field_state );
}
vo_alias_call = self check_if_newly_found();
if ( isDefined( vo_alias_call ) )
{
if ( isdefined( vo_alias_call ) )
level thread play_plane_piece_call_and_response_vo( player, vo_alias_call );
}
self thread ondisconnect_common( player );
}
@ -432,12 +436,13 @@ check_if_newly_found()
vo_alias_call = "sidequest_rigging";
break;
}
level.n_plane_pieces_found++;
flag_set( self.piecename + "_found" );
if ( self.piecename == "cloth" )
{
level clientnotify( "fxanim_dryer_hide_start" );
}
return vo_alias_call;
}
}
@ -448,32 +453,34 @@ play_plane_piece_call_and_response_vo( player, vo_alias_call )
player endon( "disconnect" );
n_response_range = 1500;
players = getplayers();
if ( !flag( "story_vo_playing" ) )
{
flag_set( "story_vo_playing" );
player do_player_general_vox( "quest", vo_alias_call, undefined, 100 );
wait 5;
if ( players.size > 1 )
{
arrayremovevalue( players, player );
closest_other_player = getclosest( player.origin, players );
if ( isDefined( closest_other_player ) )
if ( isdefined( closest_other_player ) )
{
n_dist = distance( player.origin, closest_other_player.origin );
if ( isDefined( closest_other_player ) && n_dist < n_response_range )
if ( isdefined( closest_other_player ) && n_dist < n_response_range )
{
if ( level.n_plane_pieces_found < 5 )
{
vo_alias_response = "sidequest_parts" + level.n_plane_pieces_found + "_prog";
}
else
{
vo_alias_response = "sidequest_all_parts";
}
closest_other_player do_player_general_vox( "quest", vo_alias_response, undefined, 100 );
}
}
}
flag_clear( "story_vo_playing" );
}
}
@ -485,37 +492,25 @@ roof_nag_vo()
zone_roof = getent( "zone_roof", "targetname" );
zone_roof_infirmary = getent( "zone_roof_infirmary", "targetname" );
n_roof_nag_wait = 60;
n_roof_nag_max_times = 3;
while ( !flag( "plane_built" ) && n_roof_nag_max_times > 0 )
for ( n_roof_nag_max_times = 3; !flag( "plane_built" ) && n_roof_nag_max_times > 0; n_roof_nag_max_times-- )
{
wait n_roof_nag_wait;
wait( n_roof_nag_wait );
b_is_a_player_on_the_roof = 0;
players = getplayers();
_a696 = players;
_k696 = getFirstArrayKey( _a696 );
while ( isDefined( _k696 ) )
foreach ( player in players )
{
player = _a696[ _k696 ];
if ( player istouching( zone_roof ) || player istouching( zone_roof_infirmary ) )
{
b_is_a_player_on_the_roof = 1;
}
_k696 = getNextArrayKey( _a696, _k696 );
}
if ( !b_is_a_player_on_the_roof )
{
if ( level.plane_pieces_picked_up == 5 )
{
player = players[ randomintrange( 0, players.size ) ];
if ( isDefined( player ) )
{
player do_player_general_vox( "quest", "sidequest_roof_nag", undefined, 100 );
n_roof_nag_wait *= 1,5;
n_roof_nag_max_times--;
}
}
}
asm_cond( !b_is_a_player_on_the_roof, loc_2E53 );
asm_cond( level.plane_pieces_picked_up == 5, loc_2E53 );
player = players[randomintrange( 0, players.size )];
asm_cond( isdefined( player ), loc_2E53 );
player do_player_general_vox( "quest", "sidequest_roof_nag", undefined, 100 );
n_roof_nag_wait *= 1.5;
}
}
@ -538,40 +533,37 @@ oncrafted_plane( player )
plane_craftable hidepart( "tag_engine_ground" );
plane_craftable hidepart( "tag_clothes_ground" );
plane_craftable hidepart( "tag_fuel_hose" );
if ( !isDefined( level.sndplanecrafted ) )
{
if ( !isdefined( level.sndplanecrafted ) )
level.sndplanecrafted = 0;
}
level.sndplanecrafted++;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "plane_crafted_" + level.sndplanecrafted );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "plane_crafted_" + level.sndplanecrafted );
if ( is_part_crafted( "plane", "rigging" ) )
{
plane_craftable showpart( "tag_support_upper" );
if ( is_part_crafted( "plane", "cloth" ) )
{
plane_craftable showpart( "tag_wing_skins_up" );
}
if ( is_part_crafted( "plane", "engine" ) )
{
plane_craftable showpart( "tag_engines_up" );
}
}
else
{
plane_craftable showpart( "tag_wings_down" );
if ( is_part_crafted( "plane", "cloth" ) )
{
m_plane_hideable_clothes_pile show();
}
if ( is_part_crafted( "plane", "engine" ) )
{
m_plane_hideable_engine show();
}
}
if ( is_part_crafted( "plane", "steering" ) && is_part_crafted( "plane", "fueltanks" ) )
{
plane_craftable showpart( "tag_fuel_hose" );
}
switch ( self.piecename )
{
case "cloth":
@ -595,7 +587,9 @@ oncrafted_plane( player )
in_game_checklist_plane_piece_crafted( "rigging" );
break;
}
level setclientfield( field_name, 4 );
if ( !level.is_forever_solo_game )
{
player_num = player getentitynumber() + 1;
@ -608,11 +602,10 @@ ondrop_fuel( player )
level notify( "dropped_" + self.piecename );
self.piece_owner = undefined;
playfxontag( level._effect["quest_item_glow"], self.model, "tag_origin" );
if ( isDefined( level.sndfuelpieces ) )
{
if ( isdefined( level.sndfuelpieces ) )
level.sndfuelpieces--;
}
switch ( self.piecename )
{
case "fuel1":
@ -631,7 +624,9 @@ ondrop_fuel( player )
field_name = "quest_state5";
break;
}
level setclientfield( field_name, 5 );
if ( !level.is_forever_solo_game )
{
player_num = player getentitynumber() + 1;
@ -642,18 +637,18 @@ ondrop_fuel( player )
onpickup_fuel( player )
{
player playsound( "zmb_craftable_pickup" );
if ( !isDefined( level.sndfuelpieces ) || level.sndfuelpieces >= 5 )
{
if ( !isdefined( level.sndfuelpieces ) || level.sndfuelpieces >= 5 )
level.sndfuelpieces = 0;
}
level.sndfuelpieces++;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "gas_" + level.sndfuelpieces );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "gas_" + level.sndfuelpieces );
self pickupfrommover();
self.piece_owner = player;
if ( isDefined( player ) )
{
if ( isdefined( player ) )
player do_player_general_vox( "quest", "fuel_pickup", undefined, 100 );
}
switch ( self.piecename )
{
case "fuel1":
@ -672,12 +667,15 @@ onpickup_fuel( player )
field_name = "quest_state5";
break;
}
level setclientfield( field_name, 6 );
if ( !level.is_forever_solo_game )
{
player_num = player getentitynumber() + 1;
level setclientfield( "piece_player" + player_num, self.client_field_state );
}
self thread ondisconnect_common( player );
}
@ -685,6 +683,7 @@ oncrafted_fuel( player )
{
level notify( "crafted_" + self.piecename );
level.n_plane_fuel_count++;
switch ( self.piecename )
{
case "fuel1":
@ -703,7 +702,9 @@ oncrafted_fuel( player )
field_name = "quest_state5";
break;
}
level setclientfield( field_name, 7 );
if ( !level.is_forever_solo_game )
{
player_num = player getentitynumber() + 1;
@ -714,7 +715,7 @@ oncrafted_fuel( player )
onfullycrafted_plane( player )
{
flag_set( "plane_built" );
level thread maps/mp/zm_alcatraz_sq_vo::escape_flight_vo();
level thread maps\mp\zm_alcatraz_sq_vo::escape_flight_vo();
level notify( "roof_nag_vo" );
level setclientfield( "quest_plane_craft_complete", 1 );
return 0;
@ -733,7 +734,7 @@ onfullycrafted_packasplat( player )
onfullycrafted_refueled( player )
{
flag_set( "plane_built" );
level thread maps/mp/zm_alcatraz_sq_vo::escape_flight_vo();
level thread maps\mp\zm_alcatraz_sq_vo::escape_flight_vo();
level notify( "roof_nag_vo" );
thread onfullycrafted_refueled_think( player );
return 0;
@ -742,31 +743,26 @@ onfullycrafted_refueled( player )
onfullycrafted_refueled_think( player )
{
flag_wait( "spawn_fuel_tanks" );
i = 1;
while ( i <= 5 )
{
for ( i = 1; i <= 5; i++ )
level setclientfield( "quest_state" + i, 5 );
i++;
}
maps/mp/zombies/_zm_craftables::stub_uncraft_craftable( self, 1, undefined, undefined, 1 );
maps\mp\zombies\_zm_craftables::stub_uncraft_craftable( self, 1, undefined, undefined, 1 );
}
sqcommoncraftable()
{
level.sq_craftable = maps/mp/zombies/_zm_craftables::craftable_trigger_think( "sq_common_craftable_trigger", "sq_common", "sq_common", "", 1, 0 );
level.sq_craftable = maps\mp\zombies\_zm_craftables::craftable_trigger_think( "sq_common_craftable_trigger", "sq_common", "sq_common", "", 1, 0 );
}
onbuyweapon_riotshield( player )
{
if ( isDefined( player.player_shield_reset_health ) )
{
if ( isdefined( player.player_shield_reset_health ) )
player [[ player.player_shield_reset_health ]]();
}
if ( isDefined( player.player_shield_reset_location ) )
{
if ( isdefined( player.player_shield_reset_location ) )
player [[ player.player_shield_reset_location ]]();
}
}
onbuyweapon_plane( player )
{
@ -776,38 +772,29 @@ onbuyweapon_plane( player )
droponmover( player )
{
while ( isDefined( player ) && player maps/mp/zm_alcatraz_travel::is_player_on_gondola() )
if ( isdefined( player ) && player maps\mp\zm_alcatraz_travel::is_player_on_gondola() )
{
str_location = undefined;
if ( isDefined( level.e_gondola.is_moving ) && level.e_gondola.is_moving && isDefined( level.e_gondola.destination ) )
{
if ( isdefined( level.e_gondola.is_moving ) && level.e_gondola.is_moving && isdefined( level.e_gondola.destination ) )
str_location = level.e_gondola.destination;
}
else
{
str_location = level.e_gondola.location;
}
if ( !isDefined( str_location ) )
{
if ( !isdefined( str_location ) )
str_location = "roof";
}
a_s_part_teleport = getstructarray( "gondola_dropped_parts_" + str_location, "targetname" );
_a1104 = a_s_part_teleport;
_k1104 = getFirstArrayKey( _a1104 );
while ( isDefined( _k1104 ) )
foreach ( struct in a_s_part_teleport )
{
struct = _a1104[ _k1104 ];
if ( isDefined( struct.occupied ) && !struct.occupied )
if ( !( isdefined( struct.occupied ) && struct.occupied ) )
{
self.model.origin = struct.origin;
self.model.angles = struct.angles;
struct.occupied = 1;
self.unitrigger.struct_teleport = struct;
return;
}
else
{
_k1104 = getNextArrayKey( _a1104, _k1104 );
break;
}
}
}
@ -815,9 +802,9 @@ droponmover( player )
pickupfrommover()
{
if ( isDefined( self.unitrigger ) )
if ( isdefined( self.unitrigger ) )
{
if ( isDefined( self.unitrigger.struct_teleport ) )
if ( isdefined( self.unitrigger.struct_teleport ) )
{
self.unitrigger.struct_teleport.occupied = 0;
self.unitrigger.struct_teleport = undefined;
@ -835,61 +822,39 @@ in_game_checklist_setup()
a_str_partnames[3] = "contval";
a_str_partnames[4] = "rigging";
a_str_partnames[5] = "key";
_a1143 = a_m_checklist;
_k1143 = getFirstArrayKey( _a1143 );
while ( isDefined( _k1143 ) )
foreach ( m_checklist in a_m_checklist )
{
m_checklist = _a1143[ _k1143 ];
_a1145 = a_str_partnames;
_k1145 = getFirstArrayKey( _a1145 );
while ( isDefined( _k1145 ) )
foreach ( str_partname in a_str_partnames )
{
str_partname = _a1145[ _k1145 ];
m_checklist hidepart( "j_check_" + str_partname );
m_checklist hidepart( "j_strike_" + str_partname );
_k1145 = getNextArrayKey( _a1145, _k1145 );
}
_k1143 = getNextArrayKey( _a1143, _k1143 );
}
}
in_game_checklist_plane_piece_picked_up( str_partname )
{
a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a1157 = a_m_checklist;
_k1157 = getFirstArrayKey( _a1157 );
while ( isDefined( _k1157 ) )
{
m_checklist = _a1157[ _k1157 ];
foreach ( m_checklist in a_m_checklist )
m_checklist showpart( "j_check_" + str_partname );
_k1157 = getNextArrayKey( _a1157, _k1157 );
}
}
in_game_checklist_plane_piece_dropped( str_partname )
{
a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a1167 = a_m_checklist;
_k1167 = getFirstArrayKey( _a1167 );
while ( isDefined( _k1167 ) )
{
m_checklist = _a1167[ _k1167 ];
foreach ( m_checklist in a_m_checklist )
m_checklist hidepart( "j_check_" + str_partname );
_k1167 = getNextArrayKey( _a1167, _k1167 );
}
}
in_game_checklist_plane_piece_crafted( str_partname )
{
a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a1177 = a_m_checklist;
_k1177 = getFirstArrayKey( _a1177 );
while ( isDefined( _k1177 ) )
{
m_checklist = _a1177[ _k1177 ];
foreach ( m_checklist in a_m_checklist )
m_checklist showpart( "j_strike_" + str_partname );
_k1177 = getNextArrayKey( _a1177, _k1177 );
}
}
alcatraz_craftable_trigger_think( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent )
@ -900,33 +865,32 @@ alcatraz_craftable_trigger_think( trigger_targetname, equipname, weaponname, tri
alcatraz_setup_unitrigger_craftable( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent )
{
trig = getent( trigger_targetname, "targetname" );
if ( !isDefined( trig ) )
{
if ( !isdefined( trig ) )
return;
}
trig.script_length = 386;
return alcatraz_setup_unitrigger_craftable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent );
}
alcatraz_setup_unitrigger_craftable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent )
{
if ( !isDefined( trig ) )
{
if ( !isdefined( trig ) )
return;
}
unitrigger_stub = spawnstruct();
unitrigger_stub.craftablestub = level.zombie_include_craftables[equipname];
angles = trig.script_angles;
if ( !isDefined( angles ) )
{
if ( !isdefined( angles ) )
angles = ( 0, 0, 0 );
}
unitrigger_stub.origin = trig.origin + ( anglesToRight( angles ) * -6 );
unitrigger_stub.origin = trig.origin + anglestoright( angles ) * -6;
unitrigger_stub.angles = trig.angles;
if ( isDefined( trig.script_angles ) )
{
if ( isdefined( trig.script_angles ) )
unitrigger_stub.angles = trig.script_angles;
}
unitrigger_stub.equipname = equipname;
unitrigger_stub.weaponname = weaponname;
unitrigger_stub.trigger_hintstring = trigger_hintstring;
@ -938,69 +902,63 @@ alcatraz_setup_unitrigger_craftable_internal( trig, equipname, weaponname, trigg
unitrigger_stub.onenduse = ::onenduseuts;
unitrigger_stub.onuse = ::onuseplantobjectuts;
unitrigger_stub.oncantuse = ::oncantuseuts;
if ( isDefined( trig.script_length ) )
{
if ( isdefined( trig.script_length ) )
unitrigger_stub.script_length = trig.script_length;
}
else
{
unitrigger_stub.script_length = 32;
}
if ( isDefined( trig.script_width ) )
{
if ( isdefined( trig.script_width ) )
unitrigger_stub.script_width = trig.script_width;
}
else
{
unitrigger_stub.script_width = 100;
}
if ( isDefined( trig.script_height ) )
{
if ( isdefined( trig.script_height ) )
unitrigger_stub.script_height = trig.script_height;
}
else
{
unitrigger_stub.script_height = 64;
}
unitrigger_stub.target = trig.target;
unitrigger_stub.targetname = trig.targetname;
unitrigger_stub.script_noteworthy = trig.script_noteworthy;
unitrigger_stub.script_parameters = trig.script_parameters;
unitrigger_stub.cursor_hint = "HINT_NOICON";
if ( isDefined( level.zombie_craftablestubs[ equipname ].hint ) )
{
if ( isdefined( level.zombie_craftablestubs[equipname].hint ) )
unitrigger_stub.hint_string = level.zombie_craftablestubs[equipname].hint;
}
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
unitrigger_stub.require_look_at = 0;
unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
if ( isDefined( unitrigger_stub.craftablestub.custom_craftablestub_update_prompt ) )
{
if ( isdefined( unitrigger_stub.craftablestub.custom_craftablestub_update_prompt ) )
unitrigger_stub.custom_craftablestub_update_prompt = unitrigger_stub.craftablestub.custom_craftablestub_update_prompt;
}
unitrigger_stub.prompt_and_visibility_func = ::craftabletrigger_update_prompt;
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::craftable_place_think );
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::craftable_place_think );
unitrigger_stub.piece_trigger = trig;
trig.trigger_stub = unitrigger_stub;
unitrigger_stub.zombie_weapon_upgrade = trig.zombie_weapon_upgrade;
if ( isDefined( unitrigger_stub.target ) )
if ( isdefined( unitrigger_stub.target ) )
{
unitrigger_stub.model = getent( unitrigger_stub.target, "targetname" );
if ( isDefined( unitrigger_stub.model ) )
{
if ( isDefined( unitrigger_stub.zombie_weapon_upgrade ) )
if ( isdefined( unitrigger_stub.model ) )
{
if ( isdefined( unitrigger_stub.zombie_weapon_upgrade ) )
unitrigger_stub.model useweaponhidetags( unitrigger_stub.zombie_weapon_upgrade );
}
unitrigger_stub.model ghost();
unitrigger_stub.model notsolid();
}
}
unitrigger_stub.craftablespawn = unitrigger_stub craftable_piece_unitriggers( equipname, unitrigger_stub.origin );
if ( delete_trigger )
{
trig delete();
}
level.a_uts_craftables[level.a_uts_craftables.size] = unitrigger_stub;
return unitrigger_stub;
}

View File

@ -1,135 +1,120 @@
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_spawner;
zombie_tracking_init()
{
level.zombie_respawned_health = [];
if ( !isDefined( level.zombie_tracking_dist ) )
{
if ( !isdefined( level.zombie_tracking_dist ) )
level.zombie_tracking_dist = 1500;
}
if ( !isDefined( level.zombie_tracking_high ) )
{
if ( !isdefined( level.zombie_tracking_high ) )
level.zombie_tracking_high = 600;
}
if ( !isDefined( level.zombie_tracking_wait ) )
{
if ( !isdefined( level.zombie_tracking_wait ) )
level.zombie_tracking_wait = 10;
}
for ( ;; )
{
while ( 1 )
while ( true )
{
zombies = get_round_enemy_array();
if ( !isDefined( zombies ) || isDefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
if ( !isdefined( zombies ) || isdefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
{
wait level.zombie_tracking_wait;
wait( level.zombie_tracking_wait );
continue;
}
}
else i = 0;
while ( i < zombies.size )
else
{
if ( isDefined( zombies[ i ] ) && isDefined( zombies[ i ].ignore_distance_tracking ) && !zombies[ i ].ignore_distance_tracking )
for ( i = 0; i < zombies.size; i++ )
{
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, level.zombie_tracking_high );
}
i++;
}
wait level.zombie_tracking_wait;
wait( level.zombie_tracking_wait );
}
}
delete_zombie_noone_looking( how_close, how_high )
{
self endon( "death" );
if ( !isDefined( how_close ) )
{
if ( !isdefined( how_close ) )
how_close = 1500;
}
if ( !isDefined( how_high ) )
{
if ( !isdefined( how_high ) )
how_close = 600;
}
distance_squared_check = how_close * how_close;
too_far_dist = distance_squared_check * 3;
if ( isDefined( level.zombie_tracking_too_far_dist ) )
{
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 )
for ( i = 0; i < players.size; i++ )
{
if ( players[i].sessionstate == "spectator" )
continue;
if ( isdefined( level.only_track_targeted_players ) )
{
i++;
if ( !isdefined( self.favoriteenemy ) || self.favoriteenemy != players[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 && abs( self.origin[2] - players[i].origin[2] ) < how_high )
{
self.player_close++;
}
}
i++;
}
wait 0,1;
wait 0.1;
if ( self.inview == 0 && self.player_close == 0 )
{
if ( !isDefined( self.animname ) || isDefined( self.animname ) && self.animname != "zombie" )
{
if ( !isdefined( self.animname ) || isdefined( self.animname ) && self.animname != "zombie" )
return;
}
if ( isDefined( self.electrified ) && self.electrified == 1 )
{
if ( isdefined( self.electrified ) && self.electrified == 1 )
return;
}
if ( isDefined( self.in_the_ground ) && self.in_the_ground == 1 )
{
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.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 )
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
else if ( zombies.size + level.zombie_total > 24 || zombies.size + level.zombie_total <= 24 && self.health >= self.maxhealth )
{
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 )
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 maps\mp\zombies\_zm_spawner::reset_attack_spot();
self notify( "zombie_delete" );
self delete();
recalc_zombie_array();
@ -139,31 +124,27 @@ delete_zombie_noone_looking( how_close, how_high )
player_can_see_me( player )
{
playerangles = player getplayerangles();
playerforwardvec = anglesToForward( playerangles );
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" );
playerfov = getdvarfloat( "cg_fov" );
banzaivsplayerfovbuffer = getdvarfloat( _hash_BCB625CF );
if ( banzaivsplayerfovbuffer <= 0 )
{
banzaivsplayerfovbuffer = 0,2;
}
playercanseeme = anglefromcenter <= ( ( playerfov * 0,5 ) * ( 1 - banzaivsplayerfovbuffer ) );
banzaivsplayerfovbuffer = 0.2;
playercanseeme = anglefromcenter <= playerfov * 0.5 * ( 1 - banzaivsplayerfovbuffer );
return playercanseeme;
}

View File

@ -1,18 +1,19 @@
//checked includes changed to match cerberus output
#include maps/mp/zm_alcatraz_classic;
#include maps/mp/zm_alcatraz_grief_cellblock;
#include maps/mp/zm_prison;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zm_prison;
#include maps\mp\zm_alcatraz_grief_cellblock;
#include maps\mp\zm_alcatraz_classic;
init() //checked matches cerberus output
init()
{
level.custom_vending_precaching = maps/mp/zm_prison::custom_vending_precaching;
add_map_gamemode( "zclassic", maps/mp/zm_prison::zclassic_preinit, undefined, undefined );
add_map_gamemode( "zgrief", maps/mp/zm_alcatraz_grief_cellblock::zgrief_preinit, undefined, undefined );
add_map_location_gamemode( "zclassic", "prison", maps/mp/zm_alcatraz_classic::precache, maps/mp/zm_alcatraz_classic::main );
add_map_location_gamemode( "zgrief", "cellblock", maps/mp/zm_alcatraz_grief_cellblock::precache, maps/mp/zm_alcatraz_grief_cellblock::main );
level.custom_vending_precaching = maps\mp\zm_prison::custom_vending_precaching;
add_map_gamemode( "zclassic", maps\mp\zm_prison::zclassic_preinit, undefined, undefined );
add_map_gamemode( "zgrief", maps\mp\zm_alcatraz_grief_cellblock::zgrief_preinit, undefined, undefined );
add_map_location_gamemode( "zclassic", "prison", maps\mp\zm_alcatraz_classic::precache, maps\mp\zm_alcatraz_classic::main );
add_map_location_gamemode( "zgrief", "cellblock", maps\mp\zm_alcatraz_grief_cellblock::precache, maps\mp\zm_alcatraz_grief_cellblock::main );
}

View File

@ -1,40 +1,41 @@
//checked includes changed to match cerberus output
#include maps/mp/gametypes_zm/zmeat;
#include maps/mp/zm_alcatraz_traps;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/zombies/_zm_blockers;
#include maps/mp/zombies/_zm_ai_brutus;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zm_prison;
#include maps/mp/zombies/_zm_race_utility;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_race_utility;
#include maps\mp\zm_prison;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_magicbox;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zombies\_zm_ai_brutus;
#include maps\mp\zombies\_zm_blockers;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\zm_alcatraz_traps;
#include maps\mp\gametypes_zm\zmeat;
precache() //checked matches cerberus output
precache()
{
}
zgrief_preinit() //checked matches cerberus output
zgrief_preinit()
{
registerclientfield( "toplayer", "meat_stink", 1, 1, "int" );
level.givecustomloadout = maps/mp/zm_prison::givecustomloadout;
level.givecustomloadout = maps\mp\zm_prison::givecustomloadout;
zgrief_init();
}
zgrief_init() //checked matches cerberus output
zgrief_init()
{
encounter_init();
flag_wait( "start_zombie_round_logic" );
if ( level.round_number < 4 && level.gamedifficulty != 0 )
{
level.zombie_move_speed = 35;
}
}
encounter_init() //checked matches cerberus output
encounter_init()
{
level._game_module_player_laststand_callback = ::alcatraz_grief_laststand_weapon_save;
level.precachecustomcharacters = ::precache_team_characters;
@ -42,19 +43,19 @@ encounter_init() //checked matches cerberus output
level.gamemode_post_spawn_logic = ::give_player_shiv;
}
alcatraz_grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output
alcatraz_grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration )
{
if ( self hasperk( "specialty_additionalprimaryweapon" ) )
{
primary_weapons_that_can_be_taken = [];
primaryweapons = self getweaponslistprimaries();
for ( i = 0; i < primaryweapons.size; i++ )
{
if ( maps/mp/zombies/_zm_weapons::is_weapon_included( primaryweapons[ i ] ) || maps/mp/zombies/_zm_weapons::is_weapon_upgraded( primaryweapons[ i ] ) )
{
if ( maps\mp\zombies\_zm_weapons::is_weapon_included( primaryweapons[i] ) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded( primaryweapons[i] ) )
primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size] = primaryweapons[i];
}
}
if ( primary_weapons_that_can_be_taken.size >= 3 )
{
weapon_to_take = primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size - 1];
@ -62,29 +63,30 @@ alcatraz_grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdea
self.weapon_taken_by_losing_specialty_additionalprimaryweapon = weapon_to_take;
}
}
self.grief_savedweapon_weapons = self getweaponslist();
self.grief_savedweapon_weaponsammo_stock = [];
self.grief_savedweapon_weaponsammo_clip = [];
self.grief_savedweapon_currentweapon = self getcurrentweapon();
self.grief_savedweapon_grenades = self get_player_lethal_grenade();
if ( isDefined( self.grief_savedweapon_grenades ) )
{
if ( isdefined( self.grief_savedweapon_grenades ) )
self.grief_savedweapon_grenades_clip = self getweaponammoclip( self.grief_savedweapon_grenades );
}
self.grief_savedweapon_tactical = self get_player_tactical_grenade();
if ( isDefined( self.grief_savedweapon_tactical ) )
{
if ( isdefined( self.grief_savedweapon_tactical ) )
self.grief_savedweapon_tactical_clip = self getweaponammoclip( self.grief_savedweapon_tactical );
}
for ( i = 0; i < self.grief_savedweapon_weapons.size; i++ )
{
self.grief_savedweapon_weaponsammo_clip[i] = self getweaponammoclip( self.grief_savedweapon_weapons[i] );
self.grief_savedweapon_weaponsammo_stock[i] = self getweaponammostock( self.grief_savedweapon_weapons[i] );
}
if ( isDefined( self.hasriotshield ) && self.hasriotshield )
{
if ( isdefined( self.hasriotshield ) && self.hasriotshield )
self.grief_hasriotshield = 1;
}
if ( self hasweapon( "claymore_zm" ) )
{
self.grief_savedweapon_claymore = 1;
@ -92,7 +94,7 @@ alcatraz_grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdea
}
}
precache_team_characters() //checked matches cerberus output
precache_team_characters()
{
precachemodel( "c_zom_player_grief_guard_fb" );
precachemodel( "c_zom_oleary_shortsleeve_viewhands" );
@ -100,30 +102,31 @@ precache_team_characters() //checked matches cerberus output
precachemodel( "c_zom_grief_guard_viewhands" );
}
give_team_characters() //checked matches cerberus output
give_team_characters()
{
self detachall();
self set_player_is_female( 0 );
if ( !isDefined( self.characterindex ) )
if ( !isdefined( self.characterindex ) )
{
self.characterindex = 1;
if ( self.team == "axis" )
{
self.characterindex = 0;
}
}
switch ( self.characterindex )
{
case 0:
case 2:
case "2":
case "0":
self setmodel( "c_zom_player_grief_inmate_fb" );
self.voice = "american";
self.skeleton = "base";
self setviewmodel( "c_zom_oleary_shortsleeve_viewhands" );
self.characterindex = 0;
break;
case 1:
case 3:
case "3":
case "1":
self setmodel( "c_zom_player_grief_guard_fb" );
self.voice = "american";
self.skeleton = "base";
@ -131,18 +134,19 @@ give_team_characters() //checked matches cerberus output
self.characterindex = 1;
break;
}
self setmovespeedscale( 1 );
self setsprintduration( 4 );
self setsprintcooldown( 0 );
}
give_player_shiv() //checked matches cerberus output
give_player_shiv()
{
self takeweapon( "knife_zm" );
self giveweapon( "knife_zm_alcatraz" );
}
grief_treasure_chest_init() //checked matches cerberus output
grief_treasure_chest_init()
{
chest1 = getstruct( "start_chest", "script_noteworthy" );
chest2 = getstruct( "cafe_chest", "script_noteworthy" );
@ -150,61 +154,61 @@ grief_treasure_chest_init() //checked matches cerberus output
level.chests = [];
level.chests[level.chests.size] = chest1;
level.chests[level.chests.size] = chest2;
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" );
maps\mp\zombies\_zm_magicbox::treasure_chest_init( "start_chest" );
}
main() //checked partially changed to match cerberus output changed at own discretion see info.md
main()
{
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "cellblock" );
maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "cellblock" );
grief_treasure_chest_init();
precacheshader( "zm_al_wth_zombie" );
array_thread( level.zombie_spawners, ::add_spawn_function, ::remove_zombie_hats_for_grief );
maps/mp/zombies/_zm_ai_brutus::precache();
maps/mp/zombies/_zm_ai_brutus::init();
maps\mp\zombies\_zm_ai_brutus::precache();
maps\mp\zombies\_zm_ai_brutus::init();
level.enemy_location_override_func = ::enemy_location_override;
level._effect["butterflies"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_skull_elec" );
a_t_door_triggers = getentarray( "zombie_door", "targetname" );
triggers = a_t_door_triggers;
i = 0;
while ( i < triggers.size )
foreach ( trigger in a_t_door_triggers )
{
if ( isDefined( triggers[ i ].script_flag ) )
if ( isdefined( trigger.script_flag ) )
{
if ( triggers[ i ].script_flag == "activate_cellblock_citadel" || triggers[ i ].script_flag == "activate_shower_room" || triggers[ i ].script_flag == "activate_cellblock_infirmary" || triggers[ i ].script_flag == "activate_infirmary" )
if ( trigger.script_flag == "activate_cellblock_citadel" || trigger.script_flag == "activate_shower_room" || trigger.script_flag == "activate_cellblock_infirmary" || trigger.script_flag == "activate_infirmary" )
{
triggers[ i ] delete();
i++;
trigger delete();
continue;
}
if ( triggers[ i ].script_flag == "activate_cafeteria" || triggers[ i ].script_flag == "activate_cellblock_east" || triggers[ i ].script_flag == "activate_cellblock_west" || triggers[ i ].script_flag == "activate_cellblock_barber" || triggers[ i ].script_flag == "activate_cellblock_gondola" || triggers[ i ].script_flag == "activate_cellblock_east_west" || triggers[ i ].script_flag == "activate_warden_office" )
if ( trigger.script_flag == "activate_cafeteria" || trigger.script_flag == "activate_cellblock_east" || trigger.script_flag == "activate_cellblock_west" || trigger.script_flag == "activate_cellblock_barber" || trigger.script_flag == "activate_cellblock_gondola" || trigger.script_flag == "activate_cellblock_east_west" || trigger.script_flag == "activate_warden_office" )
{
i++;
continue;
continue;
}
if ( isDefined( triggers[ i ].target ) )
if ( isdefined( trigger.target ) )
{
str_target = triggers[ i ].target;
str_target = trigger.target;
a_door_and_clip = getentarray( str_target, "targetname" );
foreach ( ent in a_door_and_clip )
{
ent delete();
}
trigger delete();
}
triggers[ i ] delete();
}
i++;
}
a_t_doors = getentarray( "zombie_door", "targetname" );
foreach ( t_door in a_t_doors )
{
if ( isDefined( t_door.script_flag ) )
if ( isdefined( t_door.script_flag ) )
{
if ( t_door.script_flag == "activate_cellblock_east_west" || t_door.script_flag == "activate_cellblock_barber" )
{
t_door maps/mp/zombies/_zm_blockers::door_opened( self.zombie_cost );
}
t_door maps\mp\zombies\_zm_blockers::door_opened( self.zombie_cost );
}
}
zbarriers = getzbarrierarray();
a_str_zones = [];
a_str_zones[0] = "zone_start";
@ -217,32 +221,33 @@ main() //checked partially changed to match cerberus output changed at own discr
a_str_zones[7] = "zone_cellblock_west_barber";
a_str_zones[8] = "zone_cellblock_west";
a_str_zones[9] = "zone_cellblock_west_gondola";
foreach ( barrier in zbarriers )
{
if ( isDefined( barrier.script_noteworthy ) && barrier.script_noteworthy == "cafe_chest_zbarrier" || isDefined( barrier.script_noteworthy ) && barrier.script_noteworthy == "start_chest_zbarrier" )
if ( isdefined( barrier.script_noteworthy ) )
{
if ( barrier.script_noteworthy == "cafe_chest_zbarrier" || barrier.script_noteworthy == "start_chest_zbarrier" )
continue;
}
else
{
str_model = barrier.model;
b_delete_barrier = 1;
if ( isdefined( barrier.script_string ) )
{
for ( i = 0; i < a_str_zones.size; i++ )
{
if ( str_model == a_str_zones[ i ] )
if ( barrier.script_string == a_str_zones[i] )
{
b_delete_barrier = 0;
break;
}
}
}
else if ( b_delete_barrier == 1 )
{
if ( b_delete_barrier == 1 )
barrier delete();
}
}
}
t_temp = getent( "tower_trap_activate_trigger", "targetname" );
t_temp delete();
t_temp = getent( "tower_trap_range_trigger", "targetname" );
@ -252,77 +257,81 @@ main() //checked partially changed to match cerberus output changed at own discr
e_brush = getent( "tower_shockbox_door", "targetname" );
e_brush delete();
a_t_travel_triggers = getentarray( "travel_trigger", "script_noteworthy" );
foreach ( trigger in a_t_travel_triggers )
{
trigger delete();
}
a_e_gondola_lights = getentarray( "gondola_state_light", "targetname" );
foreach ( light in a_e_gondola_lights )
{
light delete();
}
a_e_gondola_landing_gates = getentarray( "gondola_landing_gates", "targetname" );
foreach ( model in a_e_gondola_landing_gates )
{
model delete();
}
a_e_gondola_landing_doors = getentarray( "gondola_landing_doors", "targetname" );
foreach ( model in a_e_gondola_landing_doors )
{
model delete();
}
a_e_gondola_gates = getentarray( "gondola_gates", "targetname" );
foreach ( model in a_e_gondola_gates )
{
model delete();
}
a_e_gondola_doors = getentarray( "gondola_doors", "targetname" );
foreach ( model in a_e_gondola_doors )
{
model delete();
}
m_gondola = getent( "zipline_gondola", "targetname" );
m_gondola delete();
t_ride_trigger = getent( "gondola_ride_trigger", "targetname" );
t_ride_trigger delete();
a_classic_clips = getentarray( "classic_clips", "targetname" );
foreach ( clip in a_classic_clips )
{
clip connectpaths();
clip delete();
}
a_afterlife_props = getentarray( "afterlife_show", "targetname" );
foreach ( m_prop in a_afterlife_props )
{
m_prop delete();
}
spork_portal = getent( "afterlife_show_spork", "targetname" );
spork_portal delete();
a_audio = getentarray( "at_headphones", "script_noteworthy" );
foreach ( model in a_audio )
{
model delete();
}
m_spoon_pickup = getent( "pickup_spoon", "targetname" );
m_spoon_pickup delete();
t_sq_bg = getent( "sq_bg_reward_pickup", "targetname" );
t_sq_bg delete();
t_crafting_table = getentarray( "open_craftable_trigger", "targetname" );
foreach ( trigger in t_crafting_table )
{
trigger delete();
}
t_warden_fence = getent( "warden_fence_damage", "targetname" );
t_warden_fence delete();
m_plane_about_to_crash = getent( "plane_about_to_crash", "targetname" );
m_plane_about_to_crash delete();
m_plane_craftable = getent( "plane_craftable", "targetname" );
m_plane_craftable delete();
for ( i = 1; i <= 5; i++ )
{
m_key_lock = getent( "masterkey_lock_" + i, "targetname" );
m_key_lock delete();
}
m_shower_door = getent( "shower_key_door", "targetname" );
m_shower_door delete();
m_nixie_door = getent( "nixie_door_left", "targetname" );
@ -331,11 +340,13 @@ main() //checked partially changed to match cerberus output changed at own discr
m_nixie_door delete();
m_nixie_brush = getent( "nixie_tube_weaponclip", "targetname" );
m_nixie_brush delete();
for ( i = 1; i <= 3; i++ )
{
m_nixie_tube = getent( "nixie_tube_" + i, "targetname" );
m_nixie_tube delete();
}
t_elevator_door = getent( "nixie_elevator_door", "targetname" );
t_elevator_door delete();
e_elevator_clip = getent( "elevator_door_playerclip", "targetname" );
@ -354,18 +365,21 @@ main() //checked partially changed to match cerberus output changed at own discr
m_infirmary_case delete();
fake_plane_part = getent( "fake_veh_t6_dlc_zombie_part_control", "targetname" );
fake_plane_part delete();
for ( i = 1; i <= 3; i++ )
{
m_generator = getent( "generator_panel_" + i, "targetname" );
m_generator delete();
}
a_m_generator_core = getentarray( "generator_core", "targetname" );
foreach ( generator in a_m_generator_core )
{
generator delete();
}
e_playerclip = getent( "electric_chair_playerclip", "targetname" );
e_playerclip delete();
for ( i = 1; i <= 4; i++ )
{
t_use = getent( "trigger_electric_chair_" + i, "targetname" );
@ -373,17 +387,20 @@ main() //checked partially changed to match cerberus output changed at own discr
m_chair = getent( "electric_chair_" + i, "targetname" );
m_chair delete();
}
a_afterlife_interact = getentarray( "afterlife_interact", "targetname" );
foreach ( model in a_afterlife_interact )
{
model turn_afterlife_interact_on();
wait 0.1;
}
flag_wait( "initial_blackscreen_passed" );
maps/mp/zombies/_zm_game_module::turn_power_on_and_open_doors();
maps\mp\zombies\_zm_game_module::turn_power_on_and_open_doors();
flag_wait( "start_zombie_round_logic" );
level thread maps/mp/zm_alcatraz_traps::init_fan_trap_trigs();
level thread maps/mp/zm_alcatraz_traps::init_acid_trap_trigs();
level thread maps\mp\zm_alcatraz_traps::init_fan_trap_trigs();
level thread maps\mp\zm_alcatraz_traps::init_acid_trap_trigs();
wait 1;
level notify( "sleight_on" );
wait_network_frame();
@ -401,41 +418,40 @@ main() //checked partially changed to match cerberus output changed at own discr
wait_network_frame();
level notify( "Pack_A_Punch_on" );
wait_network_frame();
/*
/#
level thread maps/mp/gametypes_zm/zmeat::spawn_level_meat_manager();
level thread maps\mp\gametypes_zm\zmeat::spawn_level_meat_manager();
#/
*/
}
remove_zombie_hats_for_grief() //checked matches cerberus output
remove_zombie_hats_for_grief()
{
self detach( "c_zom_guard_hat" );
}
enemy_location_override( zombie, enemy ) //checked matches cerberus output
enemy_location_override( zombie, enemy )
{
location = enemy.origin;
if ( is_true( self.reroute ) )
{
if ( isDefined( self.reroute_origin ) )
{
if ( isdefined( self.reroute_origin ) )
location = self.reroute_origin;
}
}
return location;
}
magicbox_face_spawn() //checked matches cerberus output
magicbox_face_spawn()
{
self endon( "disconnect" );
if ( !is_gametype_active( "zgrief" ) )
{
return;
}
while ( 1 )
while ( true )
{
self waittill( "user_grabbed_weapon" );
if ( randomint( 50000 ) == 115 )
{
self playsoundtoplayer( "zmb_easteregg_face", self );
@ -444,29 +460,32 @@ magicbox_face_spawn() //checked matches cerberus output
self.wth_elem.vertalign = "fullscreen";
self.wth_elem.sort = 1000;
self.wth_elem.foreground = 0;
self.wth_elem.alpha = 1;
self.wth_elem.alpha = 1.0;
self.wth_elem setshader( "zm_al_wth_zombie", 640, 480 );
self.wth_elem.hidewheninmenu = 1;
wait 0.25;
self.wth_elem destroy();
}
wait 0.05;
}
}
#using_animtree("fxanim_props");
turn_afterlife_interact_on()
{
if ( self.script_string == "cell_1_powerup_activate" || self.script_string == "intro_powerup_activate" || self.script_string == "cell_2_powerup_activate" || self.script_string == "wires_shower_door" )
{
return;
}
if ( self.script_string == "electric_cherry_on" || self.script_string == "sleight_on" || self.script_string == "wires_admin_door" )
{
if ( !isDefined( level.shockbox_anim ) )
if ( !isdefined( level.shockbox_anim ) )
{
level.shockbox_anim["on"] = %fxanim_zom_al_shock_box_on_anim;
level.shockbox_anim["off"] = %fxanim_zom_al_shock_box_off_anim;
}
if ( issubstr( self.model, "p6_zm_al_shock_box" ) )
{
self useanimtree( -1 );
@ -475,8 +494,5 @@ turn_afterlife_interact_on()
}
}
else
{
self delete();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,17 @@
#include maps/mp/zm_alcatraz_sq;
#include maps/mp/gametypes_zm/_hud;
#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/zm_alcatraz_utility;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_craftables;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/zombies/_zm_afterlife;
#include maps/_vehicle;
#include maps/_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\_utility;
#include maps\_vehicle;
#include maps\mp\zombies\_zm_afterlife;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_craftables;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include maps\mp\gametypes_zm\_hud;
#include maps\mp\zm_alcatraz_sq;
setup_nixie_tubes_puzzle()
{
@ -22,64 +24,61 @@ setup_nixie_tubes_puzzle()
m_rigging linkto( m_citadel_elevator );
level thread nixie_tube_notifier();
level thread nixie_tube_elevator_door();
while ( !flag( "nixie_puzzle_completed" ) )
{
generate_unrestricted_nixie_tube_solution();
n_code = nixie_tube_add_code( level.a_nixie_tube_solution[1], level.a_nixie_tube_solution[2], level.a_nixie_tube_solution[3] );
i = 1;
while ( i < 4 )
for ( i = 1; i < 4; i++ )
{
m_nixie_tube = getent( "nixie_tube_" + i, "targetname" );
m_nixie_tube thread nixie_tube_thread( i );
m_nixie_clue = getent( "nixie_clue_" + i, "script_noteworthy" );
j = 0;
while ( j < 10 )
{
for ( j = 0; j < 10; j++ )
m_nixie_clue hidepart( "J_" + j );
j++;
}
players = getplayers();
_a76 = players;
_k76 = getFirstArrayKey( _a76 );
while ( isDefined( _k76 ) )
{
player = _a76[ _k76 ];
if ( isDefined( player ) && isDefined( player.afterlife ) && player.afterlife )
foreach ( player in players )
{
if ( isdefined( player ) && ( isdefined( player.afterlife ) && player.afterlife ) )
m_nixie_clue setvisibletoplayer( player );
}
_k76 = getNextArrayKey( _a76, _k76 );
}
m_nixie_clue showpart( "J_" + level.a_nixie_tube_solution[i] );
i++;
}
level waittill( "nixie_" + n_code );
flag_set( "nixie_puzzle_solved" );
nixie_tube_remove_code( n_code );
i = 1;
while ( i < 4 )
for ( i = 1; i < 4; i++ )
{
m_nixie_clue = getent( "nixie_clue_" + i, "script_noteworthy" );
m_nixie_clue setinvisibletoall();
i++;
}
nixie_tube_2 = getent( "nixie_tube_2", "targetname" );
nixie_tube_2 playsound( "zmb_quest_nixie_success" );
level thread nixie_tube_elevator_drops();
nixie_tube_win_effects_all_tubes( 0, 6, 0 );
wait 0,5;
wait 0.5;
n_countdown = 60;
level thread sndnixietubecountdown( n_countdown );
i = 1;
while ( i < 4 )
for ( i = 1; i < 4; i++ )
{
m_nixie_tube = getent( "nixie_tube_" + i, "targetname" );
level notify( "nixie_tube_trigger_" + i );
m_nixie_tube thread nixie_tube_thread_play_countdown( i, n_countdown );
i++;
}
flag_set( "nixie_countdown_started" );
flag_wait( "nixie_countdown_expired" );
if ( !flag( "nixie_puzzle_completed" ) )
{
t_elevator_door = getent( "nixie_elevator_door", "targetname" );
@ -90,6 +89,7 @@ setup_nixie_tubes_puzzle()
nixie_tube_elevator_rises();
}
}
m_nixie_tube = getent( "nixie_tube_2", "targetname" );
m_nixie_tube playsound( "zmb_quest_nixie_success" );
/#
@ -100,13 +100,12 @@ setup_nixie_tubes_puzzle()
stop_exploder( 3400 );
stop_exploder( 3500 );
stop_exploder( 3600 );
i = 1;
while ( i < 4 )
for ( i = 1; i < 4; i++ )
{
m_nixie_tube = getent( "nixie_tube_" + i, "targetname" );
m_nixie_tube thread afterlife_interact_object_think();
m_nixie_tube thread nixie_tube_thread( i );
i++;
}
}
@ -120,101 +119,86 @@ generate_unrestricted_nixie_tube_solution()
a_restricted_solutions[4] = 101;
a_restricted_solutions[5] = 872;
a_numbers = [];
i = 0;
while ( i < 10 )
{
for ( i = 0; i < 10; i++ )
a_numbers[i] = i;
i++;
}
i = 1;
while ( i < 4 )
for ( i = 1; i < 4; i++ )
{
n_index = randomint( a_numbers.size );
level.a_nixie_tube_solution[i] = a_numbers[n_index];
arrayremoveindex( a_numbers, n_index );
i++;
}
i = 0;
while ( i < a_restricted_solutions.size )
for ( i = 0; i < a_restricted_solutions.size; i++ )
{
b_is_restricted_solution = 1;
restricted_solution = [];
j = 1;
while ( j < 4 )
for ( j = 1; j < 4; j++ )
{
restricted_solution[j] = get_split_number( j, a_restricted_solutions[i] );
if ( restricted_solution[j] != level.a_nixie_tube_solution[j] )
{
b_is_restricted_solution = 0;
}
j++;
}
if ( b_is_restricted_solution )
{
n_index = randomint( a_numbers.size );
level.a_nixie_tube_solution[3] = a_numbers[n_index];
}
i++;
}
}
nixie_tube_notifier()
{
if ( !isDefined( level.a_important_codes ) )
if ( !isdefined( level.a_important_codes ) )
{
level.a_important_codes = [];
level.a_important_codes[level.a_important_codes.size] = 115;
level.a_important_codes[level.a_important_codes.size] = 935;
}
level thread nixie_115();
level thread nixie_935();
while ( !isDefined( level.a_nixie_tube_code ) || !isDefined( level.a_nixie_tube_code[ 3 ] ) )
{
while ( !isdefined( level.a_nixie_tube_code ) || !isdefined( level.a_nixie_tube_code[3] ) )
wait 1;
}
while ( 1 )
while ( true )
{
codes_to_check = array_copy( level.a_important_codes );
non_array_value = ( level.a_nixie_tube_code[ 1 ] * 100 ) + ( level.a_nixie_tube_code[ 2 ] * 10 ) + level.a_nixie_tube_code[ 3 ];
_a240 = codes_to_check;
_k240 = getFirstArrayKey( _a240 );
while ( isDefined( _k240 ) )
non_array_value = level.a_nixie_tube_code[1] * 100 + level.a_nixie_tube_code[2] * 10 + level.a_nixie_tube_code[3];
foreach ( code in codes_to_check )
{
code = _a240[ _k240 ];
if ( code == non_array_value )
{
level notify( "nixie_" + code );
}
_k240 = getNextArrayKey( _a240, _k240 );
}
wait 2;
}
}
nixie_tube_add_code( a, b, c )
{
if ( isDefined( b ) )
{
non_array_value = ( a * 100 ) + ( b * 10 ) + c;
}
if ( isdefined( b ) )
non_array_value = a * 100 + b * 10 + c;
else
{
non_array_value = a;
}
level.a_important_codes[level.a_important_codes.size] = non_array_value;
return non_array_value;
}
nixie_tube_remove_code( a, b, c )
{
if ( isDefined( b ) )
{
non_array_value = ( a * 100 ) + ( b * 10 ) + c;
}
if ( isdefined( b ) )
non_array_value = a * 100 + b * 10 + c;
else
{
non_array_value = a;
}
arrayremovevalue( level.a_important_codes, non_array_value );
}
@ -222,189 +206,177 @@ sndnixietubecountdown( num )
{
level endon( "sndEndNixieCount" );
ent = getent( "nixie_tube_2", "targetname" );
i = num;
while ( i > 0 )
for ( i = num; i > 0; i-- )
{
if ( i <= 10 )
{
ent playsound( "zmb_quest_nixie_count_final" );
}
else
{
ent playsound( "zmb_quest_nixie_count" );
}
wait 1;
i--;
wait 1;
}
ent playsound( "zmb_quest_nixie_fail" );
}
nixie_tube_thread( n_tube_index, b_force_reset )
{
if ( !isDefined( b_force_reset ) )
{
if ( !isdefined( b_force_reset ) )
b_force_reset = 1;
}
level endon( "kill_nixie_input" );
if ( b_force_reset )
{
level.a_nixie_tube_code[n_tube_index] = 0;
}
self thread afterlife_interact_object_think();
i = 0;
while ( i < 10 )
for ( i = 0; i < 10; i++ )
{
self hidepart( "J_off" );
self hidepart( "J_" + i );
i++;
}
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
while ( !flag( "nixie_puzzle_solved" ) )
{
level waittill( "nixie_tube_trigger_" + n_tube_index );
while ( flag( "nixie_puzzle_solved" ) )
{
if ( flag( "nixie_puzzle_solved" ) )
continue;
}
i = 0;
while ( i < 10 )
{
for ( i = 0; i < 10; i++ )
self hidepart( "J_" + i );
i++;
}
level.a_nixie_tube_code[n_tube_index]++;
self playsound( "zmb_quest_nixie_count" );
if ( level.a_nixie_tube_code[n_tube_index] > 9 )
{
level.a_nixie_tube_code[n_tube_index] = 0;
}
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
wait 0,05;
wait 0.05;
self notify( "afterlife_interact_reset" );
}
}
nixie_tube_win_effects( n_tube_index, n_blink_rate )
{
if ( !isDefined( n_blink_rate ) )
{
n_blink_rate = 0,25;
}
if ( !isdefined( n_blink_rate ) )
n_blink_rate = 0.25;
while ( !flag( "nixie_countdown_started" ) )
{
self hidepart( "J_" + level.a_nixie_tube_code[n_tube_index] );
wait n_blink_rate;
wait( n_blink_rate );
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
wait n_blink_rate;
wait( n_blink_rate );
}
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
}
nixie_tube_win_effects_all_tubes( goal_num_1, goal_num_2, goal_num_3 )
{
if ( !isDefined( goal_num_1 ) )
{
if ( !isdefined( goal_num_1 ) )
goal_num_1 = 0;
}
if ( !isDefined( goal_num_2 ) )
{
if ( !isdefined( goal_num_2 ) )
goal_num_2 = 0;
}
if ( !isDefined( goal_num_3 ) )
{
if ( !isdefined( goal_num_3 ) )
goal_num_3 = 0;
}
a_nixie_tube = [];
a_nixie_tube[1] = getent( "nixie_tube_1", "targetname" );
a_nixie_tube[2] = getent( "nixie_tube_2", "targetname" );
a_nixie_tube[3] = getent( "nixie_tube_3", "targetname" );
n_off_tube = 1;
start_time = 0;
while ( start_time < 3 )
for ( start_time = 0; start_time < 3; start_time += 0.15 )
{
i = 1;
while ( i < ( 3 + 1 ) )
for ( i = 1; i < 3 + 1; i++ )
{
if ( i == n_off_tube )
{
a_nixie_tube[i] hidepart( "J_" + level.a_nixie_tube_code[i] );
i++;
continue;
}
else
{
a_nixie_tube[i] showpart( "J_" + level.a_nixie_tube_code[i] );
if ( i == 1 || n_off_tube == 2 && i == 3 && n_off_tube == 1 )
{
if ( i == 1 && n_off_tube == 2 || i == 3 && n_off_tube == 1 )
a_nixie_tube[i] playsound( "zmb_quest_nixie_count" );
}
}
i++;
}
n_off_tube++;
if ( n_off_tube > 3 )
{
n_off_tube = 1;
}
wait_network_frame();
start_time += 0,15;
}
a_nixie_tube[1] showpart( "J_" + level.a_nixie_tube_code[1] );
a_nixie_tube[2] showpart( "J_" + level.a_nixie_tube_code[2] );
a_nixie_tube[3] showpart( "J_" + level.a_nixie_tube_code[3] );
while ( level.a_nixie_tube_code[ 1 ] != goal_num_1 || level.a_nixie_tube_code[ 2 ] != goal_num_2 && level.a_nixie_tube_code[ 3 ] != goal_num_3 )
while ( level.a_nixie_tube_code[1] != goal_num_1 || level.a_nixie_tube_code[2] != goal_num_2 || level.a_nixie_tube_code[3] != goal_num_3 )
{
n_current_tube = 1;
n_goal = goal_num_1;
if ( level.a_nixie_tube_code[n_current_tube] == goal_num_1 )
{
n_current_tube = 2;
n_goal = goal_num_2;
if ( level.a_nixie_tube_code[n_current_tube] == goal_num_2 )
{
n_current_tube = 3;
n_goal = goal_num_3;
}
}
j = 0;
while ( j < 10 )
for ( j = 0; j < 10; j++ )
{
a_nixie_tube[n_current_tube] hidepart( "J_" + level.a_nixie_tube_code[n_current_tube] );
level.a_nixie_tube_code[n_current_tube]--;
if ( level.a_nixie_tube_code[n_current_tube] == -1 )
{
level.a_nixie_tube_code[n_current_tube] = 9;
}
a_nixie_tube[n_current_tube] showpart( "J_" + level.a_nixie_tube_code[n_current_tube] );
if ( ( j % 3 ) == 0 )
{
if ( j % 3 == 0 )
a_nixie_tube[n_current_tube] playsound( "zmb_quest_nixie_count" );
wait 0.05;
}
wait 0,05;
j++;
}
wait_network_frame();
j = 0;
while ( level.a_nixie_tube_code[n_current_tube] != n_goal )
{
a_nixie_tube[n_current_tube] hidepart( "J_" + level.a_nixie_tube_code[n_current_tube] );
level.a_nixie_tube_code[n_current_tube]--;
if ( level.a_nixie_tube_code[n_current_tube] == -1 )
{
level.a_nixie_tube_code[n_current_tube] = 9;
}
a_nixie_tube[n_current_tube] showpart( "J_" + level.a_nixie_tube_code[n_current_tube] );
if ( ( j % 3 ) == 0 )
{
if ( j % 3 == 0 )
a_nixie_tube[n_current_tube] playsound( "zmb_quest_nixie_count" );
}
j++;
wait 0,05;
wait 0.05;
}
}
a_nixie_tube[2] playsound( "zmb_quest_nixie_count_final" );
wait_network_frame();
}
@ -417,33 +389,30 @@ nixie_tube_thread_play_countdown( n_tube_index, n_countdown )
/#
iprintlnbold( "tube " + n_tube_index + " number is " + level.a_nixie_tube_code[n_tube_index] );
#/
i = 0;
while ( i < 10 )
{
for ( i = 0; i < 10; i++ )
self hidepart( "J_" + i );
i++;
}
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
while ( n_countdown )
{
n_countdown--;
self hidepart( "J_" + level.a_nixie_tube_code[n_tube_index] );
level.a_nixie_tube_code[n_tube_index] = get_split_number( n_tube_index, n_countdown );
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
wait n_tick_duration;
wait( n_tick_duration );
}
flag_set( "nixie_countdown_expired" );
wait 0,05;
wait 0.05;
flag_clear( "nixie_countdown_expired" );
}
get_split_number( n_tube_index, n_countdown )
{
if ( n_tube_index == 1 )
{
return ( n_countdown - ( n_countdown % 100 ) ) / 100;
}
return ( n_countdown - n_countdown % 100 ) / 100;
if ( n_tube_index == 2 )
{
n_temp = n_countdown % 100;
@ -451,34 +420,31 @@ get_split_number( n_tube_index, n_countdown )
n_temp /= 10;
return n_temp;
}
if ( n_tube_index == 3 )
{
return n_countdown % 10;
}
}
nixie_tube_elevator_drops()
{
n_elevator_drop_duration = 3;
maps/mp/zm_alcatraz_sq::array_set_visible_to_all( getentarray( "generator_wires", "script_noteworthy" ), 0 );
maps\mp\zm_alcatraz_sq::array_set_visible_to_all( getentarray( "generator_wires", "script_noteworthy" ), 0 );
exploder( 3400 );
exploder( 3500 );
exploder( 3600 );
m_citadel_elevator = getent( "citadel_elevator", "targetname" );
a_m_script_models = [];
a_m_script_models = getentarray( "script_model", "classname" );
i = 0;
while ( i < a_m_script_models.size )
for ( i = 0; i < a_m_script_models.size; i++ )
{
if ( a_m_script_models[i].model == "veh_t6_dlc_zombie_part_rigging" )
{
playfxontag( level._effect["elevator_fall"], a_m_script_models[i], "tag_origin" );
}
i++;
}
m_citadel_elevator playsound( "zmb_quest_elevator_move" );
m_citadel_elevator moveto( m_citadel_elevator.origin + vectorScale( ( 0, 0, 0 ), 768 ), n_elevator_drop_duration, 1, 1 );
wait n_elevator_drop_duration;
m_citadel_elevator moveto( m_citadel_elevator.origin + vectorscale( ( 0, 0, -1 ), 768.0 ), n_elevator_drop_duration, 1, 1 );
wait( n_elevator_drop_duration );
t_elevator_door = getent( "nixie_elevator_door", "targetname" );
t_elevator_door trigger_on();
}
@ -486,52 +452,57 @@ nixie_tube_elevator_drops()
nixie_tube_elevator_rises()
{
elevator_rise_duration = 3;
maps/mp/zm_alcatraz_sq::array_set_visible_to_all( getentarray( "generator_wires", "script_noteworthy" ), 1 );
maps\mp\zm_alcatraz_sq::array_set_visible_to_all( getentarray( "generator_wires", "script_noteworthy" ), 1 );
stop_exploder( 3400 );
stop_exploder( 3500 );
stop_exploder( 3600 );
m_citadel_elevator = getent( "citadel_elevator", "targetname" );
m_citadel_elevator moveto( m_citadel_elevator.origin + vectorScale( ( 0, 0, 0 ), 768 ), elevator_rise_duration, 1, 1 );
m_citadel_elevator moveto( m_citadel_elevator.origin + vectorscale( ( 0, 0, 1 ), 768.0 ), elevator_rise_duration, 1, 1 );
m_citadel_elevator playsound( "zmb_quest_elevator_move" );
wait elevator_rise_duration;
wait( elevator_rise_duration );
}
nixie_tube_elevator_door()
{
t_elevator_door = getent( "nixie_elevator_door", "targetname" );
t_elevator_door sethintstring( &"ZM_PRISON_KEY_DOOR" );
t_elevator_door waittill( "trigger", e_triggerer );
m_elevator_bottom_gate_l = getent( "elevator_bottom_gate_l", "targetname" );
m_elevator_bottom_gate_r = getent( "elevator_bottom_gate_r", "targetname" );
m_elevator_bottom_gate_l rotateyaw( -90, 0,5 );
m_elevator_bottom_gate_r rotateyaw( 90, 0,5 );
m_elevator_bottom_gate_l rotateyaw( -90, 0.5 );
m_elevator_bottom_gate_r rotateyaw( 90, 0.5 );
elevator_door_playerclip = getent( "elevator_door_playerclip", "targetname" );
elevator_door_playerclip delete();
flag_set( "nixie_puzzle_completed" );
level notify( "sndEndNixieCount" );
level notify( "end_nixie_countdown" );
flag_set( "nixie_countdown_expired" );
wait 0,05;
wait 0.05;
flag_clear( "nixie_countdown_expired" );
t_elevator_door delete();
}
nixie_tube_win_effects_ee( n_tube_index )
{
n_blink_rate = 0,25;
n_blink_rate = 0.25;
while ( !flag( "nixie_ee_flashing" ) )
{
self hidepart( "J_" + level.a_nixie_tube_code[n_tube_index] );
wait n_blink_rate;
wait( n_blink_rate );
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
wait n_blink_rate;
wait( n_blink_rate );
}
self showpart( "J_" + level.a_nixie_tube_code[n_tube_index] );
}
nixie_115()
{
level waittill( "nixie_" + 115 );
level notify( "kill_nixie_input" );
flag_set( "nixie_puzzle_solved" );
flag_clear( "nixie_ee_flashing" );
@ -547,12 +518,14 @@ nixie_115_audio()
m_nixie_tube = getent( "nixie_tube_1", "targetname" );
n_random_line = randomint( 3 );
m_nixie_tube playsoundwithnotify( "vox_brutus_scary_voice_" + n_random_line, "scary_voice" );
m_nixie_tube waittill( "scary_voice" );
}
nixie_935()
{
level waittill( "nixie_" + 935 );
level notify( "kill_nixie_input" );
flag_set( "nixie_puzzle_solved" );
flag_clear( "nixie_ee_flashing" );
@ -565,7 +538,7 @@ nixie_935()
nixie_935_audio()
{
if ( isDefined( level.music_override ) && !level.music_override )
if ( !( isdefined( level.music_override ) && level.music_override ) )
{
level.music_override = 1;
playsoundatposition( "mus_zmb_secret_song_2", ( 0, 0, 0 ) );
@ -577,18 +550,17 @@ nixie_935_audio()
m_nixie_tube = getent( "nixie_tube_1", "targetname" );
n_random_line = randomint( 3 );
m_nixie_tube playsoundwithnotify( "vox_brutus_scary_voice_" + n_random_line, "scary_voice" );
m_nixie_tube waittill( "scary_voice" );
}
}
nixie_reset_control( b_reset_control )
{
i = 1;
while ( i < 4 )
for ( i = 1; i < 4; i++ )
{
m_nixie_tube = getent( "nixie_tube_" + i, "targetname" );
m_nixie_tube thread afterlife_interact_object_think();
m_nixie_tube thread nixie_tube_thread( i, b_reset_control );
i++;
}
}

View File

@ -1,14 +1,16 @@
#include maps/mp/gametypes_zm/_hud;
#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/zm_alcatraz_utility;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_craftables;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/zombies/_zm_afterlife;
#include maps/_vehicle;
#include maps/_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\_utility;
#include maps\_vehicle;
#include maps\mp\zombies\_zm_afterlife;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_craftables;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include maps\mp\gametypes_zm\_hud;
vo_see_map_trigger()
{
@ -16,10 +18,13 @@ vo_see_map_trigger()
e_triggerer = undefined;
t_map_vo_trigger = getent( "map_vo_trigger", "targetname" );
b_has_line_played = 0;
while ( !b_has_line_played )
{
t_map_vo_trigger waittill( "trigger", e_triggerer );
players = getplayers();
if ( !e_triggerer.dontspeak && !flag( "story_vo_playing" ) )
{
flag_set( "story_vo_playing" );
@ -27,10 +32,10 @@ vo_see_map_trigger()
wait 5;
arrayremovevalue( players, e_triggerer );
closest_other_player = getclosest( e_triggerer.origin, players );
if ( isDefined( closest_other_player ) )
{
if ( isdefined( closest_other_player ) )
closest_other_player do_player_general_vox( "quest", "response_map", undefined, 100 );
}
b_has_line_played = 1;
wait 5;
flag_clear( "story_vo_playing" );
@ -46,31 +51,30 @@ opening_vo()
players = getplayers();
vo_play_four_part_conversation( level.four_part_convos["start_1_oh_shit_" + randomintrange( 1, 3 )] );
wait 1;
if ( players.size == 1 )
{
players[0] vo_play_soliloquy( level.soliloquy_convos["solo_intro_" + players[0].character_name] );
}
else
{
if ( is_player_character_present( "Arlington" ) )
{
else if ( is_player_character_present( "Arlington" ) )
vo_play_four_part_conversation( level.four_part_convos["intro_plr_3"] );
}
}
level thread vo_see_map_trigger();
wait 10;
vo_play_four_part_conversation( level.four_part_convos["during_1_oh_shit"] );
level waittill( "end_of_round" );
wait 5;
vo_play_four_part_conversation( level.four_part_convos["start_2_oh_shit_" + randomintrange( 1, 3 )] );
wait 4;
vo_play_four_part_conversation( level.four_part_convos["start_3_oh_shit"] );
level waittill( "end_of_round" );
wait 3;
if ( ( get_players_touching( "zone_library" ) + get_players_touching( "zone_start" ) ) == 4 )
{
if ( get_players_touching( "zone_library" ) + get_players_touching( "zone_start" ) == 4 )
vo_play_four_part_conversation( level.four_part_convos["start_2_oh_shit"] );
}
wait 1;
}
@ -305,42 +309,40 @@ vo_bridge_soliloquy()
if ( level.n_quest_iteration_count < 3 )
{
convo = level.soliloquy_convos["purgatory_" + self.character_name + "_visit" + level.n_quest_iteration_count + "_alt" + randomintrange( 1, 3 )];
if ( isDefined( convo ) )
{
if ( isdefined( convo ) )
self vo_play_soliloquy( convo );
}
}
}
vo_bridge_four_part_convo()
{
if ( level.n_quest_iteration_count < 3 )
{
convo = level.four_part_convos["bridge_visit" + level.n_quest_iteration_count + "_alt" + randomintrange( 1, 5 )];
if ( isDefined( convo ) )
{
if ( isdefined( convo ) )
vo_play_four_part_conversation( convo );
}
}
}
vo_play_soliloquy( convo )
{
self endon( "disconnect" );
if ( !isDefined( convo ) )
{
if ( !isdefined( convo ) )
return;
}
if ( !flag( "story_vo_playing" ) )
{
flag_set( "story_vo_playing" );
self thread vo_play_soliloquy_disconnect_listener();
self.dontspeak = 1;
self setclientfieldtoplayer( "isspeaking", 1 );
i = 0;
while ( i < convo.size )
for ( i = 0; i < convo.size; i++ )
{
if ( isDefined( self.afterlife ) && self.afterlife )
if ( isdefined( self.afterlife ) && self.afterlife )
{
self.dontspeak = 0;
self setclientfieldtoplayer( "isspeaking", 0 );
@ -351,11 +353,13 @@ vo_play_soliloquy( convo )
else
{
self playsoundwithnotify( convo[i], "sound_done" + convo[i] );
self waittill( "sound_done" + convo[i] );
}
wait 1;
i++;
}
self.dontspeak = 0;
self setclientfieldtoplayer( "isspeaking", 0 );
flag_clear( "story_vo_playing" );
@ -366,17 +370,19 @@ vo_play_soliloquy( convo )
vo_play_soliloquy_disconnect_listener()
{
self endon( "soliloquy_vo_done" );
self waittill( "disconnect" );
flag_clear( "story_vo_playing" );
}
vo_play_four_part_conversation( convo )
{
if ( !isDefined( convo ) )
{
if ( !isdefined( convo ) )
return;
}
players = getplayers();
if ( players.size == 4 && !flag( "story_vo_playing" ) )
{
flag_set( "story_vo_playing" );
@ -388,133 +394,109 @@ vo_play_four_part_conversation( convo )
e_sal = undefined;
e_billy = undefined;
e_finn = undefined;
_a513 = players;
_k513 = getFirstArrayKey( _a513 );
while ( isDefined( _k513 ) )
foreach ( player in players )
{
player = _a513[ _k513 ];
if ( isDefined( player ) )
if ( isdefined( player ) )
{
switch ( player.character_name )
{
case "Arlington":
e_arlington = player;
break;
break;
continue;
case "Sal":
e_sal = player;
break;
break;
continue;
case "Billy":
e_billy = player;
break;
break;
continue;
case "Finn":
e_finn = player;
break;
break;
continue;
}
}
_k513 = getNextArrayKey( _a513, _k513 );
}
if ( isDefined( e_arlington ) && isDefined( e_sal ) || !isDefined( e_billy ) && !isDefined( e_finn ) )
{
if ( !isdefined( e_arlington ) || !isdefined( e_sal ) || !isdefined( e_billy ) || !isdefined( e_finn ) )
return;
}
else _a542 = players;
_k542 = getFirstArrayKey( _a542 );
while ( isDefined( _k542 ) )
else
{
player = _a542[ _k542 ];
if ( isDefined( player ) )
foreach ( player in players )
{
if ( isdefined( player ) )
{
player.dontspeak = 1;
player setclientfieldtoplayer( "isspeaking", 1 );
}
_k542 = getNextArrayKey( _a542, _k542 );
}
i = 0;
while ( i < convo.size )
}
for ( i = 0; i < convo.size; i++ )
{
players = getplayers();
if ( players.size != 4 )
{
_a557 = players;
_k557 = getFirstArrayKey( _a557 );
while ( isDefined( _k557 ) )
foreach ( player in players )
{
player = _a557[ _k557 ];
if ( isDefined( player ) )
if ( isdefined( player ) )
{
player.dontspeak = 0;
player setclientfieldtoplayer( "isspeaking", 0 );
}
_k557 = getNextArrayKey( _a557, _k557 );
}
flag_clear( "story_vo_playing" );
return;
}
if ( issubstr( convo[i], "plr_0" ) )
{
speaking_player = e_finn;
}
else if ( issubstr( convo[i], "plr_1" ) )
{
speaking_player = e_sal;
}
else if ( issubstr( convo[i], "plr_2" ) )
{
speaking_player = e_billy;
}
else
{
if ( issubstr( convo[ i ], "plr_3" ) )
{
else if ( issubstr( convo[i], "plr_3" ) )
speaking_player = e_arlington;
}
}
if ( isDefined( old_speaking_player ) )
{
if ( isdefined( old_speaking_player ) )
n_dist = distance( old_speaking_player.origin, speaking_player.origin );
}
if ( speaking_player.afterlife || n_dist > n_max_reply_dist )
{
_a593 = players;
_k593 = getFirstArrayKey( _a593 );
while ( isDefined( _k593 ) )
foreach ( player in players )
{
player = _a593[ _k593 ];
if ( isDefined( player ) )
if ( isdefined( player ) )
{
player.dontspeak = 0;
player setclientfieldtoplayer( "isspeaking", 0 );
}
_k593 = getNextArrayKey( _a593, _k593 );
}
flag_clear( "story_vo_playing" );
return;
}
else
{
speaking_player playsoundwithnotify( convo[i], "sound_done" + convo[i] );
speaking_player waittill( "sound_done" + convo[i] );
old_speaking_player = speaking_player;
}
wait 1;
i++;
}
_a613 = players;
_k613 = getFirstArrayKey( _a613 );
while ( isDefined( _k613 ) )
foreach ( player in players )
{
player = _a613[ _k613 ];
if ( isDefined( player ) )
if ( isdefined( player ) )
{
player.dontspeak = 0;
player setclientfieldtoplayer( "isspeaking", 0 );
}
_k613 = getNextArrayKey( _a613, _k613 );
}
flag_clear( "story_vo_playing" );
}
}
@ -526,113 +508,91 @@ electric_chair_vo()
e_nml_zone = getent( "zone_golden_gate_bridge", "targetname" );
n_players_on_bridge_count = get_players_touching( "zone_golden_gate_bridge" );
players = getplayers();
if ( players.size == 4 && n_players_on_bridge_count == 4 )
{
if ( count_zombies_in_zone( "zone_golden_gate_bridge" ) > 0 )
{
vo_play_four_part_conversation( level.four_part_convos["chair_combat_" + randomintrange( 1, 3 )] );
}
else
{
vo_play_four_part_conversation( level.four_part_convos["chair" + randomintrange( 1, 3 )] );
}
return;
}
else
{
if ( isDefined( players[ 0 ] ) && players[ 0 ] istouching( e_nml_zone ) )
else if ( isdefined( players[0] ) && players[0] istouching( e_nml_zone ) )
{
character_name = players[0].character_name;
players[0] vo_play_soliloquy( level.soliloquy_convos["electric_chair_" + character_name] );
}
}
}
}
escape_flight_vo()
{
e_roof_zone = getent( "zone_roof", "targetname" );
players = getplayers();
player = players[randomintrange( 0, players.size )];
if ( isDefined( player ) && player istouching( e_roof_zone ) )
{
if ( isdefined( player ) && player istouching( e_roof_zone ) )
player thread do_player_general_vox( "quest", "build_plane", undefined, 100 );
}
flag_wait( "plane_boarded" );
if ( level.final_flight_activated )
{
return;
}
while ( level.characters_in_nml.size == 0 )
{
wait 0,1;
}
wait 0.1;
wait 1;
while ( level.characters_in_nml.size > 0 )
if ( level.characters_in_nml.size > 0 )
{
character_name = level.characters_in_nml[randomintrange( 0, level.characters_in_nml.size )];
players = getplayers();
_a687 = players;
_k687 = getFirstArrayKey( _a687 );
while ( isDefined( _k687 ) )
{
player = _a687[ _k687 ];
if ( isDefined( player ) && player.character_name == character_name )
foreach ( player in players )
{
if ( isdefined( player ) && player.character_name == character_name )
player thread do_player_general_vox( "quest", "plane_takeoff" );
}
_k687 = getNextArrayKey( _a687, _k687 );
}
}
flag_wait( "plane_departed" );
wait 2;
while ( level.characters_in_nml.size > 0 )
if ( level.characters_in_nml.size > 0 )
{
character_name = level.characters_in_nml[randomintrange( 0, level.characters_in_nml.size )];
players = getplayers();
_a703 = players;
_k703 = getFirstArrayKey( _a703 );
while ( isDefined( _k703 ) )
{
player = _a703[ _k703 ];
if ( isDefined( player ) && player.character_name == character_name )
foreach ( player in players )
{
if ( isdefined( player ) && player.character_name == character_name )
player playsound( "vox_plr_" + player.characterindex + "_plane_flight_0" );
}
_k703 = getNextArrayKey( _a703, _k703 );
}
}
flag_wait( "plane_approach_bridge" );
wait 3,5;
while ( level.characters_in_nml.size > 0 )
wait 3.5;
if ( level.characters_in_nml.size > 0 )
{
character_name = level.characters_in_nml[randomintrange( 0, level.characters_in_nml.size )];
players = getplayers();
_a719 = players;
_k719 = getFirstArrayKey( _a719 );
while ( isDefined( _k719 ) )
{
player = _a719[ _k719 ];
if ( isDefined( player ) && player.character_name == character_name )
foreach ( player in players )
{
if ( isdefined( player ) && player.character_name == character_name )
player playsound( "vox_plr_" + player.characterindex + "_plane_crash_0" );
}
_k719 = getNextArrayKey( _a719, _k719 );
}
}
flag_wait( "plane_zapped" );
players = getplayers();
_a732 = players;
_k732 = getFirstArrayKey( _a732 );
while ( isDefined( _k732 ) )
{
player = _a732[ _k732 ];
if ( isDefined( player ) && isinarray( level.characters_in_nml, player.character_name ) )
foreach ( player in players )
{
if ( isdefined( player ) && isinarray( level.characters_in_nml, player.character_name ) )
player thread player_scream_thread();
}
_k732 = getNextArrayKey( _a732, _k732 );
}
}
player_scream_thread()
@ -640,17 +600,13 @@ player_scream_thread()
self endon( "death" );
self endon( "disconnect" );
players = getplayers();
_a749 = players;
_k749 = getFirstArrayKey( _a749 );
while ( isDefined( _k749 ) )
{
player = _a749[ _k749 ];
if ( isDefined( player ) && isinarray( level.characters_in_nml, player.character_name ) )
foreach ( player in players )
{
if ( isdefined( player ) && isinarray( level.characters_in_nml, player.character_name ) )
player playsoundtoplayer( "vox_plr_" + player.characterindex + "_free_fall_0", self );
}
_k749 = getNextArrayKey( _a749, _k749 );
}
level flag_wait( "plane_crashed" );
self stopsounds();
self.dontspeak = 0;
@ -660,9 +616,11 @@ player_scream_thread()
sndhitelectrifiedpulley( str_master_key_location )
{
self endon( "master_key_pulley_" + str_master_key_location );
while ( 1 )
while ( true )
{
self waittill( "trigger", e_triggerer );
self playsound( "fly_elec_sparks_key" );
wait 1;
}
@ -670,23 +628,18 @@ sndhitelectrifiedpulley( str_master_key_location )
is_player_character_present( character_name )
{
if ( !isDefined( character_name ) )
{
return 0;
}
if ( !isdefined( character_name ) )
return false;
players = getplayers();
_a785 = players;
_k785 = getFirstArrayKey( _a785 );
while ( isDefined( _k785 ) )
foreach ( player in players )
{
player = _a785[ _k785 ];
if ( isDefined( player.character_name ) && player.character_name == character_name )
{
return 1;
if ( isdefined( player.character_name ) && player.character_name == character_name )
return true;
}
_k785 = getNextArrayKey( _a785, _k785 );
}
return 0;
return false;
}
get_players_touching( scr_touched_name )
@ -694,40 +647,34 @@ get_players_touching( scr_touched_name )
n_touching_count = 0;
e_touched = getent( scr_touched_name, "targetname" );
/#
assert( isDefined( e_touched ) );
assert( isdefined( e_touched ) );
#/
a_players = getplayers();
_a803 = a_players;
_k803 = getFirstArrayKey( _a803 );
while ( isDefined( _k803 ) )
{
player = _a803[ _k803 ];
if ( isDefined( player ) && player istouching( e_touched ) )
foreach ( player in a_players )
{
if ( isdefined( player ) && player istouching( e_touched ) )
n_touching_count++;
}
_k803 = getNextArrayKey( _a803, _k803 );
}
return n_touching_count;
}
count_zombies_in_zone( volume )
{
e_zone = getent( volume, "targetname" );
if ( !isDefined( e_zone ) )
{
if ( !isdefined( e_zone ) )
return;
}
n_zombie_count = 0;
zombies = getaispeciesarray( "axis", "all" );
i = 0;
while ( i < zombies.size )
for ( i = 0; i < zombies.size; i++ )
{
if ( zombies[i] istouching( e_zone ) )
{
n_zombie_count++;
}
i++;
}
return n_zombie_count;
}

View File

@ -1,28 +1,30 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\zombies\_zm_magicbox;
precache() //checked matches cerberus output
precache()
{
}
main() //checked matches cerberus output
main()
{
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "working" );
maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index );
maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "working" );
maps\mp\zombies\_zm_game_module::set_current_game_module( level.game_module_standard_index );
flag_wait( "initial_blackscreen_passed" );
flag_set( "power_on" );
zm_treasure_chest_init();
}
zm_treasure_chest_init() //checked matches cerberus output
zm_treasure_chest_init()
{
chest1 = getstruct( "start_chest", "script_noteworthy" );
level.chests = [];
level.chests[level.chests.size] = chest1;
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" );
maps\mp\zombies\_zm_magicbox::treasure_chest_init( "start_chest" );
}

View File

@ -1,29 +1,30 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm_ai_brutus;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_audio;
#include maps/mp/animscripts/zm_death;
#include maps/mp/zombies/_zm_laststand;
#include maps/mp/zombies/_zm_score;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\animscripts\zm_death;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_ai_brutus;
//#using_animtree( "fxanim_props" ); //uncomment when the compiler supports anim trees
init_fan_trap_trigs() //checked matches cerberus output
init_fan_trap_trigs()
{
trap_trigs = getentarray( "fan_trap_use_trigger", "targetname" );
array_thread( trap_trigs, ::fan_trap_think );
init_fan_fxanim( "wardens_office" );
}
init_fan_trap_animtree() //checked matches cerberus output
init_fan_trap_animtree()
{
scriptmodelsuseanimtree( -1 );
}
init_fan_fxanim( str_loc ) //checked matches cerberus output
#using_animtree("fxanim_props");
init_fan_fxanim( str_loc )
{
e_fan = getent( "fxanim_fan_" + str_loc, "targetname" );
level.fan_trap_fxanims = [];
@ -32,7 +33,7 @@ init_fan_fxanim( str_loc ) //checked matches cerberus output
level.fan_trap_fxanims["fan_trap_end"] = %fxanim_zom_al_trap_fan_end_anim;
}
fan_trap_think() //checked changed to match cerberus output
fan_trap_think()
{
triggers = getentarray( self.targetname, "targetname" );
self.cost = 1000;
@ -49,17 +50,17 @@ fan_trap_think() //checked changed to match cerberus output
flag_wait( "activate_warden_office" );
zapper_light_green( light_name );
self hint_string( &"ZM_PRISON_FAN_TRAP", self.cost );
while ( 1 )
while ( true )
{
self waittill( "trigger", who );
if ( who in_revive_trigger() )
{
continue;
}
if ( !isDefined( self.is_available ) )
{
if ( !isdefined( self.is_available ) )
continue;
}
if ( is_player_valid( who ) )
{
if ( who.score >= self.cost )
@ -69,26 +70,29 @@ fan_trap_think() //checked changed to match cerberus output
if ( !self.has_been_used )
{
self.has_been_used = 1;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "trap" );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "trap" );
who do_player_general_vox( "general", "discover_trap" );
}
else
{
who do_player_general_vox( "general", "start_trap" );
}
self.zombie_dmg_trig.in_use = 1;
self.zombie_dmg_trig.active = 1;
self playsound( "zmb_trap_activate" );
self thread fan_trap_move_switch( self );
self waittill( "switch_activated" );
who minus_to_player_score( self.cost );
level.trapped_track["fan"] = 1;
level notify( "trap_activated" );
who maps/mp/zombies/_zm_stats::increment_client_stat( "prison_fan_trap_used", 0 );
who maps\mp\zombies\_zm_stats::increment_client_stat( "prison_fan_trap_used", 0 );
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_ACTIVE" );
self.zombie_dmg_trig setvisibletoall();
self thread activate_fan_trap();
self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string );
clientnotify( self.script_string + "off" );
self.zombie_dmg_trig notify( "fan_trap_finished" );
self.zombie_dmg_trig.active = 0;
@ -105,7 +109,7 @@ fan_trap_think() //checked changed to match cerberus output
}
}
activate_fan_trap() //checked changed to match cerberus output
activate_fan_trap()
{
self.zombie_dmg_trig thread fan_trap_damage( self );
e_fan = getent( "fxanim_fan_" + self.script_string, "targetname" );
@ -116,13 +120,16 @@ activate_fan_trap() //checked changed to match cerberus output
n_idle_time = getanimlength( level.fan_trap_fxanims["fan_trap_idle"] );
n_end_time = getanimlength( level.fan_trap_fxanims["fan_trap_end"] );
e_fan setanim( level.fan_trap_fxanims["fan_trap_start"], 1, 0.1, 1 );
wait n_start_time;
wait( n_start_time );
e_fan setanim( level.fan_trap_fxanims["fan_trap_idle"], 1, 0.1, 1 );
self thread fan_trap_timeout();
self thread fan_trap_rumble_think();
self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string );
e_fan setanim( level.fan_trap_fxanims["fan_trap_end"], 1, 0.1, 1 );
a_players = getplayers();
foreach ( player in a_players )
{
if ( is_true( player.fan_trap_rumble ) )
@ -131,45 +138,45 @@ activate_fan_trap() //checked changed to match cerberus output
player.fan_trap_rumble = 0;
}
}
e_fan stoploopsound( 0.75 );
e_fan playsound( "zmb_trap_fan_end" );
wait n_end_time;
wait( n_end_time );
}
fan_trap_timeout() //checked does not match cerberus output did not change
fan_trap_timeout()
{
self.zombie_dmg_trig endon( "trap_finished_" + self.script_string );
n_duration = 0;
while ( n_duration < 25 )
{
for ( n_duration = 0; n_duration < 25; n_duration += 0.05 )
wait 0.05;
n_duration += 0.05;
}
self.zombie_dmg_trig notify( "trap_finished_" + self.script_string );
}
fan_trap_rumble_think() //checked matches cerberus output
fan_trap_rumble_think()
{
self.zombie_dmg_trig endon( "trap_finished_" + self.script_string );
while ( 1 )
while ( true )
{
self.rumble_trig waittill( "trigger", ent );
if ( isplayer( ent ) )
{
if ( !is_true( ent.fan_trap_rumble ) )
{
self thread fan_trap_rumble( ent );
}
}
}
}
fan_trap_rumble( player ) //checked changed to match cerberus output
fan_trap_rumble( player )
{
player endon( "death" );
player endon( "disconnect" );
self.zombie_dmg_trig endon( "trap_finished_" + self.script_string );
while ( 1 )
while ( true )
{
if ( player istouching( self.rumble_trig ) )
{
@ -186,29 +193,31 @@ fan_trap_rumble( player ) //checked changed to match cerberus output
}
}
fan_trap_damage( parent ) //checked partially changed to match cerberus output
fan_trap_damage( parent )
{
if ( isDefined( level.custom_fan_trap_damage_func ) )
if ( isdefined( level.custom_fan_trap_damage_func ) )
{
self thread [[ level.custom_fan_trap_damage_func ]]( parent );
return;
}
self endon( "fan_trap_finished" );
while ( 1 )
while ( true )
{
self waittill( "trigger", ent );
if ( isplayer( ent ) )
{
ent thread player_fan_trap_damage();
}
else
{
if ( is_true( ent.is_brutus ) )
{
ent maps/mp/zombies/_zm_ai_brutus::trap_damage_callback( self );
ent maps\mp\zombies\_zm_ai_brutus::trap_damage_callback( self );
return;
}
if ( !isDefined( ent.marked_for_death ) )
if ( !isdefined( ent.marked_for_death ) )
{
ent.marked_for_death = 1;
ent thread zombie_fan_trap_death();
@ -217,7 +226,7 @@ fan_trap_damage( parent ) //checked partially changed to match cerberus output
}
}
fan_trap_move_switch( parent ) //checked matches cerberus output
fan_trap_move_switch( parent )
{
light_name = "";
tswitch = getent( "trap_handle_" + parent.script_linkto, "targetname" );
@ -225,54 +234,57 @@ fan_trap_move_switch( parent ) //checked matches cerberus output
zapper_light_red( light_name );
tswitch rotatepitch( -180, 0.5 );
tswitch playsound( "amb_sparks_l_b" );
tswitch waittill( "rotatedone" );
self notify( "switch_activated" );
self waittill( "available" );
tswitch rotatepitch( 180, 0.5 );
zapper_light_green( light_name );
}
player_fan_trap_damage() //checked matches cerberus output
player_fan_trap_damage()
{
self endon( "death" );
self endon( "disconnect" );
if ( !self hasperk( "specialty_armorvest" ) || ( self.health - 100 ) < 1 )
{
if ( !self hasperk( "specialty_armorvest" ) || self.health - 100 < 1 )
radiusdamage( self.origin, 10, self.health + 100, self.health + 100 );
}
else
{
self dodamage( 50, self.origin );
}
}
zombie_fan_trap_death() //checked matches cerberus output
zombie_fan_trap_death()
{
self endon( "death" );
if ( !isDefined( self.is_brutus ) )
if ( !isdefined( self.is_brutus ) )
{
self.a.gib_ref = random( array( "guts", "right_arm", "left_arm", "head" ) );
self thread maps/mp/animscripts/zm_death::do_gib();
self thread maps\mp\animscripts\zm_death::do_gib();
}
self setclientfield( "fan_trap_blood_fx", 1 );
self thread stop_fan_trap_blood_fx();
self dodamage( self.health + 1000, self.origin );
}
stop_fan_trap_blood_fx() //checked matches cerberus output
stop_fan_trap_blood_fx()
{
wait 2;
wait 2.0;
self setclientfield( "fan_trap_blood_fx", 0 );
}
init_acid_trap_trigs() //checked matches cerberus output
init_acid_trap_trigs()
{
trap_trigs = getentarray( "acid_trap_trigger", "targetname" );
array_thread( trap_trigs, ::acid_trap_think );
level thread acid_trap_host_migration_listener();
}
acid_trap_think() //checked changed to match cerberus output
acid_trap_think()
{
triggers = getentarray( self.targetname, "targetname" );
self.is_available = 1;
@ -287,17 +299,17 @@ acid_trap_think() //checked changed to match cerberus output
flag_wait_any( "activate_cafeteria", "activate_infirmary" );
zapper_light_green( light_name );
self hint_string( &"ZM_PRISON_ACID_TRAP", self.cost );
while ( 1 )
while ( true )
{
self waittill( "trigger", who );
if ( who in_revive_trigger() )
{
continue;
}
if ( !isDefined( self.is_available ) )
{
if ( !isdefined( self.is_available ) )
continue;
}
if ( is_player_valid( who ) )
{
if ( who.score >= self.cost )
@ -307,38 +319,39 @@ acid_trap_think() //checked changed to match cerberus output
if ( !self.has_been_used )
{
self.has_been_used = 1;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "trap" );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "trap" );
who do_player_general_vox( "general", "discover_trap" );
}
else
{
who do_player_general_vox( "general", "start_trap" );
}
self.zombie_dmg_trig.in_use = 1;
self.zombie_dmg_trig.active = 1;
self playsound( "zmb_trap_activate" );
self thread acid_trap_move_switch( self );
self waittill( "switch_activated" );
who minus_to_player_score( self.cost );
level.trapped_track["acid"] = 1;
level notify( "trap_activated" );
who maps/mp/zombies/_zm_stats::increment_client_stat( "prison_acid_trap_used", 0 );
who maps\mp\zombies\_zm_stats::increment_client_stat( "prison_acid_trap_used", 0 );
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_ACTIVE" );
self thread activate_acid_trap();
self.zombie_dmg_trig waittill( "acid_trap_fx_done" );
clientnotify( self.script_string + "off" );
if ( isDefined( self.fx_org ) )
{
if ( isdefined( self.fx_org ) )
self.fx_org delete();
}
if ( isDefined( self.zapper_fx_org ) )
{
if ( isdefined( self.zapper_fx_org ) )
self.zapper_fx_org delete();
}
if ( isDefined( self.zapper_fx_switch_org ) )
{
if ( isdefined( self.zapper_fx_switch_org ) )
self.zapper_fx_switch_org delete();
}
self.zombie_dmg_trig notify( "acid_trap_finished" );
self.zombie_dmg_trig.active = 0;
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_COOLDOWN" );
@ -353,7 +366,7 @@ acid_trap_think() //checked changed to match cerberus output
}
}
acid_trap_move_switch( parent ) //checked matches cerberus output
acid_trap_move_switch( parent )
{
light_name = "";
tswitch = getent( "trap_handle_" + parent.script_linkto, "targetname" );
@ -361,48 +374,56 @@ acid_trap_move_switch( parent ) //checked matches cerberus output
zapper_light_red( light_name );
tswitch rotatepitch( -180, 0.5 );
tswitch playsound( "amb_sparks_l_b" );
tswitch waittill( "rotatedone" );
self notify( "switch_activated" );
self waittill( "available" );
tswitch rotatepitch( 180, 0.5 );
zapper_light_green( light_name );
}
activate_acid_trap() //checked changed to match cerberus output
activate_acid_trap()
{
clientnotify( self.target );
fire_points = getstructarray( self.target, "targetname" );
for ( i = 0; i < fire_points.size; i++ )
{
wait_network_frame();
fire_points[i] thread acid_trap_fx( self );
}
self.zombie_dmg_trig thread acid_trap_damage();
}
acid_trap_damage() //checked partially changed to match cerberus output
acid_trap_damage()
{
if ( isDefined( level.custom_acid_trap_damage_func ) )
if ( isdefined( level.custom_acid_trap_damage_func ) )
{
self thread [[ level.custom_acid_trap_damage_func ]]();
return;
}
self endon( "acid_trap_finished" );
while ( 1 )
while ( true )
{
self waittill( "trigger", ent );
if ( isplayer( ent ) )
{
ent thread player_acid_damage( self );
}
else
{
if ( is_true( ent.is_brutus ) )
{
ent maps/mp/zombies/_zm_ai_brutus::trap_damage_callback( self );
ent maps\mp\zombies\_zm_ai_brutus::trap_damage_callback( self );
return;
}
if ( !isDefined( ent.marked_for_death ) )
if ( !isdefined( ent.marked_for_death ) )
{
ent.marked_for_death = 1;
ent thread zombie_acid_damage();
@ -411,34 +432,38 @@ acid_trap_damage() //checked partially changed to match cerberus output
}
}
zombie_acid_damage() //checked matches cerberus output
zombie_acid_damage()
{
self endon( "death" );
self setclientfield( "acid_trap_death_fx", 1 );
wait randomfloatrange( 0.25, 2 );
if ( !isDefined( self.is_brutus ) )
wait( randomfloatrange( 0.25, 2.0 ) );
if ( !isdefined( self.is_brutus ) )
{
self.a.gib_ref = random( array( "right_arm", "left_arm", "head", "right_leg", "left_leg", "no_legs" ) );
self thread maps/mp/animscripts/zm_death::do_gib();
self thread maps\mp\animscripts\zm_death::do_gib();
}
self dodamage( self.health + 1000, self.origin );
}
stop_acid_death_fx() //checked matches cerberus output
stop_acid_death_fx()
{
wait 3;
wait 3.0;
self setclientfield( "acid_trap_death_fx", 0 );
}
player_acid_damage( t_damage ) //checked changed to match cerberus output
player_acid_damage( t_damage )
{
self endon( "death" );
self endon( "disconnect" );
t_damage endon( "acid_trap_finished" );
if ( !isDefined( self.is_in_acid ) && !self player_is_in_laststand() )
if ( !isdefined( self.is_in_acid ) && !self player_is_in_laststand() )
{
self.is_in_acid = 1;
self thread player_acid_damage_cooldown();
while ( self istouching( t_damage ) && !self player_is_in_laststand() && !self.afterlife )
{
self dodamage( self.maxhealth / 2, self.origin );
@ -447,34 +472,36 @@ player_acid_damage( t_damage ) //checked changed to match cerberus output
}
}
player_acid_damage_cooldown() //checked matches cerberus output
player_acid_damage_cooldown()
{
self endon( "disconnect" );
wait 1;
if ( isDefined( self ) )
{
if ( isdefined( self ) )
self.is_in_acid = undefined;
}
}
acid_trap_fx( notify_ent ) //checked matches cerberus output
acid_trap_fx( notify_ent )
{
wait 25;
notify_ent.zombie_dmg_trig notify( "acid_trap_fx_done" );
}
acid_trap_host_migration_listener() //checked changed to match cerberus output
acid_trap_host_migration_listener()
{
level endon( "end_game" );
level notify( "acid_trap_hostmigration" );
level endon( "acid_trap_hostmigration" );
while ( 1 )
while ( true )
{
level waittill( "host_migration_end" );
trap_trigs = getentarray( "acid_trap_trigger", "targetname" );
foreach ( trigger in trap_trigs )
{
if ( isDefined( trigger.zombie_dmg_trig ) && isDefined( trigger.zombie_dmg_trig.active ) )
if ( isdefined( trigger.zombie_dmg_trig ) && isdefined( trigger.zombie_dmg_trig.active ) )
{
if ( trigger.zombie_dmg_trig.active == 1 )
{
@ -486,16 +513,15 @@ acid_trap_host_migration_listener() //checked changed to match cerberus output
}
}
init_tower_trap_trigs() //checked changed to match cerberus output
init_tower_trap_trigs()
{
trap_trigs = getentarray( "tower_trap_activate_trigger", "targetname" );
foreach ( trigger in trap_trigs )
{
trigger thread tower_trap_trigger_think();
}
}
tower_trap_trigger_think() //checked changed to match cerberus output
tower_trap_trigger_think()
{
self.range_trigger = getent( self.target, "targetname" );
self.upgrade_trigger = getent( self.script_string, "script_noteworthy" );
@ -506,18 +532,19 @@ tower_trap_trigger_think() //checked changed to match cerberus output
self.in_use = 0;
self.has_been_used = 0;
self.sndtowerent = spawn( "script_origin", ( -21, 5584, 356 ) );
while ( 1 )
while ( true )
{
self hint_string( &"ZM_PRISON_TOWER_TRAP", self.cost );
self waittill( "trigger", who );
if ( who in_revive_trigger() )
{
continue;
}
if ( !isDefined( self.is_available ) )
{
if ( !isdefined( self.is_available ) )
continue;
}
if ( is_player_valid( who ) )
{
if ( who.score >= self.cost )
@ -530,19 +557,20 @@ tower_trap_trigger_think() //checked changed to match cerberus output
who do_player_general_vox( "general", "discover_trap" );
}
else
{
who do_player_general_vox( "general", "start_trap" );
}
self.in_use = 1;
self.active = 1;
play_sound_at_pos( "purchase", who.origin );
self thread tower_trap_move_switch( self );
self playsound( "zmb_trap_activate" );
self waittill( "switch_activated" );
who minus_to_player_score( self.cost );
level.trapped_track["tower"] = 1;
level notify( "trap_activated" );
who maps/mp/zombies/_zm_stats::increment_client_stat( "prison_sniper_tower_used", 0 );
who maps\mp\zombies\_zm_stats::increment_client_stat( "prison_sniper_tower_used", 0 );
self hint_string( &"ZOMBIE_TRAP_ACTIVE" );
self.sndtowerent playsound( "zmb_trap_tower_start" );
self.sndtowerent playloopsound( "zmb_trap_tower_loop", 1 );
@ -551,7 +579,9 @@ tower_trap_trigger_think() //checked changed to match cerberus output
self thread tower_upgrade_trigger_think();
level thread open_tower_trap_upgrade_panel();
level thread tower_trap_upgrade_panel_closes_early();
self waittill( "tower_trap_off" );
self.sndtowerent stoploopsound( 1 );
self.sndtowerent playsound( "zmb_trap_tower_end" );
self.upgrade_trigger notify( "afterlife_interact_reset" );
@ -570,43 +600,49 @@ tower_trap_trigger_think() //checked changed to match cerberus output
}
}
tower_upgrade_trigger_think() //checked matches cerberus output
tower_upgrade_trigger_think()
{
self endon( "tower_trap_off" );
self.upgrade_trigger.cost = 1000;
self.upgrade_trigger.in_use = 0;
self.upgrade_trigger.is_available = 1;
while ( 1 )
while ( true )
{
level waittill( self.upgrade_trigger.script_string );
level.trapped_track["tower_upgrade"] = 1;
level notify( "tower_trap_upgraded" );
level notify( "close_tower_trap_upgrade_panel" );
self upgrade_tower_trap_weapon();
self notify( "tower_trap_reset_timer" );
self thread tower_trap_timer();
self waittill( "tower_trap_off" );
wait 25;
}
}
open_tower_trap_upgrade_panel() //checked matches cerberus output
open_tower_trap_upgrade_panel()
{
e_door = getent( "tower_shockbox_door", "targetname" );
e_door moveto( e_door.origin + vectorScale( ( 0, 1, 0 ), 40 ), 1 );
e_door moveto( e_door.origin + vectorscale( ( 0, -1, 0 ), 40.0 ), 1.0 );
level waittill( "close_tower_trap_upgrade_panel" );
e_door moveto( e_door.origin + vectorScale( ( 0, 1, 0 ), 40 ), 1 );
e_door moveto( e_door.origin + vectorscale( ( 0, 1, 0 ), 40.0 ), 1.0 );
}
tower_trap_upgrade_panel_closes_early() //checked matches cerberus output
tower_trap_upgrade_panel_closes_early()
{
level endon( "tower_trap_upgraded" );
n_waittime = 24;
wait n_waittime;
wait( n_waittime );
level notify( "close_tower_trap_upgrade_panel" );
}
tower_trap_move_switch( parent ) //checked matches cerberus output
tower_trap_move_switch( parent )
{
light_name = "";
tswitch = getent( "trap_handle_" + parent.script_linkto, "targetname" );
@ -614,36 +650,41 @@ tower_trap_move_switch( parent ) //checked matches cerberus output
zapper_light_red( light_name );
tswitch rotatepitch( -180, 0.5 );
tswitch playsound( "amb_sparks_l_b" );
tswitch waittill( "rotatedone" );
self notify( "switch_activated" );
self waittill( "available" );
tswitch rotatepitch( 180, 0.5 );
if ( isDefined( parent.script_noteworthy ) )
{
if ( isdefined( parent.script_noteworthy ) )
zapper_light_green( light_name );
}
}
activate_tower_trap() //checked changed to match cerberus output
activate_tower_trap()
{
self endon( "tower_trap_off" );
self.weapon_name = "tower_trap_zm";
self.tag_to_target = "J_Head";
self.trap_reload_time = 0.75;
while ( 1 )
while ( true )
{
zombies = getaiarray( level.zombie_team );
zombies_sorted = [];
foreach ( zombie in zombies )
{
if ( zombie istouching( self.range_trigger ) )
{
zombies_sorted[zombies_sorted.size] = zombie;
}
}
if ( zombies_sorted.size <= 0 )
{
wait_network_frame();
continue;
}
else
{
@ -653,119 +694,103 @@ activate_tower_trap() //checked changed to match cerberus output
}
}
upgrade_tower_trap_weapon() //checked matches cerberus output
upgrade_tower_trap_weapon()
{
self.weapon_name = "tower_trap_upgraded_zm";
self.tag_to_target = "J_SpineLower";
self.trap_reload_time = 1.5;
}
tower_trap_timer() //checked matches cerberus output
tower_trap_timer()
{
self endon( "tower_trap_reset_timer" );
/*
/#
self thread debug_tower_trap_timer();
#/
*/
wait 25;
self notify( "tower_trap_off" );
}
debug_tower_trap_timer() //checked changed to match cerberus output
debug_tower_trap_timer()
{
self endon( "tower_trap_reset_timer" );
for ( i = 1; i <= 25; i++ )
{
/*
/#
iprintln( "Tower Trap Timer = " + i );
#/
*/
wait 1;
wait 1.0;
}
}
tower_trap_fires( a_zombies ) //checked changed to match cerberus output
tower_trap_fires( a_zombies )
{
if ( isDefined( level.custom_tower_trap_fires_func ) )
if ( isdefined( level.custom_tower_trap_fires_func ) )
{
self thread [[ level.custom_tower_trap_fires_func ]]( a_zombies );
return;
}
self endon( "tower_trap_off" );
e_org = getstruct( self.range_trigger.target, "targetname" );
n_index = randomintrange( 0, a_zombies.size );
while ( isalive( a_zombies[ n_index ] ) )
for ( n_index = randomintrange( 0, a_zombies.size ); isalive( a_zombies[n_index] ); n_index = randomintrange( 0, a_zombies.size ) )
{
e_target = a_zombies[n_index];
v_zombietarget = e_target gettagorigin( self.tag_to_target );
if ( sighttracepassed( e_org.origin, v_zombietarget, 1, undefined ) )
{
magicbullet( self.weapon_name, e_org.origin, v_zombietarget );
wait self.trap_reload_time;
}
else
{
arrayremovevalue( a_zombies, e_target, 0 );
wait_network_frame();
if ( a_zombies.size <= 0 )
{
break;
}
n_index = randomintrange( 0, a_zombies.size );
}
asm_cond( a_zombies.size <= 0, loc_2676 );
asm_jump( loc_268A );
}
}
hint_string( string, cost ) //checked matches cerberus output
{
if ( isDefined( cost ) )
hint_string( string, cost )
{
if ( isdefined( cost ) )
self sethintstring( string, cost );
}
else
{
self sethintstring( string );
}
self setcursorhint( "HINT_NOICON" );
}
zapper_light_red( lightname ) //checked changed to match cerberus output
zapper_light_red( lightname )
{
zapper_lights = getentarray( lightname, "targetname" );
for ( i = 0; i < zapper_lights.size; i++ )
{
zapper_lights[i] setmodel( "p6_zm_al_wall_trap_control_red" );
}
}
zapper_light_green( lightname ) //checked changed to match cerberus output
zapper_light_green( lightname )
{
zapper_lights = getentarray( lightname, "targetname" );
for ( i = 0; i < zapper_lights.size; i++ )
{
zapper_lights[i] setmodel( "p6_zm_al_wall_trap_control" );
}
}
get_trap_light_name() //checked matches cerberus output
get_trap_light_name()
{
tswitch = getent( "trap_handle_" + self.script_linkto, "targetname" );
switch ( tswitch.script_linkname )
{
case "1":
case "2":
case "1":
light_name = "trap_control_wardens_office";
break;
case "3":
case "4":
case "5":
case "4":
case "3":
light_name = "trap_control_cafeteria";
break;
case "99":
light_name = "trap_control_docks";
break;
}
return light_name;
}

View File

@ -1,18 +1,17 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm_powerups;
#include maps/mp/zombies/_zm_score;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_audio;
#include maps/mp/animscripts/shared;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\animscripts\shared;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_powerups;
//#using_animtree( "fxanim_props" ); //leave commented for now for compiling
init() //checked changed to match cerberus output
init()
{
flag_init( "soul_catchers_charged" );
level.soul_catchers = [];
@ -20,44 +19,47 @@ init() //checked changed to match cerberus output
level.no_gib_in_wolf_area = ::check_for_zombie_in_wolf_area;
level.soul_catcher_clip["rune_2"] = getent( "wolf_clip_docks", "targetname" );
level.soul_catcher_clip["rune_3"] = getent( "wolf_clip_infirmary", "targetname" );
foreach ( e_clip in level.soul_catcher_clip )
{
e_clip setinvisibletoall();
}
level thread create_anim_references_on_server();
registerclientfield( "actor", "make_client_clone", 9000, 4, "int" );
onplayerconnect_callback( ::toggle_redeemer_trigger );
onplayerconnect_callback( ::hellhole_projectile_watch );
onplayerconnect_callback( ::hellhole_tomahawk_watch );
level.a_wolf_structs = getstructarray( "wolf_position", "targetname" );
for ( i = 0; i < level.a_wolf_structs.size; i++ )
{
registerclientfield( "world", level.a_wolf_structs[i].script_parameters, 9000, 3, "int" );
level.soul_catchers[i] = level.a_wolf_structs[i];
level.soul_catchers_vol[i] = getent( level.a_wolf_structs[i].target, "targetname" );
}
for ( i = 0; i < level.soul_catchers.size; i++ )
{
level.soul_catchers[i].souls_received = 0;
level.soul_catchers[i].is_eating = 0;
level.soul_catchers[i] thread soul_catcher_check();
if ( is_classic() )
{
level.soul_catchers[i] thread soul_catcher_state_manager();
}
else
{
level.soul_catchers[i] thread grief_soul_catcher_state_manager();
}
level.soul_catchers[i] thread wolf_head_removal( "tomahawk_door_sign_" + ( i + 1 ) );
level.soul_catchers_vol[i] = getent( level.soul_catchers[i].target, "targetname" );
}
level.soul_catchers_charged = 0;
level thread soul_catchers_charged();
array_thread( level.zombie_spawners, ::add_spawn_function, ::zombie_spawn_func );
}
create_anim_references_on_server() //checked matches cerberus output
#using_animtree("fxanim_props");
create_anim_references_on_server()
{
root = %root;
wolfhead_intro_anim = %o_zombie_dreamcatcher_intro;
@ -82,9 +84,10 @@ create_anim_references_on_server() //checked matches cerberus output
wolfhead_body_anims["front"] = %ai_zombie_dreamcatcher_wallconsume_align_f;
}
soul_catcher_state_manager() //checked changed to match cerberus output
soul_catcher_state_manager()
{
wait 1;
wait 1.0;
if ( self.script_noteworthy == "rune_3" )
{
trigger = getent( "wolf_hurt_trigger", "targetname" );
@ -95,8 +98,11 @@ soul_catcher_state_manager() //checked changed to match cerberus output
trigger = getent( "wolf_hurt_trigger_docks", "targetname" );
trigger hide();
}
level setclientfield( self.script_parameters, 0 );
self waittill( "first_zombie_killed_in_zone" );
if ( self.script_noteworthy == "rune_3" )
{
trigger = getent( "wolf_hurt_trigger", "targetname" );
@ -107,25 +113,27 @@ soul_catcher_state_manager() //checked changed to match cerberus output
trigger = getent( "wolf_hurt_trigger_docks", "targetname" );
trigger show();
}
if ( isDefined( level.soul_catcher_clip[ self.script_noteworthy ] ) )
{
if ( isdefined( level.soul_catcher_clip[self.script_noteworthy] ) )
level.soul_catcher_clip[self.script_noteworthy] setvisibletoall();
}
level setclientfield( self.script_parameters, 1 );
anim_length = getanimlength( %o_zombie_dreamcatcher_intro );
wait anim_length;
wait( anim_length );
while ( !self.is_charged )
{
level setclientfield( self.script_parameters, 2 );
self waittill_either( "fully_charged", "finished_eating" );
}
level setclientfield( self.script_parameters, 6 );
anim_length = getanimlength( %o_zombie_dreamcatcher_outtro );
wait anim_length;
if ( isDefined( level.soul_catcher_clip[ self.script_noteworthy ] ) )
{
wait( anim_length );
if ( isdefined( level.soul_catcher_clip[self.script_noteworthy] ) )
level.soul_catcher_clip[self.script_noteworthy] delete();
}
if ( self.script_noteworthy == "rune_3" )
{
trigger = getent( "wolf_hurt_trigger", "targetname" );
@ -136,35 +144,40 @@ soul_catcher_state_manager() //checked changed to match cerberus output
trigger = getent( "wolf_hurt_trigger_docks", "targetname" );
trigger delete();
}
level setclientfield( self.script_parameters, 7 );
}
grief_soul_catcher_state_manager() //checked matches cerberus output
grief_soul_catcher_state_manager()
{
wait 1;
while ( 1 )
while ( true )
{
level setclientfield( self.script_parameters, 0 );
self waittill( "first_zombie_killed_in_zone" );
if ( isDefined( level.soul_catcher_clip[ self.script_noteworthy ] ) )
{
if ( isdefined( level.soul_catcher_clip[self.script_noteworthy] ) )
level.soul_catcher_clip[self.script_noteworthy] setvisibletoall();
}
level setclientfield( self.script_parameters, 1 );
anim_length = getanimlength( %o_zombie_dreamcatcher_intro );
wait anim_length;
wait( anim_length );
while ( !self.is_charged )
{
level setclientfield( self.script_parameters, 2 );
self waittill_either( "fully_charged", "finished_eating" );
}
level setclientfield( self.script_parameters, 6 );
anim_length = getanimlength( %o_zombie_dreamcatcher_outtro );
wait anim_length;
if ( isDefined( level.soul_catcher_clip[ self.script_noteworthy ] ) )
{
wait( anim_length );
if ( isdefined( level.soul_catcher_clip[self.script_noteworthy] ) )
level.soul_catcher_clip[self.script_noteworthy] delete();
}
self.souls_received = 0;
level thread wolf_spit_out_powerup();
wait 20;
@ -172,13 +185,13 @@ grief_soul_catcher_state_manager() //checked matches cerberus output
}
}
wolf_spit_out_powerup() //checked changed to match cerberus output
{
if ( isDefined( level.enable_magic ) && !level.enable_magic )
wolf_spit_out_powerup()
{
if ( !( isdefined( level.enable_magic ) && level.enable_magic ) )
return;
}
power_origin_struct = getstruct( "wolf_puke_powerup_origin", "targetname" );
if ( randomint( 100 ) < 20 )
{
for ( i = 0; i < level.zombie_powerup_array.size; i++ )
@ -191,35 +204,39 @@ wolf_spit_out_powerup() //checked changed to match cerberus output
}
}
}
while ( 1 )
else
{
while ( true )
{
level.zombie_powerup_index = randomint( level.zombie_powerup_array.size );
if ( level.zombie_powerup_array[level.zombie_powerup_index] == "nuke" )
{
wait 0.05;
continue;
}
break;
}
spawn_infinite_powerup_drop( power_origin_struct.origin, level.zombie_powerup_array[ level.zombie_powerup_index ] );
power_ups = get_array_of_closest( power_origin_struct.origin, level.active_powerups, undefined, undefined, 100 );
if ( isDefined( power_ups[ 0 ] ) )
{
power_ups[ 0 ] movez( 120, 4 );
}
}
zombie_spawn_func() //checked matches cerberus output
spawn_infinite_powerup_drop( power_origin_struct.origin, level.zombie_powerup_array[level.zombie_powerup_index] );
power_ups = get_array_of_closest( power_origin_struct.origin, level.active_powerups, undefined, undefined, 100 );
if ( isdefined( power_ups[0] ) )
power_ups[0] movez( 120, 4 );
}
zombie_spawn_func()
{
self.actor_killed_override = ::zombie_killed_override;
}
zombie_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) //checked changed to match cerberus output
zombie_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime )
{
if ( !is_true( self.has_legs ) )
{
return;
}
if ( isplayer( attacker ) )
{
for ( i = 0; i < level.soul_catchers.size; i++ )
@ -236,166 +253,155 @@ zombie_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, v
}
}
check_for_zombie_in_wolf_area() //checked changed to match cerberus output
check_for_zombie_in_wolf_area()
{
for ( i = 0; i < level.soul_catchers.size; i++ )
{
if ( self istouching( level.soul_catchers_vol[i] ) )
{
if ( !level.soul_catchers[i].is_charged && !level.soul_catchers[i].is_eating )
{
return 1;
return true;
}
}
}
return 0;
}
zombie_soul_catcher_death() //checked matches cerberus output
{
self thread maps/mp/zombies/_zm_spawner::zombie_death_animscript();
if ( isDefined( self._race_team ) )
return false;
}
zombie_soul_catcher_death()
{
self thread maps\mp\zombies\_zm_spawner::zombie_death_animscript();
if ( isdefined( self._race_team ) )
team = self._race_team;
}
level maps/mp/zombies/_zm_spawner::zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self, team );
level maps\mp\zombies\_zm_spawner::zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self, team );
if ( self.my_soul_catcher.is_eating )
{
return 0;
}
return false;
if ( self.my_soul_catcher.souls_received >= 6 )
{
return 0;
}
return false;
self.my_soul_catcher.is_eating = 1;
if ( self.my_soul_catcher.souls_received == 0 )
{
self.my_soul_catcher notify( "first_zombie_killed_in_zone" );
self thread notify_wolf_intro_anim_complete();
}
client_notify_value = self get_correct_model_array();
self setclientfield( "make_client_clone", client_notify_value );
self setanimstatefromasd( "zm_portal_death" );
self maps/mp/animscripts/shared::donotetracks( "portal_death" );
self maps\mp\animscripts\shared::donotetracks( "portal_death" );
if ( self.my_soul_catcher.souls_received == 0 )
{
self waittill( "wolf_intro_anim_complete" );
}
n_eating_anim = self which_eating_anim();
self ghost();
level setclientfield( self.my_soul_catcher.script_parameters, n_eating_anim );
if ( n_eating_anim == 3 )
{
total_wait_time = 3 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_f );
}
total_wait_time = 3.0 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_f );
else if ( n_eating_anim == 4 )
{
total_wait_time = 3 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_r );
}
total_wait_time = 3.0 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_r );
else
{
total_wait_time = 3 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_l );
}
total_wait_time = 3.0 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_l );
wait( total_wait_time - 0.5 );
self.my_soul_catcher.souls_received++;
wait 0.5;
self.my_soul_catcher notify( "finished_eating" );
self.my_soul_catcher.is_eating = 0;
self delete();
return 1;
return true;
}
get_correct_model_array() //checked matches cerberus output
get_correct_model_array()
{
mod = 0;
if ( self.model == "c_zom_guard_body" && isDefined( self.hatmodel ) && self.hatmodel == "c_zom_guard_hat" )
{
if ( self.model == "c_zom_guard_body" && isdefined( self.hatmodel ) && self.hatmodel == "c_zom_guard_hat" )
mod = 4;
}
if ( self.headmodel == "c_zom_zombie_barbwire_head" )
{
return 1 + mod;
}
if ( self.headmodel == "c_zom_zombie_hellcatraz_head" )
{
return 2 + mod;
}
if ( self.headmodel == "c_zom_zombie_mask_head" )
{
return 3 + mod;
}
if ( self.headmodel == "c_zom_zombie_slackjaw_head" )
{
return 4 + mod;
}
return 5;
}
notify_wolf_intro_anim_complete() //checked matches cerberus output
notify_wolf_intro_anim_complete()
{
anim_length = getanimlength( %o_zombie_dreamcatcher_intro );
wait anim_length;
wait( anim_length );
self notify( "wolf_intro_anim_complete" );
}
which_eating_anim() //checked matches cerberus output
which_eating_anim()
{
soul_catcher = self.my_soul_catcher;
forward_dot = vectordot( anglesToForward( soul_catcher.angles ), vectornormalize( self.origin - soul_catcher.origin ) );
forward_dot = vectordot( anglestoforward( soul_catcher.angles ), vectornormalize( self.origin - soul_catcher.origin ) );
if ( forward_dot > 0.85 )
{
return 3;
}
else
{
right_dot = vectordot( anglesToRight( soul_catcher.angles ), self.origin - soul_catcher.origin );
right_dot = vectordot( anglestoright( soul_catcher.angles ), self.origin - soul_catcher.origin );
if ( right_dot > 0 )
{
return 4;
}
else
{
return 5;
}
}
}
soul_catcher_check() //checked changed to match cerberus output
soul_catcher_check()
{
self.is_charged = 0;
while ( 1 )
while ( true )
{
if ( self.souls_received >= 6 )
{
level.soul_catchers_charged++;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "tomahawk_" + level.soul_catchers_charged );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "tomahawk_" + level.soul_catchers_charged );
self.is_charged = 1;
self notify( "fully_charged" );
break;
}
wait 0.05;
}
if ( level.soul_catchers_charged == 1 )
{
self thread first_wolf_complete_vo();
}
else if ( level.soul_catchers_charged >= level.soul_catchers.size )
{
self thread final_wolf_complete_vo();
}
}
wolf_head_removal( wolf_head_model_string ) //checked matches cerberus output
wolf_head_removal( wolf_head_model_string )
{
wolf_head_model = getent( wolf_head_model_string, "targetname" );
wolf_head_model setmodel( "p6_zm_al_dream_catcher_off" );
self waittill( "fully_charged" );
wolf_head_model setmodel( "p6_zm_al_dream_catcher" );
}
soul_catchers_charged() //checked changed to match cerberus output
soul_catchers_charged()
{
while ( 1 )
while ( true )
{
if ( level.soul_catchers_charged >= level.soul_catchers.size )
{
@ -403,22 +409,23 @@ soul_catchers_charged() //checked changed to match cerberus output
level notify( "soul_catchers_charged" );
break;
}
wait 1;
}
}
first_wolf_encounter_vo() //checked changed to match cerberus output
first_wolf_encounter_vo()
{
if ( !is_classic() )
{
return;
}
wait 2;
wait 2.0;
a_players = getplayers();
a_closest = get_array_of_closest( self.origin, a_players );
for ( i = 0; i < a_closest.size; i++ )
{
if ( isDefined( a_closest[ i ].dontspeak ) && !a_closest[ i ].dontspeak )
if ( !( isdefined( a_closest[i].dontspeak ) && a_closest[i].dontspeak ) )
{
a_closest[i] thread do_player_general_vox( "general", "wolf_encounter" );
level.wolf_encounter_vo_played = 1;
@ -427,18 +434,18 @@ first_wolf_encounter_vo() //checked changed to match cerberus output
}
}
first_wolf_complete_vo() //checked changed to match cerberus output
first_wolf_complete_vo()
{
if ( !is_classic() )
{
return;
}
wait 3.5;
a_players = getplayers();
a_closest = get_array_of_closest( self.origin, a_players );
for ( i = 0; i < a_closest.size; i++ )
{
if ( isDefined( a_closest[ i ].dontspeak ) && !a_closest[ i ].dontspeak )
if ( !( isdefined( a_closest[i].dontspeak ) && a_closest[i].dontspeak ) )
{
a_closest[i] thread do_player_general_vox( "general", "wolf_complete" );
break;
@ -446,18 +453,18 @@ first_wolf_complete_vo() //checked changed to match cerberus output
}
}
final_wolf_complete_vo() //checked changed to match cerberus output
final_wolf_complete_vo()
{
if ( !is_classic() )
{
return;
}
wait 3.5;
a_players = getplayers();
a_closest = get_array_of_closest( self.origin, a_players );
for ( i = 0; i < a_closest.size; i++ )
{
if ( isDefined( a_closest[ i ].dontspeak ) && !a_closest[ i ].dontspeak )
if ( !( isdefined( a_closest[i].dontspeak ) && a_closest[i].dontspeak ) )
{
a_closest[i] thread do_player_general_vox( "general", "wolf_final" );
break;
@ -465,100 +472,108 @@ final_wolf_complete_vo() //checked changed to match cerberus output
}
}
tomahawk_upgrade_quest() //checked changed to match cerberus output
{
if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
tomahawk_upgrade_quest()
{
if ( isdefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
return;
}
self endon( "disconnect" );
for ( self.tomahawk_upgrade_kills = 0; self.tomahawk_upgrade_kills < 15; self.tomahawk_upgrade_kills++ )
{
self waittill( "got_a_tomahawk_kill" );
}
wait 1;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorScale( ( 0, 0, 1 ), 64 ) );
wait 1.0;
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ) );
e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" );
e_org waittill( "easteregg_scream_complete" );
e_org delete();
while ( level.round_number < 10 )
{
wait 0.5;
}
self ent_flag_init( "gg_round_done" );
while ( !self ent_flag( "gg_round_done" ) )
{
level waittill( "between_round_over" );
self.killed_with_only_tomahawk = 1;
self.killed_something_thq = 0;
if ( !self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) )
{
if ( !self maps\mp\zombies\_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) )
continue;
}
level waittill( "end_of_round" );
if ( !self.killed_with_only_tomahawk || !self.killed_something_thq )
{
continue;
}
if ( !self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) )
{
if ( !self maps\mp\zombies\_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) )
continue;
}
self ent_flag_set( "gg_round_done" );
}
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorScale( ( 0, 0, 1 ), 64 ) );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ) );
e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" );
e_org waittill( "easteregg_scream_complete" );
e_org delete();
self notify( "hellhole_time" );
self waittill( "tomahawk_in_hellhole" );
if ( isDefined( self.retriever_trigger ) )
{
if ( isdefined( self.retriever_trigger ) )
self.retriever_trigger setinvisibletoplayer( self );
}
else
{
trigger = getent( "retriever_pickup_trigger", "script_noteworthy" );
self.retriever_trigger = trigger;
self.retriever_trigger setinvisibletoplayer( self );
}
self takeweapon( "bouncing_tomahawk_zm" );
self set_player_tactical_grenade( "none" );
self notify( "tomahawk_upgraded_swap" );
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorScale( ( 0, 0, 1 ), 64 ) );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ) );
e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" );
e_org waittill( "easteregg_scream_complete" );
e_org delete();
level waittill( "end_of_round" );
tomahawk_pick = getent( "spinning_tomahawk_pickup", "targetname" );
tomahawk_pick setclientfield( "play_tomahawk_fx", 2 );
self.current_tomahawk_weapon = "upgraded_tomahawk_zm";
}
toggle_redeemer_trigger() //checked changed to match cerberus output
toggle_redeemer_trigger()
{
self endon( "disconnect" );
flag_wait( "tomahawk_pickup_complete" );
upgraded_tomahawk_trigger = getent( "redeemer_pickup_trigger", "script_noteworthy" );
upgraded_tomahawk_trigger setinvisibletoplayer( self );
tomahawk_model = getent( "spinning_tomahawk_pickup", "targetname" );
while ( 1 )
{
if ( isDefined( self.current_tomahawk_weapon ) && self.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
while ( true )
{
if ( isdefined( self.current_tomahawk_weapon ) && self.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
break;
}
else
{
wait 1;
}
}
while ( 1 )
while ( true )
{
if ( isDefined( self.afterlife ) && self.afterlife )
if ( isdefined( self.afterlife ) && self.afterlife )
{
upgraded_tomahawk_trigger setvisibletoplayer( self );
tomahawk_model setvisibletoplayer( self );
@ -568,59 +583,61 @@ toggle_redeemer_trigger() //checked changed to match cerberus output
upgraded_tomahawk_trigger setinvisibletoplayer( self );
tomahawk_model setinvisibletoplayer( self );
}
wait 1;
}
}
hellhole_projectile_watch() //checked matches cerberus output
hellhole_projectile_watch()
{
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "grenade_fire", grenade, weapname );
if ( weapname == "frag_grenade_zm" )
{
self thread hellhole_grenades( grenade );
}
}
}
hellhole_tomahawk_watch() //checked matches cerberus output
hellhole_tomahawk_watch()
{
self endon( "disconnect" );
self waittill( "hellhole_time" );
while ( 1 )
while ( true )
{
self waittill( "grenade_fire", grenade, weapname );
if ( weapname == "bouncing_tomahawk_zm" )
{
self thread hellhole_tomahawk( grenade );
}
}
}
hellhole_grenades( grenade ) //checked matches cerberus output
hellhole_grenades( grenade )
{
grenade endon( "death" );
trig_hellhole = getent( "trig_cellblock_hellhole", "targetname" );
while ( !grenade istouching( trig_hellhole ) )
{
wait 0.05;
}
self maps/mp/zombies/_zm_score::add_to_player_score( 20 );
self maps\mp\zombies\_zm_score::add_to_player_score( 20 );
playfx( level._effect["tomahawk_hellhole"], grenade.origin );
playsoundatposition( "wpn_grenade_poof", grenade.origin );
grenade delete();
}
hellhole_tomahawk( grenade ) //checked matches cerberus output
hellhole_tomahawk( grenade )
{
grenade endon( "death" );
trig_hellhole = getent( "trig_cellblock_hellhole", "targetname" );
while ( !grenade istouching( trig_hellhole ) )
{
wait 0.05;
}
self notify( "tomahawk_in_hellhole" );
grenade notify( "in_hellhole" );
playfx( level._effect["tomahawk_hellhole"], grenade.origin );
@ -628,15 +645,10 @@ hellhole_tomahawk( grenade ) //checked matches cerberus output
grenade delete();
}
spawn_infinite_powerup_drop( v_origin, str_type ) //checked matches cerberus output
spawn_infinite_powerup_drop( v_origin, str_type )
{
if ( isDefined( str_type ) )
{
intro_powerup = maps/mp/zombies/_zm_powerups::specific_powerup_drop( str_type, v_origin );
}
if ( isdefined( str_type ) )
intro_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( str_type, v_origin );
else
{
intro_powerup = maps/mp/zombies/_zm_powerups::powerup_drop( v_origin );
intro_powerup = maps\mp\zombies\_zm_powerups::powerup_drop( v_origin );
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,10 @@
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/gametypes_zm/_globallogic_score;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_globallogic_score;
#include maps\mp\zombies\_zm_zonemgr;
init()
{
@ -31,16 +33,16 @@ achievement_sound_func( achievement_name_lower )
init_player_achievement_stats()
{
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_prison_sidequest", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_feed_the_beast", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_making_the_rounds", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_acid_drip", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_full_lockdown", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_a_burst_of_flavor", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_paranormal_progress", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_gg_bridge", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_trapped_in_time", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc2_pop_goes_the_weasel", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_prison_sidequest", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_feed_the_beast", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_making_the_rounds", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_acid_drip", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_full_lockdown", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_a_burst_of_flavor", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_paranormal_progress", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_gg_bridge", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_trapped_in_time", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc2_pop_goes_the_weasel", 0 );
}
achievement_full_lockdown()
@ -56,26 +58,23 @@ achievement_full_lockdown()
level.lockdown_track["craft_shield"] = 0;
level.lockdown_track["craft_kit"] = 0;
b_unlock = 0;
while ( b_unlock == 0 )
{
level waittill( "brutus_locked_object" );
b_unlock = 1;
_a92 = level.lockdown_track;
_k92 = getFirstArrayKey( _a92 );
while ( isDefined( _k92 ) )
foreach ( b_check in level.lockdown_track )
{
b_check = _a92[ _k92 ];
if ( b_check == 0 )
{
b_unlock = 0;
break;
}
else
{
_k92 = getNextArrayKey( _a92, _k92 );
}
}
}
level giveachievement_wrapper( "ZM_DLC2_FULL_LOCKDOWN", 1 );
}
@ -87,37 +86,35 @@ achievement_trapped_in_time()
level.trapped_track["tower"] = 0;
level.trapped_track["tower_upgrade"] = 0;
b_unlock = 0;
while ( b_unlock == 0 )
{
level waittill_either( "trap_activated", "tower_trap_upgraded" );
if ( level.round_number >= 10 )
{
return;
}
b_unlock = 1;
_a131 = level.trapped_track;
_k131 = getFirstArrayKey( _a131 );
while ( isDefined( _k131 ) )
foreach ( b_check in level.trapped_track )
{
b_check = _a131[ _k131 ];
if ( b_check == 0 )
{
b_unlock = 0;
break;
}
else
{
_k131 = getNextArrayKey( _a131, _k131 );
}
}
}
level giveachievement_wrapper( "ZM_DLC2_TRAPPED_IN_TIME", 1 );
}
achievement_pop_goes_the_weasel()
{
level endon( "end_game" );
level waittill( "pop_goes_the_weasel_achieved" );
level giveachievement_wrapper( "ZM_DLC2_POP_GOES_THE_WEASEL", 1 );
}
@ -125,7 +122,9 @@ achievement_no_one_escapes_alive()
{
level endon( "end_game" );
self endon( "disconnect" );
self waittill( "player_at_bridge" );
self giveachievement_wrapper( "ZM_DLC2_PRISON_SIDEQUEST" );
}
@ -133,7 +132,9 @@ achievement_feed_the_beast()
{
level endon( "end_game" );
self endon( "disconnect" );
self waittill( "player_obtained_tomahawk" );
self giveachievement_wrapper( "ZM_DLC2_FEED_THE_BEAST" );
}
@ -141,12 +142,10 @@ achievement_making_the_rounds()
{
level endon( "end_game" );
self endon( "disconnect" );
n_completed_trips = 0;
while ( n_completed_trips < 3 )
{
for ( n_completed_trips = 0; n_completed_trips < 3; n_completed_trips++ )
self waittill( "player_completed_cycle" );
n_completed_trips++;
}
self giveachievement_wrapper( "ZM_DLC2_MAKING_THE_ROUNDS" );
}
@ -154,7 +153,9 @@ achievement_acid_drip()
{
level endon( "end_game" );
self endon( "disconnect" );
self waittill( "player_obtained_acidgat" );
self giveachievement_wrapper( "ZM_DLC2_ACID_DRIP" );
}
@ -162,19 +163,19 @@ achievement_a_burst_of_flavor()
{
level endon( "end_game" );
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "electric_cherry_start" );
self.cherry_kills = 0;
self waittill( "electric_cherry_end" );
if ( self.cherry_kills >= 10 )
{
break;
}
else
{
}
}
self giveachievement_wrapper( "ZM_DLC2_A_BURST_OF_FLAVOR" );
}
@ -182,7 +183,9 @@ achievement_paranormal_progress()
{
level endon( "end_game" );
self endon( "disconnect" );
self waittill( "player_opened_afterlife_door" );
self giveachievement_wrapper( "ZM_DLC2_PARANORMAL_PROGRESS" );
}
@ -190,20 +193,19 @@ achievement_gg_bridge()
{
level endon( "end_game" );
self endon( "disconnect" );
while ( 1 )
while ( true )
{
level waittill( "end_of_round" );
if ( self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) && level.round_number >= 15 )
if ( self maps\mp\zombies\_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) && level.round_number >= 15 )
{
level waittill( "end_of_round" );
if ( self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) )
{
if ( self maps\mp\zombies\_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) )
break;
}
}
else
{
}
}
self giveachievement_wrapper( "ZM_DLC2_GG_BRIDGE" );
}

View File

@ -1,9 +1,11 @@
#include maps/mp/zombies/_zm_afterlife;
#include maps/mp/zm_prison;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zm_prison;
#include maps\mp\zombies\_zm_afterlife;
main_start()
{
@ -12,38 +14,33 @@ main_start()
t_killbrush_1.script_noteworthy = "kill_brush";
t_killbrush_2 = spawn( "trigger_box", ( 1822, 9316, 1358 ), 0, 120, 100, 30 );
t_killbrush_2.script_noteworthy = "kill_brush";
t_killbrush_3 = spawn( "trigger_box", ( -42, 9348, 1392 ), 0, 200, 100, 128 );
t_killbrush_3 = spawn( "trigger_box", ( -50, 9318, 1392 ), 0, 200, 110, 128 );
t_killbrush_3.script_noteworthy = "kill_brush";
t_killbrush_4 = spawn( "trigger_box", ( -212, 7876, 74 ), 0, 220, 280, 30 );
t_killbrush_4.angles = vectorscale( ( 0, 1, 0 ), 315.0 );
t_killbrush_4.script_noteworthy = "kill_brush";
t_killbrush_5 = spawn( "trigger_box", ( 896, 6291, 84 ), 0, 798, 498, 332 );
t_killbrush_5.angles = vectorscale( ( 0, 1, 0 ), 10.0 );
t_killbrush_5.script_noteworthy = "kill_brush";
t_killbrush_6 = spawn( "trigger_box", ( 1268, 6870, 232 ), 0, 1024, 512, 512 );
t_killbrush_6.angles = vectorscale( ( 0, 1, 0 ), 10.0 );
t_killbrush_6.script_noteworthy = "kill_brush";
t_killbrush_7 = spawn( "trigger_box", ( 896, 6009, 304 ), 0, 320, 192, 128 );
t_killbrush_7.angles = ( 0, 0, 0 );
t_killbrush_7.script_noteworthy = "kill_brush";
level.gondola_docks_landing_killbrush = t_killbrush_7;
t_killbrush_8 = spawn( "trigger_box", ( 934, 9148, 1346 ), 0, 39.7, 55.6, 39.7 );
t_killbrush_8.angles = vectorscale( ( 1, 0, 0 ), 325.0 );
t_killbrush_8.script_noteworthy = "kill_brush";
t_killbrush_9 = spawn( "trigger_box", ( -1338, 5478, 114 ), 0, 200, 50, 100 );
t_killbrush_9.angles = vectorscale( ( 0, 1, 0 ), 280.0 );
t_killbrush_9.script_noteworthy = "kill_brush";
}
main_end()
{
level.equipment_dead_zone_pos = [];
level.equipment_dead_zone_rad2 = [];
level.equipment_dead_zone_pos[ 0 ] = ( 408, 10016, 1128 );
level.equipment_dead_zone_rad2[ 0 ] = 65536;
level.equipment_dead_zone_pos[ 1 ] = ( -280, 7872, 176 );
level.equipment_dead_zone_rad2[ 1 ] = 10000;
level.equipment_dead_zone_pos[ 2 ] = ( -104, 8056, 280 );
level.equipment_dead_zone_rad2[ 2 ] = 10000;
level.equipment_dead_zone_pos[ 3 ] = ( -86, 7712, 114 );
level.equipment_dead_zone_rad2[ 3 ] = 10000;
level.equipment_dead_zone_pos[ 4 ] = ( 447, 5963, 264 );
level.equipment_dead_zone_rad2[ 4 ] = 10000;
level.equipment_dead_zone_pos[ 5 ] = ( 231, 5913, 200 );
level.equipment_dead_zone_rad2[ 5 ] = 10000;
level.equipment_dead_zone_pos[ 6 ] = ( 15, 5877, 136 );
level.equipment_dead_zone_rad2[ 6 ] = 10000;
level.equipment_dead_zone_pos[ 7 ] = ( -335, 5795, 14 );
level.equipment_dead_zone_rad2[ 7 ] = 22500;
level.equipment_dead_zone_pos[ 8 ] = ( -621, 5737, -48 );
level.equipment_dead_zone_rad2[ 8 ] = 10000;
level.equipment_dead_zone_pos[ 9 ] = ( 402, 7058, 147 );
level.equipment_dead_zone_rad2[ 9 ] = 10000;
level.equipment_dead_zone_pos[ 10 ] = ( 2151, 10180, 1204 );
level.equipment_dead_zone_rad2[ 10 ] = 625;
level.equipment_dead_zone_pos[ 11 ] = ( 2144, 9486, 1364 );
level.equipment_dead_zone_rad2[ 11 ] = 2500;
level.equipment_safe_to_drop = ::equipment_safe_to_drop_ffotd;
waittillframeend;
level.afterlife_give_loadout = ::afterlife_give_loadout_override;
@ -51,16 +48,13 @@ main_end()
equipment_safe_to_drop_ffotd( weapon )
{
i = 0;
while ( i < level.equipment_dead_zone_pos.size )
for ( i = 0; i < level.equipment_dead_zone_pos.size; i++ )
{
if ( distancesquared( level.equipment_dead_zone_pos[i], weapon.origin ) < level.equipment_dead_zone_rad2[i] )
{
return 0;
}
i++;
}
return self maps/mp/zm_prison::equipment_safe_to_drop( weapon );
return self maps\mp\zm_prison::equipment_safe_to_drop( weapon );
}
spawned_collision_ffotd()
@ -72,7 +66,14 @@ spawned_collision_ffotd()
precachemodel( "collision_geo_256x256x256_standard" );
precachemodel( "collision_geo_64x64x256_standard" );
precachemodel( "collision_geo_128x128x128_standard" );
precachemodel( "collision_geo_128x128x10_standard" );
precachemodel( "collision_geo_64x64x64_standard" );
precachemodel( "collision_geo_32x32x128_standard" );
precachemodel( "p6_zm_al_surgery_cart" );
precachemodel( "p6_zm_al_laundry_bag" );
precachemodel( "ch_furniture_teachers_chair1" );
flag_wait( "start_zombie_round_logic" );
if ( !is_true( level.optimise_for_splitscreen ) )
{
collision1 = spawn( "script_model", ( 1999, 9643, 1472 ) );
@ -81,15 +82,15 @@ spawned_collision_ffotd()
collision1 ghost();
collision2 = spawn( "script_model", ( -437, 6260, 121 ) );
collision2 setmodel( "collision_wall_256x256x10_standard" );
collision2.angles = vectorScale( ( 0, 0, 0 ), 11,8 );
collision2.angles = vectorscale( ( 0, 1, 0 ), 11.8 );
collision2 ghost();
collision3 = spawn( "script_model", ( 1887,98, 9323, 1489,14 ) );
collision3 = spawn( "script_model", ( 1887.98, 9323, 1489.14 ) );
collision3 setmodel( "collision_wall_128x128x10_standard" );
collision3.angles = ( 0, 270, 38,6 );
collision3.angles = ( 0, 270, 38.6 );
collision3 ghost();
collision4 = spawn( "script_model", ( -261, 8512,02, 1153,14 ) );
collision4 = spawn( "script_model", ( -261, 8512.02, 1153.14 ) );
collision4 setmodel( "collision_geo_256x256x256_standard" );
collision4.angles = vectorScale( ( 0, 0, 0 ), 180 );
collision4.angles = vectorscale( ( 0, 1, 0 ), 180.0 );
collision4 ghost();
collision5a = spawn( "script_model", ( 792, 8302, 1620 ) );
collision5a setmodel( "collision_geo_64x64x256_standard" );
@ -101,7 +102,7 @@ spawned_collision_ffotd()
collision5b ghost();
collision6 = spawn( "script_model", ( 554, 8026, 698 ) );
collision6 setmodel( "collision_wall_128x128x10_standard" );
collision6.angles = vectorScale( ( 0, 0, 0 ), 22,2 );
collision6.angles = vectorscale( ( 0, 1, 0 ), 22.2 );
collision6 ghost();
collision7 = spawn( "script_model", ( 1890, 9911, 1184 ) );
collision7 setmodel( "collision_geo_64x64x256_standard" );
@ -115,34 +116,63 @@ spawned_collision_ffotd()
collision9 setmodel( "collision_ai_64x64x10" );
collision9.angles = ( 270, 180, -180 );
collision9 ghost();
collision10 = spawn( "script_model", ( -756,5, 5730, -113,75 ) );
collision10 = spawn( "script_model", ( -756.5, 5730, -113.75 ) );
collision10 setmodel( "collision_geo_128x128x128_standard" );
collision10.angles = ( 354,9, 11, 0 );
collision10.angles = ( 354.9, 11, 0 );
collision10 ghost();
collision11 = spawn( "script_model", ( -4, 8314, 808 ) );
collision11 setmodel( "collision_wall_128x128x10_standard" );
collision11.angles = vectorScale( ( 0, 0, 0 ), 292 );
collision11.angles = vectorscale( ( 0, 1, 0 ), 292.0 );
collision11 ghost();
collision12 = spawn( "script_model", ( 1416, 10708, 1440 ) );
collision12 setmodel( "collision_wall_512x512x10_standard" );
collision12.angles = ( 0, 0, 0 );
collision12 ghost();
collision13 = spawn( "script_model", ( 1788, 9758, 1472 ) );
collision13 setmodel( "collision_geo_64x64x64_standard" );
collision13.angles = ( 0, 0, 0 );
collision13 ghost();
collision13_prop1 = spawn( "script_model", ( 1801.27, 9753.57, 1440 ) );
collision13_prop1 setmodel( "p6_zm_al_surgery_cart" );
collision13_prop1.angles = vectorscale( ( 0, 1, 0 ), 14.8 );
collision13_prop2 = spawn( "script_model", ( 1802.64, 9754.85, 1476 ) );
collision13_prop2 setmodel( "p6_zm_al_laundry_bag" );
collision13_prop2.angles = vectorscale( ( 0, 1, 0 ), 314.351 );
collision14 = spawn( "script_model", ( -820, 8668, 1400 ) );
collision14 setmodel( "collision_geo_32x32x128_standard" );
collision14.angles = ( 0, 0, 0 );
collision14 ghost();
collision14_prop1 = spawn( "script_model", ( -820.273, 8668.71, 1336 ) );
collision14_prop1 setmodel( "ch_furniture_teachers_chair1" );
collision14_prop1.angles = vectorscale( ( 0, 1, 0 ), 80.0 );
collision15 = spawn( "script_model", ( 2557, 9723.5, 1520 ) );
collision15 setmodel( "collision_geo_128x128x10_standard" );
collision15.angles = vectorscale( ( 0, 0, 1 ), 34.2 );
collision15 ghost();
collision16 = spawn( "script_model", ( -1909.5, -3614, -8583 ) );
collision16 setmodel( "collision_geo_256x256x256_standard" );
collision16.angles = vectorscale( ( 1, 0, 0 ), 34.9 );
collision16 ghost();
collision17 = spawn( "script_model", ( -1909.5, -3554, -8583 ) );
collision17 setmodel( "collision_geo_256x256x256_standard" );
collision17.angles = vectorscale( ( 1, 0, 0 ), 34.9 );
collision17 ghost();
}
}
afterlife_give_loadout_override()
{
self thread afterlife_leave_freeze();
self maps/mp/zombies/_zm_afterlife::afterlife_give_loadout();
self maps\mp\zombies\_zm_afterlife::afterlife_give_loadout();
}
afterlife_leave_freeze()
{
self endon( "disconnect" );
level endon( "end_game" );
self freezecontrols( 1 );
wait 0,5;
wait 0.5;
if ( !is_true( self.hostmigrationcontrolsfrozen ) )
{
self freezecontrols( 0 );
}
}

View File

@ -1,13 +1,14 @@
#include maps/mp/_utility;
#using_animtree( "fxanim_props" );
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\createfx\zm_prison_fx;
main()
{
precache_createfx_fx();
precache_scripted_fx();
precache_fxanim_props();
maps/mp/createfx/zm_prison_fx::main();
maps\mp\createfx\zm_prison_fx::main();
}
precache_scripted_fx()
@ -125,6 +126,8 @@ precache_createfx_fx()
level._effect["fx_alcatraz_elec_chair"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_chair" );
}
#using_animtree("fxanim_props");
precache_fxanim_props()
{
level.scr_anim["fxanim_props"]["wirespark_med"] = %fxanim_gp_wirespark_med_anim;

View File

@ -1,23 +1,23 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_weap_tomahawk;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_weap_tomahawk;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_audio;
//#using_animtree( "fxanim_props" );
init() //checked matches cerberus output
init()
{
if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
if ( isdefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
{
spoon_easy_cleanup();
return;
}
precachemodel( "t6_wpn_zmb_spoon_world" );
precachemodel( "c_zom_inmate_g_rarmspawn" );
level thread wait_for_initial_conditions();
@ -34,7 +34,7 @@ init() //checked matches cerberus output
#/
}
spoon_easy_cleanup() //checked matches cerberus output
spoon_easy_cleanup()
{
spork_portal = getent( "afterlife_show_spork", "targetname" );
spork_portal delete();
@ -44,59 +44,50 @@ spoon_easy_cleanup() //checked matches cerberus output
m_spoon delete();
}
extra_death_func_to_check_for_splat_death() //checked matches cerberus output
extra_death_func_to_check_for_splat_death()
{
self thread maps/mp/zombies/_zm_spawner::zombie_death_animscript();
self thread maps\mp\zombies\_zm_spawner::zombie_death_animscript();
if ( self.damagemod == "MOD_GRENADE" || self.damagemod == "MOD_GRENADE_SPLASH" )
{
if ( self.damageweapon == "blundersplat_explosive_dart_zm" )
{
if ( isplayer( self.attacker ) )
{
self notify( "killed_by_a_blundersplat" );
self notify( "killed_by_a_blundersplat", self.attacker );
}
}
else
{
if ( self.damageweapon == "bouncing_tomahawk_zm" )
else if ( self.damageweapon == "bouncing_tomahawk_zm" )
{
if ( isplayer( self.attacker ) )
{
self.attacker notify( "got_a_tomahawk_kill" );
}
}
}
}
if ( isDefined( self.attacker.killed_with_only_tomahawk ) )
if ( isdefined( self.attacker.killed_with_only_tomahawk ) )
{
if ( self.damageweapon != "bouncing_tomahawk_zm" && self.damageweapon != "none" )
{
self.attacker.killed_with_only_tomahawk = 0;
}
}
if ( isDefined( self.attacker.killed_something_thq ) )
{
if ( isdefined( self.attacker.killed_something_thq ) )
self.attacker.killed_something_thq = 1;
}
return 0;
}
zombie_spoon_func() //checked matches cerberus output
zombie_spoon_func()
{
self.deathfunction = ::extra_death_func_to_check_for_splat_death;
self waittill( "killed_by_a_blundersplat", player );
if ( flag( "charged_spoon" ) || !level.b_spoon_in_tub )
{
return;
}
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "cellblock_shower" ) )
{
if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( "cellblock_shower" ) )
level.n_spoon_kill_count++;
}
else
{
return;
}
if ( level.n_spoon_kill_count >= 50 )
{
/#
@ -106,36 +97,39 @@ zombie_spoon_func() //checked matches cerberus output
}
}
wait_for_initial_conditions() //checked changed to match cerberus output
wait_for_initial_conditions()
{
m_spoon_pickup = getent( "pickup_spoon", "targetname" );
m_spoon_pickup ghost();
m_spoon_pickup ghostindemo();
while ( !isDefined( level.characters_in_nml ) || level.characters_in_nml.size == 0 )
{
while ( !isdefined( level.characters_in_nml ) || level.characters_in_nml.size == 0 )
wait 1;
}
flag_wait( "soul_catchers_charged" );
m_poster = getent( "poster", "targetname" );
m_poster.health = 5000;
m_poster setcandamage( 1 );
b_poster_knocked_down = 0;
while ( !b_poster_knocked_down )
{
m_poster waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname );
if ( weaponname != "frag_grenade_zm" || weaponname == "bouncing_tomahawk_zm" || weaponname == "upgraded_tomahawk_zm" )
if ( weaponname == "frag_grenade_zm" || weaponname == "bouncing_tomahawk_zm" || weaponname == "upgraded_tomahawk_zm" )
{
b_poster_knocked_down = 1;
playsoundatposition( "zmb_squest_spoon_poster", m_poster.origin );
m_poster delete();
if ( isDefined( attacker ) && isplayer( attacker ) )
{
if ( isdefined( attacker ) && isplayer( attacker ) )
attacker do_player_general_vox( "quest", "secret_poster", undefined, 100 );
}
wait 1;
wait 1.0;
attacker thread do_player_general_vox( "quest", "pick_up_easter_egg" );
}
}
spork_door = getent( "spork_door", "targetname" );
spork_door.targetname = "afterlife_door";
spork_portal = getent( "afterlife_show_spork", "targetname" );
@ -145,10 +139,13 @@ wait_for_initial_conditions() //checked changed to match cerberus output
m_spoon.health = 50000;
m_spoon setcandamage( 1 );
b_spoon_shocked = 0;
while ( !b_spoon_shocked )
{
m_spoon waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname );
m_spoon.health += damage;
if ( weaponname == "lightning_hands_zm" )
{
b_spoon_shocked = 1;
@ -156,64 +153,66 @@ wait_for_initial_conditions() //checked changed to match cerberus output
attacker playsound( "zmb_easteregg_laugh" );
}
}
m_spoon_pickup show();
m_spoon_pickup.health = 10000;
m_spoon_pickup setcandamage( 1 );
level.a_tomahawk_pickup_funcs[level.a_tomahawk_pickup_funcs.size] = ::tomahawk_the_spoon;
}
tomahawk_the_spoon( grenade, n_grenade_charge_power ) //checked matches cerberus output
tomahawk_the_spoon( grenade, n_grenade_charge_power )
{
if ( self hasweapon( "spoon_zm_alcatraz" ) || self hasweapon( "spork_zm_alcatraz" ) )
{
return 0;
}
return false;
m_spoon = getent( "pickup_spoon", "targetname" );
if ( distancesquared( m_spoon.origin, grenade.origin ) < 40000 )
{
m_tomahawk = maps/mp/zombies/_zm_weap_tomahawk::tomahawk_spawn( grenade.origin );
m_tomahawk = maps\mp\zombies\_zm_weap_tomahawk::tomahawk_spawn( grenade.origin );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
m_player_spoon = spawn( "script_model", grenade.origin );
m_player_spoon setmodel( "t6_wpn_zmb_spoon_world" );
m_player_spoon linkto( m_tomahawk );
self maps/mp/zombies/_zm_stats::increment_client_stat( "prison_ee_spoon_acquired", 0 );
self thread maps/mp/zombies/_zm_weap_tomahawk::tomahawk_return_player( m_tomahawk );
self maps\mp\zombies\_zm_stats::increment_client_stat( "prison_ee_spoon_acquired", 0 );
self thread maps\mp\zombies\_zm_weap_tomahawk::tomahawk_return_player( m_tomahawk );
self thread give_player_spoon_upon_receipt( m_tomahawk, m_player_spoon );
self thread dip_the_spoon();
flag_set( "spoon_obtained" );
self playsoundtoplayer( "vox_brutus_easter_egg_101_0", self );
return 1;
}
return 0;
return true;
}
give_player_spoon_upon_receipt( m_tomahawk, m_player_spoon ) //checked changed to match cerberus output
{
while ( isDefined( m_tomahawk ) )
{
wait 0.05;
return false;
}
give_player_spoon_upon_receipt( m_tomahawk, m_player_spoon )
{
while ( isdefined( m_tomahawk ) )
wait 0.05;
m_player_spoon delete();
if ( !self hasweapon( "spoon_zm_alcatraz" ) && !self hasweapon( "spork_zm_alcatraz" ) && !is_true( self.spoon_in_tub ) )
if ( !self hasweapon( "spoon_zm_alcatraz" ) && !self hasweapon( "spork_zm_alcatraz" ) && !( isdefined( self.spoon_in_tub ) && self.spoon_in_tub ) )
{
self giveweapon( "spoon_zm_alcatraz" );
self set_player_melee_weapon( "spoon_zm_alcatraz" );
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "spoon", self );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "spoon", self );
weapons = self getweaponslist();
for ( i = 0; i < weapons.size; i++ )
{
if ( issubstr( weapons[i], "knife" ) )
{
self takeweapon( weapons[i] );
}
}
}
weapons = self getweaponslist();
wait 1;
wait 1.0;
self thread do_player_general_vox( "quest", "pick_up_easter_egg" );
}
bucket_init() //checked matches cerberus output
bucket_init()
{
s_bathtub = getstruct( "tub_trigger_struct", "targetname" );
level.t_bathtub = spawn( "trigger_radius_use", s_bathtub.origin, 0, 40, 150 );
@ -223,26 +222,23 @@ bucket_init() //checked matches cerberus output
level.t_bathtub setcursorhint( "HINT_NOICON" );
}
wait_for_bucket_activated( player ) //checked matches cerberus output
wait_for_bucket_activated( player )
{
if ( isDefined( player ) )
if ( isdefined( player ) )
{
while ( 1 )
while ( true )
{
level.t_bathtub waittill( "trigger", who );
if ( who == player )
{
return;
}
}
}
else
{
level.t_bathtub waittill( "trigger", who );
}
}
dip_the_spoon() //checked matches cerberus output
dip_the_spoon()
{
self endon( "disconnect" );
wait_for_bucket_activated( self );
@ -254,12 +250,12 @@ dip_the_spoon() //checked matches cerberus output
wait 5;
level.b_spoon_in_tub = 1;
flag_wait( "charged_spoon" );
wait 1;
wait 1.0;
level.t_bathtub playsound( "zmb_easteregg_laugh" );
self thread thrust_the_spork();
}
thrust_the_spork() //checked matches cerberus output
thrust_the_spork()
{
self endon( "disconnect" );
wait_for_bucket_activated( self );
@ -269,37 +265,30 @@ thrust_the_spork() //checked matches cerberus output
self takeweapon( "knife_zm_alcatraz" );
self giveweapon( "spork_zm_alcatraz" );
self set_player_melee_weapon( "spork_zm_alcatraz" );
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "spork", self );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "spork", self );
self.spoon_in_tub = undefined;
self setclientfieldtoplayer( "spoon_visual_state", 3 );
wait 1;
wait 1.0;
self thread do_player_general_vox( "quest", "pick_up_easter_egg" );
}
debug_prison_spoon_quest() //dev call didn't check
debug_prison_spoon_quest()
{
/*
/#
while ( 1 )
while ( true )
{
a_players = getplayers();
_a377 = a_players;
_k377 = getFirstArrayKey( _a377 );
while ( isDefined( _k377 ) )
foreach ( player in a_players )
{
player = _a377[ _k377 ];
if ( player hasweapon( "bouncing_tomahawk_zm" ) )
{
flag_set( "soul_catchers_charged" );
break;
}
else
{
_k377 = getNextArrayKey( _a377, _k377 );
}
wait 1.0;
}
wait 1;
#/
}
*/
}

View File

@ -1,18 +1,21 @@
#include maps/mp/zombies/_zm_weap_tomahawk;
#include maps/mp/zombies/_zm_afterlife;
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_afterlife;
#include maps\mp\zombies\_zm_weap_tomahawk;
init()
{
if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
if ( isdefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
{
sq_bg_easy_cleanup();
return;
}
precachemodel( "p6_zm_al_skull_afterlife" );
flag_init( "warden_blundergat_obtained" );
level thread wait_for_initial_conditions();
@ -33,13 +36,12 @@ wait_for_initial_conditions()
level thread debug_sq_bg_quest_starter();
#/
level waittill( "bouncing_tomahawk_zm_aquired" );
level.sq_bg_macguffins = [];
a_s_mcguffin = getstructarray( "struct_sq_bg_macguffin", "targetname" );
_a46 = a_s_mcguffin;
_k46 = getFirstArrayKey( _a46 );
while ( isDefined( _k46 ) )
foreach ( struct in a_s_mcguffin )
{
struct = _a46[ _k46 ];
m_temp = spawn( "script_model", struct.origin, 0 );
m_temp.targetname = "sq_bg_macguffin";
m_temp setmodel( struct.model );
@ -48,31 +50,35 @@ wait_for_initial_conditions()
m_temp ghostindemo();
level.sq_bg_macguffins[level.sq_bg_macguffins.size] = m_temp;
wait_network_frame();
_k46 = getNextArrayKey( _a46, _k46 );
}
array_thread( level.sq_bg_macguffins, ::sq_bg_macguffin_think );
level.a_tomahawk_pickup_funcs[level.a_tomahawk_pickup_funcs.size] = ::tomahawk_the_macguffin;
level thread check_sq_bg_progress();
level waittill( "all_macguffins_acquired" );
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "quest_generic" );
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "quest_generic" );
t_reward_pickup thread give_sq_bg_reward();
}
sq_bg_macguffin_think()
{
self endon( "sq_bg_macguffin_received_by_player" );
self thread maps/mp/zombies/_zm_afterlife::enable_afterlife_prop();
self thread maps\mp\zombies\_zm_afterlife::enable_afterlife_prop();
self.health = 10000;
self setcandamage( 1 );
self setforcenocull();
while ( 1 )
while ( true )
{
self waittill( "damage", amount, attacker );
if ( attacker == level || isplayer( attacker ) && attacker getcurrentweapon() == "lightning_hands_zm" )
{
playfx( level._effect["ee_skull_shot"], self.origin );
self playsound( "zmb_powerpanel_activate" );
self thread maps/mp/zombies/_zm_afterlife::disable_afterlife_prop();
self thread maps\mp\zombies\_zm_afterlife::disable_afterlife_prop();
self thread wait_and_hide_sq_bg_macguffin();
}
}
@ -83,75 +89,76 @@ wait_and_hide_sq_bg_macguffin()
self notify( "restart_show_timer" );
self endon( "restart_show_timer" );
self endon( "caught_by_tomahawk" );
wait 1,6;
self thread maps/mp/zombies/_zm_afterlife::enable_afterlife_prop();
wait 1.6;
self thread maps\mp\zombies\_zm_afterlife::enable_afterlife_prop();
}
tomahawk_the_macguffin( grenade, n_grenade_charge_power )
{
if ( !isDefined( level.sq_bg_macguffins ) || level.sq_bg_macguffins.size <= 0 )
if ( !isdefined( level.sq_bg_macguffins ) || level.sq_bg_macguffins.size <= 0 )
return false;
foreach ( macguffin in level.sq_bg_macguffins )
{
return 0;
}
_a119 = level.sq_bg_macguffins;
_k119 = getFirstArrayKey( _a119 );
while ( isDefined( _k119 ) )
{
macguffin = _a119[ _k119 ];
if ( distancesquared( macguffin.origin, grenade.origin ) < 10000 )
{
m_tomahawk = maps/mp/zombies/_zm_weap_tomahawk::tomahawk_spawn( grenade.origin );
m_tomahawk = maps\mp\zombies\_zm_weap_tomahawk::tomahawk_spawn( grenade.origin );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
macguffin notify( "caught_by_tomahawk" );
macguffin.origin = grenade.origin;
macguffin linkto( m_tomahawk );
macguffin thread maps/mp/zombies/_zm_afterlife::disable_afterlife_prop();
self thread maps/mp/zombies/_zm_weap_tomahawk::tomahawk_return_player( m_tomahawk );
macguffin thread maps\mp\zombies\_zm_afterlife::disable_afterlife_prop();
self thread maps\mp\zombies\_zm_weap_tomahawk::tomahawk_return_player( m_tomahawk );
self thread give_player_macguffin_upon_receipt( m_tomahawk, macguffin );
return 1;
return true;
}
_k119 = getNextArrayKey( _a119, _k119 );
}
return 0;
return false;
}
give_player_macguffin_upon_receipt( m_tomahawk, m_macguffin )
{
self endon( "disconnect" );
while ( isDefined( m_tomahawk ) )
{
wait 0,05;
}
while ( isdefined( m_tomahawk ) )
wait 0.05;
m_macguffin notify( "sq_bg_macguffin_received_by_player" );
arrayremovevalue( level.sq_bg_macguffins, m_macguffin );
m_macguffin delete();
play_sound_at_pos( "purchase", self.origin );
level notify( "sq_bg_macguffin_collected" );
level notify( "sq_bg_macguffin_collected", self );
}
check_sq_bg_progress()
{
n_macguffins_total = level.sq_bg_macguffins.size;
n_macguffins_collected = 0;
while ( 1 )
while ( true )
{
level waittill( "sq_bg_macguffin_collected", player );
n_macguffins_collected++;
if ( n_macguffins_collected >= n_macguffins_total )
{
level notify( "all_macguffins_acquired" );
break;
}
else play_sq_bg_collected_vo( player );
else
play_sq_bg_collected_vo( player );
}
wait 1;
wait 1.0;
player playsound( "zmb_easteregg_laugh" );
}
play_sq_bg_collected_vo( player )
{
player endon( "disconnect" );
wait 1;
wait 1.0;
player thread do_player_general_vox( "quest", "pick_up_easter_egg" );
}
@ -159,20 +166,22 @@ give_sq_bg_reward()
{
s_reward_origin = getstruct( "sq_bg_reward", "targetname" );
t_near = spawn( "trigger_radius", s_reward_origin.origin, 0, 196, 64 );
while ( 1 )
while ( true )
{
t_near waittill( "trigger", ent );
if ( isplayer( ent ) )
{
t_near thread sq_bg_spawn_rumble();
break;
}
else
{
wait 0,1;
}
wait 0.1;
}
a_players = getplayers();
if ( a_players.size == 1 )
{
if ( a_players[0] hasweapon( "blundergat_zm" ) )
@ -191,69 +200,67 @@ give_sq_bg_reward()
str_reward_weapon = "blundergat_zm";
str_loc = &"ZM_PRISON_SQ_BG";
}
m_reward_model = spawn_weapon_model( str_reward_weapon, undefined, s_reward_origin.origin, s_reward_origin.angles );
m_reward_model moveto( m_reward_model.origin + vectorScale( ( 0, 0, 1 ), 14 ), 5 );
m_reward_model moveto( m_reward_model.origin + vectorscale( ( 0, 0, 1 ), 14.0 ), 5 );
level setclientfield( "sq_bg_reward_portal", 1 );
self sethintstring( str_loc );
for ( ;; )
{
while ( 1 )
while ( true )
{
self waittill( "trigger", player );
current_weapon = player getcurrentweapon();
if ( is_player_valid( player ) && player.is_drinking > 0 && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon && current_weapon != "none" && !player hacker_active() )
if ( is_player_valid( player ) && !( player.is_drinking > 0 ) && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon && "none" != current_weapon && !player hacker_active() )
{
if ( player hasweapon( str_reward_weapon ) )
{
/#
iprintln( "Player has" + str_reward_weapon + " , so don't give him another one" );
#/
continue;
}
}
else self delete();
else
{
self delete();
level setclientfield( "sq_bg_reward_portal", 0 );
wait_network_frame();
m_reward_model delete();
player take_old_weapon_and_give_reward( current_weapon, str_reward_weapon );
}
}
}
t_near delete();
}
sq_bg_spawn_rumble()
{
a_players = getplayers();
_a285 = a_players;
_k285 = getFirstArrayKey( _a285 );
while ( isDefined( _k285 ) )
foreach ( player in a_players )
{
player = _a285[ _k285 ];
if ( player istouching( self ) )
{
player setclientfieldtoplayer( "rumble_sq_bg", 1 );
}
_k285 = getNextArrayKey( _a285, _k285 );
}
}
take_old_weapon_and_give_reward( current_weapon, reward_weapon, weapon_limit_override )
{
if ( !isDefined( weapon_limit_override ) )
{
if ( !isdefined( weapon_limit_override ) )
weapon_limit_override = 0;
}
if ( weapon_limit_override == 1 )
{
self takeweapon( current_weapon );
}
else
{
primaries = self getweaponslistprimaries();
if ( isDefined( primaries ) && primaries.size >= 2 )
{
if ( isdefined( primaries ) && primaries.size >= 2 )
self takeweapon( current_weapon );
}
}
self giveweapon( reward_weapon );
self switchtoweapon( reward_weapon );
flag_set( "warden_blundergat_obtained" );
@ -263,25 +270,20 @@ take_old_weapon_and_give_reward( current_weapon, reward_weapon, weapon_limit_ove
debug_sq_bg_quest_starter()
{
/#
while ( 1 )
while ( true )
{
a_players = getplayers();
_a327 = a_players;
_k327 = getFirstArrayKey( _a327 );
while ( isDefined( _k327 ) )
foreach ( player in a_players )
{
player = _a327[ _k327 ];
if ( player hasweapon( "bouncing_tomahawk_zm" ) )
{
level notify( "bouncing_tomahawk_zm_aquired" );
break;
}
else
{
_k327 = getNextArrayKey( _a327, _k327 );
}
wait 1.0;
}
wait 1;
#/
}
}

View File

@ -1,20 +1,20 @@
#include maps/mp/zombies/_zm;
#include maps/mp/_visionset_mgr;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\_visionset_mgr;
#include maps\mp\zombies\_zm;
onplayerconnect_sq_fc()
{
if ( !isDefined( level.sq_fc_still_valid ) )
{
if ( !isdefined( level.sq_fc_still_valid ) )
level.sq_fc_still_valid = 1;
}
if ( flag( "afterlife_start_over" ) || !level.sq_fc_still_valid )
{
return;
}
self thread watch_for_touching_controls();
}
@ -22,44 +22,43 @@ watch_for_touching_controls()
{
self endon( "out_of_mana" );
self endon( "disconnect" );
self waittill( "al_all_setup" );
wait 1;
v_original_origin = ( self.origin[0], self.origin[1], 0 );
v_original_angles = self.angles;
v_forward_point = self.origin + ( anglesToForward( self.angles ) * 10 );
v_forward_point = self.origin + anglestoforward( self.angles ) * 10;
v_original_forward_vec = vectornormalize( v_forward_point - self.origin );
while ( !flag( "afterlife_start_over" ) && level.sq_fc_still_valid )
{
v_new_forward_point = self.origin + ( anglesToForward( self.angles ) * 10 );
v_new_forward_point = self.origin + anglestoforward( self.angles ) * 10;
v_new_forward_vec = vectornormalize( v_new_forward_point - self.origin );
move_length = length( ( self.origin[0], self.origin[1], 0 ) - v_original_origin );
if ( !self actionslotonebuttonpressed() && !self actionslottwobuttonpressed() && !self actionslotthreebuttonpressed() && !self actionslotfourbuttonpressed() && !self adsbuttonpressed() && !self attackbuttonpressed() && !self fragbuttonpressed() && !self inventorybuttonpressed() && !self jumpbuttonpressed() && !self meleebuttonpressed() && !self secondaryoffhandbuttonpressed() && !self sprintbuttonpressed() && !self stancebuttonpressed() && !self throwbuttonpressed() && !self usebuttonpressed() && !self changeseatbuttonpressed() || move_length > 2 && vectordot( v_original_forward_vec, v_new_forward_vec ) < 0,99 )
{
if ( self actionslotonebuttonpressed() || self actionslottwobuttonpressed() || self actionslotthreebuttonpressed() || self actionslotfourbuttonpressed() || self adsbuttonpressed() || self attackbuttonpressed() || self fragbuttonpressed() || self inventorybuttonpressed() || self jumpbuttonpressed() || self meleebuttonpressed() || self secondaryoffhandbuttonpressed() || self sprintbuttonpressed() || self stancebuttonpressed() || self throwbuttonpressed() || self usebuttonpressed() || self changeseatbuttonpressed() || move_length > 2 || vectordot( v_original_forward_vec, v_new_forward_vec ) < 0.99 )
level.sq_fc_still_valid = 0;
wait 0.05;
}
wait 0,05;
}
level notify( "someone_touched_controls" );
}
watch_for_trigger_condition()
{
level waittill( "pre_end_game" );
if ( !level.sq_fc_still_valid )
{
return;
}
level.sndgameovermusicoverride = "game_over_nomove";
level.custom_intermission = ::player_intermission_prison;
players = getplayers();
_a94 = players;
_k94 = getFirstArrayKey( _a94 );
while ( isDefined( _k94 ) )
{
player = _a94[ _k94 ];
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_audio_log", player );
_k94 = getNextArrayKey( _a94, _k94 );
}
foreach ( player in players )
maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_audio_log", player );
}
player_intermission_prison()
@ -78,9 +77,11 @@ player_intermission_prison()
self.psoffsettime = 0;
self.friendlydamage = undefined;
points = getstructarray( "dblock_cam", "targetname" );
if ( !isDefined( points ) || points.size == 0 )
if ( !isdefined( points ) || points.size == 0 )
{
points = getentarray( "info_intermission", "classname" );
if ( points.size < 1 )
{
/#
@ -89,55 +90,58 @@ player_intermission_prison()
return;
}
}
self.game_over_bg = newclienthudelem( self );
self.game_over_bg.horzalign = "fullscreen";
self.game_over_bg.vertalign = "fullscreen";
self.game_over_bg setshader( "black", 640, 480 );
self.game_over_bg.alpha = 1;
visionsetnaked( "cheat_bw", 0,05 );
visionsetnaked( "cheat_bw", 0.05 );
org = undefined;
while ( 1 )
while ( true )
{
points = array_randomize( points );
i = 0;
while ( i < points.size )
for ( i = 0; i < points.size; i++ )
{
point = points[i];
if ( !isDefined( org ) )
{
if ( !isdefined( org ) )
self spawn( point.origin, point.angles );
}
if ( isDefined( points[ i ].target ) )
if ( isdefined( points[i].target ) )
{
if ( !isDefined( org ) )
if ( !isdefined( org ) )
{
org = spawn( "script_model", self.origin + vectorScale( ( 0, 0, -1 ), 60 ) );
org = spawn( "script_model", self.origin + vectorscale( ( 0, 0, -1 ), 60.0 ) );
org setmodel( "tag_origin" );
}
org.origin = points[i].origin;
org.angles = points[i].angles;
j = 0;
while ( j < get_players().size )
for ( j = 0; j < get_players().size; j++ )
{
player = get_players()[j];
player camerasetposition( org );
player camerasetlookat();
player cameraactivate( 1 );
j++;
}
speed = 20;
if ( isDefined( points[ i ].speed ) )
{
if ( isdefined( points[i].speed ) )
speed = points[i].speed;
}
target_point = getstruct( points[i].target, "targetname" );
dist = distance( points[i].origin, target_point.origin );
time = dist / speed;
q_time = time * 0,25;
q_time = time * 0.25;
if ( q_time > 1 )
{
q_time = 1;
}
self.game_over_bg fadeovertime( q_time );
self.game_over_bg.alpha = 0;
org moveto( target_point.origin, time, q_time, q_time );
@ -145,18 +149,14 @@ player_intermission_prison()
wait( time - q_time );
self.game_over_bg fadeovertime( q_time );
self.game_over_bg.alpha = 1;
wait q_time;
i++;
wait( q_time );
continue;
}
else
{
self.game_over_bg fadeovertime( 1 );
self.game_over_bg.alpha = 0;
wait 5;
self.game_over_bg thread maps/mp/zombies/_zm::fade_up_over_time( 1 );
}
i++;
self.game_over_bg thread maps\mp\zombies\_zm::fade_up_over_time( 1 );
}
}
}

View File

@ -1,15 +1,16 @@
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_zonemgr;
onplayerconnect_sq_wth()
{
if ( !isDefined( level.wth_lookat_point ) )
{
if ( !isdefined( level.wth_lookat_point ) )
level.wth_lookat_point = getstruct( "struct_gg_look", "targetname" );
}
self thread track_player_eyes();
self thread play_scary_lightning();
}
@ -18,15 +19,18 @@ track_player_eyes()
{
self endon( "disconnect" );
b_saw_the_wth = 0;
while ( !b_saw_the_wth )
{
n_time = 0;
while ( self adsbuttonpressed() && n_time < 25 )
{
n_time++;
wait 0,05;
wait 0.05;
}
if ( n_time >= 25 && self adsbuttonpressed() && self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( "zone_roof" ) && sq_is_weapon_sniper( self getcurrentweapon() ) && is_player_looking_at( level.wth_lookat_point.origin, 0,9, 0, undefined ) )
if ( n_time >= 25 && self adsbuttonpressed() && self maps\mp\zombies\_zm_zonemgr::is_player_in_zone( "zone_roof" ) && sq_is_weapon_sniper( self getcurrentweapon() ) && is_player_looking_at( level.wth_lookat_point.origin, 0.9, 0, undefined ) )
{
self do_player_general_vox( "general", "scare_react", undefined, 100 );
self playsoundtoplayer( "zmb_easteregg_face", self );
@ -38,44 +42,43 @@ track_player_eyes()
self.wth_elem setshader( "zm_al_wth_zombie", 640, 480 );
self.wth_elem.hidewheninmenu = 1;
j_time = 0;
while ( self adsbuttonpressed() && j_time < 5 )
{
j_time++;
wait 0,05;
wait 0.05;
}
self.wth_elem destroy();
b_saw_the_wth = 1;
}
wait 0,05;
wait 0.05;
}
}
sq_is_weapon_sniper( str_weapon )
{
a_snipers = array( "dsr50", "barretm82" );
_a77 = a_snipers;
_k77 = getFirstArrayKey( _a77 );
while ( isDefined( _k77 ) )
foreach ( str_sniper in a_snipers )
{
str_sniper = _a77[ _k77 ];
if ( issubstr( str_weapon, str_sniper ) && !issubstr( str_weapon, "+is" ) )
{
return 1;
return true;
}
_k77 = getNextArrayKey( _a77, _k77 );
}
return 0;
return false;
}
play_scary_lightning()
{
self endon( "disconnect" );
while ( 1 )
while ( true )
{
while ( self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) && isDefined( self.b_lightning ) || !self.b_lightning && flag( "plane_zapped" ) )
{
wait 0,25;
}
while ( !self maps\mp\zombies\_zm_zonemgr::is_player_in_zone( "zone_golden_gate_bridge" ) || !( isdefined( self.b_lightning ) && self.b_lightning ) || flag( "plane_zapped" ) )
wait 0.25;
if ( randomint( 100000 ) == 1337 )
{
self.scary_lighting = 1;
@ -86,23 +89,24 @@ play_scary_lightning()
self.sl_elem.vertalign = "fullscreen";
self.sl_elem.sort = 1000;
self.sl_elem.foreground = 0;
self.sl_elem.alpha = 0,6;
self.sl_elem.alpha = 0.6;
self.sl_elem setshader( "zm_al_wth_zombie", 640, 480 );
self.sl_elem.hidewheninmenu = 1;
self.sl_elem.alpha = 0;
self.sl_elem fadeovertime( 0,1 );
self.sl_elem.alpha = 0.0;
self.sl_elem fadeovertime( 0.1 );
wait_network_frame();
self.sl_elem.alpha = 0,6;
self.sl_elem fadeovertime( 0,1 );
self.sl_elem.alpha = 0.6;
self.sl_elem fadeovertime( 0.1 );
wait_network_frame();
self.sl_elem.alpha = 0;
self.sl_elem fadeovertime( 0,1 );
self.sl_elem.alpha = 0.0;
self.sl_elem fadeovertime( 0.1 );
wait_network_frame();
self.sl_elem destroy();
self.scary_lightning = 0;
wait 10;
level setclientfield( "scripted_lightning_flash", 0 );
}
wait 1;
}
}

View File

@ -1,13 +1,14 @@
//checked includes changed to match cerberus output
#include maps/mp/zombies/_zm_game_module;
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_utility;
#include maps\mp\zombies\_zm_game_module;
register_game_module() //checked matches cerberus output
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 );
maps\mp\zombies\_zm_game_module::register_game_module( level.game_module_grief_index, "zgrief", ::onpreinitgametype, ::onpostinitgametype, undefined, ::onspawnzombie, ::onstartgametype );
}

View File

@ -1,7 +1,9 @@
//checked includes match cerberus output
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_meat_utility;
#include maps\mp\zombies\_zm_game_module_utility;

View File

@ -1,51 +1,42 @@
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_utility;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_audio_announcer;
#include maps\mp\gametypes_zm\zmeat;
#include maps\mp\zombies\_zm_powerups;
award_grenades_for_team( team )
{
players = get_players();
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
if ( !isDefined( players[ i ]._meat_team ) || players[ i ]._meat_team != team )
{
i++;
if ( !isdefined( players[i]._meat_team ) || players[i]._meat_team != team )
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 )
for ( i = 0; i < players.size; i++ )
{
if ( !isDefined( players[ i ]._meat_team ) || players[ i ]._meat_team != team )
{
i++;
if ( !isdefined( players[i]._meat_team ) || players[i]._meat_team != team )
continue;
}
else
{
players_on_team[players_on_team.size] = players[i];
}
i++;
}
return players_on_team;
}
@ -53,56 +44,44 @@ get_alive_players_on_meat_team( team )
{
players = get_players();
players_on_team = [];
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
if ( !isDefined( players[ i ]._meat_team ) || players[ i ]._meat_team != team )
{
i++;
if ( !isdefined( players[i]._meat_team ) || players[i]._meat_team != team )
continue;
}
else
{
if ( players[ i ].sessionstate == "spectator" || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{
i++;
if ( players[i].sessionstate == "spectator" || players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
continue;
}
else
{
players_on_team[players_on_team.size] = players[i];
}
}
i++;
}
return players_on_team;
}
init_minigun_ring()
{
if ( isDefined( level._minigun_ring ) )
{
if ( isdefined( level._minigun_ring ) )
return;
}
ring_pos = getstruct( level._meat_location + "_meat_minigun", "script_noteworthy" );
if ( !isDefined( ring_pos ) )
{
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 ) )
{
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 ) )
if ( isdefined( level._minigun_ring_trig ) )
{
level._minigun_ring_trig enablelinkto();
level._minigun_ring_trig linkto( level._minigun_ring );
@ -113,41 +92,38 @@ init_minigun_ring()
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 ) )
{
if ( isdefined( level._ammo_ring ) )
return;
}
name = level._meat_location + "_meat_ammo";
ring_pos = getstruct( name, "script_noteworthy" );
if ( !isDefined( ring_pos ) )
{
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 ) )
{
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 ) )
if ( isdefined( level._ammo_ring_clip ) )
{
level._ammo_ring_trig enablelinkto();
level._ammo_ring_trig linkto( level._ammo_ring );
@ -158,63 +134,66 @@ init_ammo_ring()
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 ) )
{
if ( isdefined( level._splitter_ring ) )
return;
}
ring_pos = getstruct( level._meat_location + "_meat_splitter", "script_noteworthy" );
if ( !isDefined( ring_pos ) )
{
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 ) )
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 ) )
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 ( true )
{
while ( isDefined( level._ring_triggered ) && level._ring_triggered )
if ( isdefined( level._ring_triggered ) && level._ring_triggered )
{
wait 0,05;
wait 0.05;
continue;
}
if ( isDefined( level.item_meat ) && isDefined( level.item_meat.meat_is_moving ) && level.item_meat.meat_is_moving )
if ( isdefined( level.item_meat ) && ( isdefined( level.item_meat.meat_is_moving ) && level.item_meat.meat_is_moving ) )
{
if ( level.item_meat istouching( trig ) )
{
@ -223,7 +202,8 @@ ring_toss( trig, type )
level thread ring_cooldown();
}
}
wait 0,05;
wait 0.05;
}
}
@ -253,27 +233,25 @@ meat_splitter( trig )
{
level endon( "meat_grabbed" );
level endon( "meat_kicked" );
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) )
{
wait 0,05;
}
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 ) )
{
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 ) );
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 );
@ -284,12 +262,12 @@ meat_splitter( trig )
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;
}
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;
}
@ -304,78 +282,69 @@ split_meat( player, org, vel1, vel2, vel3 )
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 ) )
foreach ( meat in level._fake_meats )
{
meat = _a330[ _k330 ];
if ( real_meat != meat )
{
meat._fake_meat = 1;
meat thread maps/mp/gametypes_zm/zmeat::delete_on_real_meat_pickup();
meat thread maps\mp\gametypes_zm\zmeat::delete_on_real_meat_pickup();
continue;
}
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 ) )
{
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 )
{
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 );
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 ) )
{
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 )
{
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 );
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 ) )
{
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 );
@ -388,10 +357,10 @@ minigun_toss_cooldown()
ammo_toss_cooldown()
{
level._ammo_toss_cooldown = 1;
if ( isDefined( level._ammo_icon ) )
{
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 );
@ -405,119 +374,120 @@ wait_for_team_death( team )
{
level endon( "meat_end" );
encounters_team = undefined;
while ( 1 )
while ( true )
{
wait 1;
while ( isDefined( level._checking_for_save ) && level._checking_for_save )
{
wait 0,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 )
if ( alive_team_players.size > 0 )
{
encounters_team = alive_team_players[0]._encounters_team;
continue;
}
break;
}
if ( !isDefined( encounters_team ) )
{
if ( !isdefined( encounters_team ) )
return;
}
winning_team = "A";
if ( encounters_team == "A" )
{
winning_team = "B";
}
level notify( "meat_end" );
level notify( "meat_end", winning_team );
}
check_should_save_player( team )
{
if ( !isDefined( level._meat_on_team ) )
{
return 0;
}
if ( !isdefined( level._meat_on_team ) )
return false;
level._checking_for_save = 1;
players = get_players_on_meat_team( team );
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
player = players[i];
if ( isDefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == player )
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 )
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 )
{
if ( isdefined( level.item_meat.meat_is_rolling ) && level.item_meat.meat_is_rolling && level._meat_on_team == player._meat_team )
break;
wait 0.05;
}
else
{
wait 0,05;
}
}
if ( !isDefined( player ) )
if ( !isdefined( player ) )
{
level._checking_for_save = 0;
return 0;
return false;
}
if ( isDefined( player.last_damage_from_zombie_or_player ) && !player.last_damage_from_zombie_or_player )
if ( !( isdefined( player.last_damage_from_zombie_or_player ) && player.last_damage_from_zombie_or_player ) )
{
level._checking_for_save = 0;
return 0;
return false;
}
if ( level._meat_on_team != player._meat_team && isDefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == player )
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() )
if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
{
level thread revive_saved_player( player );
return 1;
return true;
}
}
}
i++;
}
level._checking_for_save = 0;
return 0;
return false;
}
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;
}
if ( !isdefined( level._meat_on_team ) )
return false;
if ( !isdefined( level._last_person_to_throw_meat ) || level._last_person_to_throw_meat != self )
return false;
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 )
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 )
{
break;
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 )
break;
wait 0.05;
}
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 )
if ( level._meat_on_team != self._meat_team && isdefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == self )
{
}
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() )
if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
{
level thread revive_saved_player( self );
return 1;
return true;
}
}
level._checking_for_save = 0;
return 0;
return false;
}
revive_saved_player( player )
@ -525,11 +495,11 @@ revive_saved_player( player )
player endon( "disconnect" );
player iprintlnbold( &"ZOMBIE_PLAYER_SAVED" );
player playsound( level.zmb_laugh_alias );
wait 0,25;
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 );
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;
}
@ -544,9 +514,9 @@ 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 ) );
player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, ( 0, 0, 0 ) );
playsoundatposition( "zmb_spawn_powerup", org );
wait 0,1;
wait 0.1;
player._spawning_meat = undefined;
}
@ -562,6 +532,7 @@ init_item_meat( gametype )
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" ) );
@ -576,40 +547,45 @@ meat_intro( launch_spot )
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 );
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 )
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 );
meat playloopsound( "zmb_souls_loop", 0.75 );
dest = spot;
while ( isDefined( dest ) && isDefined( dest.target ) )
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 );
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 );
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 );
wait( randomfloatrange( 0.5, 0.75 ) );
meat playsound( "zmb_souls_end" );
playfx( level._effect["fw_burst"], meat.origin );
meat delete();
@ -619,41 +595,42 @@ launch_meat( launch_spot )
multi_launch( launch_spot )
{
spots = getstructarray( launch_spot, "targetname" );
if ( isDefined( spots ) && spots.size > 0 )
if ( isdefined( spots ) && spots.size > 0 )
{
x = 0;
while ( x < 3 )
for ( x = 0; x < 3; x++ )
{
i = 0;
while ( i < spots.size )
for ( i = 0; i < spots.size; i++ )
{
delay = randomfloatrange( 0,1, 0,25 );
delay = randomfloatrange( 0.1, 0.25 );
level thread fake_launch( spots[i], delay );
i++;
}
wait randomfloatrange( 0,25, 0,75 );
wait( randomfloatrange( 0.25, 0.75 ) );
if ( x > 1 )
level notify( "launch_meat" );
}
}
else
{
wait( randomfloatrange( 0.25, 0.75 ) );
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 );
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 );
meat playloopsound( "zmb_souls_loop", 0.75 );
dest = launch_spot;
while ( isDefined( dest ) && isDefined( dest.target ) )
while ( isdefined( dest ) && isdefined( dest.target ) )
{
random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 );
new_dest = getstruct( dest.target, "targetname" );
@ -661,8 +638,10 @@ fake_launch( launch_spot, delay )
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();
@ -670,7 +649,7 @@ fake_launch( launch_spot, delay )
drop_meat( drop_spot )
{
meat = spawn( "script_model", drop_spot + vectorScale( ( 0, 0, 1 ), 600 ) );
meat = spawn( "script_model", drop_spot + vectorscale( ( 0, 0, 1 ), 600.0 ) );
meat setmodel( "tag_origin" );
dist = distance( meat.origin, drop_spot );
time = dist / 400;
@ -678,7 +657,9 @@ drop_meat( drop_spot )
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();

View File

@ -1,41 +1,44 @@
//checked includes match cerberus output
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_meat_utility;
#include maps\mp\zombies\_zm_game_module_meat;
init_item_meat() //checked matches cerberus output
init_item_meat()
{
level.item_meat_name = "item_meat_zm";
precacheitem( level.item_meat_name );
}
move_ring( ring ) //checked changed to match cerberus output
move_ring( ring )
{
positions = getstructarray( ring.target, "targetname" );
positions = array_randomize( positions );
level endon( "end_game" );
while ( 1 )
while ( true )
{
foreach ( position in positions )
{
self moveto( position.origin, randomintrange( 30, 45 ) );
self waittill( "movedone" );
}
}
}
rotate_ring( forward ) //checked matches cerberus output
rotate_ring( forward )
{
level endon( "end_game" );
dir = -360;
if ( forward )
{
dir = 360;
}
while ( 1 )
while ( true )
{
self rotateyaw( dir, 9 );
wait 9;

View File

@ -1,9 +1,11 @@
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zombies/_zm_unitrigger;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_magicbox;
init()
{
@ -30,20 +32,24 @@ init()
custom_joker_movement()
{
v_origin = self.weapon_model.origin - vectorScale( ( 0, 1, 0 ), 5 );
v_origin = self.weapon_model.origin - vectorscale( ( 0, 0, 1 ), 5.0 );
self.weapon_model delete();
m_lock = spawn( "script_model", v_origin );
m_lock setmodel( level.chest_joker_model );
m_lock.angles = self.angles + vectorScale( ( 0, 1, 0 ), 180 );
wait 0,5;
m_lock.angles = self.angles + vectorscale( ( 0, 1, 0 ), 180.0 );
wait 0.5;
level notify( "weapon_fly_away_start" );
wait 1;
m_lock rotateyaw( 3000, 4, 4 );
wait 3;
m_lock movez( 20, 0,5, 0,5 );
m_lock movez( 20, 0.5, 0.5 );
m_lock waittill( "movedone" );
m_lock movez( -100, 0,5, 0,5 );
m_lock movez( -100, 0.5, 0.5 );
m_lock waittill( "movedone" );
m_lock delete();
self notify( "box_moving" );
level notify( "weapon_fly_away_end" );
@ -51,33 +57,23 @@ custom_joker_movement()
wait_then_create_base_magic_box_fx()
{
while ( !isDefined( level.chests ) )
{
wait 0,5;
}
while ( !isDefined( level.chests[ level.chests.size - 1 ].zbarrier ) )
{
wait 0,5;
}
_a92 = level.chests;
_k92 = getFirstArrayKey( _a92 );
while ( isDefined( _k92 ) )
{
chest = _a92[ _k92 ];
while ( !isdefined( level.chests ) )
wait 0.5;
while ( !isdefined( level.chests[level.chests.size - 1].zbarrier ) )
wait 0.5;
foreach ( chest in level.chests )
chest.zbarrier setclientfield( "magicbox_initial_fx", 1 );
_k92 = getNextArrayKey( _a92, _k92 );
}
}
set_magic_box_zbarrier_state( state )
{
i = 0;
while ( i < self getnumzbarrierpieces() )
{
for ( i = 0; i < self getnumzbarrierpieces(); i++ )
self hidezbarrierpiece( i );
i++;
}
self notify( "zbarrier_state_change" );
switch ( state )
{
case "away":
@ -93,7 +89,7 @@ set_magic_box_zbarrier_state( state )
case "initial":
self showzbarrierpiece( 1 );
self thread magic_box_initial();
thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.owner.unitrigger_stub, ::maps/mp/zombies/_zm_magicbox::magicbox_unitrigger_think );
thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.owner.unitrigger_stub, maps\mp\zombies\_zm_magicbox::magicbox_unitrigger_think );
self.state = "close";
break;
case "open":
@ -113,10 +109,9 @@ set_magic_box_zbarrier_state( state )
self.owner.is_locked = 0;
break;
default:
if ( isDefined( level.custom_magicbox_state_handler ) )
{
if ( isdefined( level.custom_magicbox_state_handler ) )
self [[ level.custom_magicbox_state_handler ]]( state );
}
break;
}
}
@ -133,10 +128,10 @@ magic_box_arrives()
self setclientfield( "magicbox_leaving_fx", 0 );
self setclientfield( "magicbox_amb_fx", 1 );
self setzbarrierpiecestate( 1, "opening" );
while ( self getzbarrierpiecestate( 1 ) == "opening" )
{
wait 0,05;
}
wait 0.05;
self notify( "arrived" );
self.state = "close";
}
@ -147,10 +142,10 @@ magic_box_leaves()
self setclientfield( "magicbox_open_fx", 0 );
self setzbarrierpiecestate( 1, "closing" );
self playsound( "zmb_hellbox_rise" );
while ( self getzbarrierpiecestate( 1 ) == "closing" )
{
wait 0,1;
}
wait 0.1;
self notify( "left" );
self setclientfield( "magicbox_amb_fx", 0 );
}
@ -160,10 +155,10 @@ magic_box_opens()
self setclientfield( "magicbox_open_fx", 1 );
self setzbarrierpiecestate( 2, "opening" );
self playsound( "zmb_hellbox_open" );
while ( self getzbarrierpiecestate( 2 ) == "opening" )
{
wait 0,1;
}
wait 0.1;
self notify( "opened" );
}
@ -171,10 +166,10 @@ magic_box_closes()
{
self setzbarrierpiecestate( 2, "closing" );
self playsound( "zmb_hellbox_close" );
while ( self getzbarrierpiecestate( 2 ) == "closing" )
{
wait 0,1;
}
wait 0.1;
self notify( "closed" );
self setclientfield( "magicbox_open_fx", 0 );
}
@ -191,27 +186,24 @@ magic_box_do_weapon_rise()
self showzbarrierpiece( 4 );
self setzbarrierpiecestate( 3, "opening" );
self setzbarrierpiecestate( 4, "opening" );
while ( self getzbarrierpiecestate( 3 ) != "open" )
{
wait 0,5;
}
wait 0.5;
self hidezbarrierpiece( 3 );
self hidezbarrierpiece( 4 );
}
handle_fire_sale()
{
while ( 1 )
while ( true )
{
level waittill( "fire_sale_off" );
i = 0;
while ( i < level.chests.size )
{
if ( level.chest_index != i && isDefined( level.chests[ i ].was_temp ) )
for ( i = 0; i < level.chests.size; i++ )
{
if ( level.chest_index != i && isdefined( level.chests[i].was_temp ) )
level.chests[i].zbarrier setclientfield( "magicbox_amb_fx", 0 );
}
i++;
}
}
}

View File

@ -1,61 +1,126 @@
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_score;
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_pers_upgrades_functions;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_audio;
init( weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, has_weapon, give_weapon, take_weapon, flourish_fn )
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, has_weapon, give_weapon, take_weapon );
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 )
for ( i = 0; i < melee_weapon_triggers.size; i++ )
{
knife_model = getent( melee_weapon_triggers[i].target, "targetname" );
if ( isDefined( knife_model ) )
{
if ( isdefined( knife_model ) )
knife_model hide();
}
melee_weapon_triggers[ i ] thread melee_weapon_think( weapon_name, cost, has_weapon, give_weapon, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name );
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( "tu12_zombies_allow_hint_weapon_from_script" ) && !( 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" );
melee_weapon_triggers[ i ] usetriggerrequirelookat();
i++;
}
melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" );
i = 0;
while ( i < melee_weapon_structs.size )
else
{
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, has_weapon, give_weapon, take_weapon, flourish_fn );
i++;
}
register_melee_weapon_for_level( weapon_name );
if ( !isDefined( level.ballistic_weapon_name ) )
weapon_display = get_weapon_display_name( weapon_name );
hint_string = &"ZOMBIE_WEAPONCOSTONLY";
melee_weapon_triggers[i] sethintstring( hint_string, weapon_display, cost );
if ( getdvarint( "tu12_zombies_allow_hint_weapon_from_script" ) && !( isdefined( level.disable_melee_wallbuy_icons ) && level.disable_melee_wallbuy_icons ) )
{
level.ballistic_weapon_name = [];
cursor_hint = "HINT_WEAPON";
cursor_hint_weapon = weapon_name;
melee_weapon_triggers[i] setcursorhint( cursor_hint, cursor_hint_weapon );
}
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;
else
melee_weapon_triggers[i] setcursorhint( "HINT_NOICON" );
}
prepare_stub( stub, weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, has_weapon, give_weapon, take_weapon, flourish_fn )
melee_weapon_triggers[i] usetriggerrequirelookat();
}
melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" );
for ( i = 0; i < melee_weapon_structs.size; i++ )
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 );
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( stub ) )
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( "tu12_zombies_allow_hint_weapon_from_script" ) && !( 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( "tu12_zombies_allow_hint_weapon_from_script" ) && !( 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.has_weapon = has_weapon;
stub.give_weapon = give_weapon;
stub.take_weapon = take_weapon;
stub.vo_dialog_id = vo_dialog_id;
stub.flourish_weapon_name = flourish_weapon_name;
stub.ballistic_weapon_name = ballistic_weapon_name;
@ -68,48 +133,38 @@ prepare_stub( stub, weapon_name, flourish_weapon_name, ballistic_weapon_name, ba
add_stub( stub, weapon_name )
{
melee_weapon = undefined;
i = 0;
while ( i < level._melee_weapons.size )
for ( i = 0; i < level._melee_weapons.size; i++ )
{
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.has_weapon, melee_weapon.give_weapon, melee_weapon.take_weapon, melee_weapon.flourish_fn );
}
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 )
for ( i = 0; i < level._melee_weapons.size; i++ )
{
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.give_weapon, 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, has_weapon, give_weapon, take_weapon, flourish_fn )
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;
@ -120,373 +175,343 @@ add_melee_weapon( weapon_name, flourish_weapon_name, ballistic_weapon_name, ball
melee_weapon.wallbuy_targetname = wallbuy_targetname;
melee_weapon.hint_string = hint_string;
melee_weapon.vo_dialog_id = vo_dialog_id;
melee_weapon.has_weapon = has_weapon;
melee_weapon.give_weapon = give_weapon;
melee_weapon.take_weapon = take_weapon;
melee_weapon.flourish_fn = flourish_fn;
if ( !isDefined( level._melee_weapons ) )
{
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 true;
if ( isdefined( self get_player_melee_weapon() ) && self hasweapon( self get_player_melee_weapon() ) )
return false;
return true;
}
spectator_respawn_all()
{
i = 0;
while ( i < level._melee_weapons.size )
{
self [[ level._melee_weapons[ i ].take_weapon ]]();
i++;
}
i = 0;
while ( i < level._melee_weapons.size )
{
self spectator_respawn( level._melee_weapons[ i ].wallbuy_targetname, level._melee_weapons[ i ].take_weapon, level._melee_weapons[ i ].has_weapon );
i++;
}
for ( i = 0; i < level._melee_weapons.size; i++ )
self spectator_respawn( level._melee_weapons[i].wallbuy_targetname, level._melee_weapons[i].weapon_name );
}
spectator_respawn( wallbuy_targetname, take_weapon, has_weapon )
spectator_respawn( wallbuy_targetname, weapon_name )
{
melee_triggers = getentarray( wallbuy_targetname, "targetname" );
players = get_players();
i = 0;
while ( i < melee_triggers.size )
for ( i = 0; i < melee_triggers.size; i++ )
{
melee_triggers[i] setvisibletoall();
while ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
{
j = 0;
while ( j < players.size )
{
if ( players[ j ] [[ has_weapon ]]() )
for ( j = 0; j < players.size; j++ )
{
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 )
{
for ( i = 0; i < level._melee_weapons.size; i++ )
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 )
{
for ( i = 0; i < melee_triggers.size; i++ )
melee_triggers[i] setinvisibletoplayer( self );
i++;
}
}
has_any_ballistic_knife()
{
if ( self hasweapon( "knife_ballistic_zm" ) )
{
return 1;
}
return true;
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
{
return 1;
}
i = 0;
while ( i < level._melee_weapons.size )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{
if ( self hasweapon( level._melee_weapons[i].ballistic_weapon_name ) )
{
return 1;
}
return true;
if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
{
return 1;
return true;
}
i++;
}
return 0;
return false;
}
has_upgraded_ballistic_knife()
{
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
{
return 1;
}
i = 0;
while ( i < level._melee_weapons.size )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{
if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
{
return 1;
return true;
}
i++;
}
return 0;
return false;
}
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 ] ) )
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 ] ) )
{
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 ) )
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 )
for ( i = 0; i < primaryweapons.size; i++ )
{
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 ) );
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, has_weapon, give_weapon, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name )
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 ) )
if ( isdefined( self.stub ) )
{
self endon( "kill_trigger" );
if ( isDefined( self.stub.first_time_triggered ) )
{
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;
has_weapon = self.stub.has_weapon;
give_weapon = self.stub.give_weapon;
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 )
if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
{
i = 0;
while ( i < players.size )
{
if ( players[ i ] [[ has_weapon ]]() )
for ( i = 0; i < players.size; i++ )
{
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 );
player thread ignore_triggers( 0.5 );
continue;
}
else if ( player in_revive_trigger() )
if ( player in_revive_trigger() )
{
wait 0,1;
wait 0.1;
continue;
}
else if ( player isthrowinggrenade() )
if ( player isthrowinggrenade() )
{
wait 0,1;
wait 0.1;
continue;
}
else if ( player.is_drinking > 0 )
if ( player.is_drinking > 0 )
{
wait 0,1;
wait 0.1;
continue;
}
else if ( player hasweapon( weapon_name ) || player has_powerup_weapon() )
if ( player hasweapon( weapon_name ) || player has_powerup_weapon() )
{
wait 0,1;
wait 0.1;
continue;
}
else
{
if ( player isswitchingweapons() )
{
wait 0,1;
break;
wait 0.1;
continue;
}
else current_weapon = player getcurrentweapon();
if ( !is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) && player has_powerup_weapon() )
current_weapon = player getcurrentweapon();
if ( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) || player has_powerup_weapon() )
{
wait 0,1;
break;
wait 0.1;
continue;
}
else
if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( player.intermission ) && player.intermission )
{
if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission )
{
wait 0,1;
break;
wait 0.1;
continue;
}
else
{
player_has_weapon = player [[ has_weapon ]]();
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 ) )
{
if ( isdefined( model ) )
model thread melee_weapon_show( player );
}
else
{
if ( isDefined( self.clientfieldname ) )
{
else if ( isdefined( self.clientfieldname ) )
level setclientfield( self.clientfieldname, 1 );
}
}
self.first_time_triggered = 1;
if ( isDefined( self.stub ) )
{
if ( isdefined( self.stub ) )
self.stub.first_time_triggered = 1;
}
}
player maps/mp/zombies/_zm_score::minus_to_player_score( cost );
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, give_weapon, flourish_fn, self );
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 );
player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon", undefined, 1 );
}
break;
continue;
}
else
{
if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
{
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_angles = vectortoangles( player.origin - self.origin );
player_yaw = player_angles[1];
weapon_yaw = self.angles[1];
yaw_diff = angleClamp180( player_yaw - weapon_yaw );
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.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, give_weapon, flourish_fn, trigger )
{
if ( isDefined( flourish_fn ) )
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 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 )
{
if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( self.intermission ) && self.intermission )
return;
}
self [[ give_weapon ]]();
if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
{
if ( isDefined( trigger ) )
if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
{
if ( isdefined( trigger ) )
trigger setinvisibletoplayer( self );
}
self trigger_hide_all();
}
}
@ -512,19 +537,21 @@ do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_
#/
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 )
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();
@ -537,20 +564,17 @@ do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_
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 )
{
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 )
{
if ( !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( isdefined( self.intermission ) && self.intermission ) )
self decrement_is_drinking();
}
}

View File

@ -1,37 +1,39 @@
//checked includes match cerberus output
#include maps/mp/_visionset_mgr;
#include maps/mp/zombies/_zm_perks;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_perks;
#include maps\mp\_visionset_mgr;
enable_divetonuke_perk_for_level() //checked matches cerberus output
enable_divetonuke_perk_for_level()
{
maps/mp/zombies/_zm_perks::register_perk_basic_info( "specialty_flakjacket", "divetonuke", 2000, &"ZOMBIE_PERK_DIVETONUKE", "zombie_perk_bottle_nuke" );
maps/mp/zombies/_zm_perks::register_perk_precache_func( "specialty_flakjacket", ::divetonuke_precache );
maps/mp/zombies/_zm_perks::register_perk_clientfields( "specialty_flakjacket", ::divetonuke_register_clientfield, ::divetonuke_set_clientfield );
maps/mp/zombies/_zm_perks::register_perk_machine( "specialty_flakjacket", ::divetonuke_perk_machine_setup, ::divetonuke_perk_machine_think );
maps/mp/zombies/_zm_perks::register_perk_host_migration_func( "specialty_flakjacket", ::divetonuke_host_migration_func );
maps\mp\zombies\_zm_perks::register_perk_basic_info( "specialty_flakjacket", "divetonuke", 2000, &"ZOMBIE_PERK_DIVETONUKE", "zombie_perk_bottle_nuke" );
maps\mp\zombies\_zm_perks::register_perk_precache_func( "specialty_flakjacket", ::divetonuke_precache );
maps\mp\zombies\_zm_perks::register_perk_clientfields( "specialty_flakjacket", ::divetonuke_register_clientfield, ::divetonuke_set_clientfield );
maps\mp\zombies\_zm_perks::register_perk_machine( "specialty_flakjacket", ::divetonuke_perk_machine_setup, ::divetonuke_perk_machine_think );
maps\mp\zombies\_zm_perks::register_perk_host_migration_func( "specialty_flakjacket", ::divetonuke_host_migration_func );
}
init_divetonuke() //checked matches cerberus output
init_divetonuke()
{
level.zombiemode_divetonuke_perk_func = ::divetonuke_explode;
maps/mp/_visionset_mgr::vsmgr_register_info( "visionset", "zm_perk_divetonuke", 9000, 400, 5, 1 );
maps\mp\_visionset_mgr::vsmgr_register_info( "visionset", "zm_perk_divetonuke", 9000, 400, 5, 1 );
level._effect["divetonuke_groundhit"] = loadfx( "maps/zombie/fx_zmb_phdflopper_exp" );
set_zombie_var( "zombie_perk_divetonuke_radius", 300 );
set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 );
set_zombie_var( "zombie_perk_divetonuke_max_damage", 5000 );
}
divetonuke_precache() //checked matches cerberus output
divetonuke_precache()
{
if ( isDefined( level.divetonuke_precache_override_func ) )
if ( isdefined( level.divetonuke_precache_override_func ) )
{
[[ level.divetonuke_precache_override_func ]]();
return;
}
precacheitem( "zombie_perk_bottle_nuke" );
precacheshader( "specialty_divetonuke_zombies" );
precachemodel( "zombie_vending_nuke" );
@ -44,17 +46,17 @@ divetonuke_precache() //checked matches cerberus output
level.machine_assets["divetonuke"].on_model = "zombie_vending_nuke_on";
}
divetonuke_register_clientfield() //checked matches cerberus output
divetonuke_register_clientfield()
{
registerclientfield( "toplayer", "perk_dive_to_nuke", 9000, 1, "int" );
}
divetonuke_set_clientfield( state ) //checked matches cerberus output
divetonuke_set_clientfield( state )
{
self setclientfieldtoplayer( "perk_dive_to_nuke", state );
}
divetonuke_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision ) //checked matches cerberus output
divetonuke_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision )
{
use_trigger.script_sound = "mus_perks_phd_jingle";
use_trigger.script_string = "divetonuke_perk";
@ -62,55 +64,59 @@ divetonuke_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collisio
use_trigger.target = "vending_divetonuke";
perk_machine.script_string = "divetonuke_perk";
perk_machine.targetname = "vending_divetonuke";
if ( isDefined( bump_trigger ) )
{
if ( isdefined( bump_trigger ) )
bump_trigger.script_string = "divetonuke_perk";
}
}
divetonuke_perk_machine_think() //checked changed to match cerberus output
divetonuke_perk_machine_think()
{
init_divetonuke();
while ( 1 )
while ( true )
{
machine = getentarray( "vending_divetonuke", "targetname" );
machine_triggers = getentarray( "vending_divetonuke", "target" );
for ( i = 0; i < machine.size; i++ )
{
machine[i] setmodel( level.machine_assets["divetonuke"].off_model );
}
array_thread( machine_triggers, ::set_power_on, 0 );
level thread do_initial_power_off_callback( machine, "divetonuke" );
level waittill( "divetonuke_on" );
for ( i = 0; i < machine.size; i++ )
{
machine[i] setmodel( level.machine_assets["divetonuke"].on_model );
machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 );
machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 );
machine[i] playsound( "zmb_perks_power_on" );
machine[i] thread perk_fx( "divetonuke_light" );
machine[i] thread play_loop_on_machine();
}
level notify( "specialty_flakjacket_power_on" );
array_thread( machine_triggers, ::set_power_on, 1 );
if ( isDefined( level.machine_assets[ "divetonuke" ].power_on_callback ) )
{
if ( isdefined( level.machine_assets["divetonuke"].power_on_callback ) )
array_thread( machine, level.machine_assets["divetonuke"].power_on_callback );
}
level waittill( "divetonuke_off" );
if ( isDefined( level.machine_assets[ "divetonuke" ].power_off_callback ) )
{
if ( isdefined( level.machine_assets["divetonuke"].power_off_callback ) )
array_thread( machine, level.machine_assets["divetonuke"].power_off_callback );
}
array_thread( machine, ::turn_perk_off );
}
}
divetonuke_host_migration_func() //checked changed to match cerberus output
divetonuke_host_migration_func()
{
flop = getentarray( "vending_divetonuke", "targetname" );
foreach ( perk in flop )
{
if ( isDefined( perk.model ) && perk.model == level.machine_assets[ "divetonuke" ].on_model )
if ( isdefined( perk.model ) && perk.model == level.machine_assets["divetonuke"].on_model )
{
perk perk_fx( undefined, 1 );
perk thread perk_fx( "divetonuke_light" );
@ -123,19 +129,17 @@ divetonuke_explode( attacker, origin )
radius = level.zombie_vars["zombie_perk_divetonuke_radius"];
min_damage = level.zombie_vars["zombie_perk_divetonuke_min_damage"];
max_damage = level.zombie_vars["zombie_perk_divetonuke_max_damage"];
if ( isdefined( level.flopper_network_optimized ) && level.flopper_network_optimized )
{
attacker thread divetonuke_explode_network_optimized( origin, radius, max_damage, min_damage, "MOD_GRENADE_SPLASH" );
}
else
{
radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
}
playfx( level._effect["divetonuke_groundhit"], origin );
attacker playsound( "zmb_phdflop_explo" );
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker );
maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker );
wait 1;
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker );
maps\mp\_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker );
}
divetonuke_explode_network_optimized( origin, radius, max_damage, min_damage, damage_mod )
@ -143,27 +147,26 @@ divetonuke_explode_network_optimized(origin, radius, max_damage, min_damage, dam
self endon( "disconnect" );
a_zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius );
network_stall_counter = 0;
if ( isdefined( a_zombies ) )
{
i = 0;
while ( i < a_zombies.size )
for ( i = 0; i < a_zombies.size; i++ )
{
e_zombie = a_zombies[i];
if ( !isdefined( e_zombie ) || !isalive( e_zombie ) )
{
i++;
continue;
}
dist = distance( e_zombie.origin, origin );
damage = ( min_damage + max_damage ) - min_damage * ( 1 - ( dist / radius ) );
damage = min_damage + ( max_damage - min_damage ) * ( 1.0 - dist / radius );
e_zombie dodamage( damage, e_zombie.origin, self, self, 0, damage_mod );
network_stall_counter--;
if ( network_stall_counter <= 0 )
{
wait_network_frame();
network_stall_counter = randomintrange( 1, 3 );
}
i++;
}
}
}

View File

@ -1,391 +0,0 @@
#include maps/mp/zombies/_zm_ai_basic;
#include maps/mp/animscripts/shared;
#include maps/mp/zombies/_zm_score;
#include maps/mp/zombies/_zm_perks;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
enable_electric_cherry_perk_for_level()
{
maps/mp/zombies/_zm_perks::register_perk_basic_info( "specialty_grenadepulldeath", "electric_cherry", 2000, &"ZM_PRISON_PERK_CHERRY", "zombie_perk_bottle_cherry" );
maps/mp/zombies/_zm_perks::register_perk_precache_func( "specialty_grenadepulldeath", ::electic_cherry_precache );
maps/mp/zombies/_zm_perks::register_perk_clientfields( "specialty_grenadepulldeath", ::electric_cherry_register_clientfield, ::electric_cherry_set_clientfield );
maps/mp/zombies/_zm_perks::register_perk_threads( "specialty_grenadepulldeath", ::electric_cherry_reload_attack, ::electric_cherry_perk_lost );
maps/mp/zombies/_zm_perks::register_perk_machine( "specialty_grenadepulldeath", ::electric_cherry_perk_machine_setup, ::electric_cherry_perk_machine_think );
maps/mp/zombies/_zm_perks::register_perk_host_migration_func( "specialty_grenadepulldeath", ::electric_cherry_host_migration_func );
}
init_electric_cherry()
{
level.custom_laststand_func = ::electric_cherry_laststand;
set_zombie_var( "tesla_head_gib_chance", 50 );
registerclientfield( "allplayers", "electric_cherry_reload_fx", 9000, 2, "int" );
}
electic_cherry_precache()
{
precacheitem( "zombie_perk_bottle_cherry" );
precacheshader( "specialty_fastreload_zombies" );
precachemodel( "p6_zm_vending_electric_cherry_off" );
precachemodel( "p6_zm_vending_electric_cherry_on" );
precachestring( &"ZM_PRISON_PERK_CHERRY" );
level._effect[ "electriccherry" ] = loadfx( "misc/fx_zombie_cola_on" );
level._effect[ "electric_cherry_explode" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_down" );
level._effect[ "electric_cherry_reload_small" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_sm" );
level._effect[ "electric_cherry_reload_medium" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_player" );
level._effect[ "electric_cherry_reload_large" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_lg" );
level._effect[ "tesla_shock" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock" );
level._effect[ "tesla_shock_secondary" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" );
}
electric_cherry_register_clientfield()
{
registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" );
}
electric_cherry_set_clientfield( state )
{
self setclientfieldtoplayer( "perk_electric_cherry", state );
}
electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision )
{
use_trigger.script_sound = "mus_perks_cherry_jingle";
use_trigger.script_string = "electric_cherry_perk";
use_trigger.script_label = "mus_perks_cherry_sting";
use_trigger.target = "vending_electriccherry";
perk_machine.script_string = "electriccherry_perk";
perk_machine.targetname = "vendingelectric_cherry";
if ( isDefined( bump_trigger ) )
{
bump_trigger.script_string = "electriccherry_perk";
}
}
electric_cherry_perk_machine_think()
{
init_electric_cherry();
while ( 1 )
{
machine = getentarray( "vendingelectric_cherry", "targetname" );
machine_triggers = getentarray( "vending_electriccherry", "target" );
i = 0;
while ( i < machine.size )
{
machine[ i ] setmodel( "p6_zm_vending_electric_cherry_off" );
i++;
}
level thread do_initial_power_off_callback( machine, "electriccherry" );
array_thread( machine_triggers, ::maps/mp/zombies/_zm_perks::set_power_on, 0 );
level waittill( "electric_cherry_on" );
i = 0;
while ( i < machine.size )
{
machine[ i ] setmodel( "p6_zm_vending_electric_cherry_on" );
machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0,3, 0,4, 3 );
machine[ i ] playsound( "zmb_perks_power_on" );
machine[ i ] thread perk_fx( "electriccherry" );
machine[ i ] thread play_loop_on_machine();
i++;
}
level notify( "specialty_grenadepulldeath_power_on" );
array_thread( machine_triggers, ::maps/mp/zombies/_zm_perks::set_power_on, 1 );
level waittill( "electric_cherry_off" );
array_thread( machine, ::maps/mp/zombies/_zm_perks::turn_perk_off );
}
}
electric_cherry_host_migration_func()
{
a_electric_cherry_perk_machines = getentarray( "vending_electriccherry", "targetname" );
_a125 = a_electric_cherry_perk_machines;
_k125 = getFirstArrayKey( _a125 );
while ( isDefined( _k125 ) )
{
perk_machine = _a125[ _k125 ];
if ( isDefined( perk_machine.model ) && perk_machine.model == "p6_zm_vending_electric_cherry_on" )
{
perk_machine perk_fx( undefined, 1 );
perk_machine thread perk_fx( "electriccherry" );
}
_k125 = getNextArrayKey( _a125, _k125 );
}
}
electric_cherry_laststand()
{
visionsetlaststand( "zombie_last_stand", 1 );
if ( isDefined( self ) )
{
playfx( level._effect[ "electric_cherry_explode" ], self.origin );
self playsound( "zmb_cherry_explode" );
self notify( "electric_cherry_start" );
wait 0,05;
a_zombies = get_round_enemy_array();
a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, 500 );
i = 0;
while ( i < a_zombies.size )
{
if ( isalive( self ) )
{
if ( a_zombies[ i ].health <= 1000 )
{
a_zombies[ i ] thread electric_cherry_death_fx();
if ( isDefined( self.cherry_kills ) )
{
self.cherry_kills++;
}
self maps/mp/zombies/_zm_score::add_to_player_score( 40 );
}
else
{
a_zombies[ i ] thread electric_cherry_stun();
a_zombies[ i ] thread electric_cherry_shock_fx();
}
wait 0,1;
a_zombies[ i ] dodamage( 1000, self.origin, self, self, "none" );
}
i++;
}
self notify( "electric_cherry_end" );
}
}
electric_cherry_death_fx()
{
self endon( "death" );
tag = "J_SpineUpper";
fx = "tesla_shock";
if ( self.isdog )
{
tag = "J_Spine1";
}
self playsound( "zmb_elec_jib_zombie" );
network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[ fx ], self, tag );
if ( isDefined( self.tesla_head_gib_func ) && !self.head_gibbed )
{
[[ self.tesla_head_gib_func ]]();
}
}
electric_cherry_shock_fx()
{
self endon( "death" );
tag = "J_SpineUpper";
fx = "tesla_shock_secondary";
if ( self.isdog )
{
tag = "J_Spine1";
}
self playsound( "zmb_elec_jib_zombie" );
network_safe_play_fx_on_tag( "tesla_shock_fx", 2, level._effect[ fx ], self, tag );
}
electric_cherry_stun()
{
self endon( "death" );
self notify( "stun_zombie" );
self endon( "stun_zombie" );
if ( self.health <= 0 )
{
/#
iprintln( "trying to stun a dead zombie" );
#/
return;
}
if ( self.ai_state != "find_flesh" )
{
return;
}
self.forcemovementscriptstate = 1;
self.ignoreall = 1;
i = 0;
while ( i < 2 )
{
self animscripted( self.origin, self.angles, "zm_afterlife_stun" );
self maps/mp/animscripts/shared::donotetracks( "stunned" );
i++;
}
self.forcemovementscriptstate = 0;
self.ignoreall = 0;
self setgoalpos( self.origin );
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
}
electric_cherry_reload_attack()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "stop_electric_cherry_reload_attack" );
self.wait_on_reload = [];
self.consecutive_electric_cherry_attacks = 0;
while ( 1 )
{
self waittill( "reload_start" );
str_current_weapon = self getcurrentweapon();
while ( isinarray( self.wait_on_reload, str_current_weapon ) )
{
continue;
}
self.wait_on_reload[ self.wait_on_reload.size ] = str_current_weapon;
self.consecutive_electric_cherry_attacks++;
n_clip_current = self getweaponammoclip( str_current_weapon );
n_clip_max = weaponclipsize( str_current_weapon );
n_fraction = n_clip_current / n_clip_max;
perk_radius = linear_map( n_fraction, 1, 0, 32, 128 );
perk_dmg = linear_map( n_fraction, 1, 0, 1, 1045 );
self thread check_for_reload_complete( str_current_weapon );
if ( isDefined( self ) )
{
switch( self.consecutive_electric_cherry_attacks )
{
case 0:
case 1:
n_zombie_limit = undefined;
break;
case 2:
n_zombie_limit = 8;
break;
case 3:
n_zombie_limit = 4;
break;
case 4:
n_zombie_limit = 2;
break;
default:
n_zombie_limit = 0;
}
self thread electric_cherry_cooldown_timer( str_current_weapon );
if ( isDefined( n_zombie_limit ) && n_zombie_limit == 0 )
{
continue;
}
self thread electric_cherry_reload_fx( n_fraction );
self notify( "electric_cherry_start" );
self playsound( "zmb_cherry_explode" );
a_zombies = get_round_enemy_array();
a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, perk_radius );
n_zombies_hit = 0;
i = 0;
while ( i < a_zombies.size )
{
if ( isalive( self ) )
{
if ( isDefined( n_zombie_limit ) )
{
if ( n_zombies_hit < n_zombie_limit )
{
n_zombies_hit++;
break;
}
else }
else if ( a_zombies[ i ].health <= perk_dmg )
{
a_zombies[ i ] thread electric_cherry_death_fx();
if ( isDefined( self.cherry_kills ) )
{
self.cherry_kills++;
}
self maps/mp/zombies/_zm_score::add_to_player_score( 40 );
}
else
{
if ( !isDefined( a_zombies[ i ].is_brutus ) )
{
a_zombies[ i ] thread electric_cherry_stun();
}
a_zombies[ i ] thread electric_cherry_shock_fx();
}
wait 0,1;
a_zombies[ i ] dodamage( perk_dmg, self.origin, self, self, "none" );
}
i++;
}
self notify( "electric_cherry_end" );
}
}
}
electric_cherry_cooldown_timer( str_current_weapon )
{
self notify( "electric_cherry_cooldown_started" );
self endon( "electric_cherry_cooldown_started" );
self endon( "death" );
self endon( "disconnect" );
n_reload_time = weaponreloadtime( str_current_weapon );
if ( self hasperk( "specialty_fastreload" ) )
{
n_reload_time *= getDvarFloat( "perk_weapReloadMultiplier" );
}
n_cooldown_time = n_reload_time + 3;
wait n_cooldown_time;
self.consecutive_electric_cherry_attacks = 0;
}
check_for_reload_complete( weapon )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "player_lost_weapon_" + weapon );
self thread weapon_replaced_monitor( weapon );
while ( 1 )
{
self waittill( "reload" );
str_current_weapon = self getcurrentweapon();
if ( str_current_weapon == weapon )
{
arrayremovevalue( self.wait_on_reload, weapon );
self notify( "weapon_reload_complete_" + weapon );
return;
}
else
{
}
}
}
weapon_replaced_monitor( weapon )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "weapon_reload_complete_" + weapon );
while ( 1 )
{
self waittill( "weapon_change" );
primaryweapons = self getweaponslistprimaries();
if ( !isinarray( primaryweapons, weapon ) )
{
self notify( "player_lost_weapon_" + weapon );
arrayremovevalue( self.wait_on_reload, weapon );
return;
}
else
{
}
}
}
electric_cherry_reload_fx( n_fraction )
{
if ( n_fraction >= 0,67 )
{
self setclientfield( "electric_cherry_reload_fx", 1 );
}
else if ( n_fraction >= 0,33 && n_fraction < 0,67 )
{
self setclientfield( "electric_cherry_reload_fx", 2 );
}
else
{
self setclientfield( "electric_cherry_reload_fx", 3 );
}
wait 1;
self setclientfield( "electric_cherry_reload_fx", 0 );
}
electric_cherry_perk_lost()
{
self notify( "stop_electric_cherry_reload_attack" );
}

View File

@ -1,13 +1,14 @@
//checked includes match cerberus output
#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_prison;
#include common_scripts/utility;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_weap_riotshield_prison;
#include maps\mp\zombies\_zm_buildables;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\zombies\_zm_weapons;
init() //checked matches cerberus output
init()
{
level.riotshield_name = "alcatraz_shield_zm";
level.deployedshieldmodel = [];
@ -37,148 +38,135 @@ init() //checked matches cerberus output
level.riotshield_placement_zoffset = 26;
}
attachriotshield( model, tag ) //checked matches cerberus output
{
if ( isDefined( self.prev_shield_model ) && isDefined( self.prev_shield_tag ) )
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 ) )
{
if ( isdefined( self.prev_shield_model ) && isdefined( self.prev_shield_tag ) )
self attachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
}
}
removeriotshield() //checked matches cerberus output
{
if ( isDefined( self.prev_shield_model ) && isDefined( 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 ) //checked matches cerberus output
setriotshieldviewmodel( modelnum )
{
self.prev_shield_viewmodel = modelnum;
if ( self getcurrentweapon() != level.riotshield_name )
{
return;
}
if ( isDefined( self.prev_shield_viewmodel ) )
{
if ( isdefined( self.prev_shield_viewmodel ) )
self setheldweaponmodel( self.prev_shield_viewmodel );
}
else
{
self setheldweaponmodel( 0 );
}
}
specialriotshieldviewmodel() //checked matches cerberus output
specialriotshieldviewmodel()
{
if ( self getcurrentweapon() != level.riotshield_name )
{
return;
}
self setheldweaponmodel( 3 );
}
restoreriotshieldviewmodel() //checked matches cerberus output
restoreriotshieldviewmodel()
{
if ( self getcurrentweapon() != level.riotshield_name )
{
return;
}
if ( isDefined( self.prev_shield_viewmodel ) )
{
if ( isdefined( self.prev_shield_viewmodel ) )
self setheldweaponmodel( self.prev_shield_viewmodel );
}
else
{
self setheldweaponmodel( 0 );
}
}
updateriotshieldmodel() //checked changed to match cerberus output
updateriotshieldmodel()
{
if ( !isDefined( self.shield_damage_level ) )
{
if ( isDefined( self.player_shield_reset_health ) )
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 )
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 )
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();
}
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 );
}
else if ( self.prev_shield_placement == 2 )
{
self attachriotshield( level.stowedshieldmodel[self.prev_shield_damage_level], "tag_stowed_back" );
}
else if ( self.prev_shield_placement == 3 )
{
self attachriotshield();
if ( isDefined( self.shield_ent ) )
{
if ( isdefined( self.shield_ent ) )
self.shield_ent setmodel( level.deployedshieldmodel[self.prev_shield_damage_level] );
}
}
}
}
updatestandaloneriotshieldmodel() //checked matches cerberus output
updatestandaloneriotshieldmodel()
{
update = 0;
if ( !isDefined( self.prev_shield_damage_level ) || self.prev_shield_damage_level != self.shield_damage_level )
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() //checked matches cerberus output used is_true() instead
watchshieldlaststand()
{
self endon( "death" );
self endon( "disconnect" );
self notify( "watchShieldLastStand" );
self endon( "watchShieldLastStand" );
while ( 1 )
while ( true )
{
self waittill( "weapons_taken_for_last_stand" );
self.riotshield_hidden = 0;
if ( is_true( self.hasriotshield ) )
if ( isdefined( self.hasriotshield ) && self.hasriotshield )
{
if ( self.prev_shield_placement == 1 || self.prev_shield_placement == 2 )
{
@ -187,39 +175,32 @@ watchshieldlaststand() //checked matches cerberus output used is_true() instead
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 )
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_prison::player_take_riotshield();
}
self maps\mp\zombies\_zm_weap_riotshield_prison::player_take_riotshield();
self.riotshield_hidden = undefined;
}
}
trackriotshield() //checked changed to match cerberus output
trackriotshield()
{
self endon( "death" );
self endon( "disconnect" );
self.hasriotshield = self hasweapon( level.riotshield_name );
if ( self getcurrentweapon() == level.riotshield_name )
{
self.hasriotshieldequipped = 1;
}
else
{
self.hasriotshieldequipped = 0;
}
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
self.shield_placement = 0;
if ( self.hasriotshield )
{
if ( self.hasriotshieldequipped )
@ -233,66 +214,66 @@ trackriotshield() //checked changed to match cerberus output
self updateriotshieldmodel();
}
}
for (;;)
{
self waittill( "weapon_change", newweapon );
if ( newweapon == level.riotshield_name )
{
if ( self.hasriotshieldequipped )
{
continue;
}
if ( isDefined( self.riotshieldentity ) )
{
if ( isdefined( self.riotshieldentity ) )
self notify( "destroy_riotshield" );
}
self.shield_placement = 1;
self updateriotshieldmodel();
if ( self.hasriotshield )
{
break;
}
else
{
}
self.hasriotshield = 1;
self.hasriotshieldequipped = 1;
continue;
}
if ( self ismantling() && newweapon == "none" )
{
continue;
}
if ( self.hasriotshieldequipped )
{
/*
/#
assert( self.hasriotshield );
#/
*/
self.hasriotshield = self hasweapon( level.riotshield_name );
if ( isDefined( self.riotshield_hidden ) && self.riotshield_hidden )
if ( isdefined( self.riotshield_hidden ) && self.riotshield_hidden )
{
}
else if ( self.hasriotshield )
{
self.shield_placement = 2;
break;
}
else if ( isDefined( self.shield_ent ) )
else if ( isdefined( self.shield_ent ) )
{
/*
/#
assert( self.shield_placement == 3 );
#/
*/
break;
}
else
{
self.shield_placement = 0;
}
self updateriotshieldmodel();
self.hasriotshieldequipped = 0;
break;
continue;
}
if ( self.hasriotshield )
{
if ( !self hasweapon( level.riotshield_name ) )
@ -301,8 +282,10 @@ trackriotshield() //checked changed to match cerberus output
self updateriotshieldmodel();
self.hasriotshield = 0;
}
continue;
}
if ( self hasweapon( level.riotshield_name ) )
{
self.shield_placement = 2;
@ -312,27 +295,31 @@ trackriotshield() //checked changed to match cerberus output
}
}
trackequipmentchange() //checked changed to match cerberus output
trackequipmentchange()
{
self endon( "death" );
self endon( "disconnect" );
for (;;)
{
self waittill( "equipment_dropped", equipname );
self notify( "weapon_change", self getcurrentweapon() );
}
}
updateriotshieldplacement() //checked matches cerberus output
updateriotshieldplacement()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "deploy_riotshield" );
self endon( "start_riotshield_deploy" );
self endon( "weapon_change" );
while ( 1 )
while ( true )
{
placement = self canplaceriotshield( "raise_riotshield" );
if ( placement["result"] && riotshielddistancetest( placement["origin"] ) )
{
self restoreriotshieldviewmodel();
@ -343,18 +330,19 @@ updateriotshieldplacement() //checked matches cerberus output
self specialriotshieldviewmodel();
self setplacementhint( 0 );
}
wait 0.05;
}
}
startriotshielddeploy() //checked matches cerberus output
startriotshielddeploy()
{
self notify( "start_riotshield_deploy" );
self thread updateriotshieldplacement();
self thread watchriotshielddeploy();
}
spawnriotshieldcover( origin, angles ) //checked matches cerberus output
spawnriotshieldcover( origin, angles )
{
shield_ent = spawn( "script_model", origin, 1 );
shield_ent.angles = angles;
@ -365,27 +353,29 @@ spawnriotshieldcover( origin, angles ) //checked matches cerberus output
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 );
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() //checked matches cerberus output
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;
@ -394,61 +384,57 @@ watchriotshielddeploy() //checked matches cerberus output
}
}
else
{
placement_hint = 1;
}
if ( placement_hint )
{
self setriotshieldfailhint();
}
}
check_plant_position( origin, angles ) //checked matches cerberus output
check_plant_position( origin, angles )
{
if ( isDefined( level.equipment_safe_to_drop ) )
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 ) //checked matches cerberus output
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 );
}
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 ) );
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 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 ( isdefined( level.equipment_safe_to_drop ) )
{
if ( !self [[ level.equipment_safe_to_drop ]]( shield_ent ) )
{
@ -458,6 +444,7 @@ doriotshielddeploy( origin, angles ) //checked matches cerberus output
return;
}
}
self.riotshieldretrievetrigger = item_ent;
self.riotshieldentity = shield_ent;
self thread watchdeployedriotshieldents();
@ -469,196 +456,178 @@ doriotshielddeploy( origin, angles ) //checked matches cerberus output
return shield_ent;
}
riotshielddistancetest( origin ) //checked matches cerberus output
riotshielddistancetest( origin )
{
/*
/#
assert( isDefined( origin ) );
assert( isdefined( origin ) );
#/
*/
min_dist_squared = getDvarFloat( "riotshield_deploy_limit_radius" );
min_dist_squared = getdvarfloat( "riotshield_deploy_limit_radius" );
min_dist_squared *= min_dist_squared;
i = 0;
while ( i < level.players.size )
for ( i = 0; i < level.players.size; i++ )
{
if ( isDefined( level.players[ i ].riotshieldentity ) )
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;
return false;
}
}
i++;
}
return 1;
}
watchdeployedriotshieldents() //checked matches cerberus output
return true;
}
watchdeployedriotshieldents()
{
/*
/#
assert( isDefined( self.riotshieldretrievetrigger ) );
assert( isDefined( self.riotshieldentity ) );
assert( isdefined( self.riotshieldretrievetrigger ) );
assert( isdefined( self.riotshieldentity ) );
#/
*/
riotshieldretrievetrigger = self.riotshieldretrievetrigger;
riotshieldentity = self.riotshieldentity;
self waittill_any( "destroy_riotshield", "disconnect", "alcatraz_shield_zm_taken" );
if ( isDefined( self ) )
if ( isdefined( self ) )
{
self.shield_placement = 0;
self updateriotshieldmodel();
}
if ( isDefined( riotshieldretrievetrigger ) )
{
if ( isdefined( riotshieldretrievetrigger ) )
riotshieldretrievetrigger delete();
}
if ( isDefined( riotshieldentity ) )
{
if ( isdefined( riotshieldentity ) )
riotshieldentity delete();
}
}
watchdeployedriotshielddamage() //checked changed to match cerberus output
watchdeployedriotshielddamage()
{
self endon( "death" );
damagemax = getDvarInt( "riotshield_deployed_health" );
damagemax = getdvarint( "riotshield_deployed_health" );
self.damagetaken = 0;
while ( 1 )
while ( true )
{
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 )
{
if ( !( isdefined( level.players_can_damage_riotshields ) && level.players_can_damage_riotshields ) )
continue;
}
if ( !isDefined( attacker ) || !isplayer( attacker ) )
{
if ( !isdefined( attacker ) || !isplayer( attacker ) )
continue;
}
/#
if ( isDefined( self.owner ) )
{
assert( isDefined( self.owner.team ) );
}
assert( isdefined( self.owner ) && isdefined( self.owner.team ) );
#/
if ( is_encounter() && attacker.team == self.owner.team && attacker != self.owner )
{
continue;
}
if ( isDefined( level.riotshield_damage_callback ) )
{
if ( isdefined( level.riotshield_damage_callback ) )
self.owner [[ level.riotshield_damage_callback ]]( damage, 0 );
continue;
}
else if ( type == "MOD_MELEE" )
else
{
damage *= getDvarFloat( "riotshield_melee_damage_scale" );
}
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" );
}
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;
}
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" );
else if ( type == "MOD_IMPACT" )
{
damage *= getDvarFloat( "riotshield_projectile_damage_scale" );
}
damage *= getdvarfloat( "riotshield_projectile_damage_scale" );
self.damagetaken += damage;
if ( self.damagetaken >= damagemax )
{
self damagethendestroyriotshield();
}
}
}
damagethendestroyriotshield() //checked matches cerberus output
damagethendestroyriotshield()
{
self endon( "death" );
self.owner.riotshieldretrievetrigger delete();
self notsolid();
self setclientflag( 14 );
wait getDvarFloat( "riotshield_destroyed_cleanup_time" );
wait( getdvarfloat( "riotshield_destroyed_cleanup_time" ) );
self.owner notify( "destroy_riotshield" );
}
deleteshieldondamage( shield_ent ) //checked matches cerberus output
deleteshieldondamage( shield_ent )
{
shield_ent waittill( "death" );
self notify( "destroy_riotshield" );
}
deleteshieldmodelonweaponpickup( shield_trigger ) //checked matches cerberus output
deleteshieldmodelonweaponpickup( shield_trigger )
{
shield_trigger waittill( "trigger", player );
self maps/mp/zombies/_zm_equipment::equipment_from_deployed( level.riotshield_name );
self maps\mp\zombies\_zm_equipment::equipment_from_deployed( level.riotshield_name );
self notify( "destroy_riotshield" );
if ( self != player )
{
if ( isDefined( level.transferriotshield ) )
{
if ( isdefined( level.transferriotshield ) )
[[ level.transferriotshield ]]( self, player );
}
}
}
watchshieldtriggervisibility( trigger ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2
watchshieldtriggervisibility( trigger )
{
self endon( "death" );
trigger endon( "death" );
while ( isDefined( trigger ) )
while ( isdefined( trigger ) )
{
players = get_players();
foreach ( player in players )
{
pickup = 1;
if ( !isDefined( player ) )
{
}
else if ( is_true( player.afterlife ) )
if ( !isdefined( player ) )
continue;
if ( is_true( player.afterlife ) )
{
trigger setinvisibletoplayer( player );
wait 0.05;
continue;
}
else
{
if ( isDefined( level.cantransferriotshield ) )
{
if ( isdefined( level.cantransferriotshield ) )
pickup = [[ level.cantransferriotshield ]]( self, player );
}
if ( !isDefined( trigger ) )
{
if ( !isdefined( trigger ) )
return;
}
if ( pickup )
{
trigger setvisibletoplayer( player );
}
else
{
trigger setinvisibletoplayer( player );
}
wait 0.05;
}
}
wait 0.05;
}
}
deleteriotshieldonplayerdeath() //checked matches cerberus output
deleteriotshieldonplayerdeath()
{
self.riotshieldentity endon( "death" );
self waittill( "death" );
self notify( "destroy_riotshield" );
}

View File

@ -1,10 +1,15 @@
#include maps/mp/zombies/_zm_stats;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_stats;
init()
{
if ( isDefined( level._uses_retrievable_ballisitic_knives ) && level._uses_retrievable_ballisitic_knives == 1 )
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" );
@ -17,9 +22,12 @@ on_spawn( watcher, player )
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 ) )
if ( isdefined( endpos ) )
{
retrievable_model = spawn( "script_model", endpos );
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
@ -27,47 +35,38 @@ on_spawn( watcher, player )
retrievable_model.owner = player;
retrievable_model.angles = angles;
retrievable_model.name = watcher.weapon;
if ( isDefined( prey ) )
if ( isdefined( prey ) )
{
if ( isplayer( prey ) && player.team == prey.team )
{
isfriendly = 1;
}
else
{
if ( isai( prey ) && player.team == prey.team )
{
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 )
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" );
}
player notify( "ballistic_knife_stationary", retrievable_model, normal );
else
{
player notify( "ballistic_knife_stationary" );
}
player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
retrievable_model thread wait_to_show_glowing_model( prey );
}
}
@ -86,13 +85,15 @@ on_spawn_retrieve_trigger( watcher, player )
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 ) )
{
if ( !isdefined( retrievable_model ) )
return;
}
trigger_pos = [];
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
{
trigger_pos[0] = prey.origin[0];
trigger_pos[1] = prey.origin[1];
@ -100,38 +101,43 @@ on_spawn_retrieve_trigger( watcher, player )
}
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 ] );
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.0;
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 ) )
{
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 ) )
{
if ( isdefined( prey ) )
pickup_trigger linkto( prey );
}
else
{
pickup_trigger linkto( retrievable_model );
}
if ( isDefined( level.knife_planted ) )
{
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 );
}
@ -140,12 +146,13 @@ debug_print( endpos )
{
/#
self endon( "death" );
while ( 1 )
while ( true )
{
print3d( endpos, "pickup_trigger" );
wait 0,05;
#/
wait 0.05;
}
#/
}
watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse )
@ -153,54 +160,63 @@ watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundo
self endon( "death" );
self endon( "delete" );
level endon( "game_ended" );
while ( 1 )
max_ammo = weaponmaxammo( weapon ) + 1;
autorecover = is_true( level.ballistic_knife_autorecover );
while ( true )
{
trigger waittill( "trigger", player );
while ( !isalive( player ) )
{
if ( !isalive( player ) )
continue;
}
while ( !player isonground() )
{
if ( !player isonground() && !is_true( trigger.force_pickup ) )
continue;
}
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
{
if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
continue;
}
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
{
if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
continue;
}
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() )
{
if ( isDefined( playersoundonuse ) )
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 ) )
{
if ( isdefined( npcsoundonuse ) )
player playsound( npcsoundonuse );
}
player thread [[ callback ]]( weapon, model, trigger );
return;
}
else
{
break;
}
}
}
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;
@ -212,27 +228,28 @@ pick_up( weapon, model, trigger )
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" );
}
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 ) )
if ( isdefined( self ) )
{
if ( isdefined( self.glowing_model ) )
self.glowing_model delete();
}
self delete();
}
}
watch_shutdown( trigger, model )
{
self waittill_any( "death", "disconnect", "zmb_lost_knife" );
self waittill_any( "death_or_disconnect", "zmb_lost_knife" );
trigger destroy_ent();
model destroy_ent();
}
@ -241,12 +258,14 @@ 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 ) )
if ( distancesquared( origin, self.origin ) < radius * radius )
{
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) );
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
self thread update_retrieve_trigger( player );
}
}
@ -256,9 +275,11 @@ 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 physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
self thread update_retrieve_trigger( player );
}
@ -266,12 +287,15 @@ update_retrieve_trigger( player )
{
self endon( "death" );
player endon( "zmb_lost_knife" );
if ( isDefined( level.custom_update_retrieve_trigger ) )
if ( isdefined( level.custom_update_retrieve_trigger ) )
{
self [[ level.custom_update_retrieve_trigger ]]( player );
return;
}
self waittill( "stationary" );
trigger = self.retrievabletrigger;
trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
trigger linkto( self );

View File

@ -1,23 +1,23 @@
//checked includes match cerberus output
#include maps/mp/animscripts/zm_shared;
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\animscripts\zm_shared;
init() //checked matches cerberus output
{
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "blundergat_zm" ) )
init()
{
if ( !maps\mp\zombies\_zm_weapons::is_weapon_included( "blundergat_zm" ) )
return;
}
else
{
precacheitem( "blundersplat_bullet_zm" );
precacheitem( "blundersplat_explosive_dart_zm" );
}
level.zombie_spawners = getentarray( "zombie_spawner", "script_noteworthy" );
array_thread( level.zombie_spawners, ::add_spawn_function, ::zombie_wait_for_blundersplat_hit );
level.custom_derive_damage_refs = ::gib_on_blundergat_damage;
@ -25,50 +25,51 @@ init() //checked matches cerberus output
onplayerconnect_callback( ::blundersplat_on_player_connect );
}
blundersplat_on_player_connect() //checked matches cerberus output
blundersplat_on_player_connect()
{
self thread wait_for_blundersplat_fired();
self thread wait_for_blundersplat_upgraded_fired();
}
zombie_wait_for_blundersplat_hit() //checked changed to match cerberus output
zombie_wait_for_blundersplat_hit()
{
self endon( "death" );
while ( 1 )
while ( true )
{
self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
if ( weaponname == "blundersplat_bullet_zm" )
{
if ( !isDefined( self.titus_tagged ) )
if ( !isdefined( self.titus_tagged ) )
{
a_grenades = getentarray( "grenade", "classname" );
if ( !isDefined( a_grenades ) || a_grenades.size <= 0 )
{
if ( !isdefined( a_grenades ) || a_grenades.size <= 0 )
continue;
}
self.titus_tagged = 1;
foreach ( e_grenade in a_grenades )
{
if ( isDefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" )
if ( isdefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" )
{
if ( e_grenade islinkedto( self ) )
{
while ( 1 )
{
if ( !isDefined( e_grenade.fuse_time ) )
while ( true )
{
if ( !isdefined( e_grenade.fuse_time ) )
wait_network_frame();
}
else
{
break;
}
}
n_fuse_timer = e_grenade.fuse_time;
e_grenade thread _titus_grenade_detonate_on_target_death( self );
}
}
}
self thread _titus_target_animate_and_die( n_fuse_timer, inflictor );
self thread _titus_target_check_for_grenade_hits();
}
@ -76,13 +77,16 @@ zombie_wait_for_blundersplat_hit() //checked changed to match cerberus output
}
}
wait_for_blundersplat_fired() //checked matches cerberus output
wait_for_blundersplat_fired()
{
self endon( "disconnect" );
self waittill( "spawned_player" );
for (;;)
{
self waittill( "weapon_fired", str_weapon );
if ( str_weapon == "blundersplat_zm" )
{
wait_network_frame();
@ -92,17 +96,21 @@ wait_for_blundersplat_fired() //checked matches cerberus output
wait_network_frame();
_titus_locate_target( 1 );
}
wait 0.5;
}
}
wait_for_blundersplat_upgraded_fired() //checked matches cerberus output
wait_for_blundersplat_upgraded_fired()
{
self endon( "disconnect" );
self waittill( "spawned_player" );
for (;;)
{
self waittill( "weapon_fired", str_weapon );
if ( str_weapon == "blundersplat_upgraded_zm" )
{
wait_network_frame();
@ -115,31 +123,28 @@ wait_for_blundersplat_upgraded_fired() //checked matches cerberus output
}
}
_titus_locate_target( is_not_upgraded ) //checked changed to match cerberus output
{
if ( !isDefined( is_not_upgraded ) )
_titus_locate_target( is_not_upgraded )
{
if ( !isdefined( is_not_upgraded ) )
is_not_upgraded = 1;
}
fire_angles = self getplayerangles();
fire_origin = self getplayercamerapos();
a_targets = arraycombine( getaiarray( "axis" ), getvehiclearray( "axis" ), 0, 0 );
a_targets = get_array_of_closest( self.origin, a_targets, undefined, undefined, 1500 );
if ( is_not_upgraded )
{
n_fuse_timer = randomfloatrange( 1, 2.5 );
}
n_fuse_timer = randomfloatrange( 1.0, 2.5 );
else
{
n_fuse_timer = randomfloatrange( 3, 4 );
}
n_fuse_timer = randomfloatrange( 3.0, 4.0 );
foreach ( target in a_targets )
{
if ( within_fov( fire_origin, fire_angles, target.origin, cos( 30 ) ) )
{
if ( isai( target ) )
{
if ( !isDefined( target.titusmarked ) )
if ( !isdefined( target.titusmarked ) )
{
a_tags = [];
a_tags[0] = "j_hip_le";
@ -151,6 +156,7 @@ _titus_locate_target( is_not_upgraded ) //checked changed to match cerberus outp
a_tags[6] = "j_clavicle_ri";
str_tag = a_tags[randomint( a_tags.size )];
b_trace_pass = bullettracepassed( fire_origin, target gettagorigin( str_tag ), 1, self, target );
if ( b_trace_pass )
{
target thread _titus_marked();
@ -162,15 +168,16 @@ _titus_locate_target( is_not_upgraded ) //checked changed to match cerberus outp
}
}
}
vec = anglesToForward( fire_angles );
trace_end = fire_origin + ( vec * 20000 );
vec = anglestoforward( fire_angles );
trace_end = fire_origin + vec * 20000;
trace = bullettrace( fire_origin, trace_end, 1, self );
offsetpos = trace["position"] + _titus_get_spread( 80 );
e_dart = magicbullet( "blundersplat_bullet_zm", fire_origin, offsetpos, self );
e_dart thread _titus_reset_grenade_fuse( n_fuse_timer );
}
_titus_get_spread( n_spread ) //checked matches cerberus output
_titus_get_spread( n_spread )
{
n_x = randomintrange( n_spread * -1, n_spread );
n_y = randomintrange( n_spread * -1, n_spread );
@ -178,7 +185,7 @@ _titus_get_spread( n_spread ) //checked matches cerberus output
return ( n_x, n_y, n_z );
}
_titus_marked() //checked matches cerberus output
_titus_marked()
{
self endon( "death" );
self.titusmarked = 1;
@ -186,138 +193,136 @@ _titus_marked() //checked matches cerberus output
self.titusmarked = undefined;
}
_titus_target_animate_and_die( n_fuse_timer, inflictor ) //checked matches cerberus output
_titus_target_animate_and_die( n_fuse_timer, inflictor )
{
self endon( "death" );
self endon( "titus_target_timeout" );
self thread _titus_target_timeout( n_fuse_timer );
self thread _titus_check_for_target_death( inflictor );
self thread _blundersplat_target_acid_stun_anim();
wait n_fuse_timer;
self notify( "killed_by_a_blundersplat" );
wait( n_fuse_timer );
self notify( "killed_by_a_blundersplat", inflictor );
self dodamage( self.health + 1000, self.origin );
}
_titus_target_check_for_grenade_hits() //checked changed to match cerberus output
_titus_target_check_for_grenade_hits()
{
self endon( "death" );
self endon( "titus_target_timeout" );
while ( 1 )
while ( true )
{
self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
if ( weaponname == "blundersplat_bullet_zm" )
{
a_grenades = getentarray( "grenade", "classname" );
foreach ( e_grenade in a_grenades )
{
if ( isDefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" )
if ( isdefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" )
{
if ( e_grenade islinkedto( self ) )
{
e_grenade thread _titus_grenade_detonate_on_target_death( self );
}
}
}
}
}
}
_titus_target_timeout( n_fuse_timer ) //checked matches cerberus output
_titus_target_timeout( n_fuse_timer )
{
self endon( "death" );
wait n_fuse_timer;
wait( n_fuse_timer );
self notify( "titus_target_timeout" );
}
_titus_check_for_target_death( inflictor ) //checked changed to match cerberus output
_titus_check_for_target_death( inflictor )
{
self waittill( "death" );
self notify( "killed_by_a_blundersplat", inflictor );
self notify( "titus_target_killed" );
}
_titus_grenade_detonate_on_target_death( target ) //checked matches cerberus output
_titus_grenade_detonate_on_target_death( target )
{
self endon( "death" );
target endon( "titus_target_timeout" );
target waittill( "titus_target_killed" );
self.fuse_reset = 1;
self resetmissiledetonationtime( 0.05 );
}
_titus_reset_grenade_fuse( n_fuse_timer, is_not_upgraded ) //checked changed to match cerberus output
{
if ( !isDefined( is_not_upgraded ) )
_titus_reset_grenade_fuse( n_fuse_timer, is_not_upgraded )
{
if ( !isdefined( is_not_upgraded ) )
is_not_upgraded = 1;
}
if ( !isDefined( n_fuse_timer ) )
{
n_fuse_timer = randomfloatrange( 1, 1,5 );
}
if ( !isdefined( n_fuse_timer ) )
n_fuse_timer = randomfloatrange( 1, 1.5 );
self waittill( "death" );
a_grenades = getentarray( "grenade", "classname" );
foreach ( e_grenade in a_grenades )
{
if ( isDefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" && !isDefined( e_grenade.fuse_reset ) )
if ( isdefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" && !isdefined( e_grenade.fuse_reset ) )
{
e_grenade.fuse_reset = 1;
e_grenade.fuse_time = n_fuse_timer;
e_grenade resetmissiledetonationtime( n_fuse_timer );
if ( is_not_upgraded )
{
e_grenade create_zombie_point_of_interest( 250, 5, 10000 );
}
else
{
e_grenade create_zombie_point_of_interest( 500, 10, 10000 );
}
return;
}
}
}
gib_on_blundergat_damage( refs, point, weaponname ) //checked changed to match cerberus output
gib_on_blundergat_damage( refs, point, weaponname )
{
new_gib_ref = [];
if ( isDefined( level.no_gib_in_wolf_area ) )
if ( isdefined( level.no_gib_in_wolf_area ) )
{
if ( [[ level.no_gib_in_wolf_area ]]() )
{
return new_gib_ref;
}
}
if ( self.health <= 0 )
{
return refs;
}
else if ( weaponname == "blundergat_zm" || weaponname == "blundergat_upgraded_zm" )
{
new_gib_ref = self maps/mp/zombies/_zm_spawner::derive_damage_refs( point );
new_gib_ref = self maps\mp\zombies\_zm_spawner::derive_damage_refs( point );
return new_gib_ref;
}
return refs;
}
_blundersplat_target_acid_stun_anim() //checked matches cerberus output
_blundersplat_target_acid_stun_anim()
{
self endon( "death" );
while ( 1 )
while ( true )
{
ground_ent = self getgroundent();
if ( isDefined( ground_ent ) && !is_true( ground_ent.classname == "worldspawn" ) )
{
self linkto( ground_ent );
}
if ( is_true( self.has_legs ) )
{
self animscripted( self.origin, self.angles, "zm_blundersplat_stun" );
}
else
{
self animscripted( self.origin, self.angles, "zm_blundersplat_stun_crawl" );
}
self maps/mp/animscripts/zm_shared::donotetracks( "blundersplat_stunned_anim" );
}
}
if ( isdefined( ground_ent ) && !is_true( ground_ent.classname == "worldspawn" ) )
self linkto( ground_ent );
if ( is_true( self.has_legs ) )
self animscripted( self.origin, self.angles, "zm_blundersplat_stun" );
else
self animscripted( self.origin, self.angles, "zm_blundersplat_stun_crawl" );
self maps\mp\animscripts\zm_shared::donotetracks( "blundersplat_stunned_anim" );
}
}

View File

@ -1,29 +1,30 @@
#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_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\gametypes_zm\_weaponobjects;
init()
{
if ( !isDefined( level.claymores_max_per_player ) )
{
if ( !isdefined( level.claymores_max_per_player ) )
level.claymores_max_per_player = 12;
}
trigs = getentarray( "claymore_purchase", "targetname" );
i = 0;
while ( i < trigs.size )
for ( i = 0; i < trigs.size; i++ )
{
model = getent( trigs[i].target, "targetname" );
if ( isDefined( model ) )
{
if ( isdefined( model ) )
model hide();
}
i++;
}
array_thread( trigs, ::buy_claymores );
level thread give_claymores_after_rounds();
level.claymores_on_damage = ::satchel_damage;
@ -38,28 +39,30 @@ buy_claymores()
{
self.zombie_cost = 1000;
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
self setcursorhint( "HINT_NOICON" );
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
self endon( "kill_trigger" );
if ( !isDefined( self.stub ) )
{
if ( !isdefined( self.stub ) )
return;
}
if ( isDefined( self.stub ) && !isDefined( self.stub.claymores_triggered ) )
{
if ( isdefined( self.stub ) && !isdefined( self.stub.claymores_triggered ) )
self.stub.claymores_triggered = 0;
}
self.claymores_triggered = self.stub.claymores_triggered;
while ( 1 )
while ( true )
{
self waittill( "trigger", who );
while ( who in_revive_trigger() )
if ( who in_revive_trigger() )
continue;
if ( who has_powerup_weapon() )
{
wait 0.1;
continue;
}
while ( who has_powerup_weapon() )
{
wait 0,1;
}
if ( is_player_valid( who ) )
{
if ( who.score >= self.zombie_cost )
@ -67,43 +70,41 @@ buy_claymores()
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 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 ) )
{
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 );
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" );
for ( i = 0; i < trigs.size; i++ )
trigs[i] setinvisibletoplayer( who );
}
else
who thread show_claymore_hint( "already_purchased" );
}
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" );
who play_sound_on_ent( "no_purchase" );
who maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon" );
}
}
}
@ -113,31 +114,32 @@ claymore_unitrigger_update_prompt( player )
{
if ( player is_player_placeable_mine( "claymore_zm" ) )
{
return 0;
self sethintstring( "" );
self setcursorhint( "HINT_NOICON" );
return false;
}
return 1;
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
return true;
}
set_claymore_visible()
{
players = get_players();
trigs = getentarray( "claymore_purchase", "targetname" );
while ( 1 )
while ( true )
{
j = 0;
while ( j < players.size )
for ( j = 0; j < players.size; j++ )
{
while ( !players[ j ] is_player_placeable_mine( "claymore_zm" ) )
{
i = 0;
while ( i < trigs.size )
if ( !players[j] is_player_placeable_mine( "claymore_zm" ) )
{
for ( i = 0; i < trigs.size; i++ )
trigs[i] setinvisibletoplayer( players[j], 0 );
i++;
}
}
j++;
}
wait 1;
players = get_players();
}
@ -146,60 +148,57 @@ set_claymore_visible()
claymore_safe_to_plant()
{
if ( self.owner.claymores.size >= level.claymores_max_per_player )
{
return 0;
}
if ( isDefined( level.claymore_safe_to_plant ) )
{
if ( isdefined( level.claymore_safe_to_plant ) )
return self [[ level.claymore_safe_to_plant ]]();
}
return 1;
}
claymore_wait_and_detonate()
{
wait 0,1;
wait 0.1;
self detonate( self.owner );
}
claymore_watch()
{
self endon( "death" );
while ( 1 )
self notify( "claymore_watch" );
self endon( "claymore_watch" );
while ( true )
{
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 ) )
{
if ( isdefined( level.claymore_planted ) )
self thread [[ level.claymore_planted ]]( claymore );
}
claymore thread satchel_damage();
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;
self maps\mp\zombies\_zm_stats::increment_client_stat( "claymores_planted" );
self maps\mp\zombies\_zm_stats::increment_player_stat( "claymores_planted" );
}
else
{
claymore thread claymore_wait_and_detonate();
}
}
}
}
claymore_setup()
{
if ( !isDefined( self.claymores ) )
{
if ( !isdefined( self.claymores ) )
self.claymores = [];
}
self thread claymore_watch();
self giveweapon( "claymore_zm" );
self set_player_placeable_mine( "claymore_zm" );
@ -209,22 +208,22 @@ claymore_setup()
adjust_trigger_origin( origin )
{
origin += vectorScale( ( 0, 0, 1 ), 20 );
origin += vectorscale( ( 0, 0, 1 ), 20.0 );
return origin;
}
on_spawn_retrieve_trigger( watcher, player )
{
self maps/mp/gametypes_zm/_weaponobjects::onspawnretrievableweaponobject( watcher, player );
if ( isDefined( self.pickuptrigger ) )
{
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();
@ -238,6 +237,7 @@ pickup_claymores()
{
clip_ammo = player getweaponammoclip( self.name );
clip_max_ammo = weaponclipsize( self.name );
if ( clip_ammo >= clip_max_ammo )
{
self destroy_ent();
@ -245,15 +245,16 @@ pickup_claymores()
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" );
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 )
@ -265,13 +266,15 @@ pickup_claymores_trigger_listener( trigger, player )
pickup_claymores_trigger_listener_enable( trigger, player )
{
self endon( "delete" );
while ( 1 )
self endon( "death" );
while ( true )
{
player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" );
if ( !isDefined( trigger ) )
{
if ( !isdefined( trigger ) )
return;
}
trigger trigger_on();
trigger linkto( self );
}
@ -280,13 +283,15 @@ pickup_claymores_trigger_listener_enable( trigger, player )
pickup_claymores_trigger_listener_disable( trigger, player )
{
self endon( "delete" );
while ( 1 )
self endon( "death" );
while ( true )
{
player waittill( "zmb_disable_claymore_prompt" );
if ( !isDefined( trigger ) )
{
if ( !isdefined( trigger ) )
return;
}
trigger unlink();
trigger trigger_off();
}
@ -294,14 +299,14 @@ pickup_claymores_trigger_listener_disable( trigger, player )
shouldaffectweaponobject( object )
{
pos = self.origin + vectorScale( ( 0, 0, 1 ), 32 );
pos = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 );
dirtopos = pos - object.origin;
objectforward = anglesToForward( object.angles );
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;
@ -316,44 +321,40 @@ claymore_detonation()
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 )
while ( true )
{
damagearea waittill( "trigger", ent );
if ( isDefined( self.owner ) && ent == self.owner )
{
if ( isdefined( self.owner ) && ent == self.owner )
continue;
}
while ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == self.team )
{
if ( isdefined( ent.pers ) && isdefined( ent.pers["team"] ) && ent.pers["team"] == self.team )
continue;
}
if ( isDefined( ent.ignore_claymore ) && ent.ignore_claymore )
{
if ( isdefined( ent.ignore_claymore ) && ent.ignore_claymore )
continue;
}
while ( !ent shouldaffectweaponobject( self ) )
{
if ( !ent shouldaffectweaponobject( self ) )
continue;
}
if ( ent damageconetrace( self.origin, self ) > 0 )
{
self playsound( "wpn_claymore_alert" );
wait 0,4;
if ( isDefined( self.owner ) )
{
wait 0.4;
if ( isdefined( self.owner ) )
self detonate( self.owner );
}
else
{
self detonate( undefined );
}
return;
}
}
@ -362,53 +363,53 @@ claymore_detonation()
delete_claymores_on_death( player, ent )
{
self waittill( "death" );
if ( isDefined( player ) )
{
if ( isdefined( player ) )
arrayremovevalue( player.claymores, self );
}
wait 0,05;
if ( isDefined( ent ) )
{
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 )
while ( true )
{
self waittill( "damage", amount, attacker );
if ( !isDefined( self ) )
{
if ( !isdefined( self ) )
return;
}
self.health = self.maxhealth;
while ( !isplayer( attacker ) )
{
if ( !isplayer( attacker ) )
continue;
}
if ( isDefined( self.owner ) && attacker == self.owner )
{
if ( isdefined( self.owner ) && attacker == self.owner )
continue;
}
while ( isDefined( attacker.pers ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] != level.zombie_team )
{
if ( isdefined( attacker.pers ) && isdefined( attacker.pers["team"] ) && attacker.pers["team"] != level.zombie_team )
continue;
break;
}
}
if ( level.satchelexplodethisframe )
{
wait ( 0,1 + randomfloat( 0,4 ) );
}
else wait 0,05;
if ( !isDefined( self ) )
{
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 );
@ -416,7 +417,7 @@ satchel_damage()
reset_satchel_explode_this_frame()
{
wait 0,05;
wait 0.05;
level.satchelexplodethisframe = 0;
}
@ -429,14 +430,15 @@ play_claymore_effects()
give_claymores_after_rounds()
{
while ( 1 )
while ( true )
{
level waittill( "between_round_over" );
while ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) )
if ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) )
{
players = get_players();
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
if ( players[i] is_player_placeable_mine( "claymore_zm" ) )
{
@ -445,48 +447,20 @@ give_claymores_after_rounds()
players[i] setactionslot( 4, "weapon", "claymore_zm" );
players[i] setweaponammoclip( "claymore_zm", 2 );
}
i++;
}
}
}
}
init_hint_hudelem( x, y, alignx, aligny, fontscale, alpha )
{
self.x = x;
self.y = y;
self.alignx = alignx;
self.aligny = aligny;
self.fontscale = fontscale;
self.alpha = alpha;
self.sort = 20;
}
setup_client_hintelem()
{
self endon( "death" );
self endon( "disconnect" );
if ( !isDefined( self.hintelem ) )
{
self.hintelem = newclienthudelem( self );
}
self.hintelem init_hint_hudelem( 320, 220, "center", "bottom", 1,6, 1 );
}
show_claymore_hint( string )
{
self endon( "death" );
self endon( "disconnect" );
if ( string == "claymore_purchased" )
{
text = &"ZOMBIE_CLAYMORE_HOWTO";
}
else
{
text = &"ZOMBIE_CLAYMORE_ALREADY_PURCHASED";
}
self setup_client_hintelem();
self.hintelem settext( text );
wait 3,5;
self.hintelem settext( "" );
show_equipment_hint_text( text );
}

View File

@ -1,19 +1,22 @@
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_riotshield_prison;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\gametypes_zm\_weaponobjects;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\animscripts\zm_death;
#include maps\mp\zombies\_zm_audio;
init()
{
maps/mp/zombies/_zm_riotshield_prison::init();
maps\mp\zombies\_zm_riotshield_prison::init();
set_zombie_var( "riotshield_cylinder_radius", 360 );
set_zombie_var( "riotshield_fling_range", 90 );
set_zombie_var( "riotshield_gib_range", 90 );
@ -32,9 +35,9 @@ init()
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( "alcatraz_shield_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" );
maps\mp\zombies\_zm_spawner::register_zombie_damage_callback( ::riotshield_zombie_damage_response );
maps\mp\zombies\_zm_equipment::register_equipment( "alcatraz_shield_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 );
}
@ -51,9 +54,10 @@ onplayerconnect()
dropshield()
{
self.shield_placement = 0;
self maps/mp/zombies/_zm_riotshield_prison::updateriotshieldmodel();
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "t6_wpn_zmb_shield_dlc2_dmg0_world", "alcatraz_shield_zm", self.origin + vectorScale( ( 0, 0, 1 ), 30 ), self.angles );
if ( isDefined( item ) )
self maps\mp\zombies\_zm_riotshield_prison::updateriotshieldmodel();
item = self maps\mp\zombies\_zm_equipment::placed_equipment_think( "t6_wpn_zmb_shield_dlc2_dmg0_world", "alcatraz_shield_zm", self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), self.angles );
if ( isdefined( item ) )
{
item.shielddamagetaken = self.shielddamagetaken;
item.original_owner = self;
@ -65,6 +69,7 @@ dropshield()
item.requires_pickup = 1;
item thread watchtoofriendly( self );
}
self takeweapon( level.riotshield_name );
return item;
}
@ -72,13 +77,13 @@ dropshield()
watchtoofriendly( player )
{
wait 1;
if ( isDefined( self ) && isDefined( player ) && distance2dsquared( self.origin, player.origin ) < 36 )
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 );
player maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 );
self deployed_damage_shield( 2000 );
}
}
@ -97,49 +102,46 @@ 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_prison::doriotshielddeploy( origin, angles );
if ( isDefined( item ) )
item = self maps\mp\zombies\_zm_riotshield_prison::doriotshielddeploy( origin, angles );
if ( isdefined( item ) )
{
item.origin = self.origin + vectorScale( ( 0, 0, 1 ), 30 );
item.origin = self.origin + vectorscale( ( 0, 0, 1 ), 30.0 );
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 ( isdefined( toplayer.screecher_weapon ) )
return false;
if ( isdefined( toplayer.is_drinking ) && toplayer.is_drinking > 0 )
return false;
if ( toplayer maps\mp\zombies\_zm_laststand::player_is_in_laststand() || toplayer in_revive_trigger() )
return false;
if ( toplayer isthrowinggrenade() )
{
return 0;
}
return false;
if ( fromplayer == toplayer )
{
return 1;
}
return true;
if ( toplayer is_player_equipment( level.riotshield_name ) && toplayer.shield_placement != 3 )
{
return 0;
}
return false;
if ( fromplayer.session_team != toplayer.session_team )
{
return 0;
}
return 1;
return false;
return true;
}
transferriotshield( fromplayer, toplayer )
@ -150,7 +152,7 @@ transferriotshield( fromplayer, toplayer )
toplayer.shielddamagetaken = damage;
toplayer.shield_placement = 3;
toplayer.shield_damage_level = 0;
toplayer maps/mp/zombies/_zm_equipment::equipment_give( "alcatraz_shield_zm" );
toplayer maps\mp\zombies\_zm_equipment::equipment_give( "alcatraz_shield_zm" );
toplayer switchtoweapon( "alcatraz_shield_zm" );
damagemax = level.zombie_vars["riotshield_hit_points"];
toplayer player_set_shield_health( damage, damagemax );
@ -159,10 +161,12 @@ transferriotshield( fromplayer, toplayer )
player_take_riotshield()
{
self notify( "destroy_riotshield" );
if ( self getcurrentweapon() == "alcatraz_shield_zm" )
{
new_primary = "";
if ( isDefined( self.laststand ) && self.laststand )
if ( isdefined( self.laststand ) && self.laststand )
{
new_primary = self.laststandpistol;
self giveweapon( new_primary );
@ -170,31 +174,31 @@ player_take_riotshield()
else
{
primaryweapons = self getweaponslistprimaries();
i = 0;
while ( i < primaryweapons.size )
for ( i = 0; i < primaryweapons.size; i++ )
{
if ( primaryweapons[i] != "alcatraz_shield_zm" )
{
new_primary = primaryweapons[i];
break;
}
else
{
i++;
}
}
if ( new_primary == "" )
{
self maps/mp/zombies/_zm_weapons::give_fallback_weapon();
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_prison::removeriotshield();
self maps/mp/zombies/_zm_equipment::equipment_take( "alcatraz_shield_zm" );
self maps\mp\zombies\_zm_riotshield_prison::removeriotshield();
self maps\mp\zombies\_zm_equipment::equipment_take( "alcatraz_shield_zm" );
self.hasriotshield = 0;
self.hasriotshieldequipped = 0;
}
@ -202,9 +206,11 @@ player_take_riotshield()
player_watch_laststand()
{
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "entering_last_stand" );
if ( self getcurrentweapon() == "alcatraz_shield_zm" )
{
new_primary = self.laststandpistol;
@ -219,7 +225,7 @@ player_init_shield_health()
retval = self.shielddamagetaken > 0;
self.shielddamagetaken = 0;
self.shield_damage_level = 0;
self maps/mp/zombies/_zm_riotshield_prison::updateriotshieldmodel();
self maps\mp\zombies\_zm_riotshield_prison::updateriotshieldmodel();
return retval;
}
@ -228,75 +234,65 @@ player_init_shield_location()
self.hasriotshield = 1;
self.hasriotshieldequipped = 0;
self.shield_placement = 2;
self maps/mp/zombies/_zm_riotshield_prison::updateriotshieldmodel();
self maps\mp\zombies\_zm_riotshield_prison::updateriotshieldmodel();
}
player_set_shield_health( damage, max_damage )
{
shieldhealth = int( ( 100 * ( max_damage - 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_prison::updateriotshieldmodel();
self maps\mp\zombies\_zm_riotshield_prison::updateriotshieldmodel();
}
deployed_set_shield_health( damage, max_damage )
{
shieldhealth = int( ( 100 * ( max_damage - 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_prison::updatestandaloneriotshieldmodel();
self maps\mp\zombies\_zm_riotshield_prison::updatestandaloneriotshieldmodel();
}
player_damage_shield( idamage, bheld )
{
damagemax = level.zombie_vars["riotshield_hit_points"];
if ( !isDefined( self.shielddamagetaken ) )
{
if ( !isdefined( self.shielddamagetaken ) )
self.shielddamagetaken = 0;
}
self.shielddamagetaken += idamage;
if ( self.shielddamagetaken >= damagemax )
{
if ( bheld || !isDefined( self.shield_ent ) )
if ( bheld || !isdefined( self.shield_ent ) )
{
self playrumbleonentity( "damage_heavy" );
earthquake( 1, 0,75, self.origin, 100 );
earthquake( 1.0, 0.75, self.origin, 100 );
}
else
{
if ( isDefined( self.shield_ent ) )
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 );
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
@ -304,8 +300,9 @@ player_damage_shield( idamage, bheld )
if ( bheld )
{
self playrumbleonentity( "damage_light" );
earthquake( 0,5, 0,5, self.origin, 100 );
earthquake( 0.5, 0.5, self.origin, 100 );
}
self player_set_shield_health( self.shielddamagetaken, damagemax );
self playsound( "fly_riotshield_zm_impact_zombies" );
}
@ -314,56 +311,55 @@ player_damage_shield( idamage, bheld )
deployed_damage_shield( idamage )
{
damagemax = level.zombie_vars["riotshield_hit_points"];
if ( !isDefined( self.shielddamagetaken ) )
{
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( "alcatraz_shield_zm" );
}
maps/mp/zombies/_zm_equipment::equipment_disappear_fx( shield_origin, level._riotshield_dissapear_fx );
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( "alcatraz_shield_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( "alcatraz_shield_zm_taken" );
while ( 1 )
{
while ( true )
self waittill_either( "alcatraz_shield_zm_activate", "alcatraz_shield_zm_deactivate" );
}
}
watchriotshielduse()
{
self endon( "death" );
self endon( "disconnect" );
self.shielddamagetaken = 0;
self thread maps/mp/zombies/_zm_riotshield_prison::trackriotshield();
self thread maps/mp/zombies/_zm_riotshield_prison::trackequipmentchange();
self thread maps/mp/zombies/_zm_riotshield_prison::watchshieldlaststand();
self thread maps\mp\zombies\_zm_riotshield_prison::trackriotshield();
self thread maps\mp\zombies\_zm_riotshield_prison::trackequipmentchange();
self thread maps\mp\zombies\_zm_riotshield_prison::watchshieldlaststand();
self thread trackstuckzombies();
for (;;)
{
self waittill( "raise_riotshield" );
self thread maps/mp/zombies/_zm_riotshield_prison::startriotshielddeploy();
self thread maps\mp\zombies\_zm_riotshield_prison::startriotshielddeploy();
}
}
@ -372,43 +368,42 @@ 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;
return true;
return false;
}
riotshield_damage( amount )
{
}
riotshield_fling_zombie( player, fling_vec, index )
{
if ( !isDefined( self ) || !isalive( self ) )
{
if ( !isdefined( self ) || !isalive( self ) )
return;
}
if ( isDefined( self.ignore_riotshield ) && self.ignore_riotshield )
{
if ( isdefined( self.ignore_riotshield ) && self.ignore_riotshield )
return;
}
if ( isDefined( self.riotshield_fling_func ) )
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;
@ -420,17 +415,17 @@ riotshield_fling_zombie( player, fling_vec, index )
zombie_knockdown( player, gib )
{
damage = level.zombie_vars["riotshield_knockdown_damage"];
if ( isDefined( level.override_riotshield_damage_func ) )
{
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 thread maps\mp\animscripts\zm_death::do_gib();
}
self dodamage( damage, player.origin, player );
}
}
@ -440,18 +435,15 @@ 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 ) )
{
if ( !isdefined( self ) || !isalive( self ) )
return;
}
if ( isDefined( self.riotshield_knockdown_func ) )
{
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" );
}
@ -460,94 +452,89 @@ 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 ) )
{
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" ] );
end_pos = view_pos + vectorscale( forward_view_angles, level.zombie_vars["riotshield_knockdown_range"] );
/#
if ( getDvarInt( #"BF480CE9" ) == 2 )
if ( 2 == getdvarint( _hash_BF480CE9 ) )
{
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 );
near_circle_pos = view_pos + vectorscale( forward_view_angles, 2 );
circle( near_circle_pos, level.zombie_vars["riotshield_cylinder_radius"], ( 1, 0, 0 ), 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 );
circle( end_pos, level.zombie_vars["riotshield_cylinder_radius"], ( 1, 0, 0 ), 0, 0, 100 );
}
#/
}
i = 0;
while ( i < zombies.size )
for ( i = 0; i < zombies.size; i++ )
{
if ( !isDefined( zombies[ i ] ) || !isalive( zombies[ i ] ) )
{
i++;
if ( !isdefined( zombies[i] ) || !isalive( zombies[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 ) );
zombies[i] riotshield_debug_print( "range", ( 1, 0, 0 ) );
return;
}
normal = vectornormalize( test_origin - view_pos );
dot = vectordot( forward_view_angles, normal );
if ( dot <= 0 )
if ( 0 > dot )
{
zombies[ i ] riotshield_debug_print( "dot", ( 0, 0, 1 ) );
i++;
zombies[i] riotshield_debug_print( "dot", ( 1, 0, 0 ) );
continue;
}
else radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
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++;
zombies[i] riotshield_debug_print( "cylinder", ( 1, 0, 0 ) );
continue;
}
else if ( zombies[ i ] damageconetrace( view_pos, self ) == 0 )
if ( 0 == zombies[i] damageconetrace( view_pos, self ) )
{
zombies[ i ] riotshield_debug_print( "cone", ( 0, 0, 1 ) );
i++;
zombies[i] riotshield_debug_print( "cone", ( 1, 0, 0 ) );
continue;
}
else if ( test_range_squared < fling_range_squared )
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 )
{
if ( 5000 < test_range_squared )
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 ) );
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++;
zombies[i] riotshield_debug_print( "fling", ( 0, 1, 0 ) );
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++;
zombies[i] riotshield_debug_print( "knockdown", ( 1, 1, 0 ) );
}
}
riotshield_network_choke()
{
level.riotshield_network_choke_count++;
if ( level.riotshield_network_choke_count % 10 )
if ( !( level.riotshield_network_choke_count % 10 ) )
{
wait_network_frame();
wait_network_frame();
@ -557,58 +544,58 @@ riotshield_network_choke()
riotshield_melee()
{
if ( !isDefined( level.riotshield_knockdown_enemies ) )
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 )
for ( i = 0; i < level.riotshield_fling_enemies.size; i++ )
{
riotshield_network_choke();
if ( isDefined( level.riotshield_fling_enemies[ i ] ) )
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 )
for ( i = 0; i < level.riotshield_knockdown_enemies.size; i++ )
{
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 ) )
{
if ( isdefined( self.riotshieldentity ) )
self thread watchstuckzombies();
}
}
}
attack_shield( shield )
{
@ -617,38 +604,36 @@ attack_shield( shield )
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 )
{
if ( isdefined( self.doing_shield_attack ) && self.doing_shield_attack )
return 0;
}
self.old_origin = self.origin;
if ( getDvar( "zombie_shield_attack_freq" ) == "" )
{
if ( getdvar( _hash_B253DFE7 ) == "" )
setdvar( "zombie_shield_attack_freq", "15" );
}
freq = getDvarInt( "zombie_shield_attack_freq" );
freq = getdvarint( _hash_B253DFE7 );
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 );
wait( randomint( 100 ) / 100.0 );
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 ) )
{
self animscripted( self.origin, flat_angle( vectortoangles( 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 );
wait( randomint( 100 ) / 100.0 );
self.doing_shield_attack = 0;
self orientmode( "face default" );
}
@ -658,15 +643,18 @@ 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 )
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 );
}
}
@ -674,19 +662,18 @@ attack_shield_stop( shield )
window_notetracks( msg, player )
{
self endon( "death" );
while ( 1 )
while ( true )
{
self waittill( msg, notetrack );
if ( notetrack == "end" )
{
return;
}
if ( notetrack == "fire" )
{
player player_damage_shield( 100, 0 );
}
}
}
watchstuckzombies()
{
@ -696,31 +683,30 @@ watchstuckzombies()
self endon( "destroy_riotshield" );
self endon( "deployed_riotshield" );
level endon( "intermission" );
self.riotshieldentity maps/mp/zombies/_zm_equipment::item_attract_zombies();
self.riotshieldentity maps\mp\zombies\_zm_equipment::item_attract_zombies();
}
riotshield_active()
{
return self maps/mp/zombies/_zm_equipment::is_equipment_active( "alcatraz_shield_zm" );
return self maps\mp\zombies\_zm_equipment::is_equipment_active( "alcatraz_shield_zm" );
}
riotshield_debug_print( msg, color )
{
/#
if ( !getDvarInt( #"BF480CE9" ) )
{
if ( !getdvarint( _hash_BF480CE9 ) )
return;
}
if ( !isDefined( color ) )
{
color = ( 0, 0, 1 );
}
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
if ( !isdefined( color ) )
color = ( 1, 1, 1 );
print3d( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), msg, color, 1, 1, 40 );
#/
}
shield_zombie_attract_func( poi )
{
}
shield_zombie_arrive_func( poi )
@ -728,16 +714,17 @@ 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 ) )
if ( isdefined( poi.owner ) )
{
poi.owner player_damage_shield( 100, 0 );
if ( isDefined( poi.owner.player_shield_apply_damage ) )
{
if ( isdefined( poi.owner.player_shield_apply_damage ) )
poi.owner [[ poi.owner.player_shield_apply_damage ]]( 100, 0 );
}
}
}
createriotshieldattractor()
{
@ -751,9 +738,10 @@ 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 true;
}
return 0;
return false;
}
watchriotshieldattractor()
@ -770,9 +758,11 @@ trackriotshieldattractor()
{
self endon( "death" );
self endon( "disconnect" );
for (;;)
{
self waittill( "deployed_riotshield" );
self thread watchriotshieldattractor();
}
}

View File

@ -1,24 +1,25 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_score;
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_stats;
init() //checked matches cerberus output
init()
{
registerclientfield( "toplayer", "tomahawk_in_use", 9000, 2, "int" );
registerclientfield( "toplayer", "upgraded_tomahawk_in_use", 9000, 1, "int" );
registerclientfield( "scriptmover", "play_tomahawk_fx", 9000, 2, "int" );
registerclientfield( "actor", "play_tomahawk_hit_sound", 9000, 1, "int" );
onplayerconnect_callback( ::tomahawk_on_player_connect );
maps/mp/zombies/_zm_weapons::include_zombie_weapon( "bouncing_tomahawk_zm", 0 );
maps/mp/zombies/_zm_weapons::include_zombie_weapon( "upgraded_tomahawk_zm", 0 );
maps/mp/zombies/_zm_weapons::include_zombie_weapon( "zombie_tomahawk_flourish", 0 );
maps/mp/zombies/_zm_weapons::add_zombie_weapon( "bouncing_tomahawk_zm", "zombie_tomahawk_flourish", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
maps/mp/zombies/_zm_weapons::add_zombie_weapon( "upgraded_tomahawk_zm", "zombie_tomahawk_flourish", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
maps\mp\zombies\_zm_weapons::include_zombie_weapon( "bouncing_tomahawk_zm", 0 );
maps\mp\zombies\_zm_weapons::include_zombie_weapon( "upgraded_tomahawk_zm", 0 );
maps\mp\zombies\_zm_weapons::include_zombie_weapon( "zombie_tomahawk_flourish", 0 );
maps\mp\zombies\_zm_weapons::add_zombie_weapon( "bouncing_tomahawk_zm", "zombie_tomahawk_flourish", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
maps\mp\zombies\_zm_weapons::add_zombie_weapon( "upgraded_tomahawk_zm", "zombie_tomahawk_flourish", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
level thread tomahawk_pickup();
level.zombie_weapons_no_max_ammo = [];
level.zombie_weapons_no_max_ammo["bouncing_tomahawk_zm"] = 1;
@ -26,7 +27,7 @@ init() //checked matches cerberus output
level.a_tomahawk_pickup_funcs = [];
}
tomahawk_on_player_connect() //checked matches cerberus output
tomahawk_on_player_connect()
{
self.current_tomahawk_weapon = "bouncing_tomahawk_zm";
self.current_tactical_grenade = "bouncing_tomahawk_zm";
@ -34,142 +35,136 @@ tomahawk_on_player_connect() //checked matches cerberus output
self thread watch_for_tomahawk_charge();
}
watch_for_tomahawk_throw() //checked changed to match cerberus output
watch_for_tomahawk_throw()
{
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "grenade_fire", grenade, weapname );
if ( !issubstr( weapname, "tomahawk_zm" ) )
{
continue;
}
grenade.use_grenade_special_bookmark = 1;
grenade.grenade_multiattack_bookmark_count = 1;
grenade.low_level_instant_kill_charge = 1;
grenade.owner = self;
self notify( "throwing_tomahawk" );
if ( isDefined( self.n_tomahawk_cooking_time ) )
{
if ( isdefined( self.n_tomahawk_cooking_time ) )
grenade.n_cookedtime = grenade.birthtime - self.n_tomahawk_cooking_time;
}
else
{
grenade.n_cookedtime = 0;
}
self thread check_for_time_out( grenade );
self thread tomahawk_thrown( grenade );
}
}
watch_for_tomahawk_charge() //checked changed to match cerberus output
watch_for_tomahawk_charge()
{
self endon( "disconnect" );
while ( 1 )
while ( true )
{
self waittill( "grenade_pullback", weaponname );
if ( !issubstr( weaponname, "tomahawk_zm" ) )
{
continue;
}
self thread watch_for_grenade_cancel();
self thread play_charge_fx();
self.n_tomahawk_cooking_time = getTime();
self.n_tomahawk_cooking_time = gettime();
self waittill_either( "grenade_fire", "grenade_throw_cancelled" );
wait 0.1;
self.n_tomahawk_cooking_time = undefined;
}
}
watch_for_grenade_cancel() //checked matches cerberus output
watch_for_grenade_cancel()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "grenade_fire" );
waittillframeend;
weapon = "none";
while ( self isthrowinggrenade() && weapon == "none" )
{
self waittill( "weapon_change", weapon );
}
self notify( "grenade_throw_cancelled" );
}
play_charge_fx() //checked changed to match cerberus output
play_charge_fx()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "grenade_fire" );
waittillframeend;
time_to_pulse = 1000;
while ( 1 )
while ( true )
{
time = getTime() - self.n_tomahawk_cooking_time;
time = gettime() - self.n_tomahawk_cooking_time;
self.current_tactical_grenade = self get_player_tactical_grenade();
if ( time >= time_to_pulse )
{
if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{
playfxontag( level._effect["tomahawk_charge_up_ug"], self, "tag_origin" );
}
else
{
playfxontag( level._effect["tomahawk_charge_up"], self, "tag_origin" );
}
time_to_pulse += 1000;
self playrumbleonentity( "reload_small" );
}
if ( time_to_pulse > 2400 && self.current_tactical_grenade != "upgraded_tomahawk_zm" )
{
return;
}
break;
if ( time_to_pulse >= 3400 )
{
return;
}
break;
wait 0.05;
}
}
get_grenade_charge_power( player ) //checked changed to match cerberus output
get_grenade_charge_power( player )
{
player endon( "disconnect" );
if ( self.n_cookedtime > 1000 && self.n_cookedtime < 2000 )
{
if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{
return 4.5;
}
return 1.5;
}
else if ( self.n_cookedtime > 2000 && self.n_cookedtime < 3000 )
{
if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{
return 6;
}
return 2;
}
else if ( self.n_cookedtime >= 3000 && player.current_tomahawk_weapon != "upgraded_tomahawk_zm" )
{
return 2;
}
else if ( self.n_cookedtime >= 3000 )
{
return 3;
}
return 1;
}
tomahawk_thrown( grenade ) //checked changed to match cerberus output
tomahawk_thrown( grenade )
{
self endon( "disconnect" );
grenade endon( "in_hellhole" );
grenade_owner = undefined;
if ( isDefined( grenade.owner ) )
{
if ( isdefined( grenade.owner ) )
grenade_owner = grenade.owner;
}
playfxontag( level._effect["tomahawk_charged_trail"], grenade, "tag_origin" );
self setclientfieldtoplayer( "tomahawk_in_use", 2 );
grenade waittill_either( "death", "time_out" );
@ -178,50 +173,56 @@ tomahawk_thrown( grenade ) //checked changed to match cerberus output
n_grenade_charge_power = grenade get_grenade_charge_power( self );
a_zombies = get_array_of_closest( grenade_origin, a_zombies, undefined, undefined, 200 );
a_powerups = get_array_of_closest( grenade_origin, level.active_powerups, undefined, undefined, 200 );
if ( isDefined( level.a_tomahawk_pickup_funcs ) )
if ( isdefined( level.a_tomahawk_pickup_funcs ) )
{
foreach ( tomahawk_func in level.a_tomahawk_pickup_funcs )
{
if ( [[ tomahawk_func ]]( grenade, n_grenade_charge_power ) )
{
return;
}
}
}
if ( isDefined( a_powerups ) && a_powerups.size > 0 )
if ( isdefined( a_powerups ) && a_powerups.size > 0 )
{
m_tomahawk = tomahawk_spawn( grenade_origin, n_grenade_charge_power );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
foreach ( powerup in a_powerups )
{
powerup.origin = grenade_origin;
powerup linkto( m_tomahawk );
m_tomahawk.a_has_powerup = a_powerups;
}
self thread tomahawk_return_player( m_tomahawk, 0 );
return;
}
if ( !isDefined( a_zombies ) )
if ( !isdefined( a_zombies ) )
{
m_tomahawk = tomahawk_spawn( grenade_origin, n_grenade_charge_power );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
self thread tomahawk_return_player( m_tomahawk, 0 );
return;
}
foreach ( ai_zombie in a_zombies )
else
{
foreach ( ai_zombie in a_zombies )
ai_zombie.hit_by_tomahawk = 0;
}
if ( isDefined( a_zombies[ 0 ] ) && isalive( a_zombies[ 0 ] ) )
if ( isdefined( a_zombies[0] ) && isalive( a_zombies[0] ) )
{
v_zombiepos = a_zombies[0].origin;
if ( distancesquared( grenade_origin, v_zombiepos ) <= 4900 )
{
a_zombies[0] setclientfield( "play_tomahawk_hit_sound", 1 );
n_tomahawk_damage = calculate_tomahawk_damage( a_zombies[0], n_grenade_charge_power, grenade );
a_zombies[0] dodamage( n_tomahawk_damage, grenade_origin, self, grenade, "none", "MOD_GRENADE", 0, "bouncing_tomahawk_zm" );
a_zombies[0].hit_by_tomahawk = 1;
self maps/mp/zombies/_zm_score::add_to_player_score( 10 );
self maps\mp\zombies\_zm_score::add_to_player_score( 10 );
self thread tomahawk_ricochet_attack( grenade_origin, n_grenade_charge_power );
}
else
@ -235,15 +236,15 @@ tomahawk_thrown( grenade ) //checked changed to match cerberus output
{
m_tomahawk = tomahawk_spawn( grenade_origin, n_grenade_charge_power );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
if ( isDefined( grenade ) )
{
if ( isdefined( grenade ) )
grenade delete();
}
self thread tomahawk_return_player( m_tomahawk, 0 );
}
}
check_for_time_out( grenade ) //checked matches cerberus output
check_for_time_out( grenade )
{
self endon( "disconnect" );
grenade endon( "death" );
@ -251,107 +252,111 @@ check_for_time_out( grenade ) //checked matches cerberus output
grenade notify( "time_out" );
}
tomahawk_ricochet_attack( grenade_origin, tomahawk_charge_power ) //checked matches cerberus output
tomahawk_ricochet_attack( grenade_origin, tomahawk_charge_power )
{
self endon( "disconnect" );
a_zombies = getaispeciesarray( "axis", "all" );
a_zombies = get_array_of_closest( grenade_origin, a_zombies, undefined, undefined, 300 );
a_zombies = array_reverse( a_zombies );
if ( !isDefined( a_zombies ) )
if ( !isdefined( a_zombies ) )
{
m_tomahawk = tomahawk_spawn( grenade_origin, tomahawk_charge_power );
m_tomahawk.n_grenade_charge_power = tomahawk_charge_power;
self thread tomahawk_return_player( m_tomahawk, 0 );
return;
}
m_tomahawk = tomahawk_spawn( grenade_origin, tomahawk_charge_power );
m_tomahawk.n_grenade_charge_power = tomahawk_charge_power;
self thread tomahawk_attack_zombies( m_tomahawk, a_zombies );
}
tomahawk_attack_zombies( m_tomahawk, a_zombies ) //checked changed to match cerberus output
tomahawk_attack_zombies( m_tomahawk, a_zombies )
{
self endon( "disconnect" );
if ( !isDefined( a_zombies ) )
if ( !isdefined( a_zombies ) )
{
self thread tomahawk_return_player( m_tomahawk, 0 );
return;
}
if ( a_zombies.size <= 4 )
{
n_attack_limit = a_zombies.size;
}
else
{
n_attack_limit = 4;
}
for ( i = 0; i < n_attack_limit; i++ )
{
if ( isDefined( a_zombies[ i ] ) && isalive( a_zombies[ i ] ) )
if ( isdefined( a_zombies[i] ) && isalive( a_zombies[i] ) )
{
tag = "J_Head";
if ( a_zombies[i].isdog )
{
tag = "J_Spine1";
}
if ( isDefined( a_zombies[ i ].hit_by_tomahawk ) && !a_zombies[ i ].hit_by_tomahawk )
if ( isdefined( a_zombies[i].hit_by_tomahawk ) && !a_zombies[i].hit_by_tomahawk )
{
v_target = a_zombies[i] gettagorigin( tag );
m_tomahawk moveto( v_target, 0.3 );
m_tomahawk waittill( "movedone" );
if ( isDefined( a_zombies[ i ] ) && isalive( a_zombies[ i ] ) )
if ( isdefined( a_zombies[i] ) && isalive( a_zombies[i] ) )
{
if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{
playfxontag( level._effect["tomahawk_impact_ug"], a_zombies[i], tag );
}
else
{
playfxontag( level._effect["tomahawk_impact"], a_zombies[i], tag );
}
playfxontag( level._effect["tomahawk_fire_dot"], a_zombies[i], "j_spineupper" );
a_zombies[i] setclientfield( "play_tomahawk_hit_sound", 1 );
n_tomahawk_damage = calculate_tomahawk_damage( a_zombies[i], m_tomahawk.n_grenade_charge_power, m_tomahawk );
a_zombies[i] dodamage( n_tomahawk_damage, m_tomahawk.origin, self, m_tomahawk, "none", "MOD_GRENADE", 0, "bouncing_tomahawk_zm" );
a_zombies[i].hit_by_tomahawk = 1;
self maps/mp/zombies/_zm_score::add_to_player_score( 10 );
self maps\mp\zombies\_zm_score::add_to_player_score( 10 );
}
}
}
wait 0.2;
}
self thread tomahawk_return_player( m_tomahawk, n_attack_limit );
}
tomahawk_return_player( m_tomahawk, num_zombie_hit ) //checked changed to match cerberus output
tomahawk_return_player( m_tomahawk, num_zombie_hit )
{
self endon( "disconnect" );
n_dist = distance2dsquared( m_tomahawk.origin, self.origin );
if ( !isDefined( num_zombie_hit ) )
{
if ( !isdefined( num_zombie_hit ) )
num_zombie_hit = 5;
}
while ( n_dist > 4096 )
{
m_tomahawk moveto( self geteye(), 0.25 );
if ( num_zombie_hit < 5 )
{
self tomahawk_check_for_zombie( m_tomahawk );
num_zombie_hit++;
}
wait 0.1;
n_dist = distance2dsquared( m_tomahawk.origin, self geteye() );
}
if ( isDefined( m_tomahawk.a_has_powerup ) )
if ( isdefined( m_tomahawk.a_has_powerup ) )
{
foreach ( powerup in m_tomahawk.a_has_powerup )
{
if ( isDefined( powerup ) )
{
if ( isdefined( powerup ) )
powerup.origin = self.origin;
}
}
}
m_tomahawk delete();
self playsoundtoplayer( "wpn_tomahawk_catch_plr", self );
self playsound( "wpn_tomahawk_catch_npc" );
@ -359,93 +364,90 @@ tomahawk_return_player( m_tomahawk, num_zombie_hit ) //checked changed to match
self playsoundtoplayer( "wpn_tomahawk_cooldown_done", self );
self givemaxammo( self.current_tomahawk_weapon );
a_zombies = getaispeciesarray( "axis", "all" );
foreach ( ai_zombie in a_zombies )
{
ai_zombie.hit_by_tomahawk = 0;
}
self setclientfieldtoplayer( "tomahawk_in_use", 3 );
}
tomahawk_check_for_zombie( grenade ) //checked matches cerberus output
tomahawk_check_for_zombie( grenade )
{
self endon( "disconnect" );
grenade endon( "death" );
a_zombies = getaispeciesarray( "axis", "all" );
a_zombies = get_array_of_closest( grenade.origin, a_zombies, undefined, undefined, 100 );
if ( isDefined( a_zombies[ 0 ] ) && distance2dsquared( grenade.origin, a_zombies[ 0 ].origin ) <= 10000 )
{
if ( isDefined( a_zombies[ 0 ].hit_by_tomahawk ) && !a_zombies[ 0 ].hit_by_tomahawk )
if ( isdefined( a_zombies[0] ) && distance2dsquared( grenade.origin, a_zombies[0].origin ) <= 10000 )
{
if ( isdefined( a_zombies[0].hit_by_tomahawk ) && !a_zombies[0].hit_by_tomahawk )
self tomahawk_hit_zombie( a_zombies[0], grenade );
}
}
}
tomahawk_hit_zombie( ai_zombie, grenade ) //checked matches cerberus output
tomahawk_hit_zombie( ai_zombie, grenade )
{
self endon( "disconnect" );
if ( isDefined( ai_zombie ) && isalive( ai_zombie ) )
if ( isdefined( ai_zombie ) && isalive( ai_zombie ) )
{
tag = "J_Head";
if ( ai_zombie.isdog )
{
tag = "J_Spine1";
}
v_target = ai_zombie gettagorigin( tag );
grenade moveto( v_target, 0.3 );
grenade waittill( "movedone" );
if ( isDefined( ai_zombie ) && isalive( ai_zombie ) )
if ( isdefined( ai_zombie ) && isalive( ai_zombie ) )
{
if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{
playfxontag( level._effect["tomahawk_impact_ug"], ai_zombie, tag );
}
else
{
playfxontag( level._effect["tomahawk_impact"], ai_zombie, tag );
}
ai_zombie setclientfield( "play_tomahawk_hit_sound", 1 );
n_tomahawk_damage = calculate_tomahawk_damage( ai_zombie, grenade.n_grenade_charge_power, grenade );
ai_zombie dodamage( n_tomahawk_damage, grenade.origin, self, grenade, "none", "MOD_GRENADE", 0, "bouncing_tomahawk_zm" );
ai_zombie.hit_by_tomahawk = 1;
self maps/mp/zombies/_zm_score::add_to_player_score( 10 );
self maps\mp\zombies\_zm_score::add_to_player_score( 10 );
}
}
}
tomahawk_spawn( grenade_origin, charged ) //checked matches cerberus output
tomahawk_spawn( grenade_origin, charged )
{
m_tomahawk = spawn( "script_model", grenade_origin );
m_tomahawk setmodel( "t6_wpn_zmb_tomahawk_world" );
m_tomahawk thread tomahawk_spin();
m_tomahawk playloopsound( "wpn_tomahawk_flying_loop" );
if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{
playfxontag( level._effect["tomahawk_trail_ug"], m_tomahawk, "tag_origin" );
}
else
{
playfxontag( level._effect["tomahawk_trail"], m_tomahawk, "tag_origin" );
}
if ( isDefined( charged ) && charged > 1 )
{
if ( isdefined( charged ) && charged > 1 )
playfxontag( level._effect["tomahawk_charged_trail"], m_tomahawk, "tag_origin" );
}
m_tomahawk.low_level_instant_kill_charge = 1;
return m_tomahawk;
}
tomahawk_spin() //checked matches cerberus output
tomahawk_spin()
{
self endon( "death" );
while ( isDefined( self ) )
while ( isdefined( self ) )
{
self rotatepitch( 90, 0.2 );
wait 0.15;
}
}
tomahawk_pickup() //checked matches cerberus output
tomahawk_pickup()
{
flag_wait( "soul_catchers_charged" );
flag_init( "tomahawk_pickup_complete" );
@ -472,102 +474,102 @@ tomahawk_pickup() //checked matches cerberus output
trigger_upgraded.script_noteworthy = "redeemer_pickup_trigger";
trigger_upgraded sethintstring( &"ZM_PRISON_TOMAHAWK_UPGRADED_PICKUP" );
trigger_upgraded setcursorhint( "HINT_NOICON" );
/*
/#
iprintlnbold( "GO FIND THE TOMAHAWK" );
#/
*/
trigger thread tomahawk_pickup_trigger();
trigger_upgraded thread tomahawk_pickup_trigger();
flag_set( "tomahawk_pickup_complete" );
}
tomahawk_pickup_trigger() //checked changed to match cerberus output
tomahawk_pickup_trigger()
{
while ( 1 )
while ( true )
{
self waittill( "trigger", player );
if ( isDefined( player.current_tactical_grenade ) && !issubstr( player.current_tactical_grenade, "tomahawk_zm" ) )
{
if ( isdefined( player.current_tactical_grenade ) && !issubstr( player.current_tactical_grenade, "tomahawk_zm" ) )
player takeweapon( player.current_tactical_grenade );
}
if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{
if ( !is_true( player.afterlife ) )
{
continue;
}
else
{
player disable_player_move_states( 1 );
gun = player getcurrentweapon();
level notify( "bouncing_tomahawk_zm_aquired" );
player maps/mp/zombies/_zm_stats::increment_client_stat( "prison_tomahawk_acquired", 0 );
player maps\mp\zombies\_zm_stats::increment_client_stat( "prison_tomahawk_acquired", 0 );
player giveweapon( "zombie_tomahawk_flourish" );
player thread tomahawk_update_hud_on_last_stand();
player switchtoweapon( "zombie_tomahawk_flourish" );
player waittill_any( "player_downed", "weapon_change_complete" );
if ( self.script_noteworthy == "redeemer_pickup_trigger" )
{
player.redeemer_trigger = self;
player setclientfieldtoplayer( "upgraded_tomahawk_in_use", 1 );
}
player switchtoweapon( gun );
player enable_player_move_states();
player.loadout.hastomahawk = 1;
continue;
}
}
if ( !player hasweapon( "bouncing_tomahawk_zm" ) && !player hasweapon( "upgraded_tomahawk_zm" ) )
{
player disable_player_move_states( 1 );
if ( !is_true( player.afterlife ) )
{
player giveweapon( player.current_tomahawk_weapon );
player thread tomahawk_update_hud_on_last_stand();
player thread tomahawk_tutorial_hint();
player set_player_tactical_grenade( player.current_tomahawk_weapon );
if ( self.script_noteworthy == "retriever_pickup_trigger" )
{
player.retriever_trigger = self;
}
player notify( "tomahawk_picked_up" );
player setclientfieldtoplayer( "tomahawk_in_use", 1 );
gun = player getcurrentweapon();
level notify( "bouncing_tomahawk_zm_aquired" );
player notify( "player_obtained_tomahawk" );
player maps/mp/zombies/_zm_stats::increment_client_stat( "prison_tomahawk_acquired", 0 );
player maps\mp\zombies\_zm_stats::increment_client_stat( "prison_tomahawk_acquired", 0 );
player giveweapon( "zombie_tomahawk_flourish" );
player switchtoweapon( "zombie_tomahawk_flourish" );
player waittill_any( "player_downed", "weapon_change_complete" );
if ( self.script_noteworthy == "redeemer_pickup_trigger" )
{
player setclientfieldtoplayer( "upgraded_tomahawk_in_use", 1 );
}
player switchtoweapon( gun );
}
player enable_player_move_states();
wait 0.1;
}
}
}
tomahawk_pickup_spin() //checked matches cerberus output
tomahawk_pickup_spin()
{
self endon( "death" );
while ( 1 )
while ( true )
{
self rotateyaw( 90, 1 );
wait 0.15;
}
}
calculate_tomahawk_damage( n_target_zombie, n_tomahawk_power, tomahawk ) //checked changed to match cerberus output
calculate_tomahawk_damage( n_target_zombie, n_tomahawk_power, tomahawk )
{
if ( n_tomahawk_power > 2 )
{
return n_target_zombie.health + 1;
}
else if ( level.round_number >= 10 && level.round_number < 13 && tomahawk.low_level_instant_kill_charge <= 3 )
{
tomahawk.low_level_instant_kill_charge += 1;
@ -579,12 +581,10 @@ calculate_tomahawk_damage( n_target_zombie, n_tomahawk_power, tomahawk ) //check
return n_target_zombie.health + 1;
}
else
{
return 1000 * n_tomahawk_power;
}
}
setting_tutorial_hud() //checked matches cerberus output
setting_tutorial_hud()
{
client_hint = newclienthudelem( self );
client_hint.alignx = "center";
@ -600,7 +600,7 @@ setting_tutorial_hud() //checked matches cerberus output
return client_hint;
}
tomahawk_tutorial_hint() //checked matches cerberus output
tomahawk_tutorial_hint()
{
hud = setting_tutorial_hud();
hud settext( &"ZM_PRISON_TOMAHAWK_TUTORIAL" );
@ -609,16 +609,19 @@ tomahawk_tutorial_hint() //checked matches cerberus output
hud destroy();
}
tomahawk_update_hud_on_last_stand() //checked matches cerberus output
tomahawk_update_hud_on_last_stand()
{
self endon( "disconnect" );
self endon( "bled_out" );
self endon( "tomahawk_upgraded_swap" );
while ( 1 )
while ( true )
{
self waittill_either( "entering_last_stand", "fake_death" );
self setclientfieldtoplayer( "tomahawk_in_use", 0 );
self waittill( "player_revived" );
if ( isalive( self ) )
{
wait 0.1;
@ -629,4 +632,3 @@ tomahawk_update_hud_on_last_stand() //checked matches cerberus output
}
}
}

View File

@ -1,12 +0,0 @@
#include common_scripts/utility;
#include maps/mp/_utility;
init()
{
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
}
watch_bolt_detonation( owner )
{
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,9 @@
#include maps/mp/gametypes_zm/_globallogic_score;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_globallogic_score;
init()
{
@ -18,13 +20,13 @@ achievement_sound_func( achievement_name_lower )
init_player_achievement_stats()
{
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_highrise_sidequest", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_vertigoner", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_slippery_when_undead", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_facing_the_dragon", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_im_my_own_best_friend", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_mad_without_power", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_shafted", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_highrise_sidequest", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_vertigoner", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_slippery_when_undead", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_facing_the_dragon", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_im_my_own_best_friend", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_mad_without_power", 0 );
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc1_shafted", 0 );
}
onplayerconnect()
@ -39,6 +41,7 @@ onplayerconnect()
achievement_highrise_sidequest()
{
level endon( "end_game" );
level waittill( "highrise_sidequest_achieved" );
/#
iprintlnbold( "ZM_DLC1_HIGHRISE_SIDEQUEST achieved for the team" );
@ -52,12 +55,15 @@ achievement_vertigoner()
self endon( "disconnect" );
self.num_zombies_flung = 0;
max_zombies_flung = 10;
while ( self.num_zombies_flung < max_zombies_flung )
{
self waittill( "zombie_flung" );
wait 0,1;
wait 0.1;
}
/#
#/
self giveachievement_wrapper( "ZM_DLC1_VERTIGONER" );
}
@ -68,12 +74,15 @@ achievement_slippery_when_undead()
self endon( "disconnect" );
self.num_sliquifier_kills = 0;
max_kills_with_one_shot = 5;
while ( self.num_sliquifier_kills < max_kills_with_one_shot )
{
self waittill( "sliquifier_kill" );
wait 0,01;
wait 0.01;
}
/#
#/
self giveachievement_wrapper( "ZM_DLC1_SLIPPERY_WHEN_UNDEAD" );
}
@ -86,29 +95,28 @@ achievement_facing_the_dragon()
v_dragon_position = ( 971, 43, 3800 );
is_touching_distance = 350;
round_number_max = 2;
while ( 1 )
while ( true )
{
if ( level.round_number >= round_number_max )
{
return;
}
dist = distance( self.origin, v_achievement_location );
if ( dist <= is_touching_distance )
{
v_dir = vectornormalize( v_dragon_position - self.origin );
v_forward = self getweaponforwarddir();
dp = vectordot( v_dir, v_forward );
if ( dp > 0,95 )
{
if ( dp > 0.95 )
break;
}
}
else
{
wait 0,01;
}
wait 0.01;
}
/#
#/
self giveachievement_wrapper( "ZM_DLC1_FACING_THE_DRAGON" );
}
@ -117,8 +125,10 @@ achievement_im_my_own_best_friend()
{
level endon( "end_game" );
self endon( "disconnect" );
self waittill( "whos_who_self_revive" );
/#
#/
self giveachievement_wrapper( "ZM_DLC1_IM_MY_OWN_BEST_FRIEND" );
}
@ -127,15 +137,16 @@ achievement_mad_without_power()
{
level endon( "end_game" );
round_number_max = 10;
while ( level.round_number < round_number_max )
{
level waittill( "start_of_round" );
if ( flag( "power_on" ) )
{
return;
}
}
/#
#/
self giveachievement_wrapper( "ZM_DLC1_MAD_WITHOUT_POWER", 1 );
}
@ -146,45 +157,39 @@ achievement_shafted()
self endon( "disconnect" );
level.perk_bought_func = ::player_buys_perk_machine;
max_unique_perk_machines = 6;
while ( 1 )
while ( true )
{
self waittill_any( "player_buys_perk", "pap_used" );
if ( isDefined( self.pap_used ) && self.pap_used == 1 )
{
if ( isDefined( self.perk_machines_bought ) && self.perk_machines_bought.size >= max_unique_perk_machines )
if ( isdefined( self.pap_used ) && self.pap_used == 1 )
{
if ( isdefined( self.perk_machines_bought ) && self.perk_machines_bought.size >= max_unique_perk_machines )
break;
}
}
else
{
}
}
/#
#/
self giveachievement_wrapper( "ZM_DLC1_SHAFTED" );
}
player_buys_perk_machine( perk )
{
if ( !isDefined( self.perk_machines_bought ) )
{
if ( !isdefined( self.perk_machines_bought ) )
self.perk_machines_bought = [];
}
found = 0;
i = 0;
while ( i < self.perk_machines_bought.size )
for ( i = 0; i < self.perk_machines_bought.size; i++ )
{
if ( perk == self.perk_machines_bought[i] )
{
found = 1;
break;
}
else
{
i++;
}
}
if ( !found )
{
self.perk_machines_bought[self.perk_machines_bought.size] = perk;

View File

@ -1,8 +1,10 @@
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
#include maps/mp/_ambientpackage;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_ambientpackage;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
main()
{
@ -17,30 +19,28 @@ sndmusicegg()
origins[2] = ( 1230, 1846, 3249 );
level.meteor_counter = 0;
level.music_override = 0;
i = 0;
while ( i < origins.size )
{
for ( i = 0; i < origins.size; i++ )
level thread sndmusicegg_wait( origins[i] );
i++;
}
}
sndmusicegg_wait( bear_origin )
{
temp_ent = spawn( "script_origin", bear_origin );
temp_ent playloopsound( "zmb_meteor_loop" );
temp_ent thread maps/mp/zombies/_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override );
temp_ent thread maps\mp\zombies\_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override );
temp_ent waittill( "main_music_egg_hit", player );
temp_ent stoploopsound( 1 );
player playsound( "zmb_meteor_activate" );
level.meteor_counter += 1;
if ( level.meteor_counter == 3 )
{
level thread sndmuseggplay( temp_ent, "mus_zmb_secret_song", 190 );
}
else
{
wait 1,5;
wait 1.5;
temp_ent delete();
}
}
@ -48,10 +48,9 @@ sndmusicegg_wait( bear_origin )
sndmusicegg_override()
{
if ( is_true( level.music_override ) )
{
return 0;
}
return 1;
return false;
return true;
}
sndmuseggplay( ent, alias, time )
@ -62,7 +61,7 @@ sndmuseggplay( ent, alias, time )
level thread sndeggmusicwait( time );
level waittill_either( "end_game", "sndSongDone" );
ent stopsounds();
wait 0,05;
wait 0.05;
ent delete();
level.music_override = 0;
}
@ -70,6 +69,6 @@ sndmuseggplay( ent, alias, time )
sndeggmusicwait( time )
{
level endon( "end_game" );
wait time;
wait( time );
level notify( "sndSongDone" );
}

View File

@ -1,11 +1,13 @@
#include maps/mp/zombies/_zm_unitrigger;
#include maps/mp/zm_highrise_elevators;
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zm_transit_utility;
#include maps\mp\zombies\_zm_buildables;
#include maps\mp\zm_highrise_elevators;
#include maps\mp\zombies\_zm_unitrigger;
init_buildables()
{
@ -45,7 +47,7 @@ include_buildables()
slipgun.triggerthink = ::slipgunbuildable;
slipgun.onuseplantobject = ::onuseplantobject_slipgun;
include_buildable( slipgun );
key_chain = generate_zombie_buildable_piece( "keys_zm", "P6_zm_hr_key", 32, 64, 2,4, "zom_hud_icon_epod_key", ::onpickup_keys, ::ondrop_keys, undefined, undefined, 0, 9 );
key_chain = generate_zombie_buildable_piece( "keys_zm", "P6_zm_hr_key", 32, 64, 2.4, "zom_hud_icon_epod_key", ::onpickup_keys, ::ondrop_keys, undefined, undefined, 0, 9 );
key_chain.onspawn = ::onspawn_keys;
key_chain manage_multiple_pieces( 4 );
key = spawnstruct();
@ -62,10 +64,11 @@ include_buildables()
ekey.onuseplantobject = ::onuseplantobject_elevatorkey;
ekey.buildablepieces[0].onspawn = ::onspawn_keys;
include_buildable( ekey );
if ( !isDefined( level.gamedifficulty ) || level.gamedifficulty != 0 )
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, 10 );
sq_common_meteor = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_meteor", 128, 64, 0, "zm_hud_icon_sq_meteor", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 11 );
sq_common_meteor = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_meteor", 32, 64, 0, "zm_hud_icon_sq_meteor", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 11 );
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, 12 );
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, 13 );
sqcommon = spawnstruct();
@ -76,46 +79,41 @@ include_buildables()
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" );
maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "sq_common_buildable_trigger" );
}
}
springpadbuildable()
{
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "springpad_zm_buildable_trigger", "springpad_zm", "equip_springpad_zm", &"ZM_HIGHRISE_GRAB_SPRINGPAD", 1, 1 );
maps\mp\zombies\_zm_buildables::buildable_trigger_think( "springpad_zm_buildable_trigger", "springpad_zm", "equip_springpad_zm", &"ZM_HIGHRISE_GRAB_SPRINGPAD", 1, 1 );
}
slipgunbuildable()
{
level thread wait_for_slipgun();
if ( isDefined( level.slipgun_as_equipment ) && !level.slipgun_as_equipment )
{
if ( !( isdefined( level.slipgun_as_equipment ) && level.slipgun_as_equipment ) )
persist = 2;
}
else
{
persist = 1;
}
maps/mp/zombies/_zm_buildables::buildable_trigger_think( "slipgun_zm_buildable_trigger", "slipgun_zm", "slipgun_zm", &"ZM_HIGHRISE_GRAB_SLIPGUN", 1, persist );
maps\mp\zombies\_zm_buildables::buildable_trigger_think( "slipgun_zm_buildable_trigger", "slipgun_zm", "slipgun_zm", &"ZM_HIGHRISE_GRAB_SLIPGUN", 1, persist );
}
keysbuildable()
{
pod_key = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "escape_pod_key_console_trigger", "keys_zm", "keys_zm", "", 1, 3 );
pod_key = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "escape_pod_key_console_trigger", "keys_zm", "keys_zm", "", 1, 3 );
pod_key.prompt_and_visibility_func = ::escape_pod_key_prompt;
}
ekeysbuildable()
{
elevator_keys = maps/mp/zombies/_zm_buildables::buildable_trigger_think_array( "elevator_key_console_trigger", "ekeys_zm", "keys_zm", "", 1, 3 );
_a143 = elevator_keys;
_k143 = getFirstArrayKey( _a143 );
while ( isDefined( _k143 ) )
elevator_keys = maps\mp\zombies\_zm_buildables::buildable_trigger_think_array( "elevator_key_console_trigger", "ekeys_zm", "keys_zm", "", 1, 3 );
foreach ( stub in elevator_keys )
{
stub = _a143[ _k143 ];
stub.prompt_and_visibility_func = ::elevator_key_prompt;
stub.buildablezone.stat_name = "keys_zm";
_k143 = getNextArrayKey( _a143, _k143 );
}
}
@ -140,22 +138,24 @@ onpickup_common( player )
sqcommonbuildable()
{
level.sq_buildable = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "sq_common_buildable_trigger", "sq_common", "sq_common", "", 1, 0 );
level.sq_buildable = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "sq_common_buildable_trigger", "sq_common", "sq_common", "", 1, 0 );
}
onbuyweapon_slipgun( player )
{
player givestartammo( self.stub.weaponname );
player switchtoweapon( self.stub.weaponname );
level notify( "slipgun_bought" );
level notify( "slipgun_bought", player );
}
wait_for_slipgun()
{
level.zombie_include_weapons["slipgun_zm"] = 0;
if ( isDefined( level.slipgun_as_equipment ) && !level.slipgun_as_equipment )
if ( !( isdefined( level.slipgun_as_equipment ) && level.slipgun_as_equipment ) )
{
level waittill( "slipgun_bought", player );
level.zombie_include_weapons["slipgun_zm"] = 1;
level.zombie_weapons["slipgun_zm"].is_in_box = 1;
}
@ -163,11 +163,9 @@ wait_for_slipgun()
keyscreateglint()
{
if ( !isDefined( self.model.glint_fx ) )
{
if ( !isdefined( self.model.glint_fx ) )
playfxontag( level._effect["elevator_glint"], self.model, "tag_origin" );
}
}
onspawn_keys()
{
@ -181,6 +179,7 @@ ondrop_keys( player )
onpickup_keys( player )
{
}
escape_pod_key_prompt( player )
@ -191,6 +190,7 @@ escape_pod_key_prompt( player )
self sethintstring( self.stub.hint_string );
return 0;
}
return self buildabletrigger_update_prompt( player );
}
@ -204,14 +204,16 @@ watch_elevator_prompt( player, trig )
player notify( "watch_elevator_prompt" );
player endon( "watch_elevator_prompt" );
trig endon( "kill_trigger" );
while ( 1 )
while ( true )
{
trig.stub.elevator waittill( "floor_changed" );
if ( isDefined( self.stub.elevator ) )
if ( isdefined( self.stub.elevator ) )
{
if ( trig.stub.elevator maps/mp/zm_highrise_elevators::elevator_is_on_floor( trig.stub.floor ) )
if ( trig.stub.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( trig.stub.floor ) )
{
thread maps/mp/zombies/_zm_unitrigger::cleanup_trigger( trig, player );
thread maps\mp\zombies\_zm_unitrigger::cleanup_trigger( trig, player );
return;
}
}
@ -220,73 +222,73 @@ watch_elevator_prompt( player, trig )
elevator_key_prompt( player )
{
if ( !isDefined( self.stub.elevator ) )
if ( !isdefined( self.stub.elevator ) )
{
elevatorname = self.stub.script_noteworthy;
if ( isDefined( elevatorname ) && isDefined( self.stub.script_parameters ) )
if ( isdefined( elevatorname ) && isdefined( self.stub.script_parameters ) )
{
elevator = level.elevators[elevatorname];
floor = int( self.stub.script_parameters );
flevel = elevator maps/mp/zm_highrise_elevators::elevator_level_for_floor( floor );
flevel = elevator maps\mp\zm_highrise_elevators::elevator_level_for_floor( floor );
self.stub.elevator = elevator;
self.stub.floor = flevel;
}
}
/#
if ( !isDefined( self.stub.elevator ) )
{
if ( isDefined( self.stub.script_noteworthy ) )
if ( !isdefined( self.stub.elevator ) )
{
if ( isdefined( self.stub.script_noteworthy ) )
error( "Cannot locate elevator " + self.stub.script_noteworthy );
}
else
{
error( "Cannot locate elevator " );
}
}
else
{
color = vectorScale( ( 0, 0, 1 ), 0,7 );
color = vectorscale( ( 0, 0, 1 ), 0.7 );
stop = self.stub.floor;
floor = self.stub.elevator.floors["" + stop].script_location;
text = "call " + self.stub.script_noteworthy + " to stop " + stop + " floor " + floor + "";
if ( getDvarInt( #"B67910B4" ) )
{
print3d( self.stub.origin, text, color, 1, 0,5, 300 );
if ( getdvarint( _hash_B67910B4 ) )
print3d( self.stub.origin, text, color, 1, 0.5, 300 );
}
#/
}
}
if ( isDefined( self.stub.elevator ) )
if ( isdefined( self.stub.elevator ) )
{
if ( self.stub.elevator maps/mp/zm_highrise_elevators::elevator_is_on_floor( self.stub.floor ) )
if ( self.stub.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.stub.floor ) )
{
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string );
return 0;
}
}
if ( !flag( "power_on" ) )
{
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string );
return 0;
}
can_use = self buildabletrigger_update_prompt( player );
if ( can_use )
{
thread watch_elevator_prompt( player, self );
}
return can_use;
}
onuseplantobject_elevatorkey( player )
{
elevatorname = self.script_noteworthy;
if ( isDefined( elevatorname ) && isDefined( self.script_parameters ) )
if ( isdefined( elevatorname ) && isdefined( self.script_parameters ) )
{
floor = int( self.script_parameters );
elevator = level.elevators[elevatorname];
if ( isDefined( elevator ) )
if ( isdefined( elevator ) )
{
elevator.body.force_starting_floor = floor;
elevator.body notify( "forcego" );
@ -296,33 +298,29 @@ onuseplantobject_elevatorkey( player )
droponelevator( player )
{
if ( isDefined( player ) && isDefined( player maps/mp/zm_highrise_elevators::object_is_on_elevator() ) && player maps/mp/zm_highrise_elevators::object_is_on_elevator() )
if ( isdefined( player ) && ( isdefined( player maps\mp\zm_highrise_elevators::object_is_on_elevator() ) && player maps\mp\zm_highrise_elevators::object_is_on_elevator() ) )
{
self.model linkto( player.elevator_parent );
self.linked_to_elevator = 1;
self.unitrigger.link_parent = player.elevator_parent;
}
else
{
self.unitrigger.link_parent = undefined;
}
}
pickupfromelevator()
{
if ( isDefined( self.linked_to_elevator ) && self.linked_to_elevator )
{
if ( isDefined( self.model ) )
if ( isdefined( self.linked_to_elevator ) && self.linked_to_elevator )
{
if ( isdefined( self.model ) )
self.model unlink();
}
self.linked_to_elevator = undefined;
}
if ( isDefined( self.unitrigger ) )
{
if ( isdefined( self.unitrigger ) )
self.unitrigger.link_parent = undefined;
}
}
onuseplantobject_slipgun( player )
{
@ -332,22 +330,18 @@ onuseplantobject_slipgun( player )
buildable = self.buildablezone;
first_part = "TAG_COOKER";
second_part = "TAG_BASE";
i = 0;
while ( i < buildable.pieces.size )
for ( i = 0; i < buildable.pieces.size; i++ )
{
if ( buildable.pieces[i].part_name == first_part )
{
if ( isDefined( buildable.pieces[ i ].built ) || buildable.pieces[ i ].built && player.current_buildable_piece.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++;
}
}

View File

@ -1,129 +1,119 @@
#include maps/mp/zombies/_zm_ai_basic;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_ai_basic;
zombie_tracking_init()
{
level.zombie_respawned_health = [];
if ( !isDefined( level.zombie_tracking_dist ) )
{
if ( !isdefined( level.zombie_tracking_dist ) )
level.zombie_tracking_dist = 1000;
}
if ( !isDefined( level.zombie_tracking_high ) )
{
if ( !isdefined( level.zombie_tracking_high ) )
level.zombie_tracking_high = 500;
}
if ( !isDefined( level.zombie_tracking_wait ) )
{
if ( !isdefined( level.zombie_tracking_wait ) )
level.zombie_tracking_wait = 10;
}
building_trigs = getentarray( "zombie_fell_off", "targetname" );
if ( isDefined( building_trigs ) )
{
if ( isdefined( building_trigs ) )
array_thread( building_trigs, ::zombies_off_building );
}
level.distance_tracker_aggressive_distance = 500;
level.distance_tracker_aggressive_height = 200;
for ( ;; )
{
while ( 1 )
while ( true )
{
zombies = get_round_enemy_array();
if ( !isDefined( zombies ) || isDefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
if ( !isdefined( zombies ) || isdefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
{
wait level.zombie_tracking_wait;
wait( level.zombie_tracking_wait );
continue;
}
}
else i = 0;
while ( i < zombies.size )
else
{
if ( isDefined( zombies[ i ] ) && isDefined( zombies[ i ].ignore_distance_tracking ) && !zombies[ i ].ignore_distance_tracking )
for ( i = 0; i < zombies.size; i++ )
{
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, level.zombie_tracking_high );
}
i++;
}
wait level.zombie_tracking_wait;
wait( level.zombie_tracking_wait );
}
}
delete_zombie_noone_looking( how_close, how_high )
{
self endon( "death" );
if ( !isDefined( how_close ) )
{
if ( !isdefined( how_close ) )
how_close = 1000;
}
if ( !isDefined( how_high ) )
{
if ( !isdefined( how_high ) )
how_high = 500;
}
distance_squared_check = how_close * how_close;
height_squared_check = how_high * how_high;
too_far_dist = distance_squared_check * 3;
if ( isDefined( level.zombie_tracking_too_far_dist ) )
{
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 )
for ( i = 0; i < players.size; i++ )
{
if ( players[i].sessionstate == "spectator" )
continue;
if ( isdefined( level.only_track_targeted_players ) )
{
i++;
if ( !isdefined( self.favoriteenemy ) || self.favoriteenemy != players[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 && abs( self.origin[2] - players[i].origin[2] ) < how_high )
{
self.player_close++;
}
}
i++;
}
wait 0,1;
wait 0.1;
if ( self.inview == 0 && self.player_close == 0 )
{
if ( !isDefined( self.animname ) || isDefined( self.animname ) && self.animname != "zombie" )
{
if ( !isdefined( self.animname ) || isdefined( self.animname ) && self.animname != "zombie" )
return;
}
if ( isDefined( self.electrified ) && self.electrified == 1 )
{
if ( isdefined( self.electrified ) && self.electrified == 1 )
return;
}
zombies = getaiarray( "axis" );
if ( ( zombies.size + level.zombie_total ) > 24 || ( zombies.size + level.zombie_total ) <= 24 && self.health >= self.maxhealth )
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 )
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 maps\mp\zombies\_zm_spawner::reset_attack_spot();
self notify( "zombie_delete" );
self delete();
recalc_zombie_array();
@ -133,32 +123,28 @@ delete_zombie_noone_looking( how_close, how_high )
player_can_see_me( player )
{
playerangles = player getplayerangles();
playerforwardvec = anglesToForward( playerangles );
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" );
playerfov = getdvarfloat( "cg_fov" );
banzaivsplayerfovbuffer = getdvarfloat( _hash_BCB625CF );
if ( banzaivsplayerfovbuffer <= 0 )
{
banzaivsplayerfovbuffer = 0,2;
}
playercanseeme = anglefromcenter <= ( ( playerfov * 0,5 ) * ( 1 - banzaivsplayerfovbuffer ) );
banzaivsplayerfovbuffer = 0.2;
playercanseeme = anglefromcenter <= playerfov * 0.5 * ( 1 - banzaivsplayerfovbuffer );
return playercanseeme;
}
@ -166,40 +152,42 @@ escaped_zombies_cleanup_init()
{
self endon( "death" );
self.zombie_path_bad = 0;
while ( 1 )
while ( true )
{
if ( !self.zombie_path_bad )
{
self waittill( "bad_path" );
}
found_player = undefined;
players = get_players();
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
if ( self maymovetopoint( players[i].origin, 1 ) )
{
self.favoriteenemy = players[i];
found_player = 1;
i++;
continue;
}
i++;
}
n_delete_distance = 800;
n_delete_height = 300;
if ( is_player_in_inverted_elevator_shaft() )
{
n_delete_distance = level.distance_tracker_aggressive_distance;
n_delete_height = level.distance_tracker_aggressive_height;
}
if ( !isDefined( found_player ) && isDefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area )
if ( !isdefined( found_player ) && ( isdefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area ) )
{
self thread delete_zombie_noone_looking( n_delete_distance, n_delete_height );
self.zombie_path_bad = 1;
self escaped_zombies_cleanup();
}
wait 0,1;
wait 0.1;
}
}
@ -207,30 +195,26 @@ is_player_in_inverted_elevator_shaft()
{
b_player_is_in_elevator_shaft = 0;
a_occupied_zones = get_occupied_zones();
i = 0;
while ( i < a_occupied_zones.size )
for ( i = 0; i < a_occupied_zones.size; i++ )
{
if ( issubstr( a_occupied_zones[i], "orange_elevator_shaft" ) )
{
b_player_is_in_elevator_shaft = 1;
}
i++;
}
return b_player_is_in_elevator_shaft;
}
get_occupied_zones()
{
a_occupied_zones = [];
i = 0;
while ( i < level.active_zone_names.size )
for ( i = 0; i < level.active_zone_names.size; i++ )
{
if ( level.zones[level.active_zone_names[i]].is_occupied )
{
a_occupied_zones[a_occupied_zones.size] = level.active_zone_names[i];
}
i++;
}
return a_occupied_zones;
}
@ -238,12 +222,14 @@ get_escape_position()
{
self endon( "death" );
str_zone = get_current_zone();
if ( isDefined( str_zone ) )
if ( isdefined( str_zone ) )
{
a_zones = get_adjacencies_to_zone( str_zone );
a_dog_locations = get_dog_locations_in_zones( a_zones );
s_farthest = self get_farthest_dog_location( a_dog_locations );
}
return s_farthest;
}
@ -251,22 +237,16 @@ get_current_zone()
{
str_zone = undefined;
a_zones = getarraykeys( level.zones );
_a310 = a_zones;
_k310 = getFirstArrayKey( _a310 );
while ( isDefined( _k310 ) )
foreach ( zone in a_zones )
{
zone = _a310[ _k310 ];
i = 0;
while ( i < level.zones[ zone ].volumes.size )
for ( i = 0; i < level.zones[zone].volumes.size; i++ )
{
if ( self istouching( level.zones[zone].volumes[i] ) )
{
str_zone = zone;
}
i++;
}
_k310 = getNextArrayKey( _a310, _k310 );
}
return str_zone;
}
@ -275,29 +255,23 @@ get_adjacencies_to_zone( str_zone )
a_adjacencies = [];
a_adjacencies[0] = str_zone;
a_adjacent_zones = getarraykeys( level.zones[str_zone].adjacent_zones );
i = 0;
while ( i < a_adjacent_zones.size )
for ( i = 0; i < a_adjacent_zones.size; i++ )
{
if ( level.zones[str_zone].adjacent_zones[a_adjacent_zones[i]].is_connected )
{
a_adjacencies[a_adjacencies.size] = a_adjacent_zones[i];
}
i++;
}
return a_adjacencies;
}
get_dog_locations_in_zones( a_zones )
{
a_dog_locations = [];
_a345 = a_zones;
_k345 = getFirstArrayKey( _a345 );
while ( isDefined( _k345 ) )
{
zone = _a345[ _k345 ];
foreach ( zone in a_zones )
a_dog_locations = arraycombine( a_dog_locations, level.zones[zone].dog_locations, 0, 0 );
_k345 = getNextArrayKey( _a345, _k345 );
}
return a_dog_locations;
}
@ -305,17 +279,18 @@ get_farthest_dog_location( a_dog_locations )
{
n_farthest_index = 0;
n_distance_farthest = 0;
i = 0;
while ( i < a_dog_locations.size )
for ( i = 0; i < a_dog_locations.size; i++ )
{
n_distance_sq = distancesquared( self.origin, a_dog_locations[i].origin );
if ( n_distance_sq > n_distance_farthest )
{
n_distance_farthest = n_distance_sq;
n_farthest_index = i;
}
i++;
}
return a_dog_locations[n_farthest_index];
}
@ -325,18 +300,19 @@ escaped_zombies_cleanup()
s_escape = self get_escape_position();
self notify( "stop_find_flesh" );
self notify( "zombie_acquire_enemy" );
if ( isDefined( s_escape ) )
if ( isdefined( s_escape ) )
{
self setgoalpos( s_escape.origin );
self thread check_player_available();
self waittill_any( "goal", "reaquire_player" );
}
self.zombie_path_bad = !can_zombie_path_to_any_player();
wait 0,1;
wait 0.1;
if ( !self.zombie_path_bad )
{
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
}
self thread maps\mp\zombies\_zm_ai_basic::find_flesh();
}
check_player_available()
@ -346,70 +322,69 @@ check_player_available()
self endon( "death" );
self endon( "goal" );
self endon( "reaquire_player" );
while ( self.zombie_path_bad )
{
if ( self can_zombie_see_any_player() )
{
self notify( "reaquire_player" );
}
wait randomfloatrange( 0,2, 0,5 );
wait( randomfloatrange( 0.2, 0.5 ) );
}
}
can_zombie_path_to_any_player()
{
a_players = get_players();
i = 0;
while ( i < a_players.size )
for ( i = 0; i < a_players.size; i++ )
{
if ( findpath( self.origin, a_players[i].origin ) )
{
return 1;
return true;
}
i++;
}
return 0;
return false;
}
can_zombie_see_any_player()
{
a_players = get_players();
i = 0;
while ( i < a_players.size )
for ( i = 0; i < a_players.size; i++ )
{
if ( self maymovetopoint( a_players[i].origin, 1 ) )
{
return 1;
return true;
}
i++;
}
return 0;
return false;
}
zombies_off_building()
{
while ( 1 )
while ( true )
{
self waittill( "trigger", who );
if ( !isplayer( who ) && isDefined( who.is_leaper ) && !who.is_leaper )
if ( !isplayer( who ) && !( isdefined( who.is_leaper ) && who.is_leaper ) )
{
zombies = getaiarray( "axis" );
if ( ( zombies.size + level.zombie_total ) > 24 || ( zombies.size + level.zombie_total ) <= 24 && who.health >= who.maxhealth )
if ( zombies.size + level.zombie_total > 24 || zombies.size + level.zombie_total <= 24 && who.health >= who.maxhealth )
{
if ( isDefined( who.exclude_distance_cleanup_adding_to_total ) && !who.exclude_distance_cleanup_adding_to_total && isDefined( who.is_leaper ) && !who.is_leaper )
if ( !( isdefined( who.exclude_distance_cleanup_adding_to_total ) && who.exclude_distance_cleanup_adding_to_total ) && !( isdefined( who.is_leaper ) && who.is_leaper ) )
{
level.zombie_total++;
if ( who.health < level.zombie_health )
{
level.zombie_respawned_health[level.zombie_respawned_health.size] = who.health;
}
}
}
who maps/mp/zombies/_zm_spawner::reset_attack_spot();
who maps\mp\zombies\_zm_spawner::reset_attack_spot();
who notify( "zombie_delete" );
who dodamage( who.health + 666, who.origin, who );
recalc_zombie_array();
}
wait 0,1;
wait 0.1;
}
}

View File

@ -1,35 +1,37 @@
//checked includes match cerberus output
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_weapons;
main_start() //checked matches cerberus output
main_start()
{
level thread spawned_collision_ffotd();
level thread eject_player_trigger_init();
level thread change_bad_spawner();
}
main_end() //checked matches cerberus output
main_end()
{
level thread eject_player_trigger();
}
spawned_collision_ffotd() //checked changed to match cerberus output
spawned_collision_ffotd()
{
precachemodel( "collision_wall_32x32x10_standard" );
flag_wait( "start_zombie_round_logic" );
if ( !is_true( level.optimise_for_splitscreen ) )
{
collision1 = spawn( "script_model", ( 2044, 499, 2893 ) );
collision1 setmodel( "collision_wall_32x32x10_standard" );
collision1.angles = vectorScale( ( 0, 1, 0 ), 330 );
collision1.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision1 ghost();
collision2 = spawn( "script_model", ( 2044, 499, 2925 ) );
collision2 setmodel( "collision_wall_32x32x10_standard" );
collision2.angles = vectorScale( ( 0, 1, 0 ), 330 );
collision2.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision2 ghost();
collision3 = spawn( "script_model", ( 1768, 1507, 3075 ) );
collision3 setmodel( "collision_wall_256x256x10_standard" );
@ -45,11 +47,11 @@ spawned_collision_ffotd() //checked changed to match cerberus output
collision3 ghost();
collision4 = spawn( "script_model", ( 2257, 2374, 3101 ) );
collision4 setmodel( "collision_wall_256x256x10_standard" );
collision4.angles = vectorScale( ( 0, 1, 0 ), 270 );
collision4.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collision4 ghost();
collision5 = spawn( "script_model", ( 3076, 1598, 2791 ) );
collision5 setmodel( "collision_wall_256x256x10_standard" );
collision5.angles = vectorScale( ( 1, 0, 0 ), 347.6 );
collision5.angles = vectorscale( ( 1, 0, 0 ), 347.6 );
collision5 ghost();
collision6b = spawn( "script_model", ( 3693, 1840, 1897 ) );
collision6b setmodel( "collision_wall_256x256x10_standard" );
@ -70,7 +72,7 @@ spawned_collision_ffotd() //checked changed to match cerberus output
}
}
eject_player_trigger_init() //checked matches cerberus output
eject_player_trigger_init()
{
trig1 = spawn( "trigger_box", ( 3172, 1679, 1296.09 ), 0, 64, 10, 64 );
trig1.angles = ( 0, 0, 0 );
@ -86,26 +88,29 @@ eject_player_trigger_init() //checked matches cerberus output
trig3.point = spawn( "script_origin", ( 3590.2, 2068, 2720.34 ) );
}
eject_player_trigger() //checked matches cerberus output
eject_player_trigger()
{
trigs = getentarray( "eject_player_pos", "targetname" );
array_thread( trigs, ::player_eject_watcher );
}
player_eject_watcher() //checked matches cerberus output
player_eject_watcher()
{
time = 0;
while ( 1 )
while ( true )
{
self waittill( "trigger", who );
if ( is_player_valid( who ) )
{
while ( who istouching( self ) )
{
time++;
if ( time >= 6 )
{
if ( isDefined( self.point ) )
if ( isdefined( self.point ) )
{
if ( !positionwouldtelefrag( self.point.origin ) )
{
@ -117,54 +122,64 @@ player_eject_watcher() //checked matches cerberus output
}
}
}
wait 1;
wait 1.0;
}
time = 0;
}
wait 0.1;
}
}
ejected_overrun( trig ) //checked changed to match cerberus output
{
if ( !isDefined( trig.ejected ) )
ejected_overrun( trig )
{
if ( !isdefined( trig.ejected ) )
trig.ejected = 1;
}
else
{
trig.ejected++;
if ( trig.ejected >= 3 )
{
primaries = self getweaponslistprimaries();
foreach ( weapon in primaries )
{
self takeweapon( weapon );
}
lethal = self get_player_lethal_grenade();
if ( isDefined( lethal ) && lethal != "" )
if ( isdefined( lethal ) && lethal != "" )
{
self takeweapon( lethal );
maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( lethal );
maps\mp\zombies\_zm_weapons::unacquire_weapon_toggle( lethal );
}
tactical = self get_player_tactical_grenade();
if ( isDefined( tactical ) && tactical != "" )
if ( isdefined( tactical ) && tactical != "" )
{
self takeweapon( tactical );
maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( tactical );
maps\mp\zombies\_zm_weapons::unacquire_weapon_toggle( tactical );
}
mine = self get_player_placeable_mine();
if ( isDefined( mine ) )
if ( isdefined( mine ) )
{
self takeweapon( mine );
maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( mine );
maps\mp\zombies\_zm_weapons::unacquire_weapon_toggle( mine );
}
melee_weapon = self get_player_melee_weapon();
if ( isDefined( melee_weapon ) )
if ( isdefined( melee_weapon ) )
{
self takeweapon( melee_weapon );
maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( melee_weapon );
maps\mp\zombies\_zm_weapons::unacquire_weapon_toggle( melee_weapon );
}
self giveweapon( "knife_zm" );
self.current_melee_weapon = "knife_zm";
self give_start_weapon( 1 );
@ -173,17 +188,17 @@ ejected_overrun( trig ) //checked changed to match cerberus output
}
}
change_bad_spawner() //checked changed to match cerberus output
change_bad_spawner()
{
flag_wait( "always_on" );
spawner_array = getstructarray( "zone_blue_level4a_spawners", "targetname" );
foreach ( struct in spawner_array )
{
if ( isDefined( struct.origin ) && struct.origin == ( 2154, 748.5, 1312 ) )
if ( isdefined( struct.origin ) && struct.origin == ( 2154, 748.5, 1312 ) )
{
struct.script_noteworthy = "riser_location";
return;
}
}
}

View File

@ -1,13 +1,14 @@
#include maps/mp/_utility;
#using_animtree( "fxanim_props" );
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include maps\mp\createfx\zm_highrise_fx;
main()
{
precache_createfx_fx();
precache_scripted_fx();
precache_fxanim_props();
maps/mp/createfx/zm_highrise_fx::main();
maps\mp\createfx\zm_highrise_fx::main();
}
precache_scripted_fx()
@ -102,6 +103,8 @@ precache_createfx_fx()
level._effect["fx_highrise_sidequest_complete_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete_ric" );
}
#using_animtree("fxanim_props");
precache_fxanim_props()
{
level.scr_anim["fxanim_props"]["wirespark_med_lrg"] = %fxanim_gp_wirespark_med_lrg_anim;

View File

@ -1,14 +1,15 @@
//checked includes match cerberus output
#include maps/mp/zm_highrise_classic;
#include maps/mp/zm_highrise;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zm_highrise;
#include maps\mp\zm_highrise_classic;
init() //checked matches cerberus output
init()
{
add_map_gamemode( "zclassic", maps/mp/zm_highrise::zclassic_preinit, undefined, undefined );
add_map_location_gamemode( "zclassic", "rooftop", maps/mp/zm_highrise_classic::precache, maps/mp/zm_highrise_classic::main );
add_map_gamemode( "zclassic", maps\mp\zm_highrise::zclassic_preinit, undefined, undefined );
add_map_location_gamemode( "zclassic", "rooftop", maps\mp\zm_highrise_classic::precache, maps\mp\zm_highrise_classic::main );
}

View File

@ -1,8 +1,10 @@
#include maps/mp/zm_highrise_sq;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
init()
{
@ -35,40 +37,39 @@ stage_logic()
exit_stage_1( success )
{
}
sq_atd_dragon_icon_setup()
{
a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" );
_a51 = a_dragon_icons;
_k51 = getFirstArrayKey( _a51 );
while ( isDefined( _k51 ) )
foreach ( m_icon in a_dragon_icons )
{
m_icon = _a51[ _k51 ];
m_icon notsolid();
m_icon.m_elevator = getent( "elevator_" + m_icon.script_noteworthy + "_body", "targetname" );
m_icon.origin = m_icon.m_elevator.origin + vectorScale( ( 0, 0, 1 ), 134 );
m_icon.origin = m_icon.m_elevator.origin + vectorscale( ( 0, 0, 1 ), 134.0 );
m_icon.angles = m_icon.m_elevator.angles;
m_icon linkto( m_icon.m_elevator );
m_icon.m_lit_icon = getent( m_icon.script_noteworthy + "_elevator_lit", "script_noteworthy" );
if ( isDefined( m_icon.m_lit_icon ) )
if ( isdefined( m_icon.m_lit_icon ) )
{
m_icon.m_lit_icon notsolid();
m_icon.m_lit_icon.origin = m_icon.origin - vectorScale( ( 0, 0, 1 ), 2 );
m_icon.m_lit_icon.origin = m_icon.origin - vectorscale( ( 0, 0, 1 ), 2.0 );
m_icon.m_lit_icon.angles = m_icon.angles;
m_icon.m_lit_icon linkto( m_icon.m_elevator );
}
_k51 = getNextArrayKey( _a51, _k51 );
}
a_atd2_icons = getentarray( "atd2_marker_unlit", "script_noteworthy" );
a_atd2_lit_icons = getentarray( "atd2_marker_lit", "targetname" );
i = 0;
while ( i < a_atd2_icons.size )
for ( i = 0; i < a_atd2_icons.size; i++ )
{
a_atd2_lit_icons[ i ].origin = a_atd2_icons[ i ].origin - vectorScale( ( 0, 0, 1 ), 5 );
a_atd2_lit_icons[i].origin = a_atd2_icons[i].origin - vectorscale( ( 0, 0, 1 ), 5.0 );
a_atd2_lit_icons[i].angles = a_atd2_icons[i].angles;
a_atd2_icons[i].lit_icon = a_atd2_lit_icons[i];
i++;
}
}
@ -76,27 +77,25 @@ sq_atd_elevators()
{
a_elevators = array( "elevator_bldg1b_trigger", "elevator_bldg1d_trigger", "elevator_bldg3b_trigger", "elevator_bldg3c_trigger" );
a_elevator_flags = array( "sq_atd_elevator0", "sq_atd_elevator1", "sq_atd_elevator2", "sq_atd_elevator3" );
i = 0;
while ( i < a_elevators.size )
for ( i = 0; i < a_elevators.size; i++ )
{
trig_elevator = getent( a_elevators[i], "targetname" );
trig_elevator thread sq_atd_watch_elevator( a_elevator_flags[i] );
i++;
}
while ( flag( "sq_atd_elevator0" ) && flag( "sq_atd_elevator1" ) || !flag( "sq_atd_elevator2" ) && !flag( "sq_atd_elevator3" ) )
while ( !flag( "sq_atd_elevator0" ) || !flag( "sq_atd_elevator1" ) || !flag( "sq_atd_elevator2" ) || !flag( "sq_atd_elevator3" ) )
{
flag_wait_any_array( a_elevator_flags );
wait 0,5;
wait 0.5;
}
/#
iprintlnbold( "Standing on Elevators Complete" );
#/
a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" );
_a105 = a_dragon_icons;
_k105 = getFirstArrayKey( _a105 );
while ( isDefined( _k105 ) )
foreach ( m_icon in a_dragon_icons )
{
m_icon = _a105[ _k105 ];
v_off_pos = m_icon.m_lit_icon.origin;
m_icon.m_lit_icon unlink();
m_icon unlink();
@ -105,8 +104,8 @@ sq_atd_elevators()
m_icon.m_lit_icon linkto( m_icon.m_elevator );
m_icon linkto( m_icon.m_elevator );
m_icon playsound( "zmb_sq_symbol_light" );
_k105 = getNextArrayKey( _a105, _k105 );
}
flag_set( "sq_atd_elevator_activated" );
vo_richtofen_atd_elevators();
level thread vo_maxis_atd_elevators();
@ -115,18 +114,22 @@ sq_atd_elevators()
sq_atd_watch_elevator( str_flag )
{
level endon( "sq_atd_elevator_activated" );
while ( 1 )
while ( true )
{
self waittill( "trigger", e_who );
while ( !isplayer( e_who ) )
if ( !isplayer( e_who ) )
{
wait 0,05;
wait 0.05;
continue;
}
flag_set( str_flag );
while ( isalive( e_who ) && e_who istouching( self ) )
{
wait 0,05;
}
wait 0.05;
flag_clear( str_flag );
}
}
@ -136,16 +139,13 @@ sq_atd_drg_puzzle()
level.sq_atd_cur_drg = 0;
a_puzzle_trigs = getentarray( "trig_atd_drg_puzzle", "targetname" );
a_puzzle_trigs = array_randomize( a_puzzle_trigs );
i = 0;
while ( i < a_puzzle_trigs.size )
{
for ( i = 0; i < a_puzzle_trigs.size; i++ )
a_puzzle_trigs[i] thread drg_puzzle_trig_think( i );
i++;
}
while ( level.sq_atd_cur_drg < 4 )
{
wait 1;
}
flag_set( "sq_atd_drg_puzzle_complete" );
level thread vo_maxis_atd_order_complete();
/#
@ -160,17 +160,19 @@ drg_puzzle_trig_think( n_order_id )
m_lit = m_unlit.lit_icon;
v_top = m_unlit.origin;
v_hidden = m_lit.origin;
while ( !flag( "sq_atd_drg_puzzle_complete" ) )
{
while ( self.drg_active )
if ( self.drg_active )
{
level waittill_either( "sq_atd_drg_puzzle_complete", "drg_puzzle_reset" );
while ( flag( "sq_atd_drg_puzzle_complete" ) )
{
if ( flag( "sq_atd_drg_puzzle_complete" ) )
continue;
}
}
self waittill( "trigger", e_who );
if ( level.sq_atd_cur_drg == n_order_id )
{
m_lit.origin = v_top;
@ -187,27 +189,27 @@ drg_puzzle_trig_think( n_order_id )
else
{
if ( !flag( "sq_atd_drg_puzzle_1st_error" ) )
{
level thread vo_maxis_atd_order_error();
}
level.sq_atd_cur_drg = 0;
level notify( "drg_puzzle_reset" );
/#
iprintlnbold( "INCORRECT DRAGON" );
#/
wait 0,5;
wait 0.5;
}
while ( e_who istouching( self ) )
{
wait 0,5;
}
wait 0.5;
}
}
drg_puzzle_trig_watch_fade( m_lit, m_unlit, v_top, v_hidden )
{
level endon( "sq_atd_drg_puzzle_complete" );
level waittill( "drg_puzzle_reset" );
m_unlit.origin = v_top;
m_lit.origin = v_hidden;
m_unlit playsound( "zmb_sq_symbol_fade" );
@ -216,32 +218,32 @@ drg_puzzle_trig_watch_fade( m_lit, m_unlit, v_top, v_hidden )
vo_richtofen_atd_elevators()
{
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_activ_dragons_0" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_activ_dragons_0" );
}
vo_maxis_atd_elevators()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_activ_dragons_0" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_activ_dragons_0" );
}
vo_richtofen_atd_order( n_which )
{
str_vox = "vox_zmba_sidequest_sec_symbols_" + n_which;
maps/mp/zm_highrise_sq::richtofensay( str_vox );
maps\mp\zm_highrise_sq::richtofensay( str_vox );
}
vo_richtofen_atd_order_error()
{
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sec_symbols_5" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sec_symbols_5" );
}
vo_maxis_atd_order_error()
{
flag_set( "sq_atd_drg_puzzle_1st_error" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_sec_symbols_0" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_sec_symbols_0" );
}
vo_maxis_atd_order_complete()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_sec_symbols_1" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_sec_symbols_1" );
}

View File

@ -1,11 +1,11 @@
#include maps/mp/zombies/_zm_unitrigger;
#include maps/mp/zm_highrise_sq;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
#using_animtree( "fxanim_props" );
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
#include maps\mp\zombies\_zm_unitrigger;
init_1()
{
@ -45,9 +45,9 @@ stage_logic_1()
#/
watch_player_springpads( 0 );
wait_for_all_springpads_placed( "pts_ghoul", "pts_1_springpads_placed" );
maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 1 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "r", 1 );
wait_for_zombies_launched();
maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 2 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "r", 2 );
stage_completed( "sq_1", "pts_1" );
}
@ -56,10 +56,9 @@ wait_for_zombies_launched()
level thread richtofen_zombies_launched();
t_tower = getent( "pts_tower_trig", "targetname" );
s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" );
while ( level.n_launched_zombies < 16 )
{
wait 0,5;
}
wait 0.5;
}
watch_zombie_flings()
@ -68,15 +67,17 @@ watch_zombie_flings()
self endon( "disconnect" );
self endon( "equip_springpad_zm_taken" );
self endon( "equip_springpad_zm_pickup" );
while ( level.n_launched_zombies < 16 )
{
self waittill( "fling" );
level.n_launched_zombies++;
if ( level.n_launched_zombies != 1 || level.n_launched_zombies == 5 && level.n_launched_zombies == 10 )
{
if ( level.n_launched_zombies == 1 || level.n_launched_zombies == 5 || level.n_launched_zombies == 10 )
level notify( "pts1_say_next_line" );
}
wait 0,1;
wait 0.1;
}
}
@ -88,9 +89,9 @@ stage_logic_2()
watch_player_springpads( 1 );
level thread wait_for_balls_launched();
flag_wait( "pts_2_generator_1_started" );
maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 2 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "m", 2 );
flag_wait( "pts_2_generator_2_started" );
maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 2 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "m", 2 );
level thread maxis_balls_placed();
stage_completed( "sq_2", "pts_2" );
}
@ -99,31 +100,27 @@ wait_for_balls_launched()
{
level.current_generator = 1;
a_lion_spots = getstructarray( "pts_lion", "targetname" );
_a138 = a_lion_spots;
_k138 = getFirstArrayKey( _a138 );
while ( isDefined( _k138 ) )
foreach ( s_lion_spot in a_lion_spots )
{
s_lion_spot = _a138[ _k138 ];
s_lion_spot.a_place_ball_trigs = [];
s_lion_spot.springpad_buddy = getstruct( s_lion_spot.script_string, "script_noteworthy" );
_k138 = getNextArrayKey( _a138, _k138 );
}
a_players = getplayers();
_a145 = a_players;
_k145 = getFirstArrayKey( _a145 );
while ( isDefined( _k145 ) )
foreach ( player in a_players )
{
player = _a145[ _k145 ];
player.a_place_ball_trigs = [];
if ( isDefined( player.zm_sq_has_ball ) )
{
if ( isdefined( player.zm_sq_has_ball ) )
player thread player_has_ball();
}
_k145 = getNextArrayKey( _a145, _k145 );
}
while ( 1 )
while ( true )
{
level waittill( "zm_ball_picked_up", player );
player thread player_has_ball();
}
}
@ -153,7 +150,9 @@ sq_pts_create_use_trigger( v_origin, radius, height, str_hint_string )
place_ball_think( t_place_ball, s_lion_spot )
{
t_place_ball endon( "delete" );
t_place_ball waittill( "trigger" );
pts_putdown_trigs_remove_for_spot( s_lion_spot );
pts_putdown_trigs_remove_for_spot( s_lion_spot.springpad_buddy );
self.zm_sq_has_ball = undefined;
@ -173,68 +172,64 @@ place_ball_think( t_place_ball, s_lion_spot )
delete_all_springpads()
{
}
exit_stage_1( success )
{
}
exit_stage_2( success )
{
}
watch_player_springpads( is_generator )
{
level thread springpad_count_watcher( is_generator );
a_players = get_players();
_a240 = a_players;
_k240 = getFirstArrayKey( _a240 );
while ( isDefined( _k240 ) )
{
player = _a240[ _k240 ];
foreach ( player in a_players )
player thread pts_watch_springpad_use( is_generator );
_k240 = getNextArrayKey( _a240, _k240 );
}
}
pts_watch_springpad_use( is_generator )
{
self endon( "death" );
self endon( "disconnect" );
while ( !flag( "sq_branch_complete" ) )
{
self waittill( "equipment_placed", weapon, weapname );
if ( weapname == level.springpad_name )
{
self is_springpad_in_place( weapon, is_generator );
}
}
}
springpad_count_watcher( is_generator )
{
level endon( "sq_pts_springad_count4" );
str_which_spots = "pts_ghoul";
if ( is_generator )
{
str_which_spots = "pts_lion";
}
a_spots = getstructarray( str_which_spots, "targetname" );
while ( 1 )
while ( true )
{
level waittill( "sq_pts_springpad_in_place" );
n_count = 0;
_a279 = a_spots;
_k279 = getFirstArrayKey( _a279 );
while ( isDefined( _k279 ) )
{
s_spot = _a279[ _k279 ];
if ( isDefined( s_spot.springpad ) )
foreach ( s_spot in a_spots )
{
if ( isdefined( s_spot.springpad ) )
n_count++;
}
_k279 = getNextArrayKey( _a279, _k279 );
}
level notify( "sq_pts_springad_count" + n_count );
}
}
@ -244,21 +239,20 @@ is_springpad_in_place( m_springpad, is_generator )
a_lion_spots = getstructarray( "pts_lion", "targetname" );
a_ghoul_spots = getstructarray( "pts_ghoul", "targetname" );
a_spots = arraycombine( a_lion_spots, a_ghoul_spots, 0, 0 );
_a298 = a_spots;
_k298 = getFirstArrayKey( _a298 );
while ( isDefined( _k298 ) )
foreach ( s_spot in a_spots )
{
s_spot = _a298[ _k298 ];
n_dist = distance2dsquared( m_springpad.origin, s_spot.origin );
if ( n_dist < 1024 )
{
v_spot_forward = vectornormalize( anglesToForward( s_spot.angles ) );
v_pad_forward = vectornormalize( anglesToForward( m_springpad.angles ) );
v_spot_forward = vectornormalize( anglestoforward( s_spot.angles ) );
v_pad_forward = vectornormalize( anglestoforward( m_springpad.angles ) );
n_dot = vectordot( v_spot_forward, v_pad_forward );
/#
iprintlnbold( "Trample Steam OFF: Dist(" + sqrt( n_dist ) + ") Dot(" + n_dot + ")" );
#/
if ( n_dot > 0,98 )
if ( n_dot > 0.98 )
{
/#
iprintlnbold( "Trample Steam IN PLACE: Dist(" + sqrt( n_dist ) + ") Dot(" + n_dot + ")" );
@ -266,32 +260,31 @@ is_springpad_in_place( m_springpad, is_generator )
level notify( "sq_pts_springpad_in_place" );
s_spot.springpad = m_springpad;
self thread pts_springpad_removed_watcher( m_springpad, s_spot );
if ( is_generator )
{
wait 0,1;
wait 0.1;
level thread pts_should_springpad_create_trigs( s_spot );
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub );
thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub );
}
else
{
m_springpad.fling_scaler = 2;
m_springpad thread watch_zombie_flings();
}
if ( isDefined( s_spot.script_float ) )
if ( isdefined( s_spot.script_float ) )
{
s_target = getstruct( "sq_zombie_launch_target", "targetname" );
v_override_dir = vectornormalize( s_target.origin - m_springpad.origin );
v_override_dir = vectorScale( v_override_dir, 1024 );
v_override_dir = vectorscale( v_override_dir, 1024 );
m_springpad.direction_vec_override = v_override_dir;
m_springpad.fling_scaler = s_spot.script_float;
}
return;
break;
}
}
else
{
_k298 = getNextArrayKey( _a298, _k298 );
}
}
}
@ -301,6 +294,7 @@ pts_springpad_fling( str_spot_name, m_buddy_springpad )
n_anim_length1 = undefined;
str_anim2 = undefined;
n_anim_length2 = undefined;
switch ( str_spot_name )
{
case "lion_pair_1":
@ -320,6 +314,7 @@ pts_springpad_fling( str_spot_name, m_buddy_springpad )
str_anim2 = "ab";
break;
}
m_anim = spawn( "script_model", ( 2090, 675, 3542 ) );
m_anim.angles = ( 0, 0, 0 );
m_anim setmodel( "fxanim_zom_highrise_trample_gen_mod" );
@ -335,20 +330,21 @@ pts_springpad_anim_ball( m_buddy_springpad, m_anim, str_anim1, str_anim2 )
m_buddy_springpad endon( "delete" );
n_anim_length1 = getanimlength( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim1] );
n_anim_length2 = getanimlength( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim2] );
while ( isDefined( m_anim ) )
{
self notify( "fling" );
if ( isDefined( m_anim ) )
while ( isdefined( m_anim ) )
{
self notify( "fling", 1 );
if ( isdefined( m_anim ) )
m_anim setanim( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim1] );
}
wait n_anim_length1;
m_buddy_springpad notify( "fling" );
if ( isDefined( m_anim ) )
{
wait( n_anim_length1 );
m_buddy_springpad notify( "fling", 1 );
if ( isdefined( m_anim ) )
m_anim setanim( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim2] );
}
wait n_anim_length2;
wait( n_anim_length2 );
}
}
@ -368,24 +364,20 @@ pts_springpad_waittill_removed( m_springpad )
wait_for_all_springpads_placed( str_type, str_flag )
{
a_spots = getstructarray( str_type, "targetname" );
while ( !flag( str_flag ) )
{
is_clear = 0;
_a442 = a_spots;
_k442 = getFirstArrayKey( _a442 );
while ( isDefined( _k442 ) )
{
s_spot = _a442[ _k442 ];
if ( !isDefined( s_spot.springpad ) )
foreach ( s_spot in a_spots )
{
if ( !isdefined( s_spot.springpad ) )
is_clear = 1;
}
_k442 = getNextArrayKey( _a442, _k442 );
}
if ( !is_clear )
{
flag_set( str_flag );
}
wait 1;
}
}
@ -393,53 +385,44 @@ wait_for_all_springpads_placed( str_type, str_flag )
pts_should_player_create_trigs( player )
{
a_lion_spots = getstructarray( "pts_lion", "targetname" );
_a467 = a_lion_spots;
_k467 = getFirstArrayKey( _a467 );
while ( isDefined( _k467 ) )
{
s_lion_spot = _a467[ _k467 ];
if ( isDefined( s_lion_spot.springpad ) && isDefined( s_lion_spot.springpad_buddy.springpad ) )
foreach ( s_lion_spot in a_lion_spots )
{
if ( isdefined( s_lion_spot.springpad ) && isdefined( s_lion_spot.springpad_buddy.springpad ) )
pts_putdown_trigs_create_for_spot( s_lion_spot, player );
}
_k467 = getNextArrayKey( _a467, _k467 );
}
}
pts_should_springpad_create_trigs( s_lion_spot )
{
while ( isDefined( s_lion_spot.springpad ) && isDefined( s_lion_spot.springpad_buddy.springpad ) )
if ( isdefined( s_lion_spot.springpad ) && isdefined( s_lion_spot.springpad_buddy.springpad ) )
{
a_players = getplayers();
_a481 = a_players;
_k481 = getFirstArrayKey( _a481 );
while ( isDefined( _k481 ) )
foreach ( player in a_players )
{
player = _a481[ _k481 ];
if ( isDefined( player.zm_sq_has_ball ) && player.zm_sq_has_ball )
if ( isdefined( player.zm_sq_has_ball ) && player.zm_sq_has_ball )
{
pts_putdown_trigs_create_for_spot( s_lion_spot, player );
pts_putdown_trigs_create_for_spot( s_lion_spot.springpad_buddy, player );
}
_k481 = getNextArrayKey( _a481, _k481 );
}
}
}
pts_putdown_trigs_create_for_spot( s_lion_spot, player )
{
if ( isDefined( s_lion_spot.which_ball ) || isDefined( s_lion_spot.springpad_buddy ) && isDefined( s_lion_spot.springpad_buddy.which_ball ) )
{
if ( isdefined( s_lion_spot.which_ball ) || isdefined( s_lion_spot.springpad_buddy ) && isdefined( s_lion_spot.springpad_buddy.which_ball ) )
return;
}
t_place_ball = sq_pts_create_use_trigger( s_lion_spot.origin, 16, 70, &"ZM_HIGHRISE_SQ_PUTDOWN_BALL" );
player clientclaimtrigger( t_place_ball );
t_place_ball.owner = player;
player thread place_ball_think( t_place_ball, s_lion_spot );
if ( !isDefined( s_lion_spot.pts_putdown_trigs ) )
{
if ( !isdefined( s_lion_spot.pts_putdown_trigs ) )
s_lion_spot.pts_putdown_trigs = [];
}
s_lion_spot.pts_putdown_trigs[player.characterindex] = t_place_ball;
level thread pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot );
}
@ -454,7 +437,7 @@ pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot )
pts_reset_ball( s_lion_spot )
{
if ( isDefined( s_lion_spot.which_ball ) )
if ( isdefined( s_lion_spot.which_ball ) )
{
s_lion_spot.sq_pickup_reset = 1;
s_lion_spot.which_ball notify( "sq_pickup_reset" );
@ -462,13 +445,10 @@ pts_reset_ball( s_lion_spot )
playfx( level._effect["sidequest_flash"], m_ball_anim gettagorigin( "fxanim_zom_highrise_trample_gen1_jnt" ) );
flag_clear( "pts_2_generator_" + s_lion_spot.which_generator + "_started" );
level.current_generator--;
s_lion_spot.which_ball = undefined;
m_ball_anim delete();
}
else
{
if ( isDefined( s_lion_spot.springpad_buddy.which_ball ) )
else if ( isdefined( s_lion_spot.springpad_buddy.which_ball ) )
{
s_lion_spot.springpad_buddy.sq_pickup_reset = 1;
s_lion_spot.springpad_buddy.which_ball notify( "sq_pickup_reset" );
@ -476,95 +456,104 @@ pts_reset_ball( s_lion_spot )
playfx( level._effect["sidequest_flash"], m_ball_anim gettagorigin( "fxanim_zom_highrise_trample_gen1_jnt" ) );
flag_clear( "pts_2_generator_" + s_lion_spot.springpad_buddy.which_generator + "_started" );
level.current_generator--;
s_lion_spot.springpad_buddy.which_ball = undefined;
m_ball_anim delete();
}
}
}
pts_putdown_trigs_remove_for_player( player )
{
a_lion_spots = getstructarray( "pts_lion", "targetname" );
_a554 = a_lion_spots;
_k554 = getFirstArrayKey( _a554 );
while ( isDefined( _k554 ) )
foreach ( s_lion_spot in a_lion_spots )
{
s_lion_spot = _a554[ _k554 ];
if ( !isDefined( s_lion_spot.pts_putdown_trigs ) )
if ( !isdefined( s_lion_spot.pts_putdown_trigs ) )
{
continue;
continue;
}
else if ( isDefined( s_lion_spot.pts_putdown_trigs[ player.characterindex ] ) )
if ( isdefined( s_lion_spot.pts_putdown_trigs[player.characterindex] ) )
{
s_lion_spot.pts_putdown_trigs[player.characterindex] delete();
arrayremoveindex( s_lion_spot.pts_putdown_trigs, player.characterindex, 1 );
}
_k554 = getNextArrayKey( _a554, _k554 );
}
}
pts_putdown_trigs_remove_for_spot( s_lion_spot )
{
if ( !isDefined( s_lion_spot.pts_putdown_trigs ) )
{
if ( !isdefined( s_lion_spot.pts_putdown_trigs ) )
return;
}
_a575 = s_lion_spot.pts_putdown_trigs;
_k575 = getFirstArrayKey( _a575 );
while ( isDefined( _k575 ) )
{
t_putdown = _a575[ _k575 ];
foreach ( t_putdown in s_lion_spot.pts_putdown_trigs )
t_putdown delete();
_k575 = getNextArrayKey( _a575, _k575 );
}
s_lion_spot.pts_putdown_trigs = [];
}
richtofen_pts_instructions()
{
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_0" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_0" );
}
richtofen_pts_placed()
{
level waittill( "sq_pts_springad_count1" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_1" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_1" );
level waittill( "sq_pts_springad_count2" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_2" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_2" );
level waittill( "sq_pts_springad_count3" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_3" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_3" );
level waittill( "sq_pts_springad_count4" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_4" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_4" );
}
richtofen_zombies_launched()
{
level waittill( "pts1_say_next_line" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_0" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_0" );
wait 1;
level waittill( "pts1_say_next_line" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_1" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_1" );
wait 1;
level waittill( "pts1_say_next_line" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_2" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_2" );
}
maxis_pts_instructions()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_0" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_0" );
}
maxis_pts_placed()
{
level waittill( "sq_pts_springad_count1" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_1" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_1" );
level waittill( "sq_pts_springad_count2" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_2" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_2" );
level waittill( "sq_pts_springad_count4" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_3" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_3" );
}
maxis_balls_placed()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_4" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_4" );
}

View File

@ -1,9 +1,11 @@
#include maps/mp/zm_highrise_sq_pts;
#include maps/mp/zm_highrise_sq;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
#include maps\mp\zm_highrise_sq_pts;
init()
{
@ -30,6 +32,7 @@ stage_logic()
exit_stage_1( success )
{
}
snipe_balls_wait()
@ -37,22 +40,19 @@ snipe_balls_wait()
a_balls = getentarray( "sq_dragon_lion_ball", "targetname" );
array_thread( a_balls, ::snipe_balls_watch_ball );
is_complete = 0;
while ( !is_complete )
{
level waittill( "zm_ball_shot" );
wait 1;
is_complete = 1;
_a50 = a_balls;
_k50 = getFirstArrayKey( _a50 );
while ( isDefined( _k50 ) )
{
m_ball = _a50[ _k50 ];
if ( isDefined( m_ball ) )
foreach ( m_ball in a_balls )
{
if ( isdefined( m_ball ) )
is_complete = 0;
}
_k50 = getNextArrayKey( _a50, _k50 );
}
}
/#
iprintlnbold( "All Balls Shot" );
@ -64,61 +64,65 @@ snipe_balls_watch_ball()
self endon( "delete" );
a_snipers = array( "dsr50_zm", "dsr50_upgraded_zm+vzoom", "barretm82_zm", "barretm82_upgraded_zm+vzoom", "svu_zm", "svu_upgraded_zm+vzoom" );
self setcandamage( 1 );
while ( 1 )
while ( true )
{
self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname );
if ( maps/mp/zm_highrise_sq::sq_is_weapon_sniper( weaponname ) )
if ( maps\mp\zm_highrise_sq::sq_is_weapon_sniper( weaponname ) )
{
level notify( "zm_ball_shot" );
playsoundatposition( "zmb_sq_ball_ding", self.origin );
playfx( level._effect["sidequest_flash"], self.origin );
str_noteworthy = self.script_noteworthy;
self delete();
wait 0,5;
wait 0.5;
clientnotify( str_noteworthy );
m_ball = getent( "sq_sliquify_r", "script_noteworthy" );
if ( str_noteworthy == "m_drg_tail" )
{
m_ball = getent( "sq_sliquify_m", "script_noteworthy" );
}
playfx( level._effect["sidequest_flash"], m_ball.origin );
m_ball show();
m_ball thread lion_ball_enable_pickup();
if ( !flag( "sq_slb_first_ball_sniped" ) )
{
flag_set( "sq_slb_first_ball_sniped" );
level thread vo_atd_ball1_sniped();
break;
}
else
{
level thread vo_maxis_atd_ball2_sniped();
}
}
}
}
lion_ball_enable_pickup()
{
self endon( "sq_sliquified" );
while ( 1 )
while ( true )
{
self.can_pickup = 1;
self.t_pickup = sq_slb_create_use_trigger( self.origin, 32, 70, &"ZM_HIGHRISE_SQ_PICKUP_BALL" );
while ( self.can_pickup )
{
self.t_pickup waittill( "trigger", player );
if ( !isDefined( player.zm_sq_has_ball ) )
if ( !isdefined( player.zm_sq_has_ball ) )
{
player.zm_sq_has_ball = 1;
player.which_ball = self;
self.can_pickup = 0;
self.player = player;
flag_set( "sq_ball_picked_up" );
level thread maps/mp/zm_highrise_sq_pts::pts_should_player_create_trigs( player );
level notify( "zm_ball_picked_up" );
level thread maps\mp\zm_highrise_sq_pts::pts_should_player_create_trigs( player );
level notify( "zm_ball_picked_up", player );
}
}
self.t_pickup delete();
self hide();
self setcandamage( 0 );
@ -128,21 +132,24 @@ lion_ball_enable_pickup()
self.player.t_putdown_ball = self.t_putdown;
self ball_pickup_waittill_change();
play_spark = 0;
if ( !isDefined( self.t_putdown ) )
if ( !isdefined( self.t_putdown ) )
{
self waittill( "sq_pickup_reset" );
play_spark = 1;
}
else
{
self.t_putdown delete();
}
self.player notify( "zm_sq_ball_putdown" );
if ( play_spark )
{
self.sq_pickup_reset = undefined;
playfx( level._effect["sidequest_flash"], self.origin );
}
self show();
self setcandamage( 1 );
self.player.zm_sq_has_ball = undefined;
@ -173,23 +180,23 @@ vo_richtofen_atd_ball_sniped()
if ( !flag( "sq_slb_richtofen_spoke" ) )
{
flag_set( "sq_slb_richtofen_spoke" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sec_symbols_4" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sec_symbols_4" );
}
}
vo_maxis_slb_hint()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_0" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_0" );
}
vo_maxis_atd_ball1_sniped()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_1" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_1" );
}
vo_maxis_atd_ball2_sniped()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_2" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_2" );
}
vo_atd_ball1_sniped()

View File

@ -1,9 +1,11 @@
#include maps/mp/zm_highrise_sq;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zm_highrise_sq;
init_1()
{
@ -20,7 +22,7 @@ init_2()
flag_init( "ssp2_corpses_in_place" );
flag_init( "ssp2_resurrection_done" );
flag_init( "ssp2_statue_complete" );
maps/mp/zombies/_zm_spawner::add_custom_zombie_spawn_logic( ::ssp_2_zombie_death_check );
maps\mp\zombies\_zm_spawner::add_custom_zombie_spawn_logic( ::ssp_2_zombie_death_check );
declare_sidequest_stage( "sq_2", "ssp_2", ::init_stage_2, ::stage_logic_2, ::exit_stage_2 );
}
@ -52,40 +54,39 @@ ssp1_sliquify_balls()
level thread ssp1_advance_dragon();
level thread vo_richtofen_sliquify_confirm();
level thread vo_maxis_sliquify_fail();
i = 0;
while ( i < a_balls.size )
{
for ( i = 0; i < a_balls.size; i++ )
a_balls[i] thread ssp1_watch_ball( "ssp1_ball" + i + "_complete" );
i++;
}
while ( !flag( "ssp1_ball0_complete" ) || !flag( "ssp1_ball1_complete" ) )
{
flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" );
wait 0,5;
wait 0.5;
}
maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 2 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "r", 2 );
}
ssp1_watch_ball( str_complete_flag )
{
self watch_model_sliquification( 20, str_complete_flag );
self thread ssp1_rotate_ball();
self playloopsound( "zmb_sq_ball_rotate_loop", 0,25 );
self playloopsound( "zmb_sq_ball_rotate_loop", 0.25 );
}
ssp1_rotate_ball()
{
while ( isDefined( self ) )
while ( isdefined( self ) )
{
self rotateyaw( 360, 1 );
wait 0,9;
wait 0.9;
}
}
ssp1_advance_dragon()
{
flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" );
maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 2 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "r", 2 );
}
stage_logic_2()
@ -102,26 +103,22 @@ corpse_room_watcher()
{
t_corpse_room = getent( "corpse_room_trigger", "targetname" );
n_count = 0;
while ( !flag( "ssp2_resurrection_done" ) )
{
level waittill( "ssp2_corpse_made", is_in_room );
if ( is_in_room )
{
n_count++;
}
else
{
n_count = 0;
}
if ( n_count == 1 && !flag( "ssp2_maxis_keep_going_said" ) )
{
flag_set( "ssp2_maxis_keep_going_said" );
level thread maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_0" );
continue;
level thread maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_0" );
}
else
{
if ( n_count >= 15 )
else if ( n_count >= 15 )
{
/#
iprintlnbold( "Corpse Count Reached" );
@ -133,52 +130,47 @@ corpse_room_watcher()
}
}
}
}
ssp_2_zombie_death_check()
{
self waittill( "death" );
if ( !isDefined( self ) )
{
if ( !isdefined( self ) )
return;
}
t_corpse_room = getent( "corpse_room_trigger", "targetname" );
if ( self istouching( t_corpse_room ) )
{
level notify( "ssp2_corpse_made" );
}
level notify( "ssp2_corpse_made", 1 );
else
{
level notify( "ssp2_corpse_made" );
}
level notify( "ssp2_corpse_made", 0 );
}
corpse_room_cleanup_watcher()
{
level endon( "ssp2_resurrection_done" );
t_corpse_room = getent( "corpse_room_trigger", "targetname" );
while ( 1 )
while ( true )
{
wait 1;
a_corpses = getcorpsearray();
if ( a_corpses.size < 15 )
{
level thread vo_maxis_ssp_fail();
level notify( "end_revive_watcher" );
return;
}
n_count = 0;
_a206 = a_corpses;
_k206 = getFirstArrayKey( _a206 );
while ( isDefined( _k206 ) )
foreach ( m_corpse in a_corpses )
{
m_corpse = _a206[ _k206 ];
if ( m_corpse istouching( t_corpse_room ) )
{
n_count++;
}
_k206 = getNextArrayKey( _a206, _k206 );
}
if ( n_count < 15 )
{
level thread vo_maxis_ssp_fail();
@ -194,9 +186,11 @@ corpse_room_revive_watcher()
weaponname = "none";
str_type = "none";
t_corpse_room_dmg = getent( "corpse_room_trigger", "targetname" );
while ( weaponname != "knife_ballistic_upgraded_zm" || str_type != "MOD_IMPACT" )
{
t_corpse_room_dmg waittill( "damage", amount, inflictor, direction, point, type );
if ( isplayer( inflictor ) )
{
weaponname = inflictor.currentweapon;
@ -213,9 +207,9 @@ corpse_room_revive_watcher()
ssp2_advance_dragon()
{
flag_wait( "ssp2_corpses_in_place" );
maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 1 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "m", 1 );
flag_wait( "ssp2_resurrection_done" );
maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 2 );
maps\mp\zm_highrise_sq::light_dragon_fireworks( "m", 2 );
}
exit_stage_1( success )
@ -225,82 +219,80 @@ exit_stage_1( success )
exit_stage_2( success )
{
}
watch_model_sliquification( n_end_limit, str_complete_flag )
{
n_count = 0;
self setcandamage( 1 );
while ( !flag( str_complete_flag ) )
{
self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname );
if ( issubstr( weaponname, "slipgun" ) && !flag( "sq_ball_picked_up" ) )
{
n_count++;
if ( n_count >= n_end_limit )
{
/#
iprintlnbold( "MODEL COMPLETE: " + str_complete_flag );
#/
self notify( "sq_sliquified" );
if ( isDefined( self.t_pickup ) )
{
if ( isdefined( self.t_pickup ) )
self.t_pickup delete();
}
flag_set( str_complete_flag );
break;
}
else if ( n_count == 1 )
{
level notify( "ssp1_ball_first_sliquified" );
break;
}
else
{
if ( n_count == 10 )
{
else if ( n_count == 10 )
level notify( "ssp1_ball_sliquified_2" );
}
}
}
}
}
vo_richtofen_instructions()
{
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_0" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_0" );
wait 10;
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_1" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_1" );
}
vo_sliquify_fail_watch()
{
flag_wait( "sq_ball_picked_up" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_fail_1" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_fail_1" );
}
vo_richtofen_sliquify_confirm()
{
level waittill( "ssp1_ball_first_sliquified" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_2" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_2" );
level waittill( "ssp1_ball_sliquified_2" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_3" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_3" );
flag_wait( "ssp1_complete" );
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_4" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_4" );
wait 10;
maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_5" );
maps\mp\zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_5" );
}
vo_maxis_sliquify_fail()
{
flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_fail_3" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_fail_3" );
}
vo_maxis_start_ssp()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_3" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_4" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_3" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_4" );
}
vo_maxis_ssp_reincarnate()
@ -308,21 +300,19 @@ vo_maxis_ssp_reincarnate()
if ( !flag( "ssp2_maxis_reincarnate_said" ) )
{
flag_set( "ssp2_maxis_reincarnate_said" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_1" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_1" );
}
else
{
flag_clear( "ssp2_maxis_reincarnate_said" );
}
}
vo_maxis_ssp_fail()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_5" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_5" );
}
vo_maxis_ssp_complete()
{
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_3" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_6" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_3" );
maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_6" );
}

View File

@ -1,8 +1,10 @@
#include maps/mp/zombies/_zm_ffotd;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_ffotd;
main_start()
{
@ -25,55 +27,56 @@ spawned_collision_fix()
precachemodel( "collision_wall_128x128x10_standard" );
precachemodel( "collision_wall_256x256x10_standard" );
flag_wait( "start_zombie_round_logic" );
if ( !is_true( level.optimise_for_splitscreen ) )
{
collision1 = spawn( "script_model", ( 2992, 536, 497 ) );
collision1 setmodel( "collision_geo_512x512x512_standard" );
collision1.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision1.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision1 ghost();
collision2 = spawn( "script_model", ( 2824, 632, 497 ) );
collision2 setmodel( "collision_geo_512x512x512_standard" );
collision2.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision2.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision2 ghost();
collision3 = spawn( "script_model", ( 2992, 536, -15 ) );
collision3 setmodel( "collision_geo_512x512x512_standard" );
collision3.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision3.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision3 ghost();
collision4 = spawn( "script_model", ( 2824, 632, -15 ) );
collision4 setmodel( "collision_geo_512x512x512_standard" );
collision4.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision4.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision4 ghost();
collision5 = spawn( "script_model", ( 2992, 536, -527 ) );
collision5 setmodel( "collision_geo_512x512x512_standard" );
collision5.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision5.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision5 ghost();
collision6 = spawn( "script_model", ( 2824, 632, -527 ) );
collision6 setmodel( "collision_geo_512x512x512_standard" );
collision6.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision6.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision6 ghost();
collision7 = spawn( "script_model", ( 2992, 536, -1039 ) );
collision7 setmodel( "collision_geo_512x512x512_standard" );
collision7.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision7.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision7 ghost();
collision8 = spawn( "script_model", ( 2824, 632, -1039 ) );
collision8 setmodel( "collision_geo_512x512x512_standard" );
collision8.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision8.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision8 ghost();
collision9 = spawn( "script_model", ( 2992, 536, -1551 ) );
collision9 setmodel( "collision_geo_512x512x512_standard" );
collision9.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision9.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision9 ghost();
collision10 = spawn( "script_model", ( 2824, 632, -1551 ) );
collision10 setmodel( "collision_geo_512x512x512_standard" );
collision10.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision10.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision10 ghost();
collision11 = spawn( "script_model", ( 2992, 536, -2063 ) );
collision11 setmodel( "collision_geo_512x512x512_standard" );
collision11.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision11.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision11 ghost();
collision12 = spawn( "script_model", ( 2824, 632, -2063 ) );
collision12 setmodel( "collision_geo_512x512x512_standard" );
collision12.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision12.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision12 ghost();
collisione1 = spawn( "script_model", ( 1649, 2164, 2843 ) );
collisione1 setmodel( "collision_wall_256x256x10_standard" );
@ -85,59 +88,59 @@ spawned_collision_fix()
collisione2 ghost();
collisione3 = spawn( "script_model", ( 1478, 1216, 2843 ) );
collisione3 setmodel( "collision_wall_256x256x10_standard" );
collisione3.angles = vectorScale( ( 0, 0, 0 ), 270 );
collisione3.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione3 ghost();
collisione4 = spawn( "script_model", ( 1478, 1216, 2587 ) );
collisione4 setmodel( "collision_wall_256x256x10_standard" );
collisione4.angles = vectorScale( ( 0, 0, 0 ), 270 );
collisione4.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione4 ghost();
collisione5 = spawn( "script_model", ( 1478, 1216, 2331 ) );
collisione5 setmodel( "collision_wall_256x256x10_standard" );
collisione5.angles = vectorScale( ( 0, 0, 0 ), 270 );
collisione5.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione5 ghost();
collisione6 = spawn( "script_model", ( 1478, 1216, 2242 ) );
collisione6 setmodel( "collision_wall_256x256x10_standard" );
collisione6.angles = vectorScale( ( 0, 0, 0 ), 270 );
collisione6.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione6 ghost();
collision13 = spawn( "script_model", ( 2251, 2687, 3095 ) );
collision13 setmodel( "collision_wall_128x128x10_standard" );
collision13.angles = vectorScale( ( 0, 0, 0 ), 270 );
collision13.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collision13 ghost();
collision14 = spawn( "script_model", ( 2046, 1270, 2758 ) );
collision14 setmodel( "collision_geo_512x512x512_standard" );
collision14.angles = vectorScale( ( 0, 0, 0 ), 6,20013 );
collision14.angles = vectorscale( ( 0, 0, -1 ), 6.20013 );
collision14 ghost();
collision15 = spawn( "script_model", ( 2518, 597, 3191 ) );
collision15 setmodel( "collision_wall_128x128x10_standard" );
collision15.angles = ( 0, 240,4, -3,00014 );
collision15.angles = ( 0, 240.4, -3.00014 );
collision15 ghost();
collision16 = spawn( "script_model", ( 2613, -721, 1184 ) );
collision16 setmodel( "collision_wall_128x128x10_standard" );
collision16.angles = ( 0, 60, -2,60003 );
collision16.angles = ( 0, 60, -2.60003 );
collision16 ghost();
collision17 = spawn( "script_model", ( 2721, -533, 1184 ) );
collision17 setmodel( "collision_wall_128x128x10_standard" );
collision17.angles = ( 0, 60, -2,60003 );
collision17.angles = ( 0, 60, -2.60003 );
collision17 ghost();
collision18 = spawn( "script_model", ( 2940, 1512, 3004 ) );
collision18 setmodel( "collision_geo_64x64x256_standard" );
collision18.angles = vectorScale( ( 0, 0, 0 ), 350 );
collision18.angles = vectorscale( ( 1, 0, 0 ), 350.0 );
collision18 ghost();
collision19 = spawn( "script_model", ( 1631, -235, 2943 ) );
collision19 setmodel( "collision_geo_32x32x128_standard" );
collision19.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision19.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision19 ghost();
collision20 = spawn( "script_model", ( 2232, -579, 1354 ) );
collision20 setmodel( "collision_wall_128x128x10_standard" );
collision20.angles = vectorScale( ( 0, 0, 0 ), 330 );
collision20.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision20 ghost();
collision21 = spawn( "script_model", ( 2349, 805, 1346 ) );
collision21 setmodel( "collision_geo_32x32x128_standard" );
collision21.angles = vectorScale( ( 0, 0, 0 ), 8,6 );
collision21.angles = vectorscale( ( 0, 1, 0 ), 8.6 );
collision21 ghost();
collision22 = spawn( "script_model", ( 2791, 1093, 1272 ) );
collision22 setmodel( "collision_geo_32x32x128_standard" );
collision22.angles = vectorScale( ( 0, 0, 0 ), 3,2 );
collision22.angles = vectorscale( ( 1, 0, 0 ), 3.2 );
collision22 ghost();
collision23 = spawn( "script_model", ( 2222, 1488, 3280 ) );
collision23 setmodel( "collision_geo_32x32x128_standard" );
@ -152,25 +155,24 @@ spawned_collision_fix()
connect_zones_for_ffotd( zone_name_a, zone_name_b, one_way )
{
if ( !isDefined( one_way ) )
{
if ( !isdefined( one_way ) )
one_way = 0;
}
zone_init( zone_name_a );
zone_init( zone_name_b );
enable_zone( zone_name_a );
enable_zone( zone_name_b );
if ( !isDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) )
{
if ( !isdefined( level.zones[zone_name_a].adjacent_zones[zone_name_b] ) )
level.zones[zone_name_a].adjacent_zones[zone_name_b] = spawnstruct();
}
level.zones[zone_name_a].adjacent_zones[zone_name_b].is_connected = 1;
if ( !one_way )
{
if ( !isDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) )
{
if ( !isdefined( level.zones[zone_name_b].adjacent_zones[zone_name_a] ) )
level.zones[zone_name_b].adjacent_zones[zone_name_a] = spawnstruct();
}
level.zones[zone_name_b].adjacent_zones[zone_name_a].is_connected = 1;
}
}
@ -178,7 +180,7 @@ connect_zones_for_ffotd( zone_name_a, zone_name_b, one_way )
kill_trigger_spawn()
{
trig = spawn( "trigger_box", ( 3328, 160, 1480 ), 0, 96, 200, 128 );
trig.angles = vectorScale( ( 0, 0, 0 ), 150 );
trig.angles = vectorscale( ( 0, 1, 0 ), 150.0 );
trig.targetname = "instant_death";
trig2 = spawn( "trigger_box", ( 2512, 1824, 1488 ), 0, 140, 140, 128 );
trig2.angles = ( 0, 0, 0 );
@ -193,70 +195,64 @@ pathfinding_override_fix()
player_trigger_origin = ( 2357, 778, 1304 );
player_trigger_radius = 40;
zombie_goto_point = ( 2361, 738, 1304 );
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 );
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 = ( 3767, 1867, 2790 );
zombie_trigger_radius = 64;
zombie_trigger_height = 128;
player_trigger_origin = ( 3684, 1772, 2758 );
player_trigger_radius = 70;
zombie_goto_point = ( 3659, 1872, 2790 );
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 = ( 3245, 1251, 1347,79 );
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 = ( 3245, 1251, 1347.79 );
zombie_trigger_radius = 64;
zombie_trigger_height = 128;
player_trigger_origin = ( 3246, 1126, 1347,79 );
player_trigger_origin = ( 3246, 1126, 1347.79 );
player_trigger_radius = 64;
zombie_goto_point = ( 3031, 1234, 1278,12 );
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 = ( 3246, 1113, 1347,79 );
zombie_goto_point = ( 3031, 1234, 1278.12 );
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 = ( 3246, 1113, 1347.79 );
zombie_trigger_radius = 64;
zombie_trigger_height = 128;
player_trigger_origin = ( 3245, 1230, 1347,79 );
player_trigger_origin = ( 3245, 1230, 1347.79 );
player_trigger_radius = 44;
zombie_goto_point = ( 3023, 1154, 1278,12 );
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 = ( 3389, 1182, 1364,79 );
zombie_goto_point = ( 3023, 1154, 1278.12 );
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 = ( 3389, 1182, 1364.79 );
zombie_trigger_radius = 64;
zombie_trigger_height = 128;
player_trigger_origin = ( 3246, 1126, 1347,79 );
player_trigger_origin = ( 3246, 1126, 1347.79 );
player_trigger_radius = 64;
zombie_goto_point = ( 3381, 1093, 1364,79 );
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 = ( 3148, 1712, 1299,07 );
zombie_goto_point = ( 3381, 1093, 1364.79 );
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 = ( 3148, 1712, 1299.07 );
zombie_trigger_radius = 64;
zombie_trigger_height = 128;
player_trigger_origin = ( 3149, 1604, 1302,2 );
player_trigger_origin = ( 3149, 1604, 1302.2 );
player_trigger_radius = 44;
zombie_goto_point = ( 3259, 1644, 1321,5 );
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 = ( 3149, 1584, 1302,2 );
zombie_goto_point = ( 3259, 1644, 1321.5 );
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 = ( 3149, 1584, 1302.2 );
zombie_trigger_radius = 64;
zombie_trigger_height = 128;
player_trigger_origin = ( 3148, 1692, 1299,07 );
player_trigger_origin = ( 3148, 1692, 1299.07 );
player_trigger_radius = 44;
zombie_goto_point = ( 3291, 1684, 1321,5 );
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 = ( 3818, 1860, 2789,23 );
zombie_goto_point = ( 3291, 1684, 1321.5 );
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 = ( 3818, 1860, 2789.23 );
zombie_trigger_radius = 100;
zombie_trigger_height = 128;
player_trigger_origin = ( 3601, 1961, 2744,95 );
player_trigger_origin = ( 3601, 1961, 2744.95 );
player_trigger_radius = 50;
zombie_goto_point = ( 3626, 1918, 2750,26 );
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_goto_point = ( 3626, 1918, 2750.26 );
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 );
all_nodes = getallnodes();
_a331 = all_nodes;
_k331 = getFirstArrayKey( _a331 );
while ( isDefined( _k331 ) )
foreach ( node in all_nodes )
{
node = _a331[ _k331 ];
if ( node.origin[ 0 ] == 3598,2 )
if ( node.origin[0] == 3598.2 )
{
deletepathnode( node );
return;
}
else
{
_k331 = getNextArrayKey( _a331, _k331 );
break;
}
}
}
@ -264,17 +260,15 @@ pathfinding_override_fix()
highrise_link_nodes( a, b )
{
if ( nodesarelinked( a, b ) )
{
return;
}
link_nodes( a, b );
}
highrise_unlink_nodes( a, b )
{
if ( !nodesarelinked( a, b ) )
{
return;
}
unlink_nodes( a, b );
}

View File

@ -0,0 +1,304 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_powerups;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_unitrigger;
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( ( -1, 0, 0 ), 25.0 );
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 ( true )
{
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 ( true )
{
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.0 ) );
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 false;
}
self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount );
return true;
}
trigger_deposit_think()
{
self endon( "kill_trigger" );
while ( true )
{
self waittill( "trigger", player );
if ( !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 false;
}
self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee );
return true;
}
trigger_withdraw_think()
{
self endon( "kill_trigger" );
while ( true )
{
self waittill( "trigger", player );
if ( !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 );
#/
}

View File

@ -1,42 +1,40 @@
#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;
#using_animtree( "zombie_springpad" );
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\gametypes_zm\_weaponobjects;
#include maps\mp\zombies\_zm;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_power;
#include maps\mp\zombies\_zm_buildables;
init( pickupstring, howtostring )
{
if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_springpad_zm" ) )
{
if ( !maps\mp\zombies\_zm_equipment::is_equipment_included( "equip_springpad_zm" ) )
return;
}
level.springpad_name = "equip_springpad_zm";
init_animtree();
maps/mp/zombies/_zm_equipment::register_equipment( "equip_springpad_zm", pickupstring, howtostring, "zom_hud_trample_steam_complete", "springpad", undefined, ::transferspringpad, ::dropspringpad, ::pickupspringpad, ::placespringpad );
maps/mp/zombies/_zm_equipment::add_placeable_equipment( "equip_springpad_zm", "p6_anim_zm_buildable_view_tramplesteam" );
maps\mp\zombies\_zm_equipment::register_equipment( "equip_springpad_zm", pickupstring, howtostring, "zom_hud_trample_steam_complete", "springpad", undefined, ::transferspringpad, ::dropspringpad, ::pickupspringpad, ::placespringpad );
maps\mp\zombies\_zm_equipment::add_placeable_equipment( "equip_springpad_zm", "p6_anim_zm_buildable_view_tramplesteam" );
level thread onplayerconnect();
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "equip_springpad", pickupstring );
maps\mp\gametypes_zm\_weaponobjects::createretrievablehint( "equip_springpad", pickupstring );
level._effect["springpade_on"] = loadfx( "maps/zombie_highrise/fx_highrise_trmpl_steam_os" );
if ( -1 )
{
setdvar( "player_useRadius_zm", 96 );
}
if ( !isdefined( level.springpad_trigger_radius ) )
level.springpad_trigger_radius = 72;
thread wait_init_damage();
}
wait_init_damage()
{
while ( !isDefined( level.zombie_vars ) || !isDefined( level.zombie_vars[ "zombie_health_start" ] ) )
{
while ( !isdefined( level.zombie_vars ) || !isdefined( level.zombie_vars["zombie_health_start"] ) )
wait 1;
}
level.springpad_damage = maps/mp/zombies/_zm::ai_zombie_health( 50 );
level.springpad_damage = maps\mp\zombies\_zm::ai_zombie_health( 50 );
}
onplayerconnect()
@ -44,6 +42,7 @@ onplayerconnect()
for (;;)
{
level waittill( "connecting", player );
player thread onplayerspawned();
}
}
@ -52,9 +51,11 @@ onplayerspawned()
{
self endon( "disconnect" );
self thread setupwatchers();
for (;;)
{
self waittill( "spawned_player" );
self thread watchspringpaduse();
}
}
@ -62,8 +63,9 @@ onplayerspawned()
setupwatchers()
{
self waittill( "weapon_watchers_created" );
watcher = maps/mp/gametypes_zm/_weaponobjects::getweaponobjectwatcher( "equip_springpad" );
watcher.onspawnretrievetriggers = ::maps/mp/zombies/_zm_equipment::equipment_onspawnretrievableweaponobject;
watcher = maps\mp\gametypes_zm\_weaponobjects::getweaponobjectwatcher( "equip_springpad" );
watcher.onspawnretrievetriggers = maps\mp\zombies\_zm_equipment::equipment_onspawnretrievableweaponobject;
}
watchspringpaduse()
@ -72,9 +74,11 @@ watchspringpaduse()
self endon( "watchSpringPadUse" );
self endon( "death" );
self endon( "disconnect" );
for (;;)
{
self waittill( "equipment_placed", weapon, weapname );
if ( weapname == level.springpad_name )
{
self cleanupoldspringpad();
@ -86,17 +90,19 @@ watchspringpaduse()
cleanupoldspringpad()
{
if ( isDefined( self.buildablespringpad ) )
if ( isdefined( self.buildablespringpad ) )
{
if ( isDefined( self.buildablespringpad.stub ) )
if ( isdefined( self.buildablespringpad.stub ) )
{
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub );
thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub );
self.buildablespringpad.stub = undefined;
}
self.buildablespringpad delete();
self.springpad_kills = undefined;
}
if ( isDefined( level.springpad_sound_ent ) )
if ( isdefined( level.springpad_sound_ent ) )
{
level.springpad_sound_ent delete();
level.springpad_sound_ent = undefined;
@ -107,31 +113,41 @@ watchforcleanup()
{
self notify( "springpad_cleanup" );
self endon( "springpad_cleanup" );
self waittill_any( "death", "disconnect", "equip_springpad_zm_taken", "equip_springpad_zm_pickup" );
self waittill_any( "death_or_disconnect", "equip_springpad_zm_taken", "equip_springpad_zm_pickup" );
cleanupoldspringpad();
}
placespringpad( origin, angles )
{
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_tramplesteam", "equip_springpad_zm", origin, angles, 96, -32 );
if ( isDefined( item ) )
if ( isdefined( self.turret_placement ) && !self.turret_placement["result"] )
{
forward = anglestoforward( angles );
origin -= -24 * forward;
}
item = self maps\mp\zombies\_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_tramplesteam", "equip_springpad_zm", origin, angles, level.springpad_trigger_radius, -24 );
if ( isdefined( item ) )
{
item.springpad_kills = self.springpad_kills;
item.requires_pickup = 1;
item.zombie_attack_callback = ::springpad_add_fling_ent;
item.zombie_attack_callback = ::springpad_fling_attacker;
}
self.springpad_kills = undefined;
return item;
}
dropspringpad()
{
item = self maps/mp/zombies/_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_tramplesteam", "equip_springpad_zm", self.origin, self.angles, 96, -32 );
if ( isDefined( item ) )
item = self maps\mp\zombies\_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_tramplesteam", "equip_springpad_zm", self.origin, self.angles, level.springpad_trigger_radius, -24 );
if ( isdefined( item ) )
{
item.springpad_kills = self.springpad_kills;
item.requires_pickup = 1;
}
self.springpad_kills = undefined;
return item;
}
@ -146,22 +162,16 @@ transferspringpad( fromplayer, toplayer )
{
buildablespringpad = toplayer.buildablespringpad;
toarmed = 0;
if ( isDefined( buildablespringpad ) )
{
if ( isDefined( buildablespringpad.is_armed ) )
{
toarmed = buildablespringpad.is_armed;
}
}
if ( isdefined( buildablespringpad ) )
toarmed = isdefined( buildablespringpad.is_armed ) && buildablespringpad.is_armed;
springpad_kills = toplayer.springpad_kills;
fromarmed = 0;
if ( isDefined( fromplayer.buildablespringpad ) )
{
if ( isDefined( fromplayer.buildablespringpad.is_armed ) )
{
fromarmed = fromplayer.buildablespringpad.is_armed;
}
}
if ( isdefined( fromplayer.buildablespringpad ) )
fromarmed = isdefined( fromplayer.buildablespringpad.is_armed ) && fromplayer.buildablespringpad.is_armed;
toplayer.buildablespringpad = fromplayer.buildablespringpad;
toplayer.buildablespringpad.original_owner = toplayer;
toplayer.buildablespringpad.owner = toplayer;
@ -171,25 +181,23 @@ transferspringpad( fromplayer, toplayer )
fromplayer.buildablespringpad = buildablespringpad;
fromplayer.springpad_kills = springpad_kills;
fromplayer notify( "equip_springpad_zm_taken" );
if ( isDefined( fromplayer.buildablespringpad ) )
if ( isdefined( fromplayer.buildablespringpad ) )
{
fromplayer thread startspringpaddeploy( fromplayer.buildablespringpad, toarmed );
fromplayer.buildablespringpad.original_owner = fromplayer;
fromplayer.buildablespringpad.owner = fromplayer;
}
else
{
fromplayer maps/mp/zombies/_zm_equipment::equipment_release( "equip_springpad_zm" );
}
fromplayer maps\mp\zombies\_zm_equipment::equipment_release( "equip_springpad_zm" );
}
springpad_in_range( delta, origin, radius )
{
if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) )
{
return 1;
}
return 0;
if ( distancesquared( self.target.origin, origin ) < radius * radius )
return true;
return false;
}
springpad_power_on( origin, radius )
@ -197,12 +205,11 @@ springpad_power_on( origin, radius )
/#
println( "^1ZM POWER: trap on\n" );
#/
if ( !isDefined( self.target ) )
{
if ( !isdefined( self.target ) )
return;
}
self.target.power_on = 1;
self.target.power_on_time = getTime();
self.target.power_on_time = gettime();
}
springpad_power_off( origin, radius )
@ -210,10 +217,9 @@ springpad_power_off( origin, radius )
/#
println( "^1ZM POWER: trap off\n" );
#/
if ( !isDefined( self.target ) )
{
if ( !isdefined( self.target ) )
return;
}
self.target.power_on = 0;
}
@ -224,45 +230,50 @@ startspringpaddeploy( weapon, armed )
self endon( "equip_springpad_zm_taken" );
self thread watchforcleanup();
electricradius = 45;
if ( isDefined( self.springpad_kills ) )
if ( isdefined( self.springpad_kills ) )
{
weapon.springpad_kills = self.springpad_kills;
self.springpad_kills = undefined;
}
if ( !isDefined( weapon.springpad_kills ) )
{
if ( !isdefined( weapon.springpad_kills ) )
weapon.springpad_kills = 0;
}
if ( isDefined( weapon ) )
if ( isdefined( weapon ) )
{
/#
weapon thread debugspringpad( electricradius );
#/
if ( isDefined( level.equipment_springpad_needs_power ) && level.equipment_springpad_needs_power )
if ( isdefined( level.equipment_springpad_needs_power ) && level.equipment_springpad_needs_power )
{
weapon.power_on = 0;
maps/mp/zombies/_zm_power::add_temp_powered_item( ::springpad_power_on, ::springpad_power_off, ::springpad_in_range, ::maps/mp/zombies/_zm_power::cost_high, 1, weapon.power_on, weapon );
maps\mp\zombies\_zm_power::add_temp_powered_item( ::springpad_power_on, ::springpad_power_off, ::springpad_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 springpadthink( weapon, electricradius, armed );
if ( isDefined( level.equipment_springpad_needs_power ) && !level.equipment_springpad_needs_power )
if ( !( isdefined( level.equipment_springpad_needs_power ) && level.equipment_springpad_needs_power ) )
{
}
self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( weapon );
self thread maps\mp\zombies\_zm_buildables::delete_on_disconnect( weapon );
weapon waittill( "death" );
if ( isDefined( level.springpad_sound_ent ) )
if ( isdefined( level.springpad_sound_ent ) )
{
level.springpad_sound_ent playsound( "wpn_zmb_electrap_stop" );
level.springpad_sound_ent delete();
level.springpad_sound_ent = undefined;
}
self notify( "springpad_cleanup" );
}
}
@ -272,6 +283,8 @@ init_animtree()
scriptmodelsuseanimtree( -1 );
}
#using_animtree("zombie_springpad");
springpad_animate( weapon, armed )
{
self endon( "death" );
@ -284,12 +297,13 @@ springpad_animate( weapon, armed )
l_animlength = getanimlength( %o_zombie_buildable_tramplesteam_launch );
weapon thread springpad_audio();
prearmed = 0;
if ( isDefined( armed ) && armed )
{
if ( isdefined( armed ) && armed )
prearmed = 1;
}
fast_reset = 0;
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{
if ( !prearmed )
{
@ -297,32 +311,35 @@ springpad_animate( weapon, armed )
{
weapon setanim( %o_zombie_buildable_tramplesteam_reset_zombie );
weapon thread playspringpadresetaudio( f_animlength );
wait f_animlength;
wait( f_animlength );
}
else
{
weapon setanim( %o_zombie_buildable_tramplesteam_reset );
weapon thread playspringpadresetaudio( r_animlength );
wait r_animlength;
wait( r_animlength );
}
}
else
{
wait 0,05;
}
wait 0.05;
prearmed = 0;
weapon notify( "armed" );
fast_reset = 0;
if ( isDefined( weapon ) )
if ( isdefined( weapon ) )
{
weapon setanim( %o_zombie_buildable_tramplesteam_compressed_idle );
weapon waittill( "fling", fast );
fast_reset = fast;
}
if ( isDefined( weapon ) )
if ( isdefined( weapon ) )
{
weapon setanim( %o_zombie_buildable_tramplesteam_launch );
wait l_animlength;
wait( l_animlength );
}
}
}
@ -333,14 +350,16 @@ playspringpadresetaudio( time )
ent = spawn( "script_origin", self.origin );
ent playloopsound( "zmb_highrise_launcher_reset_loop" );
self thread deleteentwhensounddone( time, ent );
self waittill( "death" );
ent delete();
}
deleteentwhensounddone( time, ent )
{
self endon( "death" );
wait time;
wait( time );
self notify( "springpadAudioCleanup" );
ent delete();
}
@ -349,7 +368,9 @@ springpad_audio()
{
loop_ent = spawn( "script_origin", self.origin );
loop_ent playloopsound( "zmb_highrise_launcher_loop" );
self waittill( "death" );
loop_ent delete();
}
@ -357,7 +378,8 @@ springpad_fx( weapon )
{
weapon endon( "death" );
self endon( "equip_springpad_zm_taken" );
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{
playfxontag( level._effect["springpade_on"], weapon, "tag_origin" );
wait 1;
@ -372,96 +394,106 @@ springpadthink( weapon, electricradius, armed )
weapon endon( "death" );
radiussquared = electricradius * electricradius;
trigger = spawn( "trigger_box", weapon getcentroid(), 1, 48, 48, 32 );
trigger.origin += anglesToForward( flat_angle( weapon.angles ) ) * -15;
trigger.origin += anglestoforward( flat_angle( weapon.angles ) ) * -15;
trigger.angles = weapon.angles;
trigger enablelinkto();
trigger linkto( weapon );
weapon.trigger = trigger;
/#
trigger.extent = ( 24, 24, 16 );
trigger.extent = ( 24.0, 24.0, 16.0 );
#/
weapon thread springpadthinkcleanup( trigger );
direction_forward = anglesToForward( flat_angle( weapon.angles ) + vectorScale( ( 0, 0, 1 ), 60 ) );
direction_vector = vectorScale( direction_forward, 1024 );
direction_forward = anglestoforward( flat_angle( weapon.angles ) + vectorscale( ( -1, 0, 0 ), 60.0 ) );
direction_vector = vectorscale( direction_forward, 1024 );
direction_origin = weapon.origin + direction_vector;
home_angles = weapon.angles;
weapon.is_armed = 0;
self thread springpad_fx( weapon );
self thread springpad_animate( weapon, armed );
weapon waittill( "armed" );
weapon.is_armed = 1;
weapon.fling_targets = [];
self thread targeting_thread( weapon, trigger );
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{
wait_for_targets( weapon );
if ( isDefined( weapon.fling_targets ) && weapon.fling_targets.size > 0 )
if ( isdefined( weapon.fling_targets ) && weapon.fling_targets.size > 0 )
{
weapon notify( "fling" );
weapon notify( "fling", weapon.zombies_only );
weapon.is_armed = 0;
weapon.zombies_only = 1;
_a520 = weapon.fling_targets;
_k520 = getFirstArrayKey( _a520 );
while ( isDefined( _k520 ) )
foreach ( ent in weapon.fling_targets )
{
ent = _a520[ _k520 ];
if ( isplayer( ent ) )
{
ent thread player_fling( weapon.origin + vectorScale( ( 0, 0, 1 ), 30 ), weapon.angles, direction_vector );
ent thread player_fling( weapon.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), weapon.angles, direction_vector, weapon );
continue;
}
else
{
if ( isDefined( ent ) )
{
if ( !isDefined( self.num_zombies_flung ) )
if ( isdefined( ent ) && isdefined( ent.custom_springpad_fling ) )
{
if ( !isdefined( self.num_zombies_flung ) )
self.num_zombies_flung = 0;
}
self.num_zombies_flung++;
self notify( "zombie_flung" );
if ( !isDefined( weapon.fling_scaler ) )
ent thread [[ ent.custom_springpad_fling ]]( weapon, self );
continue;
}
if ( isdefined( ent ) )
{
if ( !isdefined( self.num_zombies_flung ) )
self.num_zombies_flung = 0;
self.num_zombies_flung++;
self notify( "zombie_flung" );
if ( !isdefined( weapon.fling_scaler ) )
weapon.fling_scaler = 1;
}
if ( isDefined( weapon.direction_vec_override ) )
{
if ( isdefined( weapon.direction_vec_override ) )
direction_vector = weapon.direction_vec_override;
}
ent dodamage( ent.health + 666, ent.origin );
ent startragdoll();
ent launchragdoll( ( direction_vector / 4 ) * weapon.fling_scaler );
ent launchragdoll( direction_vector / 4 * weapon.fling_scaler );
weapon.springpad_kills++;
}
}
_k520 = getNextArrayKey( _a520, _k520 );
}
if ( weapon.springpad_kills >= 28 )
{
self thread springpad_expired( weapon );
}
weapon.fling_targets = [];
weapon waittill( "armed" );
weapon.is_armed = 1;
continue;
}
else
{
wait 0,1;
}
wait 0.1;
}
}
wait_for_targets( weapon )
{
weapon endon( "hi_priority_target" );
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{
if ( isDefined( weapon.fling_targets ) && weapon.fling_targets.size > 0 )
if ( isdefined( weapon.fling_targets ) && weapon.fling_targets.size > 0 )
{
wait 0,15;
wait 0.15;
return;
}
wait 0,05;
wait 0.05;
}
}
@ -472,55 +504,50 @@ targeting_thread( weapon, trigger )
self endon( "equip_springpad_zm_taken" );
weapon endon( "death" );
weapon.zombies_only = 1;
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{
if ( weapon.is_armed )
{
zombies = getaiarray( level.zombie_team );
_a594 = zombies;
_k594 = getFirstArrayKey( _a594 );
while ( isDefined( _k594 ) )
{
zombie = _a594[ _k594 ];
if ( !isDefined( zombie ) || !isalive( zombie ) )
{
}
else
{
if ( isDefined( zombie.ignore_spring_pad ) && zombie.ignore_spring_pad )
{
break;
}
else
foreach ( zombie in zombies )
{
if ( !isdefined( zombie ) || !isalive( zombie ) )
continue;
if ( isdefined( zombie.ignore_spring_pad ) && zombie.ignore_spring_pad )
continue;
if ( zombie istouching( trigger ) )
{
weapon springpad_add_fling_ent( zombie );
}
}
}
_k594 = getNextArrayKey( _a594, _k594 );
}
players = get_players();
_a622 = players;
_k622 = getFirstArrayKey( _a622 );
while ( isDefined( _k622 ) )
foreach ( player in players )
{
player = _a622[ _k622 ];
if ( is_player_valid( player ) && player istouching( trigger ) )
{
weapon springpad_add_fling_ent( player );
weapon.zombies_only = 0;
}
_k622 = getNextArrayKey( _a622, _k622 );
}
if ( !weapon.zombies_only )
{
weapon notify( "hi_priority_target" );
}
wait 0.05;
}
wait 0,05;
}
springpad_fling_attacker( ent )
{
springpad_add_fling_ent( ent );
if ( isdefined( level.springpad_attack_delay ) )
wait( level.springpad_attack_delay );
}
springpad_add_fling_ent( ent )
@ -530,15 +557,31 @@ springpad_add_fling_ent( ent )
springpad_expired( weapon )
{
weapon maps/mp/zombies/_zm_equipment::dropped_equipment_destroy( 1 );
self maps/mp/zombies/_zm_equipment::equipment_release( "equip_springpad_zm" );
weapon maps\mp\zombies\_zm_equipment::dropped_equipment_destroy( 1 );
self maps\mp\zombies\_zm_equipment::equipment_release( "equip_springpad_zm" );
self.springpad_kills = 0;
}
player_fling( origin, angles, velocity )
player_fling( origin, angles, velocity, weapon )
{
torigin = ( self.origin[0], self.origin[1], origin[2] );
self setorigin( ( origin + torigin ) * 0,5 );
aorigin = ( origin + torigin ) * 0.5;
trace = physicstrace( origin, torigin, vectorscale( ( -1, -1, 0 ), 15.0 ), ( 15, 15, 30 ), self );
if ( !isdefined( trace ) || !isdefined( trace["fraction"] ) || trace["fraction"] < 1.0 )
{
if ( !isdefined( weapon.springpad_kills ) )
weapon.springpad_kills = 0;
weapon.springpad_kills += 5;
if ( weapon.springpad_kills >= 28 )
weapon.owner thread springpad_expired( weapon );
return;
}
self setorigin( aorigin );
wait_network_frame();
self setvelocity( velocity );
}
@ -546,47 +589,44 @@ player_fling( origin, angles, velocity )
springpadthinkcleanup( trigger )
{
self waittill( "death" );
if ( isDefined( trigger ) )
{
if ( isdefined( trigger ) )
trigger delete();
}
}
debugspringpad( radius )
{
/#
color_armed = ( 0, 0, 1 );
color_unarmed = vectorScale( ( 0, 0, 1 ), 0,65 );
while ( isDefined( self ) )
color_armed = ( 0, 1, 0 );
color_unarmed = vectorscale( ( 1, 1, 0 ), 0.65 );
while ( isdefined( self ) )
{
if ( getDvarInt( #"EB512CB7" ) )
if ( getdvarint( _hash_EB512CB7 ) )
{
if ( isDefined( self.trigger ) )
if ( isdefined( self.trigger ) )
{
color = color_unarmed;
if ( isDefined( self.is_armed ) && self.is_armed )
{
if ( isdefined( self.is_armed ) && self.is_armed )
color = color_armed;
}
vec = self.trigger.extent;
box( self.trigger.origin, vec * -1, vec, self.trigger.angles[1], color, 1, 0, 1 );
}
color = ( 0, 0, 1 );
color = ( 0, 1, 0 );
text = "";
if ( isDefined( self.springpad_kills ) )
{
if ( isdefined( self.springpad_kills ) )
text = "" + self.springpad_kills + "";
}
else
{
if ( isDefined( self.owner.springpad_kills ) )
{
else if ( isdefined( self.owner.springpad_kills ) )
text = "[" + self.owner.springpad_kills + "]";
print3d( self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), text, color, 1, 0.5, 1 );
}
wait 0.05;
}
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 30 ), text, color, 1, 0,5, 1 );
}
wait 0,05;
#/
}
}

View File

@ -1,61 +1,126 @@
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_score;
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_pers_upgrades_functions;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_audio;
init( weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, has_weapon, give_weapon, take_weapon, flourish_fn )
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, has_weapon, give_weapon, take_weapon );
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 )
for ( i = 0; i < melee_weapon_triggers.size; i++ )
{
knife_model = getent( melee_weapon_triggers[i].target, "targetname" );
if ( isDefined( knife_model ) )
{
if ( isdefined( knife_model ) )
knife_model hide();
}
melee_weapon_triggers[ i ] thread melee_weapon_think( weapon_name, cost, has_weapon, give_weapon, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name );
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( "tu12_zombies_allow_hint_weapon_from_script" ) && !( 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" );
melee_weapon_triggers[ i ] usetriggerrequirelookat();
i++;
}
melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" );
i = 0;
while ( i < melee_weapon_structs.size )
else
{
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, has_weapon, give_weapon, take_weapon, flourish_fn );
i++;
}
register_melee_weapon_for_level( weapon_name );
if ( !isDefined( level.ballistic_weapon_name ) )
weapon_display = get_weapon_display_name( weapon_name );
hint_string = &"ZOMBIE_WEAPONCOSTONLY";
melee_weapon_triggers[i] sethintstring( hint_string, weapon_display, cost );
if ( getdvarint( "tu12_zombies_allow_hint_weapon_from_script" ) && !( isdefined( level.disable_melee_wallbuy_icons ) && level.disable_melee_wallbuy_icons ) )
{
level.ballistic_weapon_name = [];
cursor_hint = "HINT_WEAPON";
cursor_hint_weapon = weapon_name;
melee_weapon_triggers[i] setcursorhint( cursor_hint, cursor_hint_weapon );
}
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;
else
melee_weapon_triggers[i] setcursorhint( "HINT_NOICON" );
}
prepare_stub( stub, weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, has_weapon, give_weapon, take_weapon, flourish_fn )
melee_weapon_triggers[i] usetriggerrequirelookat();
}
melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" );
for ( i = 0; i < melee_weapon_structs.size; i++ )
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 );
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( stub ) )
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( "tu12_zombies_allow_hint_weapon_from_script" ) && !( 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( "tu12_zombies_allow_hint_weapon_from_script" ) && !( 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.has_weapon = has_weapon;
stub.give_weapon = give_weapon;
stub.take_weapon = take_weapon;
stub.vo_dialog_id = vo_dialog_id;
stub.flourish_weapon_name = flourish_weapon_name;
stub.ballistic_weapon_name = ballistic_weapon_name;
@ -68,48 +133,38 @@ prepare_stub( stub, weapon_name, flourish_weapon_name, ballistic_weapon_name, ba
add_stub( stub, weapon_name )
{
melee_weapon = undefined;
i = 0;
while ( i < level._melee_weapons.size )
for ( i = 0; i < level._melee_weapons.size; i++ )
{
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.has_weapon, melee_weapon.give_weapon, melee_weapon.take_weapon, melee_weapon.flourish_fn );
}
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 )
for ( i = 0; i < level._melee_weapons.size; i++ )
{
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.give_weapon, 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, has_weapon, give_weapon, take_weapon, flourish_fn )
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;
@ -120,373 +175,343 @@ add_melee_weapon( weapon_name, flourish_weapon_name, ballistic_weapon_name, ball
melee_weapon.wallbuy_targetname = wallbuy_targetname;
melee_weapon.hint_string = hint_string;
melee_weapon.vo_dialog_id = vo_dialog_id;
melee_weapon.has_weapon = has_weapon;
melee_weapon.give_weapon = give_weapon;
melee_weapon.take_weapon = take_weapon;
melee_weapon.flourish_fn = flourish_fn;
if ( !isDefined( level._melee_weapons ) )
{
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 true;
if ( isdefined( self get_player_melee_weapon() ) && self hasweapon( self get_player_melee_weapon() ) )
return false;
return true;
}
spectator_respawn_all()
{
i = 0;
while ( i < level._melee_weapons.size )
{
self [[ level._melee_weapons[ i ].take_weapon ]]();
i++;
}
i = 0;
while ( i < level._melee_weapons.size )
{
self spectator_respawn( level._melee_weapons[ i ].wallbuy_targetname, level._melee_weapons[ i ].take_weapon, level._melee_weapons[ i ].has_weapon );
i++;
}
for ( i = 0; i < level._melee_weapons.size; i++ )
self spectator_respawn( level._melee_weapons[i].wallbuy_targetname, level._melee_weapons[i].weapon_name );
}
spectator_respawn( wallbuy_targetname, take_weapon, has_weapon )
spectator_respawn( wallbuy_targetname, weapon_name )
{
melee_triggers = getentarray( wallbuy_targetname, "targetname" );
players = get_players();
i = 0;
while ( i < melee_triggers.size )
for ( i = 0; i < melee_triggers.size; i++ )
{
melee_triggers[i] setvisibletoall();
while ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
{
j = 0;
while ( j < players.size )
{
if ( players[ j ] [[ has_weapon ]]() )
for ( j = 0; j < players.size; j++ )
{
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 )
{
for ( i = 0; i < level._melee_weapons.size; i++ )
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 )
{
for ( i = 0; i < melee_triggers.size; i++ )
melee_triggers[i] setinvisibletoplayer( self );
i++;
}
}
has_any_ballistic_knife()
{
if ( self hasweapon( "knife_ballistic_zm" ) )
{
return 1;
}
return true;
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
{
return 1;
}
i = 0;
while ( i < level._melee_weapons.size )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{
if ( self hasweapon( level._melee_weapons[i].ballistic_weapon_name ) )
{
return 1;
}
return true;
if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
{
return 1;
return true;
}
i++;
}
return 0;
return false;
}
has_upgraded_ballistic_knife()
{
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
{
return 1;
}
i = 0;
while ( i < level._melee_weapons.size )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{
if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
{
return 1;
return true;
}
i++;
}
return 0;
return false;
}
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 ] ) )
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 ] ) )
{
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 ) )
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 )
for ( i = 0; i < primaryweapons.size; i++ )
{
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 ) );
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, has_weapon, give_weapon, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name )
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 ) )
if ( isdefined( self.stub ) )
{
self endon( "kill_trigger" );
if ( isDefined( self.stub.first_time_triggered ) )
{
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;
has_weapon = self.stub.has_weapon;
give_weapon = self.stub.give_weapon;
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 )
if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
{
i = 0;
while ( i < players.size )
{
if ( players[ i ] [[ has_weapon ]]() )
for ( i = 0; i < players.size; i++ )
{
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 );
player thread ignore_triggers( 0.5 );
continue;
}
else if ( player in_revive_trigger() )
if ( player in_revive_trigger() )
{
wait 0,1;
wait 0.1;
continue;
}
else if ( player isthrowinggrenade() )
if ( player isthrowinggrenade() )
{
wait 0,1;
wait 0.1;
continue;
}
else if ( player.is_drinking > 0 )
if ( player.is_drinking > 0 )
{
wait 0,1;
wait 0.1;
continue;
}
else if ( player hasweapon( weapon_name ) || player has_powerup_weapon() )
if ( player hasweapon( weapon_name ) || player has_powerup_weapon() )
{
wait 0,1;
wait 0.1;
continue;
}
else
{
if ( player isswitchingweapons() )
{
wait 0,1;
break;
wait 0.1;
continue;
}
else current_weapon = player getcurrentweapon();
if ( !is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) && player has_powerup_weapon() )
current_weapon = player getcurrentweapon();
if ( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) || player has_powerup_weapon() )
{
wait 0,1;
break;
wait 0.1;
continue;
}
else
if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( player.intermission ) && player.intermission )
{
if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission )
{
wait 0,1;
break;
wait 0.1;
continue;
}
else
{
player_has_weapon = player [[ has_weapon ]]();
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 ) )
{
if ( isdefined( model ) )
model thread melee_weapon_show( player );
}
else
{
if ( isDefined( self.clientfieldname ) )
{
else if ( isdefined( self.clientfieldname ) )
level setclientfield( self.clientfieldname, 1 );
}
}
self.first_time_triggered = 1;
if ( isDefined( self.stub ) )
{
if ( isdefined( self.stub ) )
self.stub.first_time_triggered = 1;
}
}
player maps/mp/zombies/_zm_score::minus_to_player_score( cost );
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, give_weapon, flourish_fn, self );
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 );
player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon", undefined, 1 );
}
break;
continue;
}
else
{
if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
{
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_angles = vectortoangles( player.origin - self.origin );
player_yaw = player_angles[1];
weapon_yaw = self.angles[1];
yaw_diff = angleClamp180( player_yaw - weapon_yaw );
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.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, give_weapon, flourish_fn, trigger )
{
if ( isDefined( flourish_fn ) )
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 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 )
{
if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( self.intermission ) && self.intermission )
return;
}
self [[ give_weapon ]]();
if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
{
if ( isDefined( trigger ) )
if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
{
if ( isdefined( trigger ) )
trigger setinvisibletoplayer( self );
}
self trigger_hide_all();
}
}
@ -512,19 +537,21 @@ do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_
#/
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 )
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();
@ -537,20 +564,17 @@ do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_
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 )
{
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 )
{
if ( !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( isdefined( self.intermission ) && self.intermission ) )
self decrement_is_drinking();
}
}

View File

@ -1,10 +1,15 @@
#include maps/mp/zombies/_zm_stats;
#include common_scripts/utility;
#include maps/mp/_utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_stats;
init()
{
if ( isDefined( level._uses_retrievable_ballisitic_knives ) && level._uses_retrievable_ballisitic_knives == 1 )
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" );
@ -17,9 +22,12 @@ on_spawn( watcher, player )
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 ) )
if ( isdefined( endpos ) )
{
retrievable_model = spawn( "script_model", endpos );
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
@ -27,47 +35,38 @@ on_spawn( watcher, player )
retrievable_model.owner = player;
retrievable_model.angles = angles;
retrievable_model.name = watcher.weapon;
if ( isDefined( prey ) )
if ( isdefined( prey ) )
{
if ( isplayer( prey ) && player.team == prey.team )
{
isfriendly = 1;
}
else
{
if ( isai( prey ) && player.team == prey.team )
{
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 )
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" );
}
player notify( "ballistic_knife_stationary", retrievable_model, normal );
else
{
player notify( "ballistic_knife_stationary" );
}
player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
retrievable_model thread wait_to_show_glowing_model( prey );
}
}
@ -86,13 +85,15 @@ on_spawn_retrieve_trigger( watcher, player )
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 ) )
{
if ( !isdefined( retrievable_model ) )
return;
}
trigger_pos = [];
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
{
trigger_pos[0] = prey.origin[0];
trigger_pos[1] = prey.origin[1];
@ -100,38 +101,43 @@ on_spawn_retrieve_trigger( watcher, player )
}
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 ] );
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.0;
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 ) )
{
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 ) )
{
if ( isdefined( prey ) )
pickup_trigger linkto( prey );
}
else
{
pickup_trigger linkto( retrievable_model );
}
if ( isDefined( level.knife_planted ) )
{
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 );
}
@ -140,12 +146,13 @@ debug_print( endpos )
{
/#
self endon( "death" );
while ( 1 )
while ( true )
{
print3d( endpos, "pickup_trigger" );
wait 0,05;
#/
wait 0.05;
}
#/
}
watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse )
@ -153,54 +160,63 @@ watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundo
self endon( "death" );
self endon( "delete" );
level endon( "game_ended" );
while ( 1 )
max_ammo = weaponmaxammo( weapon ) + 1;
autorecover = is_true( level.ballistic_knife_autorecover );
while ( true )
{
trigger waittill( "trigger", player );
while ( !isalive( player ) )
{
if ( !isalive( player ) )
continue;
}
while ( !player isonground() )
{
if ( !player isonground() && !is_true( trigger.force_pickup ) )
continue;
}
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
{
if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
continue;
}
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
{
if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
continue;
}
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() )
{
if ( isDefined( playersoundonuse ) )
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 ) )
{
if ( isdefined( npcsoundonuse ) )
player playsound( npcsoundonuse );
}
player thread [[ callback ]]( weapon, model, trigger );
return;
}
else
{
break;
}
}
}
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;
@ -212,27 +228,28 @@ pick_up( weapon, model, trigger )
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" );
}
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 ) )
if ( isdefined( self ) )
{
if ( isdefined( self.glowing_model ) )
self.glowing_model delete();
}
self delete();
}
}
watch_shutdown( trigger, model )
{
self waittill_any( "death", "disconnect", "zmb_lost_knife" );
self waittill_any( "death_or_disconnect", "zmb_lost_knife" );
trigger destroy_ent();
model destroy_ent();
}
@ -241,12 +258,14 @@ 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 ) )
if ( distancesquared( origin, self.origin ) < radius * radius )
{
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) );
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
self thread update_retrieve_trigger( player );
}
}
@ -256,9 +275,11 @@ 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 physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
self thread update_retrieve_trigger( player );
}
@ -266,12 +287,15 @@ update_retrieve_trigger( player )
{
self endon( "death" );
player endon( "zmb_lost_knife" );
if ( isDefined( level.custom_update_retrieve_trigger ) )
if ( isdefined( level.custom_update_retrieve_trigger ) )
{
self [[ level.custom_update_retrieve_trigger ]]( player );
return;
}
self waittill( "stationary" );
trigger = self.retrievabletrigger;
trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
trigger linkto( self );

View File

@ -1,53 +1,19 @@
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_melee_weapon;
#include maps\mp\zombies\_zm_weapons;
init()
{
if ( isDefined( level.bowie_cost ) )
{
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", ::has_bowie, ::give_bowie, ::take_bowie, ::bowie_flourish );
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" );
}
spectator_respawn()
{
maps/mp/zombies/_zm_melee_weapon::spectator_respawn( "bowie_upgrade", ::take_bowie, ::has_bowie );
}
has_bowie()
{
if ( is_true( level._allow_melee_weapon_switching ) )
{
return 0;
}
if ( !is_true( self._sickle_zm_equipped ) || is_true( self._bowie_zm_equipped ) && is_true( self._tazer_zm_equipped ) )
{
return 1;
}
return 0;
}
give_bowie()
{
self._bowie_zm_equipped = 1;
self._sickle_zm_equipped = undefined;
self._tazer_zm_equipped = undefined;
}
take_bowie()
{
self._bowie_zm_equipped = undefined;
}
bowie_flourish()
{
maps\mp\zombies\_zm_melee_weapon::init( "bowie_knife_zm", "zombie_bowie_flourish", "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", cost, "bowie_upgrade", &"ZOMBIE_WEAPON_BOWIE_BUY", "bowie", undefined );
maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie" );
maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie_upgraded" );
}

View File

@ -1,29 +1,30 @@
#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_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\gametypes_zm\_weaponobjects;
init()
{
if ( !isDefined( level.claymores_max_per_player ) )
{
if ( !isdefined( level.claymores_max_per_player ) )
level.claymores_max_per_player = 12;
}
trigs = getentarray( "claymore_purchase", "targetname" );
i = 0;
while ( i < trigs.size )
for ( i = 0; i < trigs.size; i++ )
{
model = getent( trigs[i].target, "targetname" );
if ( isDefined( model ) )
{
if ( isdefined( model ) )
model hide();
}
i++;
}
array_thread( trigs, ::buy_claymores );
level thread give_claymores_after_rounds();
level.claymores_on_damage = ::satchel_damage;
@ -38,28 +39,30 @@ buy_claymores()
{
self.zombie_cost = 1000;
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
self setcursorhint( "HINT_NOICON" );
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
self endon( "kill_trigger" );
if ( !isDefined( self.stub ) )
{
if ( !isdefined( self.stub ) )
return;
}
if ( isDefined( self.stub ) && !isDefined( self.stub.claymores_triggered ) )
{
if ( isdefined( self.stub ) && !isdefined( self.stub.claymores_triggered ) )
self.stub.claymores_triggered = 0;
}
self.claymores_triggered = self.stub.claymores_triggered;
while ( 1 )
while ( true )
{
self waittill( "trigger", who );
while ( who in_revive_trigger() )
if ( who in_revive_trigger() )
continue;
if ( who has_powerup_weapon() )
{
wait 0.1;
continue;
}
while ( who has_powerup_weapon() )
{
wait 0,1;
}
if ( is_player_valid( who ) )
{
if ( who.score >= self.zombie_cost )
@ -67,43 +70,41 @@ buy_claymores()
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 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 ) )
{
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 );
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" );
for ( i = 0; i < trigs.size; i++ )
trigs[i] setinvisibletoplayer( who );
}
else
who thread show_claymore_hint( "already_purchased" );
}
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" );
who play_sound_on_ent( "no_purchase" );
who maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon" );
}
}
}
@ -113,31 +114,32 @@ claymore_unitrigger_update_prompt( player )
{
if ( player is_player_placeable_mine( "claymore_zm" ) )
{
return 0;
self sethintstring( "" );
self setcursorhint( "HINT_NOICON" );
return false;
}
return 1;
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
return true;
}
set_claymore_visible()
{
players = get_players();
trigs = getentarray( "claymore_purchase", "targetname" );
while ( 1 )
while ( true )
{
j = 0;
while ( j < players.size )
for ( j = 0; j < players.size; j++ )
{
while ( !players[ j ] is_player_placeable_mine( "claymore_zm" ) )
{
i = 0;
while ( i < trigs.size )
if ( !players[j] is_player_placeable_mine( "claymore_zm" ) )
{
for ( i = 0; i < trigs.size; i++ )
trigs[i] setinvisibletoplayer( players[j], 0 );
i++;
}
}
j++;
}
wait 1;
players = get_players();
}
@ -146,60 +148,57 @@ set_claymore_visible()
claymore_safe_to_plant()
{
if ( self.owner.claymores.size >= level.claymores_max_per_player )
{
return 0;
}
if ( isDefined( level.claymore_safe_to_plant ) )
{
if ( isdefined( level.claymore_safe_to_plant ) )
return self [[ level.claymore_safe_to_plant ]]();
}
return 1;
}
claymore_wait_and_detonate()
{
wait 0,1;
wait 0.1;
self detonate( self.owner );
}
claymore_watch()
{
self endon( "death" );
while ( 1 )
self notify( "claymore_watch" );
self endon( "claymore_watch" );
while ( true )
{
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 ) )
{
if ( isdefined( level.claymore_planted ) )
self thread [[ level.claymore_planted ]]( claymore );
}
claymore thread satchel_damage();
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;
self maps\mp\zombies\_zm_stats::increment_client_stat( "claymores_planted" );
self maps\mp\zombies\_zm_stats::increment_player_stat( "claymores_planted" );
}
else
{
claymore thread claymore_wait_and_detonate();
}
}
}
}
claymore_setup()
{
if ( !isDefined( self.claymores ) )
{
if ( !isdefined( self.claymores ) )
self.claymores = [];
}
self thread claymore_watch();
self giveweapon( "claymore_zm" );
self set_player_placeable_mine( "claymore_zm" );
@ -209,22 +208,22 @@ claymore_setup()
adjust_trigger_origin( origin )
{
origin += vectorScale( ( 0, 0, 1 ), 20 );
origin += vectorscale( ( 0, 0, 1 ), 20.0 );
return origin;
}
on_spawn_retrieve_trigger( watcher, player )
{
self maps/mp/gametypes_zm/_weaponobjects::onspawnretrievableweaponobject( watcher, player );
if ( isDefined( self.pickuptrigger ) )
{
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();
@ -238,6 +237,7 @@ pickup_claymores()
{
clip_ammo = player getweaponammoclip( self.name );
clip_max_ammo = weaponclipsize( self.name );
if ( clip_ammo >= clip_max_ammo )
{
self destroy_ent();
@ -245,15 +245,16 @@ pickup_claymores()
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" );
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 )
@ -265,13 +266,15 @@ pickup_claymores_trigger_listener( trigger, player )
pickup_claymores_trigger_listener_enable( trigger, player )
{
self endon( "delete" );
while ( 1 )
self endon( "death" );
while ( true )
{
player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" );
if ( !isDefined( trigger ) )
{
if ( !isdefined( trigger ) )
return;
}
trigger trigger_on();
trigger linkto( self );
}
@ -280,13 +283,15 @@ pickup_claymores_trigger_listener_enable( trigger, player )
pickup_claymores_trigger_listener_disable( trigger, player )
{
self endon( "delete" );
while ( 1 )
self endon( "death" );
while ( true )
{
player waittill( "zmb_disable_claymore_prompt" );
if ( !isDefined( trigger ) )
{
if ( !isdefined( trigger ) )
return;
}
trigger unlink();
trigger trigger_off();
}
@ -294,14 +299,14 @@ pickup_claymores_trigger_listener_disable( trigger, player )
shouldaffectweaponobject( object )
{
pos = self.origin + vectorScale( ( 0, 0, 1 ), 32 );
pos = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 );
dirtopos = pos - object.origin;
objectforward = anglesToForward( object.angles );
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;
@ -316,44 +321,40 @@ claymore_detonation()
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 )
while ( true )
{
damagearea waittill( "trigger", ent );
if ( isDefined( self.owner ) && ent == self.owner )
{
if ( isdefined( self.owner ) && ent == self.owner )
continue;
}
while ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == self.team )
{
if ( isdefined( ent.pers ) && isdefined( ent.pers["team"] ) && ent.pers["team"] == self.team )
continue;
}
if ( isDefined( ent.ignore_claymore ) && ent.ignore_claymore )
{
if ( isdefined( ent.ignore_claymore ) && ent.ignore_claymore )
continue;
}
while ( !ent shouldaffectweaponobject( self ) )
{
if ( !ent shouldaffectweaponobject( self ) )
continue;
}
if ( ent damageconetrace( self.origin, self ) > 0 )
{
self playsound( "wpn_claymore_alert" );
wait 0,4;
if ( isDefined( self.owner ) )
{
wait 0.4;
if ( isdefined( self.owner ) )
self detonate( self.owner );
}
else
{
self detonate( undefined );
}
return;
}
}
@ -362,53 +363,53 @@ claymore_detonation()
delete_claymores_on_death( player, ent )
{
self waittill( "death" );
if ( isDefined( player ) )
{
if ( isdefined( player ) )
arrayremovevalue( player.claymores, self );
}
wait 0,05;
if ( isDefined( ent ) )
{
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 )
while ( true )
{
self waittill( "damage", amount, attacker );
if ( !isDefined( self ) )
{
if ( !isdefined( self ) )
return;
}
self.health = self.maxhealth;
while ( !isplayer( attacker ) )
{
if ( !isplayer( attacker ) )
continue;
}
if ( isDefined( self.owner ) && attacker == self.owner )
{
if ( isdefined( self.owner ) && attacker == self.owner )
continue;
}
while ( isDefined( attacker.pers ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] != level.zombie_team )
{
if ( isdefined( attacker.pers ) && isdefined( attacker.pers["team"] ) && attacker.pers["team"] != level.zombie_team )
continue;
break;
}
}
if ( level.satchelexplodethisframe )
{
wait ( 0,1 + randomfloat( 0,4 ) );
}
else wait 0,05;
if ( !isDefined( self ) )
{
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 );
@ -416,7 +417,7 @@ satchel_damage()
reset_satchel_explode_this_frame()
{
wait 0,05;
wait 0.05;
level.satchelexplodethisframe = 0;
}
@ -429,14 +430,15 @@ play_claymore_effects()
give_claymores_after_rounds()
{
while ( 1 )
while ( true )
{
level waittill( "between_round_over" );
while ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) )
if ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) )
{
players = get_players();
i = 0;
while ( i < players.size )
for ( i = 0; i < players.size; i++ )
{
if ( players[i] is_player_placeable_mine( "claymore_zm" ) )
{
@ -445,48 +447,20 @@ give_claymores_after_rounds()
players[i] setactionslot( 4, "weapon", "claymore_zm" );
players[i] setweaponammoclip( "claymore_zm", 2 );
}
i++;
}
}
}
}
init_hint_hudelem( x, y, alignx, aligny, fontscale, alpha )
{
self.x = x;
self.y = y;
self.alignx = alignx;
self.aligny = aligny;
self.fontscale = fontscale;
self.alpha = alpha;
self.sort = 20;
}
setup_client_hintelem()
{
self endon( "death" );
self endon( "disconnect" );
if ( !isDefined( self.hintelem ) )
{
self.hintelem = newclienthudelem( self );
}
self.hintelem init_hint_hudelem( 320, 220, "center", "bottom", 1,6, 1 );
}
show_claymore_hint( string )
{
self endon( "death" );
self endon( "disconnect" );
if ( string == "claymore_purchased" )
{
text = &"ZOMBIE_CLAYMORE_HOWTO";
}
else
{
text = &"ZOMBIE_CLAYMORE_ALREADY_PURCHASED";
}
self setup_client_hintelem();
self.hintelem settext( text );
wait 3,5;
self.hintelem settext( "" );
show_equipment_hint_text( text );
}

View File

@ -1,565 +0,0 @@
#include maps/mp/zombies/_zm_clone;
#include maps/mp/zombies/_zm_laststand;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
#using_animtree( "zombie_cymbal_monkey" );
init()
{
if ( !cymbal_monkey_exists() )
{
return;
}
/#
level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey;
#/
level._effect[ "monkey_glow" ] = loadfx( "maps/zombie/fx_zombie_monkey_light" );
level._effect[ "grenade_samantha_steal" ] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" );
level.cymbal_monkeys = [];
scriptmodelsuseanimtree( -1 );
}
player_give_cymbal_monkey()
{
self giveweapon( "cymbal_monkey_zm" );
self set_player_tactical_grenade( "cymbal_monkey_zm" );
self thread player_handle_cymbal_monkey();
}
player_handle_cymbal_monkey()
{
self notify( "starting_monkey_watch" );
self endon( "disconnect" );
self endon( "starting_monkey_watch" );
attract_dist_diff = level.monkey_attract_dist_diff;
if ( !isDefined( attract_dist_diff ) )
{
attract_dist_diff = 45;
}
num_attractors = level.num_monkey_attractors;
if ( !isDefined( num_attractors ) )
{
num_attractors = 96;
}
max_attract_dist = level.monkey_attract_dist;
if ( !isDefined( max_attract_dist ) )
{
max_attract_dist = 1536;
}
while ( 1 )
{
grenade = get_thrown_monkey();
self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff );
wait 0,05;
}
}
watch_for_dud( model, actor )
{
self endon( "death" );
self waittill( "grenade_dud" );
model.dud = 1;
self playsound( "zmb_vox_monkey_scream" );
self.monk_scream_vox = 1;
wait 3;
if ( isDefined( model ) )
{
model delete();
}
if ( isDefined( actor ) )
{
actor delete();
}
if ( isDefined( self.damagearea ) )
{
self.damagearea delete();
}
if ( isDefined( self ) )
{
self delete();
}
}
watch_for_emp( model, actor )
{
self endon( "death" );
while ( 1 )
{
level waittill( "emp_detonate", origin, radius );
if ( distancesquared( origin, self.origin ) < ( radius * radius ) )
{
break;
}
else
{
}
}
self.stun_fx = 1;
if ( isDefined( level._equipment_emp_destroy_fx ) )
{
playfx( level._equipment_emp_destroy_fx, self.origin + vectorScale( ( 0, 0, -1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) );
}
wait 0,15;
self.attract_to_origin = 0;
self deactivate_zombie_point_of_interest();
model clearanim( %o_monkey_bomb, 0 );
wait 1;
self detonate();
wait 1;
if ( isDefined( model ) )
{
model delete();
}
if ( isDefined( actor ) )
{
actor delete();
}
if ( isDefined( self.damagearea ) )
{
self.damagearea delete();
}
if ( isDefined( self ) )
{
self delete();
}
}
clone_player_angles( owner )
{
self endon( "death" );
owner endon( "death" );
while ( isDefined( self ) )
{
self.angles = owner.angles;
wait 0,05;
}
}
show_briefly( showtime )
{
self endon( "show_owner" );
if ( isDefined( self.show_for_time ) )
{
self.show_for_time = showtime;
return;
}
self.show_for_time = showtime;
self setvisibletoall();
while ( self.show_for_time > 0 )
{
self.show_for_time -= 0,05;
wait 0,05;
}
self setvisibletoallexceptteam( level.zombie_team );
self.show_for_time = undefined;
}
show_owner_on_attack( owner )
{
owner endon( "hide_owner" );
owner endon( "show_owner" );
self endon( "explode" );
self endon( "death" );
self endon( "grenade_dud" );
owner.show_for_time = undefined;
for ( ;; )
{
owner waittill( "weapon_fired" );
owner thread show_briefly( 0,5 );
}
}
hide_owner( owner )
{
owner notify( "hide_owner" );
owner endon( "hide_owner" );
owner setperk( "specialty_immunemms" );
owner.no_burning_sfx = 1;
owner notify( "stop_flame_sounds" );
owner setvisibletoallexceptteam( level.zombie_team );
owner.hide_owner = 1;
if ( isDefined( level._effect[ "human_disappears" ] ) )
{
playfx( level._effect[ "human_disappears" ], owner.origin );
}
self thread show_owner_on_attack( owner );
evt = self waittill_any_return( "explode", "death", "grenade_dud" );
/#
println( "ZMCLONE: Player visible again because of " + evt );
#/
owner notify( "show_owner" );
owner unsetperk( "specialty_immunemms" );
if ( isDefined( level._effect[ "human_disappears" ] ) )
{
playfx( level._effect[ "human_disappears" ], owner.origin );
}
owner.no_burning_sfx = undefined;
owner setvisibletoall();
owner.hide_owner = undefined;
owner show();
}
proximity_detonate( owner )
{
wait 1,5;
if ( !isDefined( self ) )
{
return;
}
detonateradius = 96;
explosionradius = detonateradius * 2;
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 1,5 );
damagearea setexcludeteamfortrigger( owner.team );
damagearea enablelinkto();
damagearea linkto( self );
self.damagearea = damagearea;
while ( isDefined( self ) )
{
damagearea waittill( "trigger", ent );
if ( isDefined( owner ) && ent == owner )
{
continue;
}
if ( isDefined( ent.team ) && ent.team == owner.team )
{
continue;
}
self playsound( "wpn_claymore_alert" );
dist = distance( self.origin, ent.origin );
radiusdamage( self.origin + vectorScale( ( 0, 0, -1 ), 12 ), explosionradius, 1, 1, owner, "MOD_GRENADE_SPLASH", "cymbal_monkey_zm" );
if ( isDefined( owner ) )
{
self detonate( owner );
}
else
{
self detonate( undefined );
}
break;
}
if ( isDefined( damagearea ) )
{
damagearea delete();
}
}
player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff )
{
self endon( "disconnect" );
self endon( "starting_monkey_watch" );
if ( isDefined( grenade ) )
{
grenade endon( "death" );
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{
if ( isDefined( grenade.damagearea ) )
{
grenade.damagearea delete();
}
grenade delete();
return;
}
grenade hide();
model = spawn( "script_model", grenade.origin );
model setmodel( "weapon_zombie_monkey_bomb" );
model useanimtree( -1 );
model linkto( grenade );
model.angles = grenade.angles;
model thread monkey_cleanup( grenade );
clone = undefined;
if ( isDefined( level.cymbal_monkey_dual_view ) && level.cymbal_monkey_dual_view )
{
model setvisibletoallexceptteam( level.zombie_team );
clone = maps/mp/zombies/_zm_clone::spawn_player_clone( self, vectorScale( ( 0, 0, -1 ), 999 ), level.cymbal_monkey_clone_weapon, undefined );
model.simulacrum = clone;
clone maps/mp/zombies/_zm_clone::clone_animate( "idle" );
clone thread clone_player_angles( self );
clone notsolid();
clone ghost();
}
grenade thread watch_for_dud( model, clone );
grenade thread watch_for_emp( model, clone );
info = spawnstruct();
info.sound_attractors = [];
grenade thread monitor_zombie_groans( info );
grenade waittill( "stationary" );
if ( isDefined( level.grenade_planted ) )
{
self thread [[ level.grenade_planted ]]( grenade, model );
}
if ( isDefined( grenade ) )
{
if ( isDefined( model ) )
{
model setanim( %o_monkey_bomb );
if ( isDefined( grenade.backlinked ) && !grenade.backlinked )
{
model unlink();
model.origin = grenade.origin;
model.angles = grenade.angles;
}
}
if ( isDefined( clone ) )
{
clone forceteleport( grenade.origin, grenade.angles );
clone thread hide_owner( self );
grenade thread proximity_detonate( self );
clone show();
clone setinvisibletoall();
clone setvisibletoteam( level.zombie_team );
}
grenade resetmissiledetonationtime();
playfxontag( level._effect[ "monkey_glow" ], model, "origin_animate_jnt" );
valid_poi = check_point_in_enabled_zone( grenade.origin, undefined, undefined );
if ( isDefined( level.check_valid_poi ) )
{
valid_poi = grenade [[ level.check_valid_poi ]]( valid_poi );
}
if ( valid_poi )
{
grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 );
grenade.attract_to_origin = 1;
grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff );
grenade thread wait_for_attractor_positions_complete();
grenade thread do_monkey_sound( model, info );
level.cymbal_monkeys[ level.cymbal_monkeys.size ] = grenade;
}
else
{
grenade.script_noteworthy = undefined;
level thread grenade_stolen_by_sam( grenade, model, clone );
}
return;
}
else
{
grenade.script_noteworthy = undefined;
level thread grenade_stolen_by_sam( grenade, model, clone );
}
}
}
grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor )
{
if ( !isDefined( ent_model ) )
{
return;
}
direction = ent_model.origin;
direction = ( direction[ 1 ], direction[ 0 ], 0 );
if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 )
{
direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 );
}
else
{
if ( direction[ 0 ] < 0 )
{
direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 );
}
}
players = get_players();
i = 0;
while ( i < players.size )
{
if ( isalive( players[ i ] ) )
{
players[ i ] playlocalsound( level.zmb_laugh_alias );
}
i++;
}
playfxontag( level._effect[ "grenade_samantha_steal" ], ent_model, "tag_origin" );
ent_model movez( 60, 1, 0,25, 0,25 );
ent_model vibrate( direction, 1,5, 2,5, 1 );
ent_model waittill( "movedone" );
if ( isDefined( self.damagearea ) )
{
self.damagearea delete();
}
ent_model delete();
if ( isDefined( ent_actor ) )
{
ent_actor delete();
}
if ( isDefined( ent_grenade ) )
{
if ( isDefined( ent_grenade.damagearea ) )
{
ent_grenade.damagearea delete();
}
ent_grenade delete();
}
}
wait_for_attractor_positions_complete()
{
self waittill( "attractor_positions_generated" );
self.attract_to_origin = 0;
}
monkey_cleanup( parent )
{
while ( 1 )
{
if ( !isDefined( parent ) )
{
if ( isDefined( self ) && isDefined( self.dud ) && self.dud )
{
wait 6;
}
if ( isDefined( self.simulacrum ) )
{
self.simulacrum delete();
}
self_delete();
return;
}
wait 0,05;
}
}
do_monkey_sound( model, info )
{
self.monk_scream_vox = 0;
if ( isDefined( level.grenade_safe_to_bounce ) )
{
if ( !( [[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) )
{
self playsound( "zmb_vox_monkey_scream" );
self.monk_scream_vox = 1;
}
}
if ( !self.monk_scream_vox && level.music_override == 0 )
{
if ( isDefined( level.cymbal_monkey_dual_view ) && level.cymbal_monkey_dual_view )
{
self playsoundtoteam( "zmb_monkey_song", "allies" );
}
else
{
self playsound( "zmb_monkey_song" );
}
}
if ( !self.monk_scream_vox )
{
self thread play_delayed_explode_vox();
}
self waittill( "explode", position );
level notify( "grenade_exploded" );
monkey_index = -1;
i = 0;
while ( i < level.cymbal_monkeys.size )
{
if ( !isDefined( level.cymbal_monkeys[ i ] ) )
{
monkey_index = i;
break;
}
else
{
i++;
}
}
if ( monkey_index >= 0 )
{
arrayremoveindex( level.cymbal_monkeys, monkey_index );
}
if ( isDefined( model ) )
{
model clearanim( %o_monkey_bomb, 0,2 );
}
i = 0;
while ( i < info.sound_attractors.size )
{
if ( isDefined( info.sound_attractors[ i ] ) )
{
info.sound_attractors[ i ] notify( "monkey_blown_up" );
}
i++;
}
}
play_delayed_explode_vox()
{
wait 6,5;
if ( isDefined( self ) )
{
self playsound( "zmb_vox_monkey_explode" );
}
}
get_thrown_monkey()
{
self endon( "disconnect" );
self endon( "starting_monkey_watch" );
while ( 1 )
{
self waittill( "grenade_fire", grenade, weapname );
if ( weapname == "cymbal_monkey_zm" )
{
grenade.use_grenade_special_long_bookmark = 1;
grenade.grenade_multiattack_bookmark_count = 1;
return grenade;
}
wait 0,05;
}
}
monitor_zombie_groans( info )
{
self endon( "explode" );
while ( 1 )
{
if ( !isDefined( self ) )
{
return;
}
while ( !isDefined( self.attractor_array ) )
{
wait 0,05;
}
i = 0;
while ( i < self.attractor_array.size )
{
if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[ i ] ) )
{
if ( isDefined( self.origin ) && isDefined( self.attractor_array[ i ].origin ) )
{
if ( distancesquared( self.origin, self.attractor_array[ i ].origin ) < 250000 )
{
info.sound_attractors[ info.sound_attractors.size ] = self.attractor_array[ i ];
self.attractor_array[ i ] thread play_zombie_groans();
}
}
}
i++;
}
wait 0,05;
}
}
play_zombie_groans()
{
self endon( "death" );
self endon( "monkey_blown_up" );
while ( 1 )
{
if ( isDefined( self ) )
{
self playsound( "zmb_vox_zombie_groan" );
wait randomfloatrange( 2, 3 );
continue;
}
else
{
return;
}
}
}
cymbal_monkey_exists()
{
return isDefined( level.zombie_weapons[ "cymbal_monkey_zm" ] );
}

View File

@ -1,73 +1,67 @@
#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;
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zombies\_zm_melee_weapon;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_audio;
init()
{
registerclientfield( "toplayer", "tazer_flourish", 1, 1, "int" );
register_melee_weapon_for_level( "tazer_knuckles_zm" );
if ( isDefined( level.tazer_cost ) )
{
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", ::has_tazer, ::give_tazer, ::take_tazer, ::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 );
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;
}
spectator_respawn()
{
maps/mp/zombies/_zm_melee_weapon::spectator_respawn( "tazer_upgrade", ::take_tazer, ::has_tazer );
level.tazer_flourish_delay = 0.5;
}
watch_bodily_functions()
{
if ( isDefined( self.isscreecher ) || self.isscreecher && isDefined( self.is_avogadro ) && self.is_avogadro )
{
if ( isdefined( self.isscreecher ) && self.isscreecher || isdefined( self.is_avogadro ) && self.is_avogadro )
return;
}
while ( 1 )
while ( isdefined( self ) && isalive( self ) )
{
self waittill( "damage", amount, attacker, direction_vec, point, type );
if ( !isDefined( self ) )
{
if ( !isdefined( self ) )
return;
}
if ( !isDefined( attacker ) || !isplayer( attacker ) )
{
if ( !isdefined( attacker ) || !isplayer( attacker ) )
continue;
}
while ( type != "MOD_MELEE" )
{
if ( type != "MOD_MELEE" )
continue;
}
if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped )
{
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 = [];
@ -86,9 +80,11 @@ onplayerconnect()
onplayerspawned()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "spawned_player" );
self thread watchtazerknucklemelee();
}
}
@ -96,53 +92,30 @@ onplayerspawned()
watchtazerknucklemelee()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "weapon_melee", weapon );
if ( weapon == "tazer_knuckles_zm" )
{
self tazerknuckle_melee();
}
}
}
tazerknuckle_melee()
{
}
has_tazer()
{
if ( isDefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching )
{
return 0;
}
if ( isDefined( self._sickle_zm_equipped ) && !self._sickle_zm_equipped && isDefined( self._bowie_zm_equipped ) || self._bowie_zm_equipped && isDefined( self._tazer_zm_equipped ) && self._tazer_zm_equipped )
{
return 1;
}
return 0;
}
give_tazer()
{
self._tazer_zm_equipped = 1;
self._bowie_zm_equipped = undefined;
self._sickle_zm_equipped = undefined;
}
take_tazer()
{
self._tazer_zm_equipped = undefined;
}
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" );
wait( level.tazer_flourish_delay );
self thread maps\mp\zombies\_zm_audio::playerexert( "hitmed" );
self setclientfieldtoplayer( "tazer_flourish", 1 );
wait_network_frame();
self setclientfieldtoplayer( "tazer_flourish", 0 );

View File

@ -0,0 +1,327 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_audio;
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 false;
if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) )
return false;
return true;
}
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 ( true )
{
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 );
if ( !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"];
if ( !triggerweaponslockerisvalidweapon( weapontogive ) )
{
player playlocalsound( level.zmb_laugh_alias );
player wl_clear_stored_weapondata();
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
continue;
}
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 );
if ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base )
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
wait 3;
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
continue;
}
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 );
if ( !triggerweaponslockerisvalidweapon( curweapon ) )
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
wait 3;
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
continue;
}
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 ( true )
{
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;
}