[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; // T6 GSC SOURCE
#include maps/mp/animscripts/traverse/shared; // Decompiled by https://github.com/xensik/gsc-tool
#include maps\mp\animscripts\traverse\shared;
#include maps\mp\animscripts\traverse\zm_shared;
main() main()
{ {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,45 +1,46 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zombies/_zm; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_ai_dogs; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_stats; #include maps\mp\gametypes_zm\_hud_util;
#include maps/mp/gametypes_zm/_zm_gametype; #include common_scripts\utility;
#include common_scripts/utility; #include maps\mp\gametypes_zm\_zm_gametype;
#include maps/mp/gametypes_zm/_hud_util; #include maps\mp\zombies\_zm_stats;
#include maps/mp/_utility; #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.onprecachegametype = ::onprecachegametype;
level.onstartgametype = ::onstartgametype; level.onstartgametype = ::onstartgametype;
level._game_module_custom_spawn_init_func = maps/mp/gametypes_zm/_zm_gametype::custom_spawn_init_func; 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; 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" ); maps\mp\gametypes_zm\_zm_gametype::post_gametype_main( "zstandard" );
} }
onprecachegametype() //checked matches cerberus output onprecachegametype()
{ {
level.playersuicideallowed = 1; level.playersuicideallowed = 1;
level.canplayersuicide = ::canplayersuicide; level.canplayersuicide = ::canplayersuicide;
level.suicide_weapon = "death_self_zm"; level.suicide_weapon = "death_self_zm";
precacheitem( "death_self_zm" ); precacheitem( "death_self_zm" );
maps/mp/zombies/_zm_ai_dogs::init(); maps\mp\zombies\_zm_ai_dogs::init();
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zstandard" ); 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::setup_classic_gametype();
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zstandard", ::zstandard_main ); maps\mp\gametypes_zm\_zm_gametype::rungametypemain( "zstandard", ::zstandard_main );
} }
zstandard_main() //checked matches cerberus output zstandard_main()
{ {
level.dog_rounds_allowed = getgametypesetting( "allowdogs" ); level.dog_rounds_allowed = getgametypesetting( "allowdogs" );
if ( level.dog_rounds_allowed ) if ( level.dog_rounds_allowed )
{ maps\mp\zombies\_zm_ai_dogs::enable_dog_rounds();
maps/mp/zombies/_zm_ai_dogs::enable_dog_rounds();
} level thread maps\mp\zombies\_zm::round_start();
level thread maps/mp/zombies/_zm::round_start(); level thread maps\mp\gametypes_zm\_zm_gametype::kill_all_zombies();
level thread maps/mp/gametypes_zm/_zm_gametype::kill_all_zombies();
} }

View File

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

View File

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

View File

@ -1,13 +1,15 @@
#include maps/mp/zm_alcatraz_travel; // T6 GSC SOURCE
#include maps/mp/zm_alcatraz_sq_vo; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_audio; #include common_scripts\utility;
#include maps/mp/zombies/_zm_unitrigger; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_craftables; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zm_alcatraz_utility; #include maps\mp\zombies\_zm_weapons;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\zm_alcatraz_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_craftables;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_unitrigger;
#include common_scripts/utility; #include maps\mp\zombies\_zm_audio;
#include maps\mp\zm_alcatraz_sq_vo;
#include maps\mp\zm_alcatraz_travel;
init_craftables() init_craftables()
{ {
@ -16,10 +18,10 @@ init_craftables()
register_clientfields(); register_clientfields();
add_zombie_craftable( "alcatraz_shield_zm", &"ZM_PRISON_CRAFT_RIOT", undefined, &"ZOMBIE_BOUGHT_RIOT", undefined, 1 ); 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" ); 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( "packasplat", &"ZM_PRISON_CRAFT_PACKASPLAT", undefined, undefined, ::onfullycrafted_packasplat, 1 );
add_zombie_craftable_vox_category( "packasplat", "build_bsm" ); 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; level.craftable_piece_swap_allowed = 0;
add_zombie_craftable( "quest_key1" ); add_zombie_craftable( "quest_key1" );
add_zombie_craftable( "plane", &"ZM_PRISON_CRAFT_PLANE", &"ZM_PRISON_CRAFTING_PLANE", undefined, ::onfullycrafted_plane ); add_zombie_craftable( "plane", &"ZM_PRISON_CRAFT_PLANE", &"ZM_PRISON_CRAFTING_PLANE", undefined, ::onfullycrafted_plane );
@ -33,13 +35,13 @@ include_key_craftable( craftable_name, model_name )
part = spawnstruct(); part = spawnstruct();
part.name = craftable_name; part.name = craftable_name;
part add_craftable_piece( part_key ); 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 ); include_craftable( part );
} }
include_craftables() include_craftables()
{ {
level.zombie_include_craftables[ "open_table" ].custom_craftablestub_update_prompt = ::prison_open_craftablestub_update_prompt; level.zombie_include_craftables["open_table"].custom_craftablestub_update_prompt = ::prison_open_craftablestub_update_prompt;
craftable_name = "alcatraz_shield_zm"; craftable_name = "alcatraz_shield_zm";
riotshield_dolly = generate_zombie_craftable_piece( craftable_name, "dolly", "t6_wpn_zmb_shield_dlc2_dolly", 32, 64, 0, undefined, ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, undefined, "piece_riotshield_dolly", 1, "build_zs" ); riotshield_dolly = generate_zombie_craftable_piece( craftable_name, "dolly", "t6_wpn_zmb_shield_dlc2_dolly", 32, 64, 0, undefined, ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, undefined, "piece_riotshield_dolly", 1, "build_zs" );
riotshield_door = generate_zombie_craftable_piece( craftable_name, "door", "t6_wpn_zmb_shield_dlc2_door", 48, 15, 25, undefined, ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, undefined, "piece_riotshield_door", 1, "build_zs" ); riotshield_door = generate_zombie_craftable_piece( craftable_name, "door", "t6_wpn_zmb_shield_dlc2_door", 48, 15, 25, undefined, ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, undefined, "piece_riotshield_door", 1, "build_zs" );
@ -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_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_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 ); 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 ) if ( level.is_forever_solo_game )
{ {
plane_cloth.is_shared = 1; plane_cloth.is_shared = 1;
@ -83,6 +86,7 @@ include_craftables()
plane_steering.client_field_state = undefined; plane_steering.client_field_state = undefined;
plane_rigging.client_field_state = undefined; plane_rigging.client_field_state = undefined;
} }
plane_cloth.pickup_alias = "sidequest_sheets"; plane_cloth.pickup_alias = "sidequest_sheets";
plane_fueltanks.pickup_alias = "sidequest_oxygen"; plane_fueltanks.pickup_alias = "sidequest_oxygen";
plane_engine.pickup_alias = "sidequest_engine"; 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_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_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 ); 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 ) if ( level.is_forever_solo_game )
{ {
refuelable_plane_gas1.is_shared = 1; refuelable_plane_gas1.is_shared = 1;
@ -117,6 +122,7 @@ include_craftables()
refuelable_plane_gas4.client_field_state = undefined; refuelable_plane_gas4.client_field_state = undefined;
refuelable_plane_gas5.client_field_state = undefined; refuelable_plane_gas5.client_field_state = undefined;
} }
refuelable_plane = spawnstruct(); refuelable_plane = spawnstruct();
refuelable_plane.name = craftable_name; refuelable_plane.name = craftable_name;
refuelable_plane add_craftable_piece( refuelable_plane_gas1 ); refuelable_plane add_craftable_piece( refuelable_plane_gas1 );
@ -156,24 +162,21 @@ register_clientfields()
riotshieldcraftable() 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() 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() planecraftable()
{ {
level thread alcatraz_craftable_trigger_think( "plane_craftable_trigger", "plane", "plane", "", 1, 0 ); level thread alcatraz_craftable_trigger_think( "plane_craftable_trigger", "plane", "plane", "", 1, 0 );
level setclientfield( "quest_plane_craft_complete", 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 ); level setclientfield( "quest_state" + i, 2 );
i++;
}
} }
planefuelable() planefuelable()
@ -186,12 +189,10 @@ planefuelable_think()
flag_wait( "spawn_fuel_tanks" ); flag_wait( "spawn_fuel_tanks" );
t_plane_fuelable = getent( "plane_fuelable_trigger", "targetname" ); t_plane_fuelable = getent( "plane_fuelable_trigger", "targetname" );
t_plane_fuelable trigger_on(); t_plane_fuelable trigger_on();
i = 1;
while ( i <= 5 ) for ( i = 1; i <= 5; i++ )
{
level setclientfield( "quest_state" + i, 5 ); level setclientfield( "quest_state" + i, 5 );
i++;
}
alcatraz_craftable_trigger_think( "plane_fuelable_trigger", "refuelable_plane", "refuelable_plane", "", 1, 0 ); alcatraz_craftable_trigger_think( "plane_fuelable_trigger", "refuelable_plane", "refuelable_plane", "", 1, 0 );
} }
@ -219,8 +220,10 @@ ondisconnect_common( player )
level endon( "crafted_" + self.piecename ); level endon( "crafted_" + self.piecename );
level endon( "dropped_" + self.piecename ); level endon( "dropped_" + self.piecename );
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
player waittill( "disconnect" ); player waittill( "disconnect" );
switch( self.piecename )
switch ( self.piecename )
{ {
case "cloth": case "cloth":
field_name = "quest_state1"; field_name = "quest_state1";
@ -243,59 +246,51 @@ ondisconnect_common( player )
in_game_checklist_plane_piece_dropped( "rigging" ); in_game_checklist_plane_piece_dropped( "rigging" );
break; break;
} }
level setclientfield( field_name, 2 ); level setclientfield( field_name, 2 );
level setclientfield( "piece_player" + player_num, 0 ); level setclientfield( "piece_player" + player_num, 0 );
m_plane_piece = get_craftable_piece_model( "plane", self.piecename ); 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" ); playfxontag( level._effect["quest_item_glow"], m_plane_piece, "tag_origin" );
}
m_fuel_can = get_craftable_piece_model( "refuelable_plane", self.piecename ); 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" ); playfxontag( level._effect["quest_item_glow"], m_fuel_can, "tag_origin" );
}
} }
prison_open_craftablestub_update_prompt( player, b_set_hint_string_now, trigger ) 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; return valid;
} }
onpickup_key( player ) onpickup_key( player )
{ {
flag_set( "key_found" ); flag_set( "key_found" );
if ( level.is_master_key_west ) if ( level.is_master_key_west )
{
level clientnotify( "fxanim_west_pulley_up_start" ); level clientnotify( "fxanim_west_pulley_up_start" );
}
else else
{
level clientnotify( "fxanim_east_pulley_up_start" ); level clientnotify( "fxanim_east_pulley_up_start" );
}
a_m_checklist = getentarray( "plane_checklist", "targetname" ); a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a429 = a_m_checklist;
_k429 = getFirstArrayKey( _a429 ); foreach ( m_checklist in a_m_checklist )
while ( isDefined( _k429 ) )
{ {
m_checklist = _a429[ _k429 ];
m_checklist showpart( "j_check_key" ); m_checklist showpart( "j_check_key" );
m_checklist showpart( "j_strike_key" ); m_checklist showpart( "j_strike_key" );
_k429 = getNextArrayKey( _a429, _k429 );
} }
a_door_structs = getstructarray( "quest_trigger", "script_noteworthy" ); a_door_structs = getstructarray( "quest_trigger", "script_noteworthy" );
_a437 = a_door_structs;
_k437 = getFirstArrayKey( _a437 ); foreach ( struct in a_door_structs )
while ( isDefined( _k437 ) )
{ {
struct = _a437[ _k437 ]; if ( isdefined( struct.unitrigger_stub ) )
if ( isDefined( struct.unitrigger_stub ) ) struct.unitrigger_stub maps\mp\zombies\_zm_unitrigger::run_visibility_function_for_all_triggers();
{
struct.unitrigger_stub maps/mp/zombies/_zm_unitrigger::run_visibility_function_for_all_triggers();
}
_k437 = getNextArrayKey( _a437, _k437 );
} }
player playsound( "evt_key_pickup" ); player playsound( "evt_key_pickup" );
player thread do_player_general_vox( "quest", "sidequest_key_response", undefined, 100 ); player thread do_player_general_vox( "quest", "sidequest_key_response", undefined, 100 );
level setclientfield( "piece_key_warden", 1 ); level setclientfield( "piece_key_warden", 1 );
@ -315,8 +310,9 @@ ondrop_plane( player )
level.plane_pieces_picked_up -= 1; level.plane_pieces_picked_up -= 1;
self droponmover( player ); self droponmover( player );
self.piece_owner = undefined; self.piece_owner = undefined;
playfxontag( level._effect[ "quest_item_glow" ], self.model, "tag_origin" ); playfxontag( level._effect["quest_item_glow"], self.model, "tag_origin" );
switch( self.piecename )
switch ( self.piecename )
{ {
case "cloth": case "cloth":
field_name = "quest_state1"; field_name = "quest_state1";
@ -339,7 +335,9 @@ ondrop_plane( player )
in_game_checklist_plane_piece_dropped( "rigging" ); in_game_checklist_plane_piece_dropped( "rigging" );
break; break;
} }
level setclientfield( field_name, 2 ); level setclientfield( field_name, 2 );
if ( !level.is_forever_solo_game ) if ( !level.is_forever_solo_game )
{ {
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
@ -352,27 +350,30 @@ onpickup_plane( player )
/# /#
println( "ZM >> Common part callback onPickup()" ); 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.plane_pieces_picked_up = 0;
level.sndplanepieces = 1; level.sndplanepieces = 1;
} }
level.plane_pieces_picked_up += 1; level.plane_pieces_picked_up += 1;
if ( level.plane_pieces_picked_up == 5 ) if ( level.plane_pieces_picked_up == 5 )
{
level thread roof_nag_vo(); level thread roof_nag_vo();
}
if ( level.sndplanepieces == level.plane_pieces_picked_up ) 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++; level.sndplanepieces++;
} }
player playsound( "zmb_craftable_pickup" ); player playsound( "zmb_craftable_pickup" );
vo_alias_call = undefined; vo_alias_call = undefined;
vo_alias_response = undefined; vo_alias_response = undefined;
self pickupfrommover(); self pickupfrommover();
self.piece_owner = player; self.piece_owner = player;
switch( self.piecename )
switch ( self.piecename )
{ {
case "cloth": case "cloth":
field_name = "quest_state1"; field_name = "quest_state1";
@ -396,17 +397,20 @@ onpickup_plane( player )
in_game_checklist_plane_piece_picked_up( "rigging" ); in_game_checklist_plane_piece_picked_up( "rigging" );
break; break;
} }
level setclientfield( field_name, 3 ); level setclientfield( field_name, 3 );
if ( !level.is_forever_solo_game ) if ( !level.is_forever_solo_game )
{ {
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
level setclientfield( "piece_player" + player_num, self.client_field_state ); level setclientfield( "piece_player" + player_num, self.client_field_state );
} }
vo_alias_call = self check_if_newly_found(); 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 ); level thread play_plane_piece_call_and_response_vo( player, vo_alias_call );
}
self thread ondisconnect_common( player ); self thread ondisconnect_common( player );
} }
@ -414,7 +418,7 @@ check_if_newly_found()
{ {
if ( !flag( self.piecename + "_found" ) ) if ( !flag( self.piecename + "_found" ) )
{ {
switch( self.piecename ) switch ( self.piecename )
{ {
case "fueltanks": case "fueltanks":
vo_alias_call = "sidequest_oxygen"; vo_alias_call = "sidequest_oxygen";
@ -432,12 +436,13 @@ check_if_newly_found()
vo_alias_call = "sidequest_rigging"; vo_alias_call = "sidequest_rigging";
break; break;
} }
level.n_plane_pieces_found++; level.n_plane_pieces_found++;
flag_set( self.piecename + "_found" ); flag_set( self.piecename + "_found" );
if ( self.piecename == "cloth" ) if ( self.piecename == "cloth" )
{
level clientnotify( "fxanim_dryer_hide_start" ); level clientnotify( "fxanim_dryer_hide_start" );
}
return vo_alias_call; return vo_alias_call;
} }
} }
@ -448,32 +453,34 @@ play_plane_piece_call_and_response_vo( player, vo_alias_call )
player endon( "disconnect" ); player endon( "disconnect" );
n_response_range = 1500; n_response_range = 1500;
players = getplayers(); players = getplayers();
if ( !flag( "story_vo_playing" ) ) if ( !flag( "story_vo_playing" ) )
{ {
flag_set( "story_vo_playing" ); flag_set( "story_vo_playing" );
player do_player_general_vox( "quest", vo_alias_call, undefined, 100 ); player do_player_general_vox( "quest", vo_alias_call, undefined, 100 );
wait 5; wait 5;
if ( players.size > 1 ) if ( players.size > 1 )
{ {
arrayremovevalue( players, player ); arrayremovevalue( players, player );
closest_other_player = getclosest( player.origin, players ); 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 ); 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 ) if ( level.n_plane_pieces_found < 5 )
{
vo_alias_response = "sidequest_parts" + level.n_plane_pieces_found + "_prog"; vo_alias_response = "sidequest_parts" + level.n_plane_pieces_found + "_prog";
}
else else
{
vo_alias_response = "sidequest_all_parts"; vo_alias_response = "sidequest_all_parts";
}
closest_other_player do_player_general_vox( "quest", vo_alias_response, undefined, 100 ); closest_other_player do_player_general_vox( "quest", vo_alias_response, undefined, 100 );
} }
} }
} }
flag_clear( "story_vo_playing" ); flag_clear( "story_vo_playing" );
} }
} }
@ -485,37 +492,25 @@ roof_nag_vo()
zone_roof = getent( "zone_roof", "targetname" ); zone_roof = getent( "zone_roof", "targetname" );
zone_roof_infirmary = getent( "zone_roof_infirmary", "targetname" ); zone_roof_infirmary = getent( "zone_roof_infirmary", "targetname" );
n_roof_nag_wait = 60; 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; b_is_a_player_on_the_roof = 0;
players = getplayers(); players = getplayers();
_a696 = players;
_k696 = getFirstArrayKey( _a696 ); foreach ( player in players )
while ( isDefined( _k696 ) )
{ {
player = _a696[ _k696 ];
if ( player istouching( zone_roof ) || player istouching( zone_roof_infirmary ) ) if ( player istouching( zone_roof ) || player istouching( zone_roof_infirmary ) )
{
b_is_a_player_on_the_roof = 1; 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,41 +533,38 @@ oncrafted_plane( player )
plane_craftable hidepart( "tag_engine_ground" ); plane_craftable hidepart( "tag_engine_ground" );
plane_craftable hidepart( "tag_clothes_ground" ); plane_craftable hidepart( "tag_clothes_ground" );
plane_craftable hidepart( "tag_fuel_hose" ); plane_craftable hidepart( "tag_fuel_hose" );
if ( !isDefined( level.sndplanecrafted ) )
{ if ( !isdefined( level.sndplanecrafted ) )
level.sndplanecrafted = 0; level.sndplanecrafted = 0;
}
level.sndplanecrafted++; 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" ) ) if ( is_part_crafted( "plane", "rigging" ) )
{ {
plane_craftable showpart( "tag_support_upper" ); plane_craftable showpart( "tag_support_upper" );
if ( is_part_crafted( "plane", "cloth" ) ) if ( is_part_crafted( "plane", "cloth" ) )
{
plane_craftable showpart( "tag_wing_skins_up" ); plane_craftable showpart( "tag_wing_skins_up" );
}
if ( is_part_crafted( "plane", "engine" ) ) if ( is_part_crafted( "plane", "engine" ) )
{
plane_craftable showpart( "tag_engines_up" ); plane_craftable showpart( "tag_engines_up" );
} }
}
else else
{ {
plane_craftable showpart( "tag_wings_down" ); plane_craftable showpart( "tag_wings_down" );
if ( is_part_crafted( "plane", "cloth" ) ) if ( is_part_crafted( "plane", "cloth" ) )
{
m_plane_hideable_clothes_pile show(); m_plane_hideable_clothes_pile show();
}
if ( is_part_crafted( "plane", "engine" ) ) if ( is_part_crafted( "plane", "engine" ) )
{
m_plane_hideable_engine show(); m_plane_hideable_engine show();
} }
}
if ( is_part_crafted( "plane", "steering" ) && is_part_crafted( "plane", "fueltanks" ) ) if ( is_part_crafted( "plane", "steering" ) && is_part_crafted( "plane", "fueltanks" ) )
{
plane_craftable showpart( "tag_fuel_hose" ); plane_craftable showpart( "tag_fuel_hose" );
}
switch( self.piecename ) switch ( self.piecename )
{ {
case "cloth": case "cloth":
field_name = "quest_state1"; field_name = "quest_state1";
@ -595,7 +587,9 @@ oncrafted_plane( player )
in_game_checklist_plane_piece_crafted( "rigging" ); in_game_checklist_plane_piece_crafted( "rigging" );
break; break;
} }
level setclientfield( field_name, 4 ); level setclientfield( field_name, 4 );
if ( !level.is_forever_solo_game ) if ( !level.is_forever_solo_game )
{ {
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
@ -607,13 +601,12 @@ ondrop_fuel( player )
{ {
level notify( "dropped_" + self.piecename ); level notify( "dropped_" + self.piecename );
self.piece_owner = undefined; self.piece_owner = undefined;
playfxontag( level._effect[ "quest_item_glow" ], self.model, "tag_origin" ); playfxontag( level._effect["quest_item_glow"], self.model, "tag_origin" );
if ( isDefined( level.sndfuelpieces ) )
{ if ( isdefined( level.sndfuelpieces ) )
level.sndfuelpieces--; level.sndfuelpieces--;
} switch ( self.piecename )
switch( self.piecename )
{ {
case "fuel1": case "fuel1":
field_name = "quest_state1"; field_name = "quest_state1";
@ -631,7 +624,9 @@ ondrop_fuel( player )
field_name = "quest_state5"; field_name = "quest_state5";
break; break;
} }
level setclientfield( field_name, 5 ); level setclientfield( field_name, 5 );
if ( !level.is_forever_solo_game ) if ( !level.is_forever_solo_game )
{ {
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
@ -642,19 +637,19 @@ ondrop_fuel( player )
onpickup_fuel( player ) onpickup_fuel( player )
{ {
player playsound( "zmb_craftable_pickup" ); player playsound( "zmb_craftable_pickup" );
if ( !isDefined( level.sndfuelpieces ) || level.sndfuelpieces >= 5 )
{ if ( !isdefined( level.sndfuelpieces ) || level.sndfuelpieces >= 5 )
level.sndfuelpieces = 0; level.sndfuelpieces = 0;
}
level.sndfuelpieces++; 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 pickupfrommover();
self.piece_owner = player; self.piece_owner = player;
if ( isDefined( player ) )
{ if ( isdefined( player ) )
player do_player_general_vox( "quest", "fuel_pickup", undefined, 100 ); player do_player_general_vox( "quest", "fuel_pickup", undefined, 100 );
}
switch( self.piecename ) switch ( self.piecename )
{ {
case "fuel1": case "fuel1":
field_name = "quest_state1"; field_name = "quest_state1";
@ -672,12 +667,15 @@ onpickup_fuel( player )
field_name = "quest_state5"; field_name = "quest_state5";
break; break;
} }
level setclientfield( field_name, 6 ); level setclientfield( field_name, 6 );
if ( !level.is_forever_solo_game ) if ( !level.is_forever_solo_game )
{ {
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
level setclientfield( "piece_player" + player_num, self.client_field_state ); level setclientfield( "piece_player" + player_num, self.client_field_state );
} }
self thread ondisconnect_common( player ); self thread ondisconnect_common( player );
} }
@ -685,7 +683,8 @@ oncrafted_fuel( player )
{ {
level notify( "crafted_" + self.piecename ); level notify( "crafted_" + self.piecename );
level.n_plane_fuel_count++; level.n_plane_fuel_count++;
switch( self.piecename )
switch ( self.piecename )
{ {
case "fuel1": case "fuel1":
field_name = "quest_state1"; field_name = "quest_state1";
@ -703,7 +702,9 @@ oncrafted_fuel( player )
field_name = "quest_state5"; field_name = "quest_state5";
break; break;
} }
level setclientfield( field_name, 7 ); level setclientfield( field_name, 7 );
if ( !level.is_forever_solo_game ) if ( !level.is_forever_solo_game )
{ {
player_num = player getentitynumber() + 1; player_num = player getentitynumber() + 1;
@ -714,7 +715,7 @@ oncrafted_fuel( player )
onfullycrafted_plane( player ) onfullycrafted_plane( player )
{ {
flag_set( "plane_built" ); 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 notify( "roof_nag_vo" );
level setclientfield( "quest_plane_craft_complete", 1 ); level setclientfield( "quest_plane_craft_complete", 1 );
return 0; return 0;
@ -733,7 +734,7 @@ onfullycrafted_packasplat( player )
onfullycrafted_refueled( player ) onfullycrafted_refueled( player )
{ {
flag_set( "plane_built" ); 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 notify( "roof_nag_vo" );
thread onfullycrafted_refueled_think( player ); thread onfullycrafted_refueled_think( player );
return 0; return 0;
@ -742,30 +743,25 @@ onfullycrafted_refueled( player )
onfullycrafted_refueled_think( player ) onfullycrafted_refueled_think( player )
{ {
flag_wait( "spawn_fuel_tanks" ); flag_wait( "spawn_fuel_tanks" );
i = 1;
while ( i <= 5 ) for ( i = 1; i <= 5; i++ )
{
level setclientfield( "quest_state" + i, 5 ); 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() 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 ) onbuyweapon_riotshield( player )
{ {
if ( isDefined( player.player_shield_reset_health ) ) if ( isdefined( player.player_shield_reset_health ) )
{
player [[ 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 ]](); player [[ player.player_shield_reset_location ]]();
}
} }
onbuyweapon_plane( player ) onbuyweapon_plane( player )
@ -776,38 +772,29 @@ onbuyweapon_plane( player )
droponmover( 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; 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; str_location = level.e_gondola.destination;
}
else else
{
str_location = level.e_gondola.location; str_location = level.e_gondola.location;
}
if ( !isDefined( str_location ) ) if ( !isdefined( str_location ) )
{
str_location = "roof"; str_location = "roof";
}
a_s_part_teleport = getstructarray( "gondola_dropped_parts_" + str_location, "targetname" ); a_s_part_teleport = getstructarray( "gondola_dropped_parts_" + str_location, "targetname" );
_a1104 = a_s_part_teleport;
_k1104 = getFirstArrayKey( _a1104 ); foreach ( struct in a_s_part_teleport )
while ( isDefined( _k1104 ) )
{ {
struct = _a1104[ _k1104 ]; if ( !( isdefined( struct.occupied ) && struct.occupied ) )
if ( isDefined( struct.occupied ) && !struct.occupied )
{ {
self.model.origin = struct.origin; self.model.origin = struct.origin;
self.model.angles = struct.angles; self.model.angles = struct.angles;
struct.occupied = 1; struct.occupied = 1;
self.unitrigger.struct_teleport = struct; self.unitrigger.struct_teleport = struct;
return; break;
}
else
{
_k1104 = getNextArrayKey( _a1104, _k1104 );
} }
} }
} }
@ -815,9 +802,9 @@ droponmover( player )
pickupfrommover() 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.occupied = 0;
self.unitrigger.struct_teleport = undefined; self.unitrigger.struct_teleport = undefined;
@ -829,67 +816,45 @@ in_game_checklist_setup()
{ {
a_m_checklist = getentarray( "plane_checklist", "targetname" ); a_m_checklist = getentarray( "plane_checklist", "targetname" );
a_str_partnames = []; a_str_partnames = [];
a_str_partnames[ 0 ] = "sheets"; a_str_partnames[0] = "sheets";
a_str_partnames[ 1 ] = "fueltank"; a_str_partnames[1] = "fueltank";
a_str_partnames[ 2 ] = "engine"; a_str_partnames[2] = "engine";
a_str_partnames[ 3 ] = "contval"; a_str_partnames[3] = "contval";
a_str_partnames[ 4 ] = "rigging"; a_str_partnames[4] = "rigging";
a_str_partnames[ 5 ] = "key"; a_str_partnames[5] = "key";
_a1143 = a_m_checklist;
_k1143 = getFirstArrayKey( _a1143 ); foreach ( m_checklist in a_m_checklist )
while ( isDefined( _k1143 ) )
{ {
m_checklist = _a1143[ _k1143 ]; foreach ( str_partname in a_str_partnames )
_a1145 = a_str_partnames;
_k1145 = getFirstArrayKey( _a1145 );
while ( isDefined( _k1145 ) )
{ {
str_partname = _a1145[ _k1145 ];
m_checklist hidepart( "j_check_" + str_partname ); m_checklist hidepart( "j_check_" + str_partname );
m_checklist hidepart( "j_strike_" + 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 ) in_game_checklist_plane_piece_picked_up( str_partname )
{ {
a_m_checklist = getentarray( "plane_checklist", "targetname" ); a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a1157 = a_m_checklist;
_k1157 = getFirstArrayKey( _a1157 ); foreach ( m_checklist in a_m_checklist )
while ( isDefined( _k1157 ) )
{
m_checklist = _a1157[ _k1157 ];
m_checklist showpart( "j_check_" + str_partname ); m_checklist showpart( "j_check_" + str_partname );
_k1157 = getNextArrayKey( _a1157, _k1157 );
}
} }
in_game_checklist_plane_piece_dropped( str_partname ) in_game_checklist_plane_piece_dropped( str_partname )
{ {
a_m_checklist = getentarray( "plane_checklist", "targetname" ); a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a1167 = a_m_checklist;
_k1167 = getFirstArrayKey( _a1167 ); foreach ( m_checklist in a_m_checklist )
while ( isDefined( _k1167 ) )
{
m_checklist = _a1167[ _k1167 ];
m_checklist hidepart( "j_check_" + str_partname ); m_checklist hidepart( "j_check_" + str_partname );
_k1167 = getNextArrayKey( _a1167, _k1167 );
}
} }
in_game_checklist_plane_piece_crafted( str_partname ) in_game_checklist_plane_piece_crafted( str_partname )
{ {
a_m_checklist = getentarray( "plane_checklist", "targetname" ); a_m_checklist = getentarray( "plane_checklist", "targetname" );
_a1177 = a_m_checklist;
_k1177 = getFirstArrayKey( _a1177 ); foreach ( m_checklist in a_m_checklist )
while ( isDefined( _k1177 ) )
{
m_checklist = _a1177[ _k1177 ];
m_checklist showpart( "j_strike_" + str_partname ); m_checklist showpart( "j_strike_" + str_partname );
_k1177 = getNextArrayKey( _a1177, _k1177 );
}
} }
alcatraz_craftable_trigger_think( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) 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 ) alcatraz_setup_unitrigger_craftable( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent )
{ {
trig = getent( trigger_targetname, "targetname" ); trig = getent( trigger_targetname, "targetname" );
if ( !isDefined( trig ) )
{ if ( !isdefined( trig ) )
return; return;
}
trig.script_length = 386; trig.script_length = 386;
return alcatraz_setup_unitrigger_craftable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); 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 ) alcatraz_setup_unitrigger_craftable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent )
{ {
if ( !isDefined( trig ) ) if ( !isdefined( trig ) )
{
return; return;
}
unitrigger_stub = spawnstruct(); unitrigger_stub = spawnstruct();
unitrigger_stub.craftablestub = level.zombie_include_craftables[ equipname ]; unitrigger_stub.craftablestub = level.zombie_include_craftables[equipname];
angles = trig.script_angles; angles = trig.script_angles;
if ( !isDefined( angles ) )
{ if ( !isdefined( angles ) )
angles = ( 0, 0, 0 ); 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; unitrigger_stub.angles = trig.angles;
if ( isDefined( trig.script_angles ) )
{ if ( isdefined( trig.script_angles ) )
unitrigger_stub.angles = trig.script_angles; unitrigger_stub.angles = trig.script_angles;
}
unitrigger_stub.equipname = equipname; unitrigger_stub.equipname = equipname;
unitrigger_stub.weaponname = weaponname; unitrigger_stub.weaponname = weaponname;
unitrigger_stub.trigger_hintstring = trigger_hintstring; 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.onenduse = ::onenduseuts;
unitrigger_stub.onuse = ::onuseplantobjectuts; unitrigger_stub.onuse = ::onuseplantobjectuts;
unitrigger_stub.oncantuse = ::oncantuseuts; unitrigger_stub.oncantuse = ::oncantuseuts;
if ( isDefined( trig.script_length ) )
{ if ( isdefined( trig.script_length ) )
unitrigger_stub.script_length = trig.script_length; unitrigger_stub.script_length = trig.script_length;
}
else else
{
unitrigger_stub.script_length = 32; unitrigger_stub.script_length = 32;
}
if ( isDefined( trig.script_width ) ) if ( isdefined( trig.script_width ) )
{
unitrigger_stub.script_width = trig.script_width; unitrigger_stub.script_width = trig.script_width;
}
else else
{
unitrigger_stub.script_width = 100; unitrigger_stub.script_width = 100;
}
if ( isDefined( trig.script_height ) ) if ( isdefined( trig.script_height ) )
{
unitrigger_stub.script_height = trig.script_height; unitrigger_stub.script_height = trig.script_height;
}
else else
{
unitrigger_stub.script_height = 64; unitrigger_stub.script_height = 64;
}
unitrigger_stub.target = trig.target; unitrigger_stub.target = trig.target;
unitrigger_stub.targetname = trig.targetname; unitrigger_stub.targetname = trig.targetname;
unitrigger_stub.script_noteworthy = trig.script_noteworthy; unitrigger_stub.script_noteworthy = trig.script_noteworthy;
unitrigger_stub.script_parameters = trig.script_parameters; unitrigger_stub.script_parameters = trig.script_parameters;
unitrigger_stub.cursor_hint = "HINT_NOICON"; 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.hint_string = level.zombie_craftablestubs[equipname].hint;
}
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
unitrigger_stub.require_look_at = 0; unitrigger_stub.require_look_at = 0;
unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); 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.custom_craftablestub_update_prompt = unitrigger_stub.craftablestub.custom_craftablestub_update_prompt;
}
unitrigger_stub.prompt_and_visibility_func = ::craftabletrigger_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; unitrigger_stub.piece_trigger = trig;
trig.trigger_stub = unitrigger_stub; trig.trigger_stub = unitrigger_stub;
unitrigger_stub.zombie_weapon_upgrade = trig.zombie_weapon_upgrade; 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" ); unitrigger_stub.model = getent( unitrigger_stub.target, "targetname" );
if ( isDefined( unitrigger_stub.model ) )
{ if ( isdefined( unitrigger_stub.model ) )
if ( isDefined( unitrigger_stub.zombie_weapon_upgrade ) )
{ {
if ( isdefined( unitrigger_stub.zombie_weapon_upgrade ) )
unitrigger_stub.model useweaponhidetags( unitrigger_stub.zombie_weapon_upgrade ); unitrigger_stub.model useweaponhidetags( unitrigger_stub.zombie_weapon_upgrade );
}
unitrigger_stub.model ghost(); unitrigger_stub.model ghost();
unitrigger_stub.model notsolid(); unitrigger_stub.model notsolid();
} }
} }
unitrigger_stub.craftablespawn = unitrigger_stub craftable_piece_unitriggers( equipname, unitrigger_stub.origin ); unitrigger_stub.craftablespawn = unitrigger_stub craftable_piece_unitriggers( equipname, unitrigger_stub.origin );
if ( delete_trigger ) if ( delete_trigger )
{
trig delete(); trig delete();
}
level.a_uts_craftables[ level.a_uts_craftables.size ] = unitrigger_stub; level.a_uts_craftables[level.a_uts_craftables.size] = unitrigger_stub;
return unitrigger_stub; return unitrigger_stub;
} }

View File

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

View File

@ -1,18 +1,19 @@
//checked includes changed to match cerberus output // T6 GSC SOURCE
#include maps/mp/zm_alcatraz_classic; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zm_alcatraz_grief_cellblock; #include common_scripts\utility;
#include maps/mp/zm_prison; #include maps\mp\_utility;
#include maps/mp/gametypes_zm/_zm_gametype; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_game_module; #include maps\mp\zombies\_zm_game_module;
#include maps/mp/zombies/_zm_utility; #include maps\mp\gametypes_zm\_zm_gametype;
#include maps/mp/_utility; #include maps\mp\zm_prison;
#include common_scripts/utility; #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; 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( "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_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( "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 ); 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 // T6 GSC SOURCE
#include maps/mp/gametypes_zm/zmeat; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zm_alcatraz_traps; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_game_module; #include common_scripts\utility;
#include maps/mp/zombies/_zm_blockers; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_ai_brutus; #include maps\mp\zombies\_zm_race_utility;
#include maps/mp/gametypes_zm/_zm_gametype; #include maps\mp\zm_prison;
#include maps/mp/zombies/_zm_magicbox; #include maps\mp\zombies\_zm_weapons;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\zombies\_zm_magicbox;
#include maps/mp/zm_prison; #include maps\mp\gametypes_zm\_zm_gametype;
#include maps/mp/zombies/_zm_race_utility; #include maps\mp\zombies\_zm_ai_brutus;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_blockers;
#include common_scripts/utility; #include maps\mp\zombies\_zm_game_module;
#include maps/mp/_utility; #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" ); 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();
} }
zgrief_init() //checked matches cerberus output zgrief_init()
{ {
encounter_init(); encounter_init();
flag_wait( "start_zombie_round_logic" ); flag_wait( "start_zombie_round_logic" );
if ( level.round_number < 4 && level.gamedifficulty != 0 ) if ( level.round_number < 4 && level.gamedifficulty != 0 )
{
level.zombie_move_speed = 35; 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._game_module_player_laststand_callback = ::alcatraz_grief_laststand_weapon_save;
level.precachecustomcharacters = ::precache_team_characters; level.precachecustomcharacters = ::precache_team_characters;
@ -42,49 +43,50 @@ encounter_init() //checked matches cerberus output
level.gamemode_post_spawn_logic = ::give_player_shiv; 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" ) ) if ( self hasperk( "specialty_additionalprimaryweapon" ) )
{ {
primary_weapons_that_can_be_taken = []; primary_weapons_that_can_be_taken = [];
primaryweapons = self getweaponslistprimaries(); primaryweapons = self getweaponslistprimaries();
for ( i = 0; i < primaryweapons.size; i++ ) 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];
primary_weapons_that_can_be_taken[ primary_weapons_that_can_be_taken.size ] = primaryweapons[ i ];
}
} }
if ( primary_weapons_that_can_be_taken.size >= 3 ) 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 ]; weapon_to_take = primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size - 1];
self takeweapon( weapon_to_take ); self takeweapon( weapon_to_take );
self.weapon_taken_by_losing_specialty_additionalprimaryweapon = weapon_to_take; self.weapon_taken_by_losing_specialty_additionalprimaryweapon = weapon_to_take;
} }
} }
self.grief_savedweapon_weapons = self getweaponslist(); self.grief_savedweapon_weapons = self getweaponslist();
self.grief_savedweapon_weaponsammo_stock = []; self.grief_savedweapon_weaponsammo_stock = [];
self.grief_savedweapon_weaponsammo_clip = []; self.grief_savedweapon_weaponsammo_clip = [];
self.grief_savedweapon_currentweapon = self getcurrentweapon(); self.grief_savedweapon_currentweapon = self getcurrentweapon();
self.grief_savedweapon_grenades = self get_player_lethal_grenade(); 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_grenades_clip = self getweaponammoclip( self.grief_savedweapon_grenades );
}
self.grief_savedweapon_tactical = self get_player_tactical_grenade(); 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 ); self.grief_savedweapon_tactical_clip = self getweaponammoclip( self.grief_savedweapon_tactical );
}
for ( i = 0; i < self.grief_savedweapon_weapons.size; i++ ) 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_clip[i] = self getweaponammoclip( self.grief_savedweapon_weapons[i] );
self.grief_savedweapon_weaponsammo_stock[ i ] = self getweaponammostock( 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; self.grief_hasriotshield = 1;
}
if ( self hasweapon( "claymore_zm" ) ) if ( self hasweapon( "claymore_zm" ) )
{ {
self.grief_savedweapon_claymore = 1; 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_player_grief_guard_fb" );
precachemodel( "c_zom_oleary_shortsleeve_viewhands" ); precachemodel( "c_zom_oleary_shortsleeve_viewhands" );
@ -100,30 +102,31 @@ precache_team_characters() //checked matches cerberus output
precachemodel( "c_zom_grief_guard_viewhands" ); precachemodel( "c_zom_grief_guard_viewhands" );
} }
give_team_characters() //checked matches cerberus output give_team_characters()
{ {
self detachall(); self detachall();
self set_player_is_female( 0 ); self set_player_is_female( 0 );
if ( !isDefined( self.characterindex ) )
if ( !isdefined( self.characterindex ) )
{ {
self.characterindex = 1; self.characterindex = 1;
if ( self.team == "axis" ) if ( self.team == "axis" )
{
self.characterindex = 0; self.characterindex = 0;
} }
}
switch( self.characterindex ) switch ( self.characterindex )
{ {
case 0: case "2":
case 2: case "0":
self setmodel( "c_zom_player_grief_inmate_fb" ); self setmodel( "c_zom_player_grief_inmate_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
self setviewmodel( "c_zom_oleary_shortsleeve_viewhands" ); self setviewmodel( "c_zom_oleary_shortsleeve_viewhands" );
self.characterindex = 0; self.characterindex = 0;
break; break;
case 1: case "3":
case 3: case "1":
self setmodel( "c_zom_player_grief_guard_fb" ); self setmodel( "c_zom_player_grief_guard_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
@ -131,118 +134,120 @@ give_team_characters() //checked matches cerberus output
self.characterindex = 1; self.characterindex = 1;
break; break;
} }
self setmovespeedscale( 1 ); self setmovespeedscale( 1 );
self setsprintduration( 4 ); self setsprintduration( 4 );
self setsprintcooldown( 0 ); self setsprintcooldown( 0 );
} }
give_player_shiv() //checked matches cerberus output give_player_shiv()
{ {
self takeweapon( "knife_zm" ); self takeweapon( "knife_zm" );
self giveweapon( "knife_zm_alcatraz" ); self giveweapon( "knife_zm_alcatraz" );
} }
grief_treasure_chest_init() //checked matches cerberus output grief_treasure_chest_init()
{ {
chest1 = getstruct( "start_chest", "script_noteworthy" ); chest1 = getstruct( "start_chest", "script_noteworthy" );
chest2 = getstruct( "cafe_chest", "script_noteworthy" ); chest2 = getstruct( "cafe_chest", "script_noteworthy" );
setdvar( "disableLookAtEntityLogic", 1 ); setdvar( "disableLookAtEntityLogic", 1 );
level.chests = []; level.chests = [];
level.chests[ level.chests.size ] = chest1; level.chests[level.chests.size] = chest1;
level.chests[ level.chests.size ] = chest2; 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(); grief_treasure_chest_init();
precacheshader( "zm_al_wth_zombie" ); precacheshader( "zm_al_wth_zombie" );
array_thread( level.zombie_spawners, ::add_spawn_function, ::remove_zombie_hats_for_grief ); 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::precache();
maps/mp/zombies/_zm_ai_brutus::init(); maps\mp\zombies\_zm_ai_brutus::init();
level.enemy_location_override_func = ::enemy_location_override; level.enemy_location_override_func = ::enemy_location_override;
level._effect[ "butterflies" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_skull_elec" ); level._effect["butterflies"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_skull_elec" );
a_t_door_triggers = getentarray( "zombie_door", "targetname" ); a_t_door_triggers = getentarray( "zombie_door", "targetname" );
triggers = a_t_door_triggers;
i = 0; foreach ( trigger in a_t_door_triggers )
while ( i < triggers.size )
{ {
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(); trigger delete();
i++;
continue; 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; 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" ); a_door_and_clip = getentarray( str_target, "targetname" );
foreach ( ent in a_door_and_clip ) foreach ( ent in a_door_and_clip )
{
ent delete(); ent delete();
} }
trigger delete();
} }
triggers[ i ] delete();
}
i++;
} }
a_t_doors = getentarray( "zombie_door", "targetname" ); a_t_doors = getentarray( "zombie_door", "targetname" );
foreach ( t_door in a_t_doors ) 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" ) 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(); zbarriers = getzbarrierarray();
a_str_zones = []; a_str_zones = [];
a_str_zones[ 0 ] = "zone_start"; a_str_zones[0] = "zone_start";
a_str_zones[ 1 ] = "zone_library"; a_str_zones[1] = "zone_library";
a_str_zones[ 2 ] = "zone_cafeteria"; a_str_zones[2] = "zone_cafeteria";
a_str_zones[ 3 ] = "zone_cafeteria_end"; a_str_zones[3] = "zone_cafeteria_end";
a_str_zones[ 4 ] = "zone_warden_office"; a_str_zones[4] = "zone_warden_office";
a_str_zones[ 5 ] = "zone_cellblock_east"; a_str_zones[5] = "zone_cellblock_east";
a_str_zones[ 6 ] = "zone_cellblock_west_warden"; a_str_zones[6] = "zone_cellblock_west_warden";
a_str_zones[ 7 ] = "zone_cellblock_west_barber"; a_str_zones[7] = "zone_cellblock_west_barber";
a_str_zones[ 8 ] = "zone_cellblock_west"; a_str_zones[8] = "zone_cellblock_west";
a_str_zones[ 9 ] = "zone_cellblock_west_gondola"; a_str_zones[9] = "zone_cellblock_west_gondola";
foreach ( barrier in zbarriers ) 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; b_delete_barrier = 1;
if ( isdefined( barrier.script_string ) ) if ( isdefined( barrier.script_string ) )
{ {
for ( i = 0; i < a_str_zones.size; i++ ) 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; b_delete_barrier = 0;
break; break;
} }
} }
} }
else if ( b_delete_barrier == 1 )
{ if ( b_delete_barrier == 1 )
barrier delete(); barrier delete();
} }
}
}
t_temp = getent( "tower_trap_activate_trigger", "targetname" ); t_temp = getent( "tower_trap_activate_trigger", "targetname" );
t_temp delete(); t_temp delete();
t_temp = getent( "tower_trap_range_trigger", "targetname" ); 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 = getent( "tower_shockbox_door", "targetname" );
e_brush delete(); e_brush delete();
a_t_travel_triggers = getentarray( "travel_trigger", "script_noteworthy" ); a_t_travel_triggers = getentarray( "travel_trigger", "script_noteworthy" );
foreach ( trigger in a_t_travel_triggers ) foreach ( trigger in a_t_travel_triggers )
{
trigger delete(); trigger delete();
}
a_e_gondola_lights = getentarray( "gondola_state_light", "targetname" ); a_e_gondola_lights = getentarray( "gondola_state_light", "targetname" );
foreach ( light in a_e_gondola_lights ) foreach ( light in a_e_gondola_lights )
{
light delete(); light delete();
}
a_e_gondola_landing_gates = getentarray( "gondola_landing_gates", "targetname" ); a_e_gondola_landing_gates = getentarray( "gondola_landing_gates", "targetname" );
foreach ( model in a_e_gondola_landing_gates ) foreach ( model in a_e_gondola_landing_gates )
{
model delete(); model delete();
}
a_e_gondola_landing_doors = getentarray( "gondola_landing_doors", "targetname" ); a_e_gondola_landing_doors = getentarray( "gondola_landing_doors", "targetname" );
foreach ( model in a_e_gondola_landing_doors ) foreach ( model in a_e_gondola_landing_doors )
{
model delete(); model delete();
}
a_e_gondola_gates = getentarray( "gondola_gates", "targetname" ); a_e_gondola_gates = getentarray( "gondola_gates", "targetname" );
foreach ( model in a_e_gondola_gates ) foreach ( model in a_e_gondola_gates )
{
model delete(); model delete();
}
a_e_gondola_doors = getentarray( "gondola_doors", "targetname" ); a_e_gondola_doors = getentarray( "gondola_doors", "targetname" );
foreach ( model in a_e_gondola_doors ) foreach ( model in a_e_gondola_doors )
{
model delete(); model delete();
}
m_gondola = getent( "zipline_gondola", "targetname" ); m_gondola = getent( "zipline_gondola", "targetname" );
m_gondola delete(); m_gondola delete();
t_ride_trigger = getent( "gondola_ride_trigger", "targetname" ); t_ride_trigger = getent( "gondola_ride_trigger", "targetname" );
t_ride_trigger delete(); t_ride_trigger delete();
a_classic_clips = getentarray( "classic_clips", "targetname" ); a_classic_clips = getentarray( "classic_clips", "targetname" );
foreach ( clip in a_classic_clips ) foreach ( clip in a_classic_clips )
{ {
clip connectpaths(); clip connectpaths();
clip delete(); clip delete();
} }
a_afterlife_props = getentarray( "afterlife_show", "targetname" ); a_afterlife_props = getentarray( "afterlife_show", "targetname" );
foreach ( m_prop in a_afterlife_props ) foreach ( m_prop in a_afterlife_props )
{
m_prop delete(); m_prop delete();
}
spork_portal = getent( "afterlife_show_spork", "targetname" ); spork_portal = getent( "afterlife_show_spork", "targetname" );
spork_portal delete(); spork_portal delete();
a_audio = getentarray( "at_headphones", "script_noteworthy" ); a_audio = getentarray( "at_headphones", "script_noteworthy" );
foreach ( model in a_audio ) foreach ( model in a_audio )
{
model delete(); model delete();
}
m_spoon_pickup = getent( "pickup_spoon", "targetname" ); m_spoon_pickup = getent( "pickup_spoon", "targetname" );
m_spoon_pickup delete(); m_spoon_pickup delete();
t_sq_bg = getent( "sq_bg_reward_pickup", "targetname" ); t_sq_bg = getent( "sq_bg_reward_pickup", "targetname" );
t_sq_bg delete(); t_sq_bg delete();
t_crafting_table = getentarray( "open_craftable_trigger", "targetname" ); t_crafting_table = getentarray( "open_craftable_trigger", "targetname" );
foreach ( trigger in t_crafting_table ) foreach ( trigger in t_crafting_table )
{
trigger delete(); trigger delete();
}
t_warden_fence = getent( "warden_fence_damage", "targetname" ); t_warden_fence = getent( "warden_fence_damage", "targetname" );
t_warden_fence delete(); t_warden_fence delete();
m_plane_about_to_crash = getent( "plane_about_to_crash", "targetname" ); m_plane_about_to_crash = getent( "plane_about_to_crash", "targetname" );
m_plane_about_to_crash delete(); m_plane_about_to_crash delete();
m_plane_craftable = getent( "plane_craftable", "targetname" ); m_plane_craftable = getent( "plane_craftable", "targetname" );
m_plane_craftable delete(); m_plane_craftable delete();
for ( i = 1; i <= 5; i++ ) for ( i = 1; i <= 5; i++ )
{ {
m_key_lock = getent( "masterkey_lock_" + i, "targetname" ); m_key_lock = getent( "masterkey_lock_" + i, "targetname" );
m_key_lock delete(); m_key_lock delete();
} }
m_shower_door = getent( "shower_key_door", "targetname" ); m_shower_door = getent( "shower_key_door", "targetname" );
m_shower_door delete(); m_shower_door delete();
m_nixie_door = getent( "nixie_door_left", "targetname" ); 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_door delete();
m_nixie_brush = getent( "nixie_tube_weaponclip", "targetname" ); m_nixie_brush = getent( "nixie_tube_weaponclip", "targetname" );
m_nixie_brush delete(); m_nixie_brush delete();
for ( i = 1; i <= 3; i++ ) for ( i = 1; i <= 3; i++ )
{ {
m_nixie_tube = getent( "nixie_tube_" + i, "targetname" ); m_nixie_tube = getent( "nixie_tube_" + i, "targetname" );
m_nixie_tube delete(); m_nixie_tube delete();
} }
t_elevator_door = getent( "nixie_elevator_door", "targetname" ); t_elevator_door = getent( "nixie_elevator_door", "targetname" );
t_elevator_door delete(); t_elevator_door delete();
e_elevator_clip = getent( "elevator_door_playerclip", "targetname" ); 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(); m_infirmary_case delete();
fake_plane_part = getent( "fake_veh_t6_dlc_zombie_part_control", "targetname" ); fake_plane_part = getent( "fake_veh_t6_dlc_zombie_part_control", "targetname" );
fake_plane_part delete(); fake_plane_part delete();
for ( i = 1; i <= 3; i++ ) for ( i = 1; i <= 3; i++ )
{ {
m_generator = getent( "generator_panel_" + i, "targetname" ); m_generator = getent( "generator_panel_" + i, "targetname" );
m_generator delete(); m_generator delete();
} }
a_m_generator_core = getentarray( "generator_core", "targetname" ); a_m_generator_core = getentarray( "generator_core", "targetname" );
foreach ( generator in a_m_generator_core ) foreach ( generator in a_m_generator_core )
{
generator delete(); generator delete();
}
e_playerclip = getent( "electric_chair_playerclip", "targetname" ); e_playerclip = getent( "electric_chair_playerclip", "targetname" );
e_playerclip delete(); e_playerclip delete();
for ( i = 1; i <= 4; i++ ) for ( i = 1; i <= 4; i++ )
{ {
t_use = getent( "trigger_electric_chair_" + i, "targetname" ); 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 = getent( "electric_chair_" + i, "targetname" );
m_chair delete(); m_chair delete();
} }
a_afterlife_interact = getentarray( "afterlife_interact", "targetname" ); a_afterlife_interact = getentarray( "afterlife_interact", "targetname" );
foreach ( model in a_afterlife_interact ) foreach ( model in a_afterlife_interact )
{ {
model turn_afterlife_interact_on(); model turn_afterlife_interact_on();
wait 0.1; wait 0.1;
} }
flag_wait( "initial_blackscreen_passed" ); 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" ); 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_fan_trap_trigs();
level thread maps/mp/zm_alcatraz_traps::init_acid_trap_trigs(); level thread maps\mp\zm_alcatraz_traps::init_acid_trap_trigs();
wait 1; wait 1;
level notify( "sleight_on" ); level notify( "sleight_on" );
wait_network_frame(); wait_network_frame();
@ -401,41 +418,40 @@ main() //checked partially changed to match cerberus output changed at own discr
wait_network_frame(); wait_network_frame();
level notify( "Pack_A_Punch_on" ); level notify( "Pack_A_Punch_on" );
wait_network_frame(); 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" ); self detach( "c_zom_guard_hat" );
} }
enemy_location_override( zombie, enemy ) //checked matches cerberus output enemy_location_override( zombie, enemy )
{ {
location = enemy.origin; location = enemy.origin;
if ( is_true( self.reroute ) ) if ( is_true( self.reroute ) )
{ {
if ( isDefined( self.reroute_origin ) ) if ( isdefined( self.reroute_origin ) )
{
location = self.reroute_origin; location = self.reroute_origin;
} }
}
return location; return location;
} }
magicbox_face_spawn() //checked matches cerberus output magicbox_face_spawn()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
if ( !is_gametype_active( "zgrief" ) ) if ( !is_gametype_active( "zgrief" ) )
{
return; return;
}
while ( 1 ) while ( true )
{ {
self waittill( "user_grabbed_weapon" ); self waittill( "user_grabbed_weapon" );
if ( randomint( 50000 ) == 115 ) if ( randomint( 50000 ) == 115 )
{ {
self playsoundtoplayer( "zmb_easteregg_face", self ); self playsoundtoplayer( "zmb_easteregg_face", self );
@ -444,39 +460,39 @@ magicbox_face_spawn() //checked matches cerberus output
self.wth_elem.vertalign = "fullscreen"; self.wth_elem.vertalign = "fullscreen";
self.wth_elem.sort = 1000; self.wth_elem.sort = 1000;
self.wth_elem.foreground = 0; 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 setshader( "zm_al_wth_zombie", 640, 480 );
self.wth_elem.hidewheninmenu = 1; self.wth_elem.hidewheninmenu = 1;
wait 0.25; wait 0.25;
self.wth_elem destroy(); self.wth_elem destroy();
} }
wait 0.05; wait 0.05;
} }
} }
#using_animtree("fxanim_props");
turn_afterlife_interact_on() 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" ) 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; return;
}
if ( self.script_string == "electric_cherry_on" || self.script_string == "sleight_on" || self.script_string == "wires_admin_door" ) 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["on"] = %fxanim_zom_al_shock_box_on_anim;
level.shockbox_anim[ "off" ] = %fxanim_zom_al_shock_box_off_anim; level.shockbox_anim["off"] = %fxanim_zom_al_shock_box_off_anim;
} }
if ( issubstr( self.model, "p6_zm_al_shock_box" ) ) if ( issubstr( self.model, "p6_zm_al_shock_box" ) )
{ {
self useanimtree( -1 ); self useanimtree( -1 );
self setmodel( "p6_zm_al_shock_box_on" ); self setmodel( "p6_zm_al_shock_box_on" );
self setanim( level.shockbox_anim[ "on" ] ); self setanim( level.shockbox_anim["on"] );
} }
} }
else else
{
self delete(); self delete();
}
} }

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -1,28 +1,30 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zombies/_zm_magicbox; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_game_module; #include maps\mp\_utility;
#include maps/mp/gametypes_zm/_zm_gametype; #include common_scripts\utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_utility;
#include common_scripts/utility; #include maps\mp\gametypes_zm\_zm_gametype;
#include maps/mp/_utility; #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\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\zombies\_zm_game_module::set_current_game_module( level.game_module_standard_index );
flag_wait( "initial_blackscreen_passed" ); flag_wait( "initial_blackscreen_passed" );
flag_set( "power_on" ); flag_set( "power_on" );
zm_treasure_chest_init(); zm_treasure_chest_init();
} }
zm_treasure_chest_init() //checked matches cerberus output zm_treasure_chest_init()
{ {
chest1 = getstruct( "start_chest", "script_noteworthy" ); chest1 = getstruct( "start_chest", "script_noteworthy" );
level.chests = []; level.chests = [];
level.chests[ level.chests.size ] = chest1; 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,38 +1,39 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zombies/_zm_ai_brutus; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_stats; #include common_scripts\utility;
#include maps/mp/zombies/_zm_audio; #include maps\mp\_utility;
#include maps/mp/animscripts/zm_death; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_laststand; #include maps\mp\zombies\_zm_score;
#include maps/mp/zombies/_zm_score; #include maps\mp\zombies\_zm_laststand;
#include maps/mp/zombies/_zm_utility; #include maps\mp\animscripts\zm_death;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_audio;
#include common_scripts/utility; #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()
init_fan_trap_trigs() //checked matches cerberus output
{ {
trap_trigs = getentarray( "fan_trap_use_trigger", "targetname" ); trap_trigs = getentarray( "fan_trap_use_trigger", "targetname" );
array_thread( trap_trigs, ::fan_trap_think ); array_thread( trap_trigs, ::fan_trap_think );
init_fan_fxanim( "wardens_office" ); init_fan_fxanim( "wardens_office" );
} }
init_fan_trap_animtree() //checked matches cerberus output init_fan_trap_animtree()
{ {
scriptmodelsuseanimtree( -1 ); 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" ); e_fan = getent( "fxanim_fan_" + str_loc, "targetname" );
level.fan_trap_fxanims = []; level.fan_trap_fxanims = [];
level.fan_trap_fxanims[ "fan_trap_start" ] = %fxanim_zom_al_trap_fan_start_anim; level.fan_trap_fxanims["fan_trap_start"] = %fxanim_zom_al_trap_fan_start_anim;
level.fan_trap_fxanims[ "fan_trap_idle" ] = %fxanim_zom_al_trap_fan_idle_anim; level.fan_trap_fxanims["fan_trap_idle"] = %fxanim_zom_al_trap_fan_idle_anim;
level.fan_trap_fxanims[ "fan_trap_end" ] = %fxanim_zom_al_trap_fan_end_anim; 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" ); triggers = getentarray( self.targetname, "targetname" );
self.cost = 1000; self.cost = 1000;
@ -49,17 +50,17 @@ fan_trap_think() //checked changed to match cerberus output
flag_wait( "activate_warden_office" ); flag_wait( "activate_warden_office" );
zapper_light_green( light_name ); zapper_light_green( light_name );
self hint_string( &"ZM_PRISON_FAN_TRAP", self.cost ); self hint_string( &"ZM_PRISON_FAN_TRAP", self.cost );
while ( 1 )
while ( true )
{ {
self waittill( "trigger", who ); self waittill( "trigger", who );
if ( who in_revive_trigger() ) if ( who in_revive_trigger() )
{
continue; continue;
}
if ( !isDefined( self.is_available ) ) if ( !isdefined( self.is_available ) )
{
continue; continue;
}
if ( is_player_valid( who ) ) if ( is_player_valid( who ) )
{ {
if ( who.score >= self.cost ) if ( who.score >= self.cost )
@ -69,26 +70,29 @@ fan_trap_think() //checked changed to match cerberus output
if ( !self.has_been_used ) if ( !self.has_been_used )
{ {
self.has_been_used = 1; 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" ); who do_player_general_vox( "general", "discover_trap" );
} }
else else
{
who do_player_general_vox( "general", "start_trap" ); who do_player_general_vox( "general", "start_trap" );
}
self.zombie_dmg_trig.in_use = 1; self.zombie_dmg_trig.in_use = 1;
self.zombie_dmg_trig.active = 1; self.zombie_dmg_trig.active = 1;
self playsound( "zmb_trap_activate" ); self playsound( "zmb_trap_activate" );
self thread fan_trap_move_switch( self ); self thread fan_trap_move_switch( self );
self waittill( "switch_activated" ); self waittill( "switch_activated" );
who minus_to_player_score( self.cost ); who minus_to_player_score( self.cost );
level.trapped_track[ "fan" ] = 1; level.trapped_track["fan"] = 1;
level notify( "trap_activated" ); 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" ); array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_ACTIVE" );
self.zombie_dmg_trig setvisibletoall(); self.zombie_dmg_trig setvisibletoall();
self thread activate_fan_trap(); self thread activate_fan_trap();
self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string ); self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string );
clientnotify( self.script_string + "off" ); clientnotify( self.script_string + "off" );
self.zombie_dmg_trig notify( "fan_trap_finished" ); self.zombie_dmg_trig notify( "fan_trap_finished" );
self.zombie_dmg_trig.active = 0; self.zombie_dmg_trig.active = 0;
@ -105,24 +109,27 @@ 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 ); self.zombie_dmg_trig thread fan_trap_damage( self );
e_fan = getent( "fxanim_fan_" + self.script_string, "targetname" ); e_fan = getent( "fxanim_fan_" + self.script_string, "targetname" );
e_fan useanimtree( -1 ); e_fan useanimtree( -1 );
e_fan playsound( "zmb_trap_fan_start" ); e_fan playsound( "zmb_trap_fan_start" );
e_fan playloopsound( "zmb_trap_fan_loop", 2 ); e_fan playloopsound( "zmb_trap_fan_loop", 2 );
n_start_time = getanimlength( level.fan_trap_fxanims[ "fan_trap_start" ] ); n_start_time = getanimlength( level.fan_trap_fxanims["fan_trap_start"] );
n_idle_time = getanimlength( level.fan_trap_fxanims[ "fan_trap_idle" ] ); n_idle_time = getanimlength( level.fan_trap_fxanims["fan_trap_idle"] );
n_end_time = getanimlength( level.fan_trap_fxanims[ "fan_trap_end" ] ); 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 ); 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 ); e_fan setanim( level.fan_trap_fxanims["fan_trap_idle"], 1, 0.1, 1 );
self thread fan_trap_timeout(); self thread fan_trap_timeout();
self thread fan_trap_rumble_think(); self thread fan_trap_rumble_think();
self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string ); self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string );
e_fan setanim( level.fan_trap_fxanims[ "fan_trap_end" ], 1, 0.1, 1 );
e_fan setanim( level.fan_trap_fxanims["fan_trap_end"], 1, 0.1, 1 );
a_players = getplayers(); a_players = getplayers();
foreach ( player in a_players ) foreach ( player in a_players )
{ {
if ( is_true( player.fan_trap_rumble ) ) 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; player.fan_trap_rumble = 0;
} }
} }
e_fan stoploopsound( 0.75 ); e_fan stoploopsound( 0.75 );
e_fan playsound( "zmb_trap_fan_end" ); 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 ); 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; wait 0.05;
n_duration += 0.05;
}
self.zombie_dmg_trig notify( "trap_finished_" + self.script_string ); 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 ); self.zombie_dmg_trig endon( "trap_finished_" + self.script_string );
while ( 1 )
while ( true )
{ {
self.rumble_trig waittill( "trigger", ent ); self.rumble_trig waittill( "trigger", ent );
if ( isplayer( ent ) ) if ( isplayer( ent ) )
{ {
if ( !is_true( ent.fan_trap_rumble ) ) if ( !is_true( ent.fan_trap_rumble ) )
{
self thread fan_trap_rumble( ent ); 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( "death" );
player endon( "disconnect" ); player endon( "disconnect" );
self.zombie_dmg_trig endon( "trap_finished_" + self.script_string ); self.zombie_dmg_trig endon( "trap_finished_" + self.script_string );
while ( 1 )
while ( true )
{ {
if ( player istouching( self.rumble_trig ) ) 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 ); self thread [[ level.custom_fan_trap_damage_func ]]( parent );
return; return;
} }
self endon( "fan_trap_finished" ); self endon( "fan_trap_finished" );
while ( 1 )
while ( true )
{ {
self waittill( "trigger", ent ); self waittill( "trigger", ent );
if ( isplayer( ent ) ) if ( isplayer( ent ) )
{
ent thread player_fan_trap_damage(); ent thread player_fan_trap_damage();
}
else else
{ {
if ( is_true( ent.is_brutus ) ) 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; return;
} }
if ( !isDefined( ent.marked_for_death ) )
if ( !isdefined( ent.marked_for_death ) )
{ {
ent.marked_for_death = 1; ent.marked_for_death = 1;
ent thread zombie_fan_trap_death(); 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 = ""; light_name = "";
tswitch = getent( "trap_handle_" + parent.script_linkto, "targetname" ); 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 ); zapper_light_red( light_name );
tswitch rotatepitch( -180, 0.5 ); tswitch rotatepitch( -180, 0.5 );
tswitch playsound( "amb_sparks_l_b" ); tswitch playsound( "amb_sparks_l_b" );
tswitch waittill( "rotatedone" ); tswitch waittill( "rotatedone" );
self notify( "switch_activated" ); self notify( "switch_activated" );
self waittill( "available" ); self waittill( "available" );
tswitch rotatepitch( 180, 0.5 ); tswitch rotatepitch( 180, 0.5 );
zapper_light_green( light_name ); zapper_light_green( light_name );
} }
player_fan_trap_damage() //checked matches cerberus output player_fan_trap_damage()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); 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 ); radiusdamage( self.origin, 10, self.health + 100, self.health + 100 );
}
else else
{
self dodamage( 50, self.origin ); self dodamage( 50, self.origin );
}
} }
zombie_fan_trap_death() //checked matches cerberus output zombie_fan_trap_death()
{ {
self endon( "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.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 setclientfield( "fan_trap_blood_fx", 1 );
self thread stop_fan_trap_blood_fx(); self thread stop_fan_trap_blood_fx();
self dodamage( self.health + 1000, self.origin ); 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 ); 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" ); trap_trigs = getentarray( "acid_trap_trigger", "targetname" );
array_thread( trap_trigs, ::acid_trap_think ); array_thread( trap_trigs, ::acid_trap_think );
level thread acid_trap_host_migration_listener(); level thread acid_trap_host_migration_listener();
} }
acid_trap_think() //checked changed to match cerberus output acid_trap_think()
{ {
triggers = getentarray( self.targetname, "targetname" ); triggers = getentarray( self.targetname, "targetname" );
self.is_available = 1; self.is_available = 1;
@ -287,17 +299,17 @@ acid_trap_think() //checked changed to match cerberus output
flag_wait_any( "activate_cafeteria", "activate_infirmary" ); flag_wait_any( "activate_cafeteria", "activate_infirmary" );
zapper_light_green( light_name ); zapper_light_green( light_name );
self hint_string( &"ZM_PRISON_ACID_TRAP", self.cost ); self hint_string( &"ZM_PRISON_ACID_TRAP", self.cost );
while ( 1 )
while ( true )
{ {
self waittill( "trigger", who ); self waittill( "trigger", who );
if ( who in_revive_trigger() ) if ( who in_revive_trigger() )
{
continue; continue;
}
if ( !isDefined( self.is_available ) ) if ( !isdefined( self.is_available ) )
{
continue; continue;
}
if ( is_player_valid( who ) ) if ( is_player_valid( who ) )
{ {
if ( who.score >= self.cost ) if ( who.score >= self.cost )
@ -307,38 +319,39 @@ acid_trap_think() //checked changed to match cerberus output
if ( !self.has_been_used ) if ( !self.has_been_used )
{ {
self.has_been_used = 1; 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" ); who do_player_general_vox( "general", "discover_trap" );
} }
else else
{
who do_player_general_vox( "general", "start_trap" ); who do_player_general_vox( "general", "start_trap" );
}
self.zombie_dmg_trig.in_use = 1; self.zombie_dmg_trig.in_use = 1;
self.zombie_dmg_trig.active = 1; self.zombie_dmg_trig.active = 1;
self playsound( "zmb_trap_activate" ); self playsound( "zmb_trap_activate" );
self thread acid_trap_move_switch( self ); self thread acid_trap_move_switch( self );
self waittill( "switch_activated" ); self waittill( "switch_activated" );
who minus_to_player_score( self.cost ); who minus_to_player_score( self.cost );
level.trapped_track[ "acid" ] = 1; level.trapped_track["acid"] = 1;
level notify( "trap_activated" ); 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" ); array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_ACTIVE" );
self thread activate_acid_trap(); self thread activate_acid_trap();
self.zombie_dmg_trig waittill( "acid_trap_fx_done" ); self.zombie_dmg_trig waittill( "acid_trap_fx_done" );
clientnotify( self.script_string + "off" ); clientnotify( self.script_string + "off" );
if ( isDefined( self.fx_org ) )
{ if ( isdefined( self.fx_org ) )
self.fx_org delete(); self.fx_org delete();
}
if ( isDefined( self.zapper_fx_org ) ) if ( isdefined( self.zapper_fx_org ) )
{
self.zapper_fx_org delete(); 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.zapper_fx_switch_org delete();
}
self.zombie_dmg_trig notify( "acid_trap_finished" ); self.zombie_dmg_trig notify( "acid_trap_finished" );
self.zombie_dmg_trig.active = 0; self.zombie_dmg_trig.active = 0;
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_COOLDOWN" ); 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 = ""; light_name = "";
tswitch = getent( "trap_handle_" + parent.script_linkto, "targetname" ); 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 ); zapper_light_red( light_name );
tswitch rotatepitch( -180, 0.5 ); tswitch rotatepitch( -180, 0.5 );
tswitch playsound( "amb_sparks_l_b" ); tswitch playsound( "amb_sparks_l_b" );
tswitch waittill( "rotatedone" ); tswitch waittill( "rotatedone" );
self notify( "switch_activated" ); self notify( "switch_activated" );
self waittill( "available" ); self waittill( "available" );
tswitch rotatepitch( 180, 0.5 ); tswitch rotatepitch( 180, 0.5 );
zapper_light_green( light_name ); zapper_light_green( light_name );
} }
activate_acid_trap() //checked changed to match cerberus output activate_acid_trap()
{ {
clientnotify( self.target ); clientnotify( self.target );
fire_points = getstructarray( self.target, "targetname" ); fire_points = getstructarray( self.target, "targetname" );
for ( i = 0; i < fire_points.size; i++ ) for ( i = 0; i < fire_points.size; i++ )
{ {
wait_network_frame(); wait_network_frame();
fire_points[ i ] thread acid_trap_fx( self ); fire_points[i] thread acid_trap_fx( self );
} }
self.zombie_dmg_trig thread acid_trap_damage(); 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 ]](); self thread [[ level.custom_acid_trap_damage_func ]]();
return; return;
} }
self endon( "acid_trap_finished" ); self endon( "acid_trap_finished" );
while ( 1 )
while ( true )
{ {
self waittill( "trigger", ent ); self waittill( "trigger", ent );
if ( isplayer( ent ) ) if ( isplayer( ent ) )
{
ent thread player_acid_damage( self ); ent thread player_acid_damage( self );
}
else else
{ {
if ( is_true( ent.is_brutus ) ) 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; return;
} }
if ( !isDefined( ent.marked_for_death ) )
if ( !isdefined( ent.marked_for_death ) )
{ {
ent.marked_for_death = 1; ent.marked_for_death = 1;
ent thread zombie_acid_damage(); 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 endon( "death" );
self setclientfield( "acid_trap_death_fx", 1 ); self setclientfield( "acid_trap_death_fx", 1 );
wait randomfloatrange( 0.25, 2 ); wait( randomfloatrange( 0.25, 2.0 ) );
if ( !isDefined( self.is_brutus ) )
if ( !isdefined( self.is_brutus ) )
{ {
self.a.gib_ref = random( array( "right_arm", "left_arm", "head", "right_leg", "left_leg", "no_legs" ) ); 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 ); 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 ); 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( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
t_damage endon( "acid_trap_finished" ); 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.is_in_acid = 1;
self thread player_acid_damage_cooldown(); self thread player_acid_damage_cooldown();
while ( self istouching( t_damage ) && !self player_is_in_laststand() && !self.afterlife ) while ( self istouching( t_damage ) && !self player_is_in_laststand() && !self.afterlife )
{ {
self dodamage( self.maxhealth / 2, self.origin ); 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" ); self endon( "disconnect" );
wait 1; wait 1;
if ( isDefined( self ) )
{ if ( isdefined( self ) )
self.is_in_acid = undefined; self.is_in_acid = undefined;
}
} }
acid_trap_fx( notify_ent ) //checked matches cerberus output acid_trap_fx( notify_ent )
{ {
wait 25; wait 25;
notify_ent.zombie_dmg_trig notify( "acid_trap_fx_done" ); 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 endon( "end_game" );
level notify( "acid_trap_hostmigration" ); level notify( "acid_trap_hostmigration" );
level endon( "acid_trap_hostmigration" ); level endon( "acid_trap_hostmigration" );
while ( 1 )
while ( true )
{ {
level waittill( "host_migration_end" ); level waittill( "host_migration_end" );
trap_trigs = getentarray( "acid_trap_trigger", "targetname" ); trap_trigs = getentarray( "acid_trap_trigger", "targetname" );
foreach ( trigger in trap_trigs ) 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 ) 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" ); trap_trigs = getentarray( "tower_trap_activate_trigger", "targetname" );
foreach ( trigger in trap_trigs ) foreach ( trigger in trap_trigs )
{
trigger thread tower_trap_trigger_think(); 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.range_trigger = getent( self.target, "targetname" );
self.upgrade_trigger = getent( self.script_string, "script_noteworthy" ); 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.in_use = 0;
self.has_been_used = 0; self.has_been_used = 0;
self.sndtowerent = spawn( "script_origin", ( -21, 5584, 356 ) ); self.sndtowerent = spawn( "script_origin", ( -21, 5584, 356 ) );
while ( 1 )
while ( true )
{ {
self hint_string( &"ZM_PRISON_TOWER_TRAP", self.cost ); self hint_string( &"ZM_PRISON_TOWER_TRAP", self.cost );
self waittill( "trigger", who ); self waittill( "trigger", who );
if ( who in_revive_trigger() ) if ( who in_revive_trigger() )
{
continue; continue;
}
if ( !isDefined( self.is_available ) ) if ( !isdefined( self.is_available ) )
{
continue; continue;
}
if ( is_player_valid( who ) ) if ( is_player_valid( who ) )
{ {
if ( who.score >= self.cost ) 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" ); who do_player_general_vox( "general", "discover_trap" );
} }
else else
{
who do_player_general_vox( "general", "start_trap" ); who do_player_general_vox( "general", "start_trap" );
}
self.in_use = 1; self.in_use = 1;
self.active = 1; self.active = 1;
play_sound_at_pos( "purchase", who.origin ); play_sound_at_pos( "purchase", who.origin );
self thread tower_trap_move_switch( self ); self thread tower_trap_move_switch( self );
self playsound( "zmb_trap_activate" ); self playsound( "zmb_trap_activate" );
self waittill( "switch_activated" ); self waittill( "switch_activated" );
who minus_to_player_score( self.cost ); who minus_to_player_score( self.cost );
level.trapped_track[ "tower" ] = 1; level.trapped_track["tower"] = 1;
level notify( "trap_activated" ); 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 hint_string( &"ZOMBIE_TRAP_ACTIVE" );
self.sndtowerent playsound( "zmb_trap_tower_start" ); self.sndtowerent playsound( "zmb_trap_tower_start" );
self.sndtowerent playloopsound( "zmb_trap_tower_loop", 1 ); 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(); self thread tower_upgrade_trigger_think();
level thread open_tower_trap_upgrade_panel(); level thread open_tower_trap_upgrade_panel();
level thread tower_trap_upgrade_panel_closes_early(); level thread tower_trap_upgrade_panel_closes_early();
self waittill( "tower_trap_off" ); self waittill( "tower_trap_off" );
self.sndtowerent stoploopsound( 1 ); self.sndtowerent stoploopsound( 1 );
self.sndtowerent playsound( "zmb_trap_tower_end" ); self.sndtowerent playsound( "zmb_trap_tower_end" );
self.upgrade_trigger notify( "afterlife_interact_reset" ); 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 endon( "tower_trap_off" );
self.upgrade_trigger.cost = 1000; self.upgrade_trigger.cost = 1000;
self.upgrade_trigger.in_use = 0; self.upgrade_trigger.in_use = 0;
self.upgrade_trigger.is_available = 1; self.upgrade_trigger.is_available = 1;
while ( 1 )
while ( true )
{ {
level waittill( self.upgrade_trigger.script_string ); level waittill( self.upgrade_trigger.script_string );
level.trapped_track[ "tower_upgrade" ] = 1;
level.trapped_track["tower_upgrade"] = 1;
level notify( "tower_trap_upgraded" ); level notify( "tower_trap_upgraded" );
level notify( "close_tower_trap_upgrade_panel" ); level notify( "close_tower_trap_upgrade_panel" );
self upgrade_tower_trap_weapon(); self upgrade_tower_trap_weapon();
self notify( "tower_trap_reset_timer" ); self notify( "tower_trap_reset_timer" );
self thread tower_trap_timer(); self thread tower_trap_timer();
self waittill( "tower_trap_off" ); self waittill( "tower_trap_off" );
wait 25; 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 = 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" ); 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" ); level endon( "tower_trap_upgraded" );
n_waittime = 24; n_waittime = 24;
wait n_waittime; wait( n_waittime );
level notify( "close_tower_trap_upgrade_panel" ); level notify( "close_tower_trap_upgrade_panel" );
} }
tower_trap_move_switch( parent ) //checked matches cerberus output tower_trap_move_switch( parent )
{ {
light_name = ""; light_name = "";
tswitch = getent( "trap_handle_" + parent.script_linkto, "targetname" ); 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 ); zapper_light_red( light_name );
tswitch rotatepitch( -180, 0.5 ); tswitch rotatepitch( -180, 0.5 );
tswitch playsound( "amb_sparks_l_b" ); tswitch playsound( "amb_sparks_l_b" );
tswitch waittill( "rotatedone" ); tswitch waittill( "rotatedone" );
self notify( "switch_activated" ); self notify( "switch_activated" );
self waittill( "available" ); self waittill( "available" );
tswitch rotatepitch( 180, 0.5 ); tswitch rotatepitch( 180, 0.5 );
if ( isDefined( parent.script_noteworthy ) )
{ if ( isdefined( parent.script_noteworthy ) )
zapper_light_green( light_name ); zapper_light_green( light_name );
}
} }
activate_tower_trap() //checked changed to match cerberus output activate_tower_trap()
{ {
self endon( "tower_trap_off" ); self endon( "tower_trap_off" );
self.weapon_name = "tower_trap_zm"; self.weapon_name = "tower_trap_zm";
self.tag_to_target = "J_Head"; self.tag_to_target = "J_Head";
self.trap_reload_time = 0.75; self.trap_reload_time = 0.75;
while ( 1 )
while ( true )
{ {
zombies = getaiarray( level.zombie_team ); zombies = getaiarray( level.zombie_team );
zombies_sorted = []; zombies_sorted = [];
foreach(zombie in zombies)
foreach ( zombie in zombies )
{ {
if ( zombie istouching( self.range_trigger ) ) if ( zombie istouching( self.range_trigger ) )
{ zombies_sorted[zombies_sorted.size] = zombie;
zombies_sorted[ zombies_sorted.size ] = zombie;
}
} }
if ( zombies_sorted.size <= 0 ) if ( zombies_sorted.size <= 0 )
{ {
wait_network_frame(); wait_network_frame();
continue;
} }
else 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.weapon_name = "tower_trap_upgraded_zm";
self.tag_to_target = "J_SpineLower"; self.tag_to_target = "J_SpineLower";
self.trap_reload_time = 1.5; self.trap_reload_time = 1.5;
} }
tower_trap_timer() //checked matches cerberus output tower_trap_timer()
{ {
self endon( "tower_trap_reset_timer" ); self endon( "tower_trap_reset_timer" );
/*
/# /#
self thread debug_tower_trap_timer(); self thread debug_tower_trap_timer();
#/ #/
*/
wait 25; wait 25;
self notify( "tower_trap_off" ); 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" ); self endon( "tower_trap_reset_timer" );
for ( i = 1; i <= 25; i++ ) for ( i = 1; i <= 25; i++ )
{ {
/*
/# /#
iprintln( "Tower Trap Timer = " + i ); iprintln( "Tower Trap Timer = " + i );
#/ #/
*/ wait 1.0;
wait 1;
} }
} }
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 ); self thread [[ level.custom_tower_trap_fires_func ]]( a_zombies );
return; return;
} }
self endon( "tower_trap_off" ); self endon( "tower_trap_off" );
e_org = getstruct( self.range_trigger.target, "targetname" ); 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 ]; e_target = a_zombies[n_index];
v_zombietarget = e_target gettagorigin( self.tag_to_target ); 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 ); arrayremovevalue( a_zombies, e_target, 0 );
wait_network_frame(); wait_network_frame();
if ( a_zombies.size <= 0 ) asm_cond( a_zombies.size <= 0, loc_2676 );
{ asm_jump( loc_268A );
break;
}
n_index = randomintrange( 0, a_zombies.size );
}
} }
} }
hint_string( string, cost ) //checked matches cerberus output hint_string( string, cost )
{ {
if ( isDefined( cost ) ) if ( isdefined( cost ) )
{
self sethintstring( string, cost ); self sethintstring( string, cost );
}
else else
{
self sethintstring( string ); self sethintstring( string );
}
self setcursorhint( "HINT_NOICON" ); self setcursorhint( "HINT_NOICON" );
} }
zapper_light_red( lightname ) //checked changed to match cerberus output zapper_light_red( lightname )
{ {
zapper_lights = getentarray( lightname, "targetname" ); zapper_lights = getentarray( lightname, "targetname" );
for ( i = 0; i < zapper_lights.size; i++ ) for ( i = 0; i < zapper_lights.size; i++ )
{ zapper_lights[i] setmodel( "p6_zm_al_wall_trap_control_red" );
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" ); zapper_lights = getentarray( lightname, "targetname" );
for ( i = 0; i < zapper_lights.size; i++ ) for ( i = 0; i < zapper_lights.size; i++ )
{ zapper_lights[i] setmodel( "p6_zm_al_wall_trap_control" );
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" ); tswitch = getent( "trap_handle_" + self.script_linkto, "targetname" );
switch( tswitch.script_linkname )
switch ( tswitch.script_linkname )
{ {
case "1":
case "2": case "2":
case "1":
light_name = "trap_control_wardens_office"; light_name = "trap_control_wardens_office";
break; break;
case "3":
case "4":
case "5": case "5":
case "4":
case "3":
light_name = "trap_control_cafeteria"; light_name = "trap_control_cafeteria";
break; break;
case "99": case "99":
light_name = "trap_control_docks"; light_name = "trap_control_docks";
break; break;
} }
return light_name; return light_name;
} }

View File

@ -1,90 +1,93 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zombies/_zm_powerups; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_score; #include common_scripts\utility;
#include maps/mp/zombies/_zm_zonemgr; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_audio; #include maps\mp\zombies\_zm_utility;
#include maps/mp/animscripts/shared; #include maps\mp\zombies\_zm_net;
#include maps/mp/zombies/_zm_spawner; #include maps\mp\zombies\_zm_spawner;
#include maps/mp/zombies/_zm_net; #include maps\mp\animscripts\shared;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_audio;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_zonemgr;
#include common_scripts/utility; #include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_powerups;
//#using_animtree( "fxanim_props" ); //leave commented for now for compiling init()
init() //checked changed to match cerberus output
{ {
flag_init( "soul_catchers_charged" ); flag_init( "soul_catchers_charged" );
level.soul_catchers = []; level.soul_catchers = [];
level.soul_catchers_vol = []; level.soul_catchers_vol = [];
level.no_gib_in_wolf_area = ::check_for_zombie_in_wolf_area; 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_2"] = getent( "wolf_clip_docks", "targetname" );
level.soul_catcher_clip[ "rune_3" ] = getent( "wolf_clip_infirmary", "targetname" ); level.soul_catcher_clip["rune_3"] = getent( "wolf_clip_infirmary", "targetname" );
foreach ( e_clip in level.soul_catcher_clip ) foreach ( e_clip in level.soul_catcher_clip )
{
e_clip setinvisibletoall(); e_clip setinvisibletoall();
}
level thread create_anim_references_on_server(); level thread create_anim_references_on_server();
registerclientfield( "actor", "make_client_clone", 9000, 4, "int" ); registerclientfield( "actor", "make_client_clone", 9000, 4, "int" );
onplayerconnect_callback( ::toggle_redeemer_trigger ); onplayerconnect_callback( ::toggle_redeemer_trigger );
onplayerconnect_callback( ::hellhole_projectile_watch ); onplayerconnect_callback( ::hellhole_projectile_watch );
onplayerconnect_callback( ::hellhole_tomahawk_watch ); onplayerconnect_callback( ::hellhole_tomahawk_watch );
level.a_wolf_structs = getstructarray( "wolf_position", "targetname" ); level.a_wolf_structs = getstructarray( "wolf_position", "targetname" );
for ( i = 0; i < level.a_wolf_structs.size; i++ ) for ( i = 0; i < level.a_wolf_structs.size; i++ )
{ {
registerclientfield( "world", level.a_wolf_structs[ i ].script_parameters, 9000, 3, "int" ); registerclientfield( "world", level.a_wolf_structs[i].script_parameters, 9000, 3, "int" );
level.soul_catchers[ i ] = level.a_wolf_structs[ i ]; level.soul_catchers[i] = level.a_wolf_structs[i];
level.soul_catchers_vol[ i ] = getent( level.a_wolf_structs[ i ].target, "targetname" ); level.soul_catchers_vol[i] = getent( level.a_wolf_structs[i].target, "targetname" );
} }
for ( i = 0; i < level.soul_catchers.size; i++ ) for ( i = 0; i < level.soul_catchers.size; i++ )
{ {
level.soul_catchers[ i ].souls_received = 0; level.soul_catchers[i].souls_received = 0;
level.soul_catchers[ i ].is_eating = 0; level.soul_catchers[i].is_eating = 0;
level.soul_catchers[ i ] thread soul_catcher_check(); level.soul_catchers[i] thread soul_catcher_check();
if ( is_classic() ) if ( is_classic() )
{ level.soul_catchers[i] thread soul_catcher_state_manager();
level.soul_catchers[ i ] thread soul_catcher_state_manager();
}
else else
{ level.soul_catchers[i] thread grief_soul_catcher_state_manager();
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[ 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_vol[ i ] = getent( level.soul_catchers[ i ].target, "targetname" );
} }
level.soul_catchers_charged = 0; level.soul_catchers_charged = 0;
level thread soul_catchers_charged(); level thread soul_catchers_charged();
array_thread( level.zombie_spawners, ::add_spawn_function, ::zombie_spawn_func ); 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; root = %root;
wolfhead_intro_anim = %o_zombie_dreamcatcher_intro; wolfhead_intro_anim = %o_zombie_dreamcatcher_intro;
wolfhead_outtro_anim = %o_zombie_dreamcatcher_outtro; wolfhead_outtro_anim = %o_zombie_dreamcatcher_outtro;
woflhead_idle_anims = []; woflhead_idle_anims = [];
wolfhead_idle_anim[ 0 ] = %o_zombie_dreamcatcher_idle; wolfhead_idle_anim[0] = %o_zombie_dreamcatcher_idle;
wolfhead_idle_anim[ 1 ] = %o_zombie_dreamcatcher_idle_twitch_scan; wolfhead_idle_anim[1] = %o_zombie_dreamcatcher_idle_twitch_scan;
wolfhead_idle_anim[ 2 ] = %o_zombie_dreamcatcher_idle_twitch_shake; wolfhead_idle_anim[2] = %o_zombie_dreamcatcher_idle_twitch_shake;
wolfhead_idle_anim[ 3 ] = %o_zombie_dreamcatcher_idle_twitch_yawn; wolfhead_idle_anim[3] = %o_zombie_dreamcatcher_idle_twitch_yawn;
wolfhead_body_death = %ai_zombie_dreamcatch_impact; wolfhead_body_death = %ai_zombie_dreamcatch_impact;
wolfhead_body_float = %ai_zombie_dreamcatch_rise; wolfhead_body_float = %ai_zombie_dreamcatch_rise;
wolfhead_body_shrink = %ai_zombie_dreamcatch_shrink_a; wolfhead_body_shrink = %ai_zombie_dreamcatch_shrink_a;
wolfhead_pre_eat_anims = []; wolfhead_pre_eat_anims = [];
wolfhead_pre_eat_anims[ "right" ] = %o_zombie_dreamcatcher_wallconsume_pre_eat_r; wolfhead_pre_eat_anims["right"] = %o_zombie_dreamcatcher_wallconsume_pre_eat_r;
wolfhead_pre_eat_anims[ "left" ] = %o_zombie_dreamcatcher_wallconsume_pre_eat_l; wolfhead_pre_eat_anims["left"] = %o_zombie_dreamcatcher_wallconsume_pre_eat_l;
wolfhead_pre_eat_anims[ "front" ] = %o_zombie_dreamcatcher_wallconsume_pre_eat_f; wolfhead_pre_eat_anims["front"] = %o_zombie_dreamcatcher_wallconsume_pre_eat_f;
wolfhead_eat_anims[ "right" ] = %o_zombie_dreamcatcher_wallconsume_align_r; wolfhead_eat_anims["right"] = %o_zombie_dreamcatcher_wallconsume_align_r;
wolfhead_eat_anims[ "left" ] = %o_zombie_dreamcatcher_wallconsume_align_l; wolfhead_eat_anims["left"] = %o_zombie_dreamcatcher_wallconsume_align_l;
wolfhead_eat_anims[ "front" ] = %o_zombie_dreamcatcher_wallconsume_align_f; wolfhead_eat_anims["front"] = %o_zombie_dreamcatcher_wallconsume_align_f;
wolfhead_body_anims[ "right" ] = %ai_zombie_dreamcatcher_wallconsume_align_r; wolfhead_body_anims["right"] = %ai_zombie_dreamcatcher_wallconsume_align_r;
wolfhead_body_anims[ "left" ] = %ai_zombie_dreamcatcher_wallconsume_align_l; wolfhead_body_anims["left"] = %ai_zombie_dreamcatcher_wallconsume_align_l;
wolfhead_body_anims[ "front" ] = %ai_zombie_dreamcatcher_wallconsume_align_f; 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" ) if ( self.script_noteworthy == "rune_3" )
{ {
trigger = getent( "wolf_hurt_trigger", "targetname" ); 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 = getent( "wolf_hurt_trigger_docks", "targetname" );
trigger hide(); trigger hide();
} }
level setclientfield( self.script_parameters, 0 ); level setclientfield( self.script_parameters, 0 );
self waittill( "first_zombie_killed_in_zone" ); self waittill( "first_zombie_killed_in_zone" );
if ( self.script_noteworthy == "rune_3" ) if ( self.script_noteworthy == "rune_3" )
{ {
trigger = getent( "wolf_hurt_trigger", "targetname" ); 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 = getent( "wolf_hurt_trigger_docks", "targetname" );
trigger show(); 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.soul_catcher_clip[self.script_noteworthy] setvisibletoall();
}
level setclientfield( self.script_parameters, 1 ); level setclientfield( self.script_parameters, 1 );
anim_length = getanimlength( %o_zombie_dreamcatcher_intro ); anim_length = getanimlength( %o_zombie_dreamcatcher_intro );
wait anim_length; wait( anim_length );
while ( !self.is_charged ) while ( !self.is_charged )
{ {
level setclientfield( self.script_parameters, 2 ); level setclientfield( self.script_parameters, 2 );
self waittill_either( "fully_charged", "finished_eating" ); self waittill_either( "fully_charged", "finished_eating" );
} }
level setclientfield( self.script_parameters, 6 ); level setclientfield( self.script_parameters, 6 );
anim_length = getanimlength( %o_zombie_dreamcatcher_outtro ); anim_length = getanimlength( %o_zombie_dreamcatcher_outtro );
wait anim_length; wait( anim_length );
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 ] delete(); level.soul_catcher_clip[self.script_noteworthy] delete();
}
if ( self.script_noteworthy == "rune_3" ) if ( self.script_noteworthy == "rune_3" )
{ {
trigger = getent( "wolf_hurt_trigger", "targetname" ); 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 = getent( "wolf_hurt_trigger_docks", "targetname" );
trigger delete(); trigger delete();
} }
level setclientfield( self.script_parameters, 7 ); level setclientfield( self.script_parameters, 7 );
} }
grief_soul_catcher_state_manager() //checked matches cerberus output grief_soul_catcher_state_manager()
{ {
wait 1; wait 1;
while ( 1 )
while ( true )
{ {
level setclientfield( self.script_parameters, 0 ); level setclientfield( self.script_parameters, 0 );
self waittill( "first_zombie_killed_in_zone" ); 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.soul_catcher_clip[self.script_noteworthy] setvisibletoall();
}
level setclientfield( self.script_parameters, 1 ); level setclientfield( self.script_parameters, 1 );
anim_length = getanimlength( %o_zombie_dreamcatcher_intro ); anim_length = getanimlength( %o_zombie_dreamcatcher_intro );
wait anim_length; wait( anim_length );
while ( !self.is_charged ) while ( !self.is_charged )
{ {
level setclientfield( self.script_parameters, 2 ); level setclientfield( self.script_parameters, 2 );
self waittill_either( "fully_charged", "finished_eating" ); self waittill_either( "fully_charged", "finished_eating" );
} }
level setclientfield( self.script_parameters, 6 ); level setclientfield( self.script_parameters, 6 );
anim_length = getanimlength( %o_zombie_dreamcatcher_outtro ); anim_length = getanimlength( %o_zombie_dreamcatcher_outtro );
wait anim_length; wait( anim_length );
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 ] delete(); level.soul_catcher_clip[self.script_noteworthy] delete();
}
self.souls_received = 0; self.souls_received = 0;
level thread wolf_spit_out_powerup(); level thread wolf_spit_out_powerup();
wait 20; wait 20;
@ -172,18 +185,18 @@ grief_soul_catcher_state_manager() //checked matches cerberus output
} }
} }
wolf_spit_out_powerup() //checked changed to match cerberus output wolf_spit_out_powerup()
{ {
if ( isDefined( level.enable_magic ) && !level.enable_magic ) if ( !( isdefined( level.enable_magic ) && level.enable_magic ) )
{
return; return;
}
power_origin_struct = getstruct( "wolf_puke_powerup_origin", "targetname" ); power_origin_struct = getstruct( "wolf_puke_powerup_origin", "targetname" );
if ( randomint( 100 ) < 20 ) if ( randomint( 100 ) < 20 )
{ {
for ( i = 0; i < level.zombie_powerup_array.size; i++ ) for ( i = 0; i < level.zombie_powerup_array.size; i++ )
{ {
if ( level.zombie_powerup_array[ i ] == "meat_stink" ) if ( level.zombie_powerup_array[i] == "meat_stink" )
{ {
level.zombie_powerup_index = i; level.zombie_powerup_index = i;
found = 1; found = 1;
@ -191,211 +204,204 @@ 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 ); level.zombie_powerup_index = randomint( level.zombie_powerup_array.size );
if ( level.zombie_powerup_array[ level.zombie_powerup_index ] == "nuke" )
if ( level.zombie_powerup_array[level.zombie_powerup_index] == "nuke" )
{ {
wait 0.05; wait 0.05;
continue; continue;
} }
break; 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 );
} }
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 zombie_spawn_func()
{ {
self.actor_killed_override = ::zombie_killed_override; 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 ) ) if ( !is_true( self.has_legs ) )
{
return; return;
}
if ( isplayer( attacker ) ) if ( isplayer( attacker ) )
{ {
for ( i = 0; i < level.soul_catchers.size; i++ ) for ( i = 0; i < level.soul_catchers.size; i++ )
{ {
if ( self istouching( level.soul_catchers_vol[ i ] ) ) if ( self istouching( level.soul_catchers_vol[i] ) )
{ {
if ( !level.soul_catchers[ i ].is_charged ) if ( !level.soul_catchers[i].is_charged )
{ {
self.deathfunction = ::zombie_soul_catcher_death; self.deathfunction = ::zombie_soul_catcher_death;
self.my_soul_catcher = level.soul_catchers[ i ]; self.my_soul_catcher = level.soul_catchers[i];
} }
} }
} }
} }
} }
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++ ) for ( i = 0; i < level.soul_catchers.size; i++ )
{ {
if ( self istouching( level.soul_catchers_vol[ i ] ) ) if ( self istouching( level.soul_catchers_vol[i] ) )
{ {
if ( !level.soul_catchers[ i ].is_charged && !level.soul_catchers[ i ].is_eating ) if ( !level.soul_catchers[i].is_charged && !level.soul_catchers[i].is_eating )
{ return true;
return 1;
} }
} }
}
return 0; return false;
} }
zombie_soul_catcher_death() //checked matches cerberus output zombie_soul_catcher_death()
{ {
self thread maps/mp/zombies/_zm_spawner::zombie_death_animscript(); self thread maps\mp\zombies\_zm_spawner::zombie_death_animscript();
if ( isDefined( self._race_team ) )
{ if ( isdefined( self._race_team ) )
team = 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 ) if ( self.my_soul_catcher.is_eating )
{ return false;
return 0;
}
if ( self.my_soul_catcher.souls_received >= 6 ) if ( self.my_soul_catcher.souls_received >= 6 )
{ return false;
return 0;
}
self.my_soul_catcher.is_eating = 1; self.my_soul_catcher.is_eating = 1;
if ( self.my_soul_catcher.souls_received == 0 ) if ( self.my_soul_catcher.souls_received == 0 )
{ {
self.my_soul_catcher notify( "first_zombie_killed_in_zone" ); self.my_soul_catcher notify( "first_zombie_killed_in_zone" );
self thread notify_wolf_intro_anim_complete(); self thread notify_wolf_intro_anim_complete();
} }
client_notify_value = self get_correct_model_array(); client_notify_value = self get_correct_model_array();
self setclientfield( "make_client_clone", client_notify_value ); self setclientfield( "make_client_clone", client_notify_value );
self setanimstatefromasd( "zm_portal_death" ); 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 ) if ( self.my_soul_catcher.souls_received == 0 )
{
self waittill( "wolf_intro_anim_complete" ); self waittill( "wolf_intro_anim_complete" );
}
n_eating_anim = self which_eating_anim(); n_eating_anim = self which_eating_anim();
self ghost(); self ghost();
level setclientfield( self.my_soul_catcher.script_parameters, n_eating_anim ); level setclientfield( self.my_soul_catcher.script_parameters, n_eating_anim );
if ( n_eating_anim == 3 ) if ( n_eating_anim == 3 )
{ total_wait_time = 3.0 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_f );
total_wait_time = 3 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_f );
}
else if ( n_eating_anim == 4 ) else if ( n_eating_anim == 4 )
{ total_wait_time = 3.0 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_r );
total_wait_time = 3 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_r );
}
else else
{ total_wait_time = 3.0 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_l );
total_wait_time = 3 + getanimlength( %ai_zombie_dreamcatcher_wallconsume_align_l );
} wait( total_wait_time - 0.5 );
wait ( total_wait_time - 0.5 );
self.my_soul_catcher.souls_received++; self.my_soul_catcher.souls_received++;
wait 0.5; wait 0.5;
self.my_soul_catcher notify( "finished_eating" ); self.my_soul_catcher notify( "finished_eating" );
self.my_soul_catcher.is_eating = 0; self.my_soul_catcher.is_eating = 0;
self delete(); self delete();
return 1; return true;
} }
get_correct_model_array() //checked matches cerberus output get_correct_model_array()
{ {
mod = 0; 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; mod = 4;
}
if ( self.headmodel == "c_zom_zombie_barbwire_head" ) if ( self.headmodel == "c_zom_zombie_barbwire_head" )
{
return 1 + mod; return 1 + mod;
}
if ( self.headmodel == "c_zom_zombie_hellcatraz_head" ) if ( self.headmodel == "c_zom_zombie_hellcatraz_head" )
{
return 2 + mod; return 2 + mod;
}
if ( self.headmodel == "c_zom_zombie_mask_head" ) if ( self.headmodel == "c_zom_zombie_mask_head" )
{
return 3 + mod; return 3 + mod;
}
if ( self.headmodel == "c_zom_zombie_slackjaw_head" ) if ( self.headmodel == "c_zom_zombie_slackjaw_head" )
{
return 4 + mod; return 4 + mod;
}
return 5; return 5;
} }
notify_wolf_intro_anim_complete() //checked matches cerberus output notify_wolf_intro_anim_complete()
{ {
anim_length = getanimlength( %o_zombie_dreamcatcher_intro ); anim_length = getanimlength( %o_zombie_dreamcatcher_intro );
wait anim_length; wait( anim_length );
self notify( "wolf_intro_anim_complete" ); self notify( "wolf_intro_anim_complete" );
} }
which_eating_anim() //checked matches cerberus output which_eating_anim()
{ {
soul_catcher = self.my_soul_catcher; 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 ) if ( forward_dot > 0.85 )
{
return 3; return 3;
}
else 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 ) if ( right_dot > 0 )
{
return 4; return 4;
}
else else
{
return 5; return 5;
} }
}
} }
soul_catcher_check() //checked changed to match cerberus output soul_catcher_check()
{ {
self.is_charged = 0; self.is_charged = 0;
while ( 1 )
while ( true )
{ {
if ( self.souls_received >= 6 ) if ( self.souls_received >= 6 )
{ {
level.soul_catchers_charged++; 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.is_charged = 1;
self notify( "fully_charged" ); self notify( "fully_charged" );
break; break;
} }
wait 0.05; wait 0.05;
} }
if ( level.soul_catchers_charged == 1 ) if ( level.soul_catchers_charged == 1 )
{
self thread first_wolf_complete_vo(); self thread first_wolf_complete_vo();
}
else if ( level.soul_catchers_charged >= level.soul_catchers.size ) else if ( level.soul_catchers_charged >= level.soul_catchers.size )
{
self thread final_wolf_complete_vo(); 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 = getent( wolf_head_model_string, "targetname" );
wolf_head_model setmodel( "p6_zm_al_dream_catcher_off" ); wolf_head_model setmodel( "p6_zm_al_dream_catcher_off" );
self waittill( "fully_charged" ); self waittill( "fully_charged" );
wolf_head_model setmodel( "p6_zm_al_dream_catcher" ); 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 ) if ( level.soul_catchers_charged >= level.soul_catchers.size )
{ {
@ -403,162 +409,171 @@ soul_catchers_charged() //checked changed to match cerberus output
level notify( "soul_catchers_charged" ); level notify( "soul_catchers_charged" );
break; break;
} }
wait 1; wait 1;
} }
} }
first_wolf_encounter_vo() //checked changed to match cerberus output first_wolf_encounter_vo()
{ {
if ( !is_classic() ) if ( !is_classic() )
{
return; return;
}
wait 2; wait 2.0;
a_players = getplayers(); a_players = getplayers();
a_closest = get_array_of_closest( self.origin, a_players ); a_closest = get_array_of_closest( self.origin, a_players );
for ( i = 0; i < a_closest.size; i++ ) 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" ); a_closest[i] thread do_player_general_vox( "general", "wolf_encounter" );
level.wolf_encounter_vo_played = 1; level.wolf_encounter_vo_played = 1;
break; break;
} }
} }
} }
first_wolf_complete_vo() //checked changed to match cerberus output first_wolf_complete_vo()
{ {
if ( !is_classic() ) if ( !is_classic() )
{
return; return;
}
wait 3.5; wait 3.5;
a_players = getplayers(); a_players = getplayers();
a_closest = get_array_of_closest( self.origin, a_players ); a_closest = get_array_of_closest( self.origin, a_players );
for ( i = 0; i < a_closest.size; i++ ) 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" ); a_closest[i] thread do_player_general_vox( "general", "wolf_complete" );
break; break;
} }
} }
} }
final_wolf_complete_vo() //checked changed to match cerberus output final_wolf_complete_vo()
{ {
if ( !is_classic() ) if ( !is_classic() )
{
return; return;
}
wait 3.5; wait 3.5;
a_players = getplayers(); a_players = getplayers();
a_closest = get_array_of_closest( self.origin, a_players ); a_closest = get_array_of_closest( self.origin, a_players );
for ( i = 0; i < a_closest.size; i++ ) 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" ); a_closest[i] thread do_player_general_vox( "general", "wolf_final" );
break; break;
} }
} }
} }
tomahawk_upgrade_quest() //checked changed to match cerberus output tomahawk_upgrade_quest()
{ {
if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 ) if ( isdefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
{
return; return;
}
self endon( "disconnect" ); self endon( "disconnect" );
for ( self.tomahawk_upgrade_kills = 0; self.tomahawk_upgrade_kills < 15; self.tomahawk_upgrade_kills++ ) for ( self.tomahawk_upgrade_kills = 0; self.tomahawk_upgrade_kills < 15; self.tomahawk_upgrade_kills++ )
{
self waittill( "got_a_tomahawk_kill" ); self waittill( "got_a_tomahawk_kill" );
}
wait 1; wait 1.0;
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "quest_generic" ); level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorScale( ( 0, 0, 1 ), 64 ) ); e_org = spawn( "script_origin", self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ) );
e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" ); e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" );
e_org waittill( "easteregg_scream_complete" ); e_org waittill( "easteregg_scream_complete" );
e_org delete(); e_org delete();
while ( level.round_number < 10 ) while ( level.round_number < 10 )
{
wait 0.5; wait 0.5;
}
self ent_flag_init( "gg_round_done" ); self ent_flag_init( "gg_round_done" );
while ( !self ent_flag( "gg_round_done" ) ) while ( !self ent_flag( "gg_round_done" ) )
{ {
level waittill( "between_round_over" ); level waittill( "between_round_over" );
self.killed_with_only_tomahawk = 1; self.killed_with_only_tomahawk = 1;
self.killed_something_thq = 0; 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; continue;
}
level waittill( "end_of_round" ); level waittill( "end_of_round" );
if ( !self.killed_with_only_tomahawk || !self.killed_something_thq ) if ( !self.killed_with_only_tomahawk || !self.killed_something_thq )
{
continue; 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; continue;
}
self ent_flag_set( "gg_round_done" ); 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 playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" );
e_org waittill( "easteregg_scream_complete" ); e_org waittill( "easteregg_scream_complete" );
e_org delete(); e_org delete();
self notify( "hellhole_time" ); self notify( "hellhole_time" );
self waittill( "tomahawk_in_hellhole" ); self waittill( "tomahawk_in_hellhole" );
if ( isDefined( self.retriever_trigger ) )
{ if ( isdefined( self.retriever_trigger ) )
self.retriever_trigger setinvisibletoplayer( self ); self.retriever_trigger setinvisibletoplayer( self );
}
else else
{ {
trigger = getent( "retriever_pickup_trigger", "script_noteworthy" ); trigger = getent( "retriever_pickup_trigger", "script_noteworthy" );
self.retriever_trigger = trigger; self.retriever_trigger = trigger;
self.retriever_trigger setinvisibletoplayer( self ); self.retriever_trigger setinvisibletoplayer( self );
} }
self takeweapon( "bouncing_tomahawk_zm" ); self takeweapon( "bouncing_tomahawk_zm" );
self set_player_tactical_grenade( "none" ); self set_player_tactical_grenade( "none" );
self notify( "tomahawk_upgraded_swap" ); self notify( "tomahawk_upgraded_swap" );
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "quest_generic" ); level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "quest_generic" );
e_org = spawn( "script_origin", self.origin + vectorScale( ( 0, 0, 1 ), 64 ) ); e_org = spawn( "script_origin", self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ) );
e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" ); e_org playsoundwithnotify( "zmb_easteregg_scream", "easteregg_scream_complete" );
e_org waittill( "easteregg_scream_complete" ); e_org waittill( "easteregg_scream_complete" );
e_org delete(); e_org delete();
level waittill( "end_of_round" ); level waittill( "end_of_round" );
tomahawk_pick = getent( "spinning_tomahawk_pickup", "targetname" ); tomahawk_pick = getent( "spinning_tomahawk_pickup", "targetname" );
tomahawk_pick setclientfield( "play_tomahawk_fx", 2 ); tomahawk_pick setclientfield( "play_tomahawk_fx", 2 );
self.current_tomahawk_weapon = "upgraded_tomahawk_zm"; self.current_tomahawk_weapon = "upgraded_tomahawk_zm";
} }
toggle_redeemer_trigger() //checked changed to match cerberus output toggle_redeemer_trigger()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
flag_wait( "tomahawk_pickup_complete" ); flag_wait( "tomahawk_pickup_complete" );
upgraded_tomahawk_trigger = getent( "redeemer_pickup_trigger", "script_noteworthy" ); upgraded_tomahawk_trigger = getent( "redeemer_pickup_trigger", "script_noteworthy" );
upgraded_tomahawk_trigger setinvisibletoplayer( self ); upgraded_tomahawk_trigger setinvisibletoplayer( self );
tomahawk_model = getent( "spinning_tomahawk_pickup", "targetname" ); tomahawk_model = getent( "spinning_tomahawk_pickup", "targetname" );
while ( 1 )
{ while ( true )
if ( isDefined( self.current_tomahawk_weapon ) && self.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{ {
if ( isdefined( self.current_tomahawk_weapon ) && self.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
break; break;
}
else else
{
wait 1; wait 1;
} }
}
while ( 1 ) while ( true )
{ {
if ( isDefined( self.afterlife ) && self.afterlife ) if ( isdefined( self.afterlife ) && self.afterlife )
{ {
upgraded_tomahawk_trigger setvisibletoplayer( self ); upgraded_tomahawk_trigger setvisibletoplayer( self );
tomahawk_model setvisibletoplayer( self ); tomahawk_model setvisibletoplayer( self );
@ -568,75 +583,72 @@ toggle_redeemer_trigger() //checked changed to match cerberus output
upgraded_tomahawk_trigger setinvisibletoplayer( self ); upgraded_tomahawk_trigger setinvisibletoplayer( self );
tomahawk_model setinvisibletoplayer( self ); tomahawk_model setinvisibletoplayer( self );
} }
wait 1; wait 1;
} }
} }
hellhole_projectile_watch() //checked matches cerberus output hellhole_projectile_watch()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
while ( 1 )
while ( true )
{ {
self waittill( "grenade_fire", grenade, weapname ); self waittill( "grenade_fire", grenade, weapname );
if ( weapname == "frag_grenade_zm" ) if ( weapname == "frag_grenade_zm" )
{
self thread hellhole_grenades( grenade ); self thread hellhole_grenades( grenade );
} }
}
} }
hellhole_tomahawk_watch() //checked matches cerberus output hellhole_tomahawk_watch()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "hellhole_time" ); self waittill( "hellhole_time" );
while ( 1 )
while ( true )
{ {
self waittill( "grenade_fire", grenade, weapname ); self waittill( "grenade_fire", grenade, weapname );
if ( weapname == "bouncing_tomahawk_zm" ) if ( weapname == "bouncing_tomahawk_zm" )
{
self thread hellhole_tomahawk( grenade ); self thread hellhole_tomahawk( grenade );
} }
}
} }
hellhole_grenades( grenade ) //checked matches cerberus output hellhole_grenades( grenade )
{ {
grenade endon( "death" ); grenade endon( "death" );
trig_hellhole = getent( "trig_cellblock_hellhole", "targetname" ); trig_hellhole = getent( "trig_cellblock_hellhole", "targetname" );
while ( !grenade istouching( trig_hellhole ) ) while ( !grenade istouching( trig_hellhole ) )
{
wait 0.05; 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 ); playfx( level._effect["tomahawk_hellhole"], grenade.origin );
playsoundatposition( "wpn_grenade_poof", grenade.origin ); playsoundatposition( "wpn_grenade_poof", grenade.origin );
grenade delete(); grenade delete();
} }
hellhole_tomahawk( grenade ) //checked matches cerberus output hellhole_tomahawk( grenade )
{ {
grenade endon( "death" ); grenade endon( "death" );
trig_hellhole = getent( "trig_cellblock_hellhole", "targetname" ); trig_hellhole = getent( "trig_cellblock_hellhole", "targetname" );
while ( !grenade istouching( trig_hellhole ) ) while ( !grenade istouching( trig_hellhole ) )
{
wait 0.05; wait 0.05;
}
self notify( "tomahawk_in_hellhole" ); self notify( "tomahawk_in_hellhole" );
grenade notify( "in_hellhole" ); grenade notify( "in_hellhole" );
playfx( level._effect[ "tomahawk_hellhole" ], grenade.origin ); playfx( level._effect["tomahawk_hellhole"], grenade.origin );
playsoundatposition( "wpn_grenade_poof", grenade.origin ); playsoundatposition( "wpn_grenade_poof", grenade.origin );
grenade delete(); 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 ) ) if ( isdefined( str_type ) )
{ intro_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( str_type, v_origin );
intro_powerup = maps/mp/zombies/_zm_powerups::specific_powerup_drop( str_type, v_origin );
}
else 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; // T6 GSC SOURCE
#include maps/mp/gametypes_zm/_globallogic_score; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include common_scripts/utility; #include common_scripts\utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_globallogic_score;
#include maps\mp\zombies\_zm_zonemgr;
init() init()
{ {
@ -31,93 +33,88 @@ achievement_sound_func( achievement_name_lower )
init_player_achievement_stats() 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_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_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_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_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_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_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_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_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_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_pop_goes_the_weasel", 0 );
} }
achievement_full_lockdown() achievement_full_lockdown()
{ {
level endon( "end_game" ); level endon( "end_game" );
level.lockdown_track[ "magic_box" ] = 0; level.lockdown_track["magic_box"] = 0;
level.lockdown_track[ "speedcola_perk" ] = 0; level.lockdown_track["speedcola_perk"] = 0;
level.lockdown_track[ "electric_cherry_perk" ] = 0; level.lockdown_track["electric_cherry_perk"] = 0;
level.lockdown_track[ "jugg_perk" ] = 0; level.lockdown_track["jugg_perk"] = 0;
level.lockdown_track[ "deadshot_perk" ] = 0; level.lockdown_track["deadshot_perk"] = 0;
level.lockdown_track[ "tap_perk" ] = 0; level.lockdown_track["tap_perk"] = 0;
level.lockdown_track[ "plane_ramp" ] = 0; level.lockdown_track["plane_ramp"] = 0;
level.lockdown_track[ "craft_shield" ] = 0; level.lockdown_track["craft_shield"] = 0;
level.lockdown_track[ "craft_kit" ] = 0; level.lockdown_track["craft_kit"] = 0;
b_unlock = 0; b_unlock = 0;
while ( b_unlock == 0 ) while ( b_unlock == 0 )
{ {
level waittill( "brutus_locked_object" ); level waittill( "brutus_locked_object" );
b_unlock = 1; b_unlock = 1;
_a92 = level.lockdown_track;
_k92 = getFirstArrayKey( _a92 ); foreach ( b_check in level.lockdown_track )
while ( isDefined( _k92 ) )
{ {
b_check = _a92[ _k92 ];
if ( b_check == 0 ) if ( b_check == 0 )
{ {
b_unlock = 0; b_unlock = 0;
break; break;
} }
else
{
_k92 = getNextArrayKey( _a92, _k92 );
}
} }
} }
level giveachievement_wrapper( "ZM_DLC2_FULL_LOCKDOWN", 1 ); level giveachievement_wrapper( "ZM_DLC2_FULL_LOCKDOWN", 1 );
} }
achievement_trapped_in_time() achievement_trapped_in_time()
{ {
level endon( "end_game" ); level endon( "end_game" );
level.trapped_track[ "acid" ] = 0; level.trapped_track["acid"] = 0;
level.trapped_track[ "fan" ] = 0; level.trapped_track["fan"] = 0;
level.trapped_track[ "tower" ] = 0; level.trapped_track["tower"] = 0;
level.trapped_track[ "tower_upgrade" ] = 0; level.trapped_track["tower_upgrade"] = 0;
b_unlock = 0; b_unlock = 0;
while ( b_unlock == 0 ) while ( b_unlock == 0 )
{ {
level waittill_either( "trap_activated", "tower_trap_upgraded" ); level waittill_either( "trap_activated", "tower_trap_upgraded" );
if ( level.round_number >= 10 ) if ( level.round_number >= 10 )
{
return; return;
}
b_unlock = 1; b_unlock = 1;
_a131 = level.trapped_track;
_k131 = getFirstArrayKey( _a131 ); foreach ( b_check in level.trapped_track )
while ( isDefined( _k131 ) )
{ {
b_check = _a131[ _k131 ];
if ( b_check == 0 ) if ( b_check == 0 )
{ {
b_unlock = 0; b_unlock = 0;
break; break;
} }
else
{
_k131 = getNextArrayKey( _a131, _k131 );
}
} }
} }
level giveachievement_wrapper( "ZM_DLC2_TRAPPED_IN_TIME", 1 ); level giveachievement_wrapper( "ZM_DLC2_TRAPPED_IN_TIME", 1 );
} }
achievement_pop_goes_the_weasel() achievement_pop_goes_the_weasel()
{ {
level endon( "end_game" ); level endon( "end_game" );
level waittill( "pop_goes_the_weasel_achieved" ); level waittill( "pop_goes_the_weasel_achieved" );
level giveachievement_wrapper( "ZM_DLC2_POP_GOES_THE_WEASEL", 1 ); level giveachievement_wrapper( "ZM_DLC2_POP_GOES_THE_WEASEL", 1 );
} }
@ -125,7 +122,9 @@ achievement_no_one_escapes_alive()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_at_bridge" ); self waittill( "player_at_bridge" );
self giveachievement_wrapper( "ZM_DLC2_PRISON_SIDEQUEST" ); self giveachievement_wrapper( "ZM_DLC2_PRISON_SIDEQUEST" );
} }
@ -133,7 +132,9 @@ achievement_feed_the_beast()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_obtained_tomahawk" ); self waittill( "player_obtained_tomahawk" );
self giveachievement_wrapper( "ZM_DLC2_FEED_THE_BEAST" ); self giveachievement_wrapper( "ZM_DLC2_FEED_THE_BEAST" );
} }
@ -141,12 +142,10 @@ achievement_making_the_rounds()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); 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" ); self waittill( "player_completed_cycle" );
n_completed_trips++;
}
self giveachievement_wrapper( "ZM_DLC2_MAKING_THE_ROUNDS" ); self giveachievement_wrapper( "ZM_DLC2_MAKING_THE_ROUNDS" );
} }
@ -154,7 +153,9 @@ achievement_acid_drip()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_obtained_acidgat" ); self waittill( "player_obtained_acidgat" );
self giveachievement_wrapper( "ZM_DLC2_ACID_DRIP" ); self giveachievement_wrapper( "ZM_DLC2_ACID_DRIP" );
} }
@ -162,19 +163,19 @@ achievement_a_burst_of_flavor()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
while ( 1 )
while ( true )
{ {
self waittill( "electric_cherry_start" ); self waittill( "electric_cherry_start" );
self.cherry_kills = 0; self.cherry_kills = 0;
self waittill( "electric_cherry_end" ); self waittill( "electric_cherry_end" );
if ( self.cherry_kills >= 10 ) if ( self.cherry_kills >= 10 )
{
break; break;
} }
else
{
}
}
self giveachievement_wrapper( "ZM_DLC2_A_BURST_OF_FLAVOR" ); self giveachievement_wrapper( "ZM_DLC2_A_BURST_OF_FLAVOR" );
} }
@ -182,7 +183,9 @@ achievement_paranormal_progress()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_opened_afterlife_door" ); self waittill( "player_opened_afterlife_door" );
self giveachievement_wrapper( "ZM_DLC2_PARANORMAL_PROGRESS" ); self giveachievement_wrapper( "ZM_DLC2_PARANORMAL_PROGRESS" );
} }
@ -190,20 +193,19 @@ achievement_gg_bridge()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
while ( 1 )
while ( true )
{ {
level waittill( "end_of_round" ); 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" ); 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; break;
} }
} }
else
{
}
}
self giveachievement_wrapper( "ZM_DLC2_GG_BRIDGE" ); self giveachievement_wrapper( "ZM_DLC2_GG_BRIDGE" );
} }

View File

@ -1,9 +1,11 @@
#include maps/mp/zombies/_zm_afterlife; // T6 GSC SOURCE
#include maps/mp/zm_prison; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_zonemgr; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_utility; #include common_scripts\utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zm_prison;
#include maps\mp\zombies\_zm_afterlife;
main_start() main_start()
{ {
@ -12,38 +14,33 @@ main_start()
t_killbrush_1.script_noteworthy = "kill_brush"; t_killbrush_1.script_noteworthy = "kill_brush";
t_killbrush_2 = spawn( "trigger_box", ( 1822, 9316, 1358 ), 0, 120, 100, 30 ); t_killbrush_2 = spawn( "trigger_box", ( 1822, 9316, 1358 ), 0, 120, 100, 30 );
t_killbrush_2.script_noteworthy = "kill_brush"; 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_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() main_end()
{ {
level.equipment_dead_zone_pos = []; level.equipment_dead_zone_pos = [];
level.equipment_dead_zone_rad2 = []; 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; level.equipment_safe_to_drop = ::equipment_safe_to_drop_ffotd;
waittillframeend; waittillframeend;
level.afterlife_give_loadout = ::afterlife_give_loadout_override; level.afterlife_give_loadout = ::afterlife_give_loadout_override;
@ -51,16 +48,13 @@ main_end()
equipment_safe_to_drop_ffotd( weapon ) equipment_safe_to_drop_ffotd( weapon )
{ {
i = 0; for ( i = 0; i < level.equipment_dead_zone_pos.size; i++ )
while ( i < level.equipment_dead_zone_pos.size )
{
if ( distancesquared( level.equipment_dead_zone_pos[ i ], weapon.origin ) < level.equipment_dead_zone_rad2[ i ] )
{ {
if ( distancesquared( level.equipment_dead_zone_pos[i], weapon.origin ) < level.equipment_dead_zone_rad2[i] )
return 0; 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() spawned_collision_ffotd()
@ -72,7 +66,14 @@ spawned_collision_ffotd()
precachemodel( "collision_geo_256x256x256_standard" ); precachemodel( "collision_geo_256x256x256_standard" );
precachemodel( "collision_geo_64x64x256_standard" ); precachemodel( "collision_geo_64x64x256_standard" );
precachemodel( "collision_geo_128x128x128_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" ); flag_wait( "start_zombie_round_logic" );
if ( !is_true( level.optimise_for_splitscreen ) ) if ( !is_true( level.optimise_for_splitscreen ) )
{ {
collision1 = spawn( "script_model", ( 1999, 9643, 1472 ) ); collision1 = spawn( "script_model", ( 1999, 9643, 1472 ) );
@ -81,15 +82,15 @@ spawned_collision_ffotd()
collision1 ghost(); collision1 ghost();
collision2 = spawn( "script_model", ( -437, 6260, 121 ) ); collision2 = spawn( "script_model", ( -437, 6260, 121 ) );
collision2 setmodel( "collision_wall_256x256x10_standard" ); collision2 setmodel( "collision_wall_256x256x10_standard" );
collision2.angles = vectorScale( ( 0, 0, 0 ), 11,8 ); collision2.angles = vectorscale( ( 0, 1, 0 ), 11.8 );
collision2 ghost(); 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 setmodel( "collision_wall_128x128x10_standard" );
collision3.angles = ( 0, 270, 38,6 ); collision3.angles = ( 0, 270, 38.6 );
collision3 ghost(); 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 setmodel( "collision_geo_256x256x256_standard" );
collision4.angles = vectorScale( ( 0, 0, 0 ), 180 ); collision4.angles = vectorscale( ( 0, 1, 0 ), 180.0 );
collision4 ghost(); collision4 ghost();
collision5a = spawn( "script_model", ( 792, 8302, 1620 ) ); collision5a = spawn( "script_model", ( 792, 8302, 1620 ) );
collision5a setmodel( "collision_geo_64x64x256_standard" ); collision5a setmodel( "collision_geo_64x64x256_standard" );
@ -101,7 +102,7 @@ spawned_collision_ffotd()
collision5b ghost(); collision5b ghost();
collision6 = spawn( "script_model", ( 554, 8026, 698 ) ); collision6 = spawn( "script_model", ( 554, 8026, 698 ) );
collision6 setmodel( "collision_wall_128x128x10_standard" ); collision6 setmodel( "collision_wall_128x128x10_standard" );
collision6.angles = vectorScale( ( 0, 0, 0 ), 22,2 ); collision6.angles = vectorscale( ( 0, 1, 0 ), 22.2 );
collision6 ghost(); collision6 ghost();
collision7 = spawn( "script_model", ( 1890, 9911, 1184 ) ); collision7 = spawn( "script_model", ( 1890, 9911, 1184 ) );
collision7 setmodel( "collision_geo_64x64x256_standard" ); collision7 setmodel( "collision_geo_64x64x256_standard" );
@ -115,34 +116,63 @@ spawned_collision_ffotd()
collision9 setmodel( "collision_ai_64x64x10" ); collision9 setmodel( "collision_ai_64x64x10" );
collision9.angles = ( 270, 180, -180 ); collision9.angles = ( 270, 180, -180 );
collision9 ghost(); 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 setmodel( "collision_geo_128x128x128_standard" );
collision10.angles = ( 354,9, 11, 0 ); collision10.angles = ( 354.9, 11, 0 );
collision10 ghost(); collision10 ghost();
collision11 = spawn( "script_model", ( -4, 8314, 808 ) ); collision11 = spawn( "script_model", ( -4, 8314, 808 ) );
collision11 setmodel( "collision_wall_128x128x10_standard" ); collision11 setmodel( "collision_wall_128x128x10_standard" );
collision11.angles = vectorScale( ( 0, 0, 0 ), 292 ); collision11.angles = vectorscale( ( 0, 1, 0 ), 292.0 );
collision11 ghost(); collision11 ghost();
collision12 = spawn( "script_model", ( 1416, 10708, 1440 ) ); collision12 = spawn( "script_model", ( 1416, 10708, 1440 ) );
collision12 setmodel( "collision_wall_512x512x10_standard" ); collision12 setmodel( "collision_wall_512x512x10_standard" );
collision12.angles = ( 0, 0, 0 ); collision12.angles = ( 0, 0, 0 );
collision12 ghost(); 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() afterlife_give_loadout_override()
{ {
self thread afterlife_leave_freeze(); 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() afterlife_leave_freeze()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "end_game" );
self freezecontrols( 1 ); self freezecontrols( 1 );
wait 0,5; wait 0.5;
if ( !is_true( self.hostmigrationcontrolsfrozen ) ) if ( !is_true( self.hostmigrationcontrolsfrozen ) )
{
self freezecontrols( 0 ); self freezecontrols( 0 );
}
} }

View File

@ -1,144 +1,147 @@
#include maps/mp/_utility; // T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#using_animtree( "fxanim_props" ); #include maps\mp\_utility;
#include maps\mp\createfx\zm_prison_fx;
main() main()
{ {
precache_createfx_fx(); precache_createfx_fx();
precache_scripted_fx(); precache_scripted_fx();
precache_fxanim_props(); precache_fxanim_props();
maps/mp/createfx/zm_prison_fx::main(); maps\mp\createfx\zm_prison_fx::main();
} }
precache_scripted_fx() precache_scripted_fx()
{ {
level._effect[ "elevator_fall" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elevator_fall" ); level._effect["elevator_fall"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elevator_fall" );
level._effect[ "key_glint" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_key_glint" ); level._effect["key_glint"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_key_glint" );
level._effect[ "quest_item_glow" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_quest_item_glow" ); level._effect["quest_item_glow"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_quest_item_glow" );
level._effect[ "eye_glow" ] = loadfx( "maps/zombie_alcatraz/fx_zombie_eye_single_red" ); level._effect["eye_glow"] = loadfx( "maps/zombie_alcatraz/fx_zombie_eye_single_red" );
level._effect[ "fx_alcatraz_unlock_door" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_unlock_door" ); level._effect["fx_alcatraz_unlock_door"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_unlock_door" );
level._effect[ "fx_alcatraz_elec_chair" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_chair" ); level._effect["fx_alcatraz_elec_chair"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_chair" );
level._effect[ "fx_alcatraz_lightning_finale" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_finale" ); level._effect["fx_alcatraz_lightning_finale"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_finale" );
level._effect[ "fx_alcatraz_panel_on_2" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_on_2" ); level._effect["fx_alcatraz_panel_on_2"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_on_2" );
level._effect[ "fx_alcatraz_panel_off_2" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_off_2" ); level._effect["fx_alcatraz_panel_off_2"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_off_2" );
level._effect[ "fx_alcatraz_lightning_wire" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_wire" ); level._effect["fx_alcatraz_lightning_wire"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_wire" );
level._effect[ "fx_alcatraz_afterlife_zmb_tport" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_afterlife_zmb_tport" ); level._effect["fx_alcatraz_afterlife_zmb_tport"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_afterlife_zmb_tport" );
level._effect[ "fx_alcatraz_panel_ol" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_ol" ); level._effect["fx_alcatraz_panel_ol"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_ol" );
level._effect[ "fx_alcatraz_plane_apear" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_apear" ); level._effect["fx_alcatraz_plane_apear"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_apear" );
level._effect[ "switch_sparks" ] = loadfx( "env/electrical/fx_elec_wire_spark_burst" ); level._effect["switch_sparks"] = loadfx( "env/electrical/fx_elec_wire_spark_burst" );
level._effect[ "zapper_light_ready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_green" ); level._effect["zapper_light_ready"] = loadfx( "maps/zombie/fx_zombie_zapper_light_green" );
level._effect[ "zapper_light_notready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_red" ); level._effect["zapper_light_notready"] = loadfx( "maps/zombie/fx_zombie_zapper_light_red" );
level._effect[ "fx_alcatraz_plane_trail" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_trail" ); level._effect["fx_alcatraz_plane_trail"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_trail" );
level._effect[ "fx_alcatraz_plane_trail_fast" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_trail_fast" ); level._effect["fx_alcatraz_plane_trail_fast"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_trail_fast" );
level._effect[ "fx_alcatraz_flight_lightning" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_flight_lightning" ); level._effect["fx_alcatraz_flight_lightning"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_flight_lightning" );
level._effect[ "fx_alcatraz_plane_fire_trail" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_fire_trail" ); level._effect["fx_alcatraz_plane_fire_trail"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_plane_fire_trail" );
level._effect[ "alcatraz_dryer_light_green" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_light_green" ); level._effect["alcatraz_dryer_light_green"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_light_green" );
level._effect[ "alcatraz_dryer_light_red" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_light_red" ); level._effect["alcatraz_dryer_light_red"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_light_red" );
level._effect[ "alcatraz_dryer_light_yellow" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_light_yellow" ); level._effect["alcatraz_dryer_light_yellow"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_light_yellow" );
level._effect[ "zomb_gib" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" ); level._effect["zomb_gib"] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" );
level._effect[ "elec_md" ] = loadfx( "electrical/fx_elec_player_md" ); level._effect["elec_md"] = loadfx( "electrical/fx_elec_player_md" );
level._effect[ "elec_sm" ] = loadfx( "electrical/fx_elec_player_sm" ); level._effect["elec_sm"] = loadfx( "electrical/fx_elec_player_sm" );
level._effect[ "elec_torso" ] = loadfx( "electrical/fx_elec_player_torso" ); level._effect["elec_torso"] = loadfx( "electrical/fx_elec_player_torso" );
level._effect[ "acid_spray" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_acid_spray" ); level._effect["acid_spray"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_acid_spray" );
level._effect[ "acid_death" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_acid_death" ); level._effect["acid_death"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_acid_death" );
level._effect[ "box_activated" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_box_charge" ); level._effect["box_activated"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_box_charge" );
level._effect[ "fan_blood" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fan_blood" ); level._effect["fan_blood"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fan_blood" );
level._effect[ "light_gondola" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_gondola" ); level._effect["light_gondola"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_gondola" );
level._effect[ "lightning_flash" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_lg" ); level._effect["lightning_flash"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_lg" );
level._effect[ "tomahawk_trail" ] = loadfx( "weapon/tomahawk/fx_tomahawk_trail" ); level._effect["tomahawk_trail"] = loadfx( "weapon/tomahawk/fx_tomahawk_trail" );
level._effect[ "tomahawk_trail_ug" ] = loadfx( "weapon/tomahawk/fx_tomahawk_trail_ug" ); level._effect["tomahawk_trail_ug"] = loadfx( "weapon/tomahawk/fx_tomahawk_trail_ug" );
level._effect[ "tomahawk_impact" ] = loadfx( "weapon/tomahawk/fx_tomahawk_impact" ); level._effect["tomahawk_impact"] = loadfx( "weapon/tomahawk/fx_tomahawk_impact" );
level._effect[ "tomahawk_impact_ug" ] = loadfx( "weapon/tomahawk/fx_tomahawk_impact_ug" ); level._effect["tomahawk_impact_ug"] = loadfx( "weapon/tomahawk/fx_tomahawk_impact_ug" );
level._effect[ "tomahawk_charge_up" ] = loadfx( "weapon/tomahawk/fx_tomahawk_charge" ); level._effect["tomahawk_charge_up"] = loadfx( "weapon/tomahawk/fx_tomahawk_charge" );
level._effect[ "tomahawk_charge_up_ug" ] = loadfx( "weapon/tomahawk/fx_tomahawk_charge_ug" ); level._effect["tomahawk_charge_up_ug"] = loadfx( "weapon/tomahawk/fx_tomahawk_charge_ug" );
level._effect[ "tomahawk_pickup" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tomahawk_pickup" ); level._effect["tomahawk_pickup"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tomahawk_pickup" );
level._effect[ "tomahawk_pickup_upgrade" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tomahawk_pickup_ug" ); level._effect["tomahawk_pickup_upgrade"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tomahawk_pickup_ug" );
level._effect[ "tomahawk_charged_trail" ] = loadfx( "weapon/tomahawk/fx_tomahawk_trail_charged" ); level._effect["tomahawk_charged_trail"] = loadfx( "weapon/tomahawk/fx_tomahawk_trail_charged" );
level._effect[ "tomahawk_fire_dot" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_zmb_fire_torso" ); level._effect["tomahawk_fire_dot"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_zmb_fire_torso" );
level._effect[ "soul_charge_start" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge_start" ); level._effect["soul_charge_start"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge_start" );
level._effect[ "soul_charge" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge" ); level._effect["soul_charge"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge" );
level._effect[ "soul_charge_impact" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge_impact" ); level._effect["soul_charge_impact"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge_impact" );
level._effect[ "soul_charged" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charged" ); level._effect["soul_charged"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charged" );
level._effect[ "hell_portal" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_portal_hell" ); level._effect["hell_portal"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_portal_hell" );
level._effect[ "hell_portal_close" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_portal_hell_close" ); level._effect["hell_portal_close"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_portal_hell_close" );
level._effect[ "tomahawk_hellhole" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brutus_footstomp" ); level._effect["tomahawk_hellhole"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brutus_footstomp" );
level._effect[ "wolf_bite_blood" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge_impact_sm" ); level._effect["wolf_bite_blood"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_soul_charge_impact_sm" );
level._effect[ "uzi_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_uzi" ); level._effect["uzi_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_uzi" );
level._effect[ "thompson_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_thompson" ); level._effect["thompson_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_thompson" );
level._effect[ "fx_alcatraz_lighthouse" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_house" ); level._effect["fx_alcatraz_lighthouse"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_house" );
level._effect[ "ee_skull_shot" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_skull_elec_2" ); level._effect["ee_skull_shot"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_skull_elec_2" );
} }
precache_createfx_fx() precache_createfx_fx()
{ {
level._effect[ "fx_alcatraz_storm_start" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_storm_start" ); level._effect["fx_alcatraz_storm_start"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_storm_start" );
level._effect[ "fx_alcatraz_vista_fog" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_vista_fog" ); level._effect["fx_alcatraz_vista_fog"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_vista_fog" );
level._effect[ "fx_alcatraz_docks_fog" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_docks_fog" ); level._effect["fx_alcatraz_docks_fog"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_docks_fog" );
level._effect[ "fx_alcatraz_fog_closet" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fog_closet" ); level._effect["fx_alcatraz_fog_closet"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fog_closet" );
level._effect[ "fx_alcatraz_fire_works" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_works" ); level._effect["fx_alcatraz_fire_works"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_works" );
level._effect[ "fx_alcatraz_tunnel_dust_fall" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tunnel_dust_fall" ); level._effect["fx_alcatraz_tunnel_dust_fall"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tunnel_dust_fall" );
level._effect[ "fx_alcatraz_tunnel_ash" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tunnel_ash" ); level._effect["fx_alcatraz_tunnel_ash"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_tunnel_ash" );
level._effect[ "fx_alcatraz_steam_pipe_2" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe_2" ); level._effect["fx_alcatraz_steam_pipe_2"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe_2" );
level._effect[ "fx_alcatraz_steam_pipe" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe" ); level._effect["fx_alcatraz_steam_pipe"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe" );
level._effect[ "fx_alcatraz_shower_steam" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_shower_steam" ); level._effect["fx_alcatraz_shower_steam"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_shower_steam" );
level._effect[ "fx_alcatraz_steam_pipe" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe" ); level._effect["fx_alcatraz_steam_pipe"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe" );
level._effect[ "fx_alcatraz_panel_on" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_on" ); level._effect["fx_alcatraz_panel_on"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_panel_on" );
level._effect[ "fx_alcatraz_door_blocker" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_door_blocker" ); level._effect["fx_alcatraz_door_blocker"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_door_blocker" );
level._effect[ "fx_alcatraz_dryer_on" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_on" ); level._effect["fx_alcatraz_dryer_on"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_dryer_on" );
level._effect[ "fx_alcatraz_elec_fence" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_fence" ); level._effect["fx_alcatraz_elec_fence"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_fence" );
level._effect[ "fx_alcatraz_generator_smk" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_generator_smk" ); level._effect["fx_alcatraz_generator_smk"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_generator_smk" );
level._effect[ "fx_alcatraz_generator_sparks" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_generator_sparks" ); level._effect["fx_alcatraz_generator_sparks"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_generator_sparks" );
level._effect[ "fx_alcatraz_generator_exp" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_generator_exp" ); level._effect["fx_alcatraz_generator_exp"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_generator_exp" );
level._effect[ "fx_alcatraz_elevator_spark" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elevator_spark" ); level._effect["fx_alcatraz_elevator_spark"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elevator_spark" );
level._effect[ "fx_alcatraz_elec_key" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_key" ); level._effect["fx_alcatraz_elec_key"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_key" );
level._effect[ "fx_alcatraz_sparks_ceiling" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_sparks_ceiling" ); level._effect["fx_alcatraz_sparks_ceiling"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_sparks_ceiling" );
level._effect[ "fx_alcatraz_sparks_panel" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_sparks_panel" ); level._effect["fx_alcatraz_sparks_panel"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_sparks_panel" );
level._effect[ "fx_alcatraz_fire_sm" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_sm" ); level._effect["fx_alcatraz_fire_sm"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_sm" );
level._effect[ "fx_alcatraz_fire_xsm" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_xsm" ); level._effect["fx_alcatraz_fire_xsm"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_xsm" );
level._effect[ "fx_alcatraz_embers_flat" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_embers_flat" ); level._effect["fx_alcatraz_embers_flat"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_embers_flat" );
level._effect[ "fx_alcatraz_falling_fire" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_falling_fire" ); level._effect["fx_alcatraz_falling_fire"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_falling_fire" );
level._effect[ "fx_alcatraz_steam_3floor" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_3floor" ); level._effect["fx_alcatraz_steam_3floor"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_3floor" );
level._effect[ "fx_alcatraz_elec_box_amb" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_box_amb" ); level._effect["fx_alcatraz_elec_box_amb"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_box_amb" );
level._effect[ "fx_alcatraz_blood_drip" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_blood_drip" ); level._effect["fx_alcatraz_blood_drip"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_blood_drip" );
level._effect[ "fx_alcatraz_godray_grill" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_grill" ); level._effect["fx_alcatraz_godray_grill"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_grill" );
level._effect[ "fx_alcatraz_godray_grill_lg" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_grill_lg" ); level._effect["fx_alcatraz_godray_grill_lg"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_grill_lg" );
level._effect[ "fx_alcatraz_godray_skinny" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_skinny" ); level._effect["fx_alcatraz_godray_skinny"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_skinny" );
level._effect[ "fx_alcatraz_ground_fog" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_ground_fog" ); level._effect["fx_alcatraz_ground_fog"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_ground_fog" );
level._effect[ "fx_alcatraz_flies" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_flies" ); level._effect["fx_alcatraz_flies"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_flies" );
level._effect[ "fx_alcatraz_candle_fire" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_candle_fire" ); level._effect["fx_alcatraz_candle_fire"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_candle_fire" );
level._effect[ "fx_alcatraz_portal_amb" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_portal_amb" ); level._effect["fx_alcatraz_portal_amb"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_portal_amb" );
level._effect[ "fx_alcatraz_fire_md" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_md" ); level._effect["fx_alcatraz_fire_md"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_fire_md" );
level._effect[ "fx_alcatraz_smk_linger" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_smk_linger" ); level._effect["fx_alcatraz_smk_linger"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_smk_linger" );
level._effect[ "fx_alcatraz_embers_indoor" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_embers_indoor" ); level._effect["fx_alcatraz_embers_indoor"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_embers_indoor" );
level._effect[ "fx_alcatraz_papers" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_papers" ); level._effect["fx_alcatraz_papers"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_papers" );
level._effect[ "fx_alcatraz_ceiling_fire" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_ceiling_fire" ); level._effect["fx_alcatraz_ceiling_fire"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_ceiling_fire" );
level._effect[ "fx_alcatraz_steam_ash" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_ash" ); level._effect["fx_alcatraz_steam_ash"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_ash" );
level._effect[ "fx_alcatraz_godray_jail" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_jail" ); level._effect["fx_alcatraz_godray_jail"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_godray_jail" );
level._effect[ "fx_alcatraz_water_drip" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_water_drip" ); level._effect["fx_alcatraz_water_drip"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_water_drip" );
level._effect[ "fx_alcatraz_shower_steam" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_shower_steam" ); level._effect["fx_alcatraz_shower_steam"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_shower_steam" );
level._effect[ "fx_alcatraz_steam_pipe" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe" ); level._effect["fx_alcatraz_steam_pipe"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_steam_pipe" );
level._effect[ "fx_alcatraz_light_tinhat" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_tinhat" ); level._effect["fx_alcatraz_light_tinhat"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_tinhat" );
level._effect[ "fx_alcatraz_light_round_oo" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_round_oo" ); level._effect["fx_alcatraz_light_round_oo"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_round_oo" );
level._effect[ "fx_alcatraz_light_tinhat_oo" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_tinhat_oo" ); level._effect["fx_alcatraz_light_tinhat_oo"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_light_tinhat_oo" );
level._effect[ "fx_alcatraz_flight_clouds" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_flight_clouds" ); level._effect["fx_alcatraz_flight_clouds"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_flight_clouds" );
level._effect[ "fx_alcatraz_lightning_bridge" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_bridge" ); level._effect["fx_alcatraz_lightning_bridge"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_lightning_bridge" );
level._effect[ "fx_alcatraz_elec_chair" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_chair" ); level._effect["fx_alcatraz_elec_chair"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_elec_chair" );
} }
#using_animtree("fxanim_props");
precache_fxanim_props() precache_fxanim_props()
{ {
level.scr_anim[ "fxanim_props" ][ "wirespark_med" ] = %fxanim_gp_wirespark_med_anim; level.scr_anim["fxanim_props"]["wirespark_med"] = %fxanim_gp_wirespark_med_anim;
level.scr_anim[ "fxanim_props" ][ "dryer_start" ] = %fxanim_zom_al_industrial_dryer_start_anim; level.scr_anim["fxanim_props"]["dryer_start"] = %fxanim_zom_al_industrial_dryer_start_anim;
level.scr_anim[ "fxanim_props" ][ "dryer_idle" ] = %fxanim_zom_al_industrial_dryer_idle_anim; level.scr_anim["fxanim_props"]["dryer_idle"] = %fxanim_zom_al_industrial_dryer_idle_anim;
level.scr_anim[ "fxanim_props" ][ "dryer_end" ] = %fxanim_zom_al_industrial_dryer_end_anim; level.scr_anim["fxanim_props"]["dryer_end"] = %fxanim_zom_al_industrial_dryer_end_anim;
level.scr_anim[ "fxanim_props" ][ "dryer_hide" ] = %fxanim_zom_al_industrial_dryer_hide_anim; level.scr_anim["fxanim_props"]["dryer_hide"] = %fxanim_zom_al_industrial_dryer_hide_anim;
level.scr_anim[ "fxanim_props" ][ "pulley_down" ] = %fxanim_zom_al_key_pulley_down_anim; level.scr_anim["fxanim_props"]["pulley_down"] = %fxanim_zom_al_key_pulley_down_anim;
level.scr_anim[ "fxanim_props" ][ "pulley_up" ] = %fxanim_zom_al_key_pulley_up_anim; level.scr_anim["fxanim_props"]["pulley_up"] = %fxanim_zom_al_key_pulley_up_anim;
level.scr_anim[ "fxanim_props" ][ "crane_palette" ] = %fxanim_zom_al_crane_palette_anim; level.scr_anim["fxanim_props"]["crane_palette"] = %fxanim_zom_al_crane_palette_anim;
level.scr_anim[ "fxanim_props" ][ "chain_hook_rotate" ] = %fxanim_zom_al_chain_short_hook_rotate_anim; level.scr_anim["fxanim_props"]["chain_hook_rotate"] = %fxanim_zom_al_chain_short_hook_rotate_anim;
level.scr_anim[ "fxanim_props" ][ "bodybag_rotate" ] = %fxanim_zom_al_bodybag_rotate_anim; level.scr_anim["fxanim_props"]["bodybag_rotate"] = %fxanim_zom_al_bodybag_rotate_anim;
level.scr_anim[ "fxanim_props" ][ "chain_hook_swing" ] = %fxanim_zom_al_chain_short_hook_swing_anim; level.scr_anim["fxanim_props"]["chain_hook_swing"] = %fxanim_zom_al_chain_short_hook_swing_anim;
level.scr_anim[ "fxanim_props" ][ "bodybag_swing" ] = %fxanim_zom_al_bodybag_swing_anim; level.scr_anim["fxanim_props"]["bodybag_swing"] = %fxanim_zom_al_bodybag_swing_anim;
level.scr_anim[ "fxanim_props" ][ "chain_hook_crane" ] = %fxanim_zom_al_chain_short_hook_crane_anim; level.scr_anim["fxanim_props"]["chain_hook_crane"] = %fxanim_zom_al_chain_short_hook_crane_anim;
level.scr_anim[ "fxanim_props" ][ "bodybag_crane" ] = %fxanim_zom_al_bodybag_crane_anim; level.scr_anim["fxanim_props"]["bodybag_crane"] = %fxanim_zom_al_bodybag_crane_anim;
} }

View File

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

View File

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

View File

@ -1,20 +1,20 @@
#include maps/mp/zombies/_zm; // T6 GSC SOURCE
#include maps/mp/_visionset_mgr; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_net; #include common_scripts\utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_net;
#include maps\mp\_visionset_mgr;
#include maps\mp\zombies\_zm;
onplayerconnect_sq_fc() onplayerconnect_sq_fc()
{ {
if ( !isDefined( level.sq_fc_still_valid ) ) if ( !isdefined( level.sq_fc_still_valid ) )
{
level.sq_fc_still_valid = 1; level.sq_fc_still_valid = 1;
}
if ( flag( "afterlife_start_over" ) || !level.sq_fc_still_valid ) if ( flag( "afterlife_start_over" ) || !level.sq_fc_still_valid )
{
return; return;
}
self thread watch_for_touching_controls(); self thread watch_for_touching_controls();
} }
@ -22,44 +22,43 @@ watch_for_touching_controls()
{ {
self endon( "out_of_mana" ); self endon( "out_of_mana" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "al_all_setup" ); self waittill( "al_all_setup" );
wait 1; wait 1;
v_original_origin = ( self.origin[ 0 ], self.origin[ 1 ], 0 ); v_original_origin = ( self.origin[0], self.origin[1], 0 );
v_original_angles = self.angles; 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 ); v_original_forward_vec = vectornormalize( v_forward_point - self.origin );
while ( !flag( "afterlife_start_over" ) && level.sq_fc_still_valid ) 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 ); v_new_forward_vec = vectornormalize( v_new_forward_point - self.origin );
move_length = length( ( self.origin[ 0 ], self.origin[ 1 ], 0 ) - v_original_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; level.sq_fc_still_valid = 0;
wait 0.05;
} }
wait 0,05;
}
level notify( "someone_touched_controls" ); level notify( "someone_touched_controls" );
} }
watch_for_trigger_condition() watch_for_trigger_condition()
{ {
level waittill( "pre_end_game" ); level waittill( "pre_end_game" );
if ( !level.sq_fc_still_valid ) if ( !level.sq_fc_still_valid )
{
return; return;
}
level.sndgameovermusicoverride = "game_over_nomove"; level.sndgameovermusicoverride = "game_over_nomove";
level.custom_intermission = ::player_intermission_prison; level.custom_intermission = ::player_intermission_prison;
players = getplayers(); players = getplayers();
_a94 = players;
_k94 = getFirstArrayKey( _a94 ); foreach ( player in players )
while ( isDefined( _k94 ) ) maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_audio_log", player );
{
player = _a94[ _k94 ];
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_audio_log", player );
_k94 = getNextArrayKey( _a94, _k94 );
}
} }
player_intermission_prison() player_intermission_prison()
@ -78,9 +77,11 @@ player_intermission_prison()
self.psoffsettime = 0; self.psoffsettime = 0;
self.friendlydamage = undefined; self.friendlydamage = undefined;
points = getstructarray( "dblock_cam", "targetname" ); points = getstructarray( "dblock_cam", "targetname" );
if ( !isDefined( points ) || points.size == 0 )
if ( !isdefined( points ) || points.size == 0 )
{ {
points = getentarray( "info_intermission", "classname" ); points = getentarray( "info_intermission", "classname" );
if ( points.size < 1 ) if ( points.size < 1 )
{ {
/# /#
@ -89,74 +90,73 @@ player_intermission_prison()
return; return;
} }
} }
self.game_over_bg = newclienthudelem( self ); self.game_over_bg = newclienthudelem( self );
self.game_over_bg.horzalign = "fullscreen"; self.game_over_bg.horzalign = "fullscreen";
self.game_over_bg.vertalign = "fullscreen"; self.game_over_bg.vertalign = "fullscreen";
self.game_over_bg setshader( "black", 640, 480 ); self.game_over_bg setshader( "black", 640, 480 );
self.game_over_bg.alpha = 1; self.game_over_bg.alpha = 1;
visionsetnaked( "cheat_bw", 0,05 ); visionsetnaked( "cheat_bw", 0.05 );
org = undefined; org = undefined;
while ( 1 )
while ( true )
{ {
points = array_randomize( points ); points = array_randomize( points );
i = 0;
while ( i < points.size ) for ( i = 0; i < points.size; i++ )
{
point = points[ i ];
if ( !isDefined( org ) )
{ {
point = points[i];
if ( !isdefined( org ) )
self spawn( point.origin, point.angles ); 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 setmodel( "tag_origin" );
} }
org.origin = points[ i ].origin;
org.angles = points[ i ].angles; org.origin = points[i].origin;
j = 0; org.angles = points[i].angles;
while ( j < get_players().size )
for ( j = 0; j < get_players().size; j++ )
{ {
player = get_players()[ j ]; player = get_players()[j];
player camerasetposition( org ); player camerasetposition( org );
player camerasetlookat(); player camerasetlookat();
player cameraactivate( 1 ); player cameraactivate( 1 );
j++;
} }
speed = 20; speed = 20;
if ( isDefined( points[ i ].speed ) )
{ if ( isdefined( points[i].speed ) )
speed = points[ i ].speed; speed = points[i].speed;
}
target_point = getstruct( points[ i ].target, "targetname" ); target_point = getstruct( points[i].target, "targetname" );
dist = distance( points[ i ].origin, target_point.origin ); dist = distance( points[i].origin, target_point.origin );
time = dist / speed; time = dist / speed;
q_time = time * 0,25; q_time = time * 0.25;
if ( q_time > 1 ) if ( q_time > 1 )
{
q_time = 1; q_time = 1;
}
self.game_over_bg fadeovertime( q_time ); self.game_over_bg fadeovertime( q_time );
self.game_over_bg.alpha = 0; self.game_over_bg.alpha = 0;
org moveto( target_point.origin, time, q_time, q_time ); org moveto( target_point.origin, time, q_time, q_time );
org rotateto( target_point.angles, time, q_time, q_time ); org rotateto( target_point.angles, time, q_time, q_time );
wait ( time - q_time ); wait( time - q_time );
self.game_over_bg fadeovertime( q_time ); self.game_over_bg fadeovertime( q_time );
self.game_over_bg.alpha = 1; self.game_over_bg.alpha = 1;
wait q_time; wait( q_time );
i++;
continue; continue;
} }
else
{
self.game_over_bg fadeovertime( 1 ); self.game_over_bg fadeovertime( 1 );
self.game_over_bg.alpha = 0; self.game_over_bg.alpha = 0;
wait 5; wait 5;
self.game_over_bg thread maps/mp/zombies/_zm::fade_up_over_time( 1 ); self.game_over_bg thread maps\mp\zombies\_zm::fade_up_over_time( 1 );
}
i++;
} }
} }
} }

View File

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

View File

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

View File

@ -1,30 +1,26 @@
#include maps/mp/zombies/_zm_powerups; // T6 GSC SOURCE
#include maps/mp/gametypes_zm/zmeat; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_audio_announcer; #include common_scripts\utility;
#include maps/mp/zombies/_zm_laststand; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_game_module_utility; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_game_module_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_laststand;
#include common_scripts/utility; #include maps\mp\zombies\_zm_audio_announcer;
#include maps\mp\gametypes_zm\zmeat;
#include maps\mp\zombies\_zm_powerups;
award_grenades_for_team( team ) award_grenades_for_team( team )
{ {
players = get_players(); 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 ) if ( !isdefined( players[i]._meat_team ) || players[i]._meat_team != team )
{
i++;
continue; continue;
}
else lethal_grenade = players[i] get_player_lethal_grenade();
{ players[i] giveweapon( lethal_grenade );
lethal_grenade = players[ i ] get_player_lethal_grenade(); players[i] setweaponammoclip( lethal_grenade, 4 );
players[ i ] giveweapon( lethal_grenade );
players[ i ] setweaponammoclip( lethal_grenade, 4 );
}
i++;
} }
} }
@ -32,20 +28,15 @@ get_players_on_meat_team( team )
{ {
players = get_players(); players = get_players();
players_on_team = []; 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 ) if ( !isdefined( players[i]._meat_team ) || players[i]._meat_team != team )
{
i++;
continue; continue;
players_on_team[players_on_team.size] = players[i];
} }
else
{
players_on_team[ players_on_team.size ] = players[ i ];
}
i++;
}
return players_on_team; return players_on_team;
} }
@ -53,56 +44,44 @@ get_alive_players_on_meat_team( team )
{ {
players = get_players(); players = get_players();
players_on_team = []; 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 ) if ( !isdefined( players[i]._meat_team ) || players[i]._meat_team != team )
{
i++;
continue; continue;
}
else if ( players[i].sessionstate == "spectator" || players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
{
if ( players[ i ].sessionstate == "spectator" || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{
i++;
continue; continue;
players_on_team[players_on_team.size] = players[i];
} }
else
{
players_on_team[ players_on_team.size ] = players[ i ];
}
}
i++;
}
return players_on_team; return players_on_team;
} }
init_minigun_ring() init_minigun_ring()
{ {
if ( isDefined( level._minigun_ring ) ) if ( isdefined( level._minigun_ring ) )
{
return; return;
}
ring_pos = getstruct( level._meat_location + "_meat_minigun", "script_noteworthy" ); ring_pos = getstruct( level._meat_location + "_meat_minigun", "script_noteworthy" );
if ( !isDefined( ring_pos ) )
{ if ( !isdefined( ring_pos ) )
return; return;
}
level._minigun_ring = spawn( "script_model", ring_pos.origin ); level._minigun_ring = spawn( "script_model", ring_pos.origin );
level._minigun_ring.angles = ring_pos.angles; level._minigun_ring.angles = ring_pos.angles;
level._minigun_ring setmodel( ring_pos.script_parameters ); level._minigun_ring setmodel( ring_pos.script_parameters );
level._minigun_ring_clip = getent( level._meat_location + "_meat_minigun_clip", "script_noteworthy" ); 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 ); level._minigun_ring_clip linkto( level._minigun_ring );
}
else else
{
iprintlnbold( "BUG: no level._minigun_ring_clip" ); iprintlnbold( "BUG: no level._minigun_ring_clip" );
}
level._minigun_ring_trig = getent( level._meat_location + "_meat_minigun_trig", "targetname" ); 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 enablelinkto();
level._minigun_ring_trig linkto( level._minigun_ring ); level._minigun_ring_trig linkto( level._minigun_ring );
@ -113,41 +92,38 @@ init_minigun_ring()
level thread ring_toss( level._minigun_ring_trig, "minigun" ); level thread ring_toss( level._minigun_ring_trig, "minigun" );
} }
else else
{
iprintlnbold( "BUG: no level._minigun_ring_trig" ); iprintlnbold( "BUG: no level._minigun_ring_trig" );
}
level._minigun_ring thread move_ring( ring_pos ); level._minigun_ring thread move_ring( ring_pos );
level._minigun_ring thread rotate_ring( 1 ); level._minigun_ring thread rotate_ring( 1 );
} }
init_ammo_ring() init_ammo_ring()
{ {
if ( isDefined( level._ammo_ring ) ) if ( isdefined( level._ammo_ring ) )
{
return; return;
}
name = level._meat_location + "_meat_ammo"; name = level._meat_location + "_meat_ammo";
ring_pos = getstruct( name, "script_noteworthy" ); ring_pos = getstruct( name, "script_noteworthy" );
if ( !isDefined( ring_pos ) )
{ if ( !isdefined( ring_pos ) )
return; return;
}
level._ammo_ring = spawn( "script_model", ring_pos.origin ); level._ammo_ring = spawn( "script_model", ring_pos.origin );
level._ammo_ring.angles = ring_pos.angles; level._ammo_ring.angles = ring_pos.angles;
level._ammo_ring setmodel( ring_pos.script_parameters ); level._ammo_ring setmodel( ring_pos.script_parameters );
name = level._meat_location + "_meat_ammo_clip"; name = level._meat_location + "_meat_ammo_clip";
level._ammo_ring_clip = getent( name, "script_noteworthy" ); 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 ); level._ammo_ring_clip linkto( level._ammo_ring );
}
else else
{
iprintlnbold( "BUG: no level._ammo_ring_clip" ); iprintlnbold( "BUG: no level._ammo_ring_clip" );
}
name = level._meat_location + "_meat_ammo_trig"; name = level._meat_location + "_meat_ammo_trig";
level._ammo_ring_trig = getent( name, "targetname" ); 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 enablelinkto();
level._ammo_ring_trig linkto( level._ammo_ring ); level._ammo_ring_trig linkto( level._ammo_ring );
@ -158,63 +134,66 @@ init_ammo_ring()
level thread ring_toss( level._ammo_ring_trig, "ammo" ); level thread ring_toss( level._ammo_ring_trig, "ammo" );
} }
else else
{
iprintlnbold( "BUG: no level._ammo_ring_trig" ); iprintlnbold( "BUG: no level._ammo_ring_trig" );
}
level._ammo_ring thread move_ring( ring_pos ); level._ammo_ring thread move_ring( ring_pos );
level._ammo_ring thread rotate_ring( 1 ); level._ammo_ring thread rotate_ring( 1 );
} }
init_splitter_ring() init_splitter_ring()
{ {
if ( isDefined( level._splitter_ring ) ) if ( isdefined( level._splitter_ring ) )
{
return; return;
}
ring_pos = getstruct( level._meat_location + "_meat_splitter", "script_noteworthy" ); ring_pos = getstruct( level._meat_location + "_meat_splitter", "script_noteworthy" );
if ( !isDefined( ring_pos ) )
{ if ( !isdefined( ring_pos ) )
return; return;
}
level._splitter_ring = spawn( "script_model", ring_pos.origin ); level._splitter_ring = spawn( "script_model", ring_pos.origin );
level._splitter_ring.angles = ring_pos.angles; level._splitter_ring.angles = ring_pos.angles;
level._splitter_ring setmodel( ring_pos.script_parameters ); level._splitter_ring setmodel( ring_pos.script_parameters );
level._splitter_ring_trig1 = getent( level._meat_location + "_meat_splitter_trig_1", "targetname" ); 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" ); 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_trig1 enablelinkto();
level._splitter_ring_trig2 enablelinkto(); level._splitter_ring_trig2 enablelinkto();
} }
else else
{
iprintlnbold( "BUG: missing at least one level._splitter_ring_trig" ); iprintlnbold( "BUG: missing at least one level._splitter_ring_trig" );
}
level._splitter_ring notsolid(); level._splitter_ring notsolid();
level._meat_icon = spawn( "script_model", level._splitter_ring.origin ); level._meat_icon = spawn( "script_model", level._splitter_ring.origin );
level._meat_icon setmodel( getweaponmodel( get_gamemode_var( "item_meat_name" ) ) ); level._meat_icon setmodel( getweaponmodel( get_gamemode_var( "item_meat_name" ) ) );
level._meat_icon linkto( level._splitter_ring ); level._meat_icon linkto( level._splitter_ring );
level._meat_icon setclientfield( "ring_glow_meatfx", 1 ); 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_trig1 linkto( level._splitter_ring );
level._splitter_ring_trig2 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_trig1, "splitter" );
level thread ring_toss( level._splitter_ring_trig2, "splitter" ); level thread ring_toss( level._splitter_ring_trig2, "splitter" );
} }
level._splitter_ring thread move_ring( ring_pos ); level._splitter_ring thread move_ring( ring_pos );
} }
ring_toss( trig, type ) ring_toss( trig, type )
{ {
level endon( "end_game" ); 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 ) ) if ( level.item_meat istouching( trig ) )
{ {
@ -223,7 +202,8 @@ ring_toss( trig, type )
level thread ring_cooldown(); level thread ring_cooldown();
} }
} }
wait 0,05;
wait 0.05;
} }
} }
@ -235,7 +215,7 @@ ring_cooldown()
ring_toss_prize( type, trig ) ring_toss_prize( type, trig )
{ {
switch( type ) switch ( type )
{ {
case "splitter": case "splitter":
level thread meat_splitter( trig ); level thread meat_splitter( trig );
@ -253,43 +233,41 @@ meat_splitter( trig )
{ {
level endon( "meat_grabbed" ); level endon( "meat_grabbed" );
level endon( "meat_kicked" ); level endon( "meat_kicked" );
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) )
{ while ( isdefined( level.item_meat ) && level.item_meat istouching( trig ) )
wait 0,05; wait 0.05;
}
exit_trig = getent( trig.target, "targetname" ); exit_trig = getent( trig.target, "targetname" );
exit_struct = getstruct( trig.target, "targetname" ); exit_struct = getstruct( trig.target, "targetname" );
while ( isDefined( level.item_meat ) && !level.item_meat istouching( exit_trig ) )
{ while ( isdefined( level.item_meat ) && !level.item_meat istouching( exit_trig ) )
wait 0,05; wait 0.05;
}
while ( isDefined( level.item_meat ) && level.item_meat istouching( exit_trig ) ) while ( isdefined( level.item_meat ) && level.item_meat istouching( exit_trig ) )
{ wait 0.05;
wait 0,05;
} if ( !isdefined( level.item_meat ) )
if ( !isDefined( level.item_meat ) )
{
return; return;
}
playfx( level._effect[ "fw_burst" ], exit_trig.origin ); playfx( level._effect["fw_burst"], exit_trig.origin );
flare_dir = vectornormalize( anglesToForward( exit_struct.angles ) ); flare_dir = vectornormalize( anglestoforward( exit_struct.angles ) );
velocity = vectorScale( flare_dir, randomintrange( 400, 600 ) ); velocity = vectorscale( flare_dir, randomintrange( 400, 600 ) );
velocity1 = ( velocity[ 0 ] + 75, velocity[ 1 ] + 75, randomintrange( 75, 125 ) ); velocity1 = ( velocity[0] + 75, velocity[1] + 75, randomintrange( 75, 125 ) );
velocity2 = ( 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 ); velocity3 = ( velocity[0], velocity[1], 100 );
level._fake_meats = []; level._fake_meats = [];
level._meat_splitter_activated = 1; level._meat_splitter_activated = 1;
org = exit_trig.origin; org = exit_trig.origin;
player = get_players()[ 0 ]; player = get_players()[0];
player._spawning_meat = 1; player._spawning_meat = 1;
player endon( "disconnect" ); player endon( "disconnect" );
thread split_meat( player, org, velocity1, velocity2, velocity ); thread split_meat( player, org, velocity1, velocity2, velocity );
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "meat_ring_splitter", undefined, undefined, 1 ); level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "meat_ring_splitter", undefined, undefined, 1 );
wait 0,1; wait 0.1;
while ( isDefined( level.splitting_meat ) && level.splitting_meat )
{ while ( isdefined( level.splitting_meat ) && level.splitting_meat )
wait 0,05; wait 0.05;
}
player._spawning_meat = 0; player._spawning_meat = 0;
} }
@ -298,86 +276,77 @@ split_meat( player, org, vel1, vel2, vel3 )
level.splitting_meat = 1; level.splitting_meat = 1;
level.item_meat cleanup_meat(); level.item_meat cleanup_meat();
wait_network_frame(); wait_network_frame();
level._fake_meats[ level._fake_meats.size ] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel1 ); level._fake_meats[level._fake_meats.size] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel1 );
wait_network_frame(); wait_network_frame();
level._fake_meats[ level._fake_meats.size ] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel2 ); level._fake_meats[level._fake_meats.size] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel2 );
wait_network_frame(); wait_network_frame();
level._fake_meats[ level._fake_meats.size ] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel3 ); level._fake_meats[level._fake_meats.size] = player magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, vel3 );
real_meat = random( level._fake_meats ); real_meat = random( level._fake_meats );
_a330 = level._fake_meats;
_k330 = getFirstArrayKey( _a330 ); foreach ( meat in level._fake_meats )
while ( isDefined( _k330 ) )
{ {
meat = _a330[ _k330 ];
if ( real_meat != meat ) if ( real_meat != meat )
{ {
meat._fake_meat = 1; 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; meat._fake_meat = 0;
level.item_meat = meat; level.item_meat = meat;
} }
_k330 = getNextArrayKey( _a330, _k330 );
}
level.splitting_meat = 0; level.splitting_meat = 0;
} }
minigun_prize( trig ) minigun_prize( trig )
{ {
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) ) while ( isdefined( level.item_meat ) && level.item_meat istouching( trig ) )
{ wait 0.05;
wait 0,05;
} if ( !isdefined( level.item_meat ) )
if ( !isDefined( level.item_meat ) )
{
return; return;
}
if ( isDefined( level._minigun_toss_cooldown ) && level._minigun_toss_cooldown ) if ( isdefined( level._minigun_toss_cooldown ) && level._minigun_toss_cooldown )
{
return; return;
}
level thread minigun_toss_cooldown(); level thread minigun_toss_cooldown();
if ( !is_player_valid( level._last_person_to_throw_meat ) ) if ( !is_player_valid( level._last_person_to_throw_meat ) )
{
return; return;
}
level._last_person_to_throw_meat thread maps/mp/zombies/_zm_powerups::powerup_vo( "minigun" ); 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_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 thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "meat_ring_minigun", undefined, undefined, 1 );
} }
ammo_prize( trig ) ammo_prize( trig )
{ {
while ( isDefined( level.item_meat ) && level.item_meat istouching( trig ) ) while ( isdefined( level.item_meat ) && level.item_meat istouching( trig ) )
{ wait 0.05;
wait 0,05;
} if ( !isdefined( level.item_meat ) )
if ( !isDefined( level.item_meat ) )
{
return; return;
}
if ( isDefined( level._ammo_toss_cooldown ) && level._ammo_toss_cooldown ) if ( isdefined( level._ammo_toss_cooldown ) && level._ammo_toss_cooldown )
{
return; return;
}
playfx( level._effect[ "poltergeist" ], trig.origin ); playfx( level._effect["poltergeist"], trig.origin );
level thread ammo_toss_cooldown(); level thread ammo_toss_cooldown();
level._last_person_to_throw_meat thread maps/mp/zombies/_zm_powerups::powerup_vo( "full_ammo" ); 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_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 thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "meat_ring_ammo", undefined, undefined, 1 );
} }
minigun_toss_cooldown() minigun_toss_cooldown()
{ {
level._minigun_toss_cooldown = 1; level._minigun_toss_cooldown = 1;
if ( isDefined( level._minigun_icon ) )
{ if ( isdefined( level._minigun_icon ) )
level._minigun_icon delete(); level._minigun_icon delete();
}
waittill_any_or_timeout( 120, "meat_end" ); waittill_any_or_timeout( 120, "meat_end" );
playfx( level._effect[ "poltergeist" ], level._minigun_ring_trig.origin ); playfx( level._effect["poltergeist"], level._minigun_ring_trig.origin );
level._minigun_icon = spawn( "script_model", level._minigun_ring_trig.origin ); level._minigun_icon = spawn( "script_model", level._minigun_ring_trig.origin );
level._minigun_icon setmodel( getweaponmodel( "minigun_zm" ) ); level._minigun_icon setmodel( getweaponmodel( "minigun_zm" ) );
level._minigun_icon linkto( level._minigun_ring ); level._minigun_icon linkto( level._minigun_ring );
@ -388,12 +357,12 @@ minigun_toss_cooldown()
ammo_toss_cooldown() ammo_toss_cooldown()
{ {
level._ammo_toss_cooldown = 1; level._ammo_toss_cooldown = 1;
if ( isDefined( level._ammo_icon ) )
{ if ( isdefined( level._ammo_icon ) )
level._ammo_icon delete(); level._ammo_icon delete();
}
waittill_any_or_timeout( 60, "meat_end" ); waittill_any_or_timeout( 60, "meat_end" );
playfx( level._effect[ "poltergeist" ], level._ammo_ring_trig.origin ); playfx( level._effect["poltergeist"], level._ammo_ring_trig.origin );
level._ammo_icon = spawn( "script_model", level._ammo_ring_trig.origin ); level._ammo_icon = spawn( "script_model", level._ammo_ring_trig.origin );
level._ammo_icon setmodel( "zombie_ammocan" ); level._ammo_icon setmodel( "zombie_ammocan" );
level._ammo_icon linkto( level._ammo_ring ); level._ammo_icon linkto( level._ammo_ring );
@ -405,119 +374,120 @@ wait_for_team_death( team )
{ {
level endon( "meat_end" ); level endon( "meat_end" );
encounters_team = undefined; encounters_team = undefined;
while ( 1 )
while ( true )
{ {
wait 1; wait 1;
while ( isDefined( level._checking_for_save ) && level._checking_for_save )
{ while ( isdefined( level._checking_for_save ) && level._checking_for_save )
wait 0,1; wait 0.1;
}
alive_team_players = get_alive_players_on_meat_team( team ); 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; encounters_team = alive_team_players[0]._encounters_team;
continue;
} }
break;
} }
if ( !isDefined( encounters_team ) )
{ if ( !isdefined( encounters_team ) )
return; return;
}
winning_team = "A"; winning_team = "A";
if ( encounters_team == "A" ) if ( encounters_team == "A" )
{
winning_team = "B"; winning_team = "B";
}
level notify( "meat_end" ); level notify( "meat_end", winning_team );
} }
check_should_save_player( team ) check_should_save_player( team )
{ {
if ( !isDefined( level._meat_on_team ) ) if ( !isdefined( level._meat_on_team ) )
{ return false;
return 0;
}
level._checking_for_save = 1; level._checking_for_save = 1;
players = get_players_on_meat_team( team ); players = get_players_on_meat_team( team );
i = 0;
while ( i < players.size ) for ( i = 0; i < players.size; i++ )
{ {
player = players[ 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 ) if ( level._meat_on_team != player._meat_team )
{
break; 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; break;
wait 0.05;
} }
else
{ if ( !isdefined( player ) )
wait 0,05;
}
}
if ( !isDefined( player ) )
{ {
level._checking_for_save = 0; 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; 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 ); level thread revive_saved_player( player );
return 1; return true;
} }
} }
} }
i++;
} }
level._checking_for_save = 0; level._checking_for_save = 0;
return 0; return false;
} }
watch_save_player() watch_save_player()
{ {
if ( !isDefined( level._meat_on_team ) ) if ( !isdefined( level._meat_on_team ) )
{ return false;
return 0;
} if ( !isdefined( level._last_person_to_throw_meat ) || level._last_person_to_throw_meat != self )
if ( !isDefined( level._last_person_to_throw_meat ) || level._last_person_to_throw_meat != self ) return false;
{
return 0;
}
level._checking_for_save = 1; 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 ) 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 )
{ {
} if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
else
{
wait 0,05;
}
}
if ( level._meat_on_team != self._meat_team && isDefined( level._last_person_to_throw_meat ) && level._last_person_to_throw_meat == self )
{
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{ {
level thread revive_saved_player( self ); level thread revive_saved_player( self );
return 1; return true;
} }
} }
level._checking_for_save = 0; level._checking_for_save = 0;
return 0; return false;
} }
revive_saved_player( player ) revive_saved_player( player )
@ -525,11 +495,11 @@ revive_saved_player( player )
player endon( "disconnect" ); player endon( "disconnect" );
player iprintlnbold( &"ZOMBIE_PLAYER_SAVED" ); player iprintlnbold( &"ZOMBIE_PLAYER_SAVED" );
player playsound( level.zmb_laugh_alias ); player playsound( level.zmb_laugh_alias );
wait 0,25; wait 0.25;
playfx( level._effect[ "poltergeist" ], player.origin ); playfx( level._effect["poltergeist"], player.origin );
playsoundatposition( "zmb_bolt", player.origin ); playsoundatposition( "zmb_bolt", player.origin );
earthquake( 0,5, 0,75, player.origin, 1000 ); earthquake( 0.5, 0.75, player.origin, 1000 );
player thread maps/mp/zombies/_zm_laststand::auto_revive( player ); player thread maps\mp\zombies\_zm_laststand::auto_revive( player );
player._saved_by_throw++; player._saved_by_throw++;
level._checking_for_save = 0; level._checking_for_save = 0;
} }
@ -542,11 +512,11 @@ get_game_module_players( player )
item_meat_spawn( origin ) item_meat_spawn( origin )
{ {
org = origin; org = origin;
player = get_players()[ 0 ]; player = get_players()[0];
player._spawning_meat = 1; 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 ); playsoundatposition( "zmb_spawn_powerup", org );
wait 0,1; wait 0.1;
player._spawning_meat = undefined; 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_name", "item_head_zm" );
set_gamemode_var_once( "item_meat_model", "t6_wpn_zmb_severedhead_world" ); set_gamemode_var_once( "item_meat_model", "t6_wpn_zmb_severedhead_world" );
} }
precacheitem( get_gamemode_var( "item_meat_name" ) ); precacheitem( get_gamemode_var( "item_meat_name" ) );
set_gamemode_var_once( "start_item_meat_name", get_gamemode_var( "item_meat_name" ) ); set_gamemode_var_once( "start_item_meat_name", get_gamemode_var( "item_meat_name" ) );
level.meat_weaponidx = getweaponindexfromname( get_gamemode_var( "item_meat_name" ) ); level.meat_weaponidx = getweaponindexfromname( get_gamemode_var( "item_meat_name" ) );
@ -576,42 +547,47 @@ meat_intro( launch_spot )
level thread multi_launch( launch_spot ); level thread multi_launch( launch_spot );
launch_meat( launch_spot ); launch_meat( launch_spot );
drop_meat( level._meat_start_point ); 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 ) launch_meat( launch_spot )
{ {
level waittill( "launch_meat" ); level waittill( "launch_meat" );
spots = getstructarray( launch_spot, "targetname" ); spots = getstructarray( launch_spot, "targetname" );
if ( isDefined( spots ) && spots.size > 0 )
if ( isdefined( spots ) && spots.size > 0 )
{ {
spot = random( spots ); spot = random( spots );
meat = spawn( "script_model", spot.origin ); meat = spawn( "script_model", spot.origin );
meat setmodel( "tag_origin" ); meat setmodel( "tag_origin" );
wait_network_frame(); wait_network_frame();
playfxontag( level._effect[ "fw_trail" ], meat, "tag_origin" ); playfxontag( level._effect["fw_trail"], meat, "tag_origin" );
meat playloopsound( "zmb_souls_loop", 0,75 ); meat playloopsound( "zmb_souls_loop", 0.75 );
dest = spot; dest = spot;
while ( isDefined( dest ) && isDefined( dest.target ) )
while ( isdefined( dest ) && isdefined( dest.target ) )
{ {
new_dest = getstruct( dest.target, "targetname" ); new_dest = getstruct( dest.target, "targetname" );
dest = new_dest; dest = new_dest;
dist = distance( new_dest.origin, meat.origin ); dist = distance( new_dest.origin, meat.origin );
time = dist / 700; time = dist / 700;
meat moveto( new_dest.origin, time ); meat moveto( new_dest.origin, time );
meat waittill( "movedone" ); meat waittill( "movedone" );
} }
meat playsound( "zmb_souls_end" ); meat playsound( "zmb_souls_end" );
playfx( level._effect[ "fw_burst" ], meat.origin ); playfx( level._effect["fw_burst"], meat.origin );
wait randomfloatrange( 0,2, 0,5 ); wait( randomfloatrange( 0.2, 0.5 ) );
meat playsound( "zmb_souls_end" ); meat playsound( "zmb_souls_end" );
playfx( level._effect[ "fw_burst" ], meat.origin + ( randomintrange( 50, 150 ), randomintrange( 50, 150 ), randomintrange( -20, 20 ) ) ); 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" ); meat playsound( "zmb_souls_end" );
playfx( level._effect[ "fw_burst" ], meat.origin + ( randomintrange( -150, -50 ), randomintrange( -150, 50 ), randomintrange( -20, 20 ) ) ); 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" ); meat playsound( "zmb_souls_end" );
playfx( level._effect[ "fw_burst" ], meat.origin ); playfx( level._effect["fw_burst"], meat.origin );
meat delete(); meat delete();
} }
} }
@ -619,41 +595,42 @@ launch_meat( launch_spot )
multi_launch( launch_spot ) multi_launch( launch_spot )
{ {
spots = getstructarray( launch_spot, "targetname" ); spots = getstructarray( launch_spot, "targetname" );
if ( isDefined( spots ) && spots.size > 0 )
if ( isdefined( spots ) && spots.size > 0 )
{ {
x = 0; for ( x = 0; x < 3; x++ )
while ( x < 3 )
{ {
i = 0; for ( i = 0; i < spots.size; i++ )
while ( i < spots.size )
{ {
delay = randomfloatrange( 0,1, 0,25 ); delay = randomfloatrange( 0.1, 0.25 );
level thread fake_launch( spots[ i ], delay ); level thread fake_launch( spots[i], delay );
i++;
} }
wait randomfloatrange( 0,25, 0,75 );
wait( randomfloatrange( 0.25, 0.75 ) );
if ( x > 1 ) if ( x > 1 )
level notify( "launch_meat" );
}
}
else
{ {
wait( randomfloatrange( 0.25, 0.75 ) );
level notify( "launch_meat" ); level notify( "launch_meat" );
} }
x++;
}
}
else wait randomfloatrange( 0,25, 0,75 );
level notify( "launch_meat" );
} }
fake_launch( launch_spot, delay ) fake_launch( launch_spot, delay )
{ {
wait delay; wait( delay );
wait randomfloatrange( 0,1, 4 ); wait( randomfloatrange( 0.1, 4 ) );
meat = spawn( "script_model", launch_spot.origin + ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ) ); meat = spawn( "script_model", launch_spot.origin + ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ) );
meat setmodel( "tag_origin" ); meat setmodel( "tag_origin" );
wait_network_frame(); wait_network_frame();
playfxontag( level._effect[ "fw_trail_cheap" ], meat, "tag_origin" ); 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; dest = launch_spot;
while ( isDefined( dest ) && isDefined( dest.target ) )
while ( isdefined( dest ) && isdefined( dest.target ) )
{ {
random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ); random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 );
new_dest = getstruct( dest.target, "targetname" ); new_dest = getstruct( dest.target, "targetname" );
@ -661,25 +638,29 @@ fake_launch( launch_spot, delay )
dist = distance( new_dest.origin + random_offset, meat.origin ); dist = distance( new_dest.origin + random_offset, meat.origin );
time = dist / 700; time = dist / 700;
meat moveto( new_dest.origin + random_offset, time ); meat moveto( new_dest.origin + random_offset, time );
meat waittill( "movedone" ); meat waittill( "movedone" );
} }
meat playsound( "zmb_souls_end" ); meat playsound( "zmb_souls_end" );
playfx( level._effect[ "fw_pre_burst" ], meat.origin ); playfx( level._effect["fw_pre_burst"], meat.origin );
meat delete(); meat delete();
} }
drop_meat( drop_spot ) 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" ); meat setmodel( "tag_origin" );
dist = distance( meat.origin, drop_spot ); dist = distance( meat.origin, drop_spot );
time = dist / 400; time = dist / 400;
wait 2; wait 2;
meat moveto( drop_spot, time ); meat moveto( drop_spot, time );
wait_network_frame(); wait_network_frame();
playfxontag( level._effect[ "fw_drop" ], meat, "tag_origin" ); playfxontag( level._effect["fw_drop"], meat, "tag_origin" );
meat waittill( "movedone" ); meat waittill( "movedone" );
playfx( level._effect[ "fw_impact" ], drop_spot );
playfx( level._effect["fw_impact"], drop_spot );
level notify( "reset_meat" ); level notify( "reset_meat" );
meat delete(); meat delete();
} }

View File

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

View File

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

View File

@ -1,61 +1,126 @@
#include maps/mp/zombies/_zm_audio; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_score; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_laststand; #include common_scripts\utility;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_weapons;
#include common_scripts/utility; #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( weapon_name );
precacheitem( flourish_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" ); 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 ) )
{ {
knife_model = getent( melee_weapon_triggers[i].target, "targetname" );
if ( isdefined( knife_model ) )
knife_model hide(); knife_model hide();
melee_weapon_triggers[i] thread melee_weapon_think( weapon_name, cost, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name );
if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) )
{
melee_weapon_triggers[i] sethintstring( hint_string, cost );
if ( getdvarint( "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 );
} }
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 ); else
melee_weapon_triggers[ i ] sethintstring( hint_string, cost ); melee_weapon_triggers[i] setcursorhint( "HINT_NOICON" );
melee_weapon_triggers[ i ] setcursorhint( "HINT_NOICON" );
melee_weapon_triggers[ i ] usetriggerrequirelookat();
i++;
} }
else
{
weapon_display = get_weapon_display_name( weapon_name );
hint_string = &"ZOMBIE_WEAPONCOSTONLY";
melee_weapon_triggers[i] sethintstring( hint_string, weapon_display, cost );
if ( getdvarint( "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();
}
melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" ); melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" );
i = 0;
while ( i < melee_weapon_structs.size ) 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 );
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 ); register_melee_weapon_for_level( weapon_name );
if ( !isDefined( level.ballistic_weapon_name ) )
{ if ( !isdefined( level.ballistic_weapon_name ) )
level.ballistic_weapon_name = []; level.ballistic_weapon_name = [];
}
level.ballistic_weapon_name[ weapon_name ] = ballistic_weapon_name; level.ballistic_weapon_name[weapon_name] = ballistic_weapon_name;
if ( !isDefined( level.ballistic_upgraded_weapon_name ) )
{ if ( !isdefined( level.ballistic_upgraded_weapon_name ) )
level.ballistic_upgraded_weapon_name = []; level.ballistic_upgraded_weapon_name = [];
level.ballistic_upgraded_weapon_name[weapon_name] = ballistic_upgraded_weapon_name;
/#
if ( !isdefined( level.zombie_weapons[weapon_name] ) )
{
if ( isdefined( level.devgui_add_weapon ) )
[[ level.devgui_add_weapon ]]( weapon_name, "", weapon_name, cost );
} }
level.ballistic_upgraded_weapon_name[ weapon_name ] = ballistic_upgraded_weapon_name; #/
} }
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 ) 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( stub ) )
{
if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) )
{ {
stub.hint_string = hint_string; 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.cost = cost;
stub.weapon_name = weapon_name; 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.vo_dialog_id = vo_dialog_id;
stub.flourish_weapon_name = flourish_weapon_name; stub.flourish_weapon_name = flourish_weapon_name;
stub.ballistic_weapon_name = ballistic_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 ) add_stub( stub, weapon_name )
{ {
melee_weapon = undefined; 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 ) if ( level._melee_weapons[i].weapon_name == weapon_name )
{ {
melee_weapon = level._melee_weapons[ i ]; melee_weapon = level._melee_weapons[i];
break; 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 ) give_melee_weapon_by_name( weapon_name )
{ {
melee_weapon = undefined; 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 ) if ( level._melee_weapons[i].weapon_name == weapon_name )
{ {
melee_weapon = level._melee_weapons[ i ]; melee_weapon = level._melee_weapons[i];
break; 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 );
} }
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, has_weapon, give_weapon, take_weapon, flourish_fn ) 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 = spawnstruct();
melee_weapon.weapon_name = weapon_name; 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.wallbuy_targetname = wallbuy_targetname;
melee_weapon.hint_string = hint_string; melee_weapon.hint_string = hint_string;
melee_weapon.vo_dialog_id = vo_dialog_id; 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; 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[ level._melee_weapons.size ] = melee_weapon; 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() spectator_respawn_all()
{ {
i = 0; for ( i = 0; i < level._melee_weapons.size; i++ )
while ( i < level._melee_weapons.size ) self spectator_respawn( level._melee_weapons[i].wallbuy_targetname, level._melee_weapons[i].weapon_name );
{
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++;
}
} }
spectator_respawn( wallbuy_targetname, take_weapon, has_weapon ) spectator_respawn( wallbuy_targetname, weapon_name )
{ {
melee_triggers = getentarray( wallbuy_targetname, "targetname" ); melee_triggers = getentarray( wallbuy_targetname, "targetname" );
players = get_players(); players = get_players();
i = 0;
while ( i < melee_triggers.size ) for ( i = 0; i < melee_triggers.size; i++ )
{ {
melee_triggers[ i ] setvisibletoall(); 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; for ( j = 0; j < players.size; j++ )
while ( j < players.size )
{ {
if ( players[ j ] [[ has_weapon ]]() ) if ( !players[j] player_can_see_weapon_prompt( weapon_name ) )
{ melee_triggers[i] setinvisibletoplayer( players[j] );
melee_triggers[ i ] setinvisibletoplayer( players[ j ] );
}
j++;
} }
} }
i++;
} }
} }
trigger_hide_all() trigger_hide_all()
{ {
i = 0; for ( i = 0; i < level._melee_weapons.size; i++ )
while ( i < level._melee_weapons.size ) self trigger_hide( level._melee_weapons[i].wallbuy_targetname );
{
self trigger_hide( level._melee_weapons[ i ].wallbuy_targetname );
i++;
}
} }
trigger_hide( wallbuy_targetname ) trigger_hide( wallbuy_targetname )
{ {
melee_triggers = getentarray( wallbuy_targetname, "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 );
melee_triggers[ i ] setinvisibletoplayer( self );
i++;
}
} }
has_any_ballistic_knife() has_any_ballistic_knife()
{ {
if ( self hasweapon( "knife_ballistic_zm" ) ) if ( self hasweapon( "knife_ballistic_zm" ) )
{ return true;
return 1;
}
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) ) if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{ {
return 1; if ( self hasweapon( level._melee_weapons[i].ballistic_weapon_name ) )
return true;
if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
return true;
} }
i = 0;
while ( i < level._melee_weapons.size ) return false;
{
if ( self hasweapon( level._melee_weapons[ i ].ballistic_weapon_name ) )
{
return 1;
}
if ( self hasweapon( level._melee_weapons[ i ].ballistic_upgraded_weapon_name ) )
{
return 1;
}
i++;
}
return 0;
} }
has_upgraded_ballistic_knife() has_upgraded_ballistic_knife()
{ {
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) ) if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{ {
return 1; if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
return true;
} }
i = 0;
while ( i < level._melee_weapons.size ) return false;
{
if ( self hasweapon( level._melee_weapons[ i ].ballistic_upgraded_weapon_name ) )
{
return 1;
}
i++;
}
return 0;
} }
give_ballistic_knife( weapon_string, upgraded ) give_ballistic_knife( weapon_string, upgraded )
{ {
current_melee_weapon = self get_player_melee_weapon(); current_melee_weapon = self get_player_melee_weapon();
if ( isDefined( 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 ] ) ) 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];
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];
{
weapon_string = level.ballistic_weapon_name[ current_melee_weapon ];
}
} }
return weapon_string; return weapon_string;
} }
change_melee_weapon( weapon_name, current_weapon ) change_melee_weapon( weapon_name, current_weapon )
{ {
current_melee_weapon = self get_player_melee_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 ); self takeweapon( current_melee_weapon );
unacquire_weapon_toggle( current_melee_weapon ); unacquire_weapon_toggle( current_melee_weapon );
} }
self set_player_melee_weapon( weapon_name ); self set_player_melee_weapon( weapon_name );
had_ballistic = 0; had_ballistic = 0;
had_ballistic_upgraded = 0; had_ballistic_upgraded = 0;
ballistic_was_primary = 0; ballistic_was_primary = 0;
primaryweapons = self getweaponslistprimaries(); primaryweapons = self getweaponslistprimaries();
i = 0;
while ( i < primaryweapons.size ) for ( i = 0; i < primaryweapons.size; i++ )
{ {
primary_weapon = primaryweapons[ i ]; primary_weapon = primaryweapons[i];
if ( issubstr( primary_weapon, "knife_ballistic_" ) ) if ( issubstr( primary_weapon, "knife_ballistic_" ) )
{ {
had_ballistic = 1; had_ballistic = 1;
if ( primary_weapon == current_weapon ) if ( primary_weapon == current_weapon )
{
ballistic_was_primary = 1; ballistic_was_primary = 1;
}
self notify( "zmb_lost_knife" ); self notify( "zmb_lost_knife" );
self takeweapon( primary_weapon ); self takeweapon( primary_weapon );
unacquire_weapon_toggle( primary_weapon ); unacquire_weapon_toggle( primary_weapon );
if ( issubstr( primary_weapon, "upgraded" ) ) if ( issubstr( primary_weapon, "upgraded" ) )
{
had_ballistic_upgraded = 1; had_ballistic_upgraded = 1;
} }
} }
i++;
}
if ( had_ballistic ) if ( had_ballistic )
{ {
if ( had_ballistic_upgraded ) if ( had_ballistic_upgraded )
{ {
new_ballistic = level.ballistic_upgraded_weapon_name[ weapon_name ]; new_ballistic = level.ballistic_upgraded_weapon_name[weapon_name];
if ( ballistic_was_primary ) if ( ballistic_was_primary )
{
current_weapon = new_ballistic; 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 else
{ {
new_ballistic = level.ballistic_weapon_name[ weapon_name ]; new_ballistic = level.ballistic_weapon_name[weapon_name];
if ( ballistic_was_primary ) if ( ballistic_was_primary )
{
current_weapon = new_ballistic; current_weapon = new_ballistic;
}
self giveweapon( new_ballistic, 0 ); self giveweapon( new_ballistic, 0 );
} }
} }
return current_weapon; 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; self.first_time_triggered = 0;
while ( isDefined( self.stub ) )
if ( isdefined( self.stub ) )
{ {
self endon( "kill_trigger" ); 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; self.first_time_triggered = self.stub.first_time_triggered;
}
weapon_name = self.stub.weapon_name; weapon_name = self.stub.weapon_name;
cost = self.stub.cost; cost = self.stub.cost;
has_weapon = self.stub.has_weapon;
give_weapon = self.stub.give_weapon;
flourish_fn = self.stub.flourish_fn; flourish_fn = self.stub.flourish_fn;
vo_dialog_id = self.stub.vo_dialog_id; vo_dialog_id = self.stub.vo_dialog_id;
flourish_weapon_name = self.stub.flourish_weapon_name; flourish_weapon_name = self.stub.flourish_weapon_name;
ballistic_weapon_name = self.stub.ballistic_weapon_name; ballistic_weapon_name = self.stub.ballistic_weapon_name;
ballistic_upgraded_weapon_name = self.stub.ballistic_upgraded_weapon_name; ballistic_upgraded_weapon_name = self.stub.ballistic_upgraded_weapon_name;
players = getplayers(); 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; for ( i = 0; i < players.size; i++ )
while ( i < players.size )
{ {
if ( players[ i ] [[ has_weapon ]]() ) if ( !players[i] player_can_see_weapon_prompt( weapon_name ) )
{ self setinvisibletoplayer( players[i] );
self setinvisibletoplayer( players[ i ] );
}
i++;
} }
} }
} }
for ( ;; )
for (;;)
{ {
self waittill( "trigger", player ); self waittill( "trigger", player );
if ( !is_player_valid( player ) ) if ( !is_player_valid( player ) )
{ {
player thread ignore_triggers( 0,5 ); player thread ignore_triggers( 0.5 );
continue; continue;
} }
else if ( player in_revive_trigger() )
if ( player in_revive_trigger() )
{ {
wait 0,1; wait 0.1;
continue; continue;
} }
else if ( player isthrowinggrenade() )
if ( player isthrowinggrenade() )
{ {
wait 0,1; wait 0.1;
continue; continue;
} }
else if ( player.is_drinking > 0 )
if ( player.is_drinking > 0 )
{ {
wait 0,1; wait 0.1;
continue; 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; continue;
} }
else
{
if ( player isswitchingweapons() ) if ( player isswitchingweapons() )
{ {
wait 0,1; wait 0.1;
break; 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; wait 0.1;
break; 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;
{ continue;
wait 0,1;
break;
} }
else
{ player_has_weapon = player hasweapon( weapon_name );
player_has_weapon = player [[ has_weapon ]]();
if ( !player_has_weapon ) 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 ( player.score >= cost )
{ {
if ( self.first_time_triggered == 0 ) if ( self.first_time_triggered == 0 )
{ {
model = getent( self.target, "targetname" ); model = getent( self.target, "targetname" );
if ( isDefined( model ) )
{ if ( isdefined( model ) )
model thread melee_weapon_show( player ); model thread melee_weapon_show( player );
} else if ( isdefined( self.clientfieldname ) )
else
{
if ( isDefined( self.clientfieldname ) )
{
level setclientfield( self.clientfieldname, 1 ); level setclientfield( self.clientfieldname, 1 );
}
}
self.first_time_triggered = 1; self.first_time_triggered = 1;
if ( isDefined( self.stub ) )
{ if ( isdefined( self.stub ) )
self.stub.first_time_triggered = 1; 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" ); 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 else
{ {
play_sound_on_ent( "no_purchase" ); 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 ); self setinvisibletoplayer( player );
} }
}
}
}
}
}
} }
melee_weapon_show( player ) melee_weapon_show( player )
{ {
player_angles = vectorToAngle( player.origin - self.origin ); player_angles = vectortoangles( player.origin - self.origin );
player_yaw = player_angles[ 1 ]; player_yaw = player_angles[1];
weapon_yaw = self.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 ) if ( yaw_diff > 0 )
{
yaw = weapon_yaw - 90; yaw = weapon_yaw - 90;
}
else else
{
yaw = weapon_yaw + 90; yaw = weapon_yaw + 90;
}
self.og_origin = self.origin; self.og_origin = self.origin;
self.origin += anglesToForward( ( 0, yaw, 0 ) ) * 8; self.origin += anglestoforward( ( 0, yaw, 0 ) ) * 8;
wait 0,05; wait 0.05;
self show(); self show();
play_sound_at_pos( "weapon_show", self.origin, self ); play_sound_at_pos( "weapon_show", self.origin, self );
time = 1; time = 1;
self moveto( self.og_origin, time ); 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 ) 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 ) ) if ( isdefined( flourish_fn ) )
{
self thread [[ flourish_fn ]](); self thread [[ flourish_fn ]]();
}
gun = self do_melee_weapon_flourish_begin( flourish_weapon_name ); 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 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 ); 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; return;
}
self [[ give_weapon ]](); if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
{
if ( isDefined( trigger ) )
{ {
if ( isdefined( trigger ) )
trigger setinvisibletoplayer( self ); trigger setinvisibletoplayer( self );
}
self trigger_hide_all(); 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(); self enable_player_move_states();
weapon = flourish_weapon_name; 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 takeweapon( weapon );
self.lastactiveweapon = "none"; self.lastactiveweapon = "none";
return; return;
} }
self takeweapon( weapon ); self takeweapon( weapon );
self giveweapon( weapon_name ); self giveweapon( weapon_name );
gun = change_melee_weapon( weapon_name, gun ); gun = change_melee_weapon( weapon_name, gun );
if ( self hasweapon( "knife_zm" ) ) if ( self hasweapon( "knife_zm" ) )
{
self takeweapon( "knife_zm" ); self takeweapon( "knife_zm" );
}
if ( self is_multiple_drinking() ) if ( self is_multiple_drinking() )
{ {
self decrement_is_drinking(); self decrement_is_drinking();
@ -537,20 +564,17 @@ do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_
return; return;
} }
else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) )
{
self switchtoweapon( gun ); self switchtoweapon( gun );
}
else else
{ {
primaryweapons = self getweaponslistprimaries(); primaryweapons = self getweaponslistprimaries();
if ( isDefined( primaryweapons ) && primaryweapons.size > 0 )
{ if ( isdefined( primaryweapons ) && primaryweapons.size > 0 )
self switchtoweapon( primaryweapons[ 0 ] ); self switchtoweapon( primaryweapons[0] );
}
} }
self waittill( "weapon_change_complete" ); 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(); self decrement_is_drinking();
}
} }

View File

@ -1,60 +1,62 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/_visionset_mgr; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_perks; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_net; #include common_scripts\utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_net;
#include maps/mp/_utility; #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_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_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_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_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_host_migration_func( "specialty_flakjacket", ::divetonuke_host_migration_func );
} }
init_divetonuke() //checked matches cerberus output init_divetonuke()
{ {
level.zombiemode_divetonuke_perk_func = ::divetonuke_explode; 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" ); 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_radius", 300 );
set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 ); set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 );
set_zombie_var( "zombie_perk_divetonuke_max_damage", 5000 ); 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 ]](); [[ level.divetonuke_precache_override_func ]]();
return; return;
} }
precacheitem( "zombie_perk_bottle_nuke" ); precacheitem( "zombie_perk_bottle_nuke" );
precacheshader( "specialty_divetonuke_zombies" ); precacheshader( "specialty_divetonuke_zombies" );
precachemodel( "zombie_vending_nuke" ); precachemodel( "zombie_vending_nuke" );
precachemodel( "zombie_vending_nuke_on" ); precachemodel( "zombie_vending_nuke_on" );
precachestring( &"ZOMBIE_PERK_DIVETONUKE" ); precachestring( &"ZOMBIE_PERK_DIVETONUKE" );
level._effect[ "divetonuke_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); level._effect["divetonuke_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" );
level.machine_assets[ "divetonuke" ] = spawnstruct(); level.machine_assets["divetonuke"] = spawnstruct();
level.machine_assets[ "divetonuke" ].weapon = "zombie_perk_bottle_nuke"; level.machine_assets["divetonuke"].weapon = "zombie_perk_bottle_nuke";
level.machine_assets[ "divetonuke" ].off_model = "zombie_vending_nuke"; level.machine_assets["divetonuke"].off_model = "zombie_vending_nuke";
level.machine_assets[ "divetonuke" ].on_model = "zombie_vending_nuke_on"; 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" ); 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 ); 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_sound = "mus_perks_phd_jingle";
use_trigger.script_string = "divetonuke_perk"; 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"; use_trigger.target = "vending_divetonuke";
perk_machine.script_string = "divetonuke_perk"; perk_machine.script_string = "divetonuke_perk";
perk_machine.targetname = "vending_divetonuke"; perk_machine.targetname = "vending_divetonuke";
if ( isDefined( bump_trigger ) )
{ if ( isdefined( bump_trigger ) )
bump_trigger.script_string = "divetonuke_perk"; bump_trigger.script_string = "divetonuke_perk";
}
} }
divetonuke_perk_machine_think() //checked changed to match cerberus output divetonuke_perk_machine_think()
{ {
init_divetonuke(); init_divetonuke();
while ( 1 )
while ( true )
{ {
machine = getentarray( "vending_divetonuke", "targetname" ); machine = getentarray( "vending_divetonuke", "targetname" );
machine_triggers = getentarray( "vending_divetonuke", "target" ); machine_triggers = getentarray( "vending_divetonuke", "target" );
for ( i = 0; i < machine.size; i++ ) for ( i = 0; i < machine.size; i++ )
{ machine[i] setmodel( level.machine_assets["divetonuke"].off_model );
machine[ i ] setmodel( level.machine_assets[ "divetonuke" ].off_model );
}
array_thread( machine_triggers, ::set_power_on, 0 ); array_thread( machine_triggers, ::set_power_on, 0 );
level thread do_initial_power_off_callback( machine, "divetonuke" ); level thread do_initial_power_off_callback( machine, "divetonuke" );
level waittill( "divetonuke_on" ); level waittill( "divetonuke_on" );
for ( i = 0; i < machine.size; i++ ) for ( i = 0; i < machine.size; i++ )
{ {
machine[ i ] setmodel( level.machine_assets[ "divetonuke" ].on_model ); 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] playsound( "zmb_perks_power_on" );
machine[ i ] thread perk_fx( "divetonuke_light" ); machine[i] thread perk_fx( "divetonuke_light" );
machine[ i ] thread play_loop_on_machine(); machine[i] thread play_loop_on_machine();
} }
level notify( "specialty_flakjacket_power_on" ); level notify( "specialty_flakjacket_power_on" );
array_thread( machine_triggers, ::set_power_on, 1 ); 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 ); array_thread( machine, level.machine_assets["divetonuke"].power_on_callback );
}
level waittill( "divetonuke_off" ); 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, level.machine_assets["divetonuke"].power_off_callback );
}
array_thread( machine, ::turn_perk_off ); 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" ); flop = getentarray( "vending_divetonuke", "targetname" );
foreach ( perk in flop ) 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 perk_fx( undefined, 1 );
perk thread perk_fx( "divetonuke_light" ); perk thread perk_fx( "divetonuke_light" );
@ -120,50 +126,47 @@ divetonuke_host_migration_func() //checked changed to match cerberus output
divetonuke_explode( attacker, origin ) divetonuke_explode( attacker, origin )
{ {
radius = level.zombie_vars[ "zombie_perk_divetonuke_radius" ]; radius = level.zombie_vars["zombie_perk_divetonuke_radius"];
min_damage = level.zombie_vars[ "zombie_perk_divetonuke_min_damage" ]; min_damage = level.zombie_vars["zombie_perk_divetonuke_min_damage"];
max_damage = level.zombie_vars[ "zombie_perk_divetonuke_max_damage" ]; max_damage = level.zombie_vars["zombie_perk_divetonuke_max_damage"];
if ( isdefined( level.flopper_network_optimized ) && level.flopper_network_optimized ) 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" );
attacker thread divetonuke_explode_network_optimized(origin, radius, max_damage, min_damage, "MOD_GRENADE_SPLASH" );
}
else else
{
radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" ); radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
}
playfx( level._effect[ "divetonuke_groundhit" ], origin ); playfx( level._effect["divetonuke_groundhit"], origin );
attacker playsound( "zmb_phdflop_explo" ); 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; 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) divetonuke_explode_network_optimized( origin, radius, max_damage, min_damage, damage_mod )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
a_zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius ); a_zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius );
network_stall_counter = 0; network_stall_counter = 0;
if ( isdefined( a_zombies ) ) if ( isdefined( a_zombies ) )
{ {
i = 0; for ( i = 0; i < a_zombies.size; i++ )
while ( i < a_zombies.size )
{ {
e_zombie = a_zombies[ i ]; e_zombie = a_zombies[i];
if ( !isdefined( e_zombie ) || !isalive( e_zombie ) ) if ( !isdefined( e_zombie ) || !isalive( e_zombie ) )
{
i++;
continue; continue;
}
dist = distance( e_zombie.origin, origin ); 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); e_zombie dodamage( damage, e_zombie.origin, self, self, 0, damage_mod );
network_stall_counter--; network_stall_counter--;
if ( network_stall_counter <= 0 ) if ( network_stall_counter <= 0 )
{ {
wait_network_frame(); wait_network_frame();
network_stall_counter = randomintrange( 1, 3 ); 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,184 +1,172 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zombies/_zm_weapons; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_equipment; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_buildables; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_weap_riotshield_prison; #include common_scripts\utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_weap_riotshield_prison;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_buildables;
#include maps/mp/_utility; #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.riotshield_name = "alcatraz_shield_zm";
level.deployedshieldmodel = []; level.deployedshieldmodel = [];
level.stowedshieldmodel = []; level.stowedshieldmodel = [];
level.carriedshieldmodel = []; level.carriedshieldmodel = [];
level.deployedshieldmodel[ 0 ] = "t6_wpn_zmb_shield_dlc2_dmg0_world"; level.deployedshieldmodel[0] = "t6_wpn_zmb_shield_dlc2_dmg0_world";
level.deployedshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dlc2_dmg1_world"; level.deployedshieldmodel[2] = "t6_wpn_zmb_shield_dlc2_dmg1_world";
level.deployedshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dlc2_dmg2_world"; level.deployedshieldmodel[3] = "t6_wpn_zmb_shield_dlc2_dmg2_world";
level.stowedshieldmodel[ 0 ] = "t6_wpn_zmb_shield_dlc2_dmg0_stow"; level.stowedshieldmodel[0] = "t6_wpn_zmb_shield_dlc2_dmg0_stow";
level.stowedshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dlc2_dmg1_stow"; level.stowedshieldmodel[2] = "t6_wpn_zmb_shield_dlc2_dmg1_stow";
level.stowedshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dlc2_dmg2_stow"; level.stowedshieldmodel[3] = "t6_wpn_zmb_shield_dlc2_dmg2_stow";
level.carriedshieldmodel[ 0 ] = "t6_wpn_zmb_shield_dlc2_dmg0_world"; level.carriedshieldmodel[0] = "t6_wpn_zmb_shield_dlc2_dmg0_world";
level.carriedshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dlc2_dmg1_world"; level.carriedshieldmodel[2] = "t6_wpn_zmb_shield_dlc2_dmg1_world";
level.carriedshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dlc2_dmg2_world"; level.carriedshieldmodel[3] = "t6_wpn_zmb_shield_dlc2_dmg2_world";
level.viewshieldmodel[ 0 ] = "t6_wpn_zmb_shield_dlc2_dmg0_view"; level.viewshieldmodel[0] = "t6_wpn_zmb_shield_dlc2_dmg0_view";
level.viewshieldmodel[ 2 ] = "t6_wpn_zmb_shield_dlc2_dmg1_view"; level.viewshieldmodel[2] = "t6_wpn_zmb_shield_dlc2_dmg1_view";
level.viewshieldmodel[ 3 ] = "t6_wpn_zmb_shield_dlc2_dmg2_view"; level.viewshieldmodel[3] = "t6_wpn_zmb_shield_dlc2_dmg2_view";
precachemodel( level.stowedshieldmodel[ 0 ] ); precachemodel( level.stowedshieldmodel[0] );
precachemodel( level.stowedshieldmodel[ 2 ] ); precachemodel( level.stowedshieldmodel[2] );
precachemodel( level.stowedshieldmodel[ 3 ] ); precachemodel( level.stowedshieldmodel[3] );
precachemodel( level.carriedshieldmodel[ 0 ] ); precachemodel( level.carriedshieldmodel[0] );
precachemodel( level.carriedshieldmodel[ 2 ] ); precachemodel( level.carriedshieldmodel[2] );
precachemodel( level.carriedshieldmodel[ 3 ] ); precachemodel( level.carriedshieldmodel[3] );
precachemodel( level.viewshieldmodel[ 0 ] ); precachemodel( level.viewshieldmodel[0] );
precachemodel( level.viewshieldmodel[ 2 ] ); precachemodel( level.viewshieldmodel[2] );
precachemodel( level.viewshieldmodel[ 3 ] ); precachemodel( level.viewshieldmodel[3] );
level.riotshield_placement_zoffset = 26; level.riotshield_placement_zoffset = 26;
} }
attachriotshield( model, tag ) //checked matches cerberus output attachriotshield( model, tag )
{ {
if ( isDefined( self.prev_shield_model ) && isDefined( self.prev_shield_tag ) ) if ( isdefined( self.prev_shield_model ) && isdefined( self.prev_shield_tag ) )
{
self detachshieldmodel( self.prev_shield_model, self.prev_shield_tag ); self detachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
}
self.prev_shield_model = model; self.prev_shield_model = model;
self.prev_shield_tag = tag; 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 ); self attachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
}
} }
removeriotshield() //checked matches cerberus output removeriotshield()
{ {
if ( isDefined( self.prev_shield_model ) && isDefined( self.prev_shield_tag ) ) if ( isdefined( self.prev_shield_model ) && isdefined( self.prev_shield_tag ) )
{
self detachshieldmodel( self.prev_shield_model, self.prev_shield_tag ); self detachshieldmodel( self.prev_shield_model, self.prev_shield_tag );
}
self.prev_shield_model = undefined; self.prev_shield_model = undefined;
self.prev_shield_tag = undefined; self.prev_shield_tag = undefined;
if ( self getcurrentweapon() != level.riotshield_name ) if ( self getcurrentweapon() != level.riotshield_name )
{
return; return;
}
self setheldweaponmodel( 0 ); self setheldweaponmodel( 0 );
} }
setriotshieldviewmodel( modelnum ) //checked matches cerberus output setriotshieldviewmodel( modelnum )
{ {
self.prev_shield_viewmodel = modelnum; self.prev_shield_viewmodel = modelnum;
if ( self getcurrentweapon() != level.riotshield_name ) if ( self getcurrentweapon() != level.riotshield_name )
{
return; return;
}
if ( isDefined( self.prev_shield_viewmodel ) ) if ( isdefined( self.prev_shield_viewmodel ) )
{
self setheldweaponmodel( self.prev_shield_viewmodel ); self setheldweaponmodel( self.prev_shield_viewmodel );
}
else else
{
self setheldweaponmodel( 0 ); self setheldweaponmodel( 0 );
}
} }
specialriotshieldviewmodel() //checked matches cerberus output specialriotshieldviewmodel()
{ {
if ( self getcurrentweapon() != level.riotshield_name ) if ( self getcurrentweapon() != level.riotshield_name )
{
return; return;
}
self setheldweaponmodel( 3 ); self setheldweaponmodel( 3 );
} }
restoreriotshieldviewmodel() //checked matches cerberus output restoreriotshieldviewmodel()
{ {
if ( self getcurrentweapon() != level.riotshield_name ) if ( self getcurrentweapon() != level.riotshield_name )
{
return; return;
}
if ( isDefined( self.prev_shield_viewmodel ) ) if ( isdefined( self.prev_shield_viewmodel ) )
{
self setheldweaponmodel( self.prev_shield_viewmodel ); self setheldweaponmodel( self.prev_shield_viewmodel );
}
else else
{
self setheldweaponmodel( 0 ); self setheldweaponmodel( 0 );
}
} }
updateriotshieldmodel() //checked changed to match cerberus output updateriotshieldmodel()
{ {
if ( !isDefined( self.shield_damage_level ) ) if ( !isdefined( self.shield_damage_level ) )
{
if ( isDefined( self.player_shield_reset_health ) )
{ {
if ( isdefined( self.player_shield_reset_health ) )
self [[ self.player_shield_reset_health ]](); self [[ self.player_shield_reset_health ]]();
} }
}
update = 0; 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; self.prev_shield_damage_level = self.shield_damage_level;
update = 1; 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; self.prev_shield_placement = self.shield_placement;
update = 1; update = 1;
} }
if ( update ) if ( update )
{ {
if ( self.prev_shield_placement == 0 ) if ( self.prev_shield_placement == 0 )
{
self attachriotshield(); self attachriotshield();
}
else if ( self.prev_shield_placement == 1 ) else if ( self.prev_shield_placement == 1 )
{ {
self attachriotshield( level.carriedshieldmodel[ self.prev_shield_damage_level ], "tag_weapon_left" ); self attachriotshield( level.carriedshieldmodel[self.prev_shield_damage_level], "tag_weapon_left" );
self setriotshieldviewmodel( self.prev_shield_damage_level ); self setriotshieldviewmodel( self.prev_shield_damage_level );
} }
else if ( self.prev_shield_placement == 2 ) else if ( self.prev_shield_placement == 2 )
{ self attachriotshield( level.stowedshieldmodel[self.prev_shield_damage_level], "tag_stowed_back" );
self attachriotshield( level.stowedshieldmodel[ self.prev_shield_damage_level ], "tag_stowed_back" );
}
else if ( self.prev_shield_placement == 3 ) else if ( self.prev_shield_placement == 3 )
{ {
self attachriotshield(); self attachriotshield();
if ( isDefined( self.shield_ent ) )
{ if ( isdefined( self.shield_ent ) )
self.shield_ent setmodel( level.deployedshieldmodel[ self.prev_shield_damage_level ] ); self.shield_ent setmodel( level.deployedshieldmodel[self.prev_shield_damage_level] );
}
} }
} }
} }
updatestandaloneriotshieldmodel() //checked matches cerberus output updatestandaloneriotshieldmodel()
{ {
update = 0; 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; self.prev_shield_damage_level = self.shield_damage_level;
update = 1; update = 1;
} }
if ( update ) if ( update )
{ self setmodel( level.deployedshieldmodel[self.prev_shield_damage_level] );
self setmodel( level.deployedshieldmodel[ self.prev_shield_damage_level ] );
}
} }
watchshieldlaststand() //checked matches cerberus output used is_true() instead watchshieldlaststand()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self notify( "watchShieldLastStand" ); self notify( "watchShieldLastStand" );
self endon( "watchShieldLastStand" ); self endon( "watchShieldLastStand" );
while ( 1 )
while ( true )
{ {
self waittill( "weapons_taken_for_last_stand" ); self waittill( "weapons_taken_for_last_stand" );
self.riotshield_hidden = 0; 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 ) 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(); self updateriotshieldmodel();
} }
} }
str_notify = self waittill_any_return( "player_revived", "bled_out" ); str_notify = self waittill_any_return( "player_revived", "bled_out" );
if ( str_notify == "player_revived" ) 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.shield_placement = self.riotshield_hidden;
self updateriotshieldmodel(); self updateriotshieldmodel();
} }
} }
else 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; self.riotshield_hidden = undefined;
} }
} }
trackriotshield()
trackriotshield() //checked changed to match cerberus output
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self.hasriotshield = self hasweapon( level.riotshield_name ); self.hasriotshield = self hasweapon( level.riotshield_name );
if ( self getcurrentweapon() == level.riotshield_name ) self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
{
self.hasriotshieldequipped = 1;
}
else
{
self.hasriotshieldequipped = 0;
}
self.shield_placement = 0; self.shield_placement = 0;
if ( self.hasriotshield ) if ( self.hasriotshield )
{ {
if ( self.hasriotshieldequipped ) if ( self.hasriotshieldequipped )
@ -233,66 +214,66 @@ trackriotshield() //checked changed to match cerberus output
self updateriotshieldmodel(); self updateriotshieldmodel();
} }
} }
for ( ;; )
for (;;)
{ {
self waittill( "weapon_change", newweapon ); self waittill( "weapon_change", newweapon );
if ( newweapon == level.riotshield_name ) if ( newweapon == level.riotshield_name )
{ {
if ( self.hasriotshieldequipped ) if ( self.hasriotshieldequipped )
{
continue; continue;
}
if ( isDefined( self.riotshieldentity ) ) if ( isdefined( self.riotshieldentity ) )
{
self notify( "destroy_riotshield" ); self notify( "destroy_riotshield" );
}
self.shield_placement = 1; self.shield_placement = 1;
self updateriotshieldmodel(); self updateriotshieldmodel();
if ( self.hasriotshield ) if ( self.hasriotshield )
{ {
break;
} }
else
{
}
self.hasriotshield = 1; self.hasriotshield = 1;
self.hasriotshieldequipped = 1; self.hasriotshieldequipped = 1;
continue; continue;
} }
if ( self ismantling() && newweapon == "none" ) if ( self ismantling() && newweapon == "none" )
{
continue; continue;
}
if ( self.hasriotshieldequipped ) if ( self.hasriotshieldequipped )
{ {
/*
/# /#
assert( self.hasriotshield ); assert( self.hasriotshield );
#/ #/
*/
self.hasriotshield = self hasweapon( level.riotshield_name ); 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 ) else if ( self.hasriotshield )
{
self.shield_placement = 2; self.shield_placement = 2;
break; else if ( isdefined( self.shield_ent ) )
}
else if ( isDefined( self.shield_ent ) )
{ {
/*
/# /#
assert( self.shield_placement == 3 ); assert( self.shield_placement == 3 );
#/ #/
*/
break;
} }
else else
{
self.shield_placement = 0; self.shield_placement = 0;
}
self updateriotshieldmodel(); self updateriotshieldmodel();
self.hasriotshieldequipped = 0; self.hasriotshieldequipped = 0;
break; continue;
} }
if ( self.hasriotshield ) if ( self.hasriotshield )
{ {
if ( !self hasweapon( level.riotshield_name ) ) if ( !self hasweapon( level.riotshield_name ) )
@ -301,8 +282,10 @@ trackriotshield() //checked changed to match cerberus output
self updateriotshieldmodel(); self updateriotshieldmodel();
self.hasriotshield = 0; self.hasriotshield = 0;
} }
continue; continue;
} }
if ( self hasweapon( level.riotshield_name ) ) if ( self hasweapon( level.riotshield_name ) )
{ {
self.shield_placement = 2; self.shield_placement = 2;
@ -312,28 +295,32 @@ trackriotshield() //checked changed to match cerberus output
} }
} }
trackequipmentchange() //checked changed to match cerberus output trackequipmentchange()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
for (;;)
{ {
self waittill( "equipment_dropped", equipname ); self waittill( "equipment_dropped", equipname );
self notify( "weapon_change", self getcurrentweapon() ); self notify( "weapon_change", self getcurrentweapon() );
} }
} }
updateriotshieldplacement() //checked matches cerberus output updateriotshieldplacement()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "deploy_riotshield" ); self endon( "deploy_riotshield" );
self endon( "start_riotshield_deploy" ); self endon( "start_riotshield_deploy" );
self endon( "weapon_change" ); self endon( "weapon_change" );
while ( 1 )
while ( true )
{ {
placement = self canplaceriotshield( "raise_riotshield" ); placement = self canplaceriotshield( "raise_riotshield" );
if ( placement[ "result" ] && riotshielddistancetest( placement[ "origin" ] ) )
if ( placement["result"] && riotshielddistancetest( placement["origin"] ) )
{ {
self restoreriotshieldviewmodel(); self restoreriotshieldviewmodel();
self setplacementhint( 1 ); self setplacementhint( 1 );
@ -343,18 +330,19 @@ updateriotshieldplacement() //checked matches cerberus output
self specialriotshieldviewmodel(); self specialriotshieldviewmodel();
self setplacementhint( 0 ); self setplacementhint( 0 );
} }
wait 0.05; wait 0.05;
} }
} }
startriotshielddeploy() //checked matches cerberus output startriotshielddeploy()
{ {
self notify( "start_riotshield_deploy" ); self notify( "start_riotshield_deploy" );
self thread updateriotshieldplacement(); self thread updateriotshieldplacement();
self thread watchriotshielddeploy(); self thread watchriotshielddeploy();
} }
spawnriotshieldcover( origin, angles ) //checked matches cerberus output spawnriotshieldcover( origin, angles )
{ {
shield_ent = spawn( "script_model", origin, 1 ); shield_ent = spawn( "script_model", origin, 1 );
shield_ent.angles = angles; shield_ent.angles = angles;
@ -365,27 +353,29 @@ spawnriotshieldcover( origin, angles ) //checked matches cerberus output
self.shield_placement = 3; self.shield_placement = 3;
self updateriotshieldmodel(); self updateriotshieldmodel();
shield_ent setscriptmoverflag( 0 ); shield_ent setscriptmoverflag( 0 );
self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( shield_ent, "destroy_riotshield", 1 ); 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 ); maps\mp\zombies\_zm_equipment::destructible_equipment_list_add( shield_ent );
return shield_ent; return shield_ent;
} }
watchriotshielddeploy() //checked matches cerberus output watchriotshielddeploy()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "start_riotshield_deploy" ); self endon( "start_riotshield_deploy" );
self waittill( "deploy_riotshield", deploy_attempt ); self waittill( "deploy_riotshield", deploy_attempt );
self restoreriotshieldviewmodel(); self restoreriotshieldviewmodel();
self setplacementhint( 1 ); self setplacementhint( 1 );
placement_hint = 0; placement_hint = 0;
if ( deploy_attempt ) if ( deploy_attempt )
{ {
placement = self canplaceriotshield( "deploy_riotshield" ); placement = self canplaceriotshield( "deploy_riotshield" );
if ( placement[ "result" ] && riotshielddistancetest( placement[ "origin" ] ) && self check_plant_position( placement[ "origin" ], placement[ "angles" ] ) )
{ if ( placement["result"] && riotshielddistancetest( placement["origin"] ) && self check_plant_position( placement["origin"], placement["angles"] ) )
self doriotshielddeploy( placement[ "origin" ], placement[ "angles" ] ); self doriotshielddeploy( placement["origin"], placement["angles"] );
}
else else
{ {
placement_hint = 1; placement_hint = 1;
@ -394,61 +384,57 @@ watchriotshielddeploy() //checked matches cerberus output
} }
} }
else else
{
placement_hint = 1; placement_hint = 1;
}
if ( placement_hint ) if ( placement_hint )
{
self setriotshieldfailhint(); 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; ret = 1;
test_ent = spawn( "script_model", origin ); test_ent = spawn( "script_model", origin );
test_ent setmodel( level.deployedshieldmodel[ 0 ] ); test_ent setmodel( level.deployedshieldmodel[0] );
test_ent.angles = angles; test_ent.angles = angles;
if ( !self [[ level.equipment_safe_to_drop ]]( test_ent ) ) if ( !self [[ level.equipment_safe_to_drop ]]( test_ent ) )
{
ret = 0; ret = 0;
}
test_ent delete(); test_ent delete();
return ret; return ret;
} }
return 1; return 1;
} }
doriotshielddeploy( origin, angles ) //checked matches cerberus output doriotshielddeploy( origin, angles )
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "start_riotshield_deploy" ); self endon( "start_riotshield_deploy" );
self notify( "deployed_riotshield" ); self notify( "deployed_riotshield" );
self maps/mp/zombies/_zm_buildables::track_placed_buildables( 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 )
{ 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_equipment::equipment_to_deployed( level.riotshield_name );
}
zoffset = level.riotshield_placement_zoffset; zoffset = level.riotshield_placement_zoffset;
shield_ent = self spawnriotshieldcover( origin + ( 0, 0, zoffset ), angles ); shield_ent = self spawnriotshieldcover( origin + ( 0, 0, zoffset ), angles );
item_ent = deployriotshield( self, shield_ent ); item_ent = deployriotshield( self, shield_ent );
primaries = self getweaponslistprimaries(); primaries = self getweaponslistprimaries();
/*
/# /#
assert( isDefined( item_ent ) ); assert( isdefined( item_ent ) );
assert( !isDefined( self.riotshieldretrievetrigger ) ); assert( !isdefined( self.riotshieldretrievetrigger ) );
assert( !isDefined( self.riotshieldentity ) ); assert( !isdefined( self.riotshieldentity ) );
#/ #/
*/ self maps\mp\zombies\_zm_weapons::switch_back_primary_weapon( primaries[0] );
self maps/mp/zombies/_zm_weapons::switch_back_primary_weapon( primaries[ 0 ] );
if ( isDefined( level.equipment_planted ) ) if ( isdefined( level.equipment_planted ) )
{
self [[ level.equipment_planted ]]( shield_ent, level.riotshield_name, self ); 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 ) ) if ( !self [[ level.equipment_safe_to_drop ]]( shield_ent ) )
{ {
@ -458,6 +444,7 @@ doriotshielddeploy( origin, angles ) //checked matches cerberus output
return; return;
} }
} }
self.riotshieldretrievetrigger = item_ent; self.riotshieldretrievetrigger = item_ent;
self.riotshieldentity = shield_ent; self.riotshieldentity = shield_ent;
self thread watchdeployedriotshieldents(); self thread watchdeployedriotshieldents();
@ -469,196 +456,178 @@ doriotshielddeploy( origin, angles ) //checked matches cerberus output
return shield_ent; 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; 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 ); dist_squared = distancesquared( level.players[i].riotshieldentity.origin, origin );
if ( min_dist_squared > dist_squared ) if ( min_dist_squared > dist_squared )
{ {
/*
/# /#
println( "Shield placement denied! Failed distance check to other riotshields." ); println( "Shield placement denied! Failed distance check to other riotshields." );
#/ #/
*/ return false;
return 0;
} }
} }
i++;
} }
return 1;
return true;
} }
watchdeployedriotshieldents() //checked matches cerberus output watchdeployedriotshieldents()
{ {
/*
/# /#
assert( isDefined( self.riotshieldretrievetrigger ) ); assert( isdefined( self.riotshieldretrievetrigger ) );
assert( isDefined( self.riotshieldentity ) ); assert( isdefined( self.riotshieldentity ) );
#/ #/
*/
riotshieldretrievetrigger = self.riotshieldretrievetrigger; riotshieldretrievetrigger = self.riotshieldretrievetrigger;
riotshieldentity = self.riotshieldentity; riotshieldentity = self.riotshieldentity;
self waittill_any( "destroy_riotshield", "disconnect", "alcatraz_shield_zm_taken" ); self waittill_any( "destroy_riotshield", "disconnect", "alcatraz_shield_zm_taken" );
if ( isDefined( self ) )
if ( isdefined( self ) )
{ {
self.shield_placement = 0; self.shield_placement = 0;
self updateriotshieldmodel(); self updateriotshieldmodel();
} }
if ( isDefined( riotshieldretrievetrigger ) )
{ if ( isdefined( riotshieldretrievetrigger ) )
riotshieldretrievetrigger delete(); riotshieldretrievetrigger delete();
}
if ( isDefined( riotshieldentity ) ) if ( isdefined( riotshieldentity ) )
{
riotshieldentity delete(); riotshieldentity delete();
}
} }
watchdeployedriotshielddamage() //checked changed to match cerberus output watchdeployedriotshielddamage()
{ {
self endon( "death" ); self endon( "death" );
damagemax = getDvarInt( "riotshield_deployed_health" ); damagemax = getdvarint( "riotshield_deployed_health" );
self.damagetaken = 0; self.damagetaken = 0;
while ( 1 )
while ( true )
{ {
self.maxhealth = 100000; self.maxhealth = 100000;
self.health = self.maxhealth; self.health = self.maxhealth;
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags ); 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; continue;
}
if ( !isDefined( attacker ) || !isplayer( attacker ) ) if ( !isdefined( attacker ) || !isplayer( attacker ) )
{
continue; continue;
}
/# /#
if ( isDefined( self.owner ) ) assert( isdefined( self.owner ) && isdefined( self.owner.team ) );
{
assert( isDefined( self.owner.team ) );
}
#/ #/
if ( is_encounter() && attacker.team == self.owner.team && attacker != self.owner ) if ( is_encounter() && attacker.team == self.owner.team && attacker != self.owner )
{
continue; continue;
}
if ( isDefined( level.riotshield_damage_callback ) ) if ( isdefined( level.riotshield_damage_callback ) )
{
self.owner [[ level.riotshield_damage_callback ]]( damage, 0 ); self.owner [[ level.riotshield_damage_callback ]]( damage, 0 );
continue; else
}
else if ( type == "MOD_MELEE" )
{ {
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" ) else if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" )
{ damage *= getdvarfloat( "riotshield_bullet_damage_scale" );
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" );
if ( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_EXPLOSIVE" || type == "MOD_EXPLOSIVE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH" )
{
damage *= getDvarFloat( "riotshield_explosive_damage_scale" );
break;
}
else if ( type == "MOD_IMPACT" ) else if ( type == "MOD_IMPACT" )
{ damage *= getdvarfloat( "riotshield_projectile_damage_scale" );
damage *= getDvarFloat( "riotshield_projectile_damage_scale" );
}
self.damagetaken += damage; self.damagetaken += damage;
if ( self.damagetaken >= damagemax ) if ( self.damagetaken >= damagemax )
{
self damagethendestroyriotshield(); self damagethendestroyriotshield();
} }
} }
} }
damagethendestroyriotshield() //checked matches cerberus output damagethendestroyriotshield()
{ {
self endon( "death" ); self endon( "death" );
self.owner.riotshieldretrievetrigger delete(); self.owner.riotshieldretrievetrigger delete();
self notsolid(); self notsolid();
self setclientflag( 14 ); self setclientflag( 14 );
wait getDvarFloat( "riotshield_destroyed_cleanup_time" ); wait( getdvarfloat( "riotshield_destroyed_cleanup_time" ) );
self.owner notify( "destroy_riotshield" ); self.owner notify( "destroy_riotshield" );
} }
deleteshieldondamage( shield_ent ) //checked matches cerberus output deleteshieldondamage( shield_ent )
{ {
shield_ent waittill( "death" ); shield_ent waittill( "death" );
self notify( "destroy_riotshield" ); self notify( "destroy_riotshield" );
} }
deleteshieldmodelonweaponpickup( shield_trigger ) //checked matches cerberus output deleteshieldmodelonweaponpickup( shield_trigger )
{ {
shield_trigger waittill( "trigger", player ); 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" ); self notify( "destroy_riotshield" );
if ( self != player ) if ( self != player )
{ {
if ( isDefined( level.transferriotshield ) ) if ( isdefined( level.transferriotshield ) )
{
[[ level.transferriotshield ]]( self, player ); [[ level.transferriotshield ]]( self, player );
} }
}
} }
watchshieldtriggervisibility( trigger ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2 watchshieldtriggervisibility( trigger )
{ {
self endon( "death" ); self endon( "death" );
trigger endon( "death" ); trigger endon( "death" );
while ( isDefined( trigger ) )
while ( isdefined( trigger ) )
{ {
players = get_players(); players = get_players();
foreach ( player in players ) foreach ( player in players )
{ {
pickup = 1; pickup = 1;
if ( !isDefined( player ) )
{ if ( !isdefined( player ) )
} continue;
else if ( is_true( player.afterlife ) )
if ( is_true( player.afterlife ) )
{ {
trigger setinvisibletoplayer( player ); trigger setinvisibletoplayer( player );
wait 0.05; wait 0.05;
continue;
} }
else
{ if ( isdefined( level.cantransferriotshield ) )
if ( isDefined( level.cantransferriotshield ) )
{
pickup = [[ level.cantransferriotshield ]]( self, player ); pickup = [[ level.cantransferriotshield ]]( self, player );
}
if ( !isDefined( trigger ) ) if ( !isdefined( trigger ) )
{
return; return;
}
if ( pickup ) if ( pickup )
{
trigger setvisibletoplayer( player ); trigger setvisibletoplayer( player );
}
else else
{
trigger setinvisibletoplayer( player ); trigger setinvisibletoplayer( player );
}
wait 0.05; wait 0.05;
} }
}
wait 0.05; wait 0.05;
} }
} }
deleteriotshieldonplayerdeath() //checked matches cerberus output deleteriotshieldonplayerdeath()
{ {
self.riotshieldentity endon( "death" ); self.riotshieldentity endon( "death" );
self waittill( "death" ); self waittill( "death" );
self notify( "destroy_riotshield" ); self notify( "destroy_riotshield" );
} }

View File

@ -1,10 +1,15 @@
#include maps/mp/zombies/_zm_stats; // T6 GSC SOURCE
#include common_scripts/utility; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/_utility; #include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_stats;
init() 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_projectile" );
precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" ); precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" );
@ -17,9 +22,12 @@ on_spawn( watcher, player )
player endon( "disconnect" ); player endon( "disconnect" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
level endon( "game_ended" ); level endon( "game_ended" );
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone ); self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
isfriendly = 0; isfriendly = 0;
if ( isDefined( endpos ) )
if ( isdefined( endpos ) )
{ {
retrievable_model = spawn( "script_model", endpos ); retrievable_model = spawn( "script_model", endpos );
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" ); retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
@ -27,47 +35,38 @@ on_spawn( watcher, player )
retrievable_model.owner = player; retrievable_model.owner = player;
retrievable_model.angles = angles; retrievable_model.angles = angles;
retrievable_model.name = watcher.weapon; retrievable_model.name = watcher.weapon;
if ( isDefined( prey ) )
if ( isdefined( prey ) )
{ {
if ( isplayer( prey ) && player.team == prey.team ) if ( isplayer( prey ) && player.team == prey.team )
{
isfriendly = 1; isfriendly = 1;
} else if ( isai( prey ) && player.team == prey.team )
else
{
if ( isai( prey ) && player.team == prey.team )
{
isfriendly = 1; isfriendly = 1;
}
}
if ( !isfriendly ) if ( !isfriendly )
{ {
retrievable_model linkto( prey, bone ); retrievable_model linkto( prey, bone );
retrievable_model thread force_drop_knives_to_ground_on_death( player, prey ); retrievable_model thread force_drop_knives_to_ground_on_death( player, prey );
} }
else else if ( isfriendly )
{
if ( isfriendly )
{ {
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) ); retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
normal = ( 0, 0, 1 ); normal = ( 0, 0, 1 );
} }
} }
}
watcher.objectarray[ watcher.objectarray.size ] = retrievable_model; watcher.objectarray[watcher.objectarray.size] = retrievable_model;
if ( isfriendly ) if ( isfriendly )
{
retrievable_model waittill( "stationary" ); retrievable_model waittill( "stationary" );
}
retrievable_model thread drop_knives_to_ground( player ); retrievable_model thread drop_knives_to_ground( player );
if ( isfriendly ) if ( isfriendly )
{ player notify( "ballistic_knife_stationary", retrievable_model, normal );
player notify( "ballistic_knife_stationary" );
}
else else
{ player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
player notify( "ballistic_knife_stationary" );
}
retrievable_model thread wait_to_show_glowing_model( prey ); retrievable_model thread wait_to_show_glowing_model( prey );
} }
} }
@ -86,52 +85,59 @@ on_spawn_retrieve_trigger( watcher, player )
player endon( "disconnect" ); player endon( "disconnect" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
level endon( "game_ended" ); level endon( "game_ended" );
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey ); player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
if ( !isDefined( retrievable_model ) )
{ if ( !isdefined( retrievable_model ) )
return; return;
}
trigger_pos = []; trigger_pos = [];
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
{ {
trigger_pos[ 0 ] = prey.origin[ 0 ]; trigger_pos[0] = prey.origin[0];
trigger_pos[ 1 ] = prey.origin[ 1 ]; trigger_pos[1] = prey.origin[1];
trigger_pos[ 2 ] = prey.origin[ 2 ] + 10; trigger_pos[2] = prey.origin[2] + 10;
} }
else else
{ {
trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( 10 * normal[ 0 ] ); trigger_pos[0] = retrievable_model.origin[0] + 10 * normal[0];
trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( 10 * normal[ 1 ] ); trigger_pos[1] = retrievable_model.origin[1] + 10 * normal[1];
trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( 10 * normal[ 2 ] ); trigger_pos[2] = retrievable_model.origin[2] + 10 * normal[2];
} }
pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 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 setcursorhint( "HINT_NOICON" );
}
pickup_trigger.owner = player; pickup_trigger.owner = player;
retrievable_model.retrievabletrigger = pickup_trigger; retrievable_model.retrievabletrigger = pickup_trigger;
hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP"; hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP";
if ( isDefined( hint_string ) )
{ if ( isdefined( hint_string ) )
pickup_trigger sethintstring( hint_string ); pickup_trigger sethintstring( hint_string );
}
else else
{
pickup_trigger sethintstring( &"GENERIC_PICKUP" ); pickup_trigger sethintstring( &"GENERIC_PICKUP" );
}
pickup_trigger setteamfortrigger( player.team ); pickup_trigger setteamfortrigger( player.team );
player clientclaimtrigger( pickup_trigger ); player clientclaimtrigger( pickup_trigger );
pickup_trigger enablelinkto(); pickup_trigger enablelinkto();
if ( isDefined( prey ) )
{ if ( isdefined( prey ) )
pickup_trigger linkto( prey ); pickup_trigger linkto( prey );
}
else else
{
pickup_trigger linkto( retrievable_model ); pickup_trigger linkto( retrievable_model );
}
if ( isDefined( level.knife_planted ) ) if ( isdefined( level.knife_planted ) )
{
[[ level.knife_planted ]]( retrievable_model, pickup_trigger, prey ); [[ 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 ); 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 ); player thread watch_shutdown( pickup_trigger, retrievable_model );
} }
@ -140,12 +146,13 @@ debug_print( endpos )
{ {
/# /#
self endon( "death" ); self endon( "death" );
while ( 1 )
while ( true )
{ {
print3d( endpos, "pickup_trigger" ); print3d( endpos, "pickup_trigger" );
wait 0,05; wait 0.05;
#/
} }
#/
} }
watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse ) 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( "death" );
self endon( "delete" ); self endon( "delete" );
level endon( "game_ended" ); level endon( "game_ended" );
while ( 1 ) max_ammo = weaponmaxammo( weapon ) + 1;
autorecover = is_true( level.ballistic_knife_autorecover );
while ( true )
{ {
trigger waittill( "trigger", player ); trigger waittill( "trigger", player );
while ( !isalive( player ) )
{ if ( !isalive( player ) )
continue; continue;
}
while ( !player isonground() ) if ( !player isonground() && !is_true( trigger.force_pickup ) )
{
continue; continue;
}
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
{
continue; continue;
}
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
{
continue; continue;
}
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() ) ammo_stock = player getweaponammostock( weapon );
{ ammo_clip = player getweaponammoclip( weapon );
if ( isDefined( playersoundonuse ) ) 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 ); player playlocalsound( playersoundonuse );
}
if ( isDefined( npcsoundonuse ) ) if ( isdefined( npcsoundonuse ) )
{
player playsound( npcsoundonuse ); player playsound( npcsoundonuse );
}
player thread [[ callback ]]( weapon, model, trigger ); player thread [[ callback ]]( weapon, model, trigger );
return; break;
}
else
{
} }
} }
} }
pick_up( weapon, model, trigger ) pick_up( weapon, model, trigger )
{ {
if ( self hasweapon( weapon ) )
{
current_weapon = self getcurrentweapon(); current_weapon = self getcurrentweapon();
if ( current_weapon != weapon ) if ( current_weapon != weapon )
{ {
clip_ammo = self getweaponammoclip( weapon ); clip_ammo = self getweaponammoclip( weapon );
if ( !clip_ammo ) if ( !clip_ammo )
{
self setweaponammoclip( weapon, 1 ); self setweaponammoclip( weapon, 1 );
}
else else
{ {
new_ammo_stock = self getweaponammostock( weapon ) + 1; new_ammo_stock = self getweaponammostock( weapon ) + 1;
@ -212,27 +228,28 @@ pick_up( weapon, model, trigger )
new_ammo_stock = self getweaponammostock( weapon ) + 1; new_ammo_stock = self getweaponammostock( weapon ) + 1;
self setweaponammostock( weapon, new_ammo_stock ); 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(); model destroy_ent();
trigger destroy_ent(); trigger destroy_ent();
} }
destroy_ent() destroy_ent()
{ {
if ( isDefined( self ) ) if ( isdefined( self ) )
{
if ( isDefined( self.glowing_model ) )
{ {
if ( isdefined( self.glowing_model ) )
self.glowing_model delete(); self.glowing_model delete();
}
self delete(); self delete();
} }
} }
watch_shutdown( trigger, model ) watch_shutdown( trigger, model )
{ {
self waittill_any( "death", "disconnect", "zmb_lost_knife" ); self waittill_any( "death_or_disconnect", "zmb_lost_knife" );
trigger destroy_ent(); trigger destroy_ent();
model destroy_ent(); model destroy_ent();
} }
@ -241,12 +258,14 @@ drop_knives_to_ground( player )
{ {
player endon( "death" ); player endon( "death" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
for ( ;; )
for (;;)
{ {
level waittill( "drop_objects_to_ground", origin, radius ); 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 ); self thread update_retrieve_trigger( player );
} }
} }
@ -256,9 +275,11 @@ force_drop_knives_to_ground_on_death( player, prey )
{ {
self endon( "death" ); self endon( "death" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
prey waittill( "death" ); prey waittill( "death" );
self unlink(); 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 ); self thread update_retrieve_trigger( player );
} }
@ -266,13 +287,16 @@ update_retrieve_trigger( player )
{ {
self endon( "death" ); self endon( "death" );
player endon( "zmb_lost_knife" ); 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 ); self [[ level.custom_update_retrieve_trigger ]]( player );
return; return;
} }
self waittill( "stationary" ); self waittill( "stationary" );
trigger = self.retrievabletrigger; trigger = self.retrievabletrigger;
trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 ); trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
trigger linkto( self ); trigger linkto( self );
} }

View File

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

View File

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

View File

@ -1,19 +1,22 @@
#include maps/mp/zombies/_zm_audio; // T6 GSC SOURCE
#include maps/mp/animscripts/zm_death; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_unitrigger; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_weapons; #include common_scripts\utility;
#include maps/mp/zombies/_zm_laststand; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_stats; #include maps\mp\zombies\_zm_riotshield_prison;
#include maps/mp/gametypes_zm/_weaponobjects; #include maps\mp\zombies\_zm_spawner;
#include maps/mp/zombies/_zm_equipment; #include maps\mp\zombies\_zm_equipment;
#include maps/mp/zombies/_zm_spawner; #include maps\mp\gametypes_zm\_weaponobjects;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_stats;
#include common_scripts/utility; #include maps\mp\zombies\_zm_laststand;
#include maps/mp/_utility; #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() 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_cylinder_radius", 360 );
set_zombie_var( "riotshield_fling_range", 90 ); set_zombie_var( "riotshield_fling_range", 90 );
set_zombie_var( "riotshield_gib_range", 90 ); set_zombie_var( "riotshield_gib_range", 90 );
@ -25,16 +28,16 @@ init()
set_zombie_var( "riotshield_knockdown_damage_shield", 15 ); set_zombie_var( "riotshield_knockdown_damage_shield", 15 );
level.riotshield_network_choke_count = 0; level.riotshield_network_choke_count = 0;
level.riotshield_gib_refs = []; level.riotshield_gib_refs = [];
level.riotshield_gib_refs[ level.riotshield_gib_refs.size ] = "guts"; level.riotshield_gib_refs[level.riotshield_gib_refs.size] = "guts";
level.riotshield_gib_refs[ level.riotshield_gib_refs.size ] = "right_arm"; level.riotshield_gib_refs[level.riotshield_gib_refs.size] = "right_arm";
level.riotshield_gib_refs[ level.riotshield_gib_refs.size ] = "left_arm"; level.riotshield_gib_refs[level.riotshield_gib_refs.size] = "left_arm";
level.riotshield_damage_callback = ::player_damage_shield; level.riotshield_damage_callback = ::player_damage_shield;
level.deployed_riotshield_damage_callback = ::deployed_damage_shield; level.deployed_riotshield_damage_callback = ::deployed_damage_shield;
level.transferriotshield = ::transferriotshield; level.transferriotshield = ::transferriotshield;
level.cantransferriotshield = ::cantransferriotshield; level.cantransferriotshield = ::cantransferriotshield;
maps/mp/zombies/_zm_spawner::register_zombie_damage_callback( ::riotshield_zombie_damage_response ); 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\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\gametypes_zm\_weaponobjects::createretrievablehint( "riotshield", &"ZOMBIE_EQUIP_RIOTSHIELD_PICKUP_HINT_STRING" );
onplayerconnect_callback( ::onplayerconnect ); onplayerconnect_callback( ::onplayerconnect );
} }
@ -51,9 +54,10 @@ onplayerconnect()
dropshield() dropshield()
{ {
self.shield_placement = 0; self.shield_placement = 0;
self maps/mp/zombies/_zm_riotshield_prison::updateriotshieldmodel(); 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 ); 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 ) )
if ( isdefined( item ) )
{ {
item.shielddamagetaken = self.shielddamagetaken; item.shielddamagetaken = self.shielddamagetaken;
item.original_owner = self; item.original_owner = self;
@ -65,6 +69,7 @@ dropshield()
item.requires_pickup = 1; item.requires_pickup = 1;
item thread watchtoofriendly( self ); item thread watchtoofriendly( self );
} }
self takeweapon( level.riotshield_name ); self takeweapon( level.riotshield_name );
return item; return item;
} }
@ -72,13 +77,13 @@ dropshield()
watchtoofriendly( player ) watchtoofriendly( player )
{ {
wait 1; 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 ) ) if ( isalive( player ) )
{
player playlocalsound( level.zmb_laugh_alias ); 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 ); self deployed_damage_shield( 2000 );
} }
} }
@ -87,7 +92,7 @@ pickupshield( item )
{ {
item.owner = self; item.owner = self;
damage = item.shielddamagetaken; damage = item.shielddamagetaken;
damagemax = level.zombie_vars[ "riotshield_hit_points" ]; damagemax = level.zombie_vars["riotshield_hit_points"];
self.shielddamagetaken = damage; self.shielddamagetaken = damage;
self player_set_shield_health( damage, damagemax ); self player_set_shield_health( damage, damagemax );
} }
@ -97,49 +102,46 @@ placeshield( origin, angles )
if ( self getcurrentweapon() != level.riotshield_name ) if ( self getcurrentweapon() != level.riotshield_name )
{ {
self switchtoweapon( level.riotshield_name ); self switchtoweapon( level.riotshield_name );
self waittill( "weapon_change" ); 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.angles = self.angles;
item.owner = self; item.owner = self;
} }
return item; return item;
} }
cantransferriotshield( fromplayer, toplayer ) cantransferriotshield( fromplayer, toplayer )
{ {
if ( isDefined( toplayer.screecher_weapon ) ) if ( isdefined( toplayer.screecher_weapon ) )
{ return false;
return 0;
} if ( isdefined( toplayer.is_drinking ) && toplayer.is_drinking > 0 )
if ( isDefined( toplayer.is_drinking ) && toplayer.is_drinking > 0 ) return false;
{
return 0; if ( toplayer maps\mp\zombies\_zm_laststand::player_is_in_laststand() || toplayer in_revive_trigger() )
} return false;
if ( toplayer maps/mp/zombies/_zm_laststand::player_is_in_laststand() || toplayer in_revive_trigger() )
{
return 0;
}
if ( toplayer isthrowinggrenade() ) if ( toplayer isthrowinggrenade() )
{ return false;
return 0;
}
if ( fromplayer == toplayer ) if ( fromplayer == toplayer )
{ return true;
return 1;
}
if ( toplayer is_player_equipment( level.riotshield_name ) && toplayer.shield_placement != 3 ) if ( toplayer is_player_equipment( level.riotshield_name ) && toplayer.shield_placement != 3 )
{ return false;
return 0;
}
if ( fromplayer.session_team != toplayer.session_team ) if ( fromplayer.session_team != toplayer.session_team )
{ return false;
return 0;
} return true;
return 1;
} }
transferriotshield( fromplayer, toplayer ) transferriotshield( fromplayer, toplayer )
@ -150,19 +152,21 @@ transferriotshield( fromplayer, toplayer )
toplayer.shielddamagetaken = damage; toplayer.shielddamagetaken = damage;
toplayer.shield_placement = 3; toplayer.shield_placement = 3;
toplayer.shield_damage_level = 0; 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" ); toplayer switchtoweapon( "alcatraz_shield_zm" );
damagemax = level.zombie_vars[ "riotshield_hit_points" ]; damagemax = level.zombie_vars["riotshield_hit_points"];
toplayer player_set_shield_health( damage, damagemax ); toplayer player_set_shield_health( damage, damagemax );
} }
player_take_riotshield() player_take_riotshield()
{ {
self notify( "destroy_riotshield" ); self notify( "destroy_riotshield" );
if ( self getcurrentweapon() == "alcatraz_shield_zm" ) if ( self getcurrentweapon() == "alcatraz_shield_zm" )
{ {
new_primary = ""; new_primary = "";
if ( isDefined( self.laststand ) && self.laststand )
if ( isdefined( self.laststand ) && self.laststand )
{ {
new_primary = self.laststandpistol; new_primary = self.laststandpistol;
self giveweapon( new_primary ); self giveweapon( new_primary );
@ -170,31 +174,31 @@ player_take_riotshield()
else else
{ {
primaryweapons = self getweaponslistprimaries(); primaryweapons = self getweaponslistprimaries();
i = 0;
while ( i < primaryweapons.size ) for ( i = 0; i < primaryweapons.size; i++ )
{ {
if ( primaryweapons[ i ] != "alcatraz_shield_zm" ) if ( primaryweapons[i] != "alcatraz_shield_zm" )
{ {
new_primary = primaryweapons[ i ]; new_primary = primaryweapons[i];
break; break;
} }
else
{
i++;
}
} }
if ( new_primary == "" ) 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"; new_primary = "zombie_fists_zm";
} }
} }
self switchtoweaponimmediate( new_primary ); self switchtoweaponimmediate( new_primary );
self playsound( "wpn_riotshield_zm_destroy" ); self playsound( "wpn_riotshield_zm_destroy" );
self waittill( "weapon_change" ); 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.hasriotshield = 0;
self.hasriotshieldequipped = 0; self.hasriotshieldequipped = 0;
} }
@ -202,9 +206,11 @@ player_take_riotshield()
player_watch_laststand() player_watch_laststand()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
while ( 1 )
while ( true )
{ {
self waittill( "entering_last_stand" ); self waittill( "entering_last_stand" );
if ( self getcurrentweapon() == "alcatraz_shield_zm" ) if ( self getcurrentweapon() == "alcatraz_shield_zm" )
{ {
new_primary = self.laststandpistol; new_primary = self.laststandpistol;
@ -219,7 +225,7 @@ player_init_shield_health()
retval = self.shielddamagetaken > 0; retval = self.shielddamagetaken > 0;
self.shielddamagetaken = 0; self.shielddamagetaken = 0;
self.shield_damage_level = 0; self.shield_damage_level = 0;
self maps/mp/zombies/_zm_riotshield_prison::updateriotshieldmodel(); self maps\mp\zombies\_zm_riotshield_prison::updateriotshieldmodel();
return retval; return retval;
} }
@ -228,75 +234,65 @@ player_init_shield_location()
self.hasriotshield = 1; self.hasriotshield = 1;
self.hasriotshieldequipped = 0; self.hasriotshieldequipped = 0;
self.shield_placement = 2; 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 ) 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 ) if ( shieldhealth >= 50 )
{
self.shield_damage_level = 0; self.shield_damage_level = 0;
}
else if ( shieldhealth >= 25 ) else if ( shieldhealth >= 25 )
{
self.shield_damage_level = 2; self.shield_damage_level = 2;
}
else else
{
self.shield_damage_level = 3; 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 ) 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 ) if ( shieldhealth >= 50 )
{
self.shield_damage_level = 0; self.shield_damage_level = 0;
}
else if ( shieldhealth >= 25 ) else if ( shieldhealth >= 25 )
{
self.shield_damage_level = 2; self.shield_damage_level = 2;
}
else else
{
self.shield_damage_level = 3; 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 ) player_damage_shield( idamage, bheld )
{ {
damagemax = level.zombie_vars[ "riotshield_hit_points" ]; damagemax = level.zombie_vars["riotshield_hit_points"];
if ( !isDefined( self.shielddamagetaken ) )
{ if ( !isdefined( self.shielddamagetaken ) )
self.shielddamagetaken = 0; self.shielddamagetaken = 0;
}
self.shielddamagetaken += idamage; self.shielddamagetaken += idamage;
if ( self.shielddamagetaken >= damagemax ) if ( self.shielddamagetaken >= damagemax )
{ {
if ( bheld || !isDefined( self.shield_ent ) ) if ( bheld || !isdefined( self.shield_ent ) )
{ {
self playrumbleonentity( "damage_heavy" ); self playrumbleonentity( "damage_heavy" );
earthquake( 1, 0,75, self.origin, 100 ); earthquake( 1.0, 0.75, self.origin, 100 );
} }
else else if ( isdefined( self.shield_ent ) )
{
if ( isDefined( self.shield_ent ) )
{ {
if ( is_true( self.shield_ent.destroy_begun ) ) if ( is_true( self.shield_ent.destroy_begun ) )
{
return; return;
}
self.shield_ent.destroy_begun = 1; self.shield_ent.destroy_begun = 1;
shield_origin = self.shield_ent.origin; 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; wait 1;
playsoundatposition( "wpn_riotshield_zm_destroy", shield_origin ); playsoundatposition( "wpn_riotshield_zm_destroy", shield_origin );
} }
}
self thread player_take_riotshield(); self thread player_take_riotshield();
} }
else else
@ -304,8 +300,9 @@ player_damage_shield( idamage, bheld )
if ( bheld ) if ( bheld )
{ {
self playrumbleonentity( "damage_light" ); 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 player_set_shield_health( self.shielddamagetaken, damagemax );
self playsound( "fly_riotshield_zm_impact_zombies" ); self playsound( "fly_riotshield_zm_impact_zombies" );
} }
@ -313,31 +310,29 @@ player_damage_shield( idamage, bheld )
deployed_damage_shield( idamage ) deployed_damage_shield( idamage )
{ {
damagemax = level.zombie_vars[ "riotshield_hit_points" ]; damagemax = level.zombie_vars["riotshield_hit_points"];
if ( !isDefined( self.shielddamagetaken ) )
{ if ( !isdefined( self.shielddamagetaken ) )
self.shielddamagetaken = 0; self.shielddamagetaken = 0;
}
self.shielddamagetaken += idamage; self.shielddamagetaken += idamage;
if ( self.shielddamagetaken >= damagemax ) if ( self.shielddamagetaken >= damagemax )
{ {
shield_origin = self.origin; shield_origin = self.origin;
if ( isDefined( self.stub ) )
{ if ( isdefined( self.stub ) )
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.stub ); thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.stub );
}
if ( isDefined( self.original_owner ) ) if ( isdefined( self.original_owner ) )
{ self.original_owner maps\mp\zombies\_zm_equipment::equipment_take( "alcatraz_shield_zm" );
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 );
maps/mp/zombies/_zm_equipment::equipment_disappear_fx( shield_origin, level._riotshield_dissapear_fx );
playsoundatposition( "wpn_riotshield_zm_destroy", shield_origin ); playsoundatposition( "wpn_riotshield_zm_destroy", shield_origin );
self_delete(); self_delete();
} }
else else
{
self deployed_set_shield_health( self.shielddamagetaken, damagemax ); self deployed_set_shield_health( self.shielddamagetaken, damagemax );
}
} }
riotshield_activation_watcher_thread() riotshield_activation_watcher_thread()
@ -345,10 +340,9 @@ riotshield_activation_watcher_thread()
self endon( "zombified" ); self endon( "zombified" );
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "alcatraz_shield_zm_taken" ); self endon( "alcatraz_shield_zm_taken" );
while ( 1 )
{ while ( true )
self waittill_either( "alcatraz_shield_zm_activate", "alcatraz_shield_zm_deactivate" ); self waittill_either( "alcatraz_shield_zm_activate", "alcatraz_shield_zm_deactivate" );
}
} }
watchriotshielduse() watchriotshielduse()
@ -356,59 +350,60 @@ watchriotshielduse()
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self.shielddamagetaken = 0; self.shielddamagetaken = 0;
self thread maps/mp/zombies/_zm_riotshield_prison::trackriotshield(); 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::trackequipmentchange();
self thread maps/mp/zombies/_zm_riotshield_prison::watchshieldlaststand(); self thread maps\mp\zombies\_zm_riotshield_prison::watchshieldlaststand();
self thread trackstuckzombies(); self thread trackstuckzombies();
for ( ;; )
for (;;)
{ {
self waittill( "raise_riotshield" ); self waittill( "raise_riotshield" );
self thread maps/mp/zombies/_zm_riotshield_prison::startriotshielddeploy();
self thread maps\mp\zombies\_zm_riotshield_prison::startriotshielddeploy();
} }
} }
watchriotshieldmelee() watchriotshieldmelee()
{ {
for ( ;; ) for (;;)
{ {
self waittill( "weapon_melee", weapon ); self waittill( "weapon_melee", weapon );
if ( weapon == level.riotshield_name ) if ( weapon == level.riotshield_name )
{
self riotshield_melee(); self riotshield_melee();
} }
}
} }
is_riotshield_damage( mod, player, amount ) is_riotshield_damage( mod, player, amount )
{ {
if ( mod == "MOD_MELEE" && player hasweapon( level.riotshield_name ) && amount < 10 ) if ( mod == "MOD_MELEE" && player hasweapon( level.riotshield_name ) && amount < 10 )
{ return true;
return 1;
} return false;
return 0;
} }
riotshield_damage( amount ) riotshield_damage( amount )
{ {
} }
riotshield_fling_zombie( player, fling_vec, index ) riotshield_fling_zombie( player, fling_vec, index )
{ {
if ( !isDefined( self ) || !isalive( self ) ) if ( !isdefined( self ) || !isalive( self ) )
{
return; return;
}
if ( isDefined( self.ignore_riotshield ) && self.ignore_riotshield ) if ( isdefined( self.ignore_riotshield ) && self.ignore_riotshield )
{
return; return;
}
if ( isDefined( self.riotshield_fling_func ) ) if ( isdefined( self.riotshield_fling_func ) )
{ {
self [[ self.riotshield_fling_func ]]( player ); self [[ self.riotshield_fling_func ]]( player );
return; return;
} }
damage = 2500; damage = 2500;
self dodamage( damage, player.origin, player, player, "", "MOD_IMPACT" ); self dodamage( damage, player.origin, player, player, "", "MOD_IMPACT" );
if ( self.health < 1 ) if ( self.health < 1 )
{ {
self.riotshield_death = 1; self.riotshield_death = 1;
@ -419,18 +414,18 @@ riotshield_fling_zombie( player, fling_vec, index )
zombie_knockdown( player, gib ) zombie_knockdown( player, gib )
{ {
damage = level.zombie_vars[ "riotshield_knockdown_damage" ]; 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 ); self [[ level.override_riotshield_damage_func ]]( player, gib );
}
else else
{ {
if ( gib ) if ( gib )
{ {
self.a.gib_ref = random( level.riotshield_gib_refs ); 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 ); self dodamage( damage, player.origin, player );
} }
} }
@ -440,114 +435,106 @@ riotshield_knockdown_zombie( player, gib )
self endon( "death" ); self endon( "death" );
playsoundatposition( "vox_riotshield_forcehit", self.origin ); playsoundatposition( "vox_riotshield_forcehit", self.origin );
playsoundatposition( "wpn_riotshield_proj_impact", self.origin ); playsoundatposition( "wpn_riotshield_proj_impact", self.origin );
if ( !isDefined( self ) || !isalive( self ) )
{ if ( !isdefined( self ) || !isalive( self ) )
return; return;
}
if ( isDefined( self.riotshield_knockdown_func ) ) if ( isdefined( self.riotshield_knockdown_func ) )
{
self [[ self.riotshield_knockdown_func ]]( player, gib ); self [[ self.riotshield_knockdown_func ]]( player, gib );
}
else else
{
self zombie_knockdown( player, gib ); self zombie_knockdown( player, gib );
}
self dodamage( level.zombie_vars[ "riotshield_knockdown_damage" ], player.origin, player ); self dodamage( level.zombie_vars["riotshield_knockdown_damage"], player.origin, player );
self playsound( "fly_riotshield_forcehit" ); self playsound( "fly_riotshield_forcehit" );
} }
riotshield_get_enemies_in_range() riotshield_get_enemies_in_range()
{ {
view_pos = self geteye(); view_pos = self geteye();
zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, 2 * level.zombie_vars[ "riotshield_knockdown_range" ] ); 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; return;
}
knockdown_range_squared = level.zombie_vars[ "riotshield_knockdown_range" ] * level.zombie_vars[ "riotshield_knockdown_range" ]; 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" ]; 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" ]; 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" ]; cylinder_radius_squared = level.zombie_vars["riotshield_cylinder_radius"] * level.zombie_vars["riotshield_cylinder_radius"];
forward_view_angles = self getweaponforwarddir(); 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 ); 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 ); 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 ); 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 );
}
#/ #/
} for ( i = 0; i < zombies.size; i++ )
i = 0;
while ( i < zombies.size )
{ {
if ( !isDefined( zombies[ i ] ) || !isalive( zombies[ i ] ) ) if ( !isdefined( zombies[i] ) || !isalive( zombies[i] ) )
{
i++;
continue; continue;
}
else test_origin = zombies[i] getcentroid();
{
test_origin = zombies[ i ] getcentroid();
test_range_squared = distancesquared( view_pos, test_origin ); test_range_squared = distancesquared( view_pos, test_origin );
if ( test_range_squared > knockdown_range_squared ) 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; return;
} }
normal = vectornormalize( test_origin - view_pos ); normal = vectornormalize( test_origin - view_pos );
dot = vectordot( forward_view_angles, normal ); dot = vectordot( forward_view_angles, normal );
if ( dot <= 0 )
if ( 0 > dot )
{ {
zombies[ i ] riotshield_debug_print( "dot", ( 0, 0, 1 ) ); zombies[i] riotshield_debug_print( "dot", ( 1, 0, 0 ) );
i++;
continue; 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 ) if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
{ {
zombies[ i ] riotshield_debug_print( "cylinder", ( 0, 0, 1 ) ); zombies[i] riotshield_debug_print( "cylinder", ( 1, 0, 0 ) );
i++;
continue; 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 ) ); zombies[i] riotshield_debug_print( "cone", ( 1, 0, 0 ) );
i++;
continue; 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 ]; level.riotshield_fling_enemies[level.riotshield_fling_enemies.size] = zombies[i];
dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared; dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared;
fling_vec = vectornormalize( test_origin - view_pos ); 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 += vectornormalize( test_origin - radial_origin );
}
fling_vec = ( fling_vec[ 0 ], fling_vec[ 1 ], abs( fling_vec[ 2 ] ) ); 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; level.riotshield_fling_vecs[level.riotshield_fling_vecs.size] = fling_vec;
zombies[ i ] riotshield_debug_print( "fling", ( 0, 0, 1 ) ); zombies[i] riotshield_debug_print( "fling", ( 0, 1, 0 ) );
i++;
continue; continue;
} }
else
{ level.riotshield_knockdown_enemies[level.riotshield_knockdown_enemies.size] = zombies[i];
level.riotshield_knockdown_enemies[ level.riotshield_knockdown_enemies.size ] = zombies[ i ]; level.riotshield_knockdown_gib[level.riotshield_knockdown_gib.size] = 0;
level.riotshield_knockdown_gib[ level.riotshield_knockdown_gib.size ] = 0; zombies[i] riotshield_debug_print( "knockdown", ( 1, 1, 0 ) );
zombies[ i ] riotshield_debug_print( "knockdown", ( 0, 0, 1 ) );
}
}
i++;
} }
} }
riotshield_network_choke() riotshield_network_choke()
{ {
level.riotshield_network_choke_count++; 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();
wait_network_frame(); wait_network_frame();
@ -557,57 +544,57 @@ riotshield_network_choke()
riotshield_melee() riotshield_melee()
{ {
if ( !isDefined( level.riotshield_knockdown_enemies ) ) if ( !isdefined( level.riotshield_knockdown_enemies ) )
{ {
level.riotshield_knockdown_enemies = []; level.riotshield_knockdown_enemies = [];
level.riotshield_knockdown_gib = []; level.riotshield_knockdown_gib = [];
level.riotshield_fling_enemies = []; level.riotshield_fling_enemies = [];
level.riotshield_fling_vecs = []; level.riotshield_fling_vecs = [];
} }
self riotshield_get_enemies_in_range(); self riotshield_get_enemies_in_range();
shield_damage = 0; shield_damage = 0;
level.riotshield_network_choke_count = 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(); 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 ); 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" ]; 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(); riotshield_network_choke();
level.riotshield_knockdown_enemies[ i ] thread riotshield_knockdown_zombie( self, level.riotshield_knockdown_gib[ i ] ); level.riotshield_knockdown_enemies[i] thread riotshield_knockdown_zombie( self, level.riotshield_knockdown_gib[i] );
shield_damage += level.zombie_vars[ "riotshield_knockdown_damage_shield" ]; shield_damage += level.zombie_vars["riotshield_knockdown_damage_shield"];
i++;
} }
level.riotshield_knockdown_enemies = []; level.riotshield_knockdown_enemies = [];
level.riotshield_knockdown_gib = []; level.riotshield_knockdown_gib = [];
level.riotshield_fling_enemies = []; level.riotshield_fling_enemies = [];
level.riotshield_fling_vecs = []; level.riotshield_fling_vecs = [];
if ( shield_damage ) if ( shield_damage )
{
self player_damage_shield( shield_damage, 0 ); self player_damage_shield( shield_damage, 0 );
}
} }
trackstuckzombies() trackstuckzombies()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
for (;;)
{ {
self waittill( "deployed_riotshield" ); self waittill( "deployed_riotshield" );
if ( isDefined( self.riotshieldentity ) )
{ if ( isdefined( self.riotshieldentity ) )
self thread watchstuckzombies(); self thread watchstuckzombies();
} }
}
} }
attack_shield( shield ) attack_shield( shield )
@ -617,38 +604,36 @@ attack_shield( shield )
shield.owner endon( "disconnect" ); shield.owner endon( "disconnect" );
shield.owner endon( "start_riotshield_deploy" ); shield.owner endon( "start_riotshield_deploy" );
shield.owner endon( "destroy_riotshield" ); 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; return 0;
}
self.old_origin = self.origin; self.old_origin = self.origin;
if ( getDvar( "zombie_shield_attack_freq" ) == "" )
{ if ( getdvar( _hash_B253DFE7 ) == "" )
setdvar( "zombie_shield_attack_freq", "15" ); setdvar( "zombie_shield_attack_freq", "15" );
}
freq = getDvarInt( "zombie_shield_attack_freq" ); freq = getdvarint( _hash_B253DFE7 );
self.doing_shield_attack = 1; self.doing_shield_attack = 1;
self.enemyoverride[ 0 ] = shield.origin; self.enemyoverride[0] = shield.origin;
self.enemyoverride[ 1 ] = shield; self.enemyoverride[1] = shield;
wait ( randomint( 100 ) / 100 ); wait( randomint( 100 ) / 100.0 );
self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "attack", self.animname ); self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "attack", self.animname );
attackanim = "zm_riotshield_melee"; attackanim = "zm_riotshield_melee";
if ( !self.has_legs ) if ( !self.has_legs )
{
attackanim += "_crawl"; attackanim += "_crawl";
}
self orientmode( "face point", shield.origin ); self orientmode( "face point", shield.origin );
self animscripted( self.origin, flat_angle( vectorToAngle( shield.origin - self.origin ) ), attackanim ); self animscripted( self.origin, flat_angle( vectortoangles( shield.origin - self.origin ) ), attackanim );
if ( isDefined( shield.owner.player_shield_apply_damage ) )
{ if ( isdefined( shield.owner.player_shield_apply_damage ) )
shield.owner [[ shield.owner.player_shield_apply_damage ]]( 100, 0 ); shield.owner [[ shield.owner.player_shield_apply_damage ]]( 100, 0 );
}
else else
{
shield.owner player_damage_shield( 100, 0 ); shield.owner player_damage_shield( 100, 0 );
}
self thread attack_shield_stop( shield ); self thread attack_shield_stop( shield );
wait ( randomint( 100 ) / 100 ); wait( randomint( 100 ) / 100.0 );
self.doing_shield_attack = 0; self.doing_shield_attack = 0;
self orientmode( "face default" ); self orientmode( "face default" );
} }
@ -658,15 +643,18 @@ attack_shield_stop( shield )
self notify( "attack_shield_stop" ); self notify( "attack_shield_stop" );
self endon( "attack_shield_stop" ); self endon( "attack_shield_stop" );
self endon( "death" ); self endon( "death" );
shield waittill( "death" ); shield waittill( "death" );
self stopanimscripted(); 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"; breachanim = "zm_riotshield_breakthrough";
if ( !self.has_legs ) if ( !self.has_legs )
{
breachanim += "_crawl"; breachanim += "_crawl";
}
self animscripted( self.origin, flat_angle( self.angles ), breachanim ); self animscripted( self.origin, flat_angle( self.angles ), breachanim );
} }
} }
@ -674,18 +662,17 @@ attack_shield_stop( shield )
window_notetracks( msg, player ) window_notetracks( msg, player )
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
while ( true )
{ {
self waittill( msg, notetrack ); self waittill( msg, notetrack );
if ( notetrack == "end" ) if ( notetrack == "end" )
{
return; return;
}
if ( notetrack == "fire" ) if ( notetrack == "fire" )
{
player player_damage_shield( 100, 0 ); player player_damage_shield( 100, 0 );
} }
}
} }
watchstuckzombies() watchstuckzombies()
@ -696,31 +683,30 @@ watchstuckzombies()
self endon( "destroy_riotshield" ); self endon( "destroy_riotshield" );
self endon( "deployed_riotshield" ); self endon( "deployed_riotshield" );
level endon( "intermission" ); 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() 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 ) riotshield_debug_print( msg, color )
{ {
/# /#
if ( !getDvarInt( #"BF480CE9" ) ) if ( !getdvarint( _hash_BF480CE9 ) )
{
return; return;
}
if ( !isDefined( color ) ) if ( !isdefined( color ) )
{ color = ( 1, 1, 1 );
color = ( 0, 0, 1 );
} print3d( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), msg, color, 1, 1, 40 );
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
#/ #/
} }
shield_zombie_attract_func( poi ) shield_zombie_attract_func( poi )
{ {
} }
shield_zombie_arrive_func( poi ) shield_zombie_arrive_func( poi )
@ -728,15 +714,16 @@ shield_zombie_arrive_func( poi )
self endon( "death" ); self endon( "death" );
self endon( "zombie_acquire_enemy" ); self endon( "zombie_acquire_enemy" );
self endon( "path_timer_done" ); self endon( "path_timer_done" );
self waittill( "goal" ); self waittill( "goal" );
if ( isDefined( poi.owner ) )
if ( isdefined( poi.owner ) )
{ {
poi.owner player_damage_shield( 100, 0 ); 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 ); poi.owner [[ poi.owner.player_shield_apply_damage ]]( 100, 0 );
} }
}
} }
createriotshieldattractor() createriotshieldattractor()
@ -751,9 +738,10 @@ riotshield_zombie_damage_response( mod, hit_location, hit_origin, player, amount
if ( self is_riotshield_damage( mod, player, amount ) ) if ( self is_riotshield_damage( mod, player, amount ) )
{ {
self riotshield_damage( amount ); self riotshield_damage( amount );
return 1; return true;
} }
return 0;
return false;
} }
watchriotshieldattractor() watchriotshieldattractor()
@ -770,9 +758,11 @@ trackriotshieldattractor()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
for (;;)
{ {
self waittill( "deployed_riotshield" ); self waittill( "deployed_riotshield" );
self thread watchriotshieldattractor(); self thread watchriotshieldattractor();
} }
} }

View File

@ -1,32 +1,33 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zombies/_zm_stats; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_score; #include common_scripts\utility;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_net; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_net;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_weapons;
#include common_scripts/utility; #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", "tomahawk_in_use", 9000, 2, "int" );
registerclientfield( "toplayer", "upgraded_tomahawk_in_use", 9000, 1, "int" ); registerclientfield( "toplayer", "upgraded_tomahawk_in_use", 9000, 1, "int" );
registerclientfield( "scriptmover", "play_tomahawk_fx", 9000, 2, "int" ); registerclientfield( "scriptmover", "play_tomahawk_fx", 9000, 2, "int" );
registerclientfield( "actor", "play_tomahawk_hit_sound", 9000, 1, "int" ); registerclientfield( "actor", "play_tomahawk_hit_sound", 9000, 1, "int" );
onplayerconnect_callback( ::tomahawk_on_player_connect ); 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( "bouncing_tomahawk_zm", 0 );
maps/mp/zombies/_zm_weapons::include_zombie_weapon( "upgraded_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::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( "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::add_zombie_weapon( "upgraded_tomahawk_zm", "zombie_tomahawk_flourish", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
level thread tomahawk_pickup(); level thread tomahawk_pickup();
level.zombie_weapons_no_max_ammo = []; level.zombie_weapons_no_max_ammo = [];
level.zombie_weapons_no_max_ammo[ "bouncing_tomahawk_zm" ] = 1; level.zombie_weapons_no_max_ammo["bouncing_tomahawk_zm"] = 1;
level.zombie_weapons_no_max_ammo[ "upgraded_tomahawk_zm" ] = 1; level.zombie_weapons_no_max_ammo["upgraded_tomahawk_zm"] = 1;
level.a_tomahawk_pickup_funcs = []; 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_tomahawk_weapon = "bouncing_tomahawk_zm";
self.current_tactical_grenade = "bouncing_tomahawk_zm"; self.current_tactical_grenade = "bouncing_tomahawk_zm";
@ -34,143 +35,137 @@ tomahawk_on_player_connect() //checked matches cerberus output
self thread watch_for_tomahawk_charge(); self thread watch_for_tomahawk_charge();
} }
watch_for_tomahawk_throw() //checked changed to match cerberus output watch_for_tomahawk_throw()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
while ( 1 )
while ( true )
{ {
self waittill( "grenade_fire", grenade, weapname ); self waittill( "grenade_fire", grenade, weapname );
if ( !issubstr( weapname, "tomahawk_zm" ) ) if ( !issubstr( weapname, "tomahawk_zm" ) )
{
continue; continue;
}
grenade.use_grenade_special_bookmark = 1; grenade.use_grenade_special_bookmark = 1;
grenade.grenade_multiattack_bookmark_count = 1; grenade.grenade_multiattack_bookmark_count = 1;
grenade.low_level_instant_kill_charge = 1; grenade.low_level_instant_kill_charge = 1;
grenade.owner = self; grenade.owner = self;
self notify( "throwing_tomahawk" ); 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; grenade.n_cookedtime = grenade.birthtime - self.n_tomahawk_cooking_time;
}
else else
{
grenade.n_cookedtime = 0; grenade.n_cookedtime = 0;
}
self thread check_for_time_out( grenade ); self thread check_for_time_out( grenade );
self thread tomahawk_thrown( grenade ); self thread tomahawk_thrown( grenade );
} }
} }
watch_for_tomahawk_charge() //checked changed to match cerberus output watch_for_tomahawk_charge()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
while ( 1 )
while ( true )
{ {
self waittill( "grenade_pullback", weaponname ); self waittill( "grenade_pullback", weaponname );
if ( !issubstr( weaponname, "tomahawk_zm" ) ) if ( !issubstr( weaponname, "tomahawk_zm" ) )
{
continue; continue;
}
self thread watch_for_grenade_cancel(); self thread watch_for_grenade_cancel();
self thread play_charge_fx(); 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" ); self waittill_either( "grenade_fire", "grenade_throw_cancelled" );
wait 0.1; wait 0.1;
self.n_tomahawk_cooking_time = undefined; self.n_tomahawk_cooking_time = undefined;
} }
} }
watch_for_grenade_cancel() //checked matches cerberus output watch_for_grenade_cancel()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "grenade_fire" ); self endon( "grenade_fire" );
waittillframeend; waittillframeend;
weapon = "none"; weapon = "none";
while ( self isthrowinggrenade() && weapon == "none" ) while ( self isthrowinggrenade() && weapon == "none" )
{
self waittill( "weapon_change", weapon ); self waittill( "weapon_change", weapon );
}
self notify( "grenade_throw_cancelled" ); self notify( "grenade_throw_cancelled" );
} }
play_charge_fx() //checked changed to match cerberus output play_charge_fx()
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "grenade_fire" ); self endon( "grenade_fire" );
waittillframeend; waittillframeend;
time_to_pulse = 1000; 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(); self.current_tactical_grenade = self get_player_tactical_grenade();
if ( time >= time_to_pulse ) if ( time >= time_to_pulse )
{ {
if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" ) if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{ playfxontag( level._effect["tomahawk_charge_up_ug"], self, "tag_origin" );
playfxontag( level._effect[ "tomahawk_charge_up_ug" ], self, "tag_origin" );
}
else else
{ playfxontag( level._effect["tomahawk_charge_up"], self, "tag_origin" );
playfxontag( level._effect[ "tomahawk_charge_up" ], self, "tag_origin" );
}
time_to_pulse += 1000; time_to_pulse += 1000;
self playrumbleonentity( "reload_small" ); self playrumbleonentity( "reload_small" );
} }
if ( time_to_pulse > 2400 && self.current_tactical_grenade != "upgraded_tomahawk_zm" ) if ( time_to_pulse > 2400 && self.current_tactical_grenade != "upgraded_tomahawk_zm" )
{ break;
return;
}
if ( time_to_pulse >= 3400 ) if ( time_to_pulse >= 3400 )
{ break;
return;
}
wait 0.05; wait 0.05;
} }
} }
get_grenade_charge_power( player ) //checked changed to match cerberus output get_grenade_charge_power( player )
{ {
player endon( "disconnect" ); player endon( "disconnect" );
if ( self.n_cookedtime > 1000 && self.n_cookedtime < 2000 ) if ( self.n_cookedtime > 1000 && self.n_cookedtime < 2000 )
{ {
if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" ) if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{
return 4.5; return 4.5;
}
return 1.5; return 1.5;
} }
else if ( self.n_cookedtime > 2000 && self.n_cookedtime < 3000 ) else if ( self.n_cookedtime > 2000 && self.n_cookedtime < 3000 )
{ {
if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" ) if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{
return 6; return 6;
}
return 2; return 2;
} }
else if ( self.n_cookedtime >= 3000 && player.current_tomahawk_weapon != "upgraded_tomahawk_zm" ) else if ( self.n_cookedtime >= 3000 && player.current_tomahawk_weapon != "upgraded_tomahawk_zm" )
{
return 2; return 2;
}
else if ( self.n_cookedtime >= 3000 ) else if ( self.n_cookedtime >= 3000 )
{
return 3; return 3;
}
return 1; return 1;
} }
tomahawk_thrown( grenade ) //checked changed to match cerberus output tomahawk_thrown( grenade )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
grenade endon( "in_hellhole" ); grenade endon( "in_hellhole" );
grenade_owner = undefined; grenade_owner = undefined;
if ( isDefined( grenade.owner ) )
{ if ( isdefined( grenade.owner ) )
grenade_owner = grenade.owner; grenade_owner = grenade.owner;
}
playfxontag( level._effect[ "tomahawk_charged_trail" ], grenade, "tag_origin" ); playfxontag( level._effect["tomahawk_charged_trail"], grenade, "tag_origin" );
self setclientfieldtoplayer( "tomahawk_in_use", 2 ); self setclientfieldtoplayer( "tomahawk_in_use", 2 );
grenade waittill_either( "death", "time_out" ); grenade waittill_either( "death", "time_out" );
grenade_origin = grenade.origin; grenade_origin = grenade.origin;
@ -178,50 +173,56 @@ tomahawk_thrown( grenade ) //checked changed to match cerberus output
n_grenade_charge_power = grenade get_grenade_charge_power( self ); n_grenade_charge_power = grenade get_grenade_charge_power( self );
a_zombies = get_array_of_closest( grenade_origin, a_zombies, undefined, undefined, 200 ); 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 ); 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 ) foreach ( tomahawk_func in level.a_tomahawk_pickup_funcs )
{ {
if ( [[ tomahawk_func ]]( grenade, n_grenade_charge_power ) ) if ( [[ tomahawk_func ]]( grenade, n_grenade_charge_power ) )
{
return; 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 = tomahawk_spawn( grenade_origin, n_grenade_charge_power );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power; m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
foreach ( powerup in a_powerups ) foreach ( powerup in a_powerups )
{ {
powerup.origin = grenade_origin; powerup.origin = grenade_origin;
powerup linkto( m_tomahawk ); powerup linkto( m_tomahawk );
m_tomahawk.a_has_powerup = a_powerups; m_tomahawk.a_has_powerup = a_powerups;
} }
self thread tomahawk_return_player( m_tomahawk, 0 ); self thread tomahawk_return_player( m_tomahawk, 0 );
return; return;
} }
if ( !isDefined( a_zombies ) )
if ( !isdefined( a_zombies ) )
{ {
m_tomahawk = tomahawk_spawn( grenade_origin, n_grenade_charge_power ); m_tomahawk = tomahawk_spawn( grenade_origin, n_grenade_charge_power );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power; m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
self thread tomahawk_return_player( m_tomahawk, 0 ); self thread tomahawk_return_player( m_tomahawk, 0 );
return; return;
} }
foreach ( ai_zombie in a_zombies ) else
{ {
foreach ( ai_zombie in a_zombies )
ai_zombie.hit_by_tomahawk = 0; 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; v_zombiepos = a_zombies[0].origin;
if ( distancesquared( grenade_origin, v_zombiepos ) <= 4900 ) if ( distancesquared( grenade_origin, v_zombiepos ) <= 4900 )
{ {
a_zombies[ 0 ] setclientfield( "play_tomahawk_hit_sound", 1 ); a_zombies[0] setclientfield( "play_tomahawk_hit_sound", 1 );
n_tomahawk_damage = calculate_tomahawk_damage( a_zombies[ 0 ], n_grenade_charge_power, grenade ); 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] dodamage( n_tomahawk_damage, grenade_origin, self, grenade, "none", "MOD_GRENADE", 0, "bouncing_tomahawk_zm" );
a_zombies[ 0 ].hit_by_tomahawk = 1; 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 ); self thread tomahawk_ricochet_attack( grenade_origin, n_grenade_charge_power );
} }
else 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 = tomahawk_spawn( grenade_origin, n_grenade_charge_power );
m_tomahawk.n_grenade_charge_power = n_grenade_charge_power; m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
if ( isDefined( grenade ) )
{ if ( isdefined( grenade ) )
grenade delete(); grenade delete();
}
self thread tomahawk_return_player( m_tomahawk, 0 ); 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" ); self endon( "disconnect" );
grenade endon( "death" ); grenade endon( "death" );
@ -251,107 +252,111 @@ check_for_time_out( grenade ) //checked matches cerberus output
grenade notify( "time_out" ); 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" ); self endon( "disconnect" );
a_zombies = getaispeciesarray( "axis", "all" ); a_zombies = getaispeciesarray( "axis", "all" );
a_zombies = get_array_of_closest( grenade_origin, a_zombies, undefined, undefined, 300 ); a_zombies = get_array_of_closest( grenade_origin, a_zombies, undefined, undefined, 300 );
a_zombies = array_reverse( a_zombies ); 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 = tomahawk_spawn( grenade_origin, tomahawk_charge_power );
m_tomahawk.n_grenade_charge_power = tomahawk_charge_power; m_tomahawk.n_grenade_charge_power = tomahawk_charge_power;
self thread tomahawk_return_player( m_tomahawk, 0 ); self thread tomahawk_return_player( m_tomahawk, 0 );
return; return;
} }
m_tomahawk = tomahawk_spawn( grenade_origin, tomahawk_charge_power ); m_tomahawk = tomahawk_spawn( grenade_origin, tomahawk_charge_power );
m_tomahawk.n_grenade_charge_power = tomahawk_charge_power; m_tomahawk.n_grenade_charge_power = tomahawk_charge_power;
self thread tomahawk_attack_zombies( m_tomahawk, a_zombies ); 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" ); self endon( "disconnect" );
if ( !isDefined( a_zombies ) )
if ( !isdefined( a_zombies ) )
{ {
self thread tomahawk_return_player( m_tomahawk, 0 ); self thread tomahawk_return_player( m_tomahawk, 0 );
return; return;
} }
if ( a_zombies.size <= 4 ) if ( a_zombies.size <= 4 )
{
n_attack_limit = a_zombies.size; n_attack_limit = a_zombies.size;
}
else else
{
n_attack_limit = 4; n_attack_limit = 4;
}
for ( i = 0; i < n_attack_limit; i++ ) 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"; tag = "J_Head";
if ( a_zombies[ i ].isdog )
{ if ( a_zombies[i].isdog )
tag = "J_Spine1"; 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 ); v_target = a_zombies[i] gettagorigin( tag );
m_tomahawk moveto( v_target, 0.3 ); m_tomahawk moveto( v_target, 0.3 );
m_tomahawk waittill( "movedone" ); 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" ) if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{ playfxontag( level._effect["tomahawk_impact_ug"], a_zombies[i], tag );
playfxontag( level._effect[ "tomahawk_impact_ug" ], a_zombies[ i ], tag );
}
else else
{ playfxontag( level._effect["tomahawk_impact"], a_zombies[i], tag );
playfxontag( level._effect[ "tomahawk_impact" ], a_zombies[ i ], tag );
} playfxontag( level._effect["tomahawk_fire_dot"], a_zombies[i], "j_spineupper" );
playfxontag( level._effect[ "tomahawk_fire_dot" ], a_zombies[ i ], "j_spineupper" ); a_zombies[i] setclientfield( "play_tomahawk_hit_sound", 1 );
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 );
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 ] dodamage( n_tomahawk_damage, m_tomahawk.origin, self, m_tomahawk, "none", "MOD_GRENADE", 0, "bouncing_tomahawk_zm" ); a_zombies[i].hit_by_tomahawk = 1;
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; wait 0.2;
} }
self thread tomahawk_return_player( m_tomahawk, n_attack_limit ); 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" ); self endon( "disconnect" );
n_dist = distance2dsquared( m_tomahawk.origin, self.origin ); n_dist = distance2dsquared( m_tomahawk.origin, self.origin );
if ( !isDefined( num_zombie_hit ) )
{ if ( !isdefined( num_zombie_hit ) )
num_zombie_hit = 5; num_zombie_hit = 5;
}
while ( n_dist > 4096 ) while ( n_dist > 4096 )
{ {
m_tomahawk moveto( self geteye(), 0.25 ); m_tomahawk moveto( self geteye(), 0.25 );
if ( num_zombie_hit < 5 ) if ( num_zombie_hit < 5 )
{ {
self tomahawk_check_for_zombie( m_tomahawk ); self tomahawk_check_for_zombie( m_tomahawk );
num_zombie_hit++; num_zombie_hit++;
} }
wait 0.1; wait 0.1;
n_dist = distance2dsquared( m_tomahawk.origin, self geteye() ); 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 ) foreach ( powerup in m_tomahawk.a_has_powerup )
{ {
if ( isDefined( powerup ) ) if ( isdefined( powerup ) )
{
powerup.origin = self.origin; powerup.origin = self.origin;
} }
} }
}
m_tomahawk delete(); m_tomahawk delete();
self playsoundtoplayer( "wpn_tomahawk_catch_plr", self ); self playsoundtoplayer( "wpn_tomahawk_catch_plr", self );
self playsound( "wpn_tomahawk_catch_npc" ); 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 playsoundtoplayer( "wpn_tomahawk_cooldown_done", self );
self givemaxammo( self.current_tomahawk_weapon ); self givemaxammo( self.current_tomahawk_weapon );
a_zombies = getaispeciesarray( "axis", "all" ); a_zombies = getaispeciesarray( "axis", "all" );
foreach ( ai_zombie in a_zombies ) foreach ( ai_zombie in a_zombies )
{
ai_zombie.hit_by_tomahawk = 0; ai_zombie.hit_by_tomahawk = 0;
}
self setclientfieldtoplayer( "tomahawk_in_use", 3 ); self setclientfieldtoplayer( "tomahawk_in_use", 3 );
} }
tomahawk_check_for_zombie( grenade ) //checked matches cerberus output tomahawk_check_for_zombie( grenade )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
grenade endon( "death" ); grenade endon( "death" );
a_zombies = getaispeciesarray( "axis", "all" ); a_zombies = getaispeciesarray( "axis", "all" );
a_zombies = get_array_of_closest( grenade.origin, a_zombies, undefined, undefined, 100 ); 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] ) && 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].hit_by_tomahawk ) && !a_zombies[0].hit_by_tomahawk )
{ self tomahawk_hit_zombie( a_zombies[0], grenade );
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" ); self endon( "disconnect" );
if ( isDefined( ai_zombie ) && isalive( ai_zombie ) )
if ( isdefined( ai_zombie ) && isalive( ai_zombie ) )
{ {
tag = "J_Head"; tag = "J_Head";
if ( ai_zombie.isdog ) if ( ai_zombie.isdog )
{
tag = "J_Spine1"; tag = "J_Spine1";
}
v_target = ai_zombie gettagorigin( tag ); v_target = ai_zombie gettagorigin( tag );
grenade moveto( v_target, 0.3 ); grenade moveto( v_target, 0.3 );
grenade waittill( "movedone" ); 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" ) if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{ playfxontag( level._effect["tomahawk_impact_ug"], ai_zombie, tag );
playfxontag( level._effect[ "tomahawk_impact_ug" ], ai_zombie, tag );
}
else else
{ playfxontag( level._effect["tomahawk_impact"], ai_zombie, tag );
playfxontag( level._effect[ "tomahawk_impact" ], ai_zombie, tag );
}
ai_zombie setclientfield( "play_tomahawk_hit_sound", 1 ); ai_zombie setclientfield( "play_tomahawk_hit_sound", 1 );
n_tomahawk_damage = calculate_tomahawk_damage( ai_zombie, grenade.n_grenade_charge_power, grenade ); 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 dodamage( n_tomahawk_damage, grenade.origin, self, grenade, "none", "MOD_GRENADE", 0, "bouncing_tomahawk_zm" );
ai_zombie.hit_by_tomahawk = 1; 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 = spawn( "script_model", grenade_origin );
m_tomahawk setmodel( "t6_wpn_zmb_tomahawk_world" ); m_tomahawk setmodel( "t6_wpn_zmb_tomahawk_world" );
m_tomahawk thread tomahawk_spin(); m_tomahawk thread tomahawk_spin();
m_tomahawk playloopsound( "wpn_tomahawk_flying_loop" ); m_tomahawk playloopsound( "wpn_tomahawk_flying_loop" );
if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" ) if ( self.current_tactical_grenade == "upgraded_tomahawk_zm" )
{ playfxontag( level._effect["tomahawk_trail_ug"], m_tomahawk, "tag_origin" );
playfxontag( level._effect[ "tomahawk_trail_ug" ], m_tomahawk, "tag_origin" );
}
else else
{ playfxontag( level._effect["tomahawk_trail"], m_tomahawk, "tag_origin" );
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" );
{
playfxontag( level._effect[ "tomahawk_charged_trail" ], m_tomahawk, "tag_origin" );
}
m_tomahawk.low_level_instant_kill_charge = 1; m_tomahawk.low_level_instant_kill_charge = 1;
return m_tomahawk; return m_tomahawk;
} }
tomahawk_spin() //checked matches cerberus output tomahawk_spin()
{ {
self endon( "death" ); self endon( "death" );
while ( isDefined( self ) )
while ( isdefined( self ) )
{ {
self rotatepitch( 90, 0.2 ); self rotatepitch( 90, 0.2 );
wait 0.15; wait 0.15;
} }
} }
tomahawk_pickup() //checked matches cerberus output tomahawk_pickup()
{ {
flag_wait( "soul_catchers_charged" ); flag_wait( "soul_catchers_charged" );
flag_init( "tomahawk_pickup_complete" ); flag_init( "tomahawk_pickup_complete" );
@ -472,102 +474,102 @@ tomahawk_pickup() //checked matches cerberus output
trigger_upgraded.script_noteworthy = "redeemer_pickup_trigger"; trigger_upgraded.script_noteworthy = "redeemer_pickup_trigger";
trigger_upgraded sethintstring( &"ZM_PRISON_TOMAHAWK_UPGRADED_PICKUP" ); trigger_upgraded sethintstring( &"ZM_PRISON_TOMAHAWK_UPGRADED_PICKUP" );
trigger_upgraded setcursorhint( "HINT_NOICON" ); trigger_upgraded setcursorhint( "HINT_NOICON" );
/*
/# /#
iprintlnbold( "GO FIND THE TOMAHAWK" ); iprintlnbold( "GO FIND THE TOMAHAWK" );
#/ #/
*/
trigger thread tomahawk_pickup_trigger(); trigger thread tomahawk_pickup_trigger();
trigger_upgraded thread tomahawk_pickup_trigger(); trigger_upgraded thread tomahawk_pickup_trigger();
flag_set( "tomahawk_pickup_complete" ); 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 ); 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 ); player takeweapon( player.current_tactical_grenade );
}
if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" ) if ( player.current_tomahawk_weapon == "upgraded_tomahawk_zm" )
{ {
if ( !is_true( player.afterlife ) ) if ( !is_true( player.afterlife ) )
{
continue; continue;
}
else else
{ {
player disable_player_move_states( 1 ); player disable_player_move_states( 1 );
gun = player getcurrentweapon(); gun = player getcurrentweapon();
level notify( "bouncing_tomahawk_zm_aquired" ); 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 giveweapon( "zombie_tomahawk_flourish" );
player thread tomahawk_update_hud_on_last_stand(); player thread tomahawk_update_hud_on_last_stand();
player switchtoweapon( "zombie_tomahawk_flourish" ); player switchtoweapon( "zombie_tomahawk_flourish" );
player waittill_any( "player_downed", "weapon_change_complete" ); player waittill_any( "player_downed", "weapon_change_complete" );
if ( self.script_noteworthy == "redeemer_pickup_trigger" ) if ( self.script_noteworthy == "redeemer_pickup_trigger" )
{ {
player.redeemer_trigger = self; player.redeemer_trigger = self;
player setclientfieldtoplayer( "upgraded_tomahawk_in_use", 1 ); player setclientfieldtoplayer( "upgraded_tomahawk_in_use", 1 );
} }
player switchtoweapon( gun ); player switchtoweapon( gun );
player enable_player_move_states(); player enable_player_move_states();
player.loadout.hastomahawk = 1; player.loadout.hastomahawk = 1;
continue; continue;
} }
} }
if ( !player hasweapon( "bouncing_tomahawk_zm" ) && !player hasweapon( "upgraded_tomahawk_zm" ) ) if ( !player hasweapon( "bouncing_tomahawk_zm" ) && !player hasweapon( "upgraded_tomahawk_zm" ) )
{ {
player disable_player_move_states( 1 ); player disable_player_move_states( 1 );
if ( !is_true( player.afterlife ) ) if ( !is_true( player.afterlife ) )
{ {
player giveweapon( player.current_tomahawk_weapon ); player giveweapon( player.current_tomahawk_weapon );
player thread tomahawk_update_hud_on_last_stand(); player thread tomahawk_update_hud_on_last_stand();
player thread tomahawk_tutorial_hint(); player thread tomahawk_tutorial_hint();
player set_player_tactical_grenade( player.current_tomahawk_weapon ); player set_player_tactical_grenade( player.current_tomahawk_weapon );
if ( self.script_noteworthy == "retriever_pickup_trigger" ) if ( self.script_noteworthy == "retriever_pickup_trigger" )
{
player.retriever_trigger = self; player.retriever_trigger = self;
}
player notify( "tomahawk_picked_up" ); player notify( "tomahawk_picked_up" );
player setclientfieldtoplayer( "tomahawk_in_use", 1 ); player setclientfieldtoplayer( "tomahawk_in_use", 1 );
gun = player getcurrentweapon(); gun = player getcurrentweapon();
level notify( "bouncing_tomahawk_zm_aquired" ); level notify( "bouncing_tomahawk_zm_aquired" );
player notify( "player_obtained_tomahawk" ); 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 giveweapon( "zombie_tomahawk_flourish" );
player switchtoweapon( "zombie_tomahawk_flourish" ); player switchtoweapon( "zombie_tomahawk_flourish" );
player waittill_any( "player_downed", "weapon_change_complete" ); player waittill_any( "player_downed", "weapon_change_complete" );
if ( self.script_noteworthy == "redeemer_pickup_trigger" ) if ( self.script_noteworthy == "redeemer_pickup_trigger" )
{
player setclientfieldtoplayer( "upgraded_tomahawk_in_use", 1 ); player setclientfieldtoplayer( "upgraded_tomahawk_in_use", 1 );
}
player switchtoweapon( gun ); player switchtoweapon( gun );
} }
player enable_player_move_states(); player enable_player_move_states();
wait 0.1; wait 0.1;
} }
} }
} }
tomahawk_pickup_spin() //checked matches cerberus output tomahawk_pickup_spin()
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
while ( true )
{ {
self rotateyaw( 90, 1 ); self rotateyaw( 90, 1 );
wait 0.15; 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 ) if ( n_tomahawk_power > 2 )
{
return n_target_zombie.health + 1; return n_target_zombie.health + 1;
}
else if ( level.round_number >= 10 && level.round_number < 13 && tomahawk.low_level_instant_kill_charge <= 3 ) else if ( level.round_number >= 10 && level.round_number < 13 && tomahawk.low_level_instant_kill_charge <= 3 )
{ {
tomahawk.low_level_instant_kill_charge += 1; 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; return n_target_zombie.health + 1;
} }
else else
{
return 1000 * n_tomahawk_power; return 1000 * n_tomahawk_power;
}
} }
setting_tutorial_hud() //checked matches cerberus output setting_tutorial_hud()
{ {
client_hint = newclienthudelem( self ); client_hint = newclienthudelem( self );
client_hint.alignx = "center"; client_hint.alignx = "center";
@ -600,7 +600,7 @@ setting_tutorial_hud() //checked matches cerberus output
return client_hint; return client_hint;
} }
tomahawk_tutorial_hint() //checked matches cerberus output tomahawk_tutorial_hint()
{ {
hud = setting_tutorial_hud(); hud = setting_tutorial_hud();
hud settext( &"ZM_PRISON_TOMAHAWK_TUTORIAL" ); hud settext( &"ZM_PRISON_TOMAHAWK_TUTORIAL" );
@ -609,16 +609,19 @@ tomahawk_tutorial_hint() //checked matches cerberus output
hud destroy(); hud destroy();
} }
tomahawk_update_hud_on_last_stand() //checked matches cerberus output tomahawk_update_hud_on_last_stand()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "bled_out" ); self endon( "bled_out" );
self endon( "tomahawk_upgraded_swap" ); self endon( "tomahawk_upgraded_swap" );
while ( 1 )
while ( true )
{ {
self waittill_either( "entering_last_stand", "fake_death" ); self waittill_either( "entering_last_stand", "fake_death" );
self setclientfieldtoplayer( "tomahawk_in_use", 0 ); self setclientfieldtoplayer( "tomahawk_in_use", 0 );
self waittill( "player_revived" ); self waittill( "player_revived" );
if ( isalive( self ) ) if ( isalive( self ) )
{ {
wait 0.1; 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; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_utility; // Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts/utility; #include maps\mp\_utility;
#include maps/mp/_utility; #include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_globallogic_score;
init() init()
{ {
@ -18,13 +20,13 @@ achievement_sound_func( achievement_name_lower )
init_player_achievement_stats() 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_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_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_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_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_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_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_shafted", 0 );
} }
onplayerconnect() onplayerconnect()
@ -39,6 +41,7 @@ onplayerconnect()
achievement_highrise_sidequest() achievement_highrise_sidequest()
{ {
level endon( "end_game" ); level endon( "end_game" );
level waittill( "highrise_sidequest_achieved" ); level waittill( "highrise_sidequest_achieved" );
/# /#
iprintlnbold( "ZM_DLC1_HIGHRISE_SIDEQUEST achieved for the team" ); iprintlnbold( "ZM_DLC1_HIGHRISE_SIDEQUEST achieved for the team" );
@ -52,12 +55,15 @@ achievement_vertigoner()
self endon( "disconnect" ); self endon( "disconnect" );
self.num_zombies_flung = 0; self.num_zombies_flung = 0;
max_zombies_flung = 10; max_zombies_flung = 10;
while ( self.num_zombies_flung < max_zombies_flung ) while ( self.num_zombies_flung < max_zombies_flung )
{ {
self waittill( "zombie_flung" ); self waittill( "zombie_flung" );
wait 0,1;
wait 0.1;
} }
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC1_VERTIGONER" ); self giveachievement_wrapper( "ZM_DLC1_VERTIGONER" );
} }
@ -68,12 +74,15 @@ achievement_slippery_when_undead()
self endon( "disconnect" ); self endon( "disconnect" );
self.num_sliquifier_kills = 0; self.num_sliquifier_kills = 0;
max_kills_with_one_shot = 5; max_kills_with_one_shot = 5;
while ( self.num_sliquifier_kills < max_kills_with_one_shot ) while ( self.num_sliquifier_kills < max_kills_with_one_shot )
{ {
self waittill( "sliquifier_kill" ); self waittill( "sliquifier_kill" );
wait 0,01;
wait 0.01;
} }
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC1_SLIPPERY_WHEN_UNDEAD" ); self giveachievement_wrapper( "ZM_DLC1_SLIPPERY_WHEN_UNDEAD" );
} }
@ -86,29 +95,28 @@ achievement_facing_the_dragon()
v_dragon_position = ( 971, 43, 3800 ); v_dragon_position = ( 971, 43, 3800 );
is_touching_distance = 350; is_touching_distance = 350;
round_number_max = 2; round_number_max = 2;
while ( 1 )
while ( true )
{ {
if ( level.round_number >= round_number_max ) if ( level.round_number >= round_number_max )
{
return; return;
}
dist = distance( self.origin, v_achievement_location ); dist = distance( self.origin, v_achievement_location );
if ( dist <= is_touching_distance ) if ( dist <= is_touching_distance )
{ {
v_dir = vectornormalize( v_dragon_position - self.origin ); v_dir = vectornormalize( v_dragon_position - self.origin );
v_forward = self getweaponforwarddir(); v_forward = self getweaponforwarddir();
dp = vectordot( v_dir, v_forward ); dp = vectordot( v_dir, v_forward );
if ( dp > 0,95 )
{ if ( dp > 0.95 )
break; break;
} }
}
else wait 0.01;
{
wait 0,01;
}
} }
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC1_FACING_THE_DRAGON" ); self giveachievement_wrapper( "ZM_DLC1_FACING_THE_DRAGON" );
} }
@ -117,8 +125,10 @@ achievement_im_my_own_best_friend()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "whos_who_self_revive" ); self waittill( "whos_who_self_revive" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC1_IM_MY_OWN_BEST_FRIEND" ); self giveachievement_wrapper( "ZM_DLC1_IM_MY_OWN_BEST_FRIEND" );
} }
@ -127,15 +137,16 @@ achievement_mad_without_power()
{ {
level endon( "end_game" ); level endon( "end_game" );
round_number_max = 10; round_number_max = 10;
while ( level.round_number < round_number_max ) while ( level.round_number < round_number_max )
{ {
level waittill( "start_of_round" ); level waittill( "start_of_round" );
if ( flag( "power_on" ) ) if ( flag( "power_on" ) )
{
return; return;
} }
}
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC1_MAD_WITHOUT_POWER", 1 ); self giveachievement_wrapper( "ZM_DLC1_MAD_WITHOUT_POWER", 1 );
} }
@ -146,48 +157,42 @@ achievement_shafted()
self endon( "disconnect" ); self endon( "disconnect" );
level.perk_bought_func = ::player_buys_perk_machine; level.perk_bought_func = ::player_buys_perk_machine;
max_unique_perk_machines = 6; max_unique_perk_machines = 6;
while ( 1 )
while ( true )
{ {
self waittill_any( "player_buys_perk", "pap_used" ); self waittill_any( "player_buys_perk", "pap_used" );
if ( isDefined( self.pap_used ) && self.pap_used == 1 )
{ 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.perk_machines_bought ) && self.perk_machines_bought.size >= max_unique_perk_machines )
break; break;
} }
} }
else
{
}
}
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC1_SHAFTED" ); self giveachievement_wrapper( "ZM_DLC1_SHAFTED" );
} }
player_buys_perk_machine( perk ) player_buys_perk_machine( perk )
{ {
if ( !isDefined( self.perk_machines_bought ) ) if ( !isdefined( self.perk_machines_bought ) )
{
self.perk_machines_bought = []; self.perk_machines_bought = [];
}
found = 0; 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 ] ) if ( perk == self.perk_machines_bought[i] )
{ {
found = 1; found = 1;
break; break;
} }
else
{
i++;
}
} }
if ( !found ) if ( !found )
{ {
self.perk_machines_bought[ self.perk_machines_bought.size ] = perk; self.perk_machines_bought[self.perk_machines_bought.size] = perk;
self notify( "player_buys_perk" ); self notify( "player_buys_perk" );
} }
} }

View File

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

View File

@ -1,11 +1,13 @@
#include maps/mp/zombies/_zm_unitrigger; // T6 GSC SOURCE
#include maps/mp/zm_highrise_elevators; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_buildables; #include common_scripts\utility;
#include maps/mp/zm_transit_utility; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_weapons;
#include maps/mp/_utility; #include maps\mp\zm_transit_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_buildables;
#include maps\mp\zm_highrise_elevators;
#include maps\mp\zombies\_zm_unitrigger;
init_buildables() init_buildables()
{ {
@ -45,7 +47,7 @@ include_buildables()
slipgun.triggerthink = ::slipgunbuildable; slipgun.triggerthink = ::slipgunbuildable;
slipgun.onuseplantobject = ::onuseplantobject_slipgun; slipgun.onuseplantobject = ::onuseplantobject_slipgun;
include_buildable( 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.onspawn = ::onspawn_keys;
key_chain manage_multiple_pieces( 4 ); key_chain manage_multiple_pieces( 4 );
key = spawnstruct(); key = spawnstruct();
@ -53,19 +55,20 @@ include_buildables()
key add_buildable_piece( key_chain ); key add_buildable_piece( key_chain );
key.triggerthink = ::keysbuildable; key.triggerthink = ::keysbuildable;
key.onuseplantobject = ::onuseplantobject_escapepodkey; key.onuseplantobject = ::onuseplantobject_escapepodkey;
key.buildablepieces[ 0 ].onspawn = ::onspawn_keys; key.buildablepieces[0].onspawn = ::onspawn_keys;
include_buildable( key ); include_buildable( key );
ekey = spawnstruct(); ekey = spawnstruct();
ekey.name = "ekeys_zm"; ekey.name = "ekeys_zm";
ekey add_buildable_piece( key_chain ); ekey add_buildable_piece( key_chain );
ekey.triggerthink = ::ekeysbuildable; ekey.triggerthink = ::ekeysbuildable;
ekey.onuseplantobject = ::onuseplantobject_elevatorkey; ekey.onuseplantobject = ::onuseplantobject_elevatorkey;
ekey.buildablepieces[ 0 ].onspawn = ::onspawn_keys; ekey.buildablepieces[0].onspawn = ::onspawn_keys;
include_buildable( ekey ); 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_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_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 ); 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(); sqcommon = spawnstruct();
@ -76,46 +79,41 @@ include_buildables()
sqcommon add_buildable_piece( sq_common_transceiver ); sqcommon add_buildable_piece( sq_common_transceiver );
sqcommon.triggerthink = ::sqcommonbuildable; sqcommon.triggerthink = ::sqcommonbuildable;
include_buildable( sqcommon ); 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() 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() slipgunbuildable()
{ {
level thread wait_for_slipgun(); 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; persist = 2;
}
else else
{
persist = 1; 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() 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; pod_key.prompt_and_visibility_func = ::escape_pod_key_prompt;
} }
ekeysbuildable() ekeysbuildable()
{ {
elevator_keys = maps/mp/zombies/_zm_buildables::buildable_trigger_think_array( "elevator_key_console_trigger", "ekeys_zm", "keys_zm", "", 1, 3 ); 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 ); foreach ( stub in elevator_keys )
while ( isDefined( _k143 ) )
{ {
stub = _a143[ _k143 ];
stub.prompt_and_visibility_func = ::elevator_key_prompt; stub.prompt_and_visibility_func = ::elevator_key_prompt;
stub.buildablezone.stat_name = "keys_zm"; stub.buildablezone.stat_name = "keys_zm";
_k143 = getNextArrayKey( _a143, _k143 );
} }
} }
@ -140,33 +138,33 @@ onpickup_common( player )
sqcommonbuildable() 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 ) onbuyweapon_slipgun( player )
{ {
player givestartammo( self.stub.weaponname ); player givestartammo( self.stub.weaponname );
player switchtoweapon( self.stub.weaponname ); player switchtoweapon( self.stub.weaponname );
level notify( "slipgun_bought" ); level notify( "slipgun_bought", player );
} }
wait_for_slipgun() wait_for_slipgun()
{ {
level.zombie_include_weapons[ "slipgun_zm" ] = 0; 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 waittill( "slipgun_bought", player );
level.zombie_include_weapons[ "slipgun_zm" ] = 1;
level.zombie_weapons[ "slipgun_zm" ].is_in_box = 1; level.zombie_include_weapons["slipgun_zm"] = 1;
level.zombie_weapons["slipgun_zm"].is_in_box = 1;
} }
} }
keyscreateglint() keyscreateglint()
{ {
if ( !isDefined( self.model.glint_fx ) ) if ( !isdefined( self.model.glint_fx ) )
{ playfxontag( level._effect["elevator_glint"], self.model, "tag_origin" );
playfxontag( level._effect[ "elevator_glint" ], self.model, "tag_origin" );
}
} }
onspawn_keys() onspawn_keys()
@ -181,6 +179,7 @@ ondrop_keys( player )
onpickup_keys( player ) onpickup_keys( player )
{ {
} }
escape_pod_key_prompt( player ) escape_pod_key_prompt( player )
@ -191,6 +190,7 @@ escape_pod_key_prompt( player )
self sethintstring( self.stub.hint_string ); self sethintstring( self.stub.hint_string );
return 0; return 0;
} }
return self buildabletrigger_update_prompt( player ); return self buildabletrigger_update_prompt( player );
} }
@ -204,14 +204,16 @@ watch_elevator_prompt( player, trig )
player notify( "watch_elevator_prompt" ); player notify( "watch_elevator_prompt" );
player endon( "watch_elevator_prompt" ); player endon( "watch_elevator_prompt" );
trig endon( "kill_trigger" ); trig endon( "kill_trigger" );
while ( 1 )
while ( true )
{ {
trig.stub.elevator waittill( "floor_changed" ); 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; return;
} }
} }
@ -220,73 +222,73 @@ watch_elevator_prompt( player, trig )
elevator_key_prompt( player ) elevator_key_prompt( player )
{ {
if ( !isDefined( self.stub.elevator ) ) if ( !isdefined( self.stub.elevator ) )
{ {
elevatorname = self.stub.script_noteworthy; 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 ]; elevator = level.elevators[elevatorname];
floor = int( self.stub.script_parameters ); 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.elevator = elevator;
self.stub.floor = flevel; self.stub.floor = flevel;
} }
} }
/# /#
if ( !isDefined( self.stub.elevator ) ) if ( !isdefined( self.stub.elevator ) )
{
if ( isDefined( self.stub.script_noteworthy ) )
{ {
if ( isdefined( self.stub.script_noteworthy ) )
error( "Cannot locate elevator " + self.stub.script_noteworthy ); error( "Cannot locate elevator " + self.stub.script_noteworthy );
}
else else
{
error( "Cannot locate elevator " ); error( "Cannot locate elevator " );
} }
}
else else
{ {
color = vectorScale( ( 0, 0, 1 ), 0,7 ); color = vectorscale( ( 0, 0, 1 ), 0.7 );
stop = self.stub.floor; stop = self.stub.floor;
floor = self.stub.elevator.floors[ "" + stop ].script_location; floor = self.stub.elevator.floors["" + stop].script_location;
text = "call " + self.stub.script_noteworthy + " to stop " + stop + " floor " + floor + ""; text = "call " + self.stub.script_noteworthy + " to stop " + stop + " floor " + floor + "";
if ( getDvarInt( #"B67910B4" ) )
{ if ( getdvarint( _hash_B67910B4 ) )
print3d( self.stub.origin, text, color, 1, 0,5, 300 ); 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.stub.hint_string = "";
self sethintstring( self.stub.hint_string ); self sethintstring( self.stub.hint_string );
return 0; return 0;
} }
} }
if ( !flag( "power_on" ) ) if ( !flag( "power_on" ) )
{ {
self.stub.hint_string = ""; self.stub.hint_string = "";
self sethintstring( self.stub.hint_string ); self sethintstring( self.stub.hint_string );
return 0; return 0;
} }
can_use = self buildabletrigger_update_prompt( player ); can_use = self buildabletrigger_update_prompt( player );
if ( can_use ) if ( can_use )
{
thread watch_elevator_prompt( player, self ); thread watch_elevator_prompt( player, self );
}
return can_use; return can_use;
} }
onuseplantobject_elevatorkey( player ) onuseplantobject_elevatorkey( player )
{ {
elevatorname = self.script_noteworthy; elevatorname = self.script_noteworthy;
if ( isDefined( elevatorname ) && isDefined( self.script_parameters ) )
if ( isdefined( elevatorname ) && isdefined( self.script_parameters ) )
{ {
floor = int( self.script_parameters ); floor = int( self.script_parameters );
elevator = level.elevators[ elevatorname ]; elevator = level.elevators[elevatorname];
if ( isDefined( elevator ) )
if ( isdefined( elevator ) )
{ {
elevator.body.force_starting_floor = floor; elevator.body.force_starting_floor = floor;
elevator.body notify( "forcego" ); elevator.body notify( "forcego" );
@ -296,32 +298,28 @@ onuseplantobject_elevatorkey( player )
droponelevator( 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.model linkto( player.elevator_parent );
self.linked_to_elevator = 1; self.linked_to_elevator = 1;
self.unitrigger.link_parent = player.elevator_parent; self.unitrigger.link_parent = player.elevator_parent;
} }
else else
{
self.unitrigger.link_parent = undefined; self.unitrigger.link_parent = undefined;
}
} }
pickupfromelevator() pickupfromelevator()
{ {
if ( isDefined( self.linked_to_elevator ) && self.linked_to_elevator ) if ( isdefined( self.linked_to_elevator ) && self.linked_to_elevator )
{
if ( isDefined( self.model ) )
{ {
if ( isdefined( self.model ) )
self.model unlink(); self.model unlink();
}
self.linked_to_elevator = undefined; self.linked_to_elevator = undefined;
} }
if ( isDefined( self.unitrigger ) )
{ if ( isdefined( self.unitrigger ) )
self.unitrigger.link_parent = undefined; self.unitrigger.link_parent = undefined;
}
} }
onuseplantobject_slipgun( player ) onuseplantobject_slipgun( player )
@ -332,22 +330,18 @@ onuseplantobject_slipgun( player )
buildable = self.buildablezone; buildable = self.buildablezone;
first_part = "TAG_COOKER"; first_part = "TAG_COOKER";
second_part = "TAG_BASE"; 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 ( 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 ); buildable.stub.model showpart( second_part );
i++;
continue; continue;
} }
else
{
buildable.stub.model hidepart( second_part ); buildable.stub.model hidepart( second_part );
} }
} }
i++;
}
} }

View File

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

View File

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

View File

@ -1,114 +1,117 @@
#include maps/mp/_utility; // T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#using_animtree( "fxanim_props" ); #include maps\mp\_utility;
#include maps\mp\createfx\zm_highrise_fx;
main() main()
{ {
precache_createfx_fx(); precache_createfx_fx();
precache_scripted_fx(); precache_scripted_fx();
precache_fxanim_props(); precache_fxanim_props();
maps/mp/createfx/zm_highrise_fx::main(); maps\mp\createfx\zm_highrise_fx::main();
} }
precache_scripted_fx() precache_scripted_fx()
{ {
level._effect[ "switch_sparks" ] = loadfx( "maps/zombie/fx_zmb_pswitch_spark" ); level._effect["switch_sparks"] = loadfx( "maps/zombie/fx_zmb_pswitch_spark" );
level._effect[ "zapper_light_ready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_green" ); level._effect["zapper_light_ready"] = loadfx( "maps/zombie/fx_zombie_zapper_light_green" );
level._effect[ "zapper_light_notready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_red" ); level._effect["zapper_light_notready"] = loadfx( "maps/zombie/fx_zombie_zapper_light_red" );
level._effect[ "lght_marker" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker" ); level._effect["lght_marker"] = loadfx( "maps/zombie/fx_zmb_tranzit_marker" );
level._effect[ "pandora_box_inverted" ] = loadfx( "maps/zombie/fx_zmb_highrise_marker" ); level._effect["pandora_box_inverted"] = loadfx( "maps/zombie/fx_zmb_highrise_marker" );
level._effect[ "lght_marker_flare" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" ); level._effect["lght_marker_flare"] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" );
level._effect[ "poltergeist" ] = loadfx( "misc/fx_zombie_couch_effect" ); level._effect["poltergeist"] = loadfx( "misc/fx_zombie_couch_effect" );
level._effect[ "zomb_gib" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" ); level._effect["zomb_gib"] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" );
level._effect[ "elec_md" ] = loadfx( "electrical/fx_elec_player_md" ); level._effect["elec_md"] = loadfx( "electrical/fx_elec_player_md" );
level._effect[ "elec_sm" ] = loadfx( "electrical/fx_elec_player_sm" ); level._effect["elec_sm"] = loadfx( "electrical/fx_elec_player_sm" );
level._effect[ "elec_torso" ] = loadfx( "electrical/fx_elec_player_torso" ); level._effect["elec_torso"] = loadfx( "electrical/fx_elec_player_torso" );
level._effect[ "blue_eyes" ] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" ); level._effect["blue_eyes"] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" );
level._effect[ "elevator_tell" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_tell" ); level._effect["elevator_tell"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_tell" );
level._effect[ "elevator_sparks" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_sparks" ); level._effect["elevator_sparks"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_sparks" );
level._effect[ "elevator_impact" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_impact" ); level._effect["elevator_impact"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_impact" );
level._effect[ "elevator_glint" ] = loadfx( "maps/zombie_highrise/fx_highrise_key_glint" ); level._effect["elevator_glint"] = loadfx( "maps/zombie_highrise/fx_highrise_key_glint" );
level._effect[ "elevator_light" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_light" ); level._effect["elevator_light"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_light" );
level._effect[ "perk_elevator_idle" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_perk_slow" ); level._effect["perk_elevator_idle"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_perk_slow" );
level._effect[ "perk_elevator_departing" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_perk_fast" ); level._effect["perk_elevator_departing"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_perk_fast" );
level._effect[ "perk_elevator_indicator_up" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_arrow_up" ); level._effect["perk_elevator_indicator_up"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_arrow_up" );
level._effect[ "perk_elevator_indicator_down" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_arrow_down" ); level._effect["perk_elevator_indicator_down"] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_arrow_down" );
level._effect[ "sidequest_dragon_spark_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_spark_max" ); level._effect["sidequest_dragon_spark_max"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_spark_max" );
level._effect[ "sidequest_dragon_fireball_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_fireball_max" ); level._effect["sidequest_dragon_fireball_max"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_fireball_max" );
level._effect[ "sidequest_dragon_spark_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_spark_ric" ); level._effect["sidequest_dragon_spark_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_spark_ric" );
level._effect[ "sidequest_dragon_fireball_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_fireball_ric" ); level._effect["sidequest_dragon_fireball_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_fireball_ric" );
level._effect[ "sidequest_flash" ] = loadfx( "maps/zombie_highrise/fx_highrise_sq_flash" ); level._effect["sidequest_flash"] = loadfx( "maps/zombie_highrise/fx_highrise_sq_flash" );
level._effect[ "sidequest_tower_bolts" ] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_tower_bolts" ); level._effect["sidequest_tower_bolts"] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_tower_bolts" );
} }
precache_createfx_fx() precache_createfx_fx()
{ {
level._effect[ "fx_highrise_cloud_lg_single" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_single" ); level._effect["fx_highrise_cloud_lg_single"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_single" );
level._effect[ "fx_highrise_cloud_lg_flat" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_flat" ); level._effect["fx_highrise_cloud_lg_flat"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_flat" );
level._effect[ "fx_highrise_cloud_lg_left" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_left" ); level._effect["fx_highrise_cloud_lg_left"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_left" );
level._effect[ "fx_highrise_cloud_lg_right" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_right" ); level._effect["fx_highrise_cloud_lg_right"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_right" );
level._effect[ "fx_highrise_cloud_sm_bottom" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_sm_bottom" ); level._effect["fx_highrise_cloud_sm_bottom"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_sm_bottom" );
level._effect[ "fx_highrise_cloud_sm_right" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_sm_right" ); level._effect["fx_highrise_cloud_sm_right"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_sm_right" );
level._effect[ "fx_highrise_cloud_bend_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_bend_sm" ); level._effect["fx_highrise_cloud_bend_sm"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_bend_sm" );
level._effect[ "fx_highrise_cloud_bend_01" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_bend_01" ); level._effect["fx_highrise_cloud_bend_01"] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_bend_01" );
level._effect[ "fx_highrise_meteor_lg_bottom" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_bottom" ); level._effect["fx_highrise_meteor_lg_bottom"] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_bottom" );
level._effect[ "fx_highrise_meteor_lg_top" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_top" ); level._effect["fx_highrise_meteor_lg_top"] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_top" );
level._effect[ "fx_highrise_meteor_lg_top2" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_top2" ); level._effect["fx_highrise_meteor_lg_top2"] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_top2" );
level._effect[ "fx_highrise_meteor_sm_top" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_sm_top" ); level._effect["fx_highrise_meteor_sm_top"] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_sm_top" );
level._effect[ "fx_highrise_meteor_sm_horizon" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_sm_horizon" ); level._effect["fx_highrise_meteor_sm_horizon"] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_sm_horizon" );
level._effect[ "fx_lf_zmb_highrise_sun" ] = loadfx( "lens_flares/fx_lf_zmb_highrise_sun" ); level._effect["fx_lf_zmb_highrise_sun"] = loadfx( "lens_flares/fx_lf_zmb_highrise_sun" );
level._effect[ "fx_zmb_flies" ] = loadfx( "maps/zombie/fx_zmb_flies" ); level._effect["fx_zmb_flies"] = loadfx( "maps/zombie/fx_zmb_flies" );
level._effect[ "fx_zmb_tranzit_fire_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_med" ); level._effect["fx_zmb_tranzit_fire_med"] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_med" );
level._effect[ "fx_highrise_ash_rising_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_ash_rising_md" ); level._effect["fx_highrise_ash_rising_md"] = loadfx( "maps/zombie_highrise/fx_highrise_ash_rising_md" );
level._effect[ "fx_highrise_bld_crumble_runner" ] = loadfx( "maps/zombie_highrise/fx_highrise_bld_crumble_runner" ); level._effect["fx_highrise_bld_crumble_runner"] = loadfx( "maps/zombie_highrise/fx_highrise_bld_crumble_runner" );
level._effect[ "fx_highrise_ceiling_dust_md_runner" ] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_md_runner" ); level._effect["fx_highrise_ceiling_dust_md_runner"] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_md_runner" );
level._effect[ "fx_highrise_ceiling_dust_sm_runner" ] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_sm_runner" ); level._effect["fx_highrise_ceiling_dust_sm_runner"] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_sm_runner" );
level._effect[ "fx_highrise_ceiling_dust_edge_100" ] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_edge_100" ); level._effect["fx_highrise_ceiling_dust_edge_100"] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_edge_100" );
level._effect[ "fx_highrise_edge_crumble_ext" ] = loadfx( "maps/zombie_highrise/fx_highrise_edge_crumble_ext" ); level._effect["fx_highrise_edge_crumble_ext"] = loadfx( "maps/zombie_highrise/fx_highrise_edge_crumble_ext" );
level._effect[ "fx_highrise_point_crumble_ext" ] = loadfx( "maps/zombie_highrise/fx_highrise_point_crumble_ext" ); level._effect["fx_highrise_point_crumble_ext"] = loadfx( "maps/zombie_highrise/fx_highrise_point_crumble_ext" );
level._effect[ "fx_highrise_wire_spark" ] = loadfx( "maps/zombie_highrise/fx_highrise_wire_spark" ); level._effect["fx_highrise_wire_spark"] = loadfx( "maps/zombie_highrise/fx_highrise_wire_spark" );
level._effect[ "fx_highrise_water_drip_fast" ] = loadfx( "maps/zombie_highrise/fx_highrise_water_drip_fast" ); level._effect["fx_highrise_water_drip_fast"] = loadfx( "maps/zombie_highrise/fx_highrise_water_drip_fast" );
level._effect[ "fx_highrise_haze_int_med" ] = loadfx( "maps/zombie_highrise/fx_highrise_haze_int_med" ); level._effect["fx_highrise_haze_int_med"] = loadfx( "maps/zombie_highrise/fx_highrise_haze_int_med" );
level._effect[ "fx_highrise_fire_distant" ] = loadfx( "maps/zombie_highrise/fx_highrise_fire_distant" ); level._effect["fx_highrise_fire_distant"] = loadfx( "maps/zombie_highrise/fx_highrise_fire_distant" );
level._effect[ "fx_highrise_smk_plume_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_sm" ); level._effect["fx_highrise_smk_plume_sm"] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_sm" );
level._effect[ "fx_highrise_smk_plume_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_md" ); level._effect["fx_highrise_smk_plume_md"] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_md" );
level._effect[ "fx_highrise_smk_plume_xlg" ] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_xlg" ); level._effect["fx_highrise_smk_plume_xlg"] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_xlg" );
level._effect[ "fx_highrise_moon" ] = loadfx( "maps/zombie_highrise/fx_highrise_moon" ); level._effect["fx_highrise_moon"] = loadfx( "maps/zombie_highrise/fx_highrise_moon" );
level._effect[ "fx_highrise_god_ray_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_sm" ); level._effect["fx_highrise_god_ray_sm"] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_sm" );
level._effect[ "fx_highrise_god_ray_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_md" ); level._effect["fx_highrise_god_ray_md"] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_md" );
level._effect[ "fx_highrise_god_ray_cool_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_cool_sm" ); level._effect["fx_highrise_god_ray_cool_sm"] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_cool_sm" );
level._effect[ "fx_highrise_god_ray_cool_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_cool_md" ); level._effect["fx_highrise_god_ray_cool_md"] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_cool_md" );
level._effect[ "fx_highrise_light_bulb" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_bulb" ); level._effect["fx_highrise_light_bulb"] = loadfx( "maps/zombie_highrise/fx_highrise_light_bulb" );
level._effect[ "fx_highrise_light_build_lamp" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_build_lamp" ); level._effect["fx_highrise_light_build_lamp"] = loadfx( "maps/zombie_highrise/fx_highrise_light_build_lamp" );
level._effect[ "fx_highrise_light_fluorescent" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent" ); level._effect["fx_highrise_light_fluorescent"] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent" );
level._effect[ "fx_highrise_light_fluorescent_wall" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent_wall" ); level._effect["fx_highrise_light_fluorescent_wall"] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent_wall" );
level._effect[ "fx_highrise_light_fluorescent_wal2" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent_wal2" ); level._effect["fx_highrise_light_fluorescent_wal2"] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent_wal2" );
level._effect[ "fx_highrise_light_recessed" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed" ); level._effect["fx_highrise_light_recessed"] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed" );
level._effect[ "fx_highrise_light_recessed_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_md" ); level._effect["fx_highrise_light_recessed_md"] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_md" );
level._effect[ "fx_highrise_light_recessed_tall" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_tall" ); level._effect["fx_highrise_light_recessed_tall"] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_tall" );
level._effect[ "fx_highrise_light_recessed_tiny" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_tiny" ); level._effect["fx_highrise_light_recessed_tiny"] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_tiny" );
level._effect[ "fx_highrise_light_mall" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_mall" ); level._effect["fx_highrise_light_mall"] = loadfx( "maps/zombie_highrise/fx_highrise_light_mall" );
level._effect[ "fx_highrise_light_lantern_red" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_lantern_red" ); level._effect["fx_highrise_light_lantern_red"] = loadfx( "maps/zombie_highrise/fx_highrise_light_lantern_red" );
level._effect[ "fx_highrise_light_lantern_yel" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_lantern_yel" ); level._effect["fx_highrise_light_lantern_yel"] = loadfx( "maps/zombie_highrise/fx_highrise_light_lantern_yel" );
level._effect[ "fx_highrise_light_sconce_glow" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_sconce_glow" ); level._effect["fx_highrise_light_sconce_glow"] = loadfx( "maps/zombie_highrise/fx_highrise_light_sconce_glow" );
level._effect[ "fx_highrise_light_sconce_beam" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_sconce_beam" ); level._effect["fx_highrise_light_sconce_beam"] = loadfx( "maps/zombie_highrise/fx_highrise_light_sconce_beam" );
level._effect[ "fx_highrise_dragon_breath_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_breath_max" ); level._effect["fx_highrise_dragon_breath_max"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_breath_max" );
level._effect[ "fx_highrise_dragon_tower_absorb_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_absorb_max" ); level._effect["fx_highrise_dragon_tower_absorb_max"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_absorb_max" );
level._effect[ "fx_highrise_dragon_tower_glow_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_glow_max" ); level._effect["fx_highrise_dragon_tower_glow_max"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_glow_max" );
level._effect[ "fx_highrise_sidequest_complete" ] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete" ); level._effect["fx_highrise_sidequest_complete"] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete" );
level._effect[ "fx_highrise_dragon_breath_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_breath_ric" ); level._effect["fx_highrise_dragon_breath_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_breath_ric" );
level._effect[ "fx_highrise_dragon_tower_absorb_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_absorb_ric" ); level._effect["fx_highrise_dragon_tower_absorb_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_absorb_ric" );
level._effect[ "fx_highrise_dragon_tower_glow_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_glow_ric" ); level._effect["fx_highrise_dragon_tower_glow_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_glow_ric" );
level._effect[ "fx_highrise_sidequest_complete_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete_ric" ); level._effect["fx_highrise_sidequest_complete_ric"] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete_ric" );
} }
#using_animtree("fxanim_props");
precache_fxanim_props() precache_fxanim_props()
{ {
level.scr_anim[ "fxanim_props" ][ "wirespark_med_lrg" ] = %fxanim_gp_wirespark_med_lrg_anim; level.scr_anim["fxanim_props"]["wirespark_med_lrg"] = %fxanim_gp_wirespark_med_lrg_anim;
level.scr_anim[ "fxanim_props" ][ "wirespark_long_lrg" ] = %fxanim_gp_wirespark_long_lrg_anim; level.scr_anim["fxanim_props"]["wirespark_long_lrg"] = %fxanim_gp_wirespark_long_lrg_anim;
level.scr_anim[ "fxanim_props" ][ "roaches" ] = %fxanim_gp_roaches_anim; level.scr_anim["fxanim_props"]["roaches"] = %fxanim_gp_roaches_anim;
level.scr_anim[ "fxanim_props" ][ "dragon_a" ] = %fxanim_zom_highrise_dragon_a_anim; level.scr_anim["fxanim_props"]["dragon_a"] = %fxanim_zom_highrise_dragon_a_anim;
level.scr_anim[ "fxanim_props" ][ "dragon_b" ] = %fxanim_zom_highrise_dragon_b_anim; level.scr_anim["fxanim_props"]["dragon_b"] = %fxanim_zom_highrise_dragon_b_anim;
level.scr_anim[ "fxanim_props" ][ "dragon" ] = %fxanim_zom_highrise_dragon_idle_anim; level.scr_anim["fxanim_props"]["dragon"] = %fxanim_zom_highrise_dragon_idle_anim;
level.scr_anim[ "fxanim_props" ][ "rock_slide" ] = %fxanim_zom_highrise_rock_slide_anim; level.scr_anim["fxanim_props"]["rock_slide"] = %fxanim_zom_highrise_rock_slide_anim;
} }

View File

@ -1,14 +1,15 @@
//checked includes match cerberus output // T6 GSC SOURCE
#include maps/mp/zm_highrise_classic; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zm_highrise; #include common_scripts\utility;
#include maps/mp/gametypes_zm/_zm_gametype; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_game_module; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_game_module;
#include maps/mp/_utility; #include maps\mp\gametypes_zm\_zm_gametype;
#include common_scripts/utility; #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_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_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; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_sidequests; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_utility; #include common_scripts\utility;
#include maps/mp/_utility; #include maps\mp\_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
init() init()
{ {
@ -35,40 +37,39 @@ stage_logic()
exit_stage_1( success ) exit_stage_1( success )
{ {
} }
sq_atd_dragon_icon_setup() sq_atd_dragon_icon_setup()
{ {
a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" ); a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" );
_a51 = a_dragon_icons;
_k51 = getFirstArrayKey( _a51 ); foreach ( m_icon in a_dragon_icons )
while ( isDefined( _k51 ) )
{ {
m_icon = _a51[ _k51 ];
m_icon notsolid(); m_icon notsolid();
m_icon.m_elevator = getent( "elevator_" + m_icon.script_noteworthy + "_body", "targetname" ); 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.angles = m_icon.m_elevator.angles;
m_icon linkto( m_icon.m_elevator ); m_icon linkto( m_icon.m_elevator );
m_icon.m_lit_icon = getent( m_icon.script_noteworthy + "_elevator_lit", "script_noteworthy" ); 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 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.angles = m_icon.angles;
m_icon.m_lit_icon linkto( m_icon.m_elevator ); 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_icons = getentarray( "atd2_marker_unlit", "script_noteworthy" );
a_atd2_lit_icons = getentarray( "atd2_marker_lit", "targetname" ); 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_lit_icons[i].angles = a_atd2_icons[i].angles;
a_atd2_icons[ i ].lit_icon = a_atd2_lit_icons[ i ]; 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_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" ); 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 = getent( a_elevators[i], "targetname" );
trig_elevator thread sq_atd_watch_elevator( a_elevator_flags[ i ] ); 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 ); flag_wait_any_array( a_elevator_flags );
wait 0,5; wait 0.5;
} }
/# /#
iprintlnbold( "Standing on Elevators Complete" ); iprintlnbold( "Standing on Elevators Complete" );
#/ #/
a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" ); a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" );
_a105 = a_dragon_icons;
_k105 = getFirstArrayKey( _a105 ); foreach ( m_icon in a_dragon_icons )
while ( isDefined( _k105 ) )
{ {
m_icon = _a105[ _k105 ];
v_off_pos = m_icon.m_lit_icon.origin; v_off_pos = m_icon.m_lit_icon.origin;
m_icon.m_lit_icon unlink(); m_icon.m_lit_icon unlink();
m_icon unlink(); m_icon unlink();
@ -105,8 +104,8 @@ sq_atd_elevators()
m_icon.m_lit_icon linkto( m_icon.m_elevator ); m_icon.m_lit_icon linkto( m_icon.m_elevator );
m_icon linkto( m_icon.m_elevator ); m_icon linkto( m_icon.m_elevator );
m_icon playsound( "zmb_sq_symbol_light" ); m_icon playsound( "zmb_sq_symbol_light" );
_k105 = getNextArrayKey( _a105, _k105 );
} }
flag_set( "sq_atd_elevator_activated" ); flag_set( "sq_atd_elevator_activated" );
vo_richtofen_atd_elevators(); vo_richtofen_atd_elevators();
level thread vo_maxis_atd_elevators(); level thread vo_maxis_atd_elevators();
@ -115,18 +114,22 @@ sq_atd_elevators()
sq_atd_watch_elevator( str_flag ) sq_atd_watch_elevator( str_flag )
{ {
level endon( "sq_atd_elevator_activated" ); level endon( "sq_atd_elevator_activated" );
while ( 1 )
while ( true )
{ {
self waittill( "trigger", e_who ); self waittill( "trigger", e_who );
while ( !isplayer( e_who ) )
if ( !isplayer( e_who ) )
{ {
wait 0,05; wait 0.05;
continue;
} }
flag_set( str_flag ); flag_set( str_flag );
while ( isalive( e_who ) && e_who istouching( self ) ) while ( isalive( e_who ) && e_who istouching( self ) )
{ wait 0.05;
wait 0,05;
}
flag_clear( str_flag ); flag_clear( str_flag );
} }
} }
@ -136,16 +139,13 @@ sq_atd_drg_puzzle()
level.sq_atd_cur_drg = 0; level.sq_atd_cur_drg = 0;
a_puzzle_trigs = getentarray( "trig_atd_drg_puzzle", "targetname" ); a_puzzle_trigs = getentarray( "trig_atd_drg_puzzle", "targetname" );
a_puzzle_trigs = array_randomize( a_puzzle_trigs ); 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 );
a_puzzle_trigs[ i ] thread drg_puzzle_trig_think( i );
i++;
}
while ( level.sq_atd_cur_drg < 4 ) while ( level.sq_atd_cur_drg < 4 )
{
wait 1; wait 1;
}
flag_set( "sq_atd_drg_puzzle_complete" ); flag_set( "sq_atd_drg_puzzle_complete" );
level thread vo_maxis_atd_order_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; m_lit = m_unlit.lit_icon;
v_top = m_unlit.origin; v_top = m_unlit.origin;
v_hidden = m_lit.origin; v_hidden = m_lit.origin;
while ( !flag( "sq_atd_drg_puzzle_complete" ) ) 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" ); 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; continue;
} }
}
self waittill( "trigger", e_who ); self waittill( "trigger", e_who );
if ( level.sq_atd_cur_drg == n_order_id ) if ( level.sq_atd_cur_drg == n_order_id )
{ {
m_lit.origin = v_top; m_lit.origin = v_top;
@ -187,27 +189,27 @@ drg_puzzle_trig_think( n_order_id )
else else
{ {
if ( !flag( "sq_atd_drg_puzzle_1st_error" ) ) if ( !flag( "sq_atd_drg_puzzle_1st_error" ) )
{
level thread vo_maxis_atd_order_error(); level thread vo_maxis_atd_order_error();
}
level.sq_atd_cur_drg = 0; level.sq_atd_cur_drg = 0;
level notify( "drg_puzzle_reset" ); level notify( "drg_puzzle_reset" );
/# /#
iprintlnbold( "INCORRECT DRAGON" ); iprintlnbold( "INCORRECT DRAGON" );
#/ #/
wait 0,5; wait 0.5;
} }
while ( e_who istouching( self ) ) while ( e_who istouching( self ) )
{ wait 0.5;
wait 0,5;
}
} }
} }
drg_puzzle_trig_watch_fade( m_lit, m_unlit, v_top, v_hidden ) drg_puzzle_trig_watch_fade( m_lit, m_unlit, v_top, v_hidden )
{ {
level endon( "sq_atd_drg_puzzle_complete" ); level endon( "sq_atd_drg_puzzle_complete" );
level waittill( "drg_puzzle_reset" ); level waittill( "drg_puzzle_reset" );
m_unlit.origin = v_top; m_unlit.origin = v_top;
m_lit.origin = v_hidden; m_lit.origin = v_hidden;
m_unlit playsound( "zmb_sq_symbol_fade" ); 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() 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() 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 ) vo_richtofen_atd_order( n_which )
{ {
str_vox = "vox_zmba_sidequest_sec_symbols_" + 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() 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() vo_maxis_atd_order_error()
{ {
flag_set( "sq_atd_drg_puzzle_1st_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() 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; // T6 GSC SOURCE
#include maps/mp/zm_highrise_sq; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_sidequests; #include common_scripts\utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
#using_animtree( "fxanim_props" ); #include maps\mp\zombies\_zm_unitrigger;
init_1() init_1()
{ {
@ -45,9 +45,9 @@ stage_logic_1()
#/ #/
watch_player_springpads( 0 ); watch_player_springpads( 0 );
wait_for_all_springpads_placed( "pts_ghoul", "pts_1_springpads_placed" ); 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(); 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" ); stage_completed( "sq_1", "pts_1" );
} }
@ -56,10 +56,9 @@ wait_for_zombies_launched()
level thread richtofen_zombies_launched(); level thread richtofen_zombies_launched();
t_tower = getent( "pts_tower_trig", "targetname" ); t_tower = getent( "pts_tower_trig", "targetname" );
s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" ); s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" );
while ( level.n_launched_zombies < 16 ) while ( level.n_launched_zombies < 16 )
{ wait 0.5;
wait 0,5;
}
} }
watch_zombie_flings() watch_zombie_flings()
@ -68,15 +67,17 @@ watch_zombie_flings()
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "equip_springpad_zm_taken" ); self endon( "equip_springpad_zm_taken" );
self endon( "equip_springpad_zm_pickup" ); self endon( "equip_springpad_zm_pickup" );
while ( level.n_launched_zombies < 16 ) while ( level.n_launched_zombies < 16 )
{ {
self waittill( "fling" ); self waittill( "fling" );
level.n_launched_zombies++; 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" ); level notify( "pts1_say_next_line" );
}
wait 0,1; wait 0.1;
} }
} }
@ -88,9 +89,9 @@ stage_logic_2()
watch_player_springpads( 1 ); watch_player_springpads( 1 );
level thread wait_for_balls_launched(); level thread wait_for_balls_launched();
flag_wait( "pts_2_generator_1_started" ); 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" ); 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(); level thread maxis_balls_placed();
stage_completed( "sq_2", "pts_2" ); stage_completed( "sq_2", "pts_2" );
} }
@ -99,31 +100,27 @@ wait_for_balls_launched()
{ {
level.current_generator = 1; level.current_generator = 1;
a_lion_spots = getstructarray( "pts_lion", "targetname" ); a_lion_spots = getstructarray( "pts_lion", "targetname" );
_a138 = a_lion_spots;
_k138 = getFirstArrayKey( _a138 ); foreach ( s_lion_spot in a_lion_spots )
while ( isDefined( _k138 ) )
{ {
s_lion_spot = _a138[ _k138 ];
s_lion_spot.a_place_ball_trigs = []; s_lion_spot.a_place_ball_trigs = [];
s_lion_spot.springpad_buddy = getstruct( s_lion_spot.script_string, "script_noteworthy" ); s_lion_spot.springpad_buddy = getstruct( s_lion_spot.script_string, "script_noteworthy" );
_k138 = getNextArrayKey( _a138, _k138 );
} }
a_players = getplayers(); a_players = getplayers();
_a145 = a_players;
_k145 = getFirstArrayKey( _a145 ); foreach ( player in a_players )
while ( isDefined( _k145 ) )
{ {
player = _a145[ _k145 ];
player.a_place_ball_trigs = []; player.a_place_ball_trigs = [];
if ( isDefined( player.zm_sq_has_ball ) )
{ if ( isdefined( player.zm_sq_has_ball ) )
player thread player_has_ball(); player thread player_has_ball();
} }
_k145 = getNextArrayKey( _a145, _k145 );
} while ( true )
while ( 1 )
{ {
level waittill( "zm_ball_picked_up", player ); level waittill( "zm_ball_picked_up", player );
player thread player_has_ball(); 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 ) place_ball_think( t_place_ball, s_lion_spot )
{ {
t_place_ball endon( "delete" ); t_place_ball endon( "delete" );
t_place_ball waittill( "trigger" ); t_place_ball waittill( "trigger" );
pts_putdown_trigs_remove_for_spot( s_lion_spot ); pts_putdown_trigs_remove_for_spot( s_lion_spot );
pts_putdown_trigs_remove_for_spot( s_lion_spot.springpad_buddy ); pts_putdown_trigs_remove_for_spot( s_lion_spot.springpad_buddy );
self.zm_sq_has_ball = undefined; self.zm_sq_has_ball = undefined;
@ -173,68 +172,64 @@ place_ball_think( t_place_ball, s_lion_spot )
delete_all_springpads() delete_all_springpads()
{ {
} }
exit_stage_1( success ) exit_stage_1( success )
{ {
} }
exit_stage_2( success ) exit_stage_2( success )
{ {
} }
watch_player_springpads( is_generator ) watch_player_springpads( is_generator )
{ {
level thread springpad_count_watcher( is_generator ); level thread springpad_count_watcher( is_generator );
a_players = get_players(); a_players = get_players();
_a240 = a_players;
_k240 = getFirstArrayKey( _a240 ); foreach ( player in a_players )
while ( isDefined( _k240 ) )
{
player = _a240[ _k240 ];
player thread pts_watch_springpad_use( is_generator ); player thread pts_watch_springpad_use( is_generator );
_k240 = getNextArrayKey( _a240, _k240 );
}
} }
pts_watch_springpad_use( is_generator ) pts_watch_springpad_use( is_generator )
{ {
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
while ( !flag( "sq_branch_complete" ) ) while ( !flag( "sq_branch_complete" ) )
{ {
self waittill( "equipment_placed", weapon, weapname ); self waittill( "equipment_placed", weapon, weapname );
if ( weapname == level.springpad_name ) if ( weapname == level.springpad_name )
{
self is_springpad_in_place( weapon, is_generator ); self is_springpad_in_place( weapon, is_generator );
} }
}
} }
springpad_count_watcher( is_generator ) springpad_count_watcher( is_generator )
{ {
level endon( "sq_pts_springad_count4" ); level endon( "sq_pts_springad_count4" );
str_which_spots = "pts_ghoul"; str_which_spots = "pts_ghoul";
if ( is_generator ) if ( is_generator )
{
str_which_spots = "pts_lion"; str_which_spots = "pts_lion";
}
a_spots = getstructarray( str_which_spots, "targetname" ); a_spots = getstructarray( str_which_spots, "targetname" );
while ( 1 )
while ( true )
{ {
level waittill( "sq_pts_springpad_in_place" ); level waittill( "sq_pts_springpad_in_place" );
n_count = 0; n_count = 0;
_a279 = a_spots;
_k279 = getFirstArrayKey( _a279 ); foreach ( s_spot in a_spots )
while ( isDefined( _k279 ) )
{
s_spot = _a279[ _k279 ];
if ( isDefined( s_spot.springpad ) )
{ {
if ( isdefined( s_spot.springpad ) )
n_count++; n_count++;
} }
_k279 = getNextArrayKey( _a279, _k279 );
}
level notify( "sq_pts_springad_count" + n_count ); 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_lion_spots = getstructarray( "pts_lion", "targetname" );
a_ghoul_spots = getstructarray( "pts_ghoul", "targetname" ); a_ghoul_spots = getstructarray( "pts_ghoul", "targetname" );
a_spots = arraycombine( a_lion_spots, a_ghoul_spots, 0, 0 ); a_spots = arraycombine( a_lion_spots, a_ghoul_spots, 0, 0 );
_a298 = a_spots;
_k298 = getFirstArrayKey( _a298 ); foreach ( s_spot in a_spots )
while ( isDefined( _k298 ) )
{ {
s_spot = _a298[ _k298 ];
n_dist = distance2dsquared( m_springpad.origin, s_spot.origin ); n_dist = distance2dsquared( m_springpad.origin, s_spot.origin );
if ( n_dist < 1024 ) if ( n_dist < 1024 )
{ {
v_spot_forward = vectornormalize( anglesToForward( s_spot.angles ) ); v_spot_forward = vectornormalize( anglestoforward( s_spot.angles ) );
v_pad_forward = vectornormalize( anglesToForward( m_springpad.angles ) ); v_pad_forward = vectornormalize( anglestoforward( m_springpad.angles ) );
n_dot = vectordot( v_spot_forward, v_pad_forward ); n_dot = vectordot( v_spot_forward, v_pad_forward );
/# /#
iprintlnbold( "Trample Steam OFF: Dist(" + sqrt( n_dist ) + ") Dot(" + n_dot + ")" ); 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 + ")" ); 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" ); level notify( "sq_pts_springpad_in_place" );
s_spot.springpad = m_springpad; s_spot.springpad = m_springpad;
self thread pts_springpad_removed_watcher( m_springpad, s_spot ); self thread pts_springpad_removed_watcher( m_springpad, s_spot );
if ( is_generator ) if ( is_generator )
{ {
wait 0,1; wait 0.1;
level thread pts_should_springpad_create_trigs( s_spot ); 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 else
{ {
m_springpad.fling_scaler = 2; m_springpad.fling_scaler = 2;
m_springpad thread watch_zombie_flings(); 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" ); s_target = getstruct( "sq_zombie_launch_target", "targetname" );
v_override_dir = vectornormalize( s_target.origin - m_springpad.origin ); 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.direction_vec_override = v_override_dir;
m_springpad.fling_scaler = s_spot.script_float; m_springpad.fling_scaler = s_spot.script_float;
} }
return;
break;
} }
} }
else
{
_k298 = getNextArrayKey( _a298, _k298 );
}
} }
} }
@ -301,7 +294,8 @@ pts_springpad_fling( str_spot_name, m_buddy_springpad )
n_anim_length1 = undefined; n_anim_length1 = undefined;
str_anim2 = undefined; str_anim2 = undefined;
n_anim_length2 = undefined; n_anim_length2 = undefined;
switch( str_spot_name )
switch ( str_spot_name )
{ {
case "lion_pair_1": case "lion_pair_1":
str_anim1 = "dc"; str_anim1 = "dc";
@ -320,6 +314,7 @@ pts_springpad_fling( str_spot_name, m_buddy_springpad )
str_anim2 = "ab"; str_anim2 = "ab";
break; break;
} }
m_anim = spawn( "script_model", ( 2090, 675, 3542 ) ); m_anim = spawn( "script_model", ( 2090, 675, 3542 ) );
m_anim.angles = ( 0, 0, 0 ); m_anim.angles = ( 0, 0, 0 );
m_anim setmodel( "fxanim_zom_highrise_trample_gen_mod" ); m_anim setmodel( "fxanim_zom_highrise_trample_gen_mod" );
@ -333,22 +328,23 @@ pts_springpad_anim_ball( m_buddy_springpad, m_anim, str_anim1, str_anim2 )
m_anim endon( "delete" ); m_anim endon( "delete" );
self endon( "delete" ); self endon( "delete" );
m_buddy_springpad endon( "delete" ); m_buddy_springpad endon( "delete" );
n_anim_length1 = getanimlength( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim1 ] ); 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 ] ); n_anim_length2 = getanimlength( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim2] );
while ( isDefined( m_anim ) )
while ( isdefined( m_anim ) )
{ {
self notify( "fling" ); self notify( "fling", 1 );
if ( isDefined( m_anim ) )
{ if ( isdefined( m_anim ) )
m_anim setanim( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim1 ] ); m_anim setanim( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim1] );
}
wait n_anim_length1; wait( n_anim_length1 );
m_buddy_springpad notify( "fling" ); m_buddy_springpad notify( "fling", 1 );
if ( isDefined( m_anim ) )
{ if ( isdefined( m_anim ) )
m_anim setanim( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim2 ] ); 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 ) wait_for_all_springpads_placed( str_type, str_flag )
{ {
a_spots = getstructarray( str_type, "targetname" ); a_spots = getstructarray( str_type, "targetname" );
while ( !flag( str_flag ) ) while ( !flag( str_flag ) )
{ {
is_clear = 0; is_clear = 0;
_a442 = a_spots;
_k442 = getFirstArrayKey( _a442 ); foreach ( s_spot in a_spots )
while ( isDefined( _k442 ) )
{
s_spot = _a442[ _k442 ];
if ( !isDefined( s_spot.springpad ) )
{ {
if ( !isdefined( s_spot.springpad ) )
is_clear = 1; is_clear = 1;
} }
_k442 = getNextArrayKey( _a442, _k442 );
}
if ( !is_clear ) if ( !is_clear )
{
flag_set( str_flag ); flag_set( str_flag );
}
wait 1; wait 1;
} }
} }
@ -393,54 +385,45 @@ wait_for_all_springpads_placed( str_type, str_flag )
pts_should_player_create_trigs( player ) pts_should_player_create_trigs( player )
{ {
a_lion_spots = getstructarray( "pts_lion", "targetname" ); a_lion_spots = getstructarray( "pts_lion", "targetname" );
_a467 = a_lion_spots;
_k467 = getFirstArrayKey( _a467 ); foreach ( s_lion_spot in a_lion_spots )
while ( isDefined( _k467 ) )
{
s_lion_spot = _a467[ _k467 ];
if ( 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 ) )
pts_putdown_trigs_create_for_spot( s_lion_spot, player ); pts_putdown_trigs_create_for_spot( s_lion_spot, player );
} }
_k467 = getNextArrayKey( _a467, _k467 );
}
} }
pts_should_springpad_create_trigs( s_lion_spot ) 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(); a_players = getplayers();
_a481 = a_players;
_k481 = getFirstArrayKey( _a481 ); foreach ( player in a_players )
while ( isDefined( _k481 ) )
{ {
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, player );
pts_putdown_trigs_create_for_spot( s_lion_spot.springpad_buddy, 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 ) 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; return;
}
t_place_ball = sq_pts_create_use_trigger( s_lion_spot.origin, 16, 70, &"ZM_HIGHRISE_SQ_PUTDOWN_BALL" ); t_place_ball = sq_pts_create_use_trigger( s_lion_spot.origin, 16, 70, &"ZM_HIGHRISE_SQ_PUTDOWN_BALL" );
player clientclaimtrigger( t_place_ball ); player clientclaimtrigger( t_place_ball );
t_place_ball.owner = player; t_place_ball.owner = player;
player thread place_ball_think( t_place_ball, s_lion_spot ); 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 = [];
}
s_lion_spot.pts_putdown_trigs[ player.characterindex ] = t_place_ball; s_lion_spot.pts_putdown_trigs[player.characterindex] = t_place_ball;
level thread pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot ); level thread pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot );
} }
@ -454,117 +437,123 @@ pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot )
pts_reset_ball( 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.sq_pickup_reset = 1;
s_lion_spot.which_ball notify( "sq_pickup_reset" ); s_lion_spot.which_ball notify( "sq_pickup_reset" );
m_ball_anim = getent( "trample_gen_" + s_lion_spot.script_noteworthy, "targetname" ); m_ball_anim = getent( "trample_gen_" + s_lion_spot.script_noteworthy, "targetname" );
playfx( level._effect[ "sidequest_flash" ], m_ball_anim gettagorigin( "fxanim_zom_highrise_trample_gen1_jnt" ) ); 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" ); flag_clear( "pts_2_generator_" + s_lion_spot.which_generator + "_started" );
level.current_generator--; level.current_generator--;
s_lion_spot.which_ball = undefined; s_lion_spot.which_ball = undefined;
m_ball_anim delete(); m_ball_anim delete();
} }
else else if ( isdefined( s_lion_spot.springpad_buddy.which_ball ) )
{
if ( isDefined( s_lion_spot.springpad_buddy.which_ball ) )
{ {
s_lion_spot.springpad_buddy.sq_pickup_reset = 1; s_lion_spot.springpad_buddy.sq_pickup_reset = 1;
s_lion_spot.springpad_buddy.which_ball notify( "sq_pickup_reset" ); s_lion_spot.springpad_buddy.which_ball notify( "sq_pickup_reset" );
m_ball_anim = getent( "trample_gen_" + s_lion_spot.springpad_buddy.script_noteworthy, "targetname" ); m_ball_anim = getent( "trample_gen_" + s_lion_spot.springpad_buddy.script_noteworthy, "targetname" );
playfx( level._effect[ "sidequest_flash" ], m_ball_anim gettagorigin( "fxanim_zom_highrise_trample_gen1_jnt" ) ); 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" ); flag_clear( "pts_2_generator_" + s_lion_spot.springpad_buddy.which_generator + "_started" );
level.current_generator--; level.current_generator--;
s_lion_spot.springpad_buddy.which_ball = undefined; s_lion_spot.springpad_buddy.which_ball = undefined;
m_ball_anim delete(); m_ball_anim delete();
} }
}
} }
pts_putdown_trigs_remove_for_player( player ) pts_putdown_trigs_remove_for_player( player )
{ {
a_lion_spots = getstructarray( "pts_lion", "targetname" ); a_lion_spots = getstructarray( "pts_lion", "targetname" );
_a554 = a_lion_spots;
_k554 = getFirstArrayKey( _a554 ); foreach ( s_lion_spot in a_lion_spots )
while ( isDefined( _k554 ) )
{ {
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(); s_lion_spot.pts_putdown_trigs[player.characterindex] delete();
arrayremoveindex( s_lion_spot.pts_putdown_trigs, player.characterindex, 1 ); arrayremoveindex( s_lion_spot.pts_putdown_trigs, player.characterindex, 1 );
} }
_k554 = getNextArrayKey( _a554, _k554 );
} }
} }
pts_putdown_trigs_remove_for_spot( s_lion_spot ) 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; return;
}
_a575 = s_lion_spot.pts_putdown_trigs; foreach ( t_putdown in s_lion_spot.pts_putdown_trigs )
_k575 = getFirstArrayKey( _a575 );
while ( isDefined( _k575 ) )
{
t_putdown = _a575[ _k575 ];
t_putdown delete(); t_putdown delete();
_k575 = getNextArrayKey( _a575, _k575 );
}
s_lion_spot.pts_putdown_trigs = []; s_lion_spot.pts_putdown_trigs = [];
} }
richtofen_pts_instructions() 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() richtofen_pts_placed()
{ {
level waittill( "sq_pts_springad_count1" ); 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" ); 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" ); 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" ); 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() richtofen_zombies_launched()
{ {
level waittill( "pts1_say_next_line" ); 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; wait 1;
level waittill( "pts1_say_next_line" ); 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; wait 1;
level waittill( "pts1_say_next_line" ); 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() 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() maxis_pts_placed()
{ {
level waittill( "sq_pts_springad_count1" ); 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" ); 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" ); 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() 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; // T6 GSC SOURCE
#include maps/mp/zm_highrise_sq; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_sidequests; #include common_scripts\utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
#include maps\mp\zm_highrise_sq_pts;
init() init()
{ {
@ -30,6 +32,7 @@ stage_logic()
exit_stage_1( success ) exit_stage_1( success )
{ {
} }
snipe_balls_wait() snipe_balls_wait()
@ -37,22 +40,19 @@ snipe_balls_wait()
a_balls = getentarray( "sq_dragon_lion_ball", "targetname" ); a_balls = getentarray( "sq_dragon_lion_ball", "targetname" );
array_thread( a_balls, ::snipe_balls_watch_ball ); array_thread( a_balls, ::snipe_balls_watch_ball );
is_complete = 0; is_complete = 0;
while ( !is_complete ) while ( !is_complete )
{ {
level waittill( "zm_ball_shot" ); level waittill( "zm_ball_shot" );
wait 1; wait 1;
is_complete = 1; is_complete = 1;
_a50 = a_balls;
_k50 = getFirstArrayKey( _a50 ); foreach ( m_ball in a_balls )
while ( isDefined( _k50 ) )
{
m_ball = _a50[ _k50 ];
if ( isDefined( m_ball ) )
{ {
if ( isdefined( m_ball ) )
is_complete = 0; is_complete = 0;
} }
_k50 = getNextArrayKey( _a50, _k50 );
}
} }
/# /#
iprintlnbold( "All Balls Shot" ); iprintlnbold( "All Balls Shot" );
@ -64,61 +64,65 @@ snipe_balls_watch_ball()
self endon( "delete" ); self endon( "delete" );
a_snipers = array( "dsr50_zm", "dsr50_upgraded_zm+vzoom", "barretm82_zm", "barretm82_upgraded_zm+vzoom", "svu_zm", "svu_upgraded_zm+vzoom" ); a_snipers = array( "dsr50_zm", "dsr50_upgraded_zm+vzoom", "barretm82_zm", "barretm82_upgraded_zm+vzoom", "svu_zm", "svu_upgraded_zm+vzoom" );
self setcandamage( 1 ); self setcandamage( 1 );
while ( 1 )
while ( true )
{ {
self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname ); 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" ); level notify( "zm_ball_shot" );
playsoundatposition( "zmb_sq_ball_ding", self.origin ); playsoundatposition( "zmb_sq_ball_ding", self.origin );
playfx( level._effect[ "sidequest_flash" ], self.origin ); playfx( level._effect["sidequest_flash"], self.origin );
str_noteworthy = self.script_noteworthy; str_noteworthy = self.script_noteworthy;
self delete(); self delete();
wait 0,5; wait 0.5;
clientnotify( str_noteworthy ); clientnotify( str_noteworthy );
m_ball = getent( "sq_sliquify_r", "script_noteworthy" ); m_ball = getent( "sq_sliquify_r", "script_noteworthy" );
if ( str_noteworthy == "m_drg_tail" ) if ( str_noteworthy == "m_drg_tail" )
{
m_ball = getent( "sq_sliquify_m", "script_noteworthy" ); m_ball = getent( "sq_sliquify_m", "script_noteworthy" );
}
playfx( level._effect[ "sidequest_flash" ], m_ball.origin ); playfx( level._effect["sidequest_flash"], m_ball.origin );
m_ball show(); m_ball show();
m_ball thread lion_ball_enable_pickup(); m_ball thread lion_ball_enable_pickup();
if ( !flag( "sq_slb_first_ball_sniped" ) ) if ( !flag( "sq_slb_first_ball_sniped" ) )
{ {
flag_set( "sq_slb_first_ball_sniped" ); flag_set( "sq_slb_first_ball_sniped" );
level thread vo_atd_ball1_sniped(); level thread vo_atd_ball1_sniped();
break;
} }
else else
{
level thread vo_maxis_atd_ball2_sniped(); level thread vo_maxis_atd_ball2_sniped();
} }
} }
}
} }
lion_ball_enable_pickup() lion_ball_enable_pickup()
{ {
self endon( "sq_sliquified" ); self endon( "sq_sliquified" );
while ( 1 )
while ( true )
{ {
self.can_pickup = 1; self.can_pickup = 1;
self.t_pickup = sq_slb_create_use_trigger( self.origin, 32, 70, &"ZM_HIGHRISE_SQ_PICKUP_BALL" ); self.t_pickup = sq_slb_create_use_trigger( self.origin, 32, 70, &"ZM_HIGHRISE_SQ_PICKUP_BALL" );
while ( self.can_pickup ) while ( self.can_pickup )
{ {
self.t_pickup waittill( "trigger", player ); 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.zm_sq_has_ball = 1;
player.which_ball = self; player.which_ball = self;
self.can_pickup = 0; self.can_pickup = 0;
self.player = player; self.player = player;
flag_set( "sq_ball_picked_up" ); flag_set( "sq_ball_picked_up" );
level thread maps/mp/zm_highrise_sq_pts::pts_should_player_create_trigs( player ); level thread maps\mp\zm_highrise_sq_pts::pts_should_player_create_trigs( player );
level notify( "zm_ball_picked_up" ); level notify( "zm_ball_picked_up", player );
} }
} }
self.t_pickup delete(); self.t_pickup delete();
self hide(); self hide();
self setcandamage( 0 ); self setcandamage( 0 );
@ -128,21 +132,24 @@ lion_ball_enable_pickup()
self.player.t_putdown_ball = self.t_putdown; self.player.t_putdown_ball = self.t_putdown;
self ball_pickup_waittill_change(); self ball_pickup_waittill_change();
play_spark = 0; play_spark = 0;
if ( !isDefined( self.t_putdown ) )
if ( !isdefined( self.t_putdown ) )
{ {
self waittill( "sq_pickup_reset" ); self waittill( "sq_pickup_reset" );
play_spark = 1; play_spark = 1;
} }
else else
{
self.t_putdown delete(); self.t_putdown delete();
}
self.player notify( "zm_sq_ball_putdown" ); self.player notify( "zm_sq_ball_putdown" );
if ( play_spark ) if ( play_spark )
{ {
self.sq_pickup_reset = undefined; self.sq_pickup_reset = undefined;
playfx( level._effect[ "sidequest_flash" ], self.origin ); playfx( level._effect["sidequest_flash"], self.origin );
} }
self show(); self show();
self setcandamage( 1 ); self setcandamage( 1 );
self.player.zm_sq_has_ball = undefined; self.player.zm_sq_has_ball = undefined;
@ -173,23 +180,23 @@ vo_richtofen_atd_ball_sniped()
if ( !flag( "sq_slb_richtofen_spoke" ) ) if ( !flag( "sq_slb_richtofen_spoke" ) )
{ {
flag_set( "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() 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() 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() 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() vo_atd_ball1_sniped()

View File

@ -1,9 +1,11 @@
#include maps/mp/zm_highrise_sq; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_spawner; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_sidequests; #include common_scripts\utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zm_highrise_sq;
init_1() init_1()
{ {
@ -20,7 +22,7 @@ init_2()
flag_init( "ssp2_corpses_in_place" ); flag_init( "ssp2_corpses_in_place" );
flag_init( "ssp2_resurrection_done" ); flag_init( "ssp2_resurrection_done" );
flag_init( "ssp2_statue_complete" ); 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 ); 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 ssp1_advance_dragon();
level thread vo_richtofen_sliquify_confirm(); level thread vo_richtofen_sliquify_confirm();
level thread vo_maxis_sliquify_fail(); 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" );
a_balls[ i ] thread ssp1_watch_ball( "ssp1_ball" + i + "_complete" );
i++;
}
while ( !flag( "ssp1_ball0_complete" ) || !flag( "ssp1_ball1_complete" ) ) while ( !flag( "ssp1_ball0_complete" ) || !flag( "ssp1_ball1_complete" ) )
{ {
flag_wait_any( "ssp1_ball0_complete", "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 ) ssp1_watch_ball( str_complete_flag )
{ {
self watch_model_sliquification( 20, str_complete_flag ); self watch_model_sliquification( 20, str_complete_flag );
self thread ssp1_rotate_ball(); 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() ssp1_rotate_ball()
{ {
while ( isDefined( self ) ) while ( isdefined( self ) )
{ {
self rotateyaw( 360, 1 ); self rotateyaw( 360, 1 );
wait 0,9; wait 0.9;
} }
} }
ssp1_advance_dragon() ssp1_advance_dragon()
{ {
flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" ); 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() stage_logic_2()
@ -102,26 +103,22 @@ corpse_room_watcher()
{ {
t_corpse_room = getent( "corpse_room_trigger", "targetname" ); t_corpse_room = getent( "corpse_room_trigger", "targetname" );
n_count = 0; n_count = 0;
while ( !flag( "ssp2_resurrection_done" ) ) while ( !flag( "ssp2_resurrection_done" ) )
{ {
level waittill( "ssp2_corpse_made", is_in_room ); level waittill( "ssp2_corpse_made", is_in_room );
if ( is_in_room ) if ( is_in_room )
{
n_count++; n_count++;
}
else else
{
n_count = 0; n_count = 0;
}
if ( n_count == 1 && !flag( "ssp2_maxis_keep_going_said" ) ) if ( n_count == 1 && !flag( "ssp2_maxis_keep_going_said" ) )
{ {
flag_set( "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" ); level thread maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_0" );
continue;
} }
else else if ( n_count >= 15 )
{
if ( n_count >= 15 )
{ {
/# /#
iprintlnbold( "Corpse Count Reached" ); iprintlnbold( "Corpse Count Reached" );
@ -132,53 +129,48 @@ corpse_room_watcher()
level notify( "end_revive_watcher" ); level notify( "end_revive_watcher" );
} }
} }
}
} }
ssp_2_zombie_death_check() ssp_2_zombie_death_check()
{ {
self waittill( "death" ); self waittill( "death" );
if ( !isDefined( self ) )
{ if ( !isdefined( self ) )
return; return;
}
t_corpse_room = getent( "corpse_room_trigger", "targetname" ); t_corpse_room = getent( "corpse_room_trigger", "targetname" );
if ( self istouching( t_corpse_room ) ) if ( self istouching( t_corpse_room ) )
{ level notify( "ssp2_corpse_made", 1 );
level notify( "ssp2_corpse_made" );
}
else else
{ level notify( "ssp2_corpse_made", 0 );
level notify( "ssp2_corpse_made" );
}
} }
corpse_room_cleanup_watcher() corpse_room_cleanup_watcher()
{ {
level endon( "ssp2_resurrection_done" ); level endon( "ssp2_resurrection_done" );
t_corpse_room = getent( "corpse_room_trigger", "targetname" ); t_corpse_room = getent( "corpse_room_trigger", "targetname" );
while ( 1 )
while ( true )
{ {
wait 1; wait 1;
a_corpses = getcorpsearray(); a_corpses = getcorpsearray();
if ( a_corpses.size < 15 ) if ( a_corpses.size < 15 )
{ {
level thread vo_maxis_ssp_fail(); level thread vo_maxis_ssp_fail();
level notify( "end_revive_watcher" ); level notify( "end_revive_watcher" );
return; return;
} }
n_count = 0; n_count = 0;
_a206 = a_corpses;
_k206 = getFirstArrayKey( _a206 ); foreach ( m_corpse in a_corpses )
while ( isDefined( _k206 ) )
{ {
m_corpse = _a206[ _k206 ];
if ( m_corpse istouching( t_corpse_room ) ) if ( m_corpse istouching( t_corpse_room ) )
{
n_count++; n_count++;
} }
_k206 = getNextArrayKey( _a206, _k206 );
}
if ( n_count < 15 ) if ( n_count < 15 )
{ {
level thread vo_maxis_ssp_fail(); level thread vo_maxis_ssp_fail();
@ -194,9 +186,11 @@ corpse_room_revive_watcher()
weaponname = "none"; weaponname = "none";
str_type = "none"; str_type = "none";
t_corpse_room_dmg = getent( "corpse_room_trigger", "targetname" ); t_corpse_room_dmg = getent( "corpse_room_trigger", "targetname" );
while ( weaponname != "knife_ballistic_upgraded_zm" || str_type != "MOD_IMPACT" ) while ( weaponname != "knife_ballistic_upgraded_zm" || str_type != "MOD_IMPACT" )
{ {
t_corpse_room_dmg waittill( "damage", amount, inflictor, direction, point, type ); t_corpse_room_dmg waittill( "damage", amount, inflictor, direction, point, type );
if ( isplayer( inflictor ) ) if ( isplayer( inflictor ) )
{ {
weaponname = inflictor.currentweapon; weaponname = inflictor.currentweapon;
@ -213,9 +207,9 @@ corpse_room_revive_watcher()
ssp2_advance_dragon() ssp2_advance_dragon()
{ {
flag_wait( "ssp2_corpses_in_place" ); 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" ); 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 ) exit_stage_1( success )
@ -225,82 +219,80 @@ exit_stage_1( success )
exit_stage_2( success ) exit_stage_2( success )
{ {
} }
watch_model_sliquification( n_end_limit, str_complete_flag ) watch_model_sliquification( n_end_limit, str_complete_flag )
{ {
n_count = 0; n_count = 0;
self setcandamage( 1 ); self setcandamage( 1 );
while ( !flag( str_complete_flag ) ) while ( !flag( str_complete_flag ) )
{ {
self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname ); self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname );
if ( issubstr( weaponname, "slipgun" ) && !flag( "sq_ball_picked_up" ) ) if ( issubstr( weaponname, "slipgun" ) && !flag( "sq_ball_picked_up" ) )
{ {
n_count++; n_count++;
if ( n_count >= n_end_limit ) if ( n_count >= n_end_limit )
{ {
/# /#
iprintlnbold( "MODEL COMPLETE: " + str_complete_flag ); iprintlnbold( "MODEL COMPLETE: " + str_complete_flag );
#/ #/
self notify( "sq_sliquified" ); self notify( "sq_sliquified" );
if ( isDefined( self.t_pickup ) )
{ if ( isdefined( self.t_pickup ) )
self.t_pickup delete(); self.t_pickup delete();
}
flag_set( str_complete_flag ); flag_set( str_complete_flag );
break;
} }
else if ( n_count == 1 ) else if ( n_count == 1 )
{
level notify( "ssp1_ball_first_sliquified" ); level notify( "ssp1_ball_first_sliquified" );
break; else if ( n_count == 10 )
}
else
{
if ( n_count == 10 )
{
level notify( "ssp1_ball_sliquified_2" ); level notify( "ssp1_ball_sliquified_2" );
} }
} }
}
}
} }
vo_richtofen_instructions() 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; 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() vo_sliquify_fail_watch()
{ {
flag_wait( "sq_ball_picked_up" ); 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() vo_richtofen_sliquify_confirm()
{ {
level waittill( "ssp1_ball_first_sliquified" ); 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" ); 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" ); 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; 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() vo_maxis_sliquify_fail()
{ {
flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" ); 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() 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_3" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_4" ); maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_4" );
} }
vo_maxis_ssp_reincarnate() vo_maxis_ssp_reincarnate()
@ -308,21 +300,19 @@ vo_maxis_ssp_reincarnate()
if ( !flag( "ssp2_maxis_reincarnate_said" ) ) if ( !flag( "ssp2_maxis_reincarnate_said" ) )
{ {
flag_set( "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 else
{
flag_clear( "ssp2_maxis_reincarnate_said" ); flag_clear( "ssp2_maxis_reincarnate_said" );
}
} }
vo_maxis_ssp_fail() 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() 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_3" );
maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_6" ); maps\mp\zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_6" );
} }

View File

@ -1,8 +1,10 @@
#include maps/mp/zombies/_zm_ffotd; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_zonemgr; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include common_scripts/utility; #include common_scripts\utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_ffotd;
main_start() main_start()
{ {
@ -25,55 +27,56 @@ spawned_collision_fix()
precachemodel( "collision_wall_128x128x10_standard" ); precachemodel( "collision_wall_128x128x10_standard" );
precachemodel( "collision_wall_256x256x10_standard" ); precachemodel( "collision_wall_256x256x10_standard" );
flag_wait( "start_zombie_round_logic" ); flag_wait( "start_zombie_round_logic" );
if ( !is_true( level.optimise_for_splitscreen ) ) if ( !is_true( level.optimise_for_splitscreen ) )
{ {
collision1 = spawn( "script_model", ( 2992, 536, 497 ) ); collision1 = spawn( "script_model", ( 2992, 536, 497 ) );
collision1 setmodel( "collision_geo_512x512x512_standard" ); collision1 setmodel( "collision_geo_512x512x512_standard" );
collision1.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision1.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision1 ghost(); collision1 ghost();
collision2 = spawn( "script_model", ( 2824, 632, 497 ) ); collision2 = spawn( "script_model", ( 2824, 632, 497 ) );
collision2 setmodel( "collision_geo_512x512x512_standard" ); collision2 setmodel( "collision_geo_512x512x512_standard" );
collision2.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision2.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision2 ghost(); collision2 ghost();
collision3 = spawn( "script_model", ( 2992, 536, -15 ) ); collision3 = spawn( "script_model", ( 2992, 536, -15 ) );
collision3 setmodel( "collision_geo_512x512x512_standard" ); collision3 setmodel( "collision_geo_512x512x512_standard" );
collision3.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision3.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision3 ghost(); collision3 ghost();
collision4 = spawn( "script_model", ( 2824, 632, -15 ) ); collision4 = spawn( "script_model", ( 2824, 632, -15 ) );
collision4 setmodel( "collision_geo_512x512x512_standard" ); collision4 setmodel( "collision_geo_512x512x512_standard" );
collision4.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision4.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision4 ghost(); collision4 ghost();
collision5 = spawn( "script_model", ( 2992, 536, -527 ) ); collision5 = spawn( "script_model", ( 2992, 536, -527 ) );
collision5 setmodel( "collision_geo_512x512x512_standard" ); collision5 setmodel( "collision_geo_512x512x512_standard" );
collision5.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision5.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision5 ghost(); collision5 ghost();
collision6 = spawn( "script_model", ( 2824, 632, -527 ) ); collision6 = spawn( "script_model", ( 2824, 632, -527 ) );
collision6 setmodel( "collision_geo_512x512x512_standard" ); collision6 setmodel( "collision_geo_512x512x512_standard" );
collision6.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision6.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision6 ghost(); collision6 ghost();
collision7 = spawn( "script_model", ( 2992, 536, -1039 ) ); collision7 = spawn( "script_model", ( 2992, 536, -1039 ) );
collision7 setmodel( "collision_geo_512x512x512_standard" ); collision7 setmodel( "collision_geo_512x512x512_standard" );
collision7.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision7.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision7 ghost(); collision7 ghost();
collision8 = spawn( "script_model", ( 2824, 632, -1039 ) ); collision8 = spawn( "script_model", ( 2824, 632, -1039 ) );
collision8 setmodel( "collision_geo_512x512x512_standard" ); collision8 setmodel( "collision_geo_512x512x512_standard" );
collision8.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision8.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision8 ghost(); collision8 ghost();
collision9 = spawn( "script_model", ( 2992, 536, -1551 ) ); collision9 = spawn( "script_model", ( 2992, 536, -1551 ) );
collision9 setmodel( "collision_geo_512x512x512_standard" ); collision9 setmodel( "collision_geo_512x512x512_standard" );
collision9.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision9.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision9 ghost(); collision9 ghost();
collision10 = spawn( "script_model", ( 2824, 632, -1551 ) ); collision10 = spawn( "script_model", ( 2824, 632, -1551 ) );
collision10 setmodel( "collision_geo_512x512x512_standard" ); collision10 setmodel( "collision_geo_512x512x512_standard" );
collision10.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision10.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision10 ghost(); collision10 ghost();
collision11 = spawn( "script_model", ( 2992, 536, -2063 ) ); collision11 = spawn( "script_model", ( 2992, 536, -2063 ) );
collision11 setmodel( "collision_geo_512x512x512_standard" ); collision11 setmodel( "collision_geo_512x512x512_standard" );
collision11.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision11.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision11 ghost(); collision11 ghost();
collision12 = spawn( "script_model", ( 2824, 632, -2063 ) ); collision12 = spawn( "script_model", ( 2824, 632, -2063 ) );
collision12 setmodel( "collision_geo_512x512x512_standard" ); collision12 setmodel( "collision_geo_512x512x512_standard" );
collision12.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision12.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision12 ghost(); collision12 ghost();
collisione1 = spawn( "script_model", ( 1649, 2164, 2843 ) ); collisione1 = spawn( "script_model", ( 1649, 2164, 2843 ) );
collisione1 setmodel( "collision_wall_256x256x10_standard" ); collisione1 setmodel( "collision_wall_256x256x10_standard" );
@ -85,59 +88,59 @@ spawned_collision_fix()
collisione2 ghost(); collisione2 ghost();
collisione3 = spawn( "script_model", ( 1478, 1216, 2843 ) ); collisione3 = spawn( "script_model", ( 1478, 1216, 2843 ) );
collisione3 setmodel( "collision_wall_256x256x10_standard" ); collisione3 setmodel( "collision_wall_256x256x10_standard" );
collisione3.angles = vectorScale( ( 0, 0, 0 ), 270 ); collisione3.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione3 ghost(); collisione3 ghost();
collisione4 = spawn( "script_model", ( 1478, 1216, 2587 ) ); collisione4 = spawn( "script_model", ( 1478, 1216, 2587 ) );
collisione4 setmodel( "collision_wall_256x256x10_standard" ); collisione4 setmodel( "collision_wall_256x256x10_standard" );
collisione4.angles = vectorScale( ( 0, 0, 0 ), 270 ); collisione4.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione4 ghost(); collisione4 ghost();
collisione5 = spawn( "script_model", ( 1478, 1216, 2331 ) ); collisione5 = spawn( "script_model", ( 1478, 1216, 2331 ) );
collisione5 setmodel( "collision_wall_256x256x10_standard" ); collisione5 setmodel( "collision_wall_256x256x10_standard" );
collisione5.angles = vectorScale( ( 0, 0, 0 ), 270 ); collisione5.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione5 ghost(); collisione5 ghost();
collisione6 = spawn( "script_model", ( 1478, 1216, 2242 ) ); collisione6 = spawn( "script_model", ( 1478, 1216, 2242 ) );
collisione6 setmodel( "collision_wall_256x256x10_standard" ); collisione6 setmodel( "collision_wall_256x256x10_standard" );
collisione6.angles = vectorScale( ( 0, 0, 0 ), 270 ); collisione6.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collisione6 ghost(); collisione6 ghost();
collision13 = spawn( "script_model", ( 2251, 2687, 3095 ) ); collision13 = spawn( "script_model", ( 2251, 2687, 3095 ) );
collision13 setmodel( "collision_wall_128x128x10_standard" ); collision13 setmodel( "collision_wall_128x128x10_standard" );
collision13.angles = vectorScale( ( 0, 0, 0 ), 270 ); collision13.angles = vectorscale( ( 0, 1, 0 ), 270.0 );
collision13 ghost(); collision13 ghost();
collision14 = spawn( "script_model", ( 2046, 1270, 2758 ) ); collision14 = spawn( "script_model", ( 2046, 1270, 2758 ) );
collision14 setmodel( "collision_geo_512x512x512_standard" ); collision14 setmodel( "collision_geo_512x512x512_standard" );
collision14.angles = vectorScale( ( 0, 0, 0 ), 6,20013 ); collision14.angles = vectorscale( ( 0, 0, -1 ), 6.20013 );
collision14 ghost(); collision14 ghost();
collision15 = spawn( "script_model", ( 2518, 597, 3191 ) ); collision15 = spawn( "script_model", ( 2518, 597, 3191 ) );
collision15 setmodel( "collision_wall_128x128x10_standard" ); collision15 setmodel( "collision_wall_128x128x10_standard" );
collision15.angles = ( 0, 240,4, -3,00014 ); collision15.angles = ( 0, 240.4, -3.00014 );
collision15 ghost(); collision15 ghost();
collision16 = spawn( "script_model", ( 2613, -721, 1184 ) ); collision16 = spawn( "script_model", ( 2613, -721, 1184 ) );
collision16 setmodel( "collision_wall_128x128x10_standard" ); collision16 setmodel( "collision_wall_128x128x10_standard" );
collision16.angles = ( 0, 60, -2,60003 ); collision16.angles = ( 0, 60, -2.60003 );
collision16 ghost(); collision16 ghost();
collision17 = spawn( "script_model", ( 2721, -533, 1184 ) ); collision17 = spawn( "script_model", ( 2721, -533, 1184 ) );
collision17 setmodel( "collision_wall_128x128x10_standard" ); collision17 setmodel( "collision_wall_128x128x10_standard" );
collision17.angles = ( 0, 60, -2,60003 ); collision17.angles = ( 0, 60, -2.60003 );
collision17 ghost(); collision17 ghost();
collision18 = spawn( "script_model", ( 2940, 1512, 3004 ) ); collision18 = spawn( "script_model", ( 2940, 1512, 3004 ) );
collision18 setmodel( "collision_geo_64x64x256_standard" ); collision18 setmodel( "collision_geo_64x64x256_standard" );
collision18.angles = vectorScale( ( 0, 0, 0 ), 350 ); collision18.angles = vectorscale( ( 1, 0, 0 ), 350.0 );
collision18 ghost(); collision18 ghost();
collision19 = spawn( "script_model", ( 1631, -235, 2943 ) ); collision19 = spawn( "script_model", ( 1631, -235, 2943 ) );
collision19 setmodel( "collision_geo_32x32x128_standard" ); collision19 setmodel( "collision_geo_32x32x128_standard" );
collision19.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision19.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision19 ghost(); collision19 ghost();
collision20 = spawn( "script_model", ( 2232, -579, 1354 ) ); collision20 = spawn( "script_model", ( 2232, -579, 1354 ) );
collision20 setmodel( "collision_wall_128x128x10_standard" ); collision20 setmodel( "collision_wall_128x128x10_standard" );
collision20.angles = vectorScale( ( 0, 0, 0 ), 330 ); collision20.angles = vectorscale( ( 0, 1, 0 ), 330.0 );
collision20 ghost(); collision20 ghost();
collision21 = spawn( "script_model", ( 2349, 805, 1346 ) ); collision21 = spawn( "script_model", ( 2349, 805, 1346 ) );
collision21 setmodel( "collision_geo_32x32x128_standard" ); collision21 setmodel( "collision_geo_32x32x128_standard" );
collision21.angles = vectorScale( ( 0, 0, 0 ), 8,6 ); collision21.angles = vectorscale( ( 0, 1, 0 ), 8.6 );
collision21 ghost(); collision21 ghost();
collision22 = spawn( "script_model", ( 2791, 1093, 1272 ) ); collision22 = spawn( "script_model", ( 2791, 1093, 1272 ) );
collision22 setmodel( "collision_geo_32x32x128_standard" ); collision22 setmodel( "collision_geo_32x32x128_standard" );
collision22.angles = vectorScale( ( 0, 0, 0 ), 3,2 ); collision22.angles = vectorscale( ( 1, 0, 0 ), 3.2 );
collision22 ghost(); collision22 ghost();
collision23 = spawn( "script_model", ( 2222, 1488, 3280 ) ); collision23 = spawn( "script_model", ( 2222, 1488, 3280 ) );
collision23 setmodel( "collision_geo_32x32x128_standard" ); collision23 setmodel( "collision_geo_32x32x128_standard" );
@ -152,33 +155,32 @@ spawned_collision_fix()
connect_zones_for_ffotd( zone_name_a, zone_name_b, one_way ) connect_zones_for_ffotd( zone_name_a, zone_name_b, one_way )
{ {
if ( !isDefined( one_way ) ) if ( !isdefined( one_way ) )
{
one_way = 0; one_way = 0;
}
zone_init( zone_name_a ); zone_init( zone_name_a );
zone_init( zone_name_b ); zone_init( zone_name_b );
enable_zone( zone_name_a ); enable_zone( zone_name_a );
enable_zone( zone_name_b ); 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] = spawnstruct();
}
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = 1; level.zones[zone_name_a].adjacent_zones[zone_name_b].is_connected = 1;
if ( !one_way ) 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 ] = spawnstruct();
} level.zones[zone_name_b].adjacent_zones[zone_name_a].is_connected = 1;
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = 1;
} }
} }
kill_trigger_spawn() kill_trigger_spawn()
{ {
trig = spawn( "trigger_box", ( 3328, 160, 1480 ), 0, 96, 200, 128 ); 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"; trig.targetname = "instant_death";
trig2 = spawn( "trigger_box", ( 2512, 1824, 1488 ), 0, 140, 140, 128 ); trig2 = spawn( "trigger_box", ( 2512, 1824, 1488 ), 0, 140, 140, 128 );
trig2.angles = ( 0, 0, 0 ); trig2.angles = ( 0, 0, 0 );
@ -193,70 +195,64 @@ pathfinding_override_fix()
player_trigger_origin = ( 2357, 778, 1304 ); player_trigger_origin = ( 2357, 778, 1304 );
player_trigger_radius = 40; player_trigger_radius = 40;
zombie_goto_point = ( 2361, 738, 1304 ); 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_origin = ( 3767, 1867, 2790 );
zombie_trigger_radius = 64; zombie_trigger_radius = 64;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3684, 1772, 2758 ); player_trigger_origin = ( 3684, 1772, 2758 );
player_trigger_radius = 70; player_trigger_radius = 70;
zombie_goto_point = ( 3659, 1872, 2790 ); 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 ); 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_origin = ( 3245, 1251, 1347.79 );
zombie_trigger_radius = 64; zombie_trigger_radius = 64;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3246, 1126, 1347,79 ); player_trigger_origin = ( 3246, 1126, 1347.79 );
player_trigger_radius = 64; player_trigger_radius = 64;
zombie_goto_point = ( 3031, 1234, 1278,12 ); 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 ); 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_origin = ( 3246, 1113, 1347.79 );
zombie_trigger_radius = 64; zombie_trigger_radius = 64;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3245, 1230, 1347,79 ); player_trigger_origin = ( 3245, 1230, 1347.79 );
player_trigger_radius = 44; player_trigger_radius = 44;
zombie_goto_point = ( 3023, 1154, 1278,12 ); 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 ); 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_origin = ( 3389, 1182, 1364.79 );
zombie_trigger_radius = 64; zombie_trigger_radius = 64;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3246, 1126, 1347,79 ); player_trigger_origin = ( 3246, 1126, 1347.79 );
player_trigger_radius = 64; player_trigger_radius = 64;
zombie_goto_point = ( 3381, 1093, 1364,79 ); 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 ); 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_origin = ( 3148, 1712, 1299.07 );
zombie_trigger_radius = 64; zombie_trigger_radius = 64;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3149, 1604, 1302,2 ); player_trigger_origin = ( 3149, 1604, 1302.2 );
player_trigger_radius = 44; player_trigger_radius = 44;
zombie_goto_point = ( 3259, 1644, 1321,5 ); 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 ); 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_origin = ( 3149, 1584, 1302.2 );
zombie_trigger_radius = 64; zombie_trigger_radius = 64;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3148, 1692, 1299,07 ); player_trigger_origin = ( 3148, 1692, 1299.07 );
player_trigger_radius = 44; player_trigger_radius = 44;
zombie_goto_point = ( 3291, 1684, 1321,5 ); 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 ); 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_origin = ( 3818, 1860, 2789.23 );
zombie_trigger_radius = 100; zombie_trigger_radius = 100;
zombie_trigger_height = 128; zombie_trigger_height = 128;
player_trigger_origin = ( 3601, 1961, 2744,95 ); player_trigger_origin = ( 3601, 1961, 2744.95 );
player_trigger_radius = 50; player_trigger_radius = 50;
zombie_goto_point = ( 3626, 1918, 2750,26 ); 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 ); 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(); all_nodes = getallnodes();
_a331 = all_nodes;
_k331 = getFirstArrayKey( _a331 ); foreach ( node in all_nodes )
while ( isDefined( _k331 ) )
{ {
node = _a331[ _k331 ]; if ( node.origin[0] == 3598.2 )
if ( node.origin[ 0 ] == 3598,2 )
{ {
deletepathnode( node ); deletepathnode( node );
return; break;
}
else
{
_k331 = getNextArrayKey( _a331, _k331 );
} }
} }
} }
@ -264,17 +260,15 @@ pathfinding_override_fix()
highrise_link_nodes( a, b ) highrise_link_nodes( a, b )
{ {
if ( nodesarelinked( a, b ) ) if ( nodesarelinked( a, b ) )
{
return; return;
}
link_nodes( a, b ); link_nodes( a, b );
} }
highrise_unlink_nodes( a, b ) highrise_unlink_nodes( a, b )
{ {
if ( !nodesarelinked( a, b ) ) if ( !nodesarelinked( a, b ) )
{
return; return;
}
unlink_nodes( a, b ); 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,49 +1,48 @@
#include maps/mp/zombies/_zm_buildables; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_power; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_unitrigger; #include common_scripts\utility;
#include maps/mp/zombies/_zm; #include maps\mp\_utility;
#include maps/mp/gametypes_zm/_weaponobjects; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_equipment; #include maps\mp\zombies\_zm_equipment;
#include maps/mp/zombies/_zm_utility; #include maps\mp\gametypes_zm\_weaponobjects;
#include maps/mp/_utility; #include maps\mp\zombies\_zm;
#include common_scripts/utility; #include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_power;
#using_animtree( "zombie_springpad" ); #include maps\mp\zombies\_zm_buildables;
init( pickupstring, howtostring ) 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; return;
}
level.springpad_name = "equip_springpad_zm"; level.springpad_name = "equip_springpad_zm";
init_animtree(); 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::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::add_placeable_equipment( "equip_springpad_zm", "p6_anim_zm_buildable_view_tramplesteam" );
level thread onplayerconnect(); 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" ); level._effect["springpade_on"] = loadfx( "maps/zombie_highrise/fx_highrise_trmpl_steam_os" );
if ( -1 )
{ if ( !isdefined( level.springpad_trigger_radius ) )
setdvar( "player_useRadius_zm", 96 ); level.springpad_trigger_radius = 72;
}
thread wait_init_damage(); thread wait_init_damage();
} }
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; 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() onplayerconnect()
{ {
for ( ;; ) for (;;)
{ {
level waittill( "connecting", player ); level waittill( "connecting", player );
player thread onplayerspawned(); player thread onplayerspawned();
} }
} }
@ -52,9 +51,11 @@ onplayerspawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self thread setupwatchers(); self thread setupwatchers();
for ( ;; )
for (;;)
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
self thread watchspringpaduse(); self thread watchspringpaduse();
} }
} }
@ -62,8 +63,9 @@ onplayerspawned()
setupwatchers() setupwatchers()
{ {
self waittill( "weapon_watchers_created" ); 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() watchspringpaduse()
@ -72,9 +74,11 @@ watchspringpaduse()
self endon( "watchSpringPadUse" ); self endon( "watchSpringPadUse" );
self endon( "death" ); self endon( "death" );
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
for (;;)
{ {
self waittill( "equipment_placed", weapon, weapname ); self waittill( "equipment_placed", weapon, weapname );
if ( weapname == level.springpad_name ) if ( weapname == level.springpad_name )
{ {
self cleanupoldspringpad(); self cleanupoldspringpad();
@ -86,17 +90,19 @@ watchspringpaduse()
cleanupoldspringpad() 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.stub = undefined;
} }
self.buildablespringpad delete(); self.buildablespringpad delete();
self.springpad_kills = undefined; 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 delete();
level.springpad_sound_ent = undefined; level.springpad_sound_ent = undefined;
@ -107,31 +113,41 @@ watchforcleanup()
{ {
self notify( "springpad_cleanup" ); self notify( "springpad_cleanup" );
self endon( "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(); cleanupoldspringpad();
} }
placespringpad( origin, angles ) 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( self.turret_placement ) && !self.turret_placement["result"] )
if ( isDefined( item ) ) {
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.springpad_kills = self.springpad_kills;
item.requires_pickup = 1; item.requires_pickup = 1;
item.zombie_attack_callback = ::springpad_add_fling_ent; item.zombie_attack_callback = ::springpad_fling_attacker;
} }
self.springpad_kills = undefined; self.springpad_kills = undefined;
return item; return item;
} }
dropspringpad() 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 ); 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 ) )
if ( isdefined( item ) )
{ {
item.springpad_kills = self.springpad_kills; item.springpad_kills = self.springpad_kills;
item.requires_pickup = 1; item.requires_pickup = 1;
} }
self.springpad_kills = undefined; self.springpad_kills = undefined;
return item; return item;
} }
@ -146,22 +162,16 @@ transferspringpad( fromplayer, toplayer )
{ {
buildablespringpad = toplayer.buildablespringpad; buildablespringpad = toplayer.buildablespringpad;
toarmed = 0; toarmed = 0;
if ( isDefined( buildablespringpad ) )
{ if ( isdefined( buildablespringpad ) )
if ( isDefined( buildablespringpad.is_armed ) ) toarmed = isdefined( buildablespringpad.is_armed ) && buildablespringpad.is_armed;
{
toarmed = buildablespringpad.is_armed;
}
}
springpad_kills = toplayer.springpad_kills; springpad_kills = toplayer.springpad_kills;
fromarmed = 0; fromarmed = 0;
if ( isDefined( fromplayer.buildablespringpad ) )
{ if ( isdefined( fromplayer.buildablespringpad ) )
if ( isDefined( fromplayer.buildablespringpad.is_armed ) ) fromarmed = isdefined( fromplayer.buildablespringpad.is_armed ) && fromplayer.buildablespringpad.is_armed;
{
fromarmed = fromplayer.buildablespringpad.is_armed;
}
}
toplayer.buildablespringpad = fromplayer.buildablespringpad; toplayer.buildablespringpad = fromplayer.buildablespringpad;
toplayer.buildablespringpad.original_owner = toplayer; toplayer.buildablespringpad.original_owner = toplayer;
toplayer.buildablespringpad.owner = toplayer; toplayer.buildablespringpad.owner = toplayer;
@ -171,25 +181,23 @@ transferspringpad( fromplayer, toplayer )
fromplayer.buildablespringpad = buildablespringpad; fromplayer.buildablespringpad = buildablespringpad;
fromplayer.springpad_kills = springpad_kills; fromplayer.springpad_kills = springpad_kills;
fromplayer notify( "equip_springpad_zm_taken" ); fromplayer notify( "equip_springpad_zm_taken" );
if ( isDefined( fromplayer.buildablespringpad ) )
if ( isdefined( fromplayer.buildablespringpad ) )
{ {
fromplayer thread startspringpaddeploy( fromplayer.buildablespringpad, toarmed ); fromplayer thread startspringpaddeploy( fromplayer.buildablespringpad, toarmed );
fromplayer.buildablespringpad.original_owner = fromplayer; fromplayer.buildablespringpad.original_owner = fromplayer;
fromplayer.buildablespringpad.owner = fromplayer; fromplayer.buildablespringpad.owner = fromplayer;
} }
else 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 ) springpad_in_range( delta, origin, radius )
{ {
if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) ) if ( distancesquared( self.target.origin, origin ) < radius * radius )
{ return true;
return 1;
} return false;
return 0;
} }
springpad_power_on( origin, radius ) springpad_power_on( origin, radius )
@ -197,12 +205,11 @@ springpad_power_on( origin, radius )
/# /#
println( "^1ZM POWER: trap on\n" ); println( "^1ZM POWER: trap on\n" );
#/ #/
if ( !isDefined( self.target ) ) if ( !isdefined( self.target ) )
{
return; return;
}
self.target.power_on = 1; self.target.power_on = 1;
self.target.power_on_time = getTime(); self.target.power_on_time = gettime();
} }
springpad_power_off( origin, radius ) springpad_power_off( origin, radius )
@ -210,10 +217,9 @@ springpad_power_off( origin, radius )
/# /#
println( "^1ZM POWER: trap off\n" ); println( "^1ZM POWER: trap off\n" );
#/ #/
if ( !isDefined( self.target ) ) if ( !isdefined( self.target ) )
{
return; return;
}
self.target.power_on = 0; self.target.power_on = 0;
} }
@ -224,45 +230,50 @@ startspringpaddeploy( weapon, armed )
self endon( "equip_springpad_zm_taken" ); self endon( "equip_springpad_zm_taken" );
self thread watchforcleanup(); self thread watchforcleanup();
electricradius = 45; electricradius = 45;
if ( isDefined( self.springpad_kills ) )
if ( isdefined( self.springpad_kills ) )
{ {
weapon.springpad_kills = self.springpad_kills; weapon.springpad_kills = self.springpad_kills;
self.springpad_kills = undefined; self.springpad_kills = undefined;
} }
if ( !isDefined( weapon.springpad_kills ) )
{ if ( !isdefined( weapon.springpad_kills ) )
weapon.springpad_kills = 0; weapon.springpad_kills = 0;
}
if ( isDefined( weapon ) ) if ( isdefined( weapon ) )
{ {
/# /#
weapon thread debugspringpad( electricradius ); 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; 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 else
{
weapon.power_on = 1; weapon.power_on = 1;
}
if ( !weapon.power_on ) if ( !weapon.power_on )
{
self iprintlnbold( &"ZOMBIE_NEED_LOCAL_POWER" ); self iprintlnbold( &"ZOMBIE_NEED_LOCAL_POWER" );
}
self thread springpadthink( weapon, electricradius, armed ); 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" ); 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 playsound( "wpn_zmb_electrap_stop" );
level.springpad_sound_ent delete(); level.springpad_sound_ent delete();
level.springpad_sound_ent = undefined; level.springpad_sound_ent = undefined;
} }
self notify( "springpad_cleanup" ); self notify( "springpad_cleanup" );
} }
} }
@ -272,6 +283,8 @@ init_animtree()
scriptmodelsuseanimtree( -1 ); scriptmodelsuseanimtree( -1 );
} }
#using_animtree("zombie_springpad");
springpad_animate( weapon, armed ) springpad_animate( weapon, armed )
{ {
self endon( "death" ); self endon( "death" );
@ -284,12 +297,13 @@ springpad_animate( weapon, armed )
l_animlength = getanimlength( %o_zombie_buildable_tramplesteam_launch ); l_animlength = getanimlength( %o_zombie_buildable_tramplesteam_launch );
weapon thread springpad_audio(); weapon thread springpad_audio();
prearmed = 0; prearmed = 0;
if ( isDefined( armed ) && armed )
{ if ( isdefined( armed ) && armed )
prearmed = 1; prearmed = 1;
}
fast_reset = 0; fast_reset = 0;
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{ {
if ( !prearmed ) if ( !prearmed )
{ {
@ -297,32 +311,35 @@ springpad_animate( weapon, armed )
{ {
weapon setanim( %o_zombie_buildable_tramplesteam_reset_zombie ); weapon setanim( %o_zombie_buildable_tramplesteam_reset_zombie );
weapon thread playspringpadresetaudio( f_animlength ); weapon thread playspringpadresetaudio( f_animlength );
wait f_animlength; wait( f_animlength );
} }
else else
{ {
weapon setanim( %o_zombie_buildable_tramplesteam_reset ); weapon setanim( %o_zombie_buildable_tramplesteam_reset );
weapon thread playspringpadresetaudio( r_animlength ); weapon thread playspringpadresetaudio( r_animlength );
wait r_animlength; wait( r_animlength );
} }
} }
else else
{ wait 0.05;
wait 0,05;
}
prearmed = 0; prearmed = 0;
weapon notify( "armed" ); weapon notify( "armed" );
fast_reset = 0; fast_reset = 0;
if ( isDefined( weapon ) )
if ( isdefined( weapon ) )
{ {
weapon setanim( %o_zombie_buildable_tramplesteam_compressed_idle ); weapon setanim( %o_zombie_buildable_tramplesteam_compressed_idle );
weapon waittill( "fling", fast ); weapon waittill( "fling", fast );
fast_reset = fast; fast_reset = fast;
} }
if ( isDefined( weapon ) )
if ( isdefined( weapon ) )
{ {
weapon setanim( %o_zombie_buildable_tramplesteam_launch ); 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 = spawn( "script_origin", self.origin );
ent playloopsound( "zmb_highrise_launcher_reset_loop" ); ent playloopsound( "zmb_highrise_launcher_reset_loop" );
self thread deleteentwhensounddone( time, ent ); self thread deleteentwhensounddone( time, ent );
self waittill( "death" ); self waittill( "death" );
ent delete(); ent delete();
} }
deleteentwhensounddone( time, ent ) deleteentwhensounddone( time, ent )
{ {
self endon( "death" ); self endon( "death" );
wait time; wait( time );
self notify( "springpadAudioCleanup" ); self notify( "springpadAudioCleanup" );
ent delete(); ent delete();
} }
@ -349,7 +368,9 @@ springpad_audio()
{ {
loop_ent = spawn( "script_origin", self.origin ); loop_ent = spawn( "script_origin", self.origin );
loop_ent playloopsound( "zmb_highrise_launcher_loop" ); loop_ent playloopsound( "zmb_highrise_launcher_loop" );
self waittill( "death" ); self waittill( "death" );
loop_ent delete(); loop_ent delete();
} }
@ -357,9 +378,10 @@ springpad_fx( weapon )
{ {
weapon endon( "death" ); weapon endon( "death" );
self endon( "equip_springpad_zm_taken" ); self endon( "equip_springpad_zm_taken" );
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{ {
playfxontag( level._effect[ "springpade_on" ], weapon, "tag_origin" ); playfxontag( level._effect["springpade_on"], weapon, "tag_origin" );
wait 1; wait 1;
} }
} }
@ -372,96 +394,106 @@ springpadthink( weapon, electricradius, armed )
weapon endon( "death" ); weapon endon( "death" );
radiussquared = electricradius * electricradius; radiussquared = electricradius * electricradius;
trigger = spawn( "trigger_box", weapon getcentroid(), 1, 48, 48, 32 ); 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.angles = weapon.angles;
trigger enablelinkto(); trigger enablelinkto();
trigger linkto( weapon ); trigger linkto( weapon );
weapon.trigger = trigger; weapon.trigger = trigger;
/# /#
trigger.extent = ( 24, 24, 16 ); trigger.extent = ( 24.0, 24.0, 16.0 );
#/ #/
weapon thread springpadthinkcleanup( trigger ); weapon thread springpadthinkcleanup( trigger );
direction_forward = anglesToForward( flat_angle( weapon.angles ) + vectorScale( ( 0, 0, 1 ), 60 ) ); direction_forward = anglestoforward( flat_angle( weapon.angles ) + vectorscale( ( -1, 0, 0 ), 60.0 ) );
direction_vector = vectorScale( direction_forward, 1024 ); direction_vector = vectorscale( direction_forward, 1024 );
direction_origin = weapon.origin + direction_vector; direction_origin = weapon.origin + direction_vector;
home_angles = weapon.angles; home_angles = weapon.angles;
weapon.is_armed = 0; weapon.is_armed = 0;
self thread springpad_fx( weapon ); self thread springpad_fx( weapon );
self thread springpad_animate( weapon, armed ); self thread springpad_animate( weapon, armed );
weapon waittill( "armed" ); weapon waittill( "armed" );
weapon.is_armed = 1; weapon.is_armed = 1;
weapon.fling_targets = []; weapon.fling_targets = [];
self thread targeting_thread( weapon, trigger ); self thread targeting_thread( weapon, trigger );
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{ {
wait_for_targets( 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.is_armed = 0;
weapon.zombies_only = 1; weapon.zombies_only = 1;
_a520 = weapon.fling_targets;
_k520 = getFirstArrayKey( _a520 ); foreach ( ent in weapon.fling_targets )
while ( isDefined( _k520 ) )
{ {
ent = _a520[ _k520 ];
if ( isplayer( ent ) ) 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 ) && isdefined( ent.custom_springpad_fling ) )
if ( isDefined( ent ) )
{
if ( !isDefined( self.num_zombies_flung ) )
{ {
if ( !isdefined( self.num_zombies_flung ) )
self.num_zombies_flung = 0; self.num_zombies_flung = 0;
}
self.num_zombies_flung++; self.num_zombies_flung++;
self notify( "zombie_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; weapon.fling_scaler = 1;
}
if ( isDefined( weapon.direction_vec_override ) ) if ( isdefined( weapon.direction_vec_override ) )
{
direction_vector = weapon.direction_vec_override; direction_vector = weapon.direction_vec_override;
}
ent dodamage( ent.health + 666, ent.origin ); ent dodamage( ent.health + 666, ent.origin );
ent startragdoll(); ent startragdoll();
ent launchragdoll( ( direction_vector / 4 ) * weapon.fling_scaler ); ent launchragdoll( direction_vector / 4 * weapon.fling_scaler );
weapon.springpad_kills++; weapon.springpad_kills++;
} }
} }
_k520 = getNextArrayKey( _a520, _k520 );
}
if ( weapon.springpad_kills >= 28 ) if ( weapon.springpad_kills >= 28 )
{
self thread springpad_expired( weapon ); self thread springpad_expired( weapon );
}
weapon.fling_targets = []; weapon.fling_targets = [];
weapon waittill( "armed" ); weapon waittill( "armed" );
weapon.is_armed = 1; weapon.is_armed = 1;
continue;
} }
else else
{ wait 0.1;
wait 0,1;
}
} }
} }
wait_for_targets( weapon ) wait_for_targets( weapon )
{ {
weapon endon( "hi_priority_target" ); 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; return;
} }
wait 0,05;
wait 0.05;
} }
} }
@ -472,55 +504,50 @@ targeting_thread( weapon, trigger )
self endon( "equip_springpad_zm_taken" ); self endon( "equip_springpad_zm_taken" );
weapon endon( "death" ); weapon endon( "death" );
weapon.zombies_only = 1; weapon.zombies_only = 1;
while ( isDefined( weapon ) )
while ( isdefined( weapon ) )
{ {
if ( weapon.is_armed ) if ( weapon.is_armed )
{ {
zombies = getaiarray( level.zombie_team ); zombies = getaiarray( level.zombie_team );
_a594 = zombies;
_k594 = getFirstArrayKey( _a594 ); foreach ( zombie in zombies )
while ( isDefined( _k594 ) )
{
zombie = _a594[ _k594 ];
if ( !isDefined( zombie ) || !isalive( zombie ) )
{
}
else
{
if ( isDefined( zombie.ignore_spring_pad ) && zombie.ignore_spring_pad )
{
break;
}
else
{ {
if ( !isdefined( zombie ) || !isalive( zombie ) )
continue;
if ( isdefined( zombie.ignore_spring_pad ) && zombie.ignore_spring_pad )
continue;
if ( zombie istouching( trigger ) ) if ( zombie istouching( trigger ) )
{
weapon springpad_add_fling_ent( zombie ); weapon springpad_add_fling_ent( zombie );
} }
}
}
_k594 = getNextArrayKey( _a594, _k594 );
}
players = get_players(); players = get_players();
_a622 = players;
_k622 = getFirstArrayKey( _a622 ); foreach ( player in players )
while ( isDefined( _k622 ) )
{ {
player = _a622[ _k622 ];
if ( is_player_valid( player ) && player istouching( trigger ) ) if ( is_player_valid( player ) && player istouching( trigger ) )
{ {
weapon springpad_add_fling_ent( player ); weapon springpad_add_fling_ent( player );
weapon.zombies_only = 0; weapon.zombies_only = 0;
} }
_k622 = getNextArrayKey( _a622, _k622 );
} }
if ( !weapon.zombies_only ) if ( !weapon.zombies_only )
{
weapon notify( "hi_priority_target" ); 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 ) springpad_add_fling_ent( ent )
@ -530,15 +557,31 @@ springpad_add_fling_ent( ent )
springpad_expired( weapon ) springpad_expired( weapon )
{ {
weapon maps/mp/zombies/_zm_equipment::dropped_equipment_destroy( 1 ); weapon maps\mp\zombies\_zm_equipment::dropped_equipment_destroy( 1 );
self maps/mp/zombies/_zm_equipment::equipment_release( "equip_springpad_zm" ); self maps\mp\zombies\_zm_equipment::equipment_release( "equip_springpad_zm" );
self.springpad_kills = 0; self.springpad_kills = 0;
} }
player_fling( origin, angles, velocity ) player_fling( origin, angles, velocity, weapon )
{ {
torigin = ( self.origin[ 0 ], self.origin[ 1 ], origin[ 2 ] ); 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(); wait_network_frame();
self setvelocity( velocity ); self setvelocity( velocity );
} }
@ -546,47 +589,44 @@ player_fling( origin, angles, velocity )
springpadthinkcleanup( trigger ) springpadthinkcleanup( trigger )
{ {
self waittill( "death" ); self waittill( "death" );
if ( isDefined( trigger ) )
{ if ( isdefined( trigger ) )
trigger delete(); trigger delete();
}
} }
debugspringpad( radius ) debugspringpad( radius )
{ {
/# /#
color_armed = ( 0, 0, 1 ); color_armed = ( 0, 1, 0 );
color_unarmed = vectorScale( ( 0, 0, 1 ), 0,65 ); color_unarmed = vectorscale( ( 1, 1, 0 ), 0.65 );
while ( isDefined( self ) )
while ( isdefined( self ) )
{ {
if ( getDvarInt( #"EB512CB7" ) ) if ( getdvarint( _hash_EB512CB7 ) )
{ {
if ( isDefined( self.trigger ) ) if ( isdefined( self.trigger ) )
{ {
color = color_unarmed; color = color_unarmed;
if ( isDefined( self.is_armed ) && self.is_armed )
{ if ( isdefined( self.is_armed ) && self.is_armed )
color = color_armed; color = color_armed;
}
vec = self.trigger.extent; vec = self.trigger.extent;
box( self.trigger.origin, vec * -1, vec, self.trigger.angles[ 1 ], color, 1, 0, 1 ); box( self.trigger.origin, vec * -1, vec, self.trigger.angles[1], color, 1, 0, 1 );
} }
color = ( 0, 0, 1 );
color = ( 0, 1, 0 );
text = ""; text = "";
if ( isDefined( self.springpad_kills ) )
{ if ( isdefined( self.springpad_kills ) )
text = "" + 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 + "]"; 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; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_score; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_laststand; #include common_scripts\utility;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_weapons;
#include common_scripts/utility; #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( weapon_name );
precacheitem( flourish_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" ); 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 ) )
{ {
knife_model = getent( melee_weapon_triggers[i].target, "targetname" );
if ( isdefined( knife_model ) )
knife_model hide(); knife_model hide();
melee_weapon_triggers[i] thread melee_weapon_think( weapon_name, cost, flourish_fn, vo_dialog_id, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name );
if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) )
{
melee_weapon_triggers[i] sethintstring( hint_string, cost );
if ( getdvarint( "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 );
} }
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 ); else
melee_weapon_triggers[ i ] sethintstring( hint_string, cost ); melee_weapon_triggers[i] setcursorhint( "HINT_NOICON" );
melee_weapon_triggers[ i ] setcursorhint( "HINT_NOICON" );
melee_weapon_triggers[ i ] usetriggerrequirelookat();
i++;
} }
else
{
weapon_display = get_weapon_display_name( weapon_name );
hint_string = &"ZOMBIE_WEAPONCOSTONLY";
melee_weapon_triggers[i] sethintstring( hint_string, weapon_display, cost );
if ( getdvarint( "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();
}
melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" ); melee_weapon_structs = getstructarray( wallbuy_targetname, "targetname" );
i = 0;
while ( i < melee_weapon_structs.size ) 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 );
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 ); register_melee_weapon_for_level( weapon_name );
if ( !isDefined( level.ballistic_weapon_name ) )
{ if ( !isdefined( level.ballistic_weapon_name ) )
level.ballistic_weapon_name = []; level.ballistic_weapon_name = [];
}
level.ballistic_weapon_name[ weapon_name ] = ballistic_weapon_name; level.ballistic_weapon_name[weapon_name] = ballistic_weapon_name;
if ( !isDefined( level.ballistic_upgraded_weapon_name ) )
{ if ( !isdefined( level.ballistic_upgraded_weapon_name ) )
level.ballistic_upgraded_weapon_name = []; level.ballistic_upgraded_weapon_name = [];
level.ballistic_upgraded_weapon_name[weapon_name] = ballistic_upgraded_weapon_name;
/#
if ( !isdefined( level.zombie_weapons[weapon_name] ) )
{
if ( isdefined( level.devgui_add_weapon ) )
[[ level.devgui_add_weapon ]]( weapon_name, "", weapon_name, cost );
} }
level.ballistic_upgraded_weapon_name[ weapon_name ] = ballistic_upgraded_weapon_name; #/
} }
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 ) 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( stub ) )
{
if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) )
{ {
stub.hint_string = hint_string; 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.cost = cost;
stub.weapon_name = weapon_name; 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.vo_dialog_id = vo_dialog_id;
stub.flourish_weapon_name = flourish_weapon_name; stub.flourish_weapon_name = flourish_weapon_name;
stub.ballistic_weapon_name = ballistic_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 ) add_stub( stub, weapon_name )
{ {
melee_weapon = undefined; 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 ) if ( level._melee_weapons[i].weapon_name == weapon_name )
{ {
melee_weapon = level._melee_weapons[ i ]; melee_weapon = level._melee_weapons[i];
break; 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 ) give_melee_weapon_by_name( weapon_name )
{ {
melee_weapon = undefined; 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 ) if ( level._melee_weapons[i].weapon_name == weapon_name )
{ {
melee_weapon = level._melee_weapons[ i ]; melee_weapon = level._melee_weapons[i];
break; 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 );
} }
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, has_weapon, give_weapon, take_weapon, flourish_fn ) 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 = spawnstruct();
melee_weapon.weapon_name = weapon_name; 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.wallbuy_targetname = wallbuy_targetname;
melee_weapon.hint_string = hint_string; melee_weapon.hint_string = hint_string;
melee_weapon.vo_dialog_id = vo_dialog_id; 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; 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[ level._melee_weapons.size ] = melee_weapon; 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() spectator_respawn_all()
{ {
i = 0; for ( i = 0; i < level._melee_weapons.size; i++ )
while ( i < level._melee_weapons.size ) self spectator_respawn( level._melee_weapons[i].wallbuy_targetname, level._melee_weapons[i].weapon_name );
{
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++;
}
} }
spectator_respawn( wallbuy_targetname, take_weapon, has_weapon ) spectator_respawn( wallbuy_targetname, weapon_name )
{ {
melee_triggers = getentarray( wallbuy_targetname, "targetname" ); melee_triggers = getentarray( wallbuy_targetname, "targetname" );
players = get_players(); players = get_players();
i = 0;
while ( i < melee_triggers.size ) for ( i = 0; i < melee_triggers.size; i++ )
{ {
melee_triggers[ i ] setvisibletoall(); 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; for ( j = 0; j < players.size; j++ )
while ( j < players.size )
{ {
if ( players[ j ] [[ has_weapon ]]() ) if ( !players[j] player_can_see_weapon_prompt( weapon_name ) )
{ melee_triggers[i] setinvisibletoplayer( players[j] );
melee_triggers[ i ] setinvisibletoplayer( players[ j ] );
}
j++;
} }
} }
i++;
} }
} }
trigger_hide_all() trigger_hide_all()
{ {
i = 0; for ( i = 0; i < level._melee_weapons.size; i++ )
while ( i < level._melee_weapons.size ) self trigger_hide( level._melee_weapons[i].wallbuy_targetname );
{
self trigger_hide( level._melee_weapons[ i ].wallbuy_targetname );
i++;
}
} }
trigger_hide( wallbuy_targetname ) trigger_hide( wallbuy_targetname )
{ {
melee_triggers = getentarray( wallbuy_targetname, "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 );
melee_triggers[ i ] setinvisibletoplayer( self );
i++;
}
} }
has_any_ballistic_knife() has_any_ballistic_knife()
{ {
if ( self hasweapon( "knife_ballistic_zm" ) ) if ( self hasweapon( "knife_ballistic_zm" ) )
{ return true;
return 1;
}
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) ) if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{ {
return 1; if ( self hasweapon( level._melee_weapons[i].ballistic_weapon_name ) )
return true;
if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
return true;
} }
i = 0;
while ( i < level._melee_weapons.size ) return false;
{
if ( self hasweapon( level._melee_weapons[ i ].ballistic_weapon_name ) )
{
return 1;
}
if ( self hasweapon( level._melee_weapons[ i ].ballistic_upgraded_weapon_name ) )
{
return 1;
}
i++;
}
return 0;
} }
has_upgraded_ballistic_knife() has_upgraded_ballistic_knife()
{ {
if ( self hasweapon( "knife_ballistic_upgraded_zm" ) ) if ( self hasweapon( "knife_ballistic_upgraded_zm" ) )
return true;
for ( i = 0; i < level._melee_weapons.size; i++ )
{ {
return 1; if ( self hasweapon( level._melee_weapons[i].ballistic_upgraded_weapon_name ) )
return true;
} }
i = 0;
while ( i < level._melee_weapons.size ) return false;
{
if ( self hasweapon( level._melee_weapons[ i ].ballistic_upgraded_weapon_name ) )
{
return 1;
}
i++;
}
return 0;
} }
give_ballistic_knife( weapon_string, upgraded ) give_ballistic_knife( weapon_string, upgraded )
{ {
current_melee_weapon = self get_player_melee_weapon(); current_melee_weapon = self get_player_melee_weapon();
if ( isDefined( 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 ] ) ) 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];
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];
{
weapon_string = level.ballistic_weapon_name[ current_melee_weapon ];
}
} }
return weapon_string; return weapon_string;
} }
change_melee_weapon( weapon_name, current_weapon ) change_melee_weapon( weapon_name, current_weapon )
{ {
current_melee_weapon = self get_player_melee_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 ); self takeweapon( current_melee_weapon );
unacquire_weapon_toggle( current_melee_weapon ); unacquire_weapon_toggle( current_melee_weapon );
} }
self set_player_melee_weapon( weapon_name ); self set_player_melee_weapon( weapon_name );
had_ballistic = 0; had_ballistic = 0;
had_ballistic_upgraded = 0; had_ballistic_upgraded = 0;
ballistic_was_primary = 0; ballistic_was_primary = 0;
primaryweapons = self getweaponslistprimaries(); primaryweapons = self getweaponslistprimaries();
i = 0;
while ( i < primaryweapons.size ) for ( i = 0; i < primaryweapons.size; i++ )
{ {
primary_weapon = primaryweapons[ i ]; primary_weapon = primaryweapons[i];
if ( issubstr( primary_weapon, "knife_ballistic_" ) ) if ( issubstr( primary_weapon, "knife_ballistic_" ) )
{ {
had_ballistic = 1; had_ballistic = 1;
if ( primary_weapon == current_weapon ) if ( primary_weapon == current_weapon )
{
ballistic_was_primary = 1; ballistic_was_primary = 1;
}
self notify( "zmb_lost_knife" ); self notify( "zmb_lost_knife" );
self takeweapon( primary_weapon ); self takeweapon( primary_weapon );
unacquire_weapon_toggle( primary_weapon ); unacquire_weapon_toggle( primary_weapon );
if ( issubstr( primary_weapon, "upgraded" ) ) if ( issubstr( primary_weapon, "upgraded" ) )
{
had_ballistic_upgraded = 1; had_ballistic_upgraded = 1;
} }
} }
i++;
}
if ( had_ballistic ) if ( had_ballistic )
{ {
if ( had_ballistic_upgraded ) if ( had_ballistic_upgraded )
{ {
new_ballistic = level.ballistic_upgraded_weapon_name[ weapon_name ]; new_ballistic = level.ballistic_upgraded_weapon_name[weapon_name];
if ( ballistic_was_primary ) if ( ballistic_was_primary )
{
current_weapon = new_ballistic; 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 else
{ {
new_ballistic = level.ballistic_weapon_name[ weapon_name ]; new_ballistic = level.ballistic_weapon_name[weapon_name];
if ( ballistic_was_primary ) if ( ballistic_was_primary )
{
current_weapon = new_ballistic; current_weapon = new_ballistic;
}
self giveweapon( new_ballistic, 0 ); self giveweapon( new_ballistic, 0 );
} }
} }
return current_weapon; 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; self.first_time_triggered = 0;
while ( isDefined( self.stub ) )
if ( isdefined( self.stub ) )
{ {
self endon( "kill_trigger" ); 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; self.first_time_triggered = self.stub.first_time_triggered;
}
weapon_name = self.stub.weapon_name; weapon_name = self.stub.weapon_name;
cost = self.stub.cost; cost = self.stub.cost;
has_weapon = self.stub.has_weapon;
give_weapon = self.stub.give_weapon;
flourish_fn = self.stub.flourish_fn; flourish_fn = self.stub.flourish_fn;
vo_dialog_id = self.stub.vo_dialog_id; vo_dialog_id = self.stub.vo_dialog_id;
flourish_weapon_name = self.stub.flourish_weapon_name; flourish_weapon_name = self.stub.flourish_weapon_name;
ballistic_weapon_name = self.stub.ballistic_weapon_name; ballistic_weapon_name = self.stub.ballistic_weapon_name;
ballistic_upgraded_weapon_name = self.stub.ballistic_upgraded_weapon_name; ballistic_upgraded_weapon_name = self.stub.ballistic_upgraded_weapon_name;
players = getplayers(); 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; for ( i = 0; i < players.size; i++ )
while ( i < players.size )
{ {
if ( players[ i ] [[ has_weapon ]]() ) if ( !players[i] player_can_see_weapon_prompt( weapon_name ) )
{ self setinvisibletoplayer( players[i] );
self setinvisibletoplayer( players[ i ] );
}
i++;
} }
} }
} }
for ( ;; )
for (;;)
{ {
self waittill( "trigger", player ); self waittill( "trigger", player );
if ( !is_player_valid( player ) ) if ( !is_player_valid( player ) )
{ {
player thread ignore_triggers( 0,5 ); player thread ignore_triggers( 0.5 );
continue; continue;
} }
else if ( player in_revive_trigger() )
if ( player in_revive_trigger() )
{ {
wait 0,1; wait 0.1;
continue; continue;
} }
else if ( player isthrowinggrenade() )
if ( player isthrowinggrenade() )
{ {
wait 0,1; wait 0.1;
continue; continue;
} }
else if ( player.is_drinking > 0 )
if ( player.is_drinking > 0 )
{ {
wait 0,1; wait 0.1;
continue; 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; continue;
} }
else
{
if ( player isswitchingweapons() ) if ( player isswitchingweapons() )
{ {
wait 0,1; wait 0.1;
break; 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; wait 0.1;
break; 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;
{ continue;
wait 0,1;
break;
} }
else
{ player_has_weapon = player hasweapon( weapon_name );
player_has_weapon = player [[ has_weapon ]]();
if ( !player_has_weapon ) 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 ( player.score >= cost )
{ {
if ( self.first_time_triggered == 0 ) if ( self.first_time_triggered == 0 )
{ {
model = getent( self.target, "targetname" ); model = getent( self.target, "targetname" );
if ( isDefined( model ) )
{ if ( isdefined( model ) )
model thread melee_weapon_show( player ); model thread melee_weapon_show( player );
} else if ( isdefined( self.clientfieldname ) )
else
{
if ( isDefined( self.clientfieldname ) )
{
level setclientfield( self.clientfieldname, 1 ); level setclientfield( self.clientfieldname, 1 );
}
}
self.first_time_triggered = 1; self.first_time_triggered = 1;
if ( isDefined( self.stub ) )
{ if ( isdefined( self.stub ) )
self.stub.first_time_triggered = 1; 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" ); 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 else
{ {
play_sound_on_ent( "no_purchase" ); 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 ); self setinvisibletoplayer( player );
} }
}
}
}
}
}
} }
melee_weapon_show( player ) melee_weapon_show( player )
{ {
player_angles = vectorToAngle( player.origin - self.origin ); player_angles = vectortoangles( player.origin - self.origin );
player_yaw = player_angles[ 1 ]; player_yaw = player_angles[1];
weapon_yaw = self.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 ) if ( yaw_diff > 0 )
{
yaw = weapon_yaw - 90; yaw = weapon_yaw - 90;
}
else else
{
yaw = weapon_yaw + 90; yaw = weapon_yaw + 90;
}
self.og_origin = self.origin; self.og_origin = self.origin;
self.origin += anglesToForward( ( 0, yaw, 0 ) ) * 8; self.origin += anglestoforward( ( 0, yaw, 0 ) ) * 8;
wait 0,05; wait 0.05;
self show(); self show();
play_sound_at_pos( "weapon_show", self.origin, self ); play_sound_at_pos( "weapon_show", self.origin, self );
time = 1; time = 1;
self moveto( self.og_origin, time ); 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 ) 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 ) ) if ( isdefined( flourish_fn ) )
{
self thread [[ flourish_fn ]](); self thread [[ flourish_fn ]]();
}
gun = self do_melee_weapon_flourish_begin( flourish_weapon_name ); 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 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 ); 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; return;
}
self [[ give_weapon ]](); if ( !( isdefined( level._allow_melee_weapon_switching ) && level._allow_melee_weapon_switching ) )
if ( isDefined( level._allow_melee_weapon_switching ) && !level._allow_melee_weapon_switching )
{
if ( isDefined( trigger ) )
{ {
if ( isdefined( trigger ) )
trigger setinvisibletoplayer( self ); trigger setinvisibletoplayer( self );
}
self trigger_hide_all(); 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(); self enable_player_move_states();
weapon = flourish_weapon_name; 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 takeweapon( weapon );
self.lastactiveweapon = "none"; self.lastactiveweapon = "none";
return; return;
} }
self takeweapon( weapon ); self takeweapon( weapon );
self giveweapon( weapon_name ); self giveweapon( weapon_name );
gun = change_melee_weapon( weapon_name, gun ); gun = change_melee_weapon( weapon_name, gun );
if ( self hasweapon( "knife_zm" ) ) if ( self hasweapon( "knife_zm" ) )
{
self takeweapon( "knife_zm" ); self takeweapon( "knife_zm" );
}
if ( self is_multiple_drinking() ) if ( self is_multiple_drinking() )
{ {
self decrement_is_drinking(); self decrement_is_drinking();
@ -537,20 +564,17 @@ do_melee_weapon_flourish_end( gun, flourish_weapon_name, weapon_name, ballistic_
return; return;
} }
else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) )
{
self switchtoweapon( gun ); self switchtoweapon( gun );
}
else else
{ {
primaryweapons = self getweaponslistprimaries(); primaryweapons = self getweaponslistprimaries();
if ( isDefined( primaryweapons ) && primaryweapons.size > 0 )
{ if ( isdefined( primaryweapons ) && primaryweapons.size > 0 )
self switchtoweapon( primaryweapons[ 0 ] ); self switchtoweapon( primaryweapons[0] );
}
} }
self waittill( "weapon_change_complete" ); 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(); self decrement_is_drinking();
}
} }

View File

@ -1,10 +1,15 @@
#include maps/mp/zombies/_zm_stats; // T6 GSC SOURCE
#include common_scripts/utility; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/_utility; #include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_stats;
init() 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_projectile" );
precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" ); precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" );
@ -17,9 +22,12 @@ on_spawn( watcher, player )
player endon( "disconnect" ); player endon( "disconnect" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
level endon( "game_ended" ); level endon( "game_ended" );
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone ); self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
isfriendly = 0; isfriendly = 0;
if ( isDefined( endpos ) )
if ( isdefined( endpos ) )
{ {
retrievable_model = spawn( "script_model", endpos ); retrievable_model = spawn( "script_model", endpos );
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" ); retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
@ -27,47 +35,38 @@ on_spawn( watcher, player )
retrievable_model.owner = player; retrievable_model.owner = player;
retrievable_model.angles = angles; retrievable_model.angles = angles;
retrievable_model.name = watcher.weapon; retrievable_model.name = watcher.weapon;
if ( isDefined( prey ) )
if ( isdefined( prey ) )
{ {
if ( isplayer( prey ) && player.team == prey.team ) if ( isplayer( prey ) && player.team == prey.team )
{
isfriendly = 1; isfriendly = 1;
} else if ( isai( prey ) && player.team == prey.team )
else
{
if ( isai( prey ) && player.team == prey.team )
{
isfriendly = 1; isfriendly = 1;
}
}
if ( !isfriendly ) if ( !isfriendly )
{ {
retrievable_model linkto( prey, bone ); retrievable_model linkto( prey, bone );
retrievable_model thread force_drop_knives_to_ground_on_death( player, prey ); retrievable_model thread force_drop_knives_to_ground_on_death( player, prey );
} }
else else if ( isfriendly )
{
if ( isfriendly )
{ {
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) ); retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
normal = ( 0, 0, 1 ); normal = ( 0, 0, 1 );
} }
} }
}
watcher.objectarray[ watcher.objectarray.size ] = retrievable_model; watcher.objectarray[watcher.objectarray.size] = retrievable_model;
if ( isfriendly ) if ( isfriendly )
{
retrievable_model waittill( "stationary" ); retrievable_model waittill( "stationary" );
}
retrievable_model thread drop_knives_to_ground( player ); retrievable_model thread drop_knives_to_ground( player );
if ( isfriendly ) if ( isfriendly )
{ player notify( "ballistic_knife_stationary", retrievable_model, normal );
player notify( "ballistic_knife_stationary" );
}
else else
{ player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
player notify( "ballistic_knife_stationary" );
}
retrievable_model thread wait_to_show_glowing_model( prey ); retrievable_model thread wait_to_show_glowing_model( prey );
} }
} }
@ -86,52 +85,59 @@ on_spawn_retrieve_trigger( watcher, player )
player endon( "disconnect" ); player endon( "disconnect" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
level endon( "game_ended" ); level endon( "game_ended" );
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey ); player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
if ( !isDefined( retrievable_model ) )
{ if ( !isdefined( retrievable_model ) )
return; return;
}
trigger_pos = []; trigger_pos = [];
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
{ {
trigger_pos[ 0 ] = prey.origin[ 0 ]; trigger_pos[0] = prey.origin[0];
trigger_pos[ 1 ] = prey.origin[ 1 ]; trigger_pos[1] = prey.origin[1];
trigger_pos[ 2 ] = prey.origin[ 2 ] + 10; trigger_pos[2] = prey.origin[2] + 10;
} }
else else
{ {
trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( 10 * normal[ 0 ] ); trigger_pos[0] = retrievable_model.origin[0] + 10 * normal[0];
trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( 10 * normal[ 1 ] ); trigger_pos[1] = retrievable_model.origin[1] + 10 * normal[1];
trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( 10 * normal[ 2 ] ); trigger_pos[2] = retrievable_model.origin[2] + 10 * normal[2];
} }
pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 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 setcursorhint( "HINT_NOICON" );
}
pickup_trigger.owner = player; pickup_trigger.owner = player;
retrievable_model.retrievabletrigger = pickup_trigger; retrievable_model.retrievabletrigger = pickup_trigger;
hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP"; hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP";
if ( isDefined( hint_string ) )
{ if ( isdefined( hint_string ) )
pickup_trigger sethintstring( hint_string ); pickup_trigger sethintstring( hint_string );
}
else else
{
pickup_trigger sethintstring( &"GENERIC_PICKUP" ); pickup_trigger sethintstring( &"GENERIC_PICKUP" );
}
pickup_trigger setteamfortrigger( player.team ); pickup_trigger setteamfortrigger( player.team );
player clientclaimtrigger( pickup_trigger ); player clientclaimtrigger( pickup_trigger );
pickup_trigger enablelinkto(); pickup_trigger enablelinkto();
if ( isDefined( prey ) )
{ if ( isdefined( prey ) )
pickup_trigger linkto( prey ); pickup_trigger linkto( prey );
}
else else
{
pickup_trigger linkto( retrievable_model ); pickup_trigger linkto( retrievable_model );
}
if ( isDefined( level.knife_planted ) ) if ( isdefined( level.knife_planted ) )
{
[[ level.knife_planted ]]( retrievable_model, pickup_trigger, prey ); [[ 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 ); 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 ); player thread watch_shutdown( pickup_trigger, retrievable_model );
} }
@ -140,12 +146,13 @@ debug_print( endpos )
{ {
/# /#
self endon( "death" ); self endon( "death" );
while ( 1 )
while ( true )
{ {
print3d( endpos, "pickup_trigger" ); print3d( endpos, "pickup_trigger" );
wait 0,05; wait 0.05;
#/
} }
#/
} }
watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse ) 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( "death" );
self endon( "delete" ); self endon( "delete" );
level endon( "game_ended" ); level endon( "game_ended" );
while ( 1 ) max_ammo = weaponmaxammo( weapon ) + 1;
autorecover = is_true( level.ballistic_knife_autorecover );
while ( true )
{ {
trigger waittill( "trigger", player ); trigger waittill( "trigger", player );
while ( !isalive( player ) )
{ if ( !isalive( player ) )
continue; continue;
}
while ( !player isonground() ) if ( !player isonground() && !is_true( trigger.force_pickup ) )
{
continue; continue;
}
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
{
continue; continue;
}
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
{
continue; continue;
}
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() ) ammo_stock = player getweaponammostock( weapon );
{ ammo_clip = player getweaponammoclip( weapon );
if ( isDefined( playersoundonuse ) ) 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 ); player playlocalsound( playersoundonuse );
}
if ( isDefined( npcsoundonuse ) ) if ( isdefined( npcsoundonuse ) )
{
player playsound( npcsoundonuse ); player playsound( npcsoundonuse );
}
player thread [[ callback ]]( weapon, model, trigger ); player thread [[ callback ]]( weapon, model, trigger );
return; break;
}
else
{
} }
} }
} }
pick_up( weapon, model, trigger ) pick_up( weapon, model, trigger )
{ {
if ( self hasweapon( weapon ) )
{
current_weapon = self getcurrentweapon(); current_weapon = self getcurrentweapon();
if ( current_weapon != weapon ) if ( current_weapon != weapon )
{ {
clip_ammo = self getweaponammoclip( weapon ); clip_ammo = self getweaponammoclip( weapon );
if ( !clip_ammo ) if ( !clip_ammo )
{
self setweaponammoclip( weapon, 1 ); self setweaponammoclip( weapon, 1 );
}
else else
{ {
new_ammo_stock = self getweaponammostock( weapon ) + 1; new_ammo_stock = self getweaponammostock( weapon ) + 1;
@ -212,27 +228,28 @@ pick_up( weapon, model, trigger )
new_ammo_stock = self getweaponammostock( weapon ) + 1; new_ammo_stock = self getweaponammostock( weapon ) + 1;
self setweaponammostock( weapon, new_ammo_stock ); 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(); model destroy_ent();
trigger destroy_ent(); trigger destroy_ent();
} }
destroy_ent() destroy_ent()
{ {
if ( isDefined( self ) ) if ( isdefined( self ) )
{
if ( isDefined( self.glowing_model ) )
{ {
if ( isdefined( self.glowing_model ) )
self.glowing_model delete(); self.glowing_model delete();
}
self delete(); self delete();
} }
} }
watch_shutdown( trigger, model ) watch_shutdown( trigger, model )
{ {
self waittill_any( "death", "disconnect", "zmb_lost_knife" ); self waittill_any( "death_or_disconnect", "zmb_lost_knife" );
trigger destroy_ent(); trigger destroy_ent();
model destroy_ent(); model destroy_ent();
} }
@ -241,12 +258,14 @@ drop_knives_to_ground( player )
{ {
player endon( "death" ); player endon( "death" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
for ( ;; )
for (;;)
{ {
level waittill( "drop_objects_to_ground", origin, radius ); 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 ); self thread update_retrieve_trigger( player );
} }
} }
@ -256,9 +275,11 @@ force_drop_knives_to_ground_on_death( player, prey )
{ {
self endon( "death" ); self endon( "death" );
player endon( "zmb_lost_knife" ); player endon( "zmb_lost_knife" );
prey waittill( "death" ); prey waittill( "death" );
self unlink(); 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 ); self thread update_retrieve_trigger( player );
} }
@ -266,13 +287,16 @@ update_retrieve_trigger( player )
{ {
self endon( "death" ); self endon( "death" );
player endon( "zmb_lost_knife" ); 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 ); self [[ level.custom_update_retrieve_trigger ]]( player );
return; return;
} }
self waittill( "stationary" ); self waittill( "stationary" );
trigger = self.retrievabletrigger; trigger = self.retrievabletrigger;
trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 ); trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
trigger linkto( self ); trigger linkto( self );
} }

View File

@ -1,53 +1,19 @@
#include maps/mp/zombies/_zm_weapons; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_utility; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/_utility; #include common_scripts\utility;
#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() init()
{ {
if ( isDefined( level.bowie_cost ) ) if ( isdefined( level.bowie_cost ) )
{
cost = level.bowie_cost; cost = level.bowie_cost;
}
else else
{
cost = 3000; 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::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_melee_weapon::spectator_respawn( "bowie_upgrade", ::take_bowie, ::has_bowie ); maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie_upgraded" );
}
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()
{
} }

View File

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

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,79 +1,73 @@
#include maps/mp/zombies/_zm_audio; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_spawner; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_weapons; #include common_scripts\utility;
#include maps/mp/zombies/_zm_net; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_net;
#include common_scripts/utility; #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() init()
{ {
registerclientfield( "toplayer", "tazer_flourish", 1, 1, "int" ); registerclientfield( "toplayer", "tazer_flourish", 1, 1, "int" );
register_melee_weapon_for_level( "tazer_knuckles_zm" ); register_melee_weapon_for_level( "tazer_knuckles_zm" );
if ( isDefined( level.tazer_cost ) )
{ if ( isdefined( level.tazer_cost ) )
cost = level.tazer_cost; cost = level.tazer_cost;
}
else else
{
cost = 6000; cost = 6000;
}
level.use_tazer_impact_fx = 0; 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_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" );
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee_upgraded" ); 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_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_vomit"] = loadfx( "maps/zombie/fx_zmb_taser_vomit" );
level._effect[ "fx_zmb_taser_flourish" ] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" ); level._effect["fx_zmb_taser_flourish"] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" );
if ( level.script != "zm_transit" ) if ( level.script != "zm_transit" )
{ {
level._effect[ "fx_zmb_tazer_impact" ] = loadfx( "weapon/taser/fx_taser_knuckles_impact_zmb" ); level._effect["fx_zmb_tazer_impact"] = loadfx( "weapon/taser/fx_taser_knuckles_impact_zmb" );
level.use_tazer_impact_fx = 1; level.use_tazer_impact_fx = 1;
} }
level.tazer_flourish_delay = 0,5;
}
spectator_respawn() level.tazer_flourish_delay = 0.5;
{
maps/mp/zombies/_zm_melee_weapon::spectator_respawn( "tazer_upgrade", ::take_tazer, ::has_tazer );
} }
watch_bodily_functions() 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; return;
}
while ( 1 ) while ( isdefined( self ) && isalive( self ) )
{ {
self waittill( "damage", amount, attacker, direction_vec, point, type ); self waittill( "damage", amount, attacker, direction_vec, point, type );
if ( !isDefined( self ) )
{ if ( !isdefined( self ) )
return; return;
}
if ( !isDefined( attacker ) || !isplayer( attacker ) ) if ( !isdefined( attacker ) || !isplayer( attacker ) )
{
continue; continue;
}
while ( type != "MOD_MELEE" ) if ( type != "MOD_MELEE" )
{
continue; continue;
}
if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped ) if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped )
{
continue; continue;
}
ch = randomint( 100 ); ch = randomint( 100 );
if ( ch < 4 ) if ( ch < 4 )
{ playfxontag( level._effect["fx_zmb_taser_vomit"], self, "j_neck" );
playfxontag( level._effect[ "fx_zmb_taser_vomit" ], self, "j_neck" );
}
if ( level.use_tazer_impact_fx ) if ( level.use_tazer_impact_fx )
{ {
tags = []; tags = [];
tags[ 0 ] = "J_Head"; tags[0] = "J_Head";
tags[ 1 ] = "J_Neck"; tags[1] = "J_Neck";
playfxontag( level._effect[ "fx_zmb_tazer_impact" ], self, random( tags ) ); playfxontag( level._effect["fx_zmb_tazer_impact"], self, random( tags ) );
} }
} }
} }
@ -86,9 +80,11 @@ onplayerconnect()
onplayerspawned() onplayerspawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
for (;;)
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
self thread watchtazerknucklemelee(); self thread watchtazerknucklemelee();
} }
} }
@ -96,53 +92,30 @@ onplayerspawned()
watchtazerknucklemelee() watchtazerknucklemelee()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
for (;;)
{ {
self waittill( "weapon_melee", weapon ); self waittill( "weapon_melee", weapon );
if ( weapon == "tazer_knuckles_zm" ) if ( weapon == "tazer_knuckles_zm" )
{
self tazerknuckle_melee(); self tazerknuckle_melee();
} }
}
} }
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() tazer_flourish_fx()
{ {
self waittill( "weapon_change", newweapon ); self waittill( "weapon_change", newweapon );
if ( newweapon == "zombie_tazer_flourish" ) if ( newweapon == "zombie_tazer_flourish" )
{ {
self endon( "weapon_change" ); self endon( "weapon_change" );
wait level.tazer_flourish_delay; wait( level.tazer_flourish_delay );
self thread maps/mp/zombies/_zm_audio::playerexert( "hitmed" ); self thread maps\mp\zombies\_zm_audio::playerexert( "hitmed" );
self setclientfieldtoplayer( "tazer_flourish", 1 ); self setclientfieldtoplayer( "tazer_flourish", 1 );
wait_network_frame(); wait_network_frame();
self setclientfieldtoplayer( "tazer_flourish", 0 ); 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;
}