[Buried] Added gsc-tool decompiled GSCs.

This commit is contained in:
JezuzLizard 2022-02-25 22:09:59 -08:00
parent 0d2c068adb
commit 0d8e9c835a
88 changed files with 34601 additions and 36190 deletions

View File

@ -1,12 +1,14 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
self setmodel( "c_zom_player_engineer_fb" ); self setmodel( "c_zom_player_engineer_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
} }
precache() precache()
{ {
precachemodel( "c_zom_player_engineer_fb" ); precachemodel( "c_zom_player_engineer_fb" );
} }

View File

@ -1,12 +1,14 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
self setmodel( "c_zom_player_farmgirl_fb" ); self setmodel( "c_zom_player_farmgirl_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
} }
precache() precache()
{ {
precachemodel( "c_zom_player_farmgirl_fb" ); precachemodel( "c_zom_player_farmgirl_fb" );
} }

View File

@ -1,12 +1,14 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
self setmodel( "c_zom_player_oldman_fb" ); self setmodel( "c_zom_player_oldman_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
} }
precache() precache()
{ {
precachemodel( "c_zom_player_oldman_fb" ); precachemodel( "c_zom_player_oldman_fb" );
} }

View File

@ -1,12 +1,14 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
self setmodel( "c_zom_player_reporter_fb" ); self setmodel( "c_zom_player_reporter_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
} }
precache() precache()
{ {
precachemodel( "c_zom_player_reporter_fb" ); precachemodel( "c_zom_player_reporter_fb" );
} }

View File

@ -1,12 +1,14 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
self setmodel( "c_zom_zombie_buried_sgirl_player_fb" ); self setmodel( "c_zom_zombie_buried_sgirl_player_fb" );
self.voice = "american"; self.voice = "american";
self.skeleton = "base"; self.skeleton = "base";
} }
precache() precache()
{ {
precachemodel( "c_zom_zombie_buried_sgirl_player_fb" ); precachemodel( "c_zom_zombie_buried_sgirl_player_fb" );
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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,51 +1,55 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
register() register()
{ {
game[ "teamset" ] = []; game["teamset"] = [];
game[ "teamset" ][ "cdc" ] = ::cdc; game["teamset"]["cdc"] = ::cdc;
} }
level_init() level_init()
{ {
game[ "allies" ] = "cdc"; game["allies"] = "cdc";
game[ "axis" ] = "cia"; game["axis"] = "cia";
setdvar( "g_TeamName_Allies", &"ZMUI_CDC_SHORT" ); setdvar( "g_TeamName_Allies", &"ZMUI_CDC_SHORT" );
setdvar( "g_TeamName_Axis", &"ZMUI_CIA_SHORT" ); setdvar( "g_TeamName_Axis", &"ZMUI_CIA_SHORT" );
game[ "strings" ][ "allies_win" ] = &"ZM_CDC_WIN_MATCH"; game["strings"]["allies_win"] = &"ZM_CDC_WIN_MATCH";
game[ "strings" ][ "allies_win_round" ] = &"ZM_CDC_WIN_ROUND"; game["strings"]["allies_win_round"] = &"ZM_CDC_WIN_ROUND";
game[ "strings" ][ "allies_mission_accomplished" ] = &"ZM_CDC_MISSION_ACCOMPLISHED"; game["strings"]["allies_mission_accomplished"] = &"ZM_CDC_MISSION_ACCOMPLISHED";
game[ "strings" ][ "allies_eliminated" ] = &"ZM_CDC_ELIMINATED"; game["strings"]["allies_eliminated"] = &"ZM_CDC_ELIMINATED";
game[ "strings" ][ "allies_forfeited" ] = &"ZM_CDC_FORFEITED"; game["strings"]["allies_forfeited"] = &"ZM_CDC_FORFEITED";
game[ "strings" ][ "allies_name" ] = &"ZM_CDC_NAME"; game["strings"]["allies_name"] = &"ZM_CDC_NAME";
game[ "music" ][ "spawn_allies" ] = "SPAWN_OPS"; game["music"]["spawn_allies"] = "SPAWN_OPS";
game[ "music" ][ "victory_allies" ] = "mus_victory_usa"; game["music"]["victory_allies"] = "mus_victory_usa";
game[ "icons" ][ "allies" ] = "faction_cdc"; game["icons"]["allies"] = "faction_cdc";
game[ "colors" ][ "allies" ] = ( 0, 0, 0 ); game["colors"]["allies"] = ( 0, 0, 0 );
game[ "voice" ][ "allies" ] = "vox_st6_"; game["voice"]["allies"] = "vox_st6_";
setdvar( "scr_allies", "marines" ); setdvar( "scr_allies", "marines" );
game[ "strings" ][ "axis_win" ] = &"ZM_CIA_WIN_MATCH"; game["strings"]["axis_win"] = &"ZM_CIA_WIN_MATCH";
game[ "strings" ][ "axis_win_round" ] = &"ZM_CIA_WIN_ROUND"; game["strings"]["axis_win_round"] = &"ZM_CIA_WIN_ROUND";
game[ "strings" ][ "axis_mission_accomplished" ] = &"ZM_CIA_MISSION_ACCOMPLISHED"; game["strings"]["axis_mission_accomplished"] = &"ZM_CIA_MISSION_ACCOMPLISHED";
game[ "strings" ][ "axis_eliminated" ] = &"ZM_CIA_ELIMINATED"; game["strings"]["axis_eliminated"] = &"ZM_CIA_ELIMINATED";
game[ "strings" ][ "axis_forfeited" ] = &"ZM_CIA_FORFEITED"; game["strings"]["axis_forfeited"] = &"ZM_CIA_FORFEITED";
game[ "strings" ][ "axis_name" ] = &"ZM_CIA_NAME"; game["strings"]["axis_name"] = &"ZM_CIA_NAME";
game[ "music" ][ "spawn_axis" ] = "SPAWN_RUS"; game["music"]["spawn_axis"] = "SPAWN_RUS";
game[ "music" ][ "victory_axis" ] = "mus_victory_soviet"; game["music"]["victory_axis"] = "mus_victory_soviet";
game[ "icons" ][ "axis" ] = "faction_cia"; game["icons"]["axis"] = "faction_cia";
game[ "colors" ][ "axis" ] = ( 0,65, 0,57, 0,41 ); game["colors"]["axis"] = ( 0.65, 0.57, 0.41 );
game[ "voice" ][ "axis" ] = "vox_pmc_"; game["voice"]["axis"] = "vox_pmc_";
} }
cdc() cdc()
{ {
allies(); allies();
axis(); axis();
} }
allies() allies()
{ {
} }
axis() axis()
{ {
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,184 +1,195 @@
#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()
{ {
if ( !is_gametype_active( "zclassic" ) ) if ( !is_gametype_active( "zclassic" ) )
{ return;
return;
} level thread achievement_buried_sidequest();
level thread achievement_buried_sidequest(); level thread achievement_im_your_huckleberry();
level thread achievement_im_your_huckleberry(); level.achievement_sound_func = ::achievement_sound_func;
level.achievement_sound_func = ::achievement_sound_func; onplayerconnect_callback( ::onplayerconnect );
onplayerconnect_callback( ::onplayerconnect );
} }
achievement_sound_func( achievement_name_lower ) achievement_sound_func( achievement_name_lower )
{ {
if ( !sessionmodeisonlinegame() ) if ( !sessionmodeisonlinegame() )
{ return;
return;
} self thread do_player_general_vox( "general", "achievement" );
self thread do_player_general_vox( "general", "achievement" );
} }
init_player_achievement_stats() init_player_achievement_stats()
{ {
if ( !is_gametype_active( "zclassic" ) ) if ( !is_gametype_active( "zclassic" ) )
{ return;
return;
} self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_buried_sidequest", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_buried_sidequest", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_ectoplasmic_residue", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_ectoplasmic_residue", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_im_your_huckleberry", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_im_your_huckleberry", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_death_from_below", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_death_from_below", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_candygram", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_candygram", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_awaken_the_gazebo", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_awaken_the_gazebo", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_revisionist_historian", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_revisionist_historian", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_mazed_and_confused", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_mazed_and_confused", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_fsirt_against_the_wall", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_fsirt_against_the_wall", 0 ); self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_when_the_revolution_comes", 0 );
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_when_the_revolution_comes", 0 );
} }
onplayerconnect() onplayerconnect()
{ {
self thread achievement_ectoplasmic_residue(); self thread achievement_ectoplasmic_residue();
self thread achievement_death_from_below(); self thread achievement_death_from_below();
self thread achievement_candygram(); self thread achievement_candygram();
self thread achievement_awaken_the_gazebo(); self thread achievement_awaken_the_gazebo();
self thread achievement_revisionist_historian(); self thread achievement_revisionist_historian();
self thread achievement_mazed_and_confused(); self thread achievement_mazed_and_confused();
self thread achievement_fsirt_against_the_wall(); self thread achievement_fsirt_against_the_wall();
self thread achievement_when_the_revolution_comes(); self thread achievement_when_the_revolution_comes();
} }
achievement_buried_sidequest() achievement_buried_sidequest()
{ {
level endon( "end_game" ); level endon( "end_game" );
level waittill_any( "sq_richtofen_complete", "sq_maxis_complete" ); level waittill_any( "sq_richtofen_complete", "sq_maxis_complete" );
/# /#
#/ #/
level giveachievement_wrapper( "ZM_DLC3_BURIED_SIDEQUEST", 1 ); level giveachievement_wrapper( "ZM_DLC3_BURIED_SIDEQUEST", 1 );
} }
achievement_im_your_huckleberry() achievement_im_your_huckleberry()
{ {
level endon( "end_game" ); level endon( "end_game" );
num_barriers_broken = 0; num_barriers_broken = 0;
while ( 1 )
{ while ( true )
level waittill( "sloth_breaks_barrier" ); {
num_barriers_broken++; level waittill( "sloth_breaks_barrier" );
if ( num_barriers_broken >= 8 )
{ num_barriers_broken++;
break;
} if ( num_barriers_broken >= 8 )
else break;
{ }
}
}
/# /#
#/ #/
level giveachievement_wrapper( "ZM_DLC3_IM_YOUR_HUCKLEBERRY", 1 ); level giveachievement_wrapper( "ZM_DLC3_IM_YOUR_HUCKLEBERRY", 1 );
} }
achievement_ectoplasmic_residue() achievement_ectoplasmic_residue()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_received_ghost_round_free_perk" );
self waittill( "player_received_ghost_round_free_perk" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_ECTOPLASMIC_RESIDUE" ); self giveachievement_wrapper( "ZM_DLC3_ECTOPLASMIC_RESIDUE" );
} }
achievement_death_from_below() achievement_death_from_below()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
num_subwoofer_deaths = 0; num_subwoofer_deaths = 0;
while ( 1 )
{ while ( true )
self waittill( "zombie_subwoofer_kill" ); {
num_subwoofer_deaths++; self waittill( "zombie_subwoofer_kill" );
if ( num_subwoofer_deaths >= 10 )
{ num_subwoofer_deaths++;
break;
} if ( num_subwoofer_deaths >= 10 )
else break;
{ }
}
}
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_DEATH_FROM_BELOW" ); self giveachievement_wrapper( "ZM_DLC3_DEATH_FROM_BELOW" );
} }
achievement_candygram() achievement_candygram()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_gives_sloth_candy" );
self waittill( "player_gives_sloth_candy" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_CANDYGRAM" ); self giveachievement_wrapper( "ZM_DLC3_CANDYGRAM" );
} }
achievement_awaken_the_gazebo() achievement_awaken_the_gazebo()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
level endon( "bank_withdrawal" ); level endon( "bank_withdrawal" );
level endon( "bank_teller_used" ); level endon( "bank_teller_used" );
level endon( "weapon_locker_grab" ); level endon( "weapon_locker_grab" );
self waittill( "pap_taken" );
if ( level.round_number > 1 ) self waittill( "pap_taken" );
{
return; if ( level.round_number > 1 )
} return;
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_AWAKEN_THE_GAZEBO" ); self giveachievement_wrapper( "ZM_DLC3_AWAKEN_THE_GAZEBO" );
} }
achievement_revisionist_historian() achievement_revisionist_historian()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_activates_timebomb" );
self waittill( "player_activates_timebomb" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_REVISIONIST_HISTORIAN" ); self giveachievement_wrapper( "ZM_DLC3_REVISIONIST_HISTORIAN" );
} }
achievement_mazed_and_confused() achievement_mazed_and_confused()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_stayed_in_maze_for_entire_high_level_round" );
self waittill( "player_stayed_in_maze_for_entire_high_level_round" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_MAZED_AND_CONFUSED" ); self giveachievement_wrapper( "ZM_DLC3_MAZED_AND_CONFUSED" );
} }
achievement_fsirt_against_the_wall() achievement_fsirt_against_the_wall()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_upgraded_lsat_from_wall" );
self waittill( "player_upgraded_lsat_from_wall" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_FSIRT_AGAINST_THE_WALL" ); self giveachievement_wrapper( "ZM_DLC3_FSIRT_AGAINST_THE_WALL" );
} }
achievement_when_the_revolution_comes() achievement_when_the_revolution_comes()
{ {
level endon( "end_game" ); level endon( "end_game" );
self endon( "disconnect" ); self endon( "disconnect" );
self waittill( "player_used_fountain_teleporter" );
self waittill( "player_used_fountain_teleporter" );
/# /#
#/ #/
self giveachievement_wrapper( "ZM_DLC3_WHEN_THE_REVOLUTION_COMES" ); self giveachievement_wrapper( "ZM_DLC3_WHEN_THE_REVOLUTION_COMES" );
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,428 +1,393 @@
#include maps/mp/zombies/_zm_ai_basic; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_zonemgr; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_spawner; #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_spawner;
#include maps\mp\zombies\_zm_zonemgr;
#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 = 1600; level.zombie_tracking_dist = 1600;
}
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 = 0.4;
{
level.zombie_tracking_wait = 0,4; while ( true )
} {
for ( ;; ) zombies = get_round_enemy_array();
{
while ( 1 ) if ( !isdefined( zombies ) || isdefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
{ {
zombies = get_round_enemy_array(); wait( level.zombie_tracking_wait );
if ( !isDefined( zombies ) || isDefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking ) continue;
{ }
wait level.zombie_tracking_wait; else
} {
} for ( i = 0; i < zombies.size; i++ )
else i = 0; {
while ( i < zombies.size ) if ( isdefined( zombies[i] ) && !( isdefined( zombies[i].ignore_distance_tracking ) && zombies[i].ignore_distance_tracking ) && ( isdefined( zombies[i].ignoreall ) && !zombies[i].ignoreall ) )
{ 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 && isDefined( zombies[ i ].ignoreall ) && !zombies[ i ].ignoreall ) }
{ }
zombies[ i ] thread delete_zombie_noone_looking( level.zombie_tracking_dist, level.zombie_tracking_high );
} wait( level.zombie_tracking_wait );
i++; }
}
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 ( self can_be_deleted_from_buried_special_zones() )
{ if ( self can_be_deleted_from_buried_special_zones() )
self.inview = 0; {
self.player_close = 0; self.inview = 0;
} self.player_close = 0;
else }
{ else
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;
} if ( !( isdefined( self.has_legs ) && self.has_legs ) )
if ( isDefined( self.has_legs ) && !self.has_legs ) how_close *= 1.5;
{
how_close *= 1,5; distance_squared_check = how_close * how_close;
} height_squared_check = how_high * how_high;
distance_squared_check = how_close * how_close; too_far_dist = distance_squared_check * 3;
height_squared_check = how_high * how_high;
too_far_dist = distance_squared_check * 3; if ( isdefined( level.zombie_tracking_too_far_dist ) )
if ( isDefined( level.zombie_tracking_too_far_dist ) ) too_far_dist = level.zombie_tracking_too_far_dist * level.zombie_tracking_too_far_dist;
{
too_far_dist = level.zombie_tracking_too_far_dist * level.zombie_tracking_too_far_dist; self.inview = 0;
} self.player_close = 0;
self.inview = 0; players = get_players();
self.player_close = 0;
players = get_players(); foreach ( player in players )
_a98 = players; {
_k98 = getFirstArrayKey( _a98 ); if ( player.sessionstate == "spectator" )
while ( isDefined( _k98 ) ) continue;
{
player = _a98[ _k98 ]; if ( isdefined( player.laststand ) && player.laststand && ( isdefined( self.favoriteenemy ) && self.favoriteenemy == player ) )
if ( player.sessionstate == "spectator" ) {
{ if ( !self can_zombie_see_any_player() )
} {
else if ( isDefined( player.laststand ) && player.laststand && isDefined( self.favoriteenemy ) && self.favoriteenemy == player ) self.favoriteenemy = undefined;
{ self.zombie_path_bad = 1;
if ( !self can_zombie_see_any_player() ) self thread escaped_zombies_cleanup();
{ }
self.favoriteenemy = undefined; }
self.zombie_path_bad = 1;
self thread escaped_zombies_cleanup(); if ( isdefined( level.only_track_targeted_players ) )
} {
} if ( !isdefined( self.favoriteenemy ) || self.favoriteenemy != player )
if ( isDefined( level.only_track_targeted_players ) ) continue;
{ }
if ( !isDefined( self.favoriteenemy ) || self.favoriteenemy != player )
{ can_be_seen = self player_can_see_me( player );
} distance_squared = distancesquared( self.origin, player.origin );
}
else if ( can_be_seen && distance_squared < too_far_dist )
{ self.inview++;
can_be_seen = self player_can_see_me( player );
distance_squared = distancesquared( self.origin, player.origin ); if ( distance_squared < distance_squared_check && abs( self.origin[2] - player.origin[2] ) < how_high )
if ( can_be_seen && distance_squared < too_far_dist ) self.player_close++;
{ }
self.inview++; }
}
if ( distance_squared < distance_squared_check && abs( self.origin[ 2 ] - player.origin[ 2 ] ) < how_high ) wait 0.1;
{
self.player_close++; if ( self.inview == 0 && self.player_close == 0 )
} {
} if ( !isdefined( self.animname ) || isdefined( self.animname ) && self.animname != "zombie" )
_k98 = getNextArrayKey( _a98, _k98 ); return;
}
} if ( isdefined( self.electrified ) && self.electrified == 1 )
wait 0,1; return;
if ( self.inview == 0 && self.player_close == 0 )
{ zombies = getaiarray( "axis" );
if ( !isDefined( self.animname ) || isDefined( self.animname ) && self.animname != "zombie" )
{ if ( zombies.size + level.zombie_total > 24 || zombies.size + level.zombie_total <= 24 && self.health >= self.maxhealth )
return; {
} if ( !( isdefined( self.exclude_distance_cleanup_adding_to_total ) && self.exclude_distance_cleanup_adding_to_total ) && !( isdefined( self.isscreecher ) && self.isscreecher ) )
if ( isDefined( self.electrified ) && self.electrified == 1 ) {
{ level.zombie_total++;
return;
} if ( self.health < level.zombie_health )
zombies = getaiarray( "axis" ); level.zombie_respawned_health[level.zombie_respawned_health.size] = self.health;
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 )
{ self maps\mp\zombies\_zm_spawner::reset_attack_spot();
level.zombie_total++; self notify( "zombie_delete" );
if ( self.health < level.zombie_health )
{ if ( isdefined( self.anchor ) )
level.zombie_respawned_health[ level.zombie_respawned_health.size ] = self.health; self.anchor delete();
}
} self delete();
} recalc_zombie_array();
self maps/mp/zombies/_zm_spawner::reset_attack_spot(); }
self notify( "zombie_delete" );
if ( isDefined( self.anchor ) )
{
self.anchor delete();
}
self delete();
recalc_zombie_array();
}
} }
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;
{ else
anglefromcenter = 180; anglefromcenter = acos( forwarddotbanzai );
}
else playerfov = getdvarfloat( "cg_fov" );
{ banzaivsplayerfovbuffer = getdvarfloat( _hash_BCB625CF );
anglefromcenter = acos( forwarddotbanzai );
} if ( banzaivsplayerfovbuffer <= 0 )
playerfov = getDvarFloat( "cg_fov" ); banzaivsplayerfovbuffer = 0.2;
banzaivsplayerfovbuffer = getDvarFloat( "g_banzai_player_fov_buffer" );
if ( banzaivsplayerfovbuffer <= 0 ) playercanseeme = anglefromcenter <= playerfov * 0.5 * ( 1 - banzaivsplayerfovbuffer );
{ return playercanseeme;
banzaivsplayerfovbuffer = 0,2;
}
playercanseeme = anglefromcenter <= ( ( playerfov * 0,5 ) * ( 1 - banzaivsplayerfovbuffer ) );
return playercanseeme;
} }
can_be_deleted_from_buried_special_zones() can_be_deleted_from_buried_special_zones()
{ {
if ( self can_be_deleted_from_start_area() ) if ( self can_be_deleted_from_start_area() )
{ return true;
return 1;
} if ( self can_be_deleted_from_maze_area() )
if ( self can_be_deleted_from_maze_area() ) return true;
{
return 1; return false;
}
return 0;
} }
can_be_deleted_from_start_area() can_be_deleted_from_start_area()
{ {
start_zones = []; start_zones = [];
start_zones[ start_zones.size ] = "zone_start"; start_zones[start_zones.size] = "zone_start";
start_zones[ start_zones.size ] = "zone_start_lower"; start_zones[start_zones.size] = "zone_start_lower";
return self can_be_deleted_from_area( start_zones ); return self can_be_deleted_from_area( start_zones );
} }
can_be_deleted_from_maze_area() can_be_deleted_from_maze_area()
{ {
maze_zones = []; maze_zones = [];
maze_zones[ maze_zones.size ] = "zone_mansion_backyard"; maze_zones[maze_zones.size] = "zone_mansion_backyard";
maze_zones[ maze_zones.size ] = "zone_maze"; maze_zones[maze_zones.size] = "zone_maze";
maze_zones[ maze_zones.size ] = "zone_maze_staircase"; maze_zones[maze_zones.size] = "zone_maze_staircase";
return self can_be_deleted_from_area( maze_zones ); return self can_be_deleted_from_area( maze_zones );
} }
can_be_deleted_from_area( zone_names ) can_be_deleted_from_area( zone_names )
{ {
self_in_zone = 0; self_in_zone = 0;
_a265 = zone_names;
_k265 = getFirstArrayKey( _a265 ); foreach ( zone_name in zone_names )
while ( isDefined( _k265 ) ) {
{ if ( isdefined( level.zones[zone_name] ) && ( isdefined( level.zones[zone_name].is_occupied ) && level.zones[zone_name].is_occupied ) )
zone_name = _a265[ _k265 ]; return false;
if ( isDefined( level.zones[ zone_name ] ) && isDefined( level.zones[ zone_name ].is_occupied ) && level.zones[ zone_name ].is_occupied )
{ if ( !self_in_zone && self maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone_name ) )
return 0; self_in_zone = 1;
} }
if ( !self_in_zone && self maps/mp/zombies/_zm_zonemgr::entity_in_zone( zone_name ) )
{ if ( self_in_zone )
self_in_zone = 1; return true;
}
_k265 = getNextArrayKey( _a265, _k265 ); return false;
}
if ( self_in_zone )
{
return 1;
}
return 0;
} }
escaped_zombies_cleanup_init() 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 ( is_player_valid( players[ i ] ) && !is_true( players[ i ].is_in_ghost_zone ) && self maymovetopoint( players[ i ].origin, 1 ) ) if ( is_player_valid( players[i] ) && !is_true( players[i].is_in_ghost_zone ) && 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 ( !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;
}
} }
escaped_zombies_cleanup() escaped_zombies_cleanup()
{ {
self endon( "death" ); self endon( "death" );
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 thread check_player_available(); self setgoalpos( s_escape.origin );
self waittill_any( "goal", "reaquire_player" ); self thread check_player_available();
} self waittill_any( "goal", "reaquire_player" );
self.zombie_path_bad = !can_zombie_path_to_any_player(); }
wait 0,1;
if ( !self.zombie_path_bad ) self.zombie_path_bad = !can_zombie_path_to_any_player();
{ wait 0.1;
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
} if ( !self.zombie_path_bad )
self thread maps\mp\zombies\_zm_ai_basic::find_flesh();
} }
get_escape_position() 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_dog_locations = get_dog_locations_in_zones( a_zones ); a_zones = get_adjacencies_to_zone( str_zone );
s_farthest = self get_farthest_dog_location( a_dog_locations ); a_dog_locations = get_dog_locations_in_zones( a_zones );
} s_farthest = self get_farthest_dog_location( a_dog_locations );
return s_farthest; }
return s_farthest;
} }
check_player_available() check_player_available()
{ {
self notify( "_check_player_available" ); self notify( "_check_player_available" );
self endon( "_check_player_available" ); self endon( "_check_player_available" );
self endon( "death" ); self endon( "death" );
self endon( "goal" ); self endon( "goal" );
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" ); {
return; self notify( "reaquire_player" );
} return;
wait randomfloatrange( 0,2, 0,5 ); }
}
self notify( "reaquire_player" ); wait( randomfloatrange( 0.2, 0.5 ) );
}
self notify( "reaquire_player" );
} }
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 ( !is_player_valid( a_players[ i ] ) ) if ( !is_player_valid( a_players[i] ) )
{ continue;
i++;
continue; if ( is_true( a_players[i].is_in_ghost_zone ) )
} continue;
else if ( is_true( a_players[ i ].is_in_ghost_zone ) )
{ if ( findpath( self.origin, a_players[i].origin ) )
i++; return true;
continue; }
}
else return false;
{
if ( findpath( self.origin, a_players[ i ].origin ) )
{
return 1;
}
}
i++;
}
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 ( !is_player_valid( a_players[ i ] ) ) if ( !is_player_valid( a_players[i] ) )
{ continue;
i++;
continue; path_length = 0;
}
else if ( !is_true( a_players[i].is_in_ghost_zone ) )
{ path_length = self calcpathlength( a_players[i].origin );
path_length = 0;
if ( !is_true( a_players[ i ].is_in_ghost_zone ) ) if ( self maymovetopoint( a_players[i].origin, 1 ) || path_length != 0 )
{ return true;
path_length = self calcpathlength( a_players[ i ].origin ); }
}
if ( self maymovetopoint( a_players[ i ].origin, 1 ) || path_length != 0 ) return false;
{
return 1;
}
}
i++;
}
return 0;
} }
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 = [];
_a479 = a_zones;
_k479 = getFirstArrayKey( _a479 ); foreach ( zone in a_zones )
while ( isDefined( _k479 ) ) a_dog_locations = arraycombine( a_dog_locations, level.zones[zone].dog_locations, 0, 0 );
{
zone = _a479[ _k479 ]; return a_dog_locations;
a_dog_locations = arraycombine( a_dog_locations, level.zones[ zone ].dog_locations, 0, 0 );
_k479 = getNextArrayKey( _a479, _k479 );
}
return a_dog_locations;
} }
get_farthest_dog_location( a_dog_locations ) 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_farthest_index = i; n_distance_farthest = n_distance_sq;
} n_farthest_index = i;
i++; }
} }
return a_dog_locations[ n_farthest_index ];
return a_dog_locations[n_farthest_index];
} }

View File

@ -1,222 +1,219 @@
#include maps/mp/zombies/_zm_powerups; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_perks; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_score; #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_score;
#include maps\mp\zombies\_zm_perks;
#using_animtree( "zm_buried_ghost" ); #include maps\mp\zombies\_zm_powerups;
#using_animtree( "fxanim_props_dlc3" );
init_ghost_piano() init_ghost_piano()
{ {
t_bullseye = getent( "bullseye", "script_noteworthy" ); t_bullseye = getent( "bullseye", "script_noteworthy" );
t_chalk_line = getent( "ee_bar_chalk_line_trigger", "targetname" ); t_chalk_line = getent( "ee_bar_chalk_line_trigger", "targetname" );
if ( !isDefined( t_bullseye ) || !isDefined( t_chalk_line ) )
{ if ( !isdefined( t_bullseye ) || !isdefined( t_chalk_line ) )
return; return;
}
t_bullseye thread wait_for_valid_damage(); t_bullseye thread wait_for_valid_damage();
t_chalk_line thread set_flags_while_players_stand_in_trigger(); t_chalk_line thread set_flags_while_players_stand_in_trigger();
level thread mansion_ghost_plays_piano(); level thread mansion_ghost_plays_piano();
level thread reward_think(); level thread reward_think();
/# /#
level thread devgui_support_ee(); level thread devgui_support_ee();
#/ #/
flag_init( "player_piano_song_active" ); flag_init( "player_piano_song_active" );
} }
init_ee_ghost_piano_flags() init_ee_ghost_piano_flags()
{ {
self ent_flag_init( "ee_standing_behind_chalk_line" ); self ent_flag_init( "ee_standing_behind_chalk_line" );
} }
wait_for_valid_damage() wait_for_valid_damage()
{ {
self setcandamage( 1 ); self setcandamage( 1 );
while ( 1 )
{ while ( true )
self waittill( "damage" ); {
if ( is_ballistic_knife_variant( str_weapon_name ) ) self waittill( "damage", e_inflictor, str_weapon_name );
{
if ( isDefined( e_inflictor ) && e_inflictor ent_flag_exist( "ee_standing_behind_chalk_line" ) && e_inflictor ent_flag( "ee_standing_behind_chalk_line" ) && !flag( "player_piano_song_active" ) ) if ( is_ballistic_knife_variant( str_weapon_name ) )
{ {
level notify( "player_can_interact_with_ghost_piano_player" ); if ( isdefined( e_inflictor ) && e_inflictor ent_flag_exist( "ee_standing_behind_chalk_line" ) && e_inflictor ent_flag( "ee_standing_behind_chalk_line" ) && !flag( "player_piano_song_active" ) )
} level notify( "player_can_interact_with_ghost_piano_player", e_inflictor );
} }
} }
} }
is_ballistic_knife_variant( str_weapon ) is_ballistic_knife_variant( str_weapon )
{ {
return issubstr( str_weapon, "knife_ballistic_" ); return issubstr( str_weapon, "knife_ballistic_" );
} }
set_flags_while_players_stand_in_trigger() set_flags_while_players_stand_in_trigger()
{ {
while ( 1 ) while ( true )
{ {
self waittill( "trigger", player ); self waittill( "trigger", player );
if ( !player ent_flag_exist( "ee_standing_behind_chalk_line" ) )
{ if ( !player ent_flag_exist( "ee_standing_behind_chalk_line" ) )
player ent_flag_init( "ee_standing_behind_chalk_line" ); player ent_flag_init( "ee_standing_behind_chalk_line" );
}
if ( !player ent_flag( "ee_standing_behind_chalk_line" ) ) if ( !player ent_flag( "ee_standing_behind_chalk_line" ) )
{ player thread clear_flag_when_player_leaves_trigger( self );
player thread clear_flag_when_player_leaves_trigger( self ); }
}
}
} }
clear_flag_when_player_leaves_trigger( trigger ) clear_flag_when_player_leaves_trigger( trigger )
{ {
self endon( "death_or_disconnect" ); self endon( "death_or_disconnect" );
self ent_flag_set( "ee_standing_behind_chalk_line" ); self ent_flag_set( "ee_standing_behind_chalk_line" );
while ( self istouching( trigger ) )
{ while ( self istouching( trigger ) )
wait 0,25; wait 0.25;
}
self ent_flag_clear( "ee_standing_behind_chalk_line" ); self ent_flag_clear( "ee_standing_behind_chalk_line" );
} }
#using_animtree("fxanim_props_dlc3");
player_piano_starts() player_piano_starts()
{ {
/# /#
iprintln( "player piano tune song start" ); iprintln( "player piano tune song start" );
#/ #/
flag_set( "player_piano_song_active" ); flag_set( "player_piano_song_active" );
level notify( "piano_play" ); level notify( "piano_play" );
level setclientfield( "mansion_piano_play", 1 ); level setclientfield( "mansion_piano_play", 1 );
level setclientfield( "saloon_piano_play", 1 ); level setclientfield( "saloon_piano_play", 1 );
wait getanimlength( %fxanim_gp_piano_old_anim ); wait( getanimlength( %fxanim_gp_piano_old_anim ) );
/# /#
iprintln( "player piano song done" ); iprintln( "player piano song done" );
#/ #/
level setclientfield( "mansion_piano_play", 0 ); level setclientfield( "mansion_piano_play", 0 );
level setclientfield( "saloon_piano_play", 0 ); level setclientfield( "saloon_piano_play", 0 );
flag_clear( "player_piano_song_active" ); flag_clear( "player_piano_song_active" );
} }
mansion_ghost_plays_piano() mansion_ghost_plays_piano()
{ {
while ( 1 ) while ( true )
{ {
flag_wait( "player_piano_song_active" ); flag_wait( "player_piano_song_active" );
e_ghost = spawn_and_animate_ghost_pianist(); e_ghost = spawn_and_animate_ghost_pianist();
flag_waitopen( "player_piano_song_active" ); flag_waitopen( "player_piano_song_active" );
e_ghost thread delete_ghost_pianist(); e_ghost thread delete_ghost_pianist();
} }
} }
#using_animtree("zm_buried_ghost");
spawn_and_animate_ghost_pianist() spawn_and_animate_ghost_pianist()
{ {
s_anim = getstruct( "ee_mansion_piano_anim_struct", "targetname" ); s_anim = getstruct( "ee_mansion_piano_anim_struct", "targetname" );
e_temp = spawn( "script_model", s_anim.origin ); e_temp = spawn( "script_model", s_anim.origin );
e_temp.angles = s_anim.angles; e_temp.angles = s_anim.angles;
e_temp setclientfield( "ghost_fx", 3 ); e_temp setclientfield( "ghost_fx", 3 );
e_temp setmodel( "c_zom_zombie_buried_ghost_woman_fb" ); e_temp setmodel( "c_zom_zombie_buried_ghost_woman_fb" );
e_temp useanimtree( -1 ); e_temp useanimtree( -1 );
e_temp setanim( %ai_zombie_ghost_playing_piano ); e_temp setanim( %ai_zombie_ghost_playing_piano );
e_temp setclientfield( "sndGhostAudio", 1 ); e_temp setclientfield( "sndGhostAudio", 1 );
/# /#
iprintln( "ghost piano player spawned" ); iprintln( "ghost piano player spawned" );
#/ #/
return e_temp; return e_temp;
} }
reward_think() reward_think()
{ {
t_use = getent( "ee_ghost_piano_mansion_use_trigger", "targetname" ); t_use = getent( "ee_ghost_piano_mansion_use_trigger", "targetname" );
t_use sethintstring( &"ZM_BURIED_HINT_GHOST_PIANO", 10 ); t_use sethintstring( &"ZM_BURIED_HINT_GHOST_PIANO", 10 );
t_use setinvisibletoall(); t_use setinvisibletoall();
while ( 1 )
{ while ( true )
level waittill( "player_can_interact_with_ghost_piano_player", player ); {
level thread player_piano_starts(); level waittill( "player_can_interact_with_ghost_piano_player", player );
if ( !player has_player_received_reward() )
{ level thread player_piano_starts();
t_use setvisibletoplayer( player );
t_use thread player_can_use_ghost_piano_trigger( player ); if ( !player has_player_received_reward() )
} {
flag_waitopen( "player_piano_song_active" ); t_use setvisibletoplayer( player );
t_use setinvisibletoall(); t_use thread player_can_use_ghost_piano_trigger( player );
level notify( "ghost_piano_reward_unavailable" ); }
}
flag_waitopen( "player_piano_song_active" );
t_use setinvisibletoall();
level notify( "ghost_piano_reward_unavailable" );
}
} }
player_can_use_ghost_piano_trigger( player ) player_can_use_ghost_piano_trigger( player )
{ {
player endon( "death_or_disconnect" ); player endon( "death_or_disconnect" );
level endon( "ghost_piano_reward_unavailable" ); level endon( "ghost_piano_reward_unavailable" );
self waittill( "trigger", user );
if ( user != player && player.score < 10 && !player has_player_received_reward() ) do
{ self waittill( "trigger", user );
self give_reward( player ); while ( user != player || player.score < 10 || !is_player_valid( player ) );
}
if ( !player has_player_received_reward() )
self give_reward( player );
} }
give_reward( player ) give_reward( player )
{ {
player maps/mp/zombies/_zm_score::minus_to_player_score( 10 ); player maps\mp\zombies\_zm_score::minus_to_player_score( 10 );
player.got_easter_egg_reward = 1; player.got_easter_egg_reward = 1;
self setinvisibletoplayer( player ); self setinvisibletoplayer( player );
player notify( "player_received_ghost_round_free_perk" ); player notify( "player_received_ghost_round_free_perk" );
free_perk = player maps/mp/zombies/_zm_perks::give_random_perk(); free_perk = player maps\mp\zombies\_zm_perks::give_random_perk();
if ( is_true( level.disable_free_perks_before_power ) )
{ if ( is_true( level.disable_free_perks_before_power ) )
player thread maps/mp/zombies/_zm_powerups::disable_perk_before_power( free_perk ); player thread maps\mp\zombies\_zm_powerups::disable_perk_before_power( free_perk );
}
/# /#
iprintln( "player got reward!!" ); iprintln( "player got reward!!" );
#/ #/
} }
has_player_received_reward() has_player_received_reward()
{ {
return is_true( self.got_easter_egg_reward ); return is_true( self.got_easter_egg_reward );
} }
delete_ghost_pianist() delete_ghost_pianist()
{ {
self setclientfield( "ghost_fx", 5 ); self setclientfield( "ghost_fx", 5 );
self playsound( "zmb_ai_ghost_death" ); self playsound( "zmb_ai_ghost_death" );
wait_network_frame(); wait_network_frame();
self delete(); self delete();
/# /#
iprintln( "ghost piano player deleted" ); iprintln( "ghost piano player deleted" );
#/ #/
} }
devgui_support_ee() devgui_support_ee()
{ {
while ( 1 ) while ( true )
{ {
str_notify = level waittill_any_return( "ghost_piano_warp_to_mansion_piano", "ghost_piano_warp_to_bar" ); str_notify = level waittill_any_return( "ghost_piano_warp_to_mansion_piano", "ghost_piano_warp_to_bar" );
if ( str_notify == "ghost_piano_warp_to_mansion_piano" )
{ if ( str_notify == "ghost_piano_warp_to_mansion_piano" )
get_players()[ 0 ] warp_to_struct( "ee_warp_mansion_piano", "targetname" ); get_players()[0] warp_to_struct( "ee_warp_mansion_piano", "targetname" );
continue; else if ( str_notify == "ghost_piano_warp_to_bar" )
} get_players()[0] warp_to_struct( "ee_warp_bar", "targetname" );
else }
{
if ( str_notify == "ghost_piano_warp_to_bar" )
{
get_players()[ 0 ] warp_to_struct( "ee_warp_bar", "targetname" );
}
}
}
} }
warp_to_struct( str_value, str_key ) warp_to_struct( str_value, str_key )
{ {
if ( !isDefined( str_key ) ) if ( !isdefined( str_key ) )
{ str_key = "targetname";
str_key = "targetname";
} s_warp = getstruct( str_value, str_key );
s_warp = getstruct( str_value, str_key ); self setorigin( s_warp.origin );
self setorigin( s_warp.origin );
if ( isDefined( s_warp.angles ) ) if ( isdefined( s_warp.angles ) )
{ self setplayerangles( s_warp.angles );
self setplayerangles( s_warp.angles );
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,297 +1,287 @@
#include maps/mp/zombies/_zm_stats; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_ai_ghost; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zm_buried_classic; #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\zm_buried_classic;
#include maps\mp\zombies\_zm_ai_ghost;
#include maps\mp\zombies\_zm_stats;
init_fountain() init_fountain()
{ {
flag_init( "courtyard_fountain_broken" ); flag_init( "courtyard_fountain_broken" );
flag_init( "maze_fountain_broken" ); flag_init( "maze_fountain_broken" );
flag_init( "fountain_transport_active" ); flag_init( "fountain_transport_active" );
level._effect[ "fountain_break" ] = loadfx( "maps/zombie_buried/fx_buried_fountain_break" ); level._effect["fountain_break"] = loadfx( "maps/zombie_buried/fx_buried_fountain_break" );
level._effect[ "fountain_spray" ] = loadfx( "maps/zombie_buried/fx_buried_fountain_spray" ); level._effect["fountain_spray"] = loadfx( "maps/zombie_buried/fx_buried_fountain_spray" );
level._effect[ "fountain_teleport" ] = loadfx( "maps/zombie_buried/fx_buried_teleport_flash" ); level._effect["fountain_teleport"] = loadfx( "maps/zombie_buried/fx_buried_teleport_flash" );
level thread fountain_setup(); level thread fountain_setup();
level thread maze_fountain_collmap(); level thread maze_fountain_collmap();
} }
fountain_setup() fountain_setup()
{ {
flag_wait( "initial_blackscreen_passed" ); flag_wait( "initial_blackscreen_passed" );
fountain_debug_print( "fountain scripts running" ); fountain_debug_print( "fountain scripts running" );
level thread set_flag_on_notify( "courtyard_fountain_open", "courtyard_fountain_broken" ); level thread set_flag_on_notify( "courtyard_fountain_open", "courtyard_fountain_broken" );
level thread sloth_fountain_think(); level thread sloth_fountain_think();
level thread maze_fountain_think(); level thread maze_fountain_think();
level thread fountain_transport_think(); level thread fountain_transport_think();
/# /#
level thread debug_warp_player_to_fountain(); level thread debug_warp_player_to_fountain();
#/ #/
} }
maze_fountain_collmap() maze_fountain_collmap()
{ {
collmap = getentarray( "maze_fountain_collmap", "targetname" ); collmap = getentarray( "maze_fountain_collmap", "targetname" );
flag_wait( "maze_fountain_broken" ); flag_wait( "maze_fountain_broken" );
array_thread( collmap, ::self_delete ); array_thread( collmap, ::self_delete );
} }
sloth_fountain_think() sloth_fountain_think()
{ {
flag_wait( "courtyard_fountain_broken" ); flag_wait( "courtyard_fountain_broken" );
level setclientfield( "sloth_fountain_start", 1 ); level setclientfield( "sloth_fountain_start", 1 );
s_courtyard_fountain = getstruct( "courtyard_fountain_struct", "targetname" ); s_courtyard_fountain = getstruct( "courtyard_fountain_struct", "targetname" );
if ( isDefined( s_courtyard_fountain ) )
{ if ( isdefined( s_courtyard_fountain ) )
sound_offset = vectorScale( ( 0, 0, 1 ), 100 ); {
sound_ent = spawn( "script_origin", s_courtyard_fountain.origin + sound_offset ); sound_offset = vectorscale( ( 0, 0, 1 ), 100.0 );
playfx( level._effect[ "fx_buried_fountain_spray" ], s_courtyard_fountain.origin ); sound_ent = spawn( "script_origin", s_courtyard_fountain.origin + sound_offset );
playfx( level._effect[ "fountain_break" ], s_courtyard_fountain.origin ); playfx( level._effect["fx_buried_fountain_spray"], s_courtyard_fountain.origin );
sound_ent playloopsound( "zmb_fountain_spray", 0,2 ); playfx( level._effect["fountain_break"], s_courtyard_fountain.origin );
} sound_ent playloopsound( "zmb_fountain_spray", 0.2 );
show_maze_fountain_water(); }
fountain_debug_print( "courtyard_fountain_broken" );
show_maze_fountain_water();
fountain_debug_print( "courtyard_fountain_broken" );
} }
set_flag_on_notify( notifystr, strflag ) set_flag_on_notify( notifystr, strflag )
{ {
if ( notifystr != "death" ) if ( notifystr != "death" )
{ self endon( "death" );
self endon( "death" );
} if ( !level.flag[strflag] )
if ( !level.flag[ strflag ] ) {
{ self waittill( notifystr );
self waittill( notifystr );
flag_set( strflag ); flag_set( strflag );
} }
} }
maze_fountain_think() maze_fountain_think()
{ {
hide_maze_fountain_water(); hide_maze_fountain_water();
wait_for_maze_fountain_to_be_destroyed(); wait_for_maze_fountain_to_be_destroyed();
destroy_maze_fountain(); destroy_maze_fountain();
flag_wait( "courtyard_fountain_broken" ); flag_wait( "courtyard_fountain_broken" );
flag_set( "fountain_transport_active" ); flag_set( "fountain_transport_active" );
} }
hide_maze_fountain_water() hide_maze_fountain_water()
{ {
t_water = getent( "maze_fountain_water_trigger", "targetname" ); t_water = getent( "maze_fountain_water_trigger", "targetname" );
t_water enablelinkto(); t_water enablelinkto();
m_water = getent( "maze_fountain_water", "targetname" ); m_water = getent( "maze_fountain_water", "targetname" );
t_water linkto( m_water ); t_water linkto( m_water );
m_water movez( -475, 0,05 ); m_water movez( -475, 0.05 );
} }
show_maze_fountain_water() show_maze_fountain_water()
{ {
m_water = getent( "maze_fountain_water", "targetname" ); m_water = getent( "maze_fountain_water", "targetname" );
m_water movez( 398, 6 ); m_water movez( 398, 6 );
m_water ghost(); m_water ghost();
fountain_debug_print( "maze water ready" ); fountain_debug_print( "maze water ready" );
} }
wait_for_maze_fountain_to_be_destroyed() wait_for_maze_fountain_to_be_destroyed()
{ {
/# /#
level endon( "_destroy_maze_fountain" ); level endon( "_destroy_maze_fountain" );
#/ #/
t_damage = getent( "maze_fountain_trigger", "targetname" ); t_damage = getent( "maze_fountain_trigger", "targetname" );
health = 1000;
while ( health > 0 ) for ( health = 1000; health > 0; health -= damage )
{ {
t_damage waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags ); t_damage waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
if ( damage < 50 )
{ asm_cond( damage < 50, loc_E9C );
damage = 0; damage = 0;
} asm_cond( isdefined( type ) && type == "MOD_EXPLOSIVE" || type == "MOD_EXPLOSIVE_SPLASH" || type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH", loc_EE6 );
if ( isDefined( type ) && type != "MOD_EXPLOSIVE" && type != "MOD_EXPLOSIVE_SPLASH" && type != "MOD_GRENADE" && type != "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE" && type == "MOD_PROJECTILE_SPLASH" ) }
{
health -= damage;
}
}
} }
destroy_maze_fountain() destroy_maze_fountain()
{ {
s_fountain = getstruct( "maze_fountain_struct", "targetname" ); s_fountain = getstruct( "maze_fountain_struct", "targetname" );
level setclientfield( "maze_fountain_start", 1 ); level setclientfield( "maze_fountain_start", 1 );
if ( isDefined( s_fountain ) )
{ if ( isdefined( s_fountain ) )
playfx( level._effect[ "fountain_break" ], s_fountain.origin ); playfx( level._effect["fountain_break"], s_fountain.origin );
}
s_fountain_clip = getent( "maze_fountain_clip", "targetname" ); s_fountain_clip = getent( "maze_fountain_clip", "targetname" );
s_fountain_clip delete(); s_fountain_clip delete();
flag_set( "maze_fountain_broken" ); flag_set( "maze_fountain_broken" );
} }
fountain_transport_think() fountain_transport_think()
{ {
t_transporter = getent( "maze_fountain_water_trigger", "targetname" ); t_transporter = getent( "maze_fountain_water_trigger", "targetname" );
while ( 1 )
{ while ( true )
t_transporter waittill( "trigger", player ); {
if ( !isDefined( player.is_in_fountain_transport_trigger ) || !player.is_in_fountain_transport_trigger ) t_transporter waittill( "trigger", player );
{
player.is_in_fountain_transport_trigger = 1; if ( !isdefined( player.is_in_fountain_transport_trigger ) || !player.is_in_fountain_transport_trigger )
if ( flag( "fountain_transport_active" ) ) {
{ player.is_in_fountain_transport_trigger = 1;
player thread transport_player_to_start_zone();
break; if ( flag( "fountain_transport_active" ) )
} player thread transport_player_to_start_zone();
else else
{ player thread delay_transport_check();
player thread delay_transport_check(); }
} }
}
}
} }
delay_transport_check() delay_transport_check()
{ {
self endon( "death" ); self endon( "death" );
self endon( "bled_out" ); self endon( "bled_out" );
wait 1; wait 1;
self.is_in_fountain_transport_trigger = 0; self.is_in_fountain_transport_trigger = 0;
} }
transport_player_to_start_zone() transport_player_to_start_zone()
{ {
self endon( "death_or_disconnect" ); self endon( "death_or_disconnect" );
fountain_debug_print( "transport player!" ); fountain_debug_print( "transport player!" );
if ( !isDefined( level._fountain_transporter ) )
{ if ( !isdefined( level._fountain_transporter ) )
level._fountain_transporter = spawnstruct(); {
level._fountain_transporter.index = 0; level._fountain_transporter = spawnstruct();
level._fountain_transporter.end_points = getstructarray( "fountain_transport_end_location", "targetname" ); level._fountain_transporter.index = 0;
} level._fountain_transporter.end_points = getstructarray( "fountain_transport_end_location", "targetname" );
self playsoundtoplayer( "zmb_buried_teleport", self ); }
self play_teleport_fx();
self flash_screen_white(); self playsoundtoplayer( "zmb_buried_teleport", self );
wait_network_frame(); self play_teleport_fx();
if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size ) self flash_screen_white();
{ wait_network_frame();
level._fountain_transporter.index = 0;
} if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size )
tries = 0; level._fountain_transporter.index = 0;
while ( positionwouldtelefrag( level._fountain_transporter.end_points[ level._fountain_transporter.index ].origin ) )
{ tries = 0;
tries++;
if ( tries >= 4 ) while ( positionwouldtelefrag( level._fountain_transporter.end_points[level._fountain_transporter.index].origin ) )
{ {
tries = 0; tries++;
wait 0,05;
} if ( tries >= 4 )
level._fountain_transporter.index++; {
if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size ) tries = 0;
{ wait 0.05;
level._fountain_transporter.index = 0; }
}
} level._fountain_transporter.index++;
self setorigin( level._fountain_transporter.end_points[ level._fountain_transporter.index ].origin );
self setplayerangles( level._fountain_transporter.end_points[ level._fountain_transporter.index ].angles ); if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size )
level._fountain_transporter.index++; level._fountain_transporter.index = 0;
wait_network_frame(); }
self play_teleport_fx();
self thread flash_screen_fade_out(); self setorigin( level._fountain_transporter.end_points[level._fountain_transporter.index].origin );
self maps/mp/zm_buried_classic::buried_set_start_area_lighting(); self setplayerangles( level._fountain_transporter.end_points[level._fountain_transporter.index].angles );
self thread maps/mp/zombies/_zm_ai_ghost::behave_after_fountain_transport( self ); level._fountain_transporter.index++;
self maps/mp/zombies/_zm_stats::increment_client_stat( "buried_fountain_transporter_used", 0 ); wait_network_frame();
self maps/mp/zombies/_zm_stats::increment_player_stat( "buried_fountain_transporter_used" ); self play_teleport_fx();
self notify( "player_used_fountain_teleporter" ); self thread flash_screen_fade_out();
wait_network_frame(); self maps\mp\zm_buried_classic::buried_set_start_area_lighting();
wait_network_frame(); self thread maps\mp\zombies\_zm_ai_ghost::behave_after_fountain_transport( self );
self.is_in_fountain_transport_trigger = 0; self maps\mp\zombies\_zm_stats::increment_client_stat( "buried_fountain_transporter_used", 0 );
self maps\mp\zombies\_zm_stats::increment_player_stat( "buried_fountain_transporter_used" );
self notify( "player_used_fountain_teleporter" );
wait_network_frame();
wait_network_frame();
self.is_in_fountain_transport_trigger = 0;
} }
play_teleport_fx() play_teleport_fx()
{ {
playfx( level._effect[ "fountain_teleport" ], self gettagorigin( "J_SpineLower" ) ); playfx( level._effect["fountain_teleport"], self gettagorigin( "J_SpineLower" ) );
} }
flash_screen_white() flash_screen_white()
{ {
self endon( "death_or_disconnect" ); self endon( "death_or_disconnect" );
self.hud_transporter_flash = self create_client_hud_elem(); self.hud_transporter_flash = self create_client_hud_elem();
self.hud_transporter_flash fadeovertime( 0,2 ); self.hud_transporter_flash fadeovertime( 0.2 );
self.hud_transporter_flash.alpha = 1; self.hud_transporter_flash.alpha = 1;
wait 0,2; wait 0.2;
} }
flash_screen_fade_out() flash_screen_fade_out()
{ {
self.hud_transporter_flash fadeovertime( 0,2 ); self.hud_transporter_flash fadeovertime( 0.2 );
self.hud_transporter_flash.alpha = 0; self.hud_transporter_flash.alpha = 0;
wait 0,2; wait 0.2;
self.hud_transporter_flash destroy(); self.hud_transporter_flash destroy();
self.hud_transporter_flash = undefined; self.hud_transporter_flash = undefined;
} }
create_client_hud_elem() create_client_hud_elem()
{ {
hud_elem = newclienthudelem( self ); hud_elem = newclienthudelem( self );
hud_elem.x = 0; hud_elem.x = 0;
hud_elem.y = 0; hud_elem.y = 0;
hud_elem.horzalign = "fullscreen"; hud_elem.horzalign = "fullscreen";
hud_elem.vertalign = "fullscreen"; hud_elem.vertalign = "fullscreen";
hud_elem.foreground = 1; hud_elem.foreground = 1;
hud_elem.alpha = 0; hud_elem.alpha = 0;
hud_elem.hidewheninmenu = 0; hud_elem.hidewheninmenu = 0;
hud_elem.shader = "white"; hud_elem.shader = "white";
hud_elem setshader( "white", 640, 480 ); hud_elem setshader( "white", 640, 480 );
return hud_elem; return hud_elem;
} }
debug_warp_player_to_fountain() debug_warp_player_to_fountain()
{ {
while ( 1 ) while ( true )
{ {
str_notify = level waittill_any_return( "warp_player_to_maze_fountain", "warp_player_to_courtyard_fountain" ); str_notify = level waittill_any_return( "warp_player_to_maze_fountain", "warp_player_to_courtyard_fountain" );
if ( str_notify == "warp_player_to_maze_fountain" )
{ if ( str_notify == "warp_player_to_maze_fountain" )
str_warp_point = "teleport_player_to_maze_fountain"; str_warp_point = "teleport_player_to_maze_fountain";
} else if ( str_notify == "warp_player_to_courtyard_fountain" )
else str_warp_point = "teleport_player_to_courtyard_fountain";
{
if ( str_notify == "warp_player_to_courtyard_fountain" ) foreach ( player in get_players() )
{ {
str_warp_point = "teleport_player_to_courtyard_fountain"; _warp_player_to_maze_fountain( player, str_warp_point );
} wait 0.25;
} }
_a332 = get_players(); }
_k332 = getFirstArrayKey( _a332 );
while ( isDefined( _k332 ) )
{
player = _a332[ _k332 ];
_warp_player_to_maze_fountain( player, str_warp_point );
wait 0,25;
_k332 = getNextArrayKey( _a332, _k332 );
}
}
} }
_warp_player_to_maze_fountain( player, str_teleport_point ) _warp_player_to_maze_fountain( player, str_teleport_point )
{ {
fountain_debug_print( "teleporting player to " + str_teleport_point ); fountain_debug_print( "teleporting player to " + str_teleport_point );
s_warp = getstruct( str_teleport_point, "targetname" ); s_warp = getstruct( str_teleport_point, "targetname" );
origin = s_warp.origin;
while ( positionwouldtelefrag( origin ) ) for ( origin = s_warp.origin; positionwouldtelefrag( origin ); origin = s_warp.origin + ( randomfloatrange( -64, 64 ), randomfloatrange( -64, 64 ), 0 ) )
{ wait 0.05;
wait 0,05;
origin = s_warp.origin + ( randomfloatrange( -64, 64 ), randomfloatrange( -64, 64 ), 0 ); player setorigin( origin );
} player setplayerangles( s_warp.angles );
player setorigin( origin );
player setplayerangles( s_warp.angles );
} }
fountain_debug_print( str_text ) fountain_debug_print( str_text )
{ {
/# /#
if ( getDvarInt( #"AE3F04F6" ) > 0 ) if ( getdvarint( _hash_AE3F04F6 ) > 0 )
{ iprintlnbold( str_text );
iprintlnbold( str_text );
#/ #/
}
} }

View File

@ -1,150 +1,156 @@
#include maps/mp/_utility; // T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#using_animtree( "fxanim_props_dlc3" ); #include maps\mp\_utility;
#include maps\mp\createfx\zm_buried_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_buried_fx::main(); maps\mp\createfx\zm_buried_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[ "lght_marker" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker" ); level._effect["lght_marker"] = loadfx( "maps/zombie/fx_zmb_tranzit_marker" );
level._effect[ "lght_marker_flare" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" ); level._effect["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[ "blue_eyes" ] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" ); level._effect["blue_eyes"] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" );
level._effect[ "orange_eyes" ] = loadfx( "misc/fx_zombie_eye_single" ); level._effect["orange_eyes"] = loadfx( "misc/fx_zombie_eye_single" );
level._effect[ "player_possessed_eyes" ] = loadfx( "maps/zombie_buried/fx_buried_eye_stulhinger" ); level._effect["player_possessed_eyes"] = loadfx( "maps/zombie_buried/fx_buried_eye_stulhinger" );
gametype = getDvar( "ui_gametype" ); gametype = getdvar( "ui_gametype" );
if ( gametype == "zcleansed" )
{ if ( gametype == "zcleansed" )
level._effect[ "blue_eyes_player" ] = loadfx( "maps/zombie/fx_zombie_eye_returned_blue" ); {
level._effect[ "lava_burning" ] = loadfx( "env/fire/fx_fire_lava_player_torso" ); level._effect["blue_eyes_player"] = loadfx( "maps/zombie/fx_zombie_eye_returned_blue" );
} level._effect["lava_burning"] = loadfx( "env/fire/fx_fire_lava_player_torso" );
if ( isDefined( 0 ) && 0 ) }
{
level._effect[ "player_3rd_spotlight_lite" ] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_lite" ); if ( isdefined( 0 ) && 0 )
level._effect[ "player_3rd_spotlight_med" ] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_med" ); {
level._effect[ "player_3rd_spotlight_high" ] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_hvy" ); level._effect["player_3rd_spotlight_lite"] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_lite" );
level._effect[ "oillamp" ] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern" ); level._effect["player_3rd_spotlight_med"] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_med" );
} level._effect["player_3rd_spotlight_high"] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_hvy" );
level._effect[ "booze_candy_spawn" ] = loadfx( "maps/zombie_buried/fx_buried_booze_candy_spawn" ); level._effect["oillamp"] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern" );
level._effect[ "crusher_sparks" ] = loadfx( "maps/zombie_buried/fx_buried_crusher_sparks" ); }
level._effect[ "rise_burst_foliage" ] = loadfx( "maps/zombie/fx_zm_buried_hedge_billow_body" );
level._effect[ "rise_billow_foliage" ] = loadfx( "maps/zombie/fx_zm_buried_hedge_burst_hand" ); level._effect["booze_candy_spawn"] = loadfx( "maps/zombie_buried/fx_buried_booze_candy_spawn" );
level._effect[ "rise_dust_foliage" ] = loadfx( "maps/zombie/fx_zm_buried_hedge_dustfall_body" ); level._effect["crusher_sparks"] = loadfx( "maps/zombie_buried/fx_buried_crusher_sparks" );
level._effect[ "fx_buried_key_glint" ] = loadfx( "maps/zombie_buried/fx_buried_key_glint" ); level._effect["rise_burst_foliage"] = loadfx( "maps/zombie/fx_zm_buried_hedge_billow_body" );
level._effect[ "sq_glow" ] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern_ghost" ); level._effect["rise_billow_foliage"] = loadfx( "maps/zombie/fx_zm_buried_hedge_burst_hand" );
level._effect[ "vulture_fx_wisp" ] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_center" ); level._effect["rise_dust_foliage"] = loadfx( "maps/zombie/fx_zm_buried_hedge_dustfall_body" );
level._effect[ "vulture_fx_wisp_orb" ] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_orbit" ); level._effect["fx_buried_key_glint"] = loadfx( "maps/zombie_buried/fx_buried_key_glint" );
level._effect[ "fx_wisp_m" ] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_os" ); level._effect["sq_glow"] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern_ghost" );
level._effect[ "fx_wisp_lg_m" ] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_lg_os" ); level._effect["vulture_fx_wisp"] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_center" );
level._effect[ "sq_bulb_blue" ] = loadfx( "maps/zombie_buried/fx_buried_eg_blu" ); level._effect["vulture_fx_wisp_orb"] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_orbit" );
level._effect[ "sq_bulb_orange" ] = loadfx( "maps/zombie_buried/fx_buried_eg_orng" ); level._effect["fx_wisp_m"] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_os" );
level._effect[ "sq_bulb_green" ] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_green" ); level._effect["fx_wisp_lg_m"] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_lg_os" );
level._effect[ "sq_bulb_yellow" ] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_yellow" ); level._effect["sq_bulb_blue"] = loadfx( "maps/zombie_buried/fx_buried_eg_blu" );
level._effect[ "sq_ether_amp_trail" ] = loadfx( "maps/zombie_buried/fx_buried_ether_amp_trail" ); level._effect["sq_bulb_orange"] = loadfx( "maps/zombie_buried/fx_buried_eg_orng" );
level._effect[ "sq_tower_r" ] = loadfx( "maps/zombie_buried/fx_buried_tower_power_blue" ); level._effect["sq_bulb_green"] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_green" );
level._effect[ "sq_tower_m" ] = loadfx( "maps/zombie_buried/fx_buried_tower_power_orange" ); level._effect["sq_bulb_yellow"] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_yellow" );
level._effect[ "sq_tower_bolts" ] = loadfx( "maps/zombie_buried/fx_buried_tower_power_bolts" ); level._effect["sq_ether_amp_trail"] = loadfx( "maps/zombie_buried/fx_buried_ether_amp_trail" );
level._effect[ "sq_spark" ] = loadfx( "maps/zombie_buried/fx_buried_spark_gen" ); level._effect["sq_tower_r"] = loadfx( "maps/zombie_buried/fx_buried_tower_power_blue" );
level._effect[ "sq_spawn" ] = loadfx( "maps/zombie_buried/fx_buried_time_bomb_spawn" ); level._effect["sq_tower_m"] = loadfx( "maps/zombie_buried/fx_buried_tower_power_orange" );
level._effect[ "sq_vulture_orange_eye_glow" ] = loadfx( "misc/fx_zombie_eye_side_quest" ); level._effect["sq_tower_bolts"] = loadfx( "maps/zombie_buried/fx_buried_tower_power_bolts" );
level._effect["sq_spark"] = loadfx( "maps/zombie_buried/fx_buried_spark_gen" );
level._effect["sq_spawn"] = loadfx( "maps/zombie_buried/fx_buried_time_bomb_spawn" );
level._effect["sq_vulture_orange_eye_glow"] = loadfx( "misc/fx_zombie_eye_side_quest" );
} }
precache_createfx_fx() precache_createfx_fx()
{ {
level._effect[ "fx_buried_ash_blowing" ] = loadfx( "maps/zombie_buried/fx_buried_ash_blowing" ); level._effect["fx_buried_ash_blowing"] = loadfx( "maps/zombie_buried/fx_buried_ash_blowing" );
level._effect[ "fx_buried_bats_group" ] = loadfx( "maps/zombie_buried/fx_buried_bats_group" ); level._effect["fx_buried_bats_group"] = loadfx( "maps/zombie_buried/fx_buried_bats_group" );
level._effect[ "fx_buried_cloud_low" ] = loadfx( "maps/zombie_buried/fx_buried_cloud_low" ); level._effect["fx_buried_cloud_low"] = loadfx( "maps/zombie_buried/fx_buried_cloud_low" );
level._effect[ "fx_buried_conveyor_belt_edge" ] = loadfx( "maps/zombie_buried/fx_buried_conveyor_belt_edge" ); level._effect["fx_buried_conveyor_belt_edge"] = loadfx( "maps/zombie_buried/fx_buried_conveyor_belt_edge" );
level._effect[ "fx_buried_dust_ceiling_hole" ] = loadfx( "maps/zombie_buried/fx_buried_dust_ceiling_hole" ); level._effect["fx_buried_dust_ceiling_hole"] = loadfx( "maps/zombie_buried/fx_buried_dust_ceiling_hole" );
level._effect[ "fx_buried_dust_edge_100" ] = loadfx( "maps/zombie_buried/fx_buried_dust_edge_100" ); level._effect["fx_buried_dust_edge_100"] = loadfx( "maps/zombie_buried/fx_buried_dust_edge_100" );
level._effect[ "fx_buried_dust_edge_xlg" ] = loadfx( "maps/zombie_buried/fx_buried_dust_edge_xlg" ); level._effect["fx_buried_dust_edge_xlg"] = loadfx( "maps/zombie_buried/fx_buried_dust_edge_xlg" );
level._effect[ "fx_buried_dust_edge_blown" ] = loadfx( "maps/zombie_buried/fx_buried_dust_edge_blown" ); level._effect["fx_buried_dust_edge_blown"] = loadfx( "maps/zombie_buried/fx_buried_dust_edge_blown" );
level._effect[ "fx_buried_dust_flurry" ] = loadfx( "maps/zombie_buried/fx_buried_dust_flurry" ); level._effect["fx_buried_dust_flurry"] = loadfx( "maps/zombie_buried/fx_buried_dust_flurry" );
level._effect[ "fx_buried_dust_int_25x50" ] = loadfx( "maps/zombie_buried/fx_buried_dust_int_25x50" ); level._effect["fx_buried_dust_int_25x50"] = loadfx( "maps/zombie_buried/fx_buried_dust_int_25x50" );
level._effect[ "fx_buried_dust_motes_xlg" ] = loadfx( "maps/zombie_buried/fx_buried_dust_motes_xlg" ); level._effect["fx_buried_dust_motes_xlg"] = loadfx( "maps/zombie_buried/fx_buried_dust_motes_xlg" );
level._effect[ "fx_buried_dust_motes_ext_xlg" ] = loadfx( "maps/zombie_buried/fx_buried_dust_motes_ext_xlg" ); level._effect["fx_buried_dust_motes_ext_xlg"] = loadfx( "maps/zombie_buried/fx_buried_dust_motes_ext_xlg" );
level._effect[ "fx_buried_dust_motes_ext_sm" ] = loadfx( "maps/zombie_buried/fx_buried_dust_motes_ext_sm" ); level._effect["fx_buried_dust_motes_ext_sm"] = loadfx( "maps/zombie_buried/fx_buried_dust_motes_ext_sm" );
level._effect[ "fx_buried_dust_rising_sm" ] = loadfx( "maps/zombie_buried/fx_buried_dust_rising_sm" ); level._effect["fx_buried_dust_rising_sm"] = loadfx( "maps/zombie_buried/fx_buried_dust_rising_sm" );
level._effect[ "fx_buried_dust_rising_md" ] = loadfx( "maps/zombie_buried/fx_buried_dust_rising_md" ); level._effect["fx_buried_dust_rising_md"] = loadfx( "maps/zombie_buried/fx_buried_dust_rising_md" );
level._effect[ "fx_buried_dust_tunnel_ceiling" ] = loadfx( "maps/zombie_buried/fx_buried_dust_tunnel_ceiling" ); level._effect["fx_buried_dust_tunnel_ceiling"] = loadfx( "maps/zombie_buried/fx_buried_dust_tunnel_ceiling" );
level._effect[ "fx_buried_fireplace" ] = loadfx( "maps/zombie_buried/fx_buried_fireplace" ); level._effect["fx_buried_fireplace"] = loadfx( "maps/zombie_buried/fx_buried_fireplace" );
level._effect[ "fx_buried_fog_sm" ] = loadfx( "maps/zombie_buried/fx_buried_fog_sm" ); level._effect["fx_buried_fog_sm"] = loadfx( "maps/zombie_buried/fx_buried_fog_sm" );
level._effect[ "fx_buried_fog_md" ] = loadfx( "maps/zombie_buried/fx_buried_fog_md" ); level._effect["fx_buried_fog_md"] = loadfx( "maps/zombie_buried/fx_buried_fog_md" );
level._effect[ "fx_buried_glow_kerosene_lamp" ] = loadfx( "maps/zombie_buried/fx_buried_glow_kerosene_lamp" ); level._effect["fx_buried_glow_kerosene_lamp"] = loadfx( "maps/zombie_buried/fx_buried_glow_kerosene_lamp" );
level._effect[ "fx_buried_glow_sconce" ] = loadfx( "maps/zombie_buried/fx_buried_glow_sconce" ); level._effect["fx_buried_glow_sconce"] = loadfx( "maps/zombie_buried/fx_buried_glow_sconce" );
level._effect[ "fx_buried_god_ray_sm" ] = loadfx( "maps/zombie_buried/fx_buried_god_ray_sm" ); level._effect["fx_buried_god_ray_sm"] = loadfx( "maps/zombie_buried/fx_buried_god_ray_sm" );
level._effect[ "fx_buried_godray_church" ] = loadfx( "maps/zombie_buried/fx_buried_godray_church" ); level._effect["fx_buried_godray_church"] = loadfx( "maps/zombie_buried/fx_buried_godray_church" );
level._effect[ "fx_buried_godray_ext_sm" ] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_sm" ); level._effect["fx_buried_godray_ext_sm"] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_sm" );
level._effect[ "fx_buried_godray_ext_md" ] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_md" ); level._effect["fx_buried_godray_ext_md"] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_md" );
level._effect[ "fx_buried_godray_ext_lg" ] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_lg" ); level._effect["fx_buried_godray_ext_lg"] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_lg" );
level._effect[ "fx_buried_godray_ext_thin" ] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_thin" ); level._effect["fx_buried_godray_ext_thin"] = loadfx( "maps/zombie_buried/fx_buried_godray_ext_thin" );
level._effect[ "fx_buried_insects" ] = loadfx( "maps/zombie_buried/fx_buried_insects" ); level._effect["fx_buried_insects"] = loadfx( "maps/zombie_buried/fx_buried_insects" );
level._effect[ "fx_buried_sand_windy_sm" ] = loadfx( "maps/zombie_buried/fx_buried_sand_windy_sm" ); level._effect["fx_buried_sand_windy_sm"] = loadfx( "maps/zombie_buried/fx_buried_sand_windy_sm" );
level._effect[ "fx_buried_sand_windy_md" ] = loadfx( "maps/zombie_buried/fx_buried_sand_windy_md" ); level._effect["fx_buried_sand_windy_md"] = loadfx( "maps/zombie_buried/fx_buried_sand_windy_md" );
level._effect[ "fx_buried_sandstorm_edge" ] = loadfx( "maps/zombie_buried/fx_buried_sandstorm_edge" ); level._effect["fx_buried_sandstorm_edge"] = loadfx( "maps/zombie_buried/fx_buried_sandstorm_edge" );
level._effect[ "fx_buried_sandstorm_distant" ] = loadfx( "maps/zombie_buried/fx_buried_sandstorm_distant" ); level._effect["fx_buried_sandstorm_distant"] = loadfx( "maps/zombie_buried/fx_buried_sandstorm_distant" );
level._effect[ "fx_buried_smk_plume_lg" ] = loadfx( "maps/zombie_buried/fx_buried_smk_plume_lg" ); level._effect["fx_buried_smk_plume_lg"] = loadfx( "maps/zombie_buried/fx_buried_smk_plume_lg" );
level._effect[ "fx_buried_steam_md" ] = loadfx( "maps/zombie_buried/fx_buried_steam_md" ); level._effect["fx_buried_steam_md"] = loadfx( "maps/zombie_buried/fx_buried_steam_md" );
level._effect[ "fx_buried_water_dripping" ] = loadfx( "maps/zombie_buried/fx_buried_water_dripping" ); level._effect["fx_buried_water_dripping"] = loadfx( "maps/zombie_buried/fx_buried_water_dripping" );
level._effect[ "fx_buried_water_spilling" ] = loadfx( "maps/zombie_buried/fx_buried_water_spilling" ); level._effect["fx_buried_water_spilling"] = loadfx( "maps/zombie_buried/fx_buried_water_spilling" );
level._effect[ "fx_buried_water_spilling_lg" ] = loadfx( "maps/zombie_buried/fx_buried_water_spilling_lg" ); level._effect["fx_buried_water_spilling_lg"] = loadfx( "maps/zombie_buried/fx_buried_water_spilling_lg" );
level._effect[ "fx_buried_barrier_break" ] = loadfx( "maps/zombie_buried/fx_buried_barrier_break" ); level._effect["fx_buried_barrier_break"] = loadfx( "maps/zombie_buried/fx_buried_barrier_break" );
level._effect[ "fx_buried_barrier_break_sm" ] = loadfx( "maps/zombie_buried/fx_buried_barrier_break_sm" ); level._effect["fx_buried_barrier_break_sm"] = loadfx( "maps/zombie_buried/fx_buried_barrier_break_sm" );
level._effect[ "fx_buried_dest_floor_lg" ] = loadfx( "maps/zombie_buried/fx_buried_dest_floor_lg" ); level._effect["fx_buried_dest_floor_lg"] = loadfx( "maps/zombie_buried/fx_buried_dest_floor_lg" );
level._effect[ "fx_buried_dest_floor_sm" ] = loadfx( "maps/zombie_buried/fx_buried_dest_floor_sm" ); level._effect["fx_buried_dest_floor_sm"] = loadfx( "maps/zombie_buried/fx_buried_dest_floor_sm" );
level._effect[ "fx_buried_dest_platform_lsat" ] = loadfx( "maps/zombie_buried/fx_buried_dest_platform_lsat" ); level._effect["fx_buried_dest_platform_lsat"] = loadfx( "maps/zombie_buried/fx_buried_dest_platform_lsat" );
level._effect[ "fx_buried_fountain_spray" ] = loadfx( "maps/zombie_buried/fx_buried_fountain_spray" ); level._effect["fx_buried_fountain_spray"] = loadfx( "maps/zombie_buried/fx_buried_fountain_spray" );
level._effect[ "fx_buried_fountain_swirl" ] = loadfx( "maps/zombie_buried/fx_buried_fountain_swirl" ); level._effect["fx_buried_fountain_swirl"] = loadfx( "maps/zombie_buried/fx_buried_fountain_swirl" );
level._effect[ "fx_buried_meteor_sm_runner" ] = loadfx( "maps/zombie_buried/fx_buried_meteor_sm_runner" ); level._effect["fx_buried_meteor_sm_runner"] = loadfx( "maps/zombie_buried/fx_buried_meteor_sm_runner" );
level._effect[ "fx_buried_meteor_lg_runner" ] = loadfx( "maps/zombie_buried/fx_buried_meteor_lg_runner" ); level._effect["fx_buried_meteor_lg_runner"] = loadfx( "maps/zombie_buried/fx_buried_meteor_lg_runner" );
} }
#using_animtree("fxanim_props_dlc3");
precache_fxanim_props() precache_fxanim_props()
{ {
level.scr_anim[ "fxanim_props" ][ "sheriff_sign" ] = %fxanim_zom_buried_sign_sheriff_anim; level.scr_anim["fxanim_props"]["sheriff_sign"] = %fxanim_zom_buried_sign_sheriff_anim;
level.scr_anim[ "fxanim_props" ][ "balcony_rope" ] = %fxanim_zom_buried_rope_balcony_anim; level.scr_anim["fxanim_props"]["balcony_rope"] = %fxanim_zom_buried_rope_balcony_anim;
level.scr_anim[ "fxanim_props" ][ "livingstone_sign" ] = %fxanim_zom_buried_sign_livingstone_anim; level.scr_anim["fxanim_props"]["livingstone_sign"] = %fxanim_zom_buried_sign_livingstone_anim;
level.scr_anim[ "fxanim_props" ][ "livingstone_sign_fast" ] = %fxanim_zom_buried_sign_livingstone_fast_anim; level.scr_anim["fxanim_props"]["livingstone_sign_fast"] = %fxanim_zom_buried_sign_livingstone_fast_anim;
level.scr_anim[ "fxanim_props" ][ "noose_lrg" ] = %fxanim_zom_buried_noose_lrg_anim; level.scr_anim["fxanim_props"]["noose_lrg"] = %fxanim_zom_buried_noose_lrg_anim;
level.scr_anim[ "fxanim_props" ][ "noose_med" ] = %fxanim_zom_buried_noose_med_anim; level.scr_anim["fxanim_props"]["noose_med"] = %fxanim_zom_buried_noose_med_anim;
level.scr_anim[ "fxanim_props" ][ "noose_sml" ] = %fxanim_zom_buried_noose_sml_anim; level.scr_anim["fxanim_props"]["noose_sml"] = %fxanim_zom_buried_noose_sml_anim;
level.scr_anim[ "fxanim_props" ][ "rope_barn" ] = %fxanim_zom_buried_rope_barn_anim; level.scr_anim["fxanim_props"]["rope_barn"] = %fxanim_zom_buried_rope_barn_anim;
level.scr_anim[ "fxanim_props" ][ "lsat_catwalk" ] = %fxanim_zom_buried_catwalk_anim; level.scr_anim["fxanim_props"]["lsat_catwalk"] = %fxanim_zom_buried_catwalk_anim;
level.scr_anim[ "fxanim_props" ][ "sq_orbs" ] = %fxanim_zom_buried_orbs_anim; level.scr_anim["fxanim_props"]["sq_orbs"] = %fxanim_zom_buried_orbs_anim;
level.scr_anim[ "fxanim_props" ][ "endgame_machine_open" ] = %o_zombie_end_game_open; level.scr_anim["fxanim_props"]["endgame_machine_open"] = %o_zombie_end_game_open;
level.scr_anim[ "fxanim_props" ][ "endgame_machine_close" ] = %o_zombie_end_game_close; level.scr_anim["fxanim_props"]["endgame_machine_close"] = %o_zombie_end_game_close;
level.scr_anim[ "fxanim_props" ][ "gunsmith_sign" ] = %fxanim_zom_buried_sign_gunsmith_anim; level.scr_anim["fxanim_props"]["gunsmith_sign"] = %fxanim_zom_buried_sign_gunsmith_anim;
level.scr_anim[ "fxanim_props" ][ "corrugated_panels" ] = %fxanim_zom_buried_corrugated_panels_anim; level.scr_anim["fxanim_props"]["corrugated_panels"] = %fxanim_zom_buried_corrugated_panels_anim;
level.scr_anim[ "fxanim_props" ][ "clock_old" ] = %fxanim_gp_clock_old_anim; level.scr_anim["fxanim_props"]["clock_old"] = %fxanim_gp_clock_old_anim;
level.scr_anim[ "fxanim_props" ][ "chandelier" ] = %fxanim_gp_chandelier_anim; level.scr_anim["fxanim_props"]["chandelier"] = %fxanim_gp_chandelier_anim;
level.scr_anim[ "fxanim_props" ][ "track_board" ] = %fxanim_zom_buried_track_board_anim; level.scr_anim["fxanim_props"]["track_board"] = %fxanim_zom_buried_track_board_anim;
level.scr_anim[ "fxanim_props" ][ "wood_plank_hole" ] = %fxanim_zom_buried_wood_plank_hole_anim; level.scr_anim["fxanim_props"]["wood_plank_hole"] = %fxanim_zom_buried_wood_plank_hole_anim;
level.scr_anim[ "fxanim_props" ][ "wood_plank_bridge" ] = %fxanim_zom_buried_wood_plank_bridge_anim; level.scr_anim["fxanim_props"]["wood_plank_bridge"] = %fxanim_zom_buried_wood_plank_bridge_anim;
level.scr_anim[ "fxanim_props" ][ "drop_start" ] = %fxanim_zom_buried_board_drop_start_anim; level.scr_anim["fxanim_props"]["drop_start"] = %fxanim_zom_buried_board_drop_start_anim;
level.scr_anim[ "fxanim_props" ][ "rock_crusher" ] = %fxanim_zom_buried_rock_crusher_anim; level.scr_anim["fxanim_props"]["rock_crusher"] = %fxanim_zom_buried_rock_crusher_anim;
level.scr_anim[ "fxanim_props" ][ "rock_crusher_btm" ] = %fxanim_zom_buried_rock_crusher_btm_anim; level.scr_anim["fxanim_props"]["rock_crusher_btm"] = %fxanim_zom_buried_rock_crusher_btm_anim;
level.scr_anim[ "fxanim_props" ][ "piano_old" ] = %fxanim_gp_piano_old_anim; level.scr_anim["fxanim_props"]["piano_old"] = %fxanim_gp_piano_old_anim;
level.scr_anim[ "fxanim_props" ][ "general_store_sign" ] = %fxanim_zom_buried_sign_general_store_anim; level.scr_anim["fxanim_props"]["general_store_sign"] = %fxanim_zom_buried_sign_general_store_anim;
level.scr_anim[ "fxanim_props" ][ "tree_vines" ] = %fxanim_zom_buried_tree_vines_anim; level.scr_anim["fxanim_props"]["tree_vines"] = %fxanim_zom_buried_tree_vines_anim;
level.scr_anim[ "fxanim_props" ][ "ice_cream_sign" ] = %fxanim_zom_buried_sign_ice_cream_anim; level.scr_anim["fxanim_props"]["ice_cream_sign"] = %fxanim_zom_buried_sign_ice_cream_anim;
level.scr_anim[ "fxanim_props" ][ "conveyor" ] = %fxanim_zom_buried_conveyor_anim; level.scr_anim["fxanim_props"]["conveyor"] = %fxanim_zom_buried_conveyor_anim;
level.scr_anim[ "fxanim_props" ][ "conveyor_lrg" ] = %fxanim_zom_buried_conveyor_lrg_anim; level.scr_anim["fxanim_props"]["conveyor_lrg"] = %fxanim_zom_buried_conveyor_lrg_anim;
level.scr_anim[ "fxanim_props" ][ "fountain_grave" ] = %fxanim_zom_buried_fountain_grave_anim; level.scr_anim["fxanim_props"]["fountain_grave"] = %fxanim_zom_buried_fountain_grave_anim;
level.scr_anim[ "fxanim_props" ][ "fountain_maze" ] = %fxanim_zom_buried_fountain_maze_anim; level.scr_anim["fxanim_props"]["fountain_maze"] = %fxanim_zom_buried_fountain_maze_anim;
level.scr_anim[ "fxanim_props" ][ "rocks_church" ] = %fxanim_zom_buried_falling_rocks_church_anim; level.scr_anim["fxanim_props"]["rocks_church"] = %fxanim_zom_buried_falling_rocks_church_anim;
level.scr_anim[ "fxanim_props" ][ "rocks_graveyard" ] = %fxanim_zom_buried_falling_rocks_graveyard_anim; level.scr_anim["fxanim_props"]["rocks_graveyard"] = %fxanim_zom_buried_falling_rocks_graveyard_anim;
level.scr_anim[ "fxanim_props" ][ "rocks_mansion" ] = %fxanim_zom_buried_falling_rocks_mansion_anim; level.scr_anim["fxanim_props"]["rocks_mansion"] = %fxanim_zom_buried_falling_rocks_mansion_anim;
level.maze_switch_anim[ "switch_up" ] = %o_zombie_maze_switch_up; level.maze_switch_anim["switch_up"] = %o_zombie_maze_switch_up;
level.maze_switch_anim[ "switch_down" ] = %o_zombie_maze_switch_down; level.maze_switch_anim["switch_down"] = %o_zombie_maze_switch_down;
level.maze_switch_anim[ "switch_neutral" ] = %o_zombie_maze_switch_neutral; level.maze_switch_anim["switch_neutral"] = %o_zombie_maze_switch_neutral;
level.scr_anim[ "fxanim_props" ][ "bank_sign" ] = %fxanim_zom_buried_sign_bank_anim; level.scr_anim["fxanim_props"]["bank_sign"] = %fxanim_zom_buried_sign_bank_anim;
scriptmodelsuseanimtree( -1 ); scriptmodelsuseanimtree( -1 );
} }

View File

@ -1,245 +1,247 @@
//checked includes changed to match cerberus output // 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_zonemgr; #include maps\mp\_utility;
#include maps/mp/zm_buried_grief_street; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zm_buried_turned_street; #include maps\mp\zombies\_zm_game_module;
#include maps/mp/zm_buried_classic; #include maps\mp\gametypes_zm\_zm_gametype;
#include maps/mp/zm_buried; #include maps\mp\zombies\_zm_buildables;
#include maps/mp/zombies/_zm_buildables; #include maps\mp\zm_buried;
#include maps/mp/gametypes_zm/_zm_gametype; #include maps\mp\zm_buried_classic;
#include maps/mp/zombies/_zm_game_module; #include maps\mp\zm_buried_turned_street;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zm_buried_grief_street;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_zonemgr;
#include common_scripts/utility; #include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_unitrigger;
init() //checked matches cerberus output init()
{ {
add_map_gamemode( "zclassic", maps/mp/zm_buried::zclassic_preinit, undefined, undefined ); add_map_gamemode( "zclassic", maps\mp\zm_buried::zclassic_preinit, undefined, undefined );
add_map_gamemode( "zcleansed", maps/mp/zm_buried::zcleansed_preinit, undefined, undefined ); add_map_gamemode( "zcleansed", maps\mp\zm_buried::zcleansed_preinit, undefined, undefined );
add_map_gamemode( "zgrief", maps/mp/zm_buried::zgrief_preinit, undefined, undefined ); add_map_gamemode( "zgrief", maps\mp\zm_buried::zgrief_preinit, undefined, undefined );
add_map_location_gamemode( "zclassic", "processing", maps/mp/zm_buried_classic::precache, maps/mp/zm_buried_classic::main ); add_map_location_gamemode( "zclassic", "processing", maps\mp\zm_buried_classic::precache, maps\mp\zm_buried_classic::main );
add_map_location_gamemode( "zcleansed", "street", maps/mp/zm_buried_turned_street::precache, maps/mp/zm_buried_turned_street::main ); add_map_location_gamemode( "zcleansed", "street", maps\mp\zm_buried_turned_street::precache, maps\mp\zm_buried_turned_street::main );
add_map_location_gamemode( "zgrief", "street", maps/mp/zm_buried_grief_street::precache, maps/mp/zm_buried_grief_street::main ); add_map_location_gamemode( "zgrief", "street", maps\mp\zm_buried_grief_street::precache, maps\mp\zm_buried_grief_street::main );
} }
deletechalktriggers() //checked matches cerberus output deletechalktriggers()
{ {
chalk_triggers = getentarray( "chalk_buildable_trigger", "targetname" ); chalk_triggers = getentarray( "chalk_buildable_trigger", "targetname" );
array_thread( chalk_triggers, ::self_delete ); array_thread( chalk_triggers, ::self_delete );
} }
deletebuyabledoors() //checked changed to match cerberus output deletebuyabledoors()
{ {
doors_trigs = getentarray( "zombie_door", "targetname" ); doors_trigs = getentarray( "zombie_door", "targetname" );
foreach(door in doors_trigs)
{ foreach ( door in doors_trigs )
doors = getentarray( door.target, "targetname" ); {
array_thread( doors, ::self_delete ); doors = getentarray( door.target, "targetname" );
} array_thread( doors, ::self_delete );
array_thread( doors_trigs, ::self_delete ); }
array_thread( doors_trigs, ::self_delete );
} }
deletebuyabledebris( justtriggers ) //checked changed to match cerberus output deletebuyabledebris( justtriggers )
{ {
debris_trigs = getentarray( "zombie_debris", "targetname" ); debris_trigs = getentarray( "zombie_debris", "targetname" );
while ( !is_true( justtriggers ) )
{ if ( !is_true( justtriggers ) )
foreach ( trig in debris_trigs ) {
{ foreach ( trig in debris_trigs )
if ( isDefined( trig.script_flag ) ) {
{ if ( isdefined( trig.script_flag ) )
flag_set( trig.script_flag ); flag_set( trig.script_flag );
}
parts = getentarray( trig.target, "targetname" ); parts = getentarray( trig.target, "targetname" );
array_thread( parts, ::self_delete ); array_thread( parts, ::self_delete );
} }
} }
array_thread( debris_trigs, ::self_delete );
array_thread( debris_trigs, ::self_delete );
} }
deleteslothbarricades( justtriggers ) //checked changed to match cerberus output deleteslothbarricades( justtriggers )
{ {
sloth_trigs = getentarray( "sloth_barricade", "targetname" ); sloth_trigs = getentarray( "sloth_barricade", "targetname" );
while ( !is_true( justtriggers ) )
{ if ( !is_true( justtriggers ) )
foreach ( trig in sloth_trigs ) {
{ foreach ( trig in sloth_trigs )
if ( isDefined( trig.script_flag ) && level flag_exists( trig.script_flag ) ) {
{ if ( isdefined( trig.script_flag ) && level flag_exists( trig.script_flag ) )
flag_set( trig.script_flag ); flag_set( trig.script_flag );
}
parts = getentarray( trig.target, "targetname" ); parts = getentarray( trig.target, "targetname" );
array_thread( parts, ::self_delete ); array_thread( parts, ::self_delete );
} }
} }
array_thread( sloth_trigs, ::self_delete );
array_thread( sloth_trigs, ::self_delete );
} }
deleteslothbarricade( location ) //checked changed to match cerberus output deleteslothbarricade( location )
{ {
sloth_trigs = getentarray( "sloth_barricade", "targetname" ); sloth_trigs = getentarray( "sloth_barricade", "targetname" );
foreach ( trig in sloth_trigs )
{ foreach ( trig in sloth_trigs )
if ( isDefined( trig.script_location ) && trig.script_location == location ) {
{ if ( isdefined( trig.script_location ) && trig.script_location == location )
if ( isDefined( trig.script_flag ) ) {
{ if ( isdefined( trig.script_flag ) )
flag_set( trig.script_flag ); flag_set( trig.script_flag );
}
parts = getentarray( trig.target, "targetname" ); parts = getentarray( trig.target, "targetname" );
array_thread( parts, ::self_delete ); array_thread( parts, ::self_delete );
} }
} }
} }
spawnmapcollision( collision_model, origin ) //checked matches cerberus output spawnmapcollision( collision_model, origin )
{ {
if ( !isDefined( origin ) ) if ( !isdefined( origin ) )
{ origin = ( 0, 0, 0 );
origin = ( 0, 0, 0 );
} collision = spawn( "script_model", origin, 1 );
collision = spawn( "script_model", origin, 1 ); collision setmodel( collision_model );
collision setmodel( collision_model ); collision disconnectpaths();
collision disconnectpaths();
} }
turnperkon( perk ) //checked matches cerberus output turnperkon( perk )
{ {
level notify( perk + "_on" ); level notify( perk + "_on" );
wait_network_frame(); wait_network_frame();
} }
disableallzonesexcept( zones ) //checked changed to match cerberus output see compiler_limitations.md No. 1 disableallzonesexcept( zones )
{ {
foreach ( zone in zones ) foreach ( zone in zones )
{ level thread maps\mp\zombies\_zm_zonemgr::enable_zone( zone );
level thread maps/mp/zombies/_zm_zonemgr::enable_zone( zone );
} foreach ( zoneindex, zone in level.zones )
zoneindex = 0; {
foreach ( zone in level.zones ) should_disable = 1;
{
should_disable = 1; foreach ( cleared_zone in zones )
for ( i = 0; i > zones.size; i++ ) {
{ if ( zoneindex == cleared_zone )
if ( zoneindex == i ) should_disable = 0;
{ }
should_disable = 0;
} if ( is_true( should_disable ) )
} {
if ( is_true( should_disable ) ) zone.is_enabled = 0;
{ zone.is_spawning_allowed = 0;
zones[ i ].is_enabled = 0; }
zones[ i ].is_spawning_allowed = 0; }
}
zoneindex++;
}
} }
remove_adjacent_zone( main_zone, adjacent_zone ) //checked changed to match cerberus output remove_adjacent_zone( main_zone, adjacent_zone )
{ {
if ( isDefined( level.zones[ main_zone ].adjacent_zones ) && isDefined( level.zones[ main_zone ].adjacent_zones[ adjacent_zone ] ) ) if ( isdefined( level.zones[main_zone].adjacent_zones ) && isdefined( level.zones[main_zone].adjacent_zones[adjacent_zone] ) )
{ level.zones[main_zone].adjacent_zones[adjacent_zone] = undefined;
level.zones[ main_zone ].adjacent_zones[ adjacent_zone ] = undefined;
} if ( isdefined( level.zones[adjacent_zone].adjacent_zones ) && isdefined( level.zones[adjacent_zone].adjacent_zones[main_zone] ) )
if ( isDefined( level.zones[ adjacent_zone ].adjacent_zones ) && isDefined( level.zones[ adjacent_zone ].adjacent_zones[ main_zone ] ) ) level.zones[adjacent_zone].adjacent_zones[main_zone] = undefined;
{
level.zones[ adjacent_zone ].adjacent_zones[ main_zone ] = undefined;
}
} }
builddynamicwallbuy( location, weaponname ) //checked changed to match cerberus output builddynamicwallbuy( location, weaponname )
{ {
match_string = ( level.scr_zm_ui_gametype + "_" ) + level.scr_zm_map_start_location; match_string = level.scr_zm_ui_gametype + "_" + level.scr_zm_map_start_location;
foreach ( stub in level.chalk_builds )
{ foreach ( stub in level.chalk_builds )
wallbuy = getstruct( stub.target, "targetname" ); {
if ( isDefined( wallbuy.script_location ) && wallbuy.script_location == location ) wallbuy = getstruct( stub.target, "targetname" );
{
if ( !isDefined( wallbuy.script_noteworthy ) || issubstr( wallbuy.script_noteworthy, match_string ) ) if ( isdefined( wallbuy.script_location ) && wallbuy.script_location == location )
{ {
maps/mp/zombies/_zm_weapons::add_dynamic_wallbuy( weaponname, wallbuy.targetname, 1 ); if ( !isdefined( wallbuy.script_noteworthy ) || issubstr( wallbuy.script_noteworthy, match_string ) )
thread wait_and_remove( stub, stub.buildablezone.pieces[ 0 ] ); {
} maps\mp\zombies\_zm_weapons::add_dynamic_wallbuy( weaponname, wallbuy.targetname, 1 );
} thread wait_and_remove( stub, stub.buildablezone.pieces[0] );
} }
}
}
} }
buildbuildable( buildable ) //checked changed to match cerberus output see compiler_limitations.md No. 1 buildbuildable( buildable )
{ {
player = get_players()[ 0 ]; player = get_players()[0];
foreach ( stub in level.buildable_stubs )
{ foreach ( stub in level.buildable_stubs )
if ( !isDefined( buildable ) || stub.equipname == buildable ) {
{ if ( !isdefined( buildable ) || stub.equipname == buildable )
if ( isDefined( buildable ) || stub.persistent != 3 ) {
{ if ( isdefined( buildable ) || stub.persistent != 3 )
stub maps/mp/zombies/_zm_buildables::buildablestub_finish_build( player ); {
stub maps/mp/zombies/_zm_buildables::buildablestub_remove(); stub maps\mp\zombies\_zm_buildables::buildablestub_finish_build( player );
for ( i = 0; i < stub.buildablezone.pieces.size; i++ ) stub maps\mp\zombies\_zm_buildables::buildablestub_remove();
{
stub.buildablezone.pieces[ i ] maps/mp/zombies/_zm_buildables::piece_unspawn(); foreach ( piece in stub.buildablezone.pieces )
} piece maps\mp\zombies\_zm_buildables::piece_unspawn();
stub.model notsolid();
stub.model show(); stub.model notsolid();
return; stub.model show();
} return;
} }
} }
}
} }
wait_and_remove( stub, piece ) //checked matches cerberus output wait_and_remove( stub, piece )
{ {
wait 0.1; wait 0.1;
self buildablestub_remove(); self buildablestub_remove();
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub ); thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( stub );
piece piece_unspawn(); piece piece_unspawn();
} }
generatebuildabletarps() //checked changed to match cerberus output generatebuildabletarps()
{ {
struct_locations = getstructarray( "buildables_tarp", "targetname" ); struct_locations = getstructarray( "buildables_tarp", "targetname" );
level.buildable_tarps = []; level.buildable_tarps = [];
foreach ( struct in struct_locations )
{ foreach ( struct in struct_locations )
tarp = spawn( "script_model", struct.origin ); {
tarp.angles = struct.angles; tarp = spawn( "script_model", struct.origin );
tarp setmodel( "p6_zm_bu_buildable_bench_tarp" ); tarp.angles = struct.angles;
tarp.targetname = "buildable_tarp"; tarp setmodel( "p6_zm_bu_buildable_bench_tarp" );
if ( isDefined( struct.script_location ) ) tarp.targetname = "buildable_tarp";
{
tarp.script_location = struct.script_location; if ( isdefined( struct.script_location ) )
} tarp.script_location = struct.script_location;
level.buildable_tarps[ level.buildable_tarps.size ] = tarp;
} level.buildable_tarps[level.buildable_tarps.size] = tarp;
}
} }
deletebuildabletarp( location ) //checked changed to match cerberus output deletebuildabletarp( location )
{ {
foreach ( tarp in level.buildable_tarps ) foreach ( tarp in level.buildable_tarps )
{ {
if ( isDefined( tarp.script_location ) && tarp.script_location == location ) if ( isdefined( tarp.script_location ) && tarp.script_location == location )
{ tarp delete();
tarp delete(); }
}
}
} }
powerswitchstate( on ) //checked matches cerberus output powerswitchstate( on )
{ {
trigger = getent( "use_elec_switch", "targetname" ); trigger = getent( "use_elec_switch", "targetname" );
if ( isDefined( trigger ) )
{ if ( isdefined( trigger ) )
trigger delete(); trigger delete();
}
master_switch = getent( "elec_switch", "targetname" ); master_switch = getent( "elec_switch", "targetname" );
if ( isDefined( master_switch ) )
{ if ( isdefined( master_switch ) )
master_switch notsolid(); {
if ( is_true( on ) ) master_switch notsolid();
{
master_switch rotateroll( -90, 0.3 ); if ( is_true( on ) )
flag_set( "power_on" ); {
} master_switch rotateroll( -90, 0.3 );
} flag_set( "power_on" );
}
}
} }

View File

@ -1,108 +1,110 @@
#include maps/mp/gametypes_zm/_zm_gametype; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_buildables; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_magicbox; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_equip_subwoofer; #include common_scripts\utility;
#include maps/mp/zombies/_zm_equip_springpad; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_equip_turbine; #include maps\mp\zombies\_zm_race_utility;
#include maps/mp/zm_buried_buildables; #include maps\mp\zm_buried_gamemodes;
#include maps/mp/zm_buried_gamemodes; #include maps\mp\zm_buried_buildables;
#include maps/mp/zombies/_zm_race_utility; #include maps\mp\zombies\_zm_equip_turbine;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_equip_springpad;
#include common_scripts/utility; #include maps\mp\zombies\_zm_equip_subwoofer;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zombies\_zm_buildables;
#include maps\mp\gametypes_zm\_zm_gametype;
precache() //checked matches cerberus output precache()
{ {
precachemodel( "zm_collision_buried_street_grief" ); precachemodel( "zm_collision_buried_street_grief" );
precachemodel( "p6_zm_bu_buildable_bench_tarp" ); precachemodel( "p6_zm_bu_buildable_bench_tarp" );
level.chalk_buildable_pieces_hide = 1; level.chalk_buildable_pieces_hide = 1;
griefbuildables = array( "chalk", "turbine", "springpad_zm", "subwoofer_zm" ); griefbuildables = array( "chalk", "turbine", "springpad_zm", "subwoofer_zm" );
maps/mp/zm_buried_buildables::include_buildables( griefbuildables ); maps\mp\zm_buried_buildables::include_buildables( griefbuildables );
maps/mp/zm_buried_buildables::init_buildables( griefbuildables ); maps\mp\zm_buried_buildables::init_buildables( griefbuildables );
maps/mp/zombies/_zm_equip_turbine::init(); maps\mp\zombies\_zm_equip_turbine::init();
maps/mp/zombies/_zm_equip_turbine::init_animtree(); maps\mp\zombies\_zm_equip_turbine::init_animtree();
maps/mp/zombies/_zm_equip_springpad::init( &"ZM_BURIED_EQ_SP_PHS", &"ZM_BURIED_EQ_SP_HTS" ); maps\mp\zombies\_zm_equip_springpad::init( &"ZM_BURIED_EQ_SP_PHS", &"ZM_BURIED_EQ_SP_HTS" );
maps/mp/zombies/_zm_equip_subwoofer::init( &"ZM_BURIED_EQ_SW_PHS", &"ZM_BURIED_EQ_SW_HTS" ); maps\mp\zombies\_zm_equip_subwoofer::init( &"ZM_BURIED_EQ_SW_PHS", &"ZM_BURIED_EQ_SW_HTS" );
} }
street_treasure_chest_init() //checked matches cerberus output street_treasure_chest_init()
{ {
start_chest = getstruct( "start_chest", "script_noteworthy" ); start_chest = getstruct( "start_chest", "script_noteworthy" );
court_chest = getstruct( "courtroom_chest1", "script_noteworthy" ); court_chest = getstruct( "courtroom_chest1", "script_noteworthy" );
tunnel_chest = getstruct( "tunnels_chest1", "script_noteworthy" ); tunnel_chest = getstruct( "tunnels_chest1", "script_noteworthy" );
jail_chest = getstruct( "jail_chest1", "script_noteworthy" ); jail_chest = getstruct( "jail_chest1", "script_noteworthy" );
gun_chest = getstruct( "gunshop_chest", "script_noteworthy" ); gun_chest = getstruct( "gunshop_chest", "script_noteworthy" );
setdvar( "disableLookAtEntityLogic", 1 ); setdvar( "disableLookAtEntityLogic", 1 );
level.chests = []; level.chests = [];
level.chests[ level.chests.size ] = start_chest; level.chests[level.chests.size] = start_chest;
level.chests[ level.chests.size ] = court_chest; level.chests[level.chests.size] = court_chest;
level.chests[ level.chests.size ] = tunnel_chest; level.chests[level.chests.size] = tunnel_chest;
level.chests[ level.chests.size ] = jail_chest; level.chests[level.chests.size] = jail_chest;
level.chests[ level.chests.size ] = gun_chest; level.chests[level.chests.size] = gun_chest;
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" ); maps\mp\zombies\_zm_magicbox::treasure_chest_init( "start_chest" );
} }
main() //checked matches cerberus output main()
{ {
level.buildables_built[ "pap" ] = 1; level.buildables_built["pap"] = 1;
level.equipment_team_pick_up = 1; level.equipment_team_pick_up = 1;
level thread maps/mp/zombies/_zm_buildables::think_buildables(); level thread maps\mp\zombies\_zm_buildables::think_buildables();
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "street" ); maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "street" );
street_treasure_chest_init(); street_treasure_chest_init();
generatebuildabletarps(); generatebuildabletarps();
deletebuildabletarp( "courthouse" ); deletebuildabletarp( "courthouse" );
deletebuildabletarp( "bar" ); deletebuildabletarp( "bar" );
deletebuildabletarp( "generalstore" ); deletebuildabletarp( "generalstore" );
deleteslothbarricades(); deleteslothbarricades();
powerswitchstate( 1 ); powerswitchstate( 1 );
level.enemy_location_override_func = ::enemy_location_override; level.enemy_location_override_func = ::enemy_location_override;
spawnmapcollision( "zm_collision_buried_street_grief" ); spawnmapcollision( "zm_collision_buried_street_grief" );
flag_wait( "initial_blackscreen_passed" ); flag_wait( "initial_blackscreen_passed" );
flag_wait( "start_zombie_round_logic" ); flag_wait( "start_zombie_round_logic" );
wait 1; wait 1;
builddynamicwallbuys(); builddynamicwallbuys();
buildbuildables(); buildbuildables();
turnperkon( "revive" ); turnperkon( "revive" );
turnperkon( "doubletap" ); turnperkon( "doubletap" );
turnperkon( "marathon" ); turnperkon( "marathon" );
turnperkon( "juggernog" ); turnperkon( "juggernog" );
turnperkon( "sleight" ); turnperkon( "sleight" );
turnperkon( "additionalprimaryweapon" ); turnperkon( "additionalprimaryweapon" );
turnperkon( "Pack_A_Punch" ); turnperkon( "Pack_A_Punch" );
} }
enemy_location_override( zombie, enemy ) //checked matches cerberus output enemy_location_override( zombie, enemy )
{ {
location = enemy.origin; location = enemy.origin;
if ( isDefined( self.reroute ) && self.reroute )
{ if ( isdefined( self.reroute ) && self.reroute )
if ( isDefined( self.reroute_origin ) ) {
{ if ( isdefined( self.reroute_origin ) )
location = self.reroute_origin; location = self.reroute_origin;
} }
}
return location; return location;
} }
builddynamicwallbuys() //checked matches cerberus output builddynamicwallbuys()
{ {
builddynamicwallbuy( "bank", "beretta93r_zm" ); builddynamicwallbuy( "bank", "beretta93r_zm" );
builddynamicwallbuy( "bar", "pdw57_zm" ); builddynamicwallbuy( "bar", "pdw57_zm" );
builddynamicwallbuy( "church", "ak74u_zm" ); builddynamicwallbuy( "church", "ak74u_zm" );
builddynamicwallbuy( "courthouse", "mp5k_zm" ); builddynamicwallbuy( "courthouse", "mp5k_zm" );
builddynamicwallbuy( "generalstore", "m16_zm" ); builddynamicwallbuy( "generalstore", "m16_zm" );
builddynamicwallbuy( "mansion", "an94_zm" ); builddynamicwallbuy( "mansion", "an94_zm" );
builddynamicwallbuy( "morgue", "svu_zm" ); builddynamicwallbuy( "morgue", "svu_zm" );
builddynamicwallbuy( "prison", "claymore_zm" ); builddynamicwallbuy( "prison", "claymore_zm" );
builddynamicwallbuy( "stables", "bowie_knife_zm" ); builddynamicwallbuy( "stables", "bowie_knife_zm" );
builddynamicwallbuy( "stablesroof", "frag_grenade_zm" ); builddynamicwallbuy( "stablesroof", "frag_grenade_zm" );
builddynamicwallbuy( "toystore", "tazer_knuckles_zm" ); builddynamicwallbuy( "toystore", "tazer_knuckles_zm" );
builddynamicwallbuy( "candyshop", "870mcs_zm" ); builddynamicwallbuy( "candyshop", "870mcs_zm" );
} }
buildbuildables() //checked matches cerberus output buildbuildables()
{ {
buildbuildable( "springpad_zm" ); buildbuildable( "springpad_zm" );
buildbuildable( "subwoofer_zm" ); buildbuildable( "subwoofer_zm" );
buildbuildable( "turbine" ); buildbuildable( "turbine" );
} }

View File

@ -1,62 +1,63 @@
#include maps/mp/zombies/_zm_utility; // 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;
#using_animtree( "zm_buried_props" ); #include maps\mp\zombies\_zm_utility;
init_jail_animtree() init_jail_animtree()
{ {
scriptmodelsuseanimtree( -1 ); scriptmodelsuseanimtree( -1 );
} }
#using_animtree("zm_buried_props");
init_jail_anims() init_jail_anims()
{ {
level.jail_open = %o_zombie_sloth_idle_jail_2_cower_door; level.jail_open = %o_zombie_sloth_idle_jail_2_cower_door;
level.jail_open_jumpback = %o_zombie_sloth_idle_jail_2_cower_jumpback_door; level.jail_open_jumpback = %o_zombie_sloth_idle_jail_2_cower_jumpback_door;
level.jail_close_idle = %o_zombie_sloth_run_into_jail_2_idle_jail; level.jail_close_idle = %o_zombie_sloth_run_into_jail_2_idle_jail;
level.jail_close_cower = %o_zombie_sloth_cower_2_close_door; level.jail_close_cower = %o_zombie_sloth_cower_2_close_door;
} }
jailuseanimtree() jailuseanimtree()
{ {
self useanimtree( -1 ); self useanimtree( -1 );
} }
init_jail() init_jail()
{ {
init_jail_anims(); init_jail_anims();
level.cell_door = getent( "sloth_cell_door", "targetname" ); level.cell_door = getent( "sloth_cell_door", "targetname" );
level.cell_door.clip = getent( level.cell_door.target, "targetname" ); level.cell_door.clip = getent( level.cell_door.target, "targetname" );
level.cell_door jailuseanimtree(); level.cell_door jailuseanimtree();
level.jail_open_door = ::jail_open_door; level.jail_open_door = ::jail_open_door;
level.jail_close_door = ::jail_close_door; level.jail_close_door = ::jail_close_door;
} }
jail_open_door( jumpback ) jail_open_door( jumpback )
{ {
level.cell_door playsound( "zmb_jail_door_open" ); level.cell_door playsound( "zmb_jail_door_open" );
if ( is_true( jumpback ) )
{ if ( is_true( jumpback ) )
level.cell_door setanim( level.jail_open_jumpback, 1, 1, 1 ); level.cell_door setanim( level.jail_open_jumpback, 1, 1, 1 );
} else
else level.cell_door setanim( level.jail_open, 1, 1, 1 );
{
level.cell_door setanim( level.jail_open, 1, 1, 1 ); if ( isdefined( level.cell_door.clip ) )
} {
if ( isDefined( level.cell_door.clip ) ) level.cell_door.clip notsolid();
{ level.cell_door.clip connectpaths();
level.cell_door.clip notsolid(); }
level.cell_door.clip connectpaths();
}
} }
jail_close_door() jail_close_door()
{ {
level.cell_door playsound( "zmb_jail_door_close" ); level.cell_door playsound( "zmb_jail_door_close" );
level.cell_door setanim( level.jail_close_cower, 1, 1, 1 ); level.cell_door setanim( level.jail_close_cower, 1, 1, 1 );
if ( isDefined( level.cell_door.clip ) )
{ if ( isdefined( level.cell_door.clip ) )
level.cell_door.clip solid(); {
level.cell_door.clip disconnectpaths(); level.cell_door.clip solid();
} level.cell_door.clip disconnectpaths();
}
} }

View File

@ -1,531 +1,524 @@
//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_weap_time_bomb; #include common_scripts\utility;
#include maps/mp/zombies/_zm_spawner; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_zonemgr; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_equip_headchopper; #include maps\mp\zombies\_zm_net;
#include maps/mp/zombies/_zm_net; #include maps\mp\zombies\_zm_equip_headchopper;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_zonemgr;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_spawner;
#include common_scripts/utility; #include maps\mp\zombies\_zm_weap_time_bomb;
#include maps\mp\zombies\_zm_audio;
maze_precache() //checked changed to match cerberus output maze_precache()
{ {
blocker_locations = getstructarray( "maze_blocker", "targetname" ); blocker_locations = getstructarray( "maze_blocker", "targetname" );
model_list = []; model_list = [];
for ( i = 0; i < blocker_locations.size; i++ )
{ for ( i = 0; i < blocker_locations.size; i++ )
model_list[ blocker_locations[ i ].model ] = 1; model_list[blocker_locations[i].model] = 1;
}
model_names = getarraykeys( model_list ); model_names = getarraykeys( model_list );
for ( i = 0; i < model_names.size; i++ )
{ for ( i = 0; i < model_names.size; i++ )
precachemodel( model_names[ i ] ); precachemodel( model_names[i] );
}
} }
maze_nodes_link_unlink_internal( func_ptr, bignorechangeonmigrate ) //checked changed to match cerberus output maze_nodes_link_unlink_internal( func_ptr, bignorechangeonmigrate )
{ {
for ( i = 0; i < self.blocked_nodes.size; i++ ) for ( i = 0; i < self.blocked_nodes.size; i++ )
{ {
for ( j = 0; j < self.blocked_nodes[i].connected_nodes.size; j++ ) for ( j = 0; j < self.blocked_nodes[i].connected_nodes.size; j++ )
{ {
[[ func_ptr ]]( self.blocked_nodes[ i ], self.blocked_nodes[ i ].connected_nodes[ j ], bignorechangeonmigrate ); [[ func_ptr ]]( self.blocked_nodes[i], self.blocked_nodes[i].connected_nodes[j], bignorechangeonmigrate );
[[ func_ptr ]]( self.blocked_nodes[ i ].connected_nodes[ j ], self.blocked_nodes[ i ], bignorechangeonmigrate ); [[ func_ptr ]]( self.blocked_nodes[i].connected_nodes[j], self.blocked_nodes[i], bignorechangeonmigrate );
} }
} }
} }
link_nodes_for_blocker_location() //checked matches cerberus output link_nodes_for_blocker_location()
{ {
self maze_nodes_link_unlink_internal( maps/mp/zombies/_zm_utility::link_nodes, 1 ); self maze_nodes_link_unlink_internal( maps\mp\zombies\_zm_utility::link_nodes, 1 );
} }
unlink_nodes_for_blocker_location() //checked matches cerberus output unlink_nodes_for_blocker_location()
{ {
self maze_nodes_link_unlink_internal( maps/mp/zombies/_zm_utility::unlink_nodes, 0 ); self maze_nodes_link_unlink_internal( maps\mp\zombies\_zm_utility::unlink_nodes, 0 );
} }
init_maze_clientfields() //checked changed to match cerberus output init_maze_clientfields()
{ {
blocker_locations = getstructarray( "maze_blocker", "targetname" ); blocker_locations = getstructarray( "maze_blocker", "targetname" );
foreach ( blocker in blocker_locations )
{ foreach ( blocker in blocker_locations )
registerclientfield( "world", "maze_blocker_" + blocker.script_noteworthy, 12000, 1, "int" ); registerclientfield( "world", "maze_blocker_" + blocker.script_noteworthy, 12000, 1, "int" );
}
} }
init_maze_permutations() //checked changed to match cerberus output init_maze_permutations()
{ {
blocker_locations = getstructarray( "maze_blocker", "targetname" ); blocker_locations = getstructarray( "maze_blocker", "targetname" );
level._maze._blocker_locations = []; level._maze._blocker_locations = [];
for ( i = 0; i < blocker_locations.size; i++ )
{ for ( i = 0; i < blocker_locations.size; i++ )
if ( isDefined( blocker_locations[ i ].target ) ) {
{ if ( isdefined( blocker_locations[i].target ) )
blocker_locations[ i ].blocked_nodes = getnodearray( blocker_locations[ i ].target, "targetname" ); {
for ( j = 0; j < blocker_locations[i].blocked_nodes.size; j++ ) blocker_locations[i].blocked_nodes = getnodearray( blocker_locations[i].target, "targetname" );
{
blocker_locations[ i ].blocked_nodes[ j ].connected_nodes = getnodearray( blocker_locations[ i ].blocked_nodes[ j ].target, "targetname" ); for ( j = 0; j < blocker_locations[i].blocked_nodes.size; j++ )
} blocker_locations[i].blocked_nodes[j].connected_nodes = getnodearray( blocker_locations[i].blocked_nodes[j].target, "targetname" );
} }
else else
{ blocker_locations[i].blocked_nodes = [];
blocker_locations[ i ].blocked_nodes = [];
} level._maze._blocker_locations[blocker_locations[i].script_noteworthy] = blocker_locations[i];
level._maze._blocker_locations[ blocker_locations[ i ].script_noteworthy ] = blocker_locations[ i ]; }
}
level._maze._perms = array( array( "blocker_1", "blocker_2", "blocker_3", "blocker_4" ), array( "blocker_5", "blocker_6", "blocker_7", "blocker_8", "blocker_9" ), array( "blocker_1", "blocker_10", "blocker_6", "blocker_4", "blocker_11" ), array( "blocker_1", "blocker_3", "blocker_4", "blocker_12" ), array( "blocker_5", "blocker_6", "blocker_12", "blocker_13" ), array( "blocker_4", "blocker_6", "blocker_14" ) ); level._maze._perms = array( array( "blocker_1", "blocker_2", "blocker_3", "blocker_4" ), array( "blocker_5", "blocker_6", "blocker_7", "blocker_8", "blocker_9" ), array( "blocker_1", "blocker_10", "blocker_6", "blocker_4", "blocker_11" ), array( "blocker_1", "blocker_3", "blocker_4", "blocker_12" ), array( "blocker_5", "blocker_6", "blocker_12", "blocker_13" ), array( "blocker_4", "blocker_6", "blocker_14" ) );
randomize_maze_perms(); randomize_maze_perms();
level._maze._active_perm_list = []; level._maze._active_perm_list = [];
} }
init_maze_blocker_pool() //checked changed to match cerberus output init_maze_blocker_pool()
{ {
pool_size = 0; pool_size = 0;
for ( i = 0; i < level._maze._perms.size; i++ )
{ for ( i = 0; i < level._maze._perms.size; i++ )
if ( level._maze._perms[ i ].size > pool_size ) {
{ if ( level._maze._perms[i].size > pool_size )
pool_size = level._maze._perms[ i ].size; pool_size = level._maze._perms[i].size;
} }
}
level._maze._blocker_pool = []; level._maze._blocker_pool = [];
for ( i = 0; i < pool_size; i++ )
{ for ( i = 0; i < pool_size; i++ )
ent = spawn( "script_model", level._maze.players_in_maze_volume.origin - vectorScale( ( 0, 0, 1 ), 300 ) ); {
ent ghost(); ent = spawn( "script_model", level._maze.players_in_maze_volume.origin - vectorscale( ( 0, 0, 1 ), 300.0 ) );
ent.in_use = 0; ent ghost();
level._maze._blocker_pool[ i ] = ent; ent.in_use = 0;
} level._maze._blocker_pool[i] = ent;
level._maze._blocker_pool_num_free = pool_size; }
level._maze._blocker_pool_num_free = pool_size;
} }
free_blockers_available() //checked matches cerberus output free_blockers_available()
{ {
return level._maze._blocker_pool_num_free > 0; return level._maze._blocker_pool_num_free > 0;
} }
get_free_blocker_model_from_pool() //checked changed to match cerberus output get_free_blocker_model_from_pool()
{ {
for ( i = 0; i < level._maze._blocker_pool.size; i++ ) for ( i = 0; i < level._maze._blocker_pool.size; i++ )
{ {
if ( !level._maze._blocker_pool[ i ].in_use ) if ( !level._maze._blocker_pool[i].in_use )
{ {
level._maze._blocker_pool[ i ].in_use = 1; level._maze._blocker_pool[i].in_use = 1;
level._maze._blocker_pool_num_free--; level._maze._blocker_pool_num_free--;
return level._maze._blocker_pool[i];
return level._maze._blocker_pool[ i ]; }
} }
}
/*
/# /#
assertmsg( "zm_buried_maze : Blocker pool is empty." ); assertmsg( "zm_buried_maze : Blocker pool is empty." );
#/ #/
*/ return undefined;
return undefined;
} }
return_blocker_model_to_pool( ent ) //checked changed to match cerberus output return_blocker_model_to_pool( ent )
{ {
ent ghost(); ent ghost();
ent.origin = level._maze.players_in_maze_volume.origin - vectorScale( ( 0, 0, 1 ), 300 ); ent.origin = level._maze.players_in_maze_volume.origin - vectorscale( ( 0, 0, 1 ), 300.0 );
ent dontinterpolate(); ent dontinterpolate();
ent.in_use = 0; ent.in_use = 0;
level._maze._blocker_pool_num_free++; level._maze._blocker_pool_num_free++;
} }
randomize_maze_perms() //checked matches cerberus output randomize_maze_perms()
{ {
level._maze._perms = array_randomize( level._maze._perms ); level._maze._perms = array_randomize( level._maze._perms );
level._maze._cur_perm = 0; level._maze._cur_perm = 0;
} }
init() //checked matches cerberus output init()
{ {
level._maze = spawnstruct(); level._maze = spawnstruct();
level._maze.players_in_maze_volume = getent( "maze_player_volume", "targetname" ); level._maze.players_in_maze_volume = getent( "maze_player_volume", "targetname" );
level._maze.players_can_see_maze_volume = getent( "maze_player_can_see_volume", "targetname" ); level._maze.players_can_see_maze_volume = getent( "maze_player_can_see_volume", "targetname" );
init_maze_clientfields(); init_maze_clientfields();
init_maze_permutations(); init_maze_permutations();
init_maze_blocker_pool(); init_maze_blocker_pool();
init_hedge_maze_spawnpoints(); init_hedge_maze_spawnpoints();
register_custom_spawner_entry( "hedge_location", ::maze_do_zombie_spawn ); register_custom_spawner_entry( "hedge_location", ::maze_do_zombie_spawn );
level thread maze_achievement_watcher(); level thread maze_achievement_watcher();
level thread vo_in_maze(); level thread vo_in_maze();
} }
maze_blocker_sinks_thread( blocker ) //checked changed to match cerberus output maze_blocker_sinks_thread( blocker )
{ {
self waittill( "lower_" + self.script_noteworthy ); self waittill( "lower_" + self.script_noteworthy );
if ( flag( "start_zombie_round_logic" ) )
{ if ( flag( "start_zombie_round_logic" ) )
level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 ); level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 );
}
blocker maps/mp/zombies/_zm_equip_headchopper::destroyheadchopperstouching(); blocker maps\mp\zombies\_zm_equip_headchopper::destroyheadchopperstouching();
blocker moveto( self.origin - vectorScale( ( 0, 0, 1 ), 96 ), 1 ); blocker moveto( self.origin - vectorscale( ( 0, 0, 1 ), 96.0 ), 1.0 );
blocker waittill( "movedone" );
if ( flag( "start_zombie_round_logic" ) ) blocker waittill( "movedone" );
{
level setclientfield( "maze_blocker_" + self.script_noteworthy, 0 ); if ( flag( "start_zombie_round_logic" ) )
} level setclientfield( "maze_blocker_" + self.script_noteworthy, 0 );
return_blocker_model_to_pool( blocker );
self link_nodes_for_blocker_location(); return_blocker_model_to_pool( blocker );
self link_nodes_for_blocker_location();
} }
delay_destroy_corpses_near_blocker() //checked changed to match cerberus output delay_destroy_corpses_near_blocker()
{ {
wait 0.2; wait 0.2;
corpses = getcorpsearray(); corpses = getcorpsearray();
if ( isDefined( corpses ) )
{ if ( isdefined( corpses ) )
foreach ( corpse in corpses ) {
{ foreach ( corpse in corpses )
if ( distancesquared( corpse.origin, self.origin ) < 2304 ) {
{ if ( distancesquared( corpse.origin, self.origin ) < 2304 )
corpse delete(); corpse delete();
} }
} }
}
} }
maze_blocker_rises_thread() //checked changed to match cerberus output maze_blocker_rises_thread()
{ {
blocker = get_free_blocker_model_from_pool(); blocker = get_free_blocker_model_from_pool();
self thread maze_blocker_sinks_thread( blocker ); self thread maze_blocker_sinks_thread( blocker );
self unlink_nodes_for_blocker_location(); self unlink_nodes_for_blocker_location();
blocker.origin = self.origin - vectorScale( ( 0, 0, 1 ), 96 ); blocker.origin = self.origin - vectorscale( ( 0, 0, 1 ), 96.0 );
blocker.angles = self.angles; blocker.angles = self.angles;
blocker setmodel( self.model ); blocker setmodel( self.model );
blocker dontinterpolate(); blocker dontinterpolate();
blocker show(); blocker show();
wait 0.05; wait 0.05;
if ( flag( "start_zombie_round_logic" ) )
{ if ( flag( "start_zombie_round_logic" ) )
level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 ); level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 );
}
blocker maps/mp/zombies/_zm_equip_headchopper::destroyheadchopperstouching(); blocker maps\mp\zombies\_zm_equip_headchopper::destroyheadchopperstouching();
blocker moveto( self.origin, 0.65 ); blocker moveto( self.origin, 0.65 );
blocker thread delay_destroy_corpses_near_blocker(); blocker thread delay_destroy_corpses_near_blocker();
blocker waittill( "movedone" );
if ( flag( "start_zombie_round_logic" ) ) blocker waittill( "movedone" );
{
level setclientfield( "maze_blocker_" + self.script_noteworthy, 0 ); if ( flag( "start_zombie_round_logic" ) )
} level setclientfield( "maze_blocker_" + self.script_noteworthy, 0 );
} }
maze_do_perm_change() //checked changed to match cerberus output maze_do_perm_change()
{ {
level._maze._cur_perm++; level._maze._cur_perm++;
if ( level._maze._cur_perm == level._maze._perms.size )
{ if ( level._maze._cur_perm == level._maze._perms.size )
randomize_maze_perms(); randomize_maze_perms();
}
new_perm_list = level._maze._perms[ level._maze._cur_perm ]; new_perm_list = level._maze._perms[level._maze._cur_perm];
blockers_raise_list = []; blockers_raise_list = [];
blockers_lower_list = level._maze._active_perm_list; blockers_lower_list = level._maze._active_perm_list;
for ( i = 0; i < new_perm_list.size; i++ )
{ for ( i = 0; i < new_perm_list.size; i++ )
found = 0; {
for ( j = 0; j < level._maze._active_perm_list.size; j++ ) found = 0;
{
if ( new_perm_list[ i ] == level._maze._active_perm_list[ j ] ) for ( j = 0; j < level._maze._active_perm_list.size; j++ )
{ {
found = 1; if ( new_perm_list[i] == level._maze._active_perm_list[j] )
blockers_lower_list[ j ] = ""; {
break; found = 1;
} blockers_lower_list[j] = "";
} break;
if ( !found ) }
{ }
blockers_raise_list[ blockers_raise_list.size ] = new_perm_list[ i ];
} if ( !found )
} blockers_raise_list[blockers_raise_list.size] = new_perm_list[i];
level thread raise_new_perm_blockers( blockers_raise_list ); }
level thread lower_old_perm_blockers( blockers_lower_list );
level._maze._active_perm_list = level._maze._perms[ level._maze._cur_perm ]; level thread raise_new_perm_blockers( blockers_raise_list );
level thread lower_old_perm_blockers( blockers_lower_list );
level._maze._active_perm_list = level._maze._perms[level._maze._cur_perm];
} }
raise_new_perm_blockers( list ) //checked changed to match cerberus output raise_new_perm_blockers( list )
{ {
for ( i = 0; i < list.size; i++ ) for ( i = 0; i < list.size; i++ )
{ {
while ( !free_blockers_available() ) while ( !free_blockers_available() )
{ wait 0.1;
wait 0.1;
} level._maze._blocker_locations[list[i]] thread maze_blocker_rises_thread();
level._maze._blocker_locations[ list[ i ] ] thread maze_blocker_rises_thread(); wait 0.25;
wait 0.25; }
}
} }
lower_old_perm_blockers( list ) //checked changed to match cerberus output lower_old_perm_blockers( list )
{ {
for ( i = 0; i < list.size; i++ ) for ( i = 0; i < list.size; i++ )
{ {
if ( list[ i ] != "" ) if ( list[i] != "" )
{ level._maze._blocker_locations[list[i]] notify( "lower_" + list[i] );
level._maze._blocker_locations[ list[ i ] ] notify( "lower_" + list[ i ] );
} wait 0.25;
wait 0.25; }
}
} }
maze_debug_print( str ) //checked matches cerberus output could not find dvar maze_debug_print( str )
{ {
/*
/# /#
if ( getDvar( #"55B04A98" ) != "" ) if ( getdvar( _hash_55B04A98 ) != "" )
{ println( "Maze : " + str );
println( "Maze : " + str );
#/ #/
}
*/
} }
maze_can_change() //checked changed to match cerberus output maze_can_change()
{ {
players = getplayers(); players = getplayers();
foreach ( player in players )
{ foreach ( player in players )
if ( player.sessionstate != "spectator" && player istouching( level._maze.players_in_maze_volume ) ) {
{ if ( player.sessionstate != "spectator" && player istouching( level._maze.players_in_maze_volume ) )
maze_debug_print( "Player " + player getentitynumber() + " in maze volume. Maze cannot change." ); {
return 0; maze_debug_print( "Player " + player getentitynumber() + " in maze volume. Maze cannot change." );
} return false;
} }
foreach ( player in players ) }
{
if ( player.sessionstate != "spectator" && player istouching( level._maze.players_can_see_maze_volume ) ) foreach ( player in players )
{ {
if ( player maps/mp/zombies/_zm_utility::is_player_looking_at( level._maze.players_in_maze_volume.origin, 0.5, 0 ) ) if ( player.sessionstate != "spectator" && player istouching( level._maze.players_can_see_maze_volume ) )
{ {
maze_debug_print( "Player " + player getentitynumber() + " looking at maze. Maze cannot change." ); if ( player maps\mp\zombies\_zm_utility::is_player_looking_at( level._maze.players_in_maze_volume.origin, 0.5, 0 ) )
return 0; {
} maze_debug_print( "Player " + player getentitynumber() + " looking at maze. Maze cannot change." );
} return false;
} }
maze_debug_print( "Maze mutating." ); }
return 1; }
maze_debug_print( "Maze mutating." );
return true;
} }
maze_think() //checked matches cerberus output maze_think()
{ {
wait 0.1; wait 0.1;
while ( 1 )
{ while ( true )
if ( maze_can_change() ) {
{ if ( maze_can_change() )
maze_do_perm_change(); {
level notify( "zm_buried_maze_changed" ); maze_do_perm_change();
} level notify( "zm_buried_maze_changed" );
wait 10; }
}
wait 10.0;
}
} }
init_hedge_maze_spawnpoints() //checked matches cerberus output init_hedge_maze_spawnpoints()
{ {
level.maze_hedge_spawnpoints = getstructarray( "custom_spawner_entry hedge_location", "script_noteworthy" ); level.maze_hedge_spawnpoints = getstructarray( "custom_spawner_entry hedge_location", "script_noteworthy" );
} }
maze_do_zombie_spawn( spot ) //checked partially changed to match cerberus output see info.md maze_do_zombie_spawn( spot )
{ {
self endon( "death" ); self endon( "death" );
spots = level.maze_hedge_spawnpoints; spots = level.maze_hedge_spawnpoints;
spot = undefined; spot = undefined;
/*
/# /#
assert( spots.size > 0, "No spawn locations found" ); assert( spots.size > 0, "No spawn locations found" );
#/ #/
*/ players_in_maze = maps\mp\zombies\_zm_zonemgr::get_players_in_zone( "zone_maze", 1 );
players_in_maze = maps/mp/zombies/_zm_zonemgr::get_players_in_zone( "zone_maze", 1 );
if ( isDefined( players_in_maze ) && players_in_maze.size != 0 ) if ( isdefined( players_in_maze ) && players_in_maze.size != 0 )
{ {
player = random( players_in_maze ); player = random( players_in_maze );
maxdistance = 256; maxdistance = 256;
if ( randomint( 100 ) > 75 )
{ if ( randomint( 100 ) > 75 )
maxdistance = 512; maxdistance = 512;
}
closest_spots = get_array_of_closest( player.origin, spots, undefined, undefined, maxdistance ); closest_spots = get_array_of_closest( player.origin, spots, undefined, undefined, maxdistance );
favoritespots = []; favoritespots = [];
foreach ( close_spot in closest_spots )
{ foreach ( close_spot in closest_spots )
if ( within_fov( close_spot.origin, close_spot.angles, player.origin, -0.75 ) ) {
{ if ( within_fov( close_spot.origin, close_spot.angles, player.origin, -0.75 ) )
favoritespots[ favoritespots.size ] = close_spot; {
} favoritespots[favoritespots.size] = close_spot;
else continue;
{ }
if ( randomint( 100 ) > 75 )
{ if ( randomint( 100 ) > 75 )
favoritespots[ favoritespots.size ] = close_spot; favoritespots[favoritespots.size] = close_spot;
} }
}
} if ( isdefined( favoritespots ) && favoritespots.size >= 2 )
if ( isDefined( favoritespots ) && favoritespots.size >= 2 ) spot = random( favoritespots );
{ else if ( isdefined( closest_spots ) && closest_spots.size > 0 )
spot = random( favoritespots ); spot = random( closest_spots );
} }
else if ( isDefined( closest_spots ) && closest_spots.size > 0 )
{ if ( !isdefined( spot ) )
spot = random( closest_spots ); spot = random( spots );
}
} self.spawn_point = spot;
if ( !isDefined( spot ) )
{ if ( isdefined( spot.target ) )
spot = random( spots ); self.target = spot.target;
}
self.spawn_point = spot; if ( isdefined( spot.zone_name ) )
if ( isDefined( spot.target ) ) self.zone_name = spot.zone_name;
{
self.target = spot.target; if ( isdefined( spot.script_parameters ) )
} self.script_parameters = spot.script_parameters;
if ( isDefined( spot.zone_name ) )
{ self thread maze_do_zombie_rise( spot );
self.zone_name = spot.zone_name;
}
if ( isDefined( spot.script_parameters ) )
{
self.script_parameters = spot.script_parameters;
}
self thread maze_do_zombie_rise( spot );
} }
maze_do_zombie_rise( spot ) //checked changed to match cerberus output maze_do_zombie_rise( spot )
{ {
self endon( "death" ); self endon( "death" );
self.in_the_ground = 1; self.in_the_ground = 1;
if ( isDefined( self.anchor ) )
{ if ( isdefined( self.anchor ) )
self.anchor delete(); self.anchor delete();
}
self.anchor = spawn( "script_origin", self.origin ); self.anchor = spawn( "script_origin", self.origin );
self.anchor.angles = self.angles; self.anchor.angles = self.angles;
self linkto( self.anchor ); self linkto( self.anchor );
if ( !isDefined( spot.angles ) )
{ if ( !isdefined( spot.angles ) )
spot.angles = ( 0, 0, 0 ); spot.angles = ( 0, 0, 0 );
}
anim_org = spot.origin; anim_org = spot.origin;
anim_ang = spot.angles; anim_ang = spot.angles;
anim_org += ( 0, 0, 0 ); anim_org += ( 0, 0, 0 );
self ghost(); self ghost();
self.anchor moveto( anim_org, 0.05 ); self.anchor moveto( anim_org, 0.05 );
self.anchor waittill( "movedone" );
target_org = get_desired_origin(); self.anchor waittill( "movedone" );
if ( isDefined( target_org ) )
{ target_org = get_desired_origin();
anim_ang = vectorToAngles( target_org - self.origin );
self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0.05 ); if ( isdefined( target_org ) )
self.anchor waittill( "rotatedone" ); {
} anim_ang = vectortoangles( target_org - self.origin );
self unlink(); self.anchor rotateto( ( 0, anim_ang[1], 0 ), 0.05 );
if ( isDefined( self.anchor ) )
{ self.anchor waittill( "rotatedone" );
self.anchor delete(); }
}
self thread maps/mp/zombies/_zm_spawner::hide_pop(); self unlink();
level thread maps/mp/zombies/_zm_spawner::zombie_rise_death( self, spot );
spot thread maps/mp/zombies/_zm_spawner::zombie_rise_fx( self ); if ( isdefined( self.anchor ) )
substate = 0; self.anchor delete();
if ( self.zombie_move_speed == "walk" )
{ self thread maps\mp\zombies\_zm_spawner::hide_pop();
substate = randomint( 2 ); level thread maps\mp\zombies\_zm_spawner::zombie_rise_death( self, spot );
} spot thread maps\mp\zombies\_zm_spawner::zombie_rise_fx( self );
else substate = 0;
{
substate = 1; if ( self.zombie_move_speed == "walk" )
} substate = randomint( 2 );
self orientmode( "face default" ); else
self animscripted( spot.origin, spot.angles, "zm_rise_hedge", substate ); substate = 1;
self notify( "rise_anim_finished" );
spot notify( "stop_zombie_rise_fx" ); self orientmode( "face default" );
self.in_the_ground = 0; self animscripted( spot.origin, spot.angles, "zm_rise_hedge", substate );
self notify( "risen", spot.script_string ); self notify( "rise_anim_finished" );
spot notify( "stop_zombie_rise_fx" );
self.in_the_ground = 0;
self notify( "risen", spot.script_string );
} }
maze_achievement_watcher() //checked matches cerberus output maze_achievement_watcher()
{ {
while ( 1 ) while ( true )
{ {
level waittill( "start_of_round" ); level waittill( "start_of_round" );
start_maze_achievement_threads();
level waittill( "end_of_round" ); start_maze_achievement_threads();
check_maze_achievement_threads();
} level waittill( "end_of_round" );
check_maze_achievement_threads();
}
} }
start_maze_achievement_threads() //checked partially changed to match cerberus output see info.md start_maze_achievement_threads()
{ {
if ( level.round_number >= 20 ) if ( level.round_number >= 20 )
{ {
foreach ( player in get_players() ) foreach ( player in get_players() )
{ {
player.achievement_player_started_round_in_maze = player is_player_in_zone( "zone_maze" ); player.achievement_player_started_round_in_maze = player is_player_in_zone( "zone_maze" );
if ( player.achievement_player_started_round_in_maze )
{ if ( player.achievement_player_started_round_in_maze )
player thread watch_player_in_maze(); {
} player thread watch_player_in_maze();
else continue;
{ }
player notify( "_maze_achievement_think_done" );
} player notify( "_maze_achievement_think_done" );
} }
} }
} }
watch_player_in_maze() //checked matches cerberus output watch_player_in_maze()
{ {
self notify( "_maze_achievement_think_done" ); self notify( "_maze_achievement_think_done" );
self endon( "_maze_achievement_think_done" ); self endon( "_maze_achievement_think_done" );
self endon( "death_or_disconnect" ); self endon( "death_or_disconnect" );
self.achievement_player_stayed_in_maze_for_entire_round = 1; self.achievement_player_stayed_in_maze_for_entire_round = 1;
while ( self.achievement_player_stayed_in_maze_for_entire_round )
{ while ( self.achievement_player_stayed_in_maze_for_entire_round )
self.achievement_player_stayed_in_maze_for_entire_round = self is_player_in_zone( "zone_maze" ); {
wait randomfloatrange( 0.5, 1 ); self.achievement_player_stayed_in_maze_for_entire_round = self is_player_in_zone( "zone_maze" );
} wait( randomfloatrange( 0.5, 1.0 ) );
}
} }
check_maze_achievement_threads() //checked changed to match cerberus output check_maze_achievement_threads()
{ {
if ( level.round_number >= 20 ) if ( level.round_number >= 20 )
{ {
foreach ( player in get_players() ) foreach ( player in get_players() )
{ {
if ( isDefined( player.achievement_player_started_round_in_maze ) && player.achievement_player_started_round_in_maze && isDefined( player.achievement_player_stayed_in_maze_for_entire_round ) && player.achievement_player_stayed_in_maze_for_entire_round && level._time_bomb.last_round_restored != ( level.round_number - 1 ) && !maps/mp/zombies/_zm_weap_time_bomb::is_time_bomb_round_change() ) if ( isdefined( player.achievement_player_started_round_in_maze ) && player.achievement_player_started_round_in_maze && ( isdefined( player.achievement_player_stayed_in_maze_for_entire_round ) && player.achievement_player_stayed_in_maze_for_entire_round ) && level._time_bomb.last_round_restored != level.round_number - 1 && !maps\mp\zombies\_zm_weap_time_bomb::is_time_bomb_round_change() )
{ {
/*
/# /#
iprintlnbold( player.name + " got achievement MAZED AND CONFUSED" ); iprintlnbold( player.name + " got achievement MAZED AND CONFUSED" );
#/ #/
*/ player notify( "player_stayed_in_maze_for_entire_high_level_round" );
player notify( "player_stayed_in_maze_for_entire_high_level_round" ); player notify( "_maze_achievement_think_done" );
player notify( "_maze_achievement_think_done" ); }
} }
} }
}
} }
vo_in_maze() //checked did not change to match cerberus output vo_in_maze()
{ {
flag_wait( "mansion_door1" ); flag_wait( "mansion_door1" );
nwaittime = 300; nwaittime = 300;
nminwait = 5; nminwait = 5;
nmaxwait = 10; nmaxwait = 10;
while ( 1 )
{
aplayersinzone = maps/mp/zombies/_zm_zonemgr::get_players_in_zone( "zone_maze", 1 );
while ( !isDefined( aplayersinzone ) || aplayersinzone.size == 0 )
{
wait randomintrange( nminwait, nmaxwait );
aplayersinzone = maps/mp/zombies/_zm_zonemgr::get_players_in_zone( "zone_maze", 1 );
}
random( aplayersinzone ) maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "in_maze" );
nminwait = 13;
nmaxwait = 37;
wait nwaittime;
}
}
while ( true )
{
for ( aplayersinzone = maps\mp\zombies\_zm_zonemgr::get_players_in_zone( "zone_maze", 1 ); !isdefined( aplayersinzone ) || aplayersinzone.size == 0; aplayersinzone = maps\mp\zombies\_zm_zonemgr::get_players_in_zone( "zone_maze", 1 ) )
wait( randomint( nminwait, nmaxwait ) );
random( aplayersinzone ) maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "in_maze" );
nminwait = 13;
nmaxwait = 37;
wait( nwaittime );
}
}

View File

@ -1,37 +1,43 @@
#include maps/mp/zombies/_zm_perks; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_audio; // 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_audio;
#include maps\mp\zombies\_zm_perks;
electric_switch() electric_switch()
{ {
trig = getent( "use_elec_switch", "targetname" ); trig = getent( "use_elec_switch", "targetname" );
master_switch = getent( "elec_switch", "targetname" ); master_switch = getent( "elec_switch", "targetname" );
master_switch notsolid(); master_switch notsolid();
trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH" ); trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH" );
trig setvisibletoall(); trig setvisibletoall();
trig waittill( "trigger", user );
trig setinvisibletoall(); trig waittill( "trigger", user );
master_switch rotateroll( -90, 0,3 );
master_switch playsound( "zmb_switch_flip" ); trig setinvisibletoall();
master_switch playsound( "zmb_poweron" ); master_switch rotateroll( -90, 0.3 );
level delay_thread( 11,8, ::sndpoweronmusicstinger ); master_switch playsound( "zmb_switch_flip" );
if ( isDefined( user ) ) master_switch playsound( "zmb_poweron" );
{ level delay_thread( 11.8, ::sndpoweronmusicstinger );
user thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "power", "power_on" );
} if ( isdefined( user ) )
level thread maps/mp/zombies/_zm_perks::perk_unpause_all_perks(); user thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "power", "power_on" );
master_switch waittill( "rotatedone" );
playfx( level._effect[ "switch_sparks" ], master_switch.origin + ( 0, 12, -60 ), anglesToForward( master_switch.angles ) ); level thread maps\mp\zombies\_zm_perks::perk_unpause_all_perks();
master_switch playsound( "zmb_turn_on" );
level notify( "electric_door" ); master_switch waittill( "rotatedone" );
clientnotify( "power_on" );
flag_set( "power_on" ); playfx( level._effect["switch_sparks"], master_switch.origin + ( 0, 12, -60 ), anglestoforward( master_switch.angles ) );
level setclientfield( "zombie_power_on", 1 ); master_switch playsound( "zmb_turn_on" );
level notify( "electric_door" );
clientnotify( "power_on" );
flag_set( "power_on" );
level setclientfield( "zombie_power_on", 1 );
} }
sndpoweronmusicstinger() sndpoweronmusicstinger()
{ {
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "poweron" ); level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "poweron" );
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,208 +1,235 @@
#include maps/mp/zm_buried_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_buried_sq;
init() init()
{ {
declare_sidequest_stage( "sq", "bt", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "bt", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
flag_init( "sq_player_underground" ); flag_init( "sq_player_underground" );
level thread stage_vo(); level thread stage_vo();
level thread stage_start_watcher(); level thread stage_start_watcher();
level._cur_stage_name = "bt"; level._cur_stage_name = "bt";
clientnotify( "bt" ); clientnotify( "bt" );
} }
stage_vo() stage_vo()
{ {
level waittill( "start_of_round" ); level waittill( "start_of_round" );
level thread stage_vo_watch_underground();
wait 5; level thread stage_vo_watch_underground();
maxissay( "vox_maxi_sidequest_maxis_start_1_0" ); wait 5;
maxissay( "vox_maxi_sidequest_maxis_start_2_0" ); maxissay( "vox_maxi_sidequest_maxis_start_1_0" );
maxissay( "vox_maxi_sidequest_maxis_start_3_0" ); maxissay( "vox_maxi_sidequest_maxis_start_2_0" );
maxissay( "vox_maxi_sidequest_maxis_start_4_0" ); maxissay( "vox_maxi_sidequest_maxis_start_3_0" );
maxissay( "vox_maxi_sidequest_maxis_start_5_0" ); maxissay( "vox_maxi_sidequest_maxis_start_4_0" );
flag_wait( "sq_player_underground" ); maxissay( "vox_maxi_sidequest_maxis_start_5_0" );
level.m_maxis_vo_spot.origin = ( -728, -344, 280 ); flag_wait( "sq_player_underground" );
while ( isDefined( level.vo_player_who_discovered_stables_roof ) && is_true( level.vo_player_who_discovered_stables_roof.isspeaking ) ) level.m_maxis_vo_spot.origin = ( -728, -344, 280 );
{
wait 0,05; while ( isdefined( level.vo_player_who_discovered_stables_roof ) && is_true( level.vo_player_who_discovered_stables_roof.isspeaking ) )
} wait 0.05;
maxissay( "vox_maxi_sidequest_town_0" );
maxissay( "vox_maxi_sidequest_town_1" ); maxissay( "vox_maxi_sidequest_town_0" );
wait 1; maxissay( "vox_maxi_sidequest_town_1" );
level thread stage_vo_watch_gallows(); wait 1;
if ( !level.richcompleted ) level thread stage_vo_watch_gallows();
{
if ( isDefined( level.rich_sq_player ) ) if ( !level.richcompleted )
{ {
level.rich_sq_player.dontspeak = 1; if ( isdefined( level.rich_sq_player ) )
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 ); {
} level.rich_sq_player.dontspeak = 1;
richtofensay( "vox_zmba_sidequest_zmba_start_1_0", 3 ); level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
if ( isDefined( level.rich_sq_player ) ) }
{
while ( isDefined( level.rich_sq_player ) || is_true( level.rich_sq_player.isspeaking ) && is_true( level.rich_sq_player.dontspeak ) ) richtofensay( "vox_zmba_sidequest_zmba_start_1_0", 3 );
{
wait 1; if ( isdefined( level.rich_sq_player ) )
} {
level.rich_sq_player.dontspeak = 1; while ( isdefined( level.rich_sq_player ) && ( is_true( level.rich_sq_player.isspeaking ) || is_true( level.rich_sq_player.dontspeak ) ) )
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 ); wait 1;
level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_0", "sound_done_vox_plr_1_respond_richtofen_0" );
level.rich_sq_player waittill( "sound_done_vox_plr_1_respond_richtofen_0" ); level.rich_sq_player.dontspeak = 1;
wait 1; level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 ); level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_0", "sound_done_vox_plr_1_respond_richtofen_0" );
}
richtofensay( "vox_zmba_sidequest_zmba_start_3_0", 4 ); level.rich_sq_player waittill( "sound_done_vox_plr_1_respond_richtofen_0" );
if ( isDefined( level.rich_sq_player ) )
{ wait 1;
while ( isDefined( level.rich_sq_player ) || is_true( level.rich_sq_player.isspeaking ) && is_true( level.rich_sq_player.dontspeak ) ) level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
{ }
wait 1;
} richtofensay( "vox_zmba_sidequest_zmba_start_3_0", 4 );
level.rich_sq_player.dontspeak = 1;
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 ); if ( isdefined( level.rich_sq_player ) )
level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_1", "sound_done_vox_plr_1_respond_richtofen_1" ); {
level.rich_sq_player waittill( "sound_done_vox_plr_1_respond_richtofen_1" ); while ( isdefined( level.rich_sq_player ) && ( is_true( level.rich_sq_player.isspeaking ) || is_true( level.rich_sq_player.dontspeak ) ) )
wait 1; wait 1;
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
} level.rich_sq_player.dontspeak = 1;
richtofensay( "vox_zmba_sidequest_zmba_start_5_0", 12 ); level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
richtofensay( "vox_zmba_sidequest_zmba_start_6_0", 8 ); level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_1", "sound_done_vox_plr_1_respond_richtofen_1" );
if ( isDefined( level.rich_sq_player ) )
{ level.rich_sq_player waittill( "sound_done_vox_plr_1_respond_richtofen_1" );
while ( isDefined( level.rich_sq_player ) || is_true( level.rich_sq_player.isspeaking ) && is_true( level.rich_sq_player.dontspeak ) )
{ wait 1;
wait 1; level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
} }
level.rich_sq_player.dontspeak = 1;
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 ); richtofensay( "vox_zmba_sidequest_zmba_start_5_0", 12 );
level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_2", "sound_done_vox_plr_1_respond_richtofen_2" ); richtofensay( "vox_zmba_sidequest_zmba_start_6_0", 8 );
level.rich_sq_player waittill( "sound_done_vox_plr_1_respond_richtofen_2" );
wait 1; if ( isdefined( level.rich_sq_player ) )
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 ); {
} while ( isdefined( level.rich_sq_player ) && ( is_true( level.rich_sq_player.isspeaking ) || is_true( level.rich_sq_player.dontspeak ) ) )
richtofensay( "vox_zmba_sidequest_town_0", 6 ); wait 1;
richtofensay( "vox_zmba_sidequest_town_1", 6 );
} level.rich_sq_player.dontspeak = 1;
flag_set( "sq_intro_vo_done" ); level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
level thread stage_vo_nag(); level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_2", "sound_done_vox_plr_1_respond_richtofen_2" );
level thread stage_vo_watch_guillotine();
level.rich_sq_player waittill( "sound_done_vox_plr_1_respond_richtofen_2" );
wait 1;
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
}
richtofensay( "vox_zmba_sidequest_town_0", 6 );
richtofensay( "vox_zmba_sidequest_town_1", 6 );
}
flag_set( "sq_intro_vo_done" );
level thread stage_vo_nag();
level thread stage_vo_watch_guillotine();
} }
stage_vo_nag() stage_vo_nag()
{ {
level endon( "sq_is_max_tower_built" ); level endon( "sq_is_max_tower_built" );
level endon( "sq_is_ric_tower_built" ); level endon( "sq_is_ric_tower_built" );
level endon( "end_game_reward_starts_maxis" ); level endon( "end_game_reward_starts_maxis" );
level endon( "end_game_reward_starts_richtofen" ); level endon( "end_game_reward_starts_richtofen" );
s_struct = getstruct( "sq_gallows", "targetname" ); s_struct = getstruct( "sq_gallows", "targetname" );
m_maxis_vo_spot = spawn( "script_model", s_struct.origin ); m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
m_maxis_vo_spot setmodel( "tag_origin" ); m_maxis_vo_spot setmodel( "tag_origin" );
i = 0;
while ( i < 5 ) for ( i = 0; i < 5; i++ )
{ {
level waittill( "end_of_round" ); level waittill( "end_of_round" );
maxissay( "vox_maxi_sidequest_nag_" + i, m_maxis_vo_spot );
richtofensay( "vox_zmba_sidequest_nag_" + i, 10 ); maxissay( "vox_maxi_sidequest_nag_" + i, m_maxis_vo_spot );
i++; richtofensay( "vox_zmba_sidequest_nag_" + i, 10 );
} }
} }
stage_vo_watch_guillotine() stage_vo_watch_guillotine()
{ {
level endon( "sq_bt_over" ); level endon( "sq_bt_over" );
level endon( "end_game_reward_starts_maxis" ); level endon( "end_game_reward_starts_maxis" );
level endon( "end_game_reward_starts_richtofen" ); level endon( "end_game_reward_starts_richtofen" );
s_struct = getstruct( "sq_guillotine", "targetname" ); s_struct = getstruct( "sq_guillotine", "targetname" );
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 ); trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
trigger waittill( "trigger" );
trigger delete(); trigger waittill( "trigger" );
richtofensay( "vox_zmba_sidequest_gallows_0", 9 );
richtofensay( "vox_zmba_sidequest_gallows_1", 12 ); trigger delete();
level waittill( "rtower_object_planted" ); richtofensay( "vox_zmba_sidequest_gallows_0", 9 );
richtofensay( "vox_zmba_sidequest_parts_0", 9 ); richtofensay( "vox_zmba_sidequest_gallows_1", 12 );
level waittill( "rtower_object_planted" );
richtofensay( "vox_zmba_sidequest_parts_1", 3 ); level waittill( "rtower_object_planted" );
level waittill( "rtower_object_planted" );
richtofensay( "vox_zmba_sidequest_parts_2", 5 ); richtofensay( "vox_zmba_sidequest_parts_0", 9 );
level waittill( "rtower_object_planted" );
richtofensay( "vox_zmba_sidequest_parts_3", 11 ); level waittill( "rtower_object_planted" );
richtofensay( "vox_zmba_sidequest_parts_1", 3 );
level waittill( "rtower_object_planted" );
richtofensay( "vox_zmba_sidequest_parts_2", 5 );
level waittill( "rtower_object_planted" );
richtofensay( "vox_zmba_sidequest_parts_3", 11 );
} }
stage_vo_watch_gallows() stage_vo_watch_gallows()
{ {
level endon( "sq_bt_over" ); level endon( "sq_bt_over" );
level endon( "end_game_reward_starts_maxis" ); level endon( "end_game_reward_starts_maxis" );
level endon( "end_game_reward_starts_richtofen" ); level endon( "end_game_reward_starts_richtofen" );
s_struct = getstruct( "sq_gallows", "targetname" ); s_struct = getstruct( "sq_gallows", "targetname" );
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 ); trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
trigger waittill( "trigger" );
trigger delete(); trigger waittill( "trigger" );
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
m_maxis_vo_spot setmodel( "tag_origin" ); trigger delete();
if ( flag( "sq_intro_vo_done" ) ) m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
{ m_maxis_vo_spot setmodel( "tag_origin" );
maxissay( "vox_maxi_sidequest_gallows_0", m_maxis_vo_spot );
} if ( flag( "sq_intro_vo_done" ) )
i = 0; maxissay( "vox_maxi_sidequest_gallows_0", m_maxis_vo_spot );
while ( i < 4 )
{ for ( i = 0; i < 4; i++ )
level waittill( "mtower_object_planted" ); {
if ( flag( "sq_intro_vo_done" ) ) level waittill( "mtower_object_planted" );
{
maxissay( "vox_maxi_sidequest_parts_" + i, m_maxis_vo_spot, 1 ); if ( flag( "sq_intro_vo_done" ) )
} maxissay( "vox_maxi_sidequest_parts_" + i, m_maxis_vo_spot, 1 );
wait_network_frame();
i++; wait_network_frame();
} }
m_maxis_vo_spot delete();
m_maxis_vo_spot delete();
} }
stage_vo_watch_underground() stage_vo_watch_underground()
{ {
trigger_wait( "sq_player_underground", "targetname" ); trigger_wait( "sq_player_underground", "targetname" );
flag_set( "sq_player_underground" ); flag_set( "sq_player_underground" );
} }
stage_start_watcher() stage_start_watcher()
{ {
level waittill_either( "mtower_object_planted", "rtower_object_planted" ); level waittill_either( "mtower_object_planted", "rtower_object_planted" );
flag_set( "sq_started" ); flag_set( "sq_started" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "BT Started" ); iprintlnbold( "BT Started" );
#/ #/
level thread wait_for_maxis_tower(); level thread wait_for_maxis_tower();
level thread wait_for_richtofen_tower(); level thread wait_for_richtofen_tower();
flag_wait_any( "sq_is_max_tower_built", "sq_is_ric_tower_built" ); flag_wait_any( "sq_is_max_tower_built", "sq_is_ric_tower_built" );
wait_network_frame(); wait_network_frame();
stage_completed( "sq", level._cur_stage_name ); stage_completed( "sq", level._cur_stage_name );
} }
wait_for_maxis_tower() wait_for_maxis_tower()
{ {
level endon( "sq_is_ric_tower_built" ); level endon( "sq_is_ric_tower_built" );
wait_for_buildable( "buried_sq_bt_m_tower" ); wait_for_buildable( "buried_sq_bt_m_tower" );
flag_set( "sq_is_max_tower_built" ); flag_set( "sq_is_max_tower_built" );
} }
wait_for_richtofen_tower() wait_for_richtofen_tower()
{ {
level endon( "sq_is_max_tower_built" ); level endon( "sq_is_max_tower_built" );
wait_for_buildable( "buried_sq_bt_r_tower" ); wait_for_buildable( "buried_sq_bt_r_tower" );
flag_set( "sq_is_ric_tower_built" ); flag_set( "sq_is_ric_tower_built" );
} }
exit_stage( success ) exit_stage( success )
{ {
} }

View File

@ -1,428 +1,441 @@
#include maps/mp/zm_buried_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_buried_sq;
init() init()
{ {
flag_init( "sq_wisp_failed" ); flag_init( "sq_wisp_failed" );
flag_init( "sq_m_wisp_weak" ); flag_init( "sq_m_wisp_weak" );
level.sq_ctw_m_tubes_lit = 0; level.sq_ctw_m_tubes_lit = 0;
declare_sidequest_stage( "sq", "ctw", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "ctw", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
flag_clear( "sq_wisp_failed" ); flag_clear( "sq_wisp_failed" );
level._cur_stage_name = "ctw"; level._cur_stage_name = "ctw";
clientnotify( "ctw" ); clientnotify( "ctw" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "CTW Started" ); iprintlnbold( "CTW Started" );
#/ #/
if ( flag( "sq_is_max_tower_built" ) ) if ( flag( "sq_is_max_tower_built" ) )
{ {
level thread stage_vo_max(); level thread stage_vo_max();
ctw_max_start_wisp(); ctw_max_start_wisp();
} }
else else
{ {
level thread stage_vo_ric(); level thread stage_vo_ric();
ctw_ric_start_wisp(); ctw_ric_start_wisp();
} }
flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
wait_network_frame(); flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
stage_completed( "sq", level._cur_stage_name ); wait_network_frame();
stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
stage_vo_max() stage_vo_max()
{ {
level endon( "sq_wisp_failed" ); level endon( "sq_wisp_failed" );
while ( !isDefined( level.vh_wisp ) )
{ while ( !isdefined( level.vh_wisp ) )
wait 1; wait 1;
}
level.vh_wisp endon( "delete" ); level.vh_wisp endon( "delete" );
maxissay( "vox_maxi_sidequest_ctw_0", level.e_sq_sign_attacker ); maxissay( "vox_maxi_sidequest_ctw_0", level.e_sq_sign_attacker );
maxissay( "vox_maxi_sidequest_ctw_1", level.e_sq_sign_attacker ); maxissay( "vox_maxi_sidequest_ctw_1", level.e_sq_sign_attacker );
wait 15; wait 15;
maxissay( "vox_maxis_sidequest_ctw_4", level.e_sq_sign_attacker ); maxissay( "vox_maxis_sidequest_ctw_4", level.e_sq_sign_attacker );
} }
stage_vo_ric() stage_vo_ric()
{ {
level endon( "sq_wisp_failed" ); level endon( "sq_wisp_failed" );
richtofensay( "vox_zmba_sidequest_ctw_0", 12 ); richtofensay( "vox_zmba_sidequest_ctw_0", 12 );
richtofensay( "vox_zmba_sidequest_ctw_1", 8 ); richtofensay( "vox_zmba_sidequest_ctw_1", 8 );
level waittill( "sq_ctw_zombie_powered_up" );
richtofensay( "vox_zmba_sidequest_ctw_3", 8 ); level waittill( "sq_ctw_zombie_powered_up" );
richtofensay( "vox_zmba_sidequest_ctw_3", 8 );
} }
wisp_move_from_sign_to_start( s_start ) wisp_move_from_sign_to_start( s_start )
{ {
self.origin = level.m_sq_start_sign.origin - vectorScale( ( 1, 0, 0 ), 20 ); self.origin = level.m_sq_start_sign.origin - vectorscale( ( 0, 0, 1 ), 20.0 );
self moveto( s_start.origin, 2, 0,5, 0,5 ); self moveto( s_start.origin, 2, 0.5, 0.5 );
self waittill( "movedone" );
wait 1; self waittill( "movedone" );
wait 1;
} }
ctw_ric_start_wisp() ctw_ric_start_wisp()
{ {
if ( !isDefined( level.m_sq_start_sign ) ) if ( !isdefined( level.m_sq_start_sign ) )
{ return;
return;
} s_start = getstruct( level.m_sq_start_sign.target, "targetname" );
s_start = getstruct( level.m_sq_start_sign.target, "targetname" ); m_wisp = getent( "sq_wisp", "targetname" );
m_wisp = getent( "sq_wisp", "targetname" ); m_wisp setclientfield( "vulture_wisp", 1 );
m_wisp setclientfield( "vulture_wisp", 1 ); m_wisp wisp_move_from_sign_to_start( s_start );
m_wisp wisp_move_from_sign_to_start( s_start ); m_wisp thread ctw_ric_move_wisp( s_start );
m_wisp thread ctw_ric_move_wisp( s_start );
} }
ctw_ric_move_wisp( s_current ) ctw_ric_move_wisp( s_current )
{ {
self endon( "ctw_wisp_timeout" ); self endon( "ctw_wisp_timeout" );
self setclientfield( "vulture_wisp", 0 );
self.origin = s_current.origin; do
wait_network_frame(); {
self setclientfield( "vulture_wisp", 1 ); self setclientfield( "vulture_wisp", 0 );
self thread ctw_ric_watch_wisp_timeout(); self.origin = s_current.origin;
ctw_ric_watch_wisp_dist(); wait_network_frame();
s_current = ctw_ric_get_next_wisp_struct( s_current ); self setclientfield( "vulture_wisp", 1 );
self endon( "ctw_wisp_moved" ); self thread ctw_ric_watch_wisp_timeout();
self ctw_ric_power_towers(); ctw_ric_watch_wisp_dist();
flag_set( "sq_wisp_success" ); s_current = ctw_ric_get_next_wisp_struct( s_current );
}
while ( isdefined( s_current ) );
self endon( "ctw_wisp_moved" );
self ctw_ric_power_towers();
flag_set( "sq_wisp_success" );
} }
ctw_ric_get_next_wisp_struct( s_current ) ctw_ric_get_next_wisp_struct( s_current )
{ {
if ( !isDefined( s_current.target ) ) if ( !isdefined( s_current.target ) )
{ return undefined;
return undefined;
} a_structs = getstructarray( s_current.target, "targetname" );
a_structs = getstructarray( s_current.target, "targetname" ); return array_randomize( a_structs )[0];
return array_randomize( a_structs )[ 0 ];
} }
ctw_ric_watch_wisp_timeout() ctw_ric_watch_wisp_timeout()
{ {
self endon( "ctw_wisp_moved" ); self endon( "ctw_wisp_moved" );
wait 12; wait 12;
flag_set( "sq_wisp_failed" ); flag_set( "sq_wisp_failed" );
self setclientfield( "vulture_wisp", 0 ); self setclientfield( "vulture_wisp", 0 );
self notify( "ctw_wisp_timeout" ); self notify( "ctw_wisp_timeout" );
} }
ctw_ric_watch_wisp_dist( s_current ) ctw_ric_watch_wisp_dist( s_current )
{ {
self endon( "ctw_wisp_timeout" ); self endon( "ctw_wisp_timeout" );
is_near_wisp = 0; is_near_wisp = 0;
while ( !is_near_wisp )
{ while ( !is_near_wisp )
players = getplayers(); {
_a185 = players; players = getplayers();
_k185 = getFirstArrayKey( _a185 );
while ( isDefined( _k185 ) ) foreach ( player in players )
{ {
player = _a185[ _k185 ]; if ( !player hasperk( "specialty_nomotionsensor" ) )
if ( !player hasperk( "specialty_nomotionsensor" ) ) continue;
{
} if ( distancesquared( player.origin, self.origin ) < 4096 )
else is_near_wisp = 1;
{ }
if ( distancesquared( player.origin, self.origin ) < 4096 )
{ wait 0.1;
is_near_wisp = 1; }
}
} self notify( "ctw_wisp_moved" );
_k185 = getNextArrayKey( _a185, _k185 );
}
wait 0,1;
}
self notify( "ctw_wisp_moved" );
} }
ctw_ric_power_towers() ctw_ric_power_towers()
{ {
m_tower = getent( "sq_guillotine", "targetname" ); m_tower = getent( "sq_guillotine", "targetname" );
level setclientfield( "vulture_wisp_orb_count", 1 ); level setclientfield( "vulture_wisp_orb_count", 1 );
wait_network_frame(); wait_network_frame();
level setclientfield( "vulture_wisp_orb_count", 0 ); level setclientfield( "vulture_wisp_orb_count", 0 );
wait 2; wait 2;
v_guillotine_spot = self.origin; v_guillotine_spot = self.origin;
self.origin = m_tower gettagorigin( "j_crystal_01" ); self.origin = m_tower gettagorigin( "j_crystal_01" );
m_tower thread ctw_ric_guillotine_glow( v_guillotine_spot ); m_tower thread ctw_ric_guillotine_glow( v_guillotine_spot );
i = 0;
while ( i < 5 ) for ( i = 0; i < 5; i++ )
{ {
wait 3; wait 3;
e_powered_zombie = undefined;
while ( !isDefined( e_powered_zombie ) ) for ( e_powered_zombie = undefined; !isdefined( e_powered_zombie ); e_powered_zombie = array_randomize( a_zombies )[0] )
{ {
wait 1; wait 1;
a_zombies = ctw_find_zombies_for_powerup( self.origin, 512, m_tower ); a_zombies = ctw_find_zombies_for_powerup( self.origin, 512, m_tower );
e_powered_zombie = array_randomize( a_zombies )[ 0 ]; }
}
level notify( "stop_ctw_ric_guillotine_glow" ); level notify( "stop_ctw_ric_guillotine_glow" );
e_powered_zombie ctw_power_up_ric_zombie( m_tower.m_glow ); e_powered_zombie ctw_power_up_ric_zombie( m_tower.m_glow );
e_powered_zombie waittill( "death" );
level setclientfield( "vulture_wisp_orb_count", i + 1 ); e_powered_zombie waittill( "death" );
m_tower ctw_return_wisp_to_guillotine( v_guillotine_spot, e_powered_zombie.origin );
i++; level setclientfield( "vulture_wisp_orb_count", i + 1 );
} m_tower ctw_return_wisp_to_guillotine( v_guillotine_spot, e_powered_zombie.origin );
}
} }
ctw_ric_guillotine_glow( v_spot ) ctw_ric_guillotine_glow( v_spot )
{ {
level endon( "stop_ctw_ric_guillotine_glow" ); level endon( "stop_ctw_ric_guillotine_glow" );
if ( !isDefined( self.m_glow ) )
{ if ( !isdefined( self.m_glow ) )
self.m_glow = spawn( "script_model", v_spot ); {
self.m_glow setmodel( "tag_origin" ); self.m_glow = spawn( "script_model", v_spot );
} self.m_glow setmodel( "tag_origin" );
while ( 1 ) }
{
playfxontag( level._effect[ "vulture_fx_wisp" ], self.m_glow, "tag_origin" ); while ( true )
wait 0,25; {
self.m_glow playloopsound( "zmb_sq_wisp_loop_guillotine" ); playfxontag( level._effect["vulture_fx_wisp"], self.m_glow, "tag_origin" );
} wait 0.25;
self.m_glow playloopsound( "zmb_sq_wisp_loop_guillotine" );
}
} }
ctw_power_up_ric_zombie( m_wisp ) ctw_power_up_ric_zombie( m_wisp )
{ {
wait_network_frame(); do
v_to_zombie = vectornormalize( self gettagorigin( "J_SpineLower" ) - m_wisp.origin ); {
v_move_spot = m_wisp.origin + ( v_to_zombie * 32 ); wait_network_frame();
m_wisp.origin = v_move_spot; v_to_zombie = vectornormalize( self gettagorigin( "J_SpineLower" ) - m_wisp.origin );
self ctw_power_up_zombie(); v_move_spot = m_wisp.origin + v_to_zombie * 32;
m_wisp.origin = v_move_spot;
}
while ( distancesquared( m_wisp.origin, self gettagorigin( "J_SpineLower" ) ) > 1024 );
self ctw_power_up_zombie();
} }
ctw_return_wisp_to_guillotine( v_spot, v_start ) ctw_return_wisp_to_guillotine( v_spot, v_start )
{ {
self.m_glow.origin = v_start; self.m_glow.origin = v_start;
self thread ctw_ric_guillotine_glow( v_start ); self thread ctw_ric_guillotine_glow( v_start );
wait_network_frame();
v_to_tower = vectornormalize( v_spot - self.m_glow.origin ); do
v_move_spot = self.m_glow.origin + ( v_to_tower * 32 ); {
self.m_glow.origin = v_move_spot; wait_network_frame();
self.m_glow.origin = v_spot; v_to_tower = vectornormalize( v_spot - self.m_glow.origin );
v_move_spot = self.m_glow.origin + v_to_tower * 32;
self.m_glow.origin = v_move_spot;
}
while ( distancesquared( self.m_glow.origin, v_spot ) > 1024 );
self.m_glow.origin = v_spot;
} }
ctw_max_start_wisp() ctw_max_start_wisp()
{ {
nd_start = getvehiclenode( level.m_sq_start_sign.target, "targetname" ); nd_start = getvehiclenode( level.m_sq_start_sign.target, "targetname" );
vh_wisp = spawnvehicle( "tag_origin", "wisp_ai", "heli_quadrotor2_zm", nd_start.origin, nd_start.angles ); vh_wisp = spawnvehicle( "tag_origin", "wisp_ai", "heli_quadrotor2_zm", nd_start.origin, nd_start.angles );
vh_wisp makevehicleunusable(); vh_wisp makevehicleunusable();
level.vh_wisp = vh_wisp; level.vh_wisp = vh_wisp;
vh_wisp.n_sq_max_energy = 30; vh_wisp.n_sq_max_energy = 30;
vh_wisp.n_sq_energy = vh_wisp.n_sq_max_energy; vh_wisp.n_sq_energy = vh_wisp.n_sq_max_energy;
vh_wisp thread ctw_max_wisp_play_fx(); vh_wisp thread ctw_max_wisp_play_fx();
vh_wisp_mover = spawn( "script_model", vh_wisp.origin ); vh_wisp_mover = spawn( "script_model", vh_wisp.origin );
vh_wisp_mover setmodel( "tag_origin" ); vh_wisp_mover setmodel( "tag_origin" );
vh_wisp linkto( vh_wisp_mover ); vh_wisp linkto( vh_wisp_mover );
vh_wisp_mover wisp_move_from_sign_to_start( nd_start ); vh_wisp_mover wisp_move_from_sign_to_start( nd_start );
vh_wisp unlink(); vh_wisp unlink();
vh_wisp_mover delete(); vh_wisp_mover delete();
vh_wisp attachpath( nd_start ); vh_wisp attachpath( nd_start );
vh_wisp startpath(); vh_wisp startpath();
vh_wisp thread ctw_max_success_watch(); vh_wisp thread ctw_max_success_watch();
vh_wisp thread ctw_max_fail_watch(); vh_wisp thread ctw_max_fail_watch();
vh_wisp thread ctw_max_wisp_enery_watch(); vh_wisp thread ctw_max_wisp_enery_watch();
wait_network_frame(); wait_network_frame();
flag_wait_any( "sq_wisp_success", "sq_wisp_failed" ); flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
vh_wisp cancelaimove(); vh_wisp cancelaimove();
vh_wisp clearvehgoalpos(); vh_wisp clearvehgoalpos();
vh_wisp delete(); vh_wisp delete();
if ( isDefined( level.vh_wisp ) )
{ if ( isdefined( level.vh_wisp ) )
level.vh_wisp delete(); level.vh_wisp delete();
}
} }
ctw_max_wisp_play_fx() ctw_max_wisp_play_fx()
{ {
self playloopsound( "zmb_sq_wisp_loop" ); self playloopsound( "zmb_sq_wisp_loop" );
while ( isDefined( self ) )
{ while ( isdefined( self ) )
playfxontag( level._effect[ "fx_wisp_m" ], self, "tag_origin" ); {
if ( !flag( "sq_m_wisp_weak" ) ) playfxontag( level._effect["fx_wisp_m"], self, "tag_origin" );
{
playfxontag( level._effect[ "fx_wisp_lg_m" ], self, "tag_origin" ); if ( !flag( "sq_m_wisp_weak" ) )
} playfxontag( level._effect["fx_wisp_lg_m"], self, "tag_origin" );
wait 0,3;
} wait 0.3;
}
} }
ctw_max_success_watch() ctw_max_success_watch()
{ {
self endon( "death" ); self endon( "death" );
self waittill( "reached_end_node" );
self waittill( "reached_end_node" );
/# /#
iprintlnbold( "Wisp Success!" ); iprintlnbold( "Wisp Success!" );
#/ #/
flag_set( "sq_wisp_success" ); flag_set( "sq_wisp_success" );
level thread ctw_light_tube(); level thread ctw_light_tube();
} }
ctw_light_tube() ctw_light_tube()
{ {
level.sq_ctw_m_tubes_lit++; level.sq_ctw_m_tubes_lit++;
level setclientfield( "sq_ctw_m_t_l", level.sq_ctw_m_tubes_lit ); level setclientfield( "sq_ctw_m_t_l", level.sq_ctw_m_tubes_lit );
} }
ctw_max_fail_watch() ctw_max_fail_watch()
{ {
self endon( "death" ); self endon( "death" );
wait 1;
n_starter_dist = distancesquared( self.origin, level.e_sq_sign_attacker.origin );
a_players = getplayers();
_a382 = a_players;
_k382 = getFirstArrayKey( _a382 );
while ( isDefined( _k382 ) )
{
player = _a382[ _k382 ];
if ( distancesquared( self.origin, player.origin ) < 16384 )
{
/#
iprintlnbold( "Too Close to Wisp" );
#/
}
_k382 = getNextArrayKey( _a382, _k382 );
}
a_zombies = ctw_find_zombies_for_powerup( self.origin, 256 );
array_thread( a_zombies, ::ctw_power_up_zombie );
if ( a_zombies.size )
{
self.n_sq_energy += 10;
if ( self.n_sq_energy > 30 )
{
self.n_sq_energy = 30;
}
}
else
{
self.n_sq_energy--;
} do
if ( self.n_sq_energy <= 15 && !flag( "sq_m_wisp_weak" ) ) {
{ wait 1;
flag_set( "sq_m_wisp_weak" ); n_starter_dist = distancesquared( self.origin, level.e_sq_sign_attacker.origin );
} a_players = getplayers();
else
{ foreach ( player in a_players )
if ( self.n_sq_energy > 15 && flag( "sq_m_wisp_weak" ) ) {
{ if ( distancesquared( self.origin, player.origin ) < 16384 )
flag_clear( "sq_m_wisp_weak" ); {
}
}
/# /#
iprintlnbold( self.n_sq_energy ); iprintlnbold( "Too Close to Wisp" );
#/ #/
level thread ctw_max_fail_vo(); }
flag_set( "sq_wisp_failed" ); }
a_zombies = ctw_find_zombies_for_powerup( self.origin, 256 );
array_thread( a_zombies, ::ctw_power_up_zombie );
if ( a_zombies.size )
{
self.n_sq_energy += 10;
if ( self.n_sq_energy > 30 )
self.n_sq_energy = 30;
}
else
self.n_sq_energy--;
if ( self.n_sq_energy <= 15.0 && !flag( "sq_m_wisp_weak" ) )
flag_set( "sq_m_wisp_weak" );
else if ( self.n_sq_energy > 15.0 && flag( "sq_m_wisp_weak" ) )
flag_clear( "sq_m_wisp_weak" );
/#
iprintlnbold( self.n_sq_energy );
#/
}
while ( n_starter_dist < 262144 );
level thread ctw_max_fail_vo();
flag_set( "sq_wisp_failed" );
} }
ctw_max_fail_vo() ctw_max_fail_vo()
{ {
maxissay( "vox_maxi_sidequest_ctw_8", level.e_sq_sign_attacker ); maxissay( "vox_maxi_sidequest_ctw_8", level.e_sq_sign_attacker );
} }
ctw_max_wisp_enery_watch() ctw_max_wisp_enery_watch()
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
if ( self.n_sq_energy <= 0 ) {
{ if ( self.n_sq_energy <= 0 )
flag_set( "sq_wisp_failed" ); flag_set( "sq_wisp_failed" );
}
wait 1; wait 1;
} }
} }
debug_origin() debug_origin()
{ {
/# /#
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
debugstar( self.origin, 1, ( 1, 0, 0 ) ); {
wait 0,05; debugstar( self.origin, 1, ( 1, 0, 0 ) );
wait 0.05;
}
#/ #/
}
} }
ctw_find_zombies_for_powerup( v_origin, n_radius, m_ignore ) ctw_find_zombies_for_powerup( v_origin, n_radius, m_ignore )
{ {
if ( !isDefined( m_ignore ) ) if ( !isdefined( m_ignore ) )
{ m_ignore = undefined;
m_ignore = undefined;
} a_zombies = getaispeciesarray( level.zombie_team, "zombie" );
a_zombies = getaispeciesarray( level.zombie_team, "zombie" ); n_radius_sq = n_radius * n_radius;
n_radius_sq = n_radius * n_radius; a_near_zombies = [];
a_near_zombies = [];
_a473 = a_zombies; foreach ( e_zombie in a_zombies )
_k473 = getFirstArrayKey( _a473 ); {
while ( isDefined( _k473 ) ) if ( distancesquared( e_zombie.origin, v_origin ) < n_radius_sq && !isdefined( e_zombie.sq_wisp_powered ) )
{ {
e_zombie = _a473[ _k473 ]; if ( sighttracepassed( v_origin, e_zombie gettagorigin( "J_SpineLower" ), 1, m_ignore ) )
if ( distancesquared( e_zombie.origin, v_origin ) < n_radius_sq && !isDefined( e_zombie.sq_wisp_powered ) ) a_near_zombies[a_near_zombies.size] = e_zombie;
{ }
if ( sighttracepassed( v_origin, e_zombie gettagorigin( "J_SpineLower" ), 1, m_ignore ) ) }
{
a_near_zombies[ a_near_zombies.size ] = e_zombie; return a_near_zombies;
}
}
_k473 = getNextArrayKey( _a473, _k473 );
}
return a_near_zombies;
} }
ctw_power_up_zombie() ctw_power_up_zombie()
{ {
level notify( "sq_ctw_zombie_powered_up" ); level notify( "sq_ctw_zombie_powered_up" );
self.sq_wisp_powered = 1; self.sq_wisp_powered = 1;
n_oldhealth = self.maxhealth; n_oldhealth = self.maxhealth;
self.maxhealth *= 2; self.maxhealth *= 2;
if ( self.maxhealth < n_oldhealth )
{ if ( self.maxhealth < n_oldhealth )
self.maxhealth = n_oldhealth; self.maxhealth = n_oldhealth;
}
self.health = self.maxhealth; self.health = self.maxhealth;
if ( self.zombie_move_speed != "sprint" )
{ if ( self.zombie_move_speed != "sprint" )
self set_zombie_run_cycle( "sprint" ); {
self.zombie_move_speed_original = self.zombie_move_speed; self set_zombie_run_cycle( "sprint" );
} self.zombie_move_speed_original = self.zombie_move_speed;
if ( flag( "sq_is_max_tower_built" ) ) }
{
str_fx = "fx_wisp_m"; if ( flag( "sq_is_max_tower_built" ) )
} str_fx = "fx_wisp_m";
else else
{ str_fx = "vulture_fx_wisp";
str_fx = "vulture_fx_wisp";
} self thread ctw_power_up_zombie_m_fx( str_fx );
self thread ctw_power_up_zombie_m_fx( str_fx );
} }
ctw_power_up_zombie_m_fx( str_fx ) ctw_power_up_zombie_m_fx( str_fx )
{ {
self endon( "delete" ); self endon( "delete" );
self endon( "death" ); self endon( "death" );
while ( isDefined( self ) && isalive( self ) )
{ while ( isdefined( self ) && isalive( self ) )
playfxontag( level._effect[ str_fx ], self, "J_Wrist_RI" ); {
wait 0,25; playfxontag( level._effect[str_fx], self, "J_Wrist_RI" );
playfxontag( level._effect[ str_fx ], self, "J_Wrist_LE" ); wait 0.25;
wait 0,25; playfxontag( level._effect[str_fx], self, "J_Wrist_LE" );
self playloopsound( "zmb_sq_wisp_possess" ); wait 0.25;
} self playloopsound( "zmb_sq_wisp_possess" );
}
} }

View File

@ -1,216 +1,197 @@
#include maps/mp/zombies/_zm_spawner; // T6 GSC SOURCE
#include maps/mp/zm_buried_sq_ftl; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zm_buried_sq; #include common_scripts\utility;
#include maps/mp/zombies/_zm_buildables; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_sidequests; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_sidequests;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_buildables;
#include common_scripts/utility; #include maps\mp\zm_buried_sq;
#include maps\mp\zm_buried_sq_ftl;
#include maps\mp\zombies\_zm_spawner;
init() init()
{ {
flag_init( "ftl_lantern_charged" ); flag_init( "ftl_lantern_charged" );
declare_sidequest_stage( "sq", "ftl", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "ftl", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
level.sq_ftl_lantern_fuel = 0; level.sq_ftl_lantern_fuel = 0;
if ( flag( "sq_is_max_tower_built" ) )
{ if ( flag( "sq_is_max_tower_built" ) )
level thread stage_vo_max(); level thread stage_vo_max();
} else
else level thread stage_vo_ric();
{
level thread stage_vo_ric(); level._cur_stage_name = "ftl";
} clientnotify( "ftl" );
level._cur_stage_name = "ftl";
clientnotify( "ftl" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "FTL Started" ); iprintlnbold( "FTL Started" );
#/ #/
if ( flag( "sq_is_max_tower_built" ) ) if ( flag( "sq_is_max_tower_built" ) )
{ max_fill_lantern_watcher();
max_fill_lantern_watcher(); else
} ric_fill_lantern_watcher();
else
{ flag_wait( "ftl_lantern_charged" );
ric_fill_lantern_watcher();
} if ( flag( "sq_is_max_tower_built" ) )
flag_wait( "ftl_lantern_charged" ); thread stage_vo_filled_max();
if ( flag( "sq_is_max_tower_built" ) ) else
{ thread stage_vo_filled_ric();
thread stage_vo_filled_max();
} sq_ftl_show_marker();
else wait_for_buildable( "buried_sq_oillamp" );
{ wait_network_frame();
thread stage_vo_filled_ric(); stage_completed( "sq", level._cur_stage_name );
}
sq_ftl_show_marker();
wait_for_buildable( "buried_sq_oillamp" );
wait_network_frame();
stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
stage_vo_max() stage_vo_max()
{ {
sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_0" ); sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_0" );
sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_1" ); sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_1" );
sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_3" ); sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_3" );
level waittill( "sq_ftl_lantern_inc" );
sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_2" ); level waittill( "sq_ftl_lantern_inc" );
sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_2" );
} }
sq_ftl_maxis_vo_on_holder( str_vox ) sq_ftl_maxis_vo_on_holder( str_vox )
{ {
player = sq_ftl_get_lantern_holder(); player = sq_ftl_get_lantern_holder();
if ( isDefined( player ) )
{ if ( isdefined( player ) )
maxissay( str_vox, player ); maxissay( str_vox, player );
}
} }
sq_ftl_show_marker() sq_ftl_show_marker()
{ {
m_marker = getent( "sq_lantern_symbol", "targetname" ); m_marker = getent( "sq_lantern_symbol", "targetname" );
m_marker.origin += vectorScale( ( 0, 0, 1 ), 2 ); m_marker.origin += vectorscale( ( 0, 0, 1 ), 2.0 );
level.sq_lamp_generator_unitrig.origin = level.sq_lamp_generator_unitrig.realorigin; level.sq_lamp_generator_unitrig.origin = level.sq_lamp_generator_unitrig.realorigin;
} }
sq_ftl_get_lantern_holder() sq_ftl_get_lantern_holder()
{ {
players = get_players(); players = get_players();
_a107 = players;
_k107 = getFirstArrayKey( _a107 ); foreach ( player in players )
while ( isDefined( _k107 ) ) {
{ if ( isdefined( player player_get_buildable_piece( 2 ) ) && isdefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) )
player = _a107[ _k107 ]; return player;
if ( isDefined( player player_get_buildable_piece( 2 ) ) && isDefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) ) }
{
return player;
}
_k107 = getNextArrayKey( _a107, _k107 );
}
} }
stage_vo_filled_max() stage_vo_filled_max()
{ {
maps/mp/zm_buried_sq_ftl::sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_ll_0" ); maps\mp\zm_buried_sq_ftl::sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_ll_0" );
} }
stage_vo_ric() stage_vo_ric()
{ {
richtofensay( "vox_zmba_sidequest_pl_0", 12 ); richtofensay( "vox_zmba_sidequest_pl_0", 12 );
level waittill( "sq_ftl_lantern_inc" );
richtofensay( "vox_zmba_sidequest_pl_1", 6 ); level waittill( "sq_ftl_lantern_inc" );
richtofensay( "vox_zmba_sidequest_pl_1", 6 );
} }
stage_vo_filled_ric() stage_vo_filled_ric()
{ {
richtofensay( "vox_zmba_sidequest_ll_0", 10 ); richtofensay( "vox_zmba_sidequest_ll_0", 10 );
richtofensay( "vox_zmba_sidequest_ll_1", 7 ); richtofensay( "vox_zmba_sidequest_ll_1", 7 );
} }
max_fill_lantern_watcher() max_fill_lantern_watcher()
{ {
a_zombies = getaispeciesarray( level.zombie_team, "zombie" ); a_zombies = getaispeciesarray( level.zombie_team, "zombie" );
array_thread( a_zombies, ::max_lantern_zombie_death_watcher ); array_thread( a_zombies, ::max_lantern_zombie_death_watcher );
maps/mp/zombies/_zm_spawner::add_custom_zombie_spawn_logic( ::max_lantern_zombie_death_watcher ); maps\mp\zombies\_zm_spawner::add_custom_zombie_spawn_logic( ::max_lantern_zombie_death_watcher );
} }
max_lantern_zombie_death_watcher() max_lantern_zombie_death_watcher()
{ {
level endon( "ftl_lantern_charged" ); level endon( "ftl_lantern_charged" );
if ( flag( "ftl_lantern_charged" ) )
{ if ( flag( "ftl_lantern_charged" ) )
return; return;
}
self waittill( "death", attacker ); self waittill( "death", attacker );
if ( !isDefined( attacker ) || isplayer( attacker ) )
{ if ( !isdefined( attacker ) || isplayer( attacker ) )
return; return;
}
players = getplayers(); players = getplayers();
_a164 = players;
_k164 = getFirstArrayKey( _a164 ); foreach ( player in players )
while ( isDefined( _k164 ) ) {
{ if ( isdefined( player player_get_buildable_piece( 2 ) ) && isdefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) )
player = _a164[ _k164 ]; {
if ( isDefined( player player_get_buildable_piece( 2 ) ) && isDefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) ) if ( isdefined( self ) && distancesquared( player.origin, self.origin ) < 65536 )
{ player ftl_lantern_increment();
if ( isDefined( self ) && distancesquared( player.origin, self.origin ) < 65536 ) }
{ }
player ftl_lantern_increment();
}
}
_k164 = getNextArrayKey( _a164, _k164 );
}
} }
ric_fill_lantern_watcher() ric_fill_lantern_watcher()
{ {
a_axis = getaiarray( "axis" ); a_axis = getaiarray( "axis" );
a_ghost = []; a_ghost = [];
_a183 = a_axis;
_k183 = getFirstArrayKey( _a183 ); foreach ( e_axis in a_axis )
while ( isDefined( _k183 ) ) {
{ if ( is_true( e_axis.is_ghost ) )
e_axis = _a183[ _k183 ]; a_ghost[a_ghost.size] = e_axis;
if ( is_true( e_axis.is_ghost ) ) }
{
a_ghost[ a_ghost.size ] = e_axis; array_thread( a_ghost, ::ric_lantern_ghost_death_watcher );
} a_ghost_spawners = getspawnerarray( "ghost_zombie_spawner", "script_noteworthy" );
_k183 = getNextArrayKey( _a183, _k183 ); array_thread( a_ghost_spawners, ::add_spawn_function, ::ric_lantern_ghost_death_watcher );
}
array_thread( a_ghost, ::ric_lantern_ghost_death_watcher );
a_ghost_spawners = getspawnerarray( "ghost_zombie_spawner", "script_noteworthy" );
array_thread( a_ghost_spawners, ::add_spawn_function, ::ric_lantern_ghost_death_watcher );
} }
ric_lantern_ghost_death_watcher() ric_lantern_ghost_death_watcher()
{ {
level endon( "ftl_lantern_charged" ); level endon( "ftl_lantern_charged" );
if ( flag( "ftl_lantern_charged" ) )
{ if ( flag( "ftl_lantern_charged" ) )
return; return;
}
self waittill( "death", attacker ); self waittill( "death", attacker );
players = getplayers();
_a210 = players; players = getplayers();
_k210 = getFirstArrayKey( _a210 );
while ( isDefined( _k210 ) ) foreach ( player in players )
{ {
player = _a210[ _k210 ]; if ( isdefined( player player_get_buildable_piece( 2 ) ) && isdefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) )
if ( isDefined( player player_get_buildable_piece( 2 ) ) && isDefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) ) {
{ if ( isdefined( self ) && distancesquared( player.origin, self.origin ) < 65536 )
if ( isDefined( self ) && distancesquared( player.origin, self.origin ) < 65536 ) player ftl_lantern_increment();
{ }
player ftl_lantern_increment(); }
}
}
_k210 = getNextArrayKey( _a210, _k210 );
}
} }
ftl_lantern_increment() ftl_lantern_increment()
{ {
level.sq_ftl_lantern_fuel++; level.sq_ftl_lantern_fuel++;
level notify( "sq_ftl_lantern_inc" ); level notify( "sq_ftl_lantern_inc" );
self playsound( "zmb_lantern_fill_" + level.sq_ftl_lantern_fuel ); self playsound( "zmb_lantern_fill_" + level.sq_ftl_lantern_fuel );
/# /#
iprintlnbold( "Fuel Level: " + level.sq_ftl_lantern_fuel ); iprintlnbold( "Fuel Level: " + level.sq_ftl_lantern_fuel );
#/ #/
if ( level.sq_ftl_lantern_fuel >= 10 ) if ( level.sq_ftl_lantern_fuel >= 10 )
{ {
self playsound( "zmb_lantern_fill_done" ); self playsound( "zmb_lantern_fill_done" );
flag_set( "ftl_lantern_charged" ); flag_set( "ftl_lantern_charged" );
} }
} }

View File

@ -1,257 +1,262 @@
#include maps/mp/zm_buried_sq; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_buildables; // 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_buildables;
#include maps\mp\zm_buried_sq;
init() init()
{ {
flag_init( "sq_gl_lantern_aquired" ); flag_init( "sq_gl_lantern_aquired" );
declare_sidequest_stage( "sq", "gl", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "gl", ::init_stage, ::stage_logic, ::exit_stage );
level thread sq_gl_setup_buildable_trig(); level thread sq_gl_setup_buildable_trig();
} }
sq_gl_setup_buildable_trig() sq_gl_setup_buildable_trig()
{ {
while ( !isDefined( level.sq_lamp_generator_unitrig ) ) while ( !isdefined( level.sq_lamp_generator_unitrig ) )
{ wait 1;
wait 1;
} level.sq_lamp_generator_unitrig.realorigin = level.sq_lamp_generator_unitrig.origin;
level.sq_lamp_generator_unitrig.realorigin = level.sq_lamp_generator_unitrig.origin; level.sq_lamp_generator_unitrig.origin += vectorscale( ( 0, 0, -1 ), 10000.0 );
level.sq_lamp_generator_unitrig.origin += vectorScale( ( 0, 0, 1 ), 10000 );
} }
init_stage() init_stage()
{ {
s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" ); s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" );
gl_lantern_spawn( s_start ); gl_lantern_spawn( s_start );
if ( flag( "sq_is_max_tower_built" ) )
{ if ( flag( "sq_is_max_tower_built" ) )
level thread stage_vo_max(); level thread stage_vo_max();
} else
else level thread stage_vo_ric();
{
level thread stage_vo_ric(); level._cur_stage_name = "gl";
} clientnotify( "gl" );
level._cur_stage_name = "gl";
clientnotify( "gl" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "GL Started" ); iprintlnbold( "GL Started" );
#/ #/
s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" ); s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" );
gl_lantern_move( s_start ); gl_lantern_move( s_start );
flag_wait( "sq_gl_lantern_aquired" ); flag_wait( "sq_gl_lantern_aquired" );
wait_network_frame(); wait_network_frame();
stage_completed( "sq", level._cur_stage_name ); stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
stage_vo_max() stage_vo_max()
{ {
level waittill( "lantern_crashing" ); level waittill( "lantern_crashing" );
maxissay( "vox_maxi_sidequest_gl_2", level.vh_lantern );
maxissay( "vox_maxi_sidequest_gl_2", level.vh_lantern );
} }
stage_vo_ric() stage_vo_ric()
{ {
richtofensay( "vox_zmba_sidequest_gl_0", 8 ); richtofensay( "vox_zmba_sidequest_gl_0", 8 );
level waittill( "lantern_crashing" );
richtofensay( "vox_zmba_sidequest_gl_1", 6 ); level waittill( "lantern_crashing" );
richtofensay( "vox_zmba_sidequest_gl_1", 6 );
} }
gl_lantern_spawn( s_start ) gl_lantern_spawn( s_start )
{ {
level.vh_lantern = spawnvehicle( "tag_origin", "ghost_lantern_ai", "heli_quadrotor2_zm", s_start.origin, ( 0, 0, 1 ) ); level.vh_lantern = spawnvehicle( "tag_origin", "ghost_lantern_ai", "heli_quadrotor2_zm", s_start.origin, ( 0, 0, 0 ) );
level.vh_lantern makevehicleunusable(); level.vh_lantern makevehicleunusable();
level.vh_lantern setneargoalnotifydist( 128 ); level.vh_lantern setneargoalnotifydist( 128 );
level.vh_lantern.m_lantern = spawn( "script_model", level.vh_lantern.origin ); level.vh_lantern.m_lantern = spawn( "script_model", level.vh_lantern.origin );
level.vh_lantern.m_lantern setmodel( "p6_zm_bu_lantern_silver_on" ); level.vh_lantern.m_lantern setmodel( "p6_zm_bu_lantern_silver_on" );
level.vh_lantern.m_lantern linkto( level.vh_lantern, "tag_origin" ); level.vh_lantern.m_lantern linkto( level.vh_lantern, "tag_origin" );
playfxontag( level._effect[ "sq_glow" ], level.vh_lantern.m_lantern, "tag_origin" ); playfxontag( level._effect["sq_glow"], level.vh_lantern.m_lantern, "tag_origin" );
level.vh_lantern.m_lantern playsound( "zmb_sq_glantern_impact" ); level.vh_lantern.m_lantern playsound( "zmb_sq_glantern_impact" );
level.vh_lantern.m_lantern playloopsound( "zmb_sq_glantern_full_loop_3d" ); level.vh_lantern.m_lantern playloopsound( "zmb_sq_glantern_full_loop_3d" );
level.vh_lantern thread gl_lantern_damage_watcher(); level.vh_lantern thread gl_lantern_damage_watcher();
wait_network_frame(); wait_network_frame();
} }
gl_lantern_delete() gl_lantern_delete()
{ {
if ( isDefined( level.vh_lantern ) ) if ( isdefined( level.vh_lantern ) )
{ {
if ( isDefined( level.vh_lantern.m_lantern ) ) if ( isdefined( level.vh_lantern.m_lantern ) )
{ level.vh_lantern.m_lantern delete();
level.vh_lantern.m_lantern delete();
} if ( isdefined( level.vh_lantern.t_pickup ) )
if ( isDefined( level.vh_lantern.t_pickup ) ) level.vh_lantern.t_pickup delete();
{
level.vh_lantern.t_pickup delete(); level.vh_lantern cancelaimove();
} level.vh_lantern clearvehgoalpos();
level.vh_lantern cancelaimove();
level.vh_lantern clearvehgoalpos(); if ( isdefined( level.vh_lantern.m_link ) )
if ( isDefined( level.vh_lantern.m_link ) ) level.vh_lantern.m_link delete();
{
level.vh_lantern.m_link delete(); level.vh_lantern delete();
} }
level.vh_lantern delete();
}
} }
gl_lantern_move( s_current ) gl_lantern_move( s_current )
{ {
level endon( "lantern_crashing" ); level endon( "lantern_crashing" );
while ( 1 )
{ while ( true )
s_current = gl_lantern_get_next_struct( s_current ); {
if ( flag( "sq_is_max_tower_built" ) ) s_current = gl_lantern_get_next_struct( s_current );
{
if ( randomint( 100 ) < 50 ) if ( flag( "sq_is_max_tower_built" ) )
{ {
s_current = level.vh_lantern gl_lantern_teleport(); if ( randomint( 100 ) < 50 )
} s_current = level.vh_lantern gl_lantern_teleport();
} }
level.vh_lantern gl_lantern_move_to_struct( s_current );
} level.vh_lantern gl_lantern_move_to_struct( s_current );
}
} }
gl_lantern_get_next_struct( s_current ) gl_lantern_get_next_struct( s_current )
{ {
a_struct_links = []; a_struct_links = [];
a_target_structs = getstructarray( s_current.target, "targetname" ); a_target_structs = getstructarray( s_current.target, "targetname" );
while ( isDefined( s_current.script_string ) )
{ if ( isdefined( s_current.script_string ) )
a_names = strtok( s_current.script_string, " " ); {
_a171 = a_names; a_names = strtok( s_current.script_string, " " );
_k171 = getFirstArrayKey( _a171 );
while ( isDefined( _k171 ) ) foreach ( str_name in a_names )
{ {
str_name = _a171[ _k171 ]; a_new_structs = getstructarray( str_name, "targetname" );
a_new_structs = getstructarray( str_name, "targetname" ); a_target_structs = arraycombine( a_target_structs, a_new_structs, 0, 0 );
a_target_structs = arraycombine( a_target_structs, a_new_structs, 0, 0 ); }
_k171 = getNextArrayKey( _a171, _k171 ); }
}
} return array_randomize( a_target_structs )[0];
return array_randomize( a_target_structs )[ 0 ];
} }
gl_lantern_move_to_struct( s_goto ) gl_lantern_move_to_struct( s_goto )
{ {
self endon( "death" ); self endon( "death" );
self endon( "delete" ); self endon( "delete" );
self setvehgoalpos( s_goto.origin, 1 ); self setvehgoalpos( s_goto.origin, 1 );
self pathvariableoffset( vectorScale( ( 0, 0, 1 ), 128 ), 1 ); self pathvariableoffset( vectorscale( ( 1, 1, 1 ), 128.0 ), 1 );
self waittill_either( "goal", "near_goal" ); self waittill_either( "goal", "near_goal" );
} }
gl_lantern_teleport() gl_lantern_teleport()
{ {
self notify( "lantern_teleporting" ); self notify( "lantern_teleporting" );
playfx( level._effect[ "fx_wisp_lg_m" ], self.origin ); playfx( level._effect["fx_wisp_lg_m"], self.origin );
playsoundatposition( "zmb_sq_glantern_impact", self.origin ); playsoundatposition( "zmb_sq_glantern_impact", self.origin );
gl_lantern_delete(); gl_lantern_delete();
a_path_spots = getstructarray( "sq_ghost_lamp_path", "script_noteworthy" ); a_path_spots = getstructarray( "sq_ghost_lamp_path", "script_noteworthy" );
s_teleport_spot = array_randomize( a_path_spots )[ 0 ]; s_teleport_spot = array_randomize( a_path_spots )[0];
gl_lantern_spawn( s_teleport_spot ); gl_lantern_spawn( s_teleport_spot );
return s_teleport_spot; return s_teleport_spot;
} }
gl_lantern_damage_watcher() gl_lantern_damage_watcher()
{ {
self.m_lantern endon( "delete" ); self.m_lantern endon( "delete" );
self.m_lantern setcandamage( 1 ); self.m_lantern setcandamage( 1 );
while ( 1 )
{ while ( true )
self.m_lantern waittill( "damage", amount, attacker, dir, point, dmg_type ); {
if ( dmg_type == "MOD_GRENADE" || dmg_type == "MOD_GRENADE_SPLASH" ) self.m_lantern waittill( "damage", amount, attacker, dir, point, dmg_type );
{
break; if ( dmg_type == "MOD_GRENADE" || dmg_type == "MOD_GRENADE_SPLASH" )
} break;
else }
{
} self.m_lantern playsound( "zmb_sq_glantern_impact" );
} self gl_lantern_crash_movement();
self.m_lantern playsound( "zmb_sq_glantern_impact" ); self thread gl_lantern_pickup_watch();
self gl_lantern_crash_movement(); self thread gl_lantern_stop_spin_on_land();
self thread gl_lantern_pickup_watch(); level thread gl_lantern_respawn_wait();
self thread gl_lantern_stop_spin_on_land();
level thread gl_lantern_respawn_wait(); level waittill( "gl_lantern_respawn" );
level waittill( "gl_lantern_respawn" );
if ( isDefined( self.m_lantern ) ) if ( isdefined( self.m_lantern ) )
{ {
s_start_spot = gl_lantern_teleport(); s_start_spot = gl_lantern_teleport();
gl_lantern_move( s_start_spot ); gl_lantern_move( s_start_spot );
} }
} }
gl_lantern_stop_spin_on_land() gl_lantern_stop_spin_on_land()
{ {
self endon( "delete" ); self endon( "delete" );
while ( isDefined( self ) && length( self.velocity ) > 3 )
{ while ( isdefined( self ) && length( self.velocity ) > 3 )
wait 0,1; wait 0.1;
}
if ( isDefined( self ) ) if ( isdefined( self ) )
{ {
self.m_link = spawn( "script_model", self.origin ); self.m_link = spawn( "script_model", self.origin );
self.m_link setmodel( "tag_origin" ); self.m_link setmodel( "tag_origin" );
self linkto( self.m_link ); self linkto( self.m_link );
} }
} }
gl_lantern_respawn_wait() gl_lantern_respawn_wait()
{ {
wait 30; wait 30;
level notify( "gl_lantern_respawn" ); level notify( "gl_lantern_respawn" );
} }
gl_lantern_pickup_watch() gl_lantern_pickup_watch()
{ {
self endon( "lantern_teleporting" ); self endon( "lantern_teleporting" );
self.t_pickup = spawn( "trigger_radius_use", self.origin, 0, 48, 32 ); self.t_pickup = spawn( "trigger_radius_use", self.origin, 0, 48, 32 );
self.t_pickup setcursorhint( "HINT_NOICON" ); self.t_pickup setcursorhint( "HINT_NOICON" );
self.t_pickup sethintstring( &"ZM_BURIED_SQ_LANTERN_G" ); self.t_pickup sethintstring( &"ZM_BURIED_SQ_LANTERN_G" );
self.t_pickup triggerignoreteam(); self.t_pickup triggerignoreteam();
self.t_pickup enablelinkto(); self.t_pickup enablelinkto();
self.t_pickup linkto( self ); self.t_pickup linkto( self );
self.t_pickup waittill( "trigger", player );
player player_take_piece( level.zombie_buildables[ "buried_sq_oillamp" ].buildablepieces[ 0 ] ); self.t_pickup waittill( "trigger", player );
piece = player player_get_buildable_piece( 2 );
if ( isDefined( piece ) ) player player_take_piece( level.zombie_buildables["buried_sq_oillamp"].buildablepieces[0] );
{ piece = player player_get_buildable_piece( 2 );
piece.sq_is_ghost_lamp = 1;
piece.start_origin = vectorScale( ( 0, 0, 1 ), 512 ); if ( isdefined( piece ) )
piece.start_angles = ( 0, 0, 1 ); {
} piece.sq_is_ghost_lamp = 1;
self.t_pickup delete(); piece.start_origin = vectorscale( ( 0, 0, -1 ), 512.0 );
self.m_lantern delete(); piece.start_angles = ( 0, 0, 0 );
self delete(); }
flag_set( "sq_gl_lantern_aquired" );
self.t_pickup delete();
self.m_lantern delete();
self delete();
flag_set( "sq_gl_lantern_aquired" );
} }
gl_lantern_crash_movement() gl_lantern_crash_movement()
{ {
level notify( "lantern_crashing" ); level notify( "lantern_crashing" );
self cancelaimove(); self cancelaimove();
self clearvehgoalpos(); self clearvehgoalpos();
self setphysacceleration( vectorScale( ( 0, 0, 1 ), 800 ) ); self setphysacceleration( vectorscale( ( 0, 0, -1 ), 800.0 ) );
hitdir = ( 0, 0, 1 ); hitdir = ( 1, 0, 0 );
side_dir = vectorcross( hitdir, ( 0, 0, 1 ) ); side_dir = vectorcross( hitdir, ( 0, 0, 1 ) );
side_dir_mag = randomfloatrange( -100, 100 ); side_dir_mag = randomfloatrange( -100, 100 );
side_dir_mag += sign( side_dir_mag ) * 80; side_dir_mag += sign( side_dir_mag ) * 80;
side_dir *= side_dir_mag; side_dir *= side_dir_mag;
self setvehvelocity( self.velocity + vectorScale( ( 0, 0, 1 ), 100 ) + vectornormalize( side_dir ) ); self setvehvelocity( self.velocity + vectorscale( ( 0, 0, 1 ), 100.0 ) + vectornormalize( side_dir ) );
ang_vel = self getangularvelocity(); ang_vel = self getangularvelocity();
ang_vel = ( ang_vel[ 0 ] * 0,3, ang_vel[ 1 ], ang_vel[ 2 ] * 0,3 ); ang_vel = ( ang_vel[0] * 0.3, ang_vel[1], ang_vel[2] * 0.3 );
yaw_vel = randomfloatrange( 0, 210 ) * sign( ang_vel[ 1 ] ); yaw_vel = randomfloatrange( 0, 210 ) * sign( ang_vel[1] );
yaw_vel += sign( yaw_vel ) * 180; yaw_vel += sign( yaw_vel ) * 180;
ang_vel += ( randomfloatrange( -1, 1 ), yaw_vel, randomfloatrange( -1, 1 ) ); ang_vel += ( randomfloatrange( -1, 1 ), yaw_vel, randomfloatrange( -1, 1 ) );
self setangularvelocity( ang_vel ); self setangularvelocity( ang_vel );
self.crash_accel = randomfloatrange( 75, 110 ); self.crash_accel = randomfloatrange( 75, 110 );
} }

View File

@ -1,420 +1,409 @@
#include maps/mp/zombies/_zm_zonemgr; // T6 GSC SOURCE
#include maps/mp/zm_buried_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_buried_sq;
#using_animtree( "fxanim_props_dlc3" ); #include maps\mp\zombies\_zm_zonemgr;
init() init()
{ {
flag_init( "sq_ip_puzzle_complete" ); flag_init( "sq_ip_puzzle_complete" );
level.sq_bp_buttons = []; level.sq_bp_buttons = [];
s_lightboard = getstruct( "zm_sq_lightboard", "targetname" ); s_lightboard = getstruct( "zm_sq_lightboard", "targetname" );
s_lightboard sq_bp_spawn_board(); s_lightboard sq_bp_spawn_board();
declare_sidequest_stage( "sq", "ip", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "ip", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
if ( flag( "sq_is_max_tower_built" ) ) if ( flag( "sq_is_max_tower_built" ) )
{ level thread stage_vo_max();
level thread stage_vo_max(); else
} level thread stage_vo_ric();
else
{ level._cur_stage_name = "ip";
level thread stage_vo_ric(); clientnotify( "ip" );
}
level._cur_stage_name = "ip";
clientnotify( "ip" );
} }
stage_vo_max() stage_vo_max()
{ {
s_struct = getstruct( "sq_gallows", "targetname" ); s_struct = getstruct( "sq_gallows", "targetname" );
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 ); trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
m_maxis_vo_spot = spawn( "script_model", s_struct.origin ); m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
m_maxis_vo_spot setmodel( "tag_origin" ); m_maxis_vo_spot setmodel( "tag_origin" );
maxissay( "vox_maxi_sidequest_ip_0", m_maxis_vo_spot ); maxissay( "vox_maxi_sidequest_ip_0", m_maxis_vo_spot );
maxissay( "vox_maxi_sidequest_ip_1", m_maxis_vo_spot ); maxissay( "vox_maxi_sidequest_ip_1", m_maxis_vo_spot );
m_lightboard = getent( "sq_bp_board", "targetname" ); m_lightboard = getent( "sq_bp_board", "targetname" );
trigger = spawn( "trigger_radius", m_lightboard.origin, 0, 128, 72 ); trigger = spawn( "trigger_radius", m_lightboard.origin, 0, 128, 72 );
trigger waittill( "trigger" );
maxissay( "vox_maxi_sidequest_ip_2", m_lightboard ); trigger waittill( "trigger" );
maxissay( "vox_maxi_sidequest_ip_3", m_lightboard );
maxissay( "vox_maxi_sidequest_ip_2", m_lightboard );
maxissay( "vox_maxi_sidequest_ip_3", m_lightboard );
} }
stage_vo_ric() stage_vo_ric()
{ {
richtofensay( "vox_zmba_sidequest_ip_0", 10 ); richtofensay( "vox_zmba_sidequest_ip_0", 10 );
richtofensay( "vox_zmba_sidequest_ip_1", 5,5 ); richtofensay( "vox_zmba_sidequest_ip_1", 5.5 );
richtofensay( "vox_zmba_sidequest_ip_2", 8 ); richtofensay( "vox_zmba_sidequest_ip_2", 8 );
richtofensay( "vox_zmba_sidequest_ip_3", 11 ); richtofensay( "vox_zmba_sidequest_ip_3", 11 );
if ( !isDefined( level.rich_sq_player ) )
{ if ( !isdefined( level.rich_sq_player ) )
return; return;
}
while ( !level.rich_sq_player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_maze" ) ) while ( !level.rich_sq_player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_maze" ) )
{ wait 1;
wait 1;
} richtofensay( "vox_zmba_sidequest_ip_4", 8 );
richtofensay( "vox_zmba_sidequest_ip_4", 8 );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "IP Started" ); iprintlnbold( "IP Started" );
#/ #/
if ( flag( "sq_is_max_tower_built" ) ) if ( flag( "sq_is_max_tower_built" ) )
{ {
a_button_structs = getstructarray( "sq_bp_button", "targetname" ); a_button_structs = getstructarray( "sq_bp_button", "targetname" );
array_thread( a_button_structs, ::sq_bp_spawn_trigger ); array_thread( a_button_structs, ::sq_bp_spawn_trigger );
m_lightboard = getent( "sq_bp_board", "targetname" ); m_lightboard = getent( "sq_bp_board", "targetname" );
m_lightboard setclientfield( "buried_sq_bp_set_lightboard", 1 ); m_lightboard setclientfield( "buried_sq_bp_set_lightboard", 1 );
while ( !flag( "sq_ip_puzzle_complete" ) )
{ while ( !flag( "sq_ip_puzzle_complete" ) )
sq_bp_start_puzzle_lights(); {
sq_bp_delete_green_lights(); sq_bp_start_puzzle_lights();
wait_network_frame(); sq_bp_delete_green_lights();
wait_network_frame(); wait_network_frame();
wait_network_frame(); wait_network_frame();
wait_network_frame(); wait_network_frame();
wait_network_frame(); wait_network_frame();
} wait_network_frame();
} }
else sq_ml_spawn_levers(); }
a_levers = getentarray( "sq_ml_lever", "targetname" ); else
array_thread( a_levers, ::sq_ml_spawn_trigger ); {
level thread sq_ml_puzzle_logic(); sq_ml_spawn_levers();
flag_wait( "sq_ip_puzzle_complete" ); a_levers = getentarray( "sq_ml_lever", "targetname" );
wait_network_frame(); array_thread( a_levers, ::sq_ml_spawn_trigger );
stage_completed( "sq", level._cur_stage_name ); level thread sq_ml_puzzle_logic();
flag_wait( "sq_ip_puzzle_complete" );
}
wait_network_frame();
stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
sq_bp_spawn_trigger() sq_bp_spawn_trigger()
{ {
level endon( "sq_ip_puzzle_complete" ); level endon( "sq_ip_puzzle_complete" );
self.trig = spawn( "trigger_radius_use", self.origin, 0, 16, 16 ); self.trig = spawn( "trigger_radius_use", self.origin, 0, 16, 16 );
self.trig setcursorhint( "HINT_NOICON" ); self.trig setcursorhint( "HINT_NOICON" );
self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" ); self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" );
self.trig triggerignoreteam(); self.trig triggerignoreteam();
self.trig usetriggerrequirelookat(); self.trig usetriggerrequirelookat();
while ( 1 )
{ while ( true )
self.trig waittill( "trigger" ); {
self.trig sethintstring( "" ); self.trig waittill( "trigger" );
level thread sq_bp_button_pressed( self.script_string, self.trig );
wait 1; self.trig sethintstring( "" );
self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" ); level thread sq_bp_button_pressed( self.script_string, self.trig );
} wait 1;
self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" );
}
} }
sq_bp_spawn_board() sq_bp_spawn_board()
{ {
m_board = spawn( "script_model", self.origin ); m_board = spawn( "script_model", self.origin );
m_board.angles = self.angles; m_board.angles = self.angles;
m_board setmodel( "p6_zm_bu_bulb_puzzle_machine" ); m_board setmodel( "p6_zm_bu_bulb_puzzle_machine" );
m_board.targetname = "sq_bp_board"; m_board.targetname = "sq_bp_board";
} }
sq_bp_button_pressed( str_tag, trig ) sq_bp_button_pressed( str_tag, trig )
{ {
if ( isDefined( level.str_sq_bp_active_light ) ) if ( isdefined( level.str_sq_bp_active_light ) )
{ {
if ( level.str_sq_bp_active_light == str_tag ) if ( level.str_sq_bp_active_light == str_tag )
{ {
trig playsound( "zmb_sq_bell_yes" ); trig playsound( "zmb_sq_bell_yes" );
sq_bp_light_on( str_tag, "green" ); sq_bp_light_on( str_tag, "green" );
level notify( "sq_bp_correct_button" ); level notify( "sq_bp_correct_button" );
} }
else else
{ {
trig playsound( "zmb_sq_bell_no" ); trig playsound( "zmb_sq_bell_no" );
level notify( "sq_bp_wrong_button" ); level notify( "sq_bp_wrong_button" );
m_light = sq_bp_light_on( str_tag, "yellow" ); m_light = sq_bp_light_on( str_tag, "yellow" );
} }
} }
else else
{ {
m_light = sq_bp_light_on( str_tag, "yellow" ); m_light = sq_bp_light_on( str_tag, "yellow" );
trig playsound( "zmb_sq_bell_no" ); trig playsound( "zmb_sq_bell_no" );
} }
wait 1;
if ( isDefined( m_light ) ) wait 1;
{
level setclientfield( m_light, 0 ); if ( isdefined( m_light ) )
} level setclientfield( m_light, 0 );
} }
sq_bp_start_puzzle_lights() sq_bp_start_puzzle_lights()
{ {
level endon( "sq_bp_wrong_button" ); level endon( "sq_bp_wrong_button" );
level endon( "sq_bp_timeout" ); level endon( "sq_bp_timeout" );
a_button_structs = getstructarray( "sq_bp_button", "targetname" ); a_button_structs = getstructarray( "sq_bp_button", "targetname" );
a_tags = []; a_tags = [];
_a190 = a_button_structs;
_k190 = getFirstArrayKey( _a190 ); foreach ( m_button in a_button_structs )
while ( isDefined( _k190 ) ) a_tags[a_tags.size] = m_button.script_string;
{
m_button = _a190[ _k190 ]; a_tags = array_randomize( a_tags );
a_tags[ a_tags.size ] = m_button.script_string; m_lightboard = getent( "sq_bp_board", "targetname" );
_k190 = getNextArrayKey( _a190, _k190 );
} if ( !isdefined( level.t_start ) )
a_tags = array_randomize( a_tags ); level.t_start = spawn( "trigger_radius_use", m_lightboard.origin, 0, 16, 16 );
m_lightboard = getent( "sq_bp_board", "targetname" );
if ( !isDefined( level.t_start ) ) level.t_start setcursorhint( "HINT_NOICON" );
{ level.t_start sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
level.t_start = spawn( "trigger_radius_use", m_lightboard.origin, 0, 16, 16 ); level.t_start triggerignoreteam();
} level.t_start usetriggerrequirelookat();
level.t_start setcursorhint( "HINT_NOICON" );
level.t_start sethintstring( &"ZM_BURIED_SQ_SWIT_U" ); level.t_start waittill( "trigger" );
level.t_start triggerignoreteam();
level.t_start usetriggerrequirelookat(); level.t_start delete();
level.t_start waittill( "trigger" );
level.t_start delete(); foreach ( str_tag in a_tags )
_a210 = a_tags; {
_k210 = getFirstArrayKey( _a210 ); wait_network_frame();
while ( isDefined( _k210 ) ) wait_network_frame();
{ level thread sq_bp_set_current_bulb( str_tag );
str_tag = _a210[ _k210 ];
wait_network_frame(); level waittill( "sq_bp_correct_button" );
wait_network_frame(); }
level thread sq_bp_set_current_bulb( str_tag );
level waittill( "sq_bp_correct_button" ); flag_set( "sq_ip_puzzle_complete" );
_k210 = getNextArrayKey( _a210, _k210 ); a_button_structs = getstructarray( "sq_bp_button", "targetname" );
}
flag_set( "sq_ip_puzzle_complete" ); foreach ( s_button in a_button_structs )
a_button_structs = getstructarray( "sq_bp_button", "targetname" ); {
_a221 = a_button_structs; if ( isdefined( s_button.trig ) )
_k221 = getFirstArrayKey( _a221 ); s_button.trig delete();
while ( isDefined( _k221 ) ) }
{
s_button = _a221[ _k221 ];
if ( isDefined( s_button.trig ) )
{
s_button.trig delete();
}
_k221 = getNextArrayKey( _a221, _k221 );
}
} }
sq_bp_set_current_bulb( str_tag ) sq_bp_set_current_bulb( str_tag )
{ {
level endon( "sq_bp_correct_button" ); level endon( "sq_bp_correct_button" );
level endon( "sq_bp_wrong_button" ); level endon( "sq_bp_wrong_button" );
level endon( "sq_bp_timeout" ); level endon( "sq_bp_timeout" );
if ( isDefined( level.m_sq_bp_active_light ) )
{ if ( isdefined( level.m_sq_bp_active_light ) )
level.str_sq_bp_active_light = ""; level.str_sq_bp_active_light = "";
}
level.m_sq_bp_active_light = sq_bp_light_on( str_tag, "yellow" ); level.m_sq_bp_active_light = sq_bp_light_on( str_tag, "yellow" );
level.str_sq_bp_active_light = str_tag; level.str_sq_bp_active_light = str_tag;
wait 10; wait 10;
level notify( "sq_bp_timeout" ); level notify( "sq_bp_timeout" );
} }
sq_bp_delete_green_lights() sq_bp_delete_green_lights()
{ {
a_button_structs = getstructarray( "sq_bp_button", "targetname" ); a_button_structs = getstructarray( "sq_bp_button", "targetname" );
_a251 = a_button_structs;
_k251 = getFirstArrayKey( _a251 ); foreach ( m_button in a_button_structs )
while ( isDefined( _k251 ) ) {
{ str_clientfield = "buried_sq_bp_" + m_button.script_string;
m_button = _a251[ _k251 ]; level setclientfield( str_clientfield, 0 );
str_clientfield = "buried_sq_bp_" + m_button.script_string; }
level setclientfield( str_clientfield, 0 );
_k251 = getNextArrayKey( _a251, _k251 ); if ( isdefined( level.m_sq_bp_active_light ) )
} level.str_sq_bp_active_light = "";
if ( isDefined( level.m_sq_bp_active_light ) )
{
level.str_sq_bp_active_light = "";
}
} }
sq_bp_light_on( str_tag, str_color ) sq_bp_light_on( str_tag, str_color )
{ {
str_clientfield = "buried_sq_bp_" + str_tag; str_clientfield = "buried_sq_bp_" + str_tag;
n_color = 1; n_color = 1;
if ( str_color == "green" )
{ if ( str_color == "green" )
n_color = 2; n_color = 2;
}
level setclientfield( str_clientfield, 0 ); level setclientfield( str_clientfield, 0 );
wait_network_frame(); wait_network_frame();
level setclientfield( str_clientfield, n_color ); level setclientfield( str_clientfield, n_color );
return str_clientfield; return str_clientfield;
} }
debug_tag( str_tag ) debug_tag( str_tag )
{ {
/# /#
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
debugstar( self gettagorigin( str_tag ), 1, ( 0, 1, 0 ) ); {
wait 0,05; debugstar( self gettagorigin( str_tag ), 1, ( 1, 0, 0 ) );
wait 0.05;
}
#/ #/
}
} }
sq_ml_spawn_lever( n_index ) sq_ml_spawn_lever( n_index )
{ {
m_lever = spawn( "script_model", ( 0, 1, 0 ) ); m_lever = spawn( "script_model", ( 0, 0, 0 ) );
m_lever setmodel( self.model ); m_lever setmodel( self.model );
m_lever.targetname = "sq_ml_lever"; m_lever.targetname = "sq_ml_lever";
while ( 1 )
{ while ( true )
v_spot = self.origin; {
v_angles = self.angles; v_spot = self.origin;
if ( isDefined( level._maze._active_perm_list[ n_index ] ) ) v_angles = self.angles;
{
is_flip = randomint( 2 ); if ( isdefined( level._maze._active_perm_list[n_index] ) )
s_spot = getstruct( level._maze._active_perm_list[ n_index ], "script_noteworthy" ); {
v_right = anglesToRight( s_spot.angles ); is_flip = randomint( 2 );
v_offset = vectornormalize( v_right ) * 2; s_spot = getstruct( level._maze._active_perm_list[n_index], "script_noteworthy" );
if ( is_flip ) v_right = anglestoright( s_spot.angles );
{ v_offset = vectornormalize( v_right ) * 2;
v_offset *= -1;
} if ( is_flip )
v_spot = s_spot.origin + vectorScale( ( 0, 1, 0 ), 48 ) + v_offset; v_offset *= -1;
v_angles = s_spot.angles + vectorScale( ( 0, 1, 0 ), 90 );
if ( is_flip ) v_spot = s_spot.origin + vectorscale( ( 0, 0, 1 ), 48.0 ) + v_offset;
{ v_angles = s_spot.angles + vectorscale( ( 0, 1, 0 ), 90.0 );
v_angles = s_spot.angles - vectorScale( ( 0, 1, 0 ), 90 );
} if ( is_flip )
} v_angles = s_spot.angles - vectorscale( ( 0, 1, 0 ), 90.0 );
m_lever.origin = v_spot; }
m_lever.angles = v_angles;
m_lever.origin = v_spot;
m_lever.angles = v_angles;
/# /#
m_lever thread sq_ml_show_lever_debug( v_spot, n_index ); m_lever thread sq_ml_show_lever_debug( v_spot, n_index );
#/ #/
level waittill( "zm_buried_maze_changed" ); level waittill( "zm_buried_maze_changed" );
} }
} }
sq_ml_show_lever_debug( v_spot, n_index ) sq_ml_show_lever_debug( v_spot, n_index )
{ {
level endon( "zm_buried_maze_changed" ); level endon( "zm_buried_maze_changed" );
/# /#
while ( 1 ) while ( true )
{ {
line( self.origin, v_spot, ( 0, 1, 0 ) ); line( self.origin, v_spot, ( 0, 0, 1 ) );
print3d( self.origin, "" + n_index, ( 0, 1, 0 ), 1, 2 ); print3d( self.origin, "" + n_index, ( 0, 1, 0 ), 1, 2 );
wait 0,05; wait 0.05;
}
#/ #/
}
} }
sq_ml_spawn_trigger() sq_ml_spawn_trigger()
{ {
v_right = anglesToForward( self.angles ); v_right = anglestoforward( self.angles );
v_offset = vectornormalize( v_right ) * 8; v_offset = vectornormalize( v_right ) * 8;
self.trig = spawn( "trigger_box_use", self.origin - v_offset, 0, 16, 16, 16 ); self.trig = spawn( "trigger_box_use", self.origin - v_offset, 0, 16, 16, 16 );
self.trig enablelinkto(); self.trig enablelinkto();
self.trig linkto( self ); self.trig linkto( self );
self.trig setcursorhint( "HINT_NOICON" ); self.trig setcursorhint( "HINT_NOICON" );
self.trig sethintstring( &"ZM_BURIED_SQ_SWIT_U" ); self.trig sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
self.trig triggerignoreteam(); self.trig triggerignoreteam();
self.trig usetriggerrequirelookat(); self.trig usetriggerrequirelookat();
self.is_flipped = 0; self.is_flipped = 0;
self useanimtree( -1 ); self useanimtree( -1 );
while ( 1 )
{ while ( true )
self.trig waittill( "trigger" ); {
self setanim( level.maze_switch_anim[ "switch_down" ] ); self.trig waittill( "trigger" );
self.trig sethintstring( "" );
self.is_flipped = 1; self setanim( level.maze_switch_anim["switch_down"] );
self.n_flip_number = level.sq_ml_curr_lever; self.trig sethintstring( "" );
level.sq_ml_curr_lever++; self.is_flipped = 1;
self.trig playsound( "zmb_sq_maze_switch" ); self.n_flip_number = level.sq_ml_curr_lever;
level waittill( "sq_ml_reset_levers" ); level.sq_ml_curr_lever++;
self setanim( level.maze_switch_anim[ "switch_up" ] ); self.trig playsound( "zmb_sq_maze_switch" );
self.trig sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
self.is_flipped = 0; level waittill( "sq_ml_reset_levers" );
}
self setanim( level.maze_switch_anim["switch_up"] );
self.trig sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
self.is_flipped = 0;
}
} }
sq_ml_spawn_levers() sq_ml_spawn_levers()
{ {
if ( maps/mp/zombies/_zm_zonemgr::player_in_zone( "zone_maze" ) ) if ( maps\mp\zombies\_zm_zonemgr::player_in_zone( "zone_maze" ) )
{ level waittill( "zm_buried_maze_changed" );
level waittill( "zm_buried_maze_changed" );
} a_lever_structs = getstructarray( "sq_maze_lever", "targetname" );
a_lever_structs = getstructarray( "sq_maze_lever", "targetname" );
i = 0; for ( i = 0; i < a_lever_structs.size; i++ )
while ( i < a_lever_structs.size ) a_lever_structs[i] thread sq_ml_spawn_lever( i );
{
a_lever_structs[ i ] thread sq_ml_spawn_lever( i );
i++;
}
} }
sq_ml_puzzle_logic() sq_ml_puzzle_logic()
{ {
a_levers = getentarray( "sq_ml_lever", "targetname" ); a_levers = getentarray( "sq_ml_lever", "targetname" );
level.sq_ml_curr_lever = 0; level.sq_ml_curr_lever = 0;
a_levers = array_randomize( a_levers ); a_levers = array_randomize( a_levers );
i = 0;
while ( i < a_levers.size ) for ( i = 0; i < a_levers.size; i++ )
{ a_levers[i].n_lever_order = i;
a_levers[ i ].n_lever_order = i;
i++; while ( true )
} {
while ( 1 ) level.sq_ml_curr_lever = 0;
{ sq_ml_puzzle_wait_for_levers();
level.sq_ml_curr_lever = 0; n_correct = 0;
sq_ml_puzzle_wait_for_levers();
n_correct = 0; foreach ( m_lever in a_levers )
_a424 = a_levers; {
_k424 = getFirstArrayKey( _a424 ); if ( m_lever.n_flip_number == m_lever.n_lever_order )
while ( isDefined( _k424 ) ) {
{ playfxontag( level._effect["sq_spark"], m_lever, "tag_origin" );
m_lever = _a424[ _k424 ]; n_correct++;
if ( m_lever.n_flip_number == m_lever.n_lever_order ) m_lever playsound( "zmb_sq_maze_correct_spark" );
{ }
playfxontag( level._effect[ "sq_spark" ], m_lever, "tag_origin" ); }
n_correct++;
m_lever playsound( "zmb_sq_maze_correct_spark" );
}
_k424 = getNextArrayKey( _a424, _k424 );
}
/# /#
iprintlnbold( "Levers Correct: " + n_correct ); iprintlnbold( "Levers Correct: " + n_correct );
#/ #/
if ( n_correct == a_levers.size ) if ( n_correct == a_levers.size )
{ flag_set( "sq_ip_puzzle_complete" );
flag_set( "sq_ip_puzzle_complete" );
} level waittill( "zm_buried_maze_changed" );
level waittill( "zm_buried_maze_changed" );
level notify( "sq_ml_reset_levers" ); level notify( "sq_ml_reset_levers" );
wait 1; wait 1;
} }
} }
sq_ml_puzzle_wait_for_levers() sq_ml_puzzle_wait_for_levers()
{ {
a_levers = getentarray( "sq_ml_lever", "targetname" ); a_levers = getentarray( "sq_ml_lever", "targetname" );
are_all_flipped = 0; are_all_flipped = 0;
while ( !are_all_flipped )
{ while ( !are_all_flipped )
are_all_flipped = 1; {
_a458 = a_levers; are_all_flipped = 1;
_k458 = getFirstArrayKey( _a458 );
while ( isDefined( _k458 ) ) foreach ( m_lever in a_levers )
{ {
m_lever = _a458[ _k458 ]; if ( m_lever.is_flipped == 0 )
if ( m_lever.is_flipped == 0 ) are_all_flipped = 0;
{ }
are_all_flipped = 0;
} wait 1;
_k458 = getNextArrayKey( _a458, _k458 ); }
}
wait 1;
}
} }

View File

@ -1,102 +1,90 @@
#include maps/mp/zm_buried_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_buried_sq;
init() init()
{ {
flag_init( "sq_ll_generator_on" ); flag_init( "sq_ll_generator_on" );
declare_sidequest_stage( "sq", "ll", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "ll", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
level._cur_stage_name = "ll"; level._cur_stage_name = "ll";
clientnotify( "ll" ); clientnotify( "ll" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "LL Started" ); iprintlnbold( "LL Started" );
#/ #/
if ( !isDefined( level.generator_power_states_color ) ) if ( !isdefined( level.generator_power_states_color ) )
{ level.generator_power_states_color = 0;
level.generator_power_states_color = 0;
} sq_ll_show_code();
sq_ll_show_code(); wait_network_frame();
wait_network_frame(); stage_completed( "sq", level._cur_stage_name );
stage_completed( "sq", level._cur_stage_name );
} }
sq_ll_show_code() sq_ll_show_code()
{ {
a_spots = getstructarray( "sq_code_pos", "targetname" ); a_spots = getstructarray( "sq_code_pos", "targetname" );
a_signs = getentarray( "sq_tunnel_sign", "targetname" ); a_signs = getentarray( "sq_tunnel_sign", "targetname" );
a_codes = []; a_codes = [];
_a50 = a_signs;
_k50 = getFirstArrayKey( _a50 ); foreach ( m_sign in a_signs )
while ( isDefined( _k50 ) ) {
{ if ( flag( "sq_is_max_tower_built" ) )
m_sign = _a50[ _k50 ]; {
if ( flag( "sq_is_max_tower_built" ) ) if ( isdefined( m_sign.is_max_sign ) )
{ a_codes[a_codes.size] = m_sign.model + "_code";
if ( isDefined( m_sign.is_max_sign ) )
{ continue;
a_codes[ a_codes.size ] = m_sign.model + "_code"; }
}
} if ( isdefined( m_sign.is_ric_sign ) )
else a_codes[a_codes.size] = m_sign.model + "_code";
{ }
if ( isDefined( m_sign.is_ric_sign ) )
{ for ( i = 0; i < a_codes.size; i++ )
a_codes[ a_codes.size ] = m_sign.model + "_code"; {
} if ( a_codes[i] == "p6_zm_bu_sign_tunnel_consumption_code" )
} a_codes[i] = "p6_zm_bu_sign_tunnel_consump_code";
_k50 = getNextArrayKey( _a50, _k50 ); }
}
i = 0; for ( i = 0; i < a_codes.size; i++ )
while ( i < a_codes.size ) {
{ m_code = spawn( "script_model", a_spots[i].origin );
if ( a_codes[ i ] == "p6_zm_bu_sign_tunnel_consumption_code" ) m_code.angles = a_spots[i].angles;
{ m_code setmodel( a_codes[i] );
a_codes[ i ] = "p6_zm_bu_sign_tunnel_consump_code"; }
}
i++; if ( flag( "sq_is_max_tower_built" ) )
} level thread sq_ll_show_code_vo_max();
i = 0; else
while ( i < a_codes.size ) level thread sq_ll_show_code_vo_ric();
{
m_code = spawn( "script_model", a_spots[ i ].origin );
m_code.angles = a_spots[ i ].angles;
m_code setmodel( a_codes[ i ] );
i++;
}
if ( flag( "sq_is_max_tower_built" ) )
{
level thread sq_ll_show_code_vo_max();
}
else
{
level thread sq_ll_show_code_vo_ric();
}
} }
exit_stage( success ) exit_stage( success )
{ {
} }
sq_ll_show_code_vo_max() sq_ll_show_code_vo_max()
{ {
a_signs = getentarray( "sq_tunnel_sign", "targetname" ); a_signs = getentarray( "sq_tunnel_sign", "targetname" );
maxissay( "vox_maxi_sidequest_signs_0", a_signs[ 0 ] ); maxissay( "vox_maxi_sidequest_signs_0", a_signs[0] );
maxissay( "vox_maxi_sidequest_signs_1", a_signs[ 0 ] ); maxissay( "vox_maxi_sidequest_signs_1", a_signs[0] );
} }
sq_ll_show_code_vo_ric() sq_ll_show_code_vo_ric()
{ {
richtofensay( "vox_zmba_sidequest_signs_0", 7 ); richtofensay( "vox_zmba_sidequest_signs_0", 7 );
richtofensay( "vox_zmba_sidequest_signs_1", 10 ); richtofensay( "vox_zmba_sidequest_signs_1", 10 );
richtofensay( "vox_zmba_sidequest_signs_2", 9 ); richtofensay( "vox_zmba_sidequest_signs_2", 9 );
} }

View File

@ -1,204 +1,205 @@
#include maps/mp/zm_buried_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_buried_sq;
init() init()
{ {
flag_init( "sq_amplifiers_on" ); flag_init( "sq_amplifiers_on" );
a_amp_structs = getstructarray( "sq_amplifier_spot" ); a_amp_structs = getstructarray( "sq_amplifier_spot" );
_a16 = a_amp_structs;
_k16 = getFirstArrayKey( _a16 ); foreach ( s_amp_spot in a_amp_structs )
while ( isDefined( _k16 ) ) {
{ m_amplifier = spawn( "script_model", s_amp_spot.origin );
s_amp_spot = _a16[ _k16 ]; m_amplifier thread mta_amplifier_init();
m_amplifier = spawn( "script_model", s_amp_spot.origin ); }
m_amplifier thread mta_amplifier_init();
_k16 = getNextArrayKey( _a16, _k16 ); declare_sidequest_stage( "sq", "mta", ::init_stage, ::stage_logic, ::exit_stage );
}
declare_sidequest_stage( "sq", "mta", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
a_amplifiers = getentarray( "sq_amplifier", "targetname" ); a_amplifiers = getentarray( "sq_amplifier", "targetname" );
array_thread( a_amplifiers, ::mta_amplifier_found_watcher ); array_thread( a_amplifiers, ::mta_amplifier_found_watcher );
level thread stage_vo_max(); level thread stage_vo_max();
level thread stage_vo_ric(); level thread stage_vo_ric();
level._cur_stage_name = "mta"; level._cur_stage_name = "mta";
clientnotify( "mta" ); clientnotify( "mta" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "MTA Started" ); iprintlnbold( "MTA Started" );
#/ #/
flag_wait_any( "sq_amplifiers_on", "sq_amplifiers_broken" ); flag_wait_any( "sq_amplifiers_on", "sq_amplifiers_broken" );
wait_network_frame(); wait_network_frame();
stage_completed( "sq", level._cur_stage_name ); stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
stage_vo_max() stage_vo_max()
{ {
level thread stage_vo_max_amp_broken(); level thread stage_vo_max_amp_broken();
level waittill( "mta_amp_found", amp );
maxissay( "vox_maxi_sidequest_amp_0", amp ); level waittill( "mta_amp_found", amp );
maxissay( "vox_maxi_sidequest_amp_1", amp );
maxissay( "vox_maxi_sidequest_amp_0", amp );
maxissay( "vox_maxi_sidequest_amp_1", amp );
} }
stage_vo_max_amp_broken() stage_vo_max_amp_broken()
{ {
level waittill( "mta_amp_broken", amp ); level waittill( "mta_amp_broken", amp );
maxissay( "vox_maxi_sidequest_amp_2", amp );
level waittill( "mta_amp_broken", amp ); maxissay( "vox_maxi_sidequest_amp_2", amp );
maxissay( "vox_maxi_sidequest_amp_3", amp );
level waittill( "mta_amp_broken", amp ); level waittill( "mta_amp_broken", amp );
maxissay( "vox_maxi_sidequest_amp_4", amp );
level waittill( "mta_amp_broken", amp ); maxissay( "vox_maxi_sidequest_amp_3", amp );
maxissay( "vox_maxi_sidequest_amp_5", amp );
maxissay( "vox_maxi_sidequest_gl_0", amp ); level waittill( "mta_amp_broken", amp );
maxissay( "vox_maxi_sidequest_gl_1", amp );
maxissay( "vox_maxi_sidequest_amp_4", amp );
level waittill( "mta_amp_broken", amp );
maxissay( "vox_maxi_sidequest_amp_5", amp );
maxissay( "vox_maxi_sidequest_gl_0", amp );
maxissay( "vox_maxi_sidequest_gl_1", amp );
} }
stage_vo_ric() stage_vo_ric()
{ {
level thread stage_vo_ric_amp_amplified(); level thread stage_vo_ric_amp_amplified();
level waittill( "mta_amp_found_by_sam" );
richtofensay( "vox_zmba_sidequest_amp_0", 10 ); level waittill( "mta_amp_found_by_sam" );
richtofensay( "vox_zmba_sidequest_amp_1", 7 );
richtofensay( "vox_zmba_sidequest_amp_0", 10 );
richtofensay( "vox_zmba_sidequest_amp_1", 7 );
} }
stage_vo_ric_amp_amplified() stage_vo_ric_amp_amplified()
{ {
level waittill( "mta_amp_amplified" ); level waittill( "mta_amp_amplified" );
richtofensay( "vox_zmba_sidequest_amp_2", 6 );
richtofensay( "vox_zmba_sidequest_amp_3", 4 ); richtofensay( "vox_zmba_sidequest_amp_2", 6 );
richtofensay( "vox_zmba_sidequest_amp_3", 4 );
} }
mta_amplifier_found_watcher() mta_amplifier_found_watcher()
{ {
self endon( "damaged_by_subwoofer" ); self endon( "damaged_by_subwoofer" );
self endon( "amplifier_filled" ); self endon( "amplifier_filled" );
if ( self.amplifier_state != "base" )
{ if ( self.amplifier_state != "base" )
return; return;
}
trigger = spawn( "trigger_radius", self.origin, 0, 128, 72 ); trigger = spawn( "trigger_radius", self.origin, 0, 128, 72 );
trigger waittill( "trigger", who );
if ( isDefined( level.rich_sq_player ) && who == level.rich_sq_player ) trigger waittill( "trigger", who );
{
level notify( "mta_amp_found_by_sam" ); if ( isdefined( level.rich_sq_player ) && who == level.rich_sq_player )
} level notify( "mta_amp_found_by_sam" );
else else
{ level notify( "mta_amp_found", self );
level notify( "mta_amp_found" );
}
} }
mta_amplifier_init() mta_amplifier_init()
{ {
self setmodel( "p6_zm_bu_ether_amplifier" ); self setmodel( "p6_zm_bu_ether_amplifier" );
self.targetname = "sq_amplifier"; self.targetname = "sq_amplifier";
self.script_noteworthy = "subwoofer_target"; self.script_noteworthy = "subwoofer_target";
self.amplifier_state = "base"; self.amplifier_state = "base";
self playloopsound( "zmb_sq_amplifier_empty_loop", 1 ); self playloopsound( "zmb_sq_amplifier_empty_loop", 1 );
self setcandamage( 1 ); self setcandamage( 1 );
self thread mta_amplifier_subwoofer_watch(); self thread mta_amplifier_subwoofer_watch();
self mta_amplifier_damage_watch(); self mta_amplifier_damage_watch();
} }
mta_amplifier_subwoofer_watch() mta_amplifier_subwoofer_watch()
{ {
self waittill( "damaged_by_subwoofer" ); self waittill( "damaged_by_subwoofer" );
/# /#
iprintlnbold( "Amplifier Broken" ); iprintlnbold( "Amplifier Broken" );
#/ #/
self.amplifier_state = "broken"; self.amplifier_state = "broken";
self setmodel( "p6_zm_bu_ether_amplifier_dmg" ); self setmodel( "p6_zm_bu_ether_amplifier_dmg" );
self stoploopsound( 0,1 ); self stoploopsound( 0.1 );
self playsound( "zmb_sq_amplifier_destroy" ); self playsound( "zmb_sq_amplifier_destroy" );
level notify( "mta_amp_broken" ); level notify( "mta_amp_broken", self );
mta_check_all_amplifier_states(); mta_check_all_amplifier_states();
} }
mta_amplifier_damage_watch() mta_amplifier_damage_watch()
{ {
self endon( "damaged_by_subwoofer" ); self endon( "damaged_by_subwoofer" );
n_slowgun_count = 0; n_slowgun_count = 0;
while ( 1 )
{ while ( true )
self waittill( "damage", n_damage, e_attacker, v_direction, v_point, str_type, str_tag, str_model, str_part, str_weapon ); {
if ( str_weapon == "slowgun_zm" || str_weapon == "slowgun_upgraded_zm" ) self waittill( "damage", n_damage, e_attacker, v_direction, v_point, str_type, str_tag, str_model, str_part, str_weapon );
{
n_slowgun_count++; if ( str_weapon == "slowgun_zm" || str_weapon == "slowgun_upgraded_zm" )
shader_amount = linear_map( n_slowgun_count, 0, 25, 0, 1 ); {
self setclientfield( "AmplifierShaderConstant", shader_amount ); n_slowgun_count++;
if ( n_slowgun_count >= 25 ) shader_amount = linear_map( n_slowgun_count, 0, 25, 0.0, 1.0 );
{ self setclientfield( "AmplifierShaderConstant", shader_amount );
if ( n_slowgun_count >= 25 )
{
/# /#
iprintlnbold( "Amplifier Filled" ); iprintlnbold( "Amplifier Filled" );
#/ #/
self thread mta_amplifier_filled_fx(); self thread mta_amplifier_filled_fx();
self.amplifier_state = "filled"; self.amplifier_state = "filled";
self playsound( "zmb_sq_amplifier_fill" ); self playsound( "zmb_sq_amplifier_fill" );
self playloopsound( "zmb_sq_amplifier_full_loop", 1 ); self playloopsound( "zmb_sq_amplifier_full_loop", 1 );
self notify( "amplifier_filled" ); self notify( "amplifier_filled" );
level notify( "mta_amp_amplified" ); level notify( "mta_amp_amplified" );
break; break;
} }
} }
else
{ wait_network_frame();
wait_network_frame(); }
}
} mta_check_all_amplifier_states();
mta_check_all_amplifier_states();
} }
mta_amplifier_filled_fx() mta_amplifier_filled_fx()
{ {
while ( 1 ) while ( true )
{ {
playfx( level._effect[ "sq_ether_amp_trail" ], self.origin + vectorScale( ( 0, 0, 1 ), 46 ) ); playfx( level._effect["sq_ether_amp_trail"], self.origin + vectorscale( ( 0, 0, 1 ), 46.0 ) );
wait 1; wait 1;
} }
} }
mta_check_all_amplifier_states() mta_check_all_amplifier_states()
{ {
is_all_broken = 1; is_all_broken = 1;
is_all_filled = 1; is_all_filled = 1;
a_amplifiers = getentarray( "sq_amplifier", "targetname" ); a_amplifiers = getentarray( "sq_amplifier", "targetname" );
_a226 = a_amplifiers;
_k226 = getFirstArrayKey( _a226 ); foreach ( m_amplifier in a_amplifiers )
while ( isDefined( _k226 ) ) {
{ if ( m_amplifier.amplifier_state != "filled" )
m_amplifier = _a226[ _k226 ]; is_all_filled = 0;
if ( m_amplifier.amplifier_state != "filled" )
{ if ( m_amplifier.amplifier_state != "broken" )
is_all_filled = 0; is_all_broken = 0;
} }
if ( m_amplifier.amplifier_state != "broken" )
{ if ( is_all_filled )
is_all_broken = 0; flag_set( "sq_amplifiers_on" );
} else if ( is_all_broken )
_k226 = getNextArrayKey( _a226, _k226 ); flag_set( "sq_amplifiers_broken" );
}
if ( is_all_filled )
{
flag_set( "sq_amplifiers_on" );
}
else
{
if ( is_all_broken )
{
flag_set( "sq_amplifiers_broken" );
}
}
} }

View File

@ -1,223 +1,231 @@
#include maps/mp/zm_buried_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_buried_sq;
init() init()
{ {
flag_init( "sq_ows_start" ); flag_init( "sq_ows_start" );
flag_init( "sq_ows_target_missed" ); flag_init( "sq_ows_target_missed" );
flag_init( "sq_ows_success" ); flag_init( "sq_ows_success" );
declare_sidequest_stage( "sq", "ows", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "ows", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
if ( flag( "sq_is_max_tower_built" ) ) if ( flag( "sq_is_max_tower_built" ) )
{ level thread stage_vo_max();
level thread stage_vo_max(); else
} level thread stage_vo_ric();
else
{ level._cur_stage_name = "ows";
level thread stage_vo_ric(); clientnotify( "ows" );
}
level._cur_stage_name = "ows";
clientnotify( "ows" );
} }
stage_vo_max() stage_vo_max()
{ {
m_lightboard = getent( "sq_bp_board", "targetname" ); m_lightboard = getent( "sq_bp_board", "targetname" );
maxissay( "vox_maxi_sidequest_ip_4", m_lightboard ); maxissay( "vox_maxi_sidequest_ip_4", m_lightboard );
} }
stage_vo_ric() stage_vo_ric()
{ {
richtofensay( "vox_zmba_sidequest_ip_5", 8 ); richtofensay( "vox_zmba_sidequest_ip_5", 8 );
richtofensay( "vox_zmba_sidequest_ip_6", 8 ); richtofensay( "vox_zmba_sidequest_ip_6", 8 );
richtofensay( "vox_zmba_sidequest_ip_7", 11 ); richtofensay( "vox_zmba_sidequest_ip_7", 11 );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "OWS Started" ); iprintlnbold( "OWS Started" );
#/ #/
while ( !flag( "sq_ows_success" ) ) while ( !flag( "sq_ows_success" ) )
{ {
level thread ows_fountain_wait(); level thread ows_fountain_wait();
flag_wait( "sq_ows_start" ); flag_wait( "sq_ows_start" );
ows_targets_start(); ows_targets_start();
flag_clear( "sq_ows_start" ); flag_clear( "sq_ows_start" );
} }
stage_completed( "sq", level._cur_stage_name );
stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
ows_fountain_wait() ows_fountain_wait()
{ {
level endon( "sq_ows_start" ); level endon( "sq_ows_start" );
s_fountain_spot = getstruct( "sq_ows_fountain", "targetname" ); s_fountain_spot = getstruct( "sq_ows_fountain", "targetname" );
t_fountain = spawn( "trigger_radius_use", s_fountain_spot.origin, 0, 55, 64 ); t_fountain = spawn( "trigger_radius_use", s_fountain_spot.origin, 0, 55, 64 );
t_fountain setcursorhint( "HINT_NOICON" ); t_fountain setcursorhint( "HINT_NOICON" );
t_fountain sethintstring( &"ZM_BURIED_SQ_FOUNT_U" ); t_fountain sethintstring( &"ZM_BURIED_SQ_FOUNT_U" );
t_fountain triggerignoreteam(); t_fountain triggerignoreteam();
t_fountain usetriggerrequirelookat(); t_fountain usetriggerrequirelookat();
t_fountain waittill( "trigger" );
t_fountain playsound( "zmb_sq_coin_toss" ); t_fountain waittill( "trigger" );
t_fountain delete();
flag_set( "sq_ows_start" ); t_fountain playsound( "zmb_sq_coin_toss" );
t_fountain delete();
flag_set( "sq_ows_start" );
} }
ows_targets_start() ows_targets_start()
{ {
n_cur_second = 0; n_cur_second = 0;
flag_clear( "sq_ows_target_missed" ); flag_clear( "sq_ows_target_missed" );
level thread sndsidequestowsmusic(); level thread sndsidequestowsmusic();
a_sign_spots = getstructarray( "otw_target_spot", "script_noteworthy" ); a_sign_spots = getstructarray( "otw_target_spot", "script_noteworthy" );
while ( n_cur_second < 40 )
{ while ( n_cur_second < 40 )
a_spawn_spots = ows_targets_get_cur_spots( n_cur_second ); {
if ( isDefined( a_spawn_spots ) && a_spawn_spots.size > 0 ) a_spawn_spots = ows_targets_get_cur_spots( n_cur_second );
{
ows_targets_spawn( a_spawn_spots ); if ( isdefined( a_spawn_spots ) && a_spawn_spots.size > 0 )
} ows_targets_spawn( a_spawn_spots );
wait 1;
n_cur_second++; wait 1;
} n_cur_second++;
if ( !flag( "sq_ows_target_missed" ) ) }
{
flag_set( "sq_ows_success" ); if ( !flag( "sq_ows_target_missed" ) )
playsoundatposition( "zmb_sq_target_success", ( 0, 0, 0 ) ); {
} flag_set( "sq_ows_success" );
else playsoundatposition( "zmb_sq_target_success", ( 0, 0, 0 ) );
{ }
playsoundatposition( "zmb_sq_target_fail", ( 0, 0, 0 ) ); else
} playsoundatposition( "zmb_sq_target_fail", ( 0, 0, 0 ) );
level notify( "sndEndOWSMusic" );
level notify( "sndEndOWSMusic" );
} }
ows_targets_get_cur_spots( n_time ) ows_targets_get_cur_spots( n_time )
{ {
a_target_spots = getstructarray( "otw_target_spot", "script_noteworthy" ); a_target_spots = getstructarray( "otw_target_spot", "script_noteworthy" );
a_to_spawn = []; a_to_spawn = [];
str_time = "" + n_time; str_time = "" + n_time;
_a133 = a_target_spots;
_k133 = getFirstArrayKey( _a133 ); foreach ( s_spot in a_target_spots )
while ( isDefined( _k133 ) ) {
{ if ( isdefined( s_spot.script_string ) )
s_spot = _a133[ _k133 ]; {
if ( isDefined( s_spot.script_string ) ) a_spawn_times = strtok( s_spot.script_string, " " );
{
a_spawn_times = strtok( s_spot.script_string, " " ); if ( isinarray( a_spawn_times, str_time ) )
if ( isinarray( a_spawn_times, str_time ) ) a_to_spawn[a_to_spawn.size] = s_spot;
{ }
a_to_spawn[ a_to_spawn.size ] = s_spot; }
}
} return a_to_spawn;
_k133 = getNextArrayKey( _a133, _k133 );
}
return a_to_spawn;
} }
ows_targets_spawn( a_spawn_spots ) ows_targets_spawn( a_spawn_spots )
{ {
_a151 = a_spawn_spots; foreach ( s_spot in a_spawn_spots )
_k151 = getFirstArrayKey( _a151 ); {
while ( isDefined( _k151 ) ) m_target = spawn( "script_model", s_spot.origin );
{ m_target.angles = s_spot.angles;
s_spot = _a151[ _k151 ]; m_target setmodel( "p6_zm_bu_target" );
m_target = spawn( "script_model", s_spot.origin ); m_target ghost();
m_target.angles = s_spot.angles; wait_network_frame();
m_target setmodel( "p6_zm_bu_target" ); m_target show();
m_target ghost(); playfxontag( level._effect["sq_spawn"], m_target, "tag_origin" );
wait_network_frame(); m_target playsound( "zmb_sq_target_spawn" );
m_target show();
playfxontag( level._effect[ "sq_spawn" ], m_target, "tag_origin" ); if ( isdefined( s_spot.target ) )
m_target playsound( "zmb_sq_target_spawn" ); m_target thread ows_target_move( s_spot.target );
if ( isDefined( s_spot.target ) )
{ m_target thread ows_target_think();
m_target thread ows_target_move( s_spot.target ); m_target thread sndhit();
} m_target thread sndtime();
m_target thread ows_target_think(); }
m_target thread sndhit();
m_target thread sndtime();
_k151 = getNextArrayKey( _a151, _k151 );
}
} }
ows_target_think() ows_target_think()
{ {
self setcandamage( 1 ); self setcandamage( 1 );
self thread ows_target_delete_timer(); self thread ows_target_delete_timer();
self waittill_either( "ows_target_timeout", "damage" ); self waittill_either( "ows_target_timeout", "damage" );
if ( isDefined( self.m_linker ) )
{ if ( isdefined( self.m_linker ) )
self unlink(); {
self.m_linker delete(); self unlink();
} self.m_linker delete();
self rotatepitch( -90, 0,15, 0,05, 0,05 ); }
self waittill( "rotatedone" );
self delete(); self rotatepitch( -90, 0.15, 0.05, 0.05 );
self waittill( "rotatedone" );
self delete();
} }
ows_target_move( str_target ) ows_target_move( str_target )
{ {
s_target = getstruct( str_target, "targetname" ); s_target = getstruct( str_target, "targetname" );
self.m_linker = spawn( "script_model", self.origin ); self.m_linker = spawn( "script_model", self.origin );
self.m_linker.angles = self.angles; self.m_linker.angles = self.angles;
self linkto( self.m_linker ); self linkto( self.m_linker );
self.m_linker moveto( s_target.origin, 4, 0,05, 0,05 ); self.m_linker moveto( s_target.origin, 4, 0.05, 0.05 );
} }
ows_target_delete_timer() ows_target_delete_timer()
{ {
self endon( "death" ); self endon( "death" );
wait 4; wait 4;
self notify( "ows_target_timeout" ); self notify( "ows_target_timeout" );
flag_set( "sq_ows_target_missed" ); flag_set( "sq_ows_target_missed" );
/# /#
iprintlnbold( "missed target! step failed. target @ " + self.origin ); iprintlnbold( "missed target! step failed. target @ " + self.origin );
#/ #/
} }
sndsidequestowsmusic() sndsidequestowsmusic()
{ {
while ( is_true( level.music_override ) ) while ( is_true( level.music_override ) )
{ wait 0.1;
wait 0,1;
} level.music_override = 1;
level.music_override = 1; level setclientfield( "mus_zmb_egg_snapshot_loop", 1 );
level setclientfield( "mus_zmb_egg_snapshot_loop", 1 ); ent = spawn( "script_origin", ( 0, 0, 0 ) );
ent = spawn( "script_origin", ( 0, 0, 0 ) ); ent playloopsound( "mus_sidequest_ows" );
ent playloopsound( "mus_sidequest_ows" );
level waittill( "sndEndOWSMusic" ); level waittill( "sndEndOWSMusic" );
level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
level.music_override = 0; level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
ent stoploopsound( 4 ); level.music_override = 0;
if ( !flag( "sq_ows_success" ) ) ent stoploopsound( 4 );
{
wait 0,5; if ( !flag( "sq_ows_success" ) )
ent playsound( "mus_sidequest_0" ); {
} wait 0.5;
wait 3,5; ent playsound( "mus_sidequest_0" );
ent delete(); }
wait 3.5;
ent delete();
} }
sndhit() sndhit()
{ {
self endon( "ows_target_timeout" ); self endon( "ows_target_timeout" );
self waittill( "damage" );
self playsound( "zmb_sq_target_hit" ); self waittill( "damage" );
self playsound( "zmb_sq_target_hit" );
} }
sndtime() sndtime()
{ {
self endon( "zmb_sq_target_hit" ); self endon( "zmb_sq_target_hit" );
self waittill( "ows_target_timeout" );
self playsound( "zmb_sq_target_flip" ); self waittill( "ows_target_timeout" );
self playsound( "zmb_sq_target_flip" );
} }

View File

@ -1,152 +1,151 @@
#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 common_scripts\utility;
#include common_scripts/utility; #include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
init() init()
{ {
flag_init( "sq_ts_quicktest" ); flag_init( "sq_ts_quicktest" );
declare_sidequest_stage( "sq", "ts", ::init_stage, ::stage_logic, ::exit_stage ); declare_sidequest_stage( "sq", "ts", ::init_stage, ::stage_logic, ::exit_stage );
} }
init_stage() init_stage()
{ {
a_signs = getentarray( "sq_tunnel_sign", "targetname" ); a_signs = getentarray( "sq_tunnel_sign", "targetname" );
_a18 = a_signs;
_k18 = getFirstArrayKey( _a18 ); foreach ( m_sign in a_signs )
while ( isDefined( _k18 ) ) {
{ m_sign setcandamage( 1 );
m_sign = _a18[ _k18 ]; m_sign thread ts_sign_damage_watch();
m_sign setcandamage( 1 ); }
m_sign thread ts_sign_damage_watch();
_k18 = getNextArrayKey( _a18, _k18 ); level._cur_stage_name = "ts";
} clientnotify( "ts" );
level._cur_stage_name = "ts";
clientnotify( "ts" );
} }
stage_logic() stage_logic()
{ {
/# /#
iprintlnbold( "TS Started" ); iprintlnbold( "TS Started" );
#/ #/
level waittill( "sq_sign_damaged" ); level waittill( "sq_sign_damaged" );
wait_network_frame();
stage_completed( "sq", level._cur_stage_name ); wait_network_frame();
stage_completed( "sq", level._cur_stage_name );
} }
exit_stage( success ) exit_stage( success )
{ {
} }
ts_sign_damage_watch() ts_sign_damage_watch()
{ {
level endon( "sq_sign_damaged" ); level endon( "sq_sign_damaged" );
self ts_sign_deactivate(); self ts_sign_deactivate();
while ( 1 )
{ while ( true )
self waittill( "damage", n_damage, e_attacker, v_direction, v_point, str_type, str_tag, str_model, str_part, str_weapon ); {
if ( flag( "sq_ts_quicktest" ) ) self waittill( "damage", n_damage, e_attacker, v_direction, v_point, str_type, str_tag, str_model, str_part, str_weapon );
{
level.m_sq_start_sign = self; if ( flag( "sq_ts_quicktest" ) )
level.e_sq_sign_attacker = e_attacker; {
level notify( "sq_sign_damaged" ); level.m_sq_start_sign = self;
} level.e_sq_sign_attacker = e_attacker;
if ( ts_is_bowie_knife( str_weapon ) || ts_is_galvaknuckles( str_weapon ) ) level notify( "sq_sign_damaged" );
{ }
if ( self.ts_sign_activated )
{ if ( ts_is_bowie_knife( str_weapon ) || ts_is_galvaknuckles( str_weapon ) )
self thread ts_sign_deactivate(); {
} if ( self.ts_sign_activated )
else self thread ts_sign_deactivate();
{ else
self thread ts_sign_activate(); self thread ts_sign_activate();
}
ts_sign_check_all_activated( e_attacker, self ); ts_sign_check_all_activated( e_attacker, self );
} }
} }
} }
ts_sign_activate() ts_sign_activate()
{ {
self.ts_sign_activated = 1; self.ts_sign_activated = 1;
while ( !isDefined( self.fx_ent ) )
{ if ( !isdefined( self.fx_ent ) )
v_forward = anglesToForward( self.angles ); {
v_offset = vectornormalize( v_forward ) * 2; v_forward = anglestoforward( self.angles );
self.fx_ent = spawn( "script_model", ( self.origin - vectorScale( ( 0, 0, 1 ), 20 ) ) + v_offset ); v_offset = vectornormalize( v_forward ) * 2;
self.fx_ent.angles = anglesToForward( self.angles ); self.fx_ent = spawn( "script_model", self.origin - vectorscale( ( 0, 0, 1 ), 20.0 ) + v_offset );
self.fx_ent setmodel( "tag_origin" ); self.fx_ent.angles = anglestoforward( self.angles );
self.fx_ent playsound( "zmb_sq_wisp_spawn" ); self.fx_ent setmodel( "tag_origin" );
self.fx_ent playloopsound( "zmb_sq_wisp_wall_loop" ); self.fx_ent playsound( "zmb_sq_wisp_spawn" );
while ( isDefined( self.fx_ent ) ) self.fx_ent playloopsound( "zmb_sq_wisp_wall_loop" );
{
playfxontag( level._effect[ "sq_ether_amp_trail" ], self.fx_ent, "tag_origin" ); while ( isdefined( self.fx_ent ) )
wait 0,3; {
} playfxontag( level._effect["sq_ether_amp_trail"], self.fx_ent, "tag_origin" );
} wait 0.3;
}
}
} }
ts_sign_deactivate() ts_sign_deactivate()
{ {
self.ts_sign_activated = 0; self.ts_sign_activated = 0;
if ( isDefined( self.fx_ent ) )
{ if ( isdefined( self.fx_ent ) )
self.fx_ent stoploopsound( 2 ); {
self.fx_ent delete(); self.fx_ent stoploopsound( 2 );
} self.fx_ent delete();
}
} }
ts_sign_check_all_activated( e_attacker, m_last_touched ) ts_sign_check_all_activated( e_attacker, m_last_touched )
{ {
a_signs = getentarray( "sq_tunnel_sign", "targetname" ); a_signs = getentarray( "sq_tunnel_sign", "targetname" );
a_signs_active = []; a_signs_active = [];
is_max_complete = 1; is_max_complete = 1;
is_ric_complete = 1; is_ric_complete = 1;
_a125 = a_signs;
_k125 = getFirstArrayKey( _a125 ); foreach ( m_sign in a_signs )
while ( isDefined( _k125 ) ) {
{ if ( m_sign.ts_sign_activated )
m_sign = _a125[ _k125 ]; {
if ( m_sign.ts_sign_activated ) a_signs_active[a_signs_active.size] = m_sign;
{
a_signs_active[ a_signs_active.size ] = m_sign; if ( !is_true( m_sign.is_max_sign ) )
if ( !is_true( m_sign.is_max_sign ) ) is_max_complete = 0;
{
is_max_complete = 0; if ( !is_true( m_sign.is_ric_sign ) )
} is_ric_complete = 0;
if ( !is_true( m_sign.is_ric_sign ) ) }
{ }
is_ric_complete = 0;
} if ( a_signs_active.size == 3 )
} {
_k125 = getNextArrayKey( _a125, _k125 ); if ( is_max_complete || is_ric_complete )
} {
if ( a_signs_active.size == 3 ) level.m_sq_start_sign = m_last_touched;
{ level.e_sq_sign_attacker = e_attacker;
if ( is_max_complete || is_ric_complete ) level notify( "sq_sign_damaged" );
{ }
level.m_sq_start_sign = m_last_touched; }
level.e_sq_sign_attacker = e_attacker;
level notify( "sq_sign_damaged" );
}
}
} }
ts_is_bowie_knife( str_weapon ) ts_is_bowie_knife( str_weapon )
{ {
if ( str_weapon != "knife_ballistic_bowie_zm" || str_weapon == "knife_ballistic_bowie_upgraded_zm" && str_weapon == "bowie_knife_zm" ) if ( str_weapon == "knife_ballistic_bowie_zm" || str_weapon == "knife_ballistic_bowie_upgraded_zm" || str_weapon == "bowie_knife_zm" )
{ return true;
return 1;
} return false;
return 0;
} }
ts_is_galvaknuckles( str_weapon ) ts_is_galvaknuckles( str_weapon )
{ {
if ( str_weapon == "tazer_knuckles_zm" ) if ( str_weapon == "tazer_knuckles_zm" )
{ return true;
return 1;
} return false;
return 0;
} }

View File

@ -1,26 +1,29 @@
#include maps/mp/zombies/_zm_magicbox; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_game_module; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/gametypes_zm/_zm_gametype; #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\gametypes_zm\_zm_gametype;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\zombies\_zm_magicbox;
precache() precache()
{ {
} }
main() main()
{ {
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "processing" ); maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "processing" );
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" );
zm_treasure_chest_init(); zm_treasure_chest_init();
} }
zm_treasure_chest_init() 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,66 +1,70 @@
//checked includes changed to match cerberus output // T6 GSC SOURCE
#include maps/mp/gametypes_zm/zcleansed; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/gametypes_zm/_zm_gametype; #include maps\mp\_utility;
#include maps/mp/_visionset_mgr; #include common_scripts\utility;
#include character/c_zom_zombie_buried_saloongirl_mp; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zm_buried_gamemodes; #include maps\mp\zm_buried_gamemodes;
#include maps/mp/zombies/_zm_utility; #include character\c_zom_zombie_buried_saloongirl_mp;
#include common_scripts/utility; #include maps\mp\_visionset_mgr;
#include maps/mp/_utility; #include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\gametypes_zm\zcleansed;
precache() //checked matches cerberus output precache()
{ {
precachemodel( "zm_collision_buried_street_turned" ); precachemodel( "zm_collision_buried_street_turned" );
precachemodel( "p6_zm_bu_buildable_bench_tarp" ); precachemodel( "p6_zm_bu_buildable_bench_tarp" );
character/c_zom_zombie_buried_saloongirl_mp::precache(); character\c_zom_zombie_buried_saloongirl_mp::precache();
precachemodel( "c_zom_buried_zombie_sgirl_viewhands" ); precachemodel( "c_zom_buried_zombie_sgirl_viewhands" );
maps/mp/_visionset_mgr::vsmgr_register_info( "overlay", "zm_transit_burn", 1, 21, 15, 1, maps/mp/_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 ); maps\mp\_visionset_mgr::vsmgr_register_info( "overlay", "zm_transit_burn", 1, 21, 15, 1, maps\mp\_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 );
} }
main() //checked matches cerberus output main()
{ {
flag_init( "sloth_blocker_towneast" ); flag_init( "sloth_blocker_towneast" );
level.custom_zombie_player_loadout = ::custom_zombie_player_loadout; level.custom_zombie_player_loadout = ::custom_zombie_player_loadout;
getspawnpoints(); getspawnpoints();
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "street" ); maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "street" );
generatebuildabletarps(); generatebuildabletarps();
deletechalktriggers(); deletechalktriggers();
deleteslothbarricade( "candystore_alley" ); deleteslothbarricade( "candystore_alley" );
deleteslothbarricades( 1 ); deleteslothbarricades( 1 );
deletebuyabledebris( 1 ); deletebuyabledebris( 1 );
powerswitchstate( 1 ); powerswitchstate( 1 );
level.cleansed_loadout = getgametypesetting( "cleansedLoadout" ); level.cleansed_loadout = getgametypesetting( "cleansedLoadout" );
if ( level.cleansed_loadout )
{ if ( level.cleansed_loadout )
level.humanify_custom_loadout = maps/mp/gametypes_zm/zcleansed::gunprogressionthink; {
level.cleansed_zombie_round = 5; level.humanify_custom_loadout = maps\mp\gametypes_zm\zcleansed::gunprogressionthink;
} level.cleansed_zombie_round = 5;
else }
{ else
level.humanify_custom_loadout = maps/mp/gametypes_zm/zcleansed::shotgunloadout; {
level.cleansed_zombie_round = 2; level.humanify_custom_loadout = maps\mp\gametypes_zm\zcleansed::shotgunloadout;
} level.cleansed_zombie_round = 2;
spawnmapcollision( "zm_collision_buried_street_turned" ); }
flag_wait( "initial_blackscreen_passed" );
flag_wait( "start_zombie_round_logic" ); spawnmapcollision( "zm_collision_buried_street_turned" );
flag_set( "power_on" ); flag_wait( "initial_blackscreen_passed" );
clientnotify( "pwr" ); flag_wait( "start_zombie_round_logic" );
flag_set( "power_on" );
clientnotify( "pwr" );
} }
custom_zombie_player_loadout() //checked matches cerberus output custom_zombie_player_loadout()
{ {
self character/c_zom_zombie_buried_saloongirl_mp::main(); self character\c_zom_zombie_buried_saloongirl_mp::main();
self setviewmodel( "c_zom_buried_zombie_sgirl_viewhands" ); self setviewmodel( "c_zom_buried_zombie_sgirl_viewhands" );
} }
getspawnpoints() //checked matches cerberus output getspawnpoints()
{ {
level._turned_zombie_spawners = getentarray( "game_mode_spawners", "targetname" ); level._turned_zombie_spawners = getentarray( "game_mode_spawners", "targetname" );
level._turned_zombie_spawnpoints = getstructarray( "street_turned_zombie_spawn", "targetname" ); level._turned_zombie_spawnpoints = getstructarray( "street_turned_zombie_spawn", "targetname" );
level._turned_zombie_respawnpoints = getstructarray( "street_turned_player_respawns", "targetname" ); level._turned_zombie_respawnpoints = getstructarray( "street_turned_player_respawns", "targetname" );
level._turned_powerup_spawnpoints = getstructarray( "street_turned_powerups", "targetname" ); level._turned_powerup_spawnpoints = getstructarray( "street_turned_powerups", "targetname" );
} }
onendgame() //checked matches cerberus output onendgame()
{ {
} }

View File

@ -1,333 +1,302 @@
#include maps/mp/zombies/_zm_ai_ghost; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_zonemgr; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zm_buried; #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\zm_buried;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_ai_ghost;
ghost_init_start() ghost_init_start()
{ {
level ghost_bad_path_init(); level ghost_bad_path_init();
level.is_player_in_ghost_zone = ::is_player_in_ghost_zone; level.is_player_in_ghost_zone = ::is_player_in_ghost_zone;
level ghost_bad_spawn_zone_init(); level ghost_bad_spawn_zone_init();
level.ghost_round_start_monitor_time = 10; level.ghost_round_start_monitor_time = 10;
} }
ghost_init_end() ghost_init_end()
{ {
disable_traversal_clip_around_mansion(); disable_traversal_clip_around_mansion();
} }
prespawn_start() prespawn_start()
{ {
} }
prespawn_end() prespawn_end()
{ {
} }
ghost_round_start() ghost_round_start()
{ {
level thread ghost_teleport_to_playable_area(); level thread ghost_teleport_to_playable_area();
} }
ghost_round_end() ghost_round_end()
{ {
disable_traversal_clip_around_mansion(); disable_traversal_clip_around_mansion();
} }
is_player_in_ghost_zone( player ) is_player_in_ghost_zone( player )
{ {
result = 0; result = 0;
if ( !isDefined( level.ghost_zone_overrides ) )
{ if ( !isdefined( level.ghost_zone_overrides ) )
level.ghost_zone_overrides = getentarray( "ghost_round_override", "script_noteworthy" ); level.ghost_zone_overrides = getentarray( "ghost_round_override", "script_noteworthy" );
}
is_player_in_override_trigger = 0; is_player_in_override_trigger = 0;
while ( isDefined( level.zombie_ghost_round_states ) && !is_true( level.zombie_ghost_round_states.is_started ) )
{ if ( isdefined( level.zombie_ghost_round_states ) && !is_true( level.zombie_ghost_round_states.is_started ) )
_a86 = level.ghost_zone_overrides; {
_k86 = getFirstArrayKey( _a86 ); foreach ( trigger in level.ghost_zone_overrides )
while ( isDefined( _k86 ) ) {
{ if ( player istouching( trigger ) )
trigger = _a86[ _k86 ]; {
if ( player istouching( trigger ) ) is_player_in_override_trigger = 1;
{ break;
is_player_in_override_trigger = 1; }
break; }
} }
else
{ curr_zone = player get_current_zone();
_k86 = getNextArrayKey( _a86, _k86 );
} if ( !is_player_in_override_trigger && isdefined( curr_zone ) && curr_zone == "zone_mansion" )
} result = 1;
}
curr_zone = player get_current_zone(); return result;
if ( !is_player_in_override_trigger && isDefined( curr_zone ) && curr_zone == "zone_mansion" )
{
result = 1;
}
return result;
} }
ghost_bad_path_init() ghost_bad_path_init()
{ {
level.bad_zones = []; level.bad_zones = [];
level.bad_zones[ 0 ] = spawnstruct(); level.bad_zones[0] = spawnstruct();
level.bad_zones[ 0 ].name = "zone_underground_courthouse"; level.bad_zones[0].name = "zone_underground_courthouse";
level.bad_zones[ 0 ].adjacent = []; level.bad_zones[0].adjacent = [];
level.bad_zones[ 0 ].adjacent[ 0 ] = "zone_underground_courthouse2"; level.bad_zones[0].adjacent[0] = "zone_underground_courthouse2";
level.bad_zones[ 0 ].adjacent[ 1 ] = "zone_tunnels_north2"; level.bad_zones[0].adjacent[1] = "zone_tunnels_north2";
level.bad_zones[ 0 ].ignore_func = ::maps/mp/zm_buried::is_courthouse_open; level.bad_zones[0].ignore_func = maps\mp\zm_buried::is_courthouse_open;
level.bad_zones[ 1 ] = spawnstruct(); level.bad_zones[1] = spawnstruct();
level.bad_zones[ 1 ].name = "zone_underground_courthouse2"; level.bad_zones[1].name = "zone_underground_courthouse2";
level.bad_zones[ 1 ].adjacent = []; level.bad_zones[1].adjacent = [];
level.bad_zones[ 1 ].adjacent[ 0 ] = "zone_underground_courthouse"; level.bad_zones[1].adjacent[0] = "zone_underground_courthouse";
level.bad_zones[ 1 ].adjacent[ 1 ] = "zone_tunnels_north2"; level.bad_zones[1].adjacent[1] = "zone_tunnels_north2";
level.bad_zones[ 1 ].ignore_func = ::maps/mp/zm_buried::is_courthouse_open; level.bad_zones[1].ignore_func = maps\mp\zm_buried::is_courthouse_open;
level.bad_zones[ 2 ] = spawnstruct(); level.bad_zones[2] = spawnstruct();
level.bad_zones[ 2 ].name = "zone_tunnels_north2"; level.bad_zones[2].name = "zone_tunnels_north2";
level.bad_zones[ 2 ].adjacent = []; level.bad_zones[2].adjacent = [];
level.bad_zones[ 2 ].adjacent[ 0 ] = "zone_underground_courthouse2"; level.bad_zones[2].adjacent[0] = "zone_underground_courthouse2";
level.bad_zones[ 2 ].adjacent[ 1 ] = "zone_underground_courthouse"; level.bad_zones[2].adjacent[1] = "zone_underground_courthouse";
level.bad_zones[ 2 ].flag = "tunnels2courthouse"; level.bad_zones[2].flag = "tunnels2courthouse";
level.bad_zones[ 2 ].flag_adjacent = "zone_tunnels_north"; level.bad_zones[2].flag_adjacent = "zone_tunnels_north";
level.bad_zones[ 2 ].ignore_func = ::maps/mp/zm_buried::is_courthouse_open; level.bad_zones[2].ignore_func = maps\mp\zm_buried::is_courthouse_open;
level.bad_zones[ 3 ] = spawnstruct(); level.bad_zones[3] = spawnstruct();
level.bad_zones[ 3 ].name = "zone_tunnels_north"; level.bad_zones[3].name = "zone_tunnels_north";
level.bad_zones[ 3 ].adjacent = []; level.bad_zones[3].adjacent = [];
level.bad_zones[ 3 ].adjacent[ 0 ] = "zone_tunnels_center"; level.bad_zones[3].adjacent[0] = "zone_tunnels_center";
level.bad_zones[ 3 ].flag = "tunnels2courthouse"; level.bad_zones[3].flag = "tunnels2courthouse";
level.bad_zones[ 3 ].flag_adjacent = "zone_tunnels_north2"; level.bad_zones[3].flag_adjacent = "zone_tunnels_north2";
level.bad_zones[ 3 ].ignore_func = ::maps/mp/zm_buried::is_tunnel_open; level.bad_zones[3].ignore_func = maps\mp\zm_buried::is_tunnel_open;
level.bad_zones[ 4 ] = spawnstruct(); level.bad_zones[4] = spawnstruct();
level.bad_zones[ 4 ].name = "zone_tunnels_center"; level.bad_zones[4].name = "zone_tunnels_center";
level.bad_zones[ 4 ].adjacent = []; level.bad_zones[4].adjacent = [];
level.bad_zones[ 4 ].adjacent[ 0 ] = "zone_tunnels_north"; level.bad_zones[4].adjacent[0] = "zone_tunnels_north";
level.bad_zones[ 4 ].adjacent[ 1 ] = "zone_tunnels_south"; level.bad_zones[4].adjacent[1] = "zone_tunnels_south";
level.bad_zones[ 4 ].ignore_func = ::maps/mp/zm_buried::is_tunnel_open; level.bad_zones[4].ignore_func = maps\mp\zm_buried::is_tunnel_open;
level.bad_zones[ 5 ] = spawnstruct(); level.bad_zones[5] = spawnstruct();
level.bad_zones[ 5 ].name = "zone_tunnels_south"; level.bad_zones[5].name = "zone_tunnels_south";
level.bad_zones[ 5 ].adjacent = []; level.bad_zones[5].adjacent = [];
level.bad_zones[ 5 ].adjacent[ 0 ] = "zone_tunnels_center"; level.bad_zones[5].adjacent[0] = "zone_tunnels_center";
level.bad_zones[ 5 ].ignore_func = ::maps/mp/zm_buried::is_tunnel_open; level.bad_zones[5].ignore_func = maps\mp\zm_buried::is_tunnel_open;
} }
ghost_bad_path_failsafe() ghost_bad_path_failsafe()
{ {
self endon( "death" ); self endon( "death" );
self notify( "stop_bad_path_failsafe" ); self notify( "stop_bad_path_failsafe" );
self endon( "stop_bad_path_failsafe" ); self endon( "stop_bad_path_failsafe" );
self thread non_ghost_round_failsafe(); self thread non_ghost_round_failsafe();
while ( 1 )
{ while ( true )
player = self.favoriteenemy; {
if ( isDefined( player ) ) player = self.favoriteenemy;
{
in_bad_zone = 0; if ( isdefined( player ) )
_a174 = level.bad_zones; {
_k174 = getFirstArrayKey( _a174 ); in_bad_zone = 0;
while ( isDefined( _k174 ) )
{ foreach ( zone in level.bad_zones )
zone = _a174[ _k174 ]; {
if ( isDefined( zone.ignore_func ) ) if ( isdefined( zone.ignore_func ) )
{ {
if ( level [[ zone.ignore_func ]]() ) if ( level [[ zone.ignore_func ]]() )
{ break;
break; }
}
} if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone.name ) )
else if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( zone.name ) ) {
{ if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone.name ) )
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( zone.name ) ) break;
{
break; ghost_is_adjacent = 0;
}
else ghost_is_adjacent = 0; foreach ( adjacent in zone.adjacent )
_a192 = zone.adjacent; {
_k192 = getFirstArrayKey( _a192 ); if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( adjacent ) )
while ( isDefined( _k192 ) ) {
{ ghost_is_adjacent = 1;
adjacent = _a192[ _k192 ]; break;
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( adjacent ) ) }
{ }
ghost_is_adjacent = 1;
break; if ( isdefined( zone.flag ) && flag( zone.flag ) )
} {
else if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone.flag_adjacent ) )
{ ghost_is_adjacent = 1;
_k192 = getNextArrayKey( _a192, _k192 ); }
}
} if ( !ghost_is_adjacent )
if ( isDefined( zone.flag ) && flag( zone.flag ) ) {
{ in_bad_zone = 1;
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( zone.flag_adjacent ) ) break;
{ }
ghost_is_adjacent = 1; }
} }
}
if ( !ghost_is_adjacent ) if ( in_bad_zone )
{ {
in_bad_zone = 1; nodes = getnodesinradiussorted( player.origin, 540, 180, 60, "Path" );
break;
} if ( nodes.size > 0 )
} node = nodes[randomint( nodes.size )];
else else
{ node = getnearestnode( player.origin );
_k174 = getNextArrayKey( _a174, _k174 );
} if ( isdefined( node ) )
} {
if ( in_bad_zone ) while ( true )
{ {
nodes = getnodesinradiussorted( player.origin, 540, 180, 60, "Path" ); if ( !is_true( self.is_traversing ) )
if ( nodes.size > 0 ) break;
{
node = nodes[ randomint( nodes.size ) ]; wait 0.1;
} }
else
{ self forceteleport( node.origin, ( 0, 0, 0 ) );
node = getnearestnode( player.origin ); }
} }
if ( isDefined( node ) ) }
{
while ( 1 ) wait 0.25;
{ }
if ( !is_true( self.is_traversing ) )
{
break;
}
else
{
wait 0,1;
}
}
self forceteleport( node.origin, ( 0, 0, 0 ) );
}
}
}
wait 0,25;
}
} }
non_ghost_round_failsafe() non_ghost_round_failsafe()
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
self waittill( "bad_path" ); {
if ( self.state == "runaway_update" ) self waittill( "bad_path" );
{
if ( !maps/mp/zombies/_zm_ai_ghost::is_ghost_round_started() && is_true( self.is_spawned_in_ghost_zone ) ) if ( self.state == "runaway_update" )
{ {
self maps/mp/zombies/_zm_ai_ghost::start_evaporate( 1 ); if ( !maps\mp\zombies\_zm_ai_ghost::is_ghost_round_started() && is_true( self.is_spawned_in_ghost_zone ) )
return; {
} self maps\mp\zombies\_zm_ai_ghost::start_evaporate( 1 );
} return;
wait 0,25; }
} }
wait 0.25;
}
} }
disable_traversal_clip_around_mansion() disable_traversal_clip_around_mansion()
{ {
while ( isDefined( level.ghost_zone_door_clips ) && level.ghost_zone_door_clips.size > 0 ) if ( isdefined( level.ghost_zone_door_clips ) && level.ghost_zone_door_clips.size > 0 )
{ {
_a276 = level.ghost_zone_door_clips; foreach ( door_clip in level.ghost_zone_door_clips )
_k276 = getFirstArrayKey( _a276 ); door_clip notsolid();
while ( isDefined( _k276 ) ) }
{
door_clip = _a276[ _k276 ];
door_clip notsolid();
_k276 = getNextArrayKey( _a276, _k276 );
}
}
} }
ghost_bad_spawn_zone_init() ghost_bad_spawn_zone_init()
{ {
level.ghost_bad_spawn_zones = []; level.ghost_bad_spawn_zones = [];
level.ghost_bad_spawn_zones[ 0 ] = "zone_mansion_backyard"; level.ghost_bad_spawn_zones[0] = "zone_mansion_backyard";
level.ghost_bad_spawn_zones[ 1 ] = "zone_maze"; level.ghost_bad_spawn_zones[1] = "zone_maze";
level.ghost_bad_spawn_zones[ 2 ] = "zone_maze_staircase"; level.ghost_bad_spawn_zones[2] = "zone_maze_staircase";
} }
can_use_mansion_back_flying_out_node( zone_name ) can_use_mansion_back_flying_out_node( zone_name )
{ {
if ( zone_name == "zone_mansion_backyard" ) if ( zone_name == "zone_mansion_backyard" )
{ return true;
return 1;
} if ( zone_name == "zone_maze" )
if ( zone_name == "zone_maze" ) return true;
{
return 1; if ( zone_name == "zone_maze_staircase" )
} return true;
if ( zone_name == "zone_maze_staircase" )
{ return false;
return 1;
}
return 0;
} }
ghost_teleport_to_playable_area() ghost_teleport_to_playable_area()
{ {
level endon( "intermission" ); level endon( "intermission" );
if ( level.intermission )
{ if ( level.intermission )
return; return;
}
level endon( "ghost_round_end" ); level endon( "ghost_round_end" );
monitor_time = 0; monitor_time = 0;
while ( 1 )
{ while ( true )
ghosts = get_current_ghosts(); {
_a332 = ghosts; ghosts = get_current_ghosts();
_k332 = getFirstArrayKey( _a332 );
while ( isDefined( _k332 ) ) foreach ( ghost in ghosts )
{ {
ghost = _a332[ _k332 ]; if ( !is_true( self.is_spawned_in_ghost_zone ) && !is_true( self.is_teleported_in_bad_zone ) )
while ( !is_true( self.is_spawned_in_ghost_zone ) && !is_true( self.is_teleported_in_bad_zone ) ) {
{ foreach ( bad_spawn_zone_name in level.ghost_bad_spawn_zones )
_a336 = level.ghost_bad_spawn_zones; {
_k336 = getFirstArrayKey( _a336 ); if ( ghost maps\mp\zombies\_zm_zonemgr::entity_in_zone( bad_spawn_zone_name ) )
while ( isDefined( _k336 ) ) {
{ if ( is_player_valid( ghost.favoriteenemy ) )
bad_spawn_zone_name = _a336[ _k336 ]; {
if ( ghost maps/mp/zombies/_zm_zonemgr::entity_in_zone( bad_spawn_zone_name ) ) destination_node = ghost maps\mp\zombies\_zm_ai_ghost::get_best_flying_target_node( ghost.favoriteenemy );
{
if ( is_player_valid( ghost.favoriteenemy ) ) if ( isdefined( destination_node ) )
{ {
destination_node = ghost maps/mp/zombies/_zm_ai_ghost::get_best_flying_target_node( ghost.favoriteenemy ); ghost forceteleport( destination_node.origin, ( 0, 0, 0 ) );
if ( isDefined( destination_node ) ) self.is_teleported_in_bad_zone = 1;
{ }
ghost forceteleport( destination_node.origin, ( 0, 0, 0 ) ); }
self.is_teleported_in_bad_zone = 1;
} if ( !is_true( self.is_teleported_in_bad_zone ) )
} {
if ( !is_true( self.is_teleported_in_bad_zone ) ) if ( can_use_mansion_back_flying_out_node( bad_spawn_zone_name ) )
{ ghost forceteleport( level.ghost_back_flying_out_path_starts[0].origin, ( 0, 0, 0 ) );
if ( can_use_mansion_back_flying_out_node( bad_spawn_zone_name ) ) else
{ ghost forceteleport( level.ghost_front_flying_out_path_starts[0].origin, ( 0, 0, 0 ) );
ghost forceteleport( level.ghost_back_flying_out_path_starts[ 0 ].origin, ( 0, 0, 0 ) );
} self.is_teleported_in_bad_zone = 1;
else }
{ }
ghost forceteleport( level.ghost_front_flying_out_path_starts[ 0 ].origin, ( 0, 0, 0 ) ); }
} }
self.is_teleported_in_bad_zone = 1; }
}
} monitor_time += 0.1;
_k336 = getNextArrayKey( _a336, _k336 );
} if ( monitor_time > level.ghost_round_start_monitor_time )
} break;
_k332 = getNextArrayKey( _a332, _k332 );
} wait 0.1;
monitor_time += 0,1; }
if ( monitor_time > level.ghost_round_start_monitor_time )
{
return;
}
else
{
wait 0,1;
}
}
} }

View File

@ -1,434 +1,422 @@
#include maps/mp/animscripts/zm_shared; // T6 GSC SOURCE
#include maps/mp/animscripts/zm_run; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_ai_sloth; #include common_scripts\utility;
#include maps/mp/zombies/_zm_ai_sloth_utility; #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_ai_sloth_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_ai_sloth;
#include maps\mp\animscripts\zm_run;
#include maps\mp\animscripts\zm_shared;
crawler_condition() crawler_condition()
{ {
zombies = get_round_enemy_array(); zombies = get_round_enemy_array();
i = 0;
while ( i < zombies.size ) for ( i = 0; i < zombies.size; i++ )
{ {
zombie = zombies[ i ]; zombie = zombies[i];
if ( !is_true( zombie.has_legs ) )
{ if ( !is_true( zombie.has_legs ) )
dist = distancesquared( self.origin, zombie.origin ); {
if ( dist < 32400 ) dist = distancesquared( self.origin, zombie.origin );
{
self.crawler = zombie; if ( dist < 32400 )
if ( isDefined( level.sloth.custom_crawler_pickup_func ) ) {
{ self.crawler = zombie;
self.crawler thread [[ level.sloth.custom_crawler_pickup_func ]]();
} if ( isdefined( level.sloth.custom_crawler_pickup_func ) )
return 1; self.crawler thread [[ level.sloth.custom_crawler_pickup_func ]]();
}
} return true;
i++; }
} }
return 0; }
return false;
} }
crawler_action() crawler_action()
{ {
self endon( "death" ); self endon( "death" );
self endon( "stop_action" ); self endon( "stop_action" );
self maps/mp/zombies/_zm_ai_sloth::common_context_action(); self maps\mp\zombies\_zm_ai_sloth::common_context_action();
self thread watch_sloth_on_exit_side(); self thread watch_sloth_on_exit_side();
self thread watch_sloth_on_same_side(); self thread watch_sloth_on_same_side();
self thread crawler_watch_death(); self thread crawler_watch_death();
self.release_crawler = 0; self.release_crawler = 0;
anim_id = self getanimfromasd( "zm_sloth_pickup_crawler", 0 ); anim_id = self getanimfromasd( "zm_sloth_pickup_crawler", 0 );
sloth_goal = getstartorigin( self.crawler.origin, self.crawler.angles, anim_id ); sloth_goal = getstartorigin( self.crawler.origin, self.crawler.angles, anim_id );
sloth_offset = distance( sloth_goal, self.crawler.origin ); sloth_offset = distance( sloth_goal, self.crawler.origin );
while ( 1 )
{ while ( true )
while ( self sloth_is_traversing() ) {
{ if ( self sloth_is_traversing() )
wait 0,1; {
} wait 0.1;
vec_forward = vectornormalize( anglesToForward( self.crawler.angles ) ); continue;
start_pos = self.crawler.origin - ( vec_forward * sloth_offset ); }
raised_start_pos = ( start_pos[ 0 ], start_pos[ 1 ], start_pos[ 2 ] + sloth_offset );
ground_pos = groundpos( raised_start_pos ); vec_forward = vectornormalize( anglestoforward( self.crawler.angles ) );
height_check = abs( self.crawler.origin[ 2 ] - ground_pos[ 2 ] ); start_pos = self.crawler.origin - vec_forward * sloth_offset;
if ( height_check > 8 ) raised_start_pos = ( start_pos[0], start_pos[1], start_pos[2] + sloth_offset );
{ ground_pos = groundpos( raised_start_pos );
self setanimstatefromasd( "zm_player_idle" ); height_check = abs( self.crawler.origin[2] - ground_pos[2] );
}
else if ( height_check > 8 )
{ self setanimstatefromasd( "zm_player_idle" );
self maps/mp/animscripts/zm_run::needsupdate(); else
self setgoalpos( start_pos ); {
} self maps\mp\animscripts\zm_run::needsupdate();
if ( !isDefined( self.crawler ) || self.crawler.health <= 0 ) self setgoalpos( start_pos );
{ }
self.context_done = 1;
return; if ( !isdefined( self.crawler ) || self.crawler.health <= 0 )
} {
dist = distancesquared( self.origin, start_pos ); self.context_done = 1;
z_dist = abs( self.origin[ 2 ] - start_pos[ 2 ] ); return;
if ( dist < 1024 && z_dist < 12 ) }
{
break; dist = distancesquared( self.origin, start_pos );
} z_dist = abs( self.origin[2] - start_pos[2] );
else
{ if ( dist < 1024 && z_dist < 12 )
wait 0,1; break;
}
} wait 0.1;
self orientmode( "face angle", self.crawler.angles[ 1 ] ); }
wait 0,25;
self.crawler.is_inert = 1; self orientmode( "face angle", self.crawler.angles[1] );
self.crawler.ignoreall = 1; wait 0.25;
self.crawler notify( "stop_find_flesh" ); self.crawler.is_inert = 1;
self.crawler notify( "zombie_acquire_enemy" ); self.crawler.ignoreall = 1;
self.anchor.origin = self.crawler.origin; self.crawler notify( "stop_find_flesh" );
self.anchor.angles = self.crawler.angles; self.crawler notify( "zombie_acquire_enemy" );
sloth_pickup = self append_hunched( "zm_sloth_pickup_crawler" ); self.anchor.origin = self.crawler.origin;
crawler_pickup = self append_hunched( "zm_crawler_pickup_by_sloth" ); self.anchor.angles = self.crawler.angles;
self animscripted( self.anchor.origin, self.anchor.angles, sloth_pickup ); sloth_pickup = self append_hunched( "zm_sloth_pickup_crawler" );
self.crawler animscripted( self.anchor.origin, self.anchor.angles, crawler_pickup ); crawler_pickup = self append_hunched( "zm_crawler_pickup_by_sloth" );
maps/mp/animscripts/zm_shared::donotetracks( "sloth_pickup_crawler_anim" ); self animscripted( self.anchor.origin, self.anchor.angles, sloth_pickup );
self.carrying_crawler = 1; self.crawler animscripted( self.anchor.origin, self.anchor.angles, crawler_pickup );
self.crawler.guts_explosion = 1; maps\mp\animscripts\zm_shared::donotetracks( "sloth_pickup_crawler_anim" );
self.pre_traverse = ::crawler_pre_traverse; self.carrying_crawler = 1;
self.post_traverse = ::crawler_post_traverse; self.crawler.guts_explosion = 1;
self.crawler notsolid(); self.pre_traverse = ::crawler_pre_traverse;
self.crawler linkto( self, "tag_weapon_right" ); self.post_traverse = ::crawler_post_traverse;
self.ignore_common_run = 1; self.crawler notsolid();
self set_zombie_run_cycle( "walk_crawlerhold" ); self.crawler linkto( self, "tag_weapon_right" );
self.locomotion = "walk_crawlerhold"; self.ignore_common_run = 1;
self.setanimstatefromspeed = ::slothanimstatefromspeed; self set_zombie_run_cycle( "walk_crawlerhold" );
self.crawler_end = getTime() + 5000; self.locomotion = "walk_crawlerhold";
self.crawler.actor_damage_func = ::crawler_damage_func; self.setanimstatefromspeed = ::slothanimstatefromspeed;
self.sloth_damage_func = ::crawler_damage_func; self.crawler_end = gettime() + 5000;
roam = array_randomize( level.roam_points ); self.crawler.actor_damage_func = ::crawler_damage_func;
roam_index = 0; self.sloth_damage_func = ::crawler_damage_func;
while ( 1 ) roam = array_randomize( level.roam_points );
{ roam_index = 0;
if ( is_true( self.release_crawler ) )
{ while ( true )
break; {
} if ( is_true( self.release_crawler ) )
else break;
{
while ( self sloth_is_traversing() ) if ( self sloth_is_traversing() )
{ {
wait 0,1; wait 0.1;
} continue;
dist = distancesquared( self.origin, self.candy_player.origin ); }
if ( dist < 25600 || is_true( self.candy_player.is_in_ghost_zone ) && is_true( self.on_exit_side ) )
{ dist = distancesquared( self.origin, self.candy_player.origin );
self.check_turn = 1;
self setgoalpos( self.origin ); if ( dist < 25600 || is_true( self.candy_player.is_in_ghost_zone ) && is_true( self.on_exit_side ) )
sloth_idle = self append_hunched( "zm_sloth_crawlerhold_idle" ); {
crawler_idle = self append_hunched( "zm_crawler_crawlerhold_idle" ); self.check_turn = 1;
self animscripted( self.origin, self.angles, sloth_idle ); self setgoalpos( self.origin );
self.crawler animscripted( self.origin, self.angles, crawler_idle ); sloth_idle = self append_hunched( "zm_sloth_crawlerhold_idle" );
} crawler_idle = self append_hunched( "zm_crawler_crawlerhold_idle" );
else self animscripted( self.origin, self.angles, sloth_idle );
{ self.crawler animscripted( self.origin, self.angles, crawler_idle );
self stopanimscripted(); }
self.crawler stopanimscripted(); else
if ( should_ignore_candybooze( self.candy_player ) ) {
{ self stopanimscripted();
dist = distancesquared( self.origin, roam[ roam_index ].origin ); self.crawler stopanimscripted();
if ( dist < 1024 )
{ if ( should_ignore_candybooze( self.candy_player ) )
roam_index++; {
if ( roam_index >= roam.size ) dist = distancesquared( self.origin, roam[roam_index].origin );
{
roam_index = 0; if ( dist < 1024 )
} {
} roam_index++;
self maps/mp/zombies/_zm_ai_sloth::sloth_check_turn( roam[ roam_index ].origin );
self setgoalpos( roam[ roam_index ].origin ); if ( roam_index >= roam.size )
} roam_index = 0;
else }
{
if ( !self sloth_move_to_same_side() ) self maps\mp\zombies\_zm_ai_sloth::sloth_check_turn( roam[roam_index].origin );
{ self setgoalpos( roam[roam_index].origin );
if ( is_true( self.check_turn ) ) }
{ else if ( !self sloth_move_to_same_side() )
self.check_turn = 0; {
if ( self sloth_is_same_zone( self.candy_player ) ) if ( is_true( self.check_turn ) )
{ {
self maps/mp/zombies/_zm_ai_sloth::sloth_check_turn( self.candy_player.origin, -0,965 ); self.check_turn = 0;
}
} if ( self sloth_is_same_zone( self.candy_player ) )
self setgoalpos( self.candy_player.origin ); self maps\mp\zombies\_zm_ai_sloth::sloth_check_turn( self.candy_player.origin, -0.965 );
} }
}
self crawler_update_locomotion(); self setgoalpos( self.candy_player.origin );
} }
wait 0,1;
} self crawler_update_locomotion();
} }
self.setanimstatefromspeed = undefined;
self.crawler unlink(); wait 0.1;
sloth_putdown = self append_hunched( "zm_sloth_putdown_crawler" ); }
crawler_putdown = self append_hunched( "zm_crawler_putdown_by_sloth" );
self animscripted( self.origin, self.angles, sloth_putdown ); self.setanimstatefromspeed = undefined;
self.crawler animscripted( self.origin, self.angles, crawler_putdown ); self.crawler unlink();
maps/mp/animscripts/zm_shared::donotetracks( "sloth_putdown_crawler_anim" ); sloth_putdown = self append_hunched( "zm_sloth_putdown_crawler" );
self.carrying_crawler = 0; crawler_putdown = self append_hunched( "zm_crawler_putdown_by_sloth" );
self.crawler.deathfunction = ::crawler_death; self animscripted( self.origin, self.angles, sloth_putdown );
sloth_kill = self append_hunched( "zm_sloth_kill_crawler_stomp" ); self.crawler animscripted( self.origin, self.angles, crawler_putdown );
crawler_kill = self append_hunched( "zm_crawler_slothkill_stomp" ); maps\mp\animscripts\zm_shared::donotetracks( "sloth_putdown_crawler_anim" );
self notify( "stop_crawler_watch" ); self.carrying_crawler = 0;
self animscripted( self.origin, self.angles, sloth_kill ); self.crawler.deathfunction = ::crawler_death;
self.crawler animscripted( self.origin, self.angles, crawler_kill ); sloth_kill = self append_hunched( "zm_sloth_kill_crawler_stomp" );
maps/mp/animscripts/zm_shared::donotetracks( "sloth_kill_crawler_anim" ); crawler_kill = self append_hunched( "zm_crawler_slothkill_stomp" );
if ( isDefined( self.crawler ) ) self notify( "stop_crawler_watch" );
{ self animscripted( self.origin, self.angles, sloth_kill );
self.crawler dodamage( self.crawler.health * 10, self.crawler.origin ); self.crawler animscripted( self.origin, self.angles, crawler_kill );
self.crawler playsound( "zmb_ai_sloth_attack_impact" ); maps\mp\animscripts\zm_shared::donotetracks( "sloth_kill_crawler_anim" );
}
self.sloth_damage_func = undefined; if ( isdefined( self.crawler ) )
self maps/mp/zombies/_zm_ai_sloth::sloth_set_traverse_funcs(); {
self.crawler = undefined; self.crawler dodamage( self.crawler.health * 10, self.crawler.origin );
self.context_done = 1; self.crawler playsound( "zmb_ai_sloth_attack_impact" );
}
self.sloth_damage_func = undefined;
self maps\mp\zombies\_zm_ai_sloth::sloth_set_traverse_funcs();
self.crawler = undefined;
self.context_done = 1;
} }
watch_sloth_on_exit_side() watch_sloth_on_exit_side()
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
if ( is_true( self.context_done ) ) {
{ if ( is_true( self.context_done ) )
return; return;
}
self.on_exit_side = 0; self.on_exit_side = 0;
player = self.candy_player; player = self.candy_player;
if ( isDefined( player ) && is_true( player.is_in_ghost_zone ) )
{ if ( isdefined( player ) && is_true( player.is_in_ghost_zone ) )
name = player.current_ghost_room_name; {
if ( isDefined( name ) ) name = player.current_ghost_room_name;
{
room = level.ghost_rooms[ name ]; if ( isdefined( name ) )
if ( is_true( room.to_maze ) ) {
{ room = level.ghost_rooms[name];
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
{ if ( is_true( room.to_maze ) )
self.on_exit_side = 1; {
} if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
break; self.on_exit_side = 1;
} }
else else if ( is_true( room.from_maze ) )
{ {
if ( is_true( room.from_maze ) ) if ( !self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
{ self.on_exit_side = 1;
if ( !self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() ) }
{ }
self.on_exit_side = 1; }
}
} wait 0.25;
} }
}
}
wait 0,25;
}
} }
watch_sloth_on_same_side() watch_sloth_on_same_side()
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
if ( is_true( self.context_done ) ) {
{ if ( is_true( self.context_done ) )
return; return;
}
self.on_same_side = 0; self.on_same_side = 0;
player = self.candy_player; player = self.candy_player;
if ( isDefined( player ) )
{ if ( isdefined( player ) )
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() ) {
{ if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
if ( player maps/mp/zombies/_zm_ai_sloth::behind_mansion_zone() ) {
{ if ( player maps\mp\zombies\_zm_ai_sloth::behind_mansion_zone() )
self.on_same_side = 1; self.on_same_side = 1;
} }
break; else if ( !player maps\mp\zombies\_zm_ai_sloth::behind_mansion_zone() )
} self.on_same_side = 1;
else }
{
if ( !player maps/mp/zombies/_zm_ai_sloth::behind_mansion_zone() ) wait 0.25;
{ }
self.on_same_side = 1;
}
}
}
wait 0,25;
}
} }
sloth_move_to_same_side() sloth_move_to_same_side()
{ {
self endon( "death" ); self endon( "death" );
if ( isDefined( self.teleport_time ) )
{ if ( isdefined( self.teleport_time ) )
if ( ( getTime() - self.teleport_time ) < 1000 ) {
{ if ( gettime() - self.teleport_time < 1000 )
return 0; return false;
} }
}
player = self.candy_player; player = self.candy_player;
if ( is_true( player.is_in_ghost_zone ) )
{ if ( is_true( player.is_in_ghost_zone ) )
if ( is_true( self.on_exit_side ) ) {
{ if ( is_true( self.on_exit_side ) )
return 0; return false;
} }
} else if ( is_true( self.on_same_side ) )
else return false;
{
if ( is_true( self.on_same_side ) ) if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
{ self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
return 0; else
} self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
}
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() ) return true;
{
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
}
else
{
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
}
return 1;
} }
sloth_is_same_zone( player ) sloth_is_same_zone( player )
{ {
zone_sloth = self get_current_zone(); zone_sloth = self get_current_zone();
zone_player = player get_current_zone(); zone_player = player get_current_zone();
if ( !isDefined( zone_sloth ) || !isDefined( zone_player ) )
{ if ( !isdefined( zone_sloth ) || !isdefined( zone_player ) )
return 0; return false;
}
if ( zone_sloth == zone_player ) if ( zone_sloth == zone_player )
{ return true;
return 1;
} return false;
return 0;
} }
append_hunched( asd_name ) append_hunched( asd_name )
{ {
if ( self.is_inside ) if ( self.is_inside )
{ return asd_name + "_hunched";
return asd_name + "_hunched";
} return asd_name;
return asd_name;
} }
crawler_update_locomotion() crawler_update_locomotion()
{ {
if ( self.zombie_move_speed == "walk_crawlerhold" ) if ( self.zombie_move_speed == "walk_crawlerhold" )
{ {
if ( self.is_inside ) if ( self.is_inside )
{ {
self set_zombie_run_cycle( "walk_crawlerhold_hunched" ); self set_zombie_run_cycle( "walk_crawlerhold_hunched" );
self.locomotion = "walk_crawlerhold_hunched"; self.locomotion = "walk_crawlerhold_hunched";
} }
} }
else else if ( self.zombie_move_speed == "walk_crawlerhold_hunched" )
{ {
if ( self.zombie_move_speed == "walk_crawlerhold_hunched" ) if ( !self.is_inside )
{ {
if ( !self.is_inside ) self set_zombie_run_cycle( "walk_crawlerhold" );
{ self.locomotion = "walk_crawlerhold";
self set_zombie_run_cycle( "walk_crawlerhold" ); }
self.locomotion = "walk_crawlerhold"; }
}
}
}
} }
crawler_watch_death() crawler_watch_death()
{ {
self endon( "stop_crawler_watch" ); self endon( "stop_crawler_watch" );
self.crawler waittill( "death" );
self stop_action(); self.crawler waittill( "death" );
self stop_action();
/# /#
sloth_print( "crawler died" ); sloth_print( "crawler died" );
#/ #/
if ( isDefined( self.crawler ) ) if ( isdefined( self.crawler ) )
{ self.crawler unlink();
self.crawler unlink();
} self.setanimstatefromspeed = undefined;
self.setanimstatefromspeed = undefined; self.sloth_damage_func = undefined;
self.sloth_damage_func = undefined; self maps\mp\zombies\_zm_ai_sloth::sloth_set_traverse_funcs();
self maps/mp/zombies/_zm_ai_sloth::sloth_set_traverse_funcs(); self.crawler = undefined;
self.crawler = undefined; self.context_done = 1;
self.context_done = 1;
} }
crawler_pre_traverse() crawler_pre_traverse()
{ {
sloth_sling = self append_hunched( "zm_sloth_crawlerhold_sling" ); sloth_sling = self append_hunched( "zm_sloth_crawlerhold_sling" );
crawler_sling = self append_hunched( "zm_crawler_sloth_crawlerhold_sling" ); crawler_sling = self append_hunched( "zm_crawler_sloth_crawlerhold_sling" );
self setanimstatefromasd( sloth_sling ); self setanimstatefromasd( sloth_sling );
self.crawler setanimstatefromasd( crawler_sling ); self.crawler setanimstatefromasd( crawler_sling );
self maps/mp/animscripts/zm_shared::donotetracks( "sloth_crawlerhold_sling_anim" ); self maps\mp\animscripts\zm_shared::donotetracks( "sloth_crawlerhold_sling_anim" );
self.crawler thread crawler_traverse_idle(); self.crawler thread crawler_traverse_idle();
} }
crawler_traverse_idle() crawler_traverse_idle()
{ {
self endon( "death" ); self endon( "death" );
self endon( "stop_traverse_idle" ); self endon( "stop_traverse_idle" );
while ( 1 )
{ while ( true )
self setanimstatefromasd( "zm_crawler_sloth_crawlerhold_slung_idle" ); {
wait 0,1; self setanimstatefromasd( "zm_crawler_sloth_crawlerhold_slung_idle" );
} wait 0.1;
}
} }
crawler_post_traverse() crawler_post_traverse()
{ {
self.crawler notify( "stop_traverse_idle" ); self.crawler notify( "stop_traverse_idle" );
sloth_unsling = self append_hunched( "zm_sloth_crawlerhold_unsling" ); sloth_unsling = self append_hunched( "zm_sloth_crawlerhold_unsling" );
crawler_unsling = self append_hunched( "zm_crawler_sloth_crawlerhold_unsling" ); crawler_unsling = self append_hunched( "zm_crawler_sloth_crawlerhold_unsling" );
self setanimstatefromasd( sloth_unsling ); self setanimstatefromasd( sloth_unsling );
self.crawler setanimstatefromasd( crawler_unsling ); self.crawler setanimstatefromasd( crawler_unsling );
self maps/mp/animscripts/zm_shared::donotetracks( "sloth_crawlerhold_unsling_anim" ); self maps\mp\animscripts\zm_shared::donotetracks( "sloth_crawlerhold_unsling_anim" );
} }
crawler_death() crawler_death()
{ {
return 1; return 1;
} }
crawler_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) crawler_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex )
{ {
level.sloth.release_crawler = 1; level.sloth.release_crawler = 1;
return 0; return 0;
} }
is_crawler_alive() is_crawler_alive()
{ {
if ( isDefined( self.crawler ) && self.crawler.health > 0 ) if ( isdefined( self.crawler ) && self.crawler.health > 0 )
{ return true;
return 1;
} return false;
return 0;
} }
slothanimstatefromspeed( animstate, substate ) slothanimstatefromspeed( animstate, substate )
{ {
if ( isDefined( self.crawler ) ) if ( isdefined( self.crawler ) )
{ {
crawler_walk = "zm_crawler_crawlerhold_walk"; crawler_walk = "zm_crawler_crawlerhold_walk";
if ( self.is_inside )
{ if ( self.is_inside )
crawler_walk += "_hunched"; crawler_walk += "_hunched";
}
self.crawler setanimstatefromasd( crawler_walk ); self.crawler setanimstatefromasd( crawler_walk );
} }
} }

View File

@ -1,14 +1,17 @@
#include maps/mp/zombies/_zm_ai_sloth_utility; // 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_ai_sloth_utility;
sloth_ffotd_init() sloth_ffotd_init()
{ {
level.double_wide_override = undefined; level.double_wide_override = undefined;
level.interior_override = undefined; level.interior_override = undefined;
} }
sloth_ffotd_prespawn() sloth_ffotd_prespawn()
{ {
} }

View File

@ -1,519 +1,498 @@
#include maps/mp/zombies/_zm_unitrigger; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_hackables_box; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_magicbox; #include common_scripts\utility;
#include maps/mp/zm_buried; #include maps\mp\_utility;
#include maps/mp/animscripts/zm_shared; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_ai_sloth; #include maps\mp\zombies\_zm_ai_sloth_utility;
#include maps/mp/zombies/_zm_ai_sloth_utility; #include maps\mp\zombies\_zm_ai_sloth;
#include maps/mp/zombies/_zm_utility; #include maps\mp\animscripts\zm_shared;
#include maps/mp/_utility; #include maps\mp\zm_buried;
#include common_scripts/utility; #include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zombies\_zm_hackables_box;
#include maps\mp\zombies\_zm_unitrigger;
box_lock_condition() box_lock_condition()
{ {
box = level.chests[ level.chest_index ]; box = level.chests[level.chest_index];
if ( !isDefined( box ) )
{ if ( !isdefined( box ) )
return 0; return false;
}
/# /#
self sloth_debug_context( box, sqrt( 32400 ) ); self sloth_debug_context( box, sqrt( 32400 ) );
#/ #/
if ( flag( "moving_chest_now" ) ) if ( flag( "moving_chest_now" ) )
{ return false;
return 0;
} if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) ) return false;
{
return 0; dist = distancesquared( self.origin, box.origin );
}
dist = distancesquared( self.origin, box.origin ); if ( dist < 32400 )
if ( dist < 32400 ) return true;
{
return 1; return false;
}
return 0;
} }
box_get_ground_offset() box_get_ground_offset()
{ {
vec_right = vectornormalize( anglesToRight( self.angles ) ); vec_right = vectornormalize( anglestoright( self.angles ) );
box_pos = self.origin - ( vec_right * 36 ); box_pos = self.origin - vec_right * 36;
ground_pos = groundpos( box_pos ); ground_pos = groundpos( box_pos );
return ground_pos; return ground_pos;
} }
common_abort_box( box ) common_abort_box( box )
{ {
if ( flag( "moving_chest_now" ) ) if ( flag( "moving_chest_now" ) )
{ {
self.context_done = 1; self.context_done = 1;
return 1; return true;
} }
if ( isDefined( box ) )
{ if ( isdefined( box ) )
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) ) {
{ if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
{
/# /#
sloth_print( "box was opened...abort" ); sloth_print( "box was opened...abort" );
#/ #/
self.context_done = 1; self.context_done = 1;
return 1; return true;
} }
} }
return 0;
return false;
} }
common_move_to_maze( box ) common_move_to_maze( box )
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
if ( self common_abort_box( box ) ) {
{ if ( self common_abort_box( box ) )
return 0; return false;
}
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() ) if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
{ break;
break;
} self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
else wait 0.2;
{ }
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
wait 0,2; return true;
}
}
return 1;
} }
common_move_to_courtyard( box ) common_move_to_courtyard( box )
{ {
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
if ( self common_abort_box( box ) ) {
{ if ( self common_abort_box( box ) )
return 0; return false;
}
if ( !self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() ) if ( !self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
{ break;
break;
} self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
else wait 0.2;
{ }
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
wait 0,2; return true;
}
}
return 1;
} }
common_move_to_box( box, range, ignore_open, asd_name ) common_move_to_box( box, range, ignore_open, asd_name )
{ {
if ( isDefined( asd_name ) ) if ( isdefined( asd_name ) )
{ {
anim_id = self getanimfromasd( asd_name, 0 ); anim_id = self getanimfromasd( asd_name, 0 );
start_org = getstartorigin( box.origin, box.angles, anim_id ); start_org = getstartorigin( box.origin, box.angles, anim_id );
start_ang = getstartangles( box.origin, box.angles, anim_id ); start_ang = getstartangles( box.origin, box.angles, anim_id );
self setgoalpos( start_org ); self setgoalpos( start_org );
ground_pos = start_org; ground_pos = start_org;
} }
else else
{ {
vec_right = vectornormalize( anglesToRight( box.angles ) ); vec_right = vectornormalize( anglestoright( box.angles ) );
box_pos = box.origin - ( vec_right * 36 ); box_pos = box.origin - vec_right * 36;
ground_pos = groundpos( box_pos ); ground_pos = groundpos( box_pos );
self setgoalpos( ground_pos ); self setgoalpos( ground_pos );
} }
while ( 1 )
{ while ( true )
if ( flag( "moving_chest_now" ) ) {
{ if ( flag( "moving_chest_now" ) )
self.context_done = 1; {
return 0; self.context_done = 1;
} return false;
if ( !is_true( ignore_open ) || is_true( box._box_open ) && is_true( box._box_opened_by_fire_sale ) ) }
{
if ( !is_true( ignore_open ) && ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) ) )
{
/# /#
sloth_print( "box was opened...abort" ); sloth_print( "box was opened...abort" );
#/ #/
self.context_done = 1; self.context_done = 1;
return 0; return false;
} }
dist = distancesquared( self.origin, ground_pos );
if ( dist < range ) dist = distancesquared( self.origin, ground_pos );
{
break; if ( dist < range )
} break;
else
{ wait 0.1;
wait 0,1; }
}
} if ( isdefined( asd_name ) )
if ( isDefined( asd_name ) ) {
{ self setgoalpos( self.origin );
self setgoalpos( self.origin ); self sloth_face_object( box, "angle", start_ang[1], 0.9 );
self sloth_face_object( box, "angle", start_ang[ 1 ], 0,9 ); }
} else
else {
{ angles = vectortoangles( vec_right );
angles = vectorToAngle( vec_right ); self.anchor.origin = self.origin;
self.anchor.origin = self.origin; self.anchor.angles = angles;
self.anchor.angles = angles; self orientmode( "face angle", angles[1] );
self orientmode( "face angle", angles[ 1 ] ); wait 0.2;
wait 0,2; }
}
if ( flag( "moving_chest_now" ) ) if ( flag( "moving_chest_now" ) )
{ {
self.context_done = 1; self.context_done = 1;
return 0; return false;
} }
return 1;
return true;
} }
box_lock_action() box_lock_action()
{ {
self endon( "death" ); self endon( "death" );
self endon( "stop_action" ); self endon( "stop_action" );
self maps/mp/zombies/_zm_ai_sloth::common_context_action(); self maps\mp\zombies\_zm_ai_sloth::common_context_action();
box = level.chests[ level.chest_index ]; box = level.chests[level.chest_index];
if ( !self common_move_to_box( box, 1024 ) )
{ if ( !self common_move_to_box( box, 1024 ) )
return; return;
}
self animscripted( box.origin, box.angles, "zm_lock_magicbox" ); self animscripted( box.origin, box.angles, "zm_lock_magicbox" );
maps/mp/animscripts/zm_shared::donotetracks( "lock_magicbox_anim", ::box_notetracks, box ); maps\mp\animscripts\zm_shared::donotetracks( "lock_magicbox_anim", ::box_notetracks, box );
if ( flag( "moving_chest_now" ) )
{ if ( flag( "moving_chest_now" ) )
self.context_done = 1; {
return; self.context_done = 1;
} return;
setdvar( "magic_chest_movable", "0" ); }
setdvar( "magic_chest_movable", "0" );
/# /#
sloth_print( "box will not move" ); sloth_print( "box will not move" );
#/ #/
maps/mp/zombies/_zm_ai_sloth::unregister_candy_context( "box_lock" ); maps\mp\zombies\_zm_ai_sloth::unregister_candy_context( "box_lock" );
maps/mp/zombies/_zm_ai_sloth::unregister_candy_context( "box_move" ); maps\mp\zombies\_zm_ai_sloth::unregister_candy_context( "box_move" );
self.context_done = 1; self.context_done = 1;
} }
box_move_condition() box_move_condition()
{ {
if ( flag( "moving_chest_now" ) ) if ( flag( "moving_chest_now" ) )
{ return false;
return 0;
} self.box_move = undefined;
self.box_move = undefined; self.box_current = undefined;
self.box_current = undefined; self.box_current_in_maze = 0;
self.box_current_in_maze = 0; box_current = level.chests[level.chest_index];
box_current = level.chests[ level.chest_index ];
if ( is_true( box_current._box_open ) || is_true( box_current._box_opened_by_fire_sale ) ) if ( is_true( box_current._box_open ) || is_true( box_current._box_opened_by_fire_sale ) )
{ return false;
return 0;
} if ( box_current.script_noteworthy == "courtroom_chest1" )
if ( box_current.script_noteworthy == "courtroom_chest1" ) {
{ if ( !maps\mp\zm_buried::is_courthouse_open() )
if ( !maps/mp/zm_buried::is_courthouse_open() ) return false;
{ }
return 0;
} if ( box_current.script_noteworthy == "tunnels_chest1" )
} {
if ( box_current.script_noteworthy == "tunnels_chest1" ) if ( !maps\mp\zm_buried::is_tunnel_open() )
{ return false;
if ( !maps/mp/zm_buried::is_tunnel_open() ) }
{
return 0; if ( box_current.script_noteworthy == "maze_chest1" || box_current.script_noteworthy == "maze_chest2" )
} {
} self.box_current_in_maze = 1;
if ( box_current.script_noteworthy == "maze_chest1" || box_current.script_noteworthy == "maze_chest2" )
{ if ( !is_maze_open() )
self.box_current_in_maze = 1; return false;
if ( !is_maze_open() ) }
{
return 0; for ( i = 0; i < level.chests.size; i++ )
} {
} if ( i == level.chest_index )
i = 0; continue;
while ( i < level.chests.size )
{ box = level.chests[i];
if ( i == level.chest_index ) self.box_move_in_maze = box.script_noteworthy == "maze_chest1" || box.script_noteworthy == "maze_chest2";
{ dist = distancesquared( self.origin, box.origin );
i++;
continue; if ( dist < 32400 )
} {
else self.box_move_index = i;
{ self.box_move = box;
box = level.chests[ i ]; self.box_current = box_current;
if ( box.script_noteworthy != "maze_chest1" ) return true;
{ }
self.box_move_in_maze = box.script_noteworthy == "maze_chest2"; }
}
dist = distancesquared( self.origin, box.origin ); return false;
if ( dist < 32400 )
{
self.box_move_index = i;
self.box_move = box;
self.box_current = box_current;
return 1;
}
}
i++;
}
return 0;
} }
box_move_action() box_move_action()
{ {
self endon( "death" ); self endon( "death" );
self endon( "stop_action" ); self endon( "stop_action" );
self maps/mp/zombies/_zm_ai_sloth::common_context_action(); self maps\mp\zombies\_zm_ai_sloth::common_context_action();
/# /#
sloth_print( "moving box from: " + self.box_current.script_noteworthy + " to: " + self.box_move.script_noteworthy ); sloth_print( "moving box from: " + self.box_current.script_noteworthy + " to: " + self.box_move.script_noteworthy );
#/ #/
if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_magicbox_point" ) ) if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_magicbox_point" ) )
{ return;
return;
} self maps\mp\zombies\_zm_ai_sloth::action_animscripted( "zm_magicbox_point", "magicbox_point_anim", self.box_move.origin, self.box_move.angles );
self maps/mp/zombies/_zm_ai_sloth::action_animscripted( "zm_magicbox_point", "magicbox_point_anim", self.box_move.origin, self.box_move.angles );
if ( is_true( self.box_current_in_maze ) ) if ( is_true( self.box_current_in_maze ) )
{ {
if ( !is_true( self.box_move_in_maze ) ) if ( !is_true( self.box_move_in_maze ) )
{ {
if ( !self common_move_to_maze( self.box_current ) ) if ( !self common_move_to_maze( self.box_current ) )
{ return;
return; }
} }
} else if ( is_true( self.box_move_in_maze ) )
} {
else if ( !self common_move_to_courtyard( self.box_current ) )
{ return;
if ( is_true( self.box_move_in_maze ) ) }
{
if ( !self common_move_to_courtyard( self.box_current ) ) if ( !self common_move_to_box( self.box_current, 1024, 0, "zm_pull_magicbox" ) )
{ return;
return;
} self animscripted( self.box_current.origin, self.box_current.angles, "zm_pull_magicbox" );
} maps\mp\animscripts\zm_shared::donotetracks( "pull_magicbox_anim", ::box_notetracks, self.box_current );
}
if ( !self common_move_to_box( self.box_current, 1024, 0, "zm_pull_magicbox" ) ) if ( self common_abort_box( self.box_current ) )
{ {
return; self box_move_interrupt();
} return;
self animscripted( self.box_current.origin, self.box_current.angles, "zm_pull_magicbox" ); }
maps/mp/animscripts/zm_shared::donotetracks( "pull_magicbox_anim", ::box_notetracks, self.box_current );
if ( self common_abort_box( self.box_current ) ) if ( isdefined( level.sloth.custom_box_move_func ) )
{ self thread [[ level.sloth.custom_box_move_func ]]( 0 );
self box_move_interrupt();
return; level.sloth_moving_box = 1;
} self.ignore_common_run = 1;
if ( isDefined( level.sloth.custom_box_move_func ) ) self set_zombie_run_cycle( "run_holding_magicbox" );
{ self.locomotion = "run_holding_magicbox";
self thread [[ level.sloth.custom_box_move_func ]]( 0 );
} if ( is_true( self.box_current_in_maze ) )
level.sloth_moving_box = 1; {
self.ignore_common_run = 1; if ( !is_true( self.box_move_in_maze ) )
self set_zombie_run_cycle( "run_holding_magicbox" ); {
self.locomotion = "run_holding_magicbox"; if ( !self common_move_to_courtyard( undefined ) )
if ( is_true( self.box_current_in_maze ) ) {
{ self box_move_interrupt();
if ( !is_true( self.box_move_in_maze ) ) return;
{ }
if ( !self common_move_to_courtyard( undefined ) ) }
{ }
self box_move_interrupt(); else if ( is_true( self.box_move_in_maze ) )
return; {
} if ( !self common_move_to_maze( undefined ) )
} {
} self box_move_interrupt();
else return;
{ }
if ( is_true( self.box_move_in_maze ) ) }
{
if ( !self common_move_to_maze( undefined ) ) if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_place_magicbox" ) )
{ {
self box_move_interrupt(); self box_move_interrupt();
return; return;
} }
}
} self animscripted( self.box_move.origin, self.box_move.angles, "zm_place_magicbox" );
if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_place_magicbox" ) ) maps\mp\animscripts\zm_shared::donotetracks( "place_magicbox_anim", ::box_notetracks, self.box_move );
{ self.box_current = undefined;
self box_move_interrupt(); self.context_done = 1;
return; level.sloth_moving_box = undefined;
}
self animscripted( self.box_move.origin, self.box_move.angles, "zm_place_magicbox" ); if ( isdefined( level.sloth.custom_box_move_func ) )
maps/mp/animscripts/zm_shared::donotetracks( "place_magicbox_anim", ::box_notetracks, self.box_move ); self thread [[ level.sloth.custom_box_move_func ]]( 1 );
self.box_current = undefined;
self.context_done = 1;
level.sloth_moving_box = undefined;
if ( isDefined( level.sloth.custom_box_move_func ) )
{
self thread [[ level.sloth.custom_box_move_func ]]( 1 );
}
} }
box_notetracks( note, box ) box_notetracks( note, box )
{ {
if ( !flag( "moving_chest_now" ) || is_true( box._box_open ) && is_true( box._box_opened_by_fire_sale ) ) if ( flag( "moving_chest_now" ) || is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
{ return 0;
return 0;
} if ( note == "pulled" )
if ( note == "pulled" ) {
{ playfx( level._effect["fx_buried_sloth_box_slam"], box.origin );
playfx( level._effect[ "fx_buried_sloth_box_slam" ], box.origin ); tag_name = "tag_stowed_back";
tag_name = "tag_stowed_back"; twr_origin = self gettagorigin( tag_name );
twr_origin = self gettagorigin( tag_name ); twr_angles = self gettagangles( tag_name );
twr_angles = self gettagangles( tag_name );
if ( !isDefined( self.box_model ) ) if ( !isdefined( self.box_model ) )
{ {
self.box_model = spawn( "script_model", twr_origin ); self.box_model = spawn( "script_model", twr_origin );
self.box_model.angles = twr_angles; self.box_model.angles = twr_angles;
self.box_model setmodel( level.small_magic_box ); self.box_model setmodel( level.small_magic_box );
self.box_model linkto( self, tag_name ); self.box_model linkto( self, tag_name );
self.box_model_visible = 1; self.box_model_visible = 1;
} }
else else
{ {
self.box_model show(); self.box_model show();
self.box_model_visible = 1; self.box_model_visible = 1;
} }
self.box_current maps/mp/zombies/_zm_magicbox::hide_chest();
} self.box_current maps\mp\zombies\_zm_magicbox::hide_chest();
else if ( note == "placed" ) }
{ else if ( note == "placed" )
playfx( level._effect[ "fx_buried_sloth_box_slam" ], box.origin ); {
self box_model_hide(); playfx( level._effect["fx_buried_sloth_box_slam"], box.origin );
if ( isDefined( self.box_move.zbarrier ) ) self box_model_hide();
{
self.box_move.zbarrier maps/mp/zombies/_zm_magicbox::set_magic_box_zbarrier_state( "initial" ); if ( isdefined( self.box_move.zbarrier ) )
self.box_move.hidden = 0; {
self.box_move thread [[ level.pandora_show_func ]](); self.box_move.zbarrier maps\mp\zombies\_zm_magicbox::set_magic_box_zbarrier_state( "initial" );
level.chest_index = self.box_move_index; self.box_move.hidden = 0;
} self.box_move thread [[ level.pandora_show_func ]]();
} level.chest_index = self.box_move_index;
else }
{ }
if ( note == "locked" ) else if ( note == "locked" )
{ playfx( level._effect["fx_buried_sloth_box_slam"], box.origin );
playfx( level._effect[ "fx_buried_sloth_box_slam" ], box.origin );
}
}
} }
box_model_hide() box_model_hide()
{ {
if ( isDefined( self.box_model ) ) if ( isdefined( self.box_model ) )
{ {
self.box_model ghost(); self.box_model ghost();
self.box_model_visible = 0; self.box_model_visible = 0;
} }
} }
box_move_interrupt() box_move_interrupt()
{ {
if ( isDefined( self.box_current ) ) if ( isdefined( self.box_current ) )
{ {
if ( isDefined( self.box_current.zbarrier ) ) if ( isdefined( self.box_current.zbarrier ) )
{ {
self.box_current.zbarrier maps/mp/zombies/_zm_magicbox::set_magic_box_zbarrier_state( "initial" ); self.box_current.zbarrier maps\mp\zombies\_zm_magicbox::set_magic_box_zbarrier_state( "initial" );
self.box_current.hidden = 0; self.box_current.hidden = 0;
self.box_current thread [[ level.pandora_show_func ]](); self.box_current thread [[ level.pandora_show_func ]]();
} }
} }
if ( isDefined( level.sloth.custom_box_move_func ) )
{ if ( isdefined( level.sloth.custom_box_move_func ) )
self thread [[ level.sloth.custom_box_move_func ]]( 1 ); self thread [[ level.sloth.custom_box_move_func ]]( 1 );
}
level.sloth_moving_box = undefined; level.sloth_moving_box = undefined;
self box_model_hide(); self box_model_hide();
} }
box_spin_condition() box_spin_condition()
{ {
if ( flag( "moving_chest_now" ) ) if ( flag( "moving_chest_now" ) )
{ return false;
return 0;
} box = level.chests[level.chest_index];
box = level.chests[ level.chest_index ];
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) ) if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
{ {
ground_pos = groundpos( box.origin ); ground_pos = groundpos( box.origin );
dist = distancesquared( self.origin, ground_pos ); dist = distancesquared( self.origin, ground_pos );
if ( dist < 32400 )
{ if ( dist < 32400 )
return 1; return true;
} }
}
return 0; return false;
} }
box_spin_action() box_spin_action()
{ {
self endon( "death" ); self endon( "death" );
self endon( "stop_action" ); self endon( "stop_action" );
self maps/mp/zombies/_zm_ai_sloth::common_context_action(); self maps\mp\zombies\_zm_ai_sloth::common_context_action();
box = level.chests[ level.chest_index ]; box = level.chests[level.chest_index];
hackable = spawnstruct(); hackable = spawnstruct();
hackable.chest = box; hackable.chest = box;
if ( !self common_move_to_box( box, 1024, 1, "zm_cycle_magicbox" ) )
{ if ( !self common_move_to_box( box, 1024, 1, "zm_cycle_magicbox" ) )
return; return;
}
if ( !self box_spin_qualifier( hackable ) ) if ( !self box_spin_qualifier( hackable ) )
{ return;
return;
} self animscripted( box.origin, box.angles, "zm_cycle_magicbox" );
self animscripted( box.origin, box.angles, "zm_cycle_magicbox" ); maps\mp\animscripts\zm_shared::donotetracks( "cycle_magicbox_anim", ::box_kick, hackable );
maps/mp/animscripts/zm_shared::donotetracks( "cycle_magicbox_anim", ::box_kick, hackable ); self.context_done = 1;
self.context_done = 1;
} }
box_kick( note, hackable ) box_kick( note, hackable )
{ {
if ( note == "kick" ) if ( note == "kick" )
{ {
if ( !self box_spin_qualifier( hackable ) ) if ( !self box_spin_qualifier( hackable ) )
{ return;
return;
} if ( !flag( "moving_chest_now" ) )
if ( !flag( "moving_chest_now" ) ) {
{ hackable thread box_trigger();
hackable thread box_trigger(); hackable maps\mp\zombies\_zm_hackables_box::respin_box( self.candy_player );
hackable maps/mp/zombies/_zm_hackables_box::respin_box( self.candy_player ); }
} }
}
} }
box_trigger() box_trigger()
{ {
if ( isDefined( self.chest ) ) if ( isdefined( self.chest ) )
{ {
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.chest.unitrigger_stub ); thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.chest.unitrigger_stub );
self.chest.zbarrier waittill( "randomization_done" );
if ( !flag( "moving_chest_now" ) ) self.chest.zbarrier waittill( "randomization_done" );
{
thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.chest.unitrigger_stub, ::maps/mp/zombies/_zm_magicbox::magicbox_unitrigger_think ); if ( !flag( "moving_chest_now" ) )
} thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.chest.unitrigger_stub, maps\mp\zombies\_zm_magicbox::magicbox_unitrigger_think );
} }
} }
box_spin_qualifier( hackable ) box_spin_qualifier( hackable )
{ {
if ( isDefined( hackable.chest ) ) if ( isdefined( hackable.chest ) )
{ {
if ( !isDefined( hackable.chest.chest_user ) ) if ( !isdefined( hackable.chest.chest_user ) )
{ {
self.context_done = 1; self.context_done = 1;
return 0; return false;
} }
} }
if ( !hackable maps/mp/zombies/_zm_hackables_box::hack_box_qualifier( self.candy_player ) )
{ if ( !hackable maps\mp\zombies\_zm_hackables_box::hack_box_qualifier( self.candy_player ) )
{
/# /#
sloth_print( "hack_box_qualifier failed" ); sloth_print( "hack_box_qualifier failed" );
#/ #/
self.context_done = 1; self.context_done = 1;
return 0; return false;
} }
return 1;
return true;
} }

View File

@ -1,211 +1,197 @@
#include maps/mp/zombies/_zm_ai_sloth; // T6 GSC SOURCE
#include maps/mp/zm_buried; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_zonemgr; #include common_scripts\utility;
#include maps/mp/animscripts/zm_utility; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_utility;
#include maps/mp/_utility; #include maps\mp\animscripts\zm_utility;
#include common_scripts/utility; #include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zm_buried;
#include maps\mp\zombies\_zm_ai_sloth;
should_ignore_candybooze( player ) should_ignore_candybooze( player )
{ {
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_underground_courthouse" ) || player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_underground_courthouse2" ) ) if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_underground_courthouse" ) || player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_underground_courthouse2" ) )
{ {
if ( !maps/mp/zm_buried::is_courthouse_open() ) if ( !maps\mp\zm_buried::is_courthouse_open() )
{ return true;
return 1; }
}
} if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_tunnels_north2" ) )
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_tunnels_north2" ) ) {
{ if ( !maps\mp\zm_buried::is_courthouse_open() )
if ( !maps/mp/zm_buried::is_courthouse_open() ) return true;
{ }
return 1;
} if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_tunnels_center" ) || player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_tunnels_north" ) || player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_tunnels_south" ) )
} {
if ( !player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_tunnels_center" ) || player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_tunnels_north" ) && player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_tunnels_south" ) ) if ( !maps\mp\zm_buried::is_tunnel_open() )
{ return true;
if ( !maps/mp/zm_buried::is_tunnel_open() ) }
{
return 1; if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_start_lower" ) )
} return true;
}
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_start_lower" ) ) if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_underground_bar" ) )
{ {
return 1; if ( !maps\mp\zombies\_zm_ai_sloth::is_bar_open() )
} return true;
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_underground_bar" ) ) }
{
if ( !maps/mp/zombies/_zm_ai_sloth::is_bar_open() ) return false;
{
return 1;
}
}
return 0;
} }
watch_crash_pos() watch_crash_pos()
{ {
dist_crash = 4096; dist_crash = 4096;
level.crash_pos = []; level.crash_pos = [];
level.crash_pos[ level.crash_pos.size ] = ( 3452, 1012, 56 ); level.crash_pos[level.crash_pos.size] = ( 3452, 1012, 56 );
level.crash_pos[ level.crash_pos.size ] = ( 3452, 1092, 56 ); level.crash_pos[level.crash_pos.size] = ( 3452, 1092, 56 );
level.crash_pos[ level.crash_pos.size ] = ( 3452, 1056, 56 ); level.crash_pos[level.crash_pos.size] = ( 3452, 1056, 56 );
while ( 1 )
{ while ( true )
while ( !isDefined( self.state ) || self.state != "berserk" ) {
{ if ( !isdefined( self.state ) || self.state != "berserk" )
wait 0,1; {
} wait 0.1;
_a82 = level.crash_pos; continue;
_k82 = getFirstArrayKey( _a82 ); }
while ( isDefined( _k82 ) )
{ foreach ( pos in level.crash_pos )
pos = _a82[ _k82 ]; {
dist = distancesquared( self.origin, pos ); dist = distancesquared( self.origin, pos );
if ( dist < dist_crash )
{ if ( dist < dist_crash )
self.anchor.origin = self.origin; {
self.anchor.angles = self.angles; self.anchor.origin = self.origin;
self linkto( self.anchor ); self.anchor.angles = self.angles;
self setclientfield( "sloth_berserk", 0 ); self linkto( self.anchor );
self sloth_set_state( "crash", 0 ); self setclientfield( "sloth_berserk", 0 );
wait 0,25; self sloth_set_state( "crash", 0 );
self unlink(); wait 0.25;
} self unlink();
_k82 = getNextArrayKey( _a82, _k82 ); }
} }
wait 0,05;
} wait 0.05;
}
} }
sloth_is_pain() sloth_is_pain()
{ {
if ( is_true( self.is_pain ) ) if ( is_true( self.is_pain ) )
{ {
anim_state = self getanimstatefromasd(); anim_state = self getanimstatefromasd();
if ( anim_state == "zm_pain" || anim_state == "zm_pain_no_restart" )
{ if ( anim_state == "zm_pain" || anim_state == "zm_pain_no_restart" )
return 1; return true;
} else
else {
{ self.reset_asd = undefined;
self.reset_asd = undefined; self animmode( "normal" );
self animmode( "normal" ); self.is_pain = 0;
self.is_pain = 0; self.damage_accumulating = 0;
self.damage_accumulating = 0; self notify( "stop_accumulation" );
self notify( "stop_accumulation" );
/# /#
sloth_print( "pain was interrupted" ); sloth_print( "pain was interrupted" );
#/ #/
} }
} }
return 0;
return false;
} }
sloth_is_traversing() sloth_is_traversing()
{ {
if ( is_true( self.is_traversing ) ) if ( is_true( self.is_traversing ) )
{ {
anim_state = self getanimstatefromasd(); anim_state = self getanimstatefromasd();
if ( anim_state != "zm_traverse" && anim_state != "zm_traverse_no_restart" && anim_state != "zm_traverse_barrier" && anim_state != "zm_traverse_barrier_no_restart" && anim_state != "zm_sling_equipment" && anim_state != "zm_unsling_equipment" && anim_state != "zm_sling_magicbox" && anim_state != "zm_unsling_magicbox" && anim_state != "zm_sloth_crawlerhold_sling" && anim_state != "zm_sloth_crawlerhold_unsling" || anim_state == "zm_sloth_crawlerhold_sling_hunched" && anim_state == "zm_sloth_crawlerhold_unsling_hunched" )
{ if ( anim_state == "zm_traverse" || anim_state == "zm_traverse_no_restart" || anim_state == "zm_traverse_barrier" || anim_state == "zm_traverse_barrier_no_restart" || anim_state == "zm_sling_equipment" || anim_state == "zm_unsling_equipment" || anim_state == "zm_sling_magicbox" || anim_state == "zm_unsling_magicbox" || anim_state == "zm_sloth_crawlerhold_sling" || anim_state == "zm_sloth_crawlerhold_unsling" || anim_state == "zm_sloth_crawlerhold_sling_hunched" || anim_state == "zm_sloth_crawlerhold_unsling_hunched" )
return 1; return true;
} else
else {
{ self.is_traversing = 0;
self.is_traversing = 0;
/# /#
sloth_print( "traverse was interrupted" ); sloth_print( "traverse was interrupted" );
#/ #/
} }
} }
return 0;
return false;
} }
sloth_face_object( facee, type, data, dot_limit ) sloth_face_object( facee, type, data, dot_limit )
{ {
if ( type == "angle" ) if ( type == "angle" )
{ self orientmode( "face angle", data );
self orientmode( "face angle", data ); else if ( type == "point" )
} self orientmode( "face point", data );
else
{ time_started = gettime();
if ( type == "point" )
{ while ( true )
self orientmode( "face point", data ); {
} if ( type == "angle" )
} {
time_started = getTime(); delta = abs( self.angles[1] - data );
while ( 1 )
{ if ( delta <= 15 )
if ( type == "angle" ) break;
{ }
delta = abs( self.angles[ 1 ] - data ); else if ( isdefined( dot_limit ) )
if ( delta <= 15 ) {
{ if ( self is_facing( facee, dot_limit ) )
break; break;
} }
else } else if ( self is_facing( facee ) )
else if ( isDefined( dot_limit ) ) break;
{
if ( self is_facing( facee, dot_limit ) ) if ( gettime() - time_started > 1000 )
{ {
break;
}
else }
else if ( self is_facing( facee ) )
{
break;
}
else if ( ( getTime() - time_started ) > 1000 )
{
/# /#
sloth_print( "face took too long" ); sloth_print( "face took too long" );
#/ #/
break; break;
} }
else
{ wait 0.1;
wait 0,1; }
}
}
/# /#
time_elapsed = getTime() - time_started; time_elapsed = gettime() - time_started;
sloth_print( "time to face: " + time_elapsed ); sloth_print( "time to face: " + time_elapsed );
#/ #/
} }
sloth_print( str ) sloth_print( str )
{ {
/# /#
if ( getDvarInt( #"B6252E7C" ) ) if ( getdvarint( _hash_B6252E7C ) )
{ {
iprintln( "sloth: " + str ); iprintln( "sloth: " + str );
if ( isDefined( self.debug_msg ) )
{ if ( isdefined( self.debug_msg ) )
self.debug_msg[ self.debug_msg.size ] = str; {
if ( self.debug_msg.size > 64 ) self.debug_msg[self.debug_msg.size] = str;
{
self.debug_msg = []; if ( self.debug_msg.size > 64 )
} self.debug_msg = [];
return; }
} else
else {
{ self.debug_msg = [];
self.debug_msg = []; self.debug_msg[self.debug_msg.size] = str;
self.debug_msg[ self.debug_msg.size ] = str; }
}
#/ #/
}
}
} }
sloth_debug_context( item, dist ) sloth_debug_context( item, dist )
{ {
/# /#
if ( is_true( self.context_debug ) ) if ( is_true( self.context_debug ) )
{ {
debugstar( item.origin, 100, ( 1, 1, 1 ) ); debugstar( item.origin, 100, ( 1, 1, 1 ) );
circle( item.origin, dist, ( 1, 1, 1 ), 0, 1, 100 ); circle( item.origin, dist, ( 1, 1, 1 ), 0, 1, 100 );
}
#/ #/
}
} }

View File

@ -1,326 +1,304 @@
#include maps/mp/zombies/_zm_unitrigger; // 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_powerups; #include maps\mp\_utility;
#include maps/mp/zombies/_zm_weapons; #include maps\mp\zombies\_zm_utility;
#include maps/mp/zombies/_zm_magicbox; #include maps\mp\zombies\_zm_magicbox;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_weapons;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_powerups;
#include common_scripts/utility; #include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_unitrigger;
init() init()
{ {
onplayerconnect_callback( ::onplayerconnect_bank_deposit_box ); onplayerconnect_callback( ::onplayerconnect_bank_deposit_box );
if ( !isDefined( level.ta_vaultfee ) )
{ if ( !isdefined( level.ta_vaultfee ) )
level.ta_vaultfee = 100; level.ta_vaultfee = 100;
}
if ( !isDefined( level.ta_tellerfee ) ) if ( !isdefined( level.ta_tellerfee ) )
{ level.ta_tellerfee = 100;
level.ta_tellerfee = 100;
}
} }
main() main()
{ {
if ( !isDefined( level.banking_map ) ) if ( !isdefined( level.banking_map ) )
{ level.banking_map = level.script;
level.banking_map = level.script;
} level thread bank_teller_init();
level thread bank_teller_init(); level thread bank_deposit_box();
level thread bank_deposit_box();
} }
bank_teller_init() bank_teller_init()
{ {
level.bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" ); level.bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
if ( isDefined( level.bank_teller_dmg_trig ) )
{ 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.bank_teller_transfer_trig = getent( level.bank_teller_dmg_trig.target, "targetname" );
level thread bank_teller_logic(); level.bank_teller_powerup_spot = getstruct( level.bank_teller_transfer_trig.target, "targetname" );
level.bank_teller_transfer_trig.origin += vectorScale( ( 0, 0, -1 ), 25 ); level thread bank_teller_logic();
level.bank_teller_transfer_trig trigger_off(); level.bank_teller_transfer_trig.origin += vectorscale( ( -1, 0, 0 ), 25.0 );
level.bank_teller_transfer_trig sethintstring( &"ZOMBIE_TELLER_GIVE_MONEY", level.ta_tellerfee ); level.bank_teller_transfer_trig trigger_off();
} level.bank_teller_transfer_trig sethintstring( &"ZOMBIE_TELLER_GIVE_MONEY", level.ta_tellerfee );
}
} }
bank_teller_logic() bank_teller_logic()
{ {
level endon( "end_game" ); level endon( "end_game" );
while ( 1 )
{ 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" ) level.bank_teller_dmg_trig waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, blah );
{
bank_teller_give_money(); if ( isdefined( attacker ) && isplayer( attacker ) && damage == 1500 && type == "MOD_MELEE" )
level.bank_teller_transfer_trig trigger_off(); {
} bank_teller_give_money();
} level.bank_teller_transfer_trig trigger_off();
}
}
} }
bank_teller_give_money() bank_teller_give_money()
{ {
level endon( "end_game" ); level endon( "end_game" );
level endon( "stop_bank_teller" ); level endon( "stop_bank_teller" );
level.bank_teller_transfer_trig trigger_on(); level.bank_teller_transfer_trig trigger_on();
bank_transfer = undefined; bank_transfer = undefined;
while ( 1 )
{ while ( true )
level.bank_teller_transfer_trig waittill( "trigger", player ); {
if ( !is_player_valid( player, 0 ) || player.score < ( 1000 + level.ta_tellerfee ) ) level.bank_teller_transfer_trig waittill( "trigger", player );
{
continue; if ( !is_player_valid( player, 0 ) || player.score < 1000 + level.ta_tellerfee )
} continue;
if ( !isDefined( bank_transfer ) )
{ if ( !isdefined( bank_transfer ) )
bank_transfer = maps/mp/zombies/_zm_powerups::specific_powerup_drop( "teller_withdrawl", level.bank_teller_powerup_spot.origin + vectorScale( ( 0, 0, -1 ), 40 ) ); {
bank_transfer thread stop_bank_teller(); bank_transfer = maps\mp\zombies\_zm_powerups::specific_powerup_drop( "teller_withdrawl", level.bank_teller_powerup_spot.origin + vectorscale( ( 0, 0, -1 ), 40.0 ) );
bank_transfer.value = 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(); bank_transfer.value += 1000;
player maps/mp/zombies/_zm_score::minus_to_player_score( 1000 + level.ta_tellerfee ); bank_transfer notify( "powerup_reset" );
level notify( "bank_teller_used" ); 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() stop_bank_teller()
{ {
level endon( "end_game" ); level endon( "end_game" );
self waittill( "death" );
level notify( "stop_bank_teller" ); self waittill( "death" );
level notify( "stop_bank_teller" );
} }
delete_bank_teller() delete_bank_teller()
{ {
wait 1; wait 1;
level notify( "stop_bank_teller" ); level notify( "stop_bank_teller" );
bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" ); bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" ); bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" );
bank_teller_dmg_trig delete(); bank_teller_dmg_trig delete();
bank_teller_transfer_trig delete(); bank_teller_transfer_trig delete();
} }
onplayerconnect_bank_deposit_box() onplayerconnect_bank_deposit_box()
{ {
online_game = sessionmodeisonlinegame(); online_game = sessionmodeisonlinegame();
if ( !online_game )
{ if ( !online_game )
self.account_value = 0; self.account_value = 0;
} else
else self.account_value = self maps\mp\zombies\_zm_stats::get_map_stat( "depositBox", level.banking_map );
{
self.account_value = self maps/mp/zombies/_zm_stats::get_map_stat( "depositBox", level.banking_map );
}
} }
bank_deposit_box() bank_deposit_box()
{ {
level.bank_deposit_max_amount = 250000; level.bank_deposit_max_amount = 250000;
level.bank_deposit_ddl_increment_amount = 1000; 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_max = level.bank_deposit_max_amount / level.bank_deposit_ddl_increment_amount;
level.bank_account_increment = int( level.bank_deposit_ddl_increment_amount / 1000 ); level.bank_account_increment = int( level.bank_deposit_ddl_increment_amount / 1000 );
deposit_triggers = getstructarray( "bank_deposit", "targetname" ); deposit_triggers = getstructarray( "bank_deposit", "targetname" );
array_thread( deposit_triggers, ::bank_deposit_unitrigger ); array_thread( deposit_triggers, ::bank_deposit_unitrigger );
withdraw_triggers = getstructarray( "bank_withdraw", "targetname" ); withdraw_triggers = getstructarray( "bank_withdraw", "targetname" );
array_thread( withdraw_triggers, ::bank_withdraw_unitrigger ); array_thread( withdraw_triggers, ::bank_withdraw_unitrigger );
} }
bank_deposit_unitrigger() bank_deposit_unitrigger()
{ {
bank_unitrigger( "bank_deposit", ::trigger_deposit_update_prompt, ::trigger_deposit_think, 5, 5, undefined, 5 ); bank_unitrigger( "bank_deposit", ::trigger_deposit_update_prompt, ::trigger_deposit_think, 5, 5, undefined, 5 );
} }
bank_withdraw_unitrigger() bank_withdraw_unitrigger()
{ {
bank_unitrigger( "bank_withdraw", ::trigger_withdraw_update_prompt, ::trigger_withdraw_think, 5, 5, undefined, 5 ); 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 ) bank_unitrigger( name, prompt_fn, think_fn, override_length, override_width, override_height, override_radius )
{ {
unitrigger_stub = spawnstruct(); unitrigger_stub = spawnstruct();
unitrigger_stub.origin = self.origin; unitrigger_stub.origin = self.origin;
if ( isDefined( self.script_angles ) )
{ if ( isdefined( self.script_angles ) )
unitrigger_stub.angles = self.script_angles; unitrigger_stub.angles = self.script_angles;
} else
else unitrigger_stub.angles = self.angles;
{
unitrigger_stub.angles = self.angles; unitrigger_stub.script_angles = unitrigger_stub.angles;
}
unitrigger_stub.script_angles = unitrigger_stub.angles; if ( isdefined( override_length ) )
if ( isDefined( override_length ) ) unitrigger_stub.script_length = override_length;
{ else if ( isdefined( self.script_length ) )
unitrigger_stub.script_length = override_length; unitrigger_stub.script_length = self.script_length;
} else
else if ( isDefined( self.script_length ) ) unitrigger_stub.script_length = 32;
{
unitrigger_stub.script_length = self.script_length; if ( isdefined( override_width ) )
} unitrigger_stub.script_width = override_width;
else else if ( isdefined( self.script_width ) )
{ unitrigger_stub.script_width = self.script_width;
unitrigger_stub.script_length = 32; else
} unitrigger_stub.script_width = 32;
if ( isDefined( override_width ) )
{ if ( isdefined( override_height ) )
unitrigger_stub.script_width = override_width; unitrigger_stub.script_height = override_height;
} else if ( isdefined( self.script_height ) )
else if ( isDefined( self.script_width ) ) unitrigger_stub.script_height = self.script_height;
{ else
unitrigger_stub.script_width = self.script_width; unitrigger_stub.script_height = 64;
}
else if ( isdefined( override_radius ) )
{ unitrigger_stub.script_radius = override_radius;
unitrigger_stub.script_width = 32; else if ( isdefined( self.radius ) )
} unitrigger_stub.radius = self.radius;
if ( isDefined( override_height ) ) else
{ unitrigger_stub.radius = 32;
unitrigger_stub.script_height = override_height;
} if ( isdefined( self.script_unitrigger_type ) )
else if ( isDefined( self.script_height ) ) unitrigger_stub.script_unitrigger_type = self.script_unitrigger_type;
{ else
unitrigger_stub.script_height = self.script_height; {
} unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
else unitrigger_stub.origin -= anglestoright( unitrigger_stub.angles ) * unitrigger_stub.script_length / 2;
{ }
unitrigger_stub.script_height = 64;
} unitrigger_stub.cursor_hint = "HINT_NOICON";
if ( isDefined( override_radius ) ) unitrigger_stub.targetname = name;
{ maps\mp\zombies\_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
unitrigger_stub.script_radius = override_radius; unitrigger_stub.prompt_and_visibility_func = prompt_fn;
} maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, think_fn );
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 ) trigger_deposit_update_prompt( player )
{ {
if ( player.score < level.bank_deposit_ddl_increment_amount || player.account_value >= level.bank_account_max ) if ( player.score < level.bank_deposit_ddl_increment_amount || player.account_value >= level.bank_account_max )
{ {
player show_balance(); player show_balance();
self sethintstring( "" ); self sethintstring( "" );
return 0; return false;
} }
self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount );
return 1; self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount );
return true;
} }
trigger_deposit_think() trigger_deposit_think()
{ {
self endon( "kill_trigger" ); self endon( "kill_trigger" );
while ( 1 )
{ while ( true )
self waittill( "trigger", player ); {
while ( !is_player_valid( player ) ) self waittill( "trigger", player );
{
continue; if ( !is_player_valid( player ) )
} continue;
if ( player.score >= level.bank_deposit_ddl_increment_amount && player.account_value < level.bank_account_max )
{ 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 playsoundtoplayer( "zmb_vault_bank_deposit", player );
player.account_value += level.bank_account_increment; player.score -= level.bank_deposit_ddl_increment_amount;
player maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map ); player.account_value += level.bank_account_increment;
if ( isDefined( level.custom_bank_deposit_vo ) ) player maps\mp\zombies\_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
{
player thread [[ level.custom_bank_deposit_vo ]](); if ( isdefined( level.custom_bank_deposit_vo ) )
} player thread [[ level.custom_bank_deposit_vo ]]();
if ( player.account_value >= level.bank_account_max )
{ if ( player.account_value >= level.bank_account_max )
self sethintstring( "" ); self sethintstring( "" );
} }
} else
else player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
{
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 ); player show_balance();
} }
player show_balance();
}
} }
trigger_withdraw_update_prompt( player ) trigger_withdraw_update_prompt( player )
{ {
if ( player.account_value <= 0 ) if ( player.account_value <= 0 )
{ {
self sethintstring( "" ); self sethintstring( "" );
player show_balance(); player show_balance();
return 0; return false;
} }
self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee );
return 1; self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee );
return true;
} }
trigger_withdraw_think() trigger_withdraw_think()
{ {
self endon( "kill_trigger" ); self endon( "kill_trigger" );
while ( 1 )
{ while ( true )
self waittill( "trigger", player ); {
while ( !is_player_valid( player ) ) self waittill( "trigger", player );
{
continue; if ( !is_player_valid( player ) )
} continue;
if ( player.account_value >= level.bank_account_increment )
{ if ( player.account_value >= level.bank_account_increment )
player playsoundtoplayer( "zmb_vault_bank_withdraw", player ); {
player.score += level.bank_deposit_ddl_increment_amount; player playsoundtoplayer( "zmb_vault_bank_withdraw", player );
level notify( "bank_withdrawal" ); player.score += level.bank_deposit_ddl_increment_amount;
player.account_value -= level.bank_account_increment; level notify( "bank_withdrawal" );
player maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map ); player.account_value -= level.bank_account_increment;
if ( isDefined( level.custom_bank_withdrawl_vo ) ) player maps\mp\zombies\_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
{
player thread [[ level.custom_bank_withdrawl_vo ]](); if ( isdefined( level.custom_bank_withdrawl_vo ) )
} player thread [[ level.custom_bank_withdrawl_vo ]]();
else else
{ player thread do_player_general_vox( "general", "exert_laugh", 10, 50 );
player thread do_player_general_vox( "general", "exert_laugh", 10, 50 );
} player thread player_withdraw_fee();
player thread player_withdraw_fee();
if ( player.account_value < level.bank_account_increment ) if ( player.account_value < level.bank_account_increment )
{ self sethintstring( "" );
self sethintstring( "" ); }
} else
} player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
else
{ player show_balance();
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 ); }
}
player show_balance();
}
} }
player_withdraw_fee() player_withdraw_fee()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
wait_network_frame(); wait_network_frame();
self.score -= level.ta_vaultfee; self.score -= level.ta_vaultfee;
} }
show_balance() show_balance()
{ {
/# /#
iprintlnbold( "DEBUG BANKER: " + self.name + " account worth " + self.account_value ); iprintlnbold( "DEBUG BANKER: " + self.name + " account worth " + self.account_value );
#/ #/
} }

View File

@ -1,443 +1,406 @@
#include maps/mp/gametypes_zm/_hud_util; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_unitrigger; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_buildables; #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_buildables;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\gametypes_zm\_hud_util;
add_buildable_to_pool( stub, poolname ) add_buildable_to_pool( stub, poolname )
{ {
if ( !isDefined( level.buildablepools ) ) if ( !isdefined( level.buildablepools ) )
{ level.buildablepools = [];
level.buildablepools = [];
} if ( !isdefined( level.buildablepools[poolname] ) )
if ( !isDefined( level.buildablepools[ poolname ] ) ) {
{ level.buildablepools[poolname] = spawnstruct();
level.buildablepools[ poolname ] = spawnstruct(); level.buildablepools[poolname].stubs = [];
level.buildablepools[ poolname ].stubs = []; }
}
level.buildablepools[ poolname ].stubs[ level.buildablepools[ poolname ].stubs.size ] = stub; level.buildablepools[poolname].stubs[level.buildablepools[poolname].stubs.size] = stub;
if ( !isDefined( level.buildablepools[ poolname ].buildable_slot ) )
{ if ( !isdefined( level.buildablepools[poolname].buildable_slot ) )
level.buildablepools[ poolname ].buildable_slot = stub.buildablestruct.buildable_slot; level.buildablepools[poolname].buildable_slot = stub.buildablestruct.buildable_slot;
} else
else {
{
/# /#
assert( level.buildablepools[ poolname ].buildable_slot == stub.buildablestruct.buildable_slot ); assert( level.buildablepools[poolname].buildable_slot == stub.buildablestruct.buildable_slot );
#/ #/
} }
stub.buildable_pool = level.buildablepools[ poolname ];
stub.original_prompt_and_visibility_func = stub.prompt_and_visibility_func; stub.buildable_pool = level.buildablepools[poolname];
stub.original_trigger_func = stub.trigger_func; stub.original_prompt_and_visibility_func = stub.prompt_and_visibility_func;
stub.prompt_and_visibility_func = ::pooledbuildabletrigger_update_prompt; stub.original_trigger_func = stub.trigger_func;
reregister_unitrigger( stub, ::pooled_buildable_place_think ); stub.prompt_and_visibility_func = ::pooledbuildabletrigger_update_prompt;
reregister_unitrigger( stub, ::pooled_buildable_place_think );
} }
reregister_unitrigger( unitrigger_stub, new_trigger_func ) reregister_unitrigger( unitrigger_stub, new_trigger_func )
{ {
static = 0; static = 0;
if ( isDefined( unitrigger_stub.in_zone ) )
{ if ( isdefined( unitrigger_stub.in_zone ) )
static = 1; static = 1;
}
unregister_unitrigger( unitrigger_stub ); unregister_unitrigger( unitrigger_stub );
unitrigger_stub.trigger_func = new_trigger_func; unitrigger_stub.trigger_func = new_trigger_func;
if ( static )
{ if ( static )
register_static_unitrigger( unitrigger_stub, new_trigger_func, 0 ); register_static_unitrigger( unitrigger_stub, new_trigger_func, 0 );
} else
else register_unitrigger( unitrigger_stub, new_trigger_func );
{
register_unitrigger( unitrigger_stub, new_trigger_func );
}
} }
randomize_pooled_buildables( poolname ) randomize_pooled_buildables( poolname )
{ {
level waittill( "buildables_setup" ); level waittill( "buildables_setup" );
while ( isDefined( level.buildablepools[ poolname ] ) )
{ if ( isdefined( level.buildablepools[poolname] ) )
count = level.buildablepools[ poolname ].stubs.size; {
while ( count > 1 ) count = level.buildablepools[poolname].stubs.size;
{
targets = []; if ( count > 1 )
i = 0; {
while ( i < count ) targets = [];
{
while ( 1 ) for ( i = 0; i < count; i++ )
{ {
p = randomint( count ); while ( true )
if ( !isDefined( targets[ p ] ) ) {
{ p = randomint( count );
targets[ p ] = i;
i++; if ( !isdefined( targets[p] ) )
continue; {
} targets[p] = i;
else break;
{ }
} }
} }
i++;
} for ( i = 0; i < count; i++ )
i = 0; {
while ( i < count ) if ( isdefined( targets[i] ) && targets[i] != i )
{ swap_buildable_fields( level.buildablepools[poolname].stubs[i], level.buildablepools[poolname].stubs[targets[i]] );
if ( isDefined( targets[ i ] ) && targets[ i ] != i ) }
{ }
swap_buildable_fields( level.buildablepools[ poolname ].stubs[ i ], level.buildablepools[ poolname ].stubs[ targets[ i ] ] ); }
}
i++;
}
}
}
} }
pooledbuildable_has_piece( piece ) pooledbuildable_has_piece( piece )
{ {
return isDefined( self pooledbuildable_stub_for_piece( piece ) ); return isdefined( self pooledbuildable_stub_for_piece( piece ) );
} }
pooledbuildable_stub_for_piece( piece ) pooledbuildable_stub_for_piece( piece )
{ {
_a104 = self.stubs; foreach ( stub in self.stubs )
_k104 = getFirstArrayKey( _a104 ); {
while ( isDefined( _k104 ) ) if ( isdefined( stub.bound_to_buildable ) )
{ continue;
stub = _a104[ _k104 ];
if ( isDefined( stub.bound_to_buildable ) ) if ( stub.buildablezone buildable_has_piece( piece ) )
{ return stub;
} }
else
{ return undefined;
if ( stub.buildablezone buildable_has_piece( piece ) )
{
return stub;
}
}
_k104 = getNextArrayKey( _a104, _k104 );
}
return undefined;
} }
pooledbuildabletrigger_update_prompt( player ) pooledbuildabletrigger_update_prompt( player )
{ {
can_use = self.stub pooledbuildablestub_update_prompt( player, self ); can_use = self.stub pooledbuildablestub_update_prompt( player, self );
self sethintstring( self.stub.hint_string ); self sethintstring( self.stub.hint_string );
if ( isDefined( self.stub.cursor_hint ) )
{ if ( isdefined( self.stub.cursor_hint ) )
if ( self.stub.cursor_hint == "HINT_WEAPON" && isDefined( self.stub.cursor_hint_weapon ) ) {
{ if ( self.stub.cursor_hint == "HINT_WEAPON" && isdefined( self.stub.cursor_hint_weapon ) )
self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon );
} else
else self setcursorhint( self.stub.cursor_hint );
{ }
self setcursorhint( self.stub.cursor_hint );
} return can_use;
}
return can_use;
} }
pooledbuildablestub_update_prompt( player, trigger ) pooledbuildablestub_update_prompt( player, trigger )
{ {
if ( !self anystub_update_prompt( player ) ) if ( !self anystub_update_prompt( player ) )
{ return 0;
return 0;
} can_use = 1;
can_use = 1;
if ( isDefined( self.custom_buildablestub_update_prompt ) && !( self [[ self.custom_buildablestub_update_prompt ]]( player ) ) ) if ( isdefined( self.custom_buildablestub_update_prompt ) && !self [[ self.custom_buildablestub_update_prompt ]]( player ) )
{ return 0;
return 0;
} self.cursor_hint = "HINT_NOICON";
self.cursor_hint = "HINT_NOICON"; self.cursor_hint_weapon = undefined;
self.cursor_hint_weapon = undefined;
if ( isDefined( self.built ) && !self.built ) if ( !( isdefined( self.built ) && self.built ) )
{ {
slot = self.buildablestruct.buildable_slot; slot = self.buildablestruct.buildable_slot;
if ( !isDefined( player player_get_buildable_piece( slot ) ) )
{ if ( !isdefined( player player_get_buildable_piece( slot ) ) )
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_more ) ) {
{ if ( isdefined( level.zombie_buildables[self.equipname].hint_more ) )
self.hint_string = level.zombie_buildables[ self.equipname ].hint_more; self.hint_string = level.zombie_buildables[self.equipname].hint_more;
} else
else self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE";
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE"; if ( isdefined( level.custom_buildable_need_part_vo ) )
} player thread [[ level.custom_buildable_need_part_vo ]]();
if ( isDefined( level.custom_buildable_need_part_vo ) )
{ return 0;
player thread [[ level.custom_buildable_need_part_vo ]](); }
} else if ( isdefined( self.bound_to_buildable ) && !self.bound_to_buildable.buildablezone buildable_has_piece( player player_get_buildable_piece( slot ) ) )
return 0; {
} if ( isdefined( level.zombie_buildables[self.bound_to_buildable.equipname].hint_wrong ) )
else self.hint_string = level.zombie_buildables[self.bound_to_buildable.equipname].hint_wrong;
{ else
if ( isDefined( self.bound_to_buildable ) && !self.bound_to_buildable.buildablezone buildable_has_piece( player player_get_buildable_piece( slot ) ) ) self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
{
if ( isDefined( level.zombie_buildables[ self.bound_to_buildable.equipname ].hint_wrong ) ) if ( isdefined( level.custom_buildable_wrong_part_vo ) )
{ player thread [[ level.custom_buildable_wrong_part_vo ]]();
self.hint_string = level.zombie_buildables[ self.bound_to_buildable.equipname ].hint_wrong;
} return 0;
else }
{ else if ( !isdefined( self.bound_to_buildable ) && !self.buildable_pool pooledbuildable_has_piece( player player_get_buildable_piece( slot ) ) )
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG"; {
} if ( isdefined( level.zombie_buildables[self.equipname].hint_wrong ) )
if ( isDefined( level.custom_buildable_wrong_part_vo ) ) self.hint_string = level.zombie_buildables[self.equipname].hint_wrong;
{ else
player thread [[ level.custom_buildable_wrong_part_vo ]](); self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
}
return 0; return 0;
} }
else else if ( isdefined( self.bound_to_buildable ) )
{ {
if ( !isDefined( self.bound_to_buildable ) && !self.buildable_pool pooledbuildable_has_piece( player player_get_buildable_piece( slot ) ) )
{
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_wrong ) )
{
self.hint_string = level.zombie_buildables[ self.equipname ].hint_wrong;
}
else
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
}
return 0;
}
else
{
if ( isDefined( self.bound_to_buildable ) )
{
/# /#
assert( isDefined( level.zombie_buildables[ self.equipname ].hint ), "Missing buildable hint" ); assert( isdefined( level.zombie_buildables[self.equipname].hint ), "Missing buildable hint" );
#/ #/
if ( isDefined( level.zombie_buildables[ self.equipname ].hint ) ) if ( isdefined( level.zombie_buildables[self.equipname].hint ) )
{ self.hint_string = level.zombie_buildables[self.equipname].hint;
self.hint_string = level.zombie_buildables[ self.equipname ].hint; else
} self.hint_string = "Missing buildable hint";
else }
{ else
self.hint_string = "Missing buildable hint"; {
} /#
} assert( isdefined( level.zombie_buildables[self.equipname].hint ), "Missing buildable hint" );
else /#
assert( isDefined( level.zombie_buildables[ self.equipname ].hint ), "Missing buildable hint" );
#/ #/
if ( isDefined( level.zombie_buildables[ self.equipname ].hint ) ) if ( isdefined( level.zombie_buildables[self.equipname].hint ) )
{ self.hint_string = level.zombie_buildables[self.equipname].hint;
self.hint_string = level.zombie_buildables[ self.equipname ].hint; else
} self.hint_string = "Missing buildable hint";
else }
{ }
self.hint_string = "Missing buildable hint"; else
} return trigger [[ self.original_prompt_and_visibility_func ]]( player );
}
} return 1;
}
}
else
{
return trigger [[ self.original_prompt_and_visibility_func ]]( player );
}
return 1;
} }
find_bench( bench_name ) find_bench( bench_name )
{ {
return getent( bench_name, "targetname" ); return getent( bench_name, "targetname" );
} }
swap_buildable_fields( stub1, stub2 ) swap_buildable_fields( stub1, stub2 )
{ {
tbz = stub2.buildablezone; tbz = stub2.buildablezone;
stub2.buildablezone = stub1.buildablezone; stub2.buildablezone = stub1.buildablezone;
stub2.buildablezone.stub = stub2; stub2.buildablezone.stub = stub2;
stub1.buildablezone = tbz; stub1.buildablezone = tbz;
stub1.buildablezone.stub = stub1; stub1.buildablezone.stub = stub1;
tbs = stub2.buildablestruct; tbs = stub2.buildablestruct;
stub2.buildablestruct = stub1.buildablestruct; stub2.buildablestruct = stub1.buildablestruct;
stub1.buildablestruct = tbs; stub1.buildablestruct = tbs;
te = stub2.equipname; te = stub2.equipname;
stub2.equipname = stub1.equipname; stub2.equipname = stub1.equipname;
stub1.equipname = te; stub1.equipname = te;
th = stub2.hint_string; th = stub2.hint_string;
stub2.hint_string = stub1.hint_string; stub2.hint_string = stub1.hint_string;
stub1.hint_string = th; stub1.hint_string = th;
ths = stub2.trigger_hintstring; ths = stub2.trigger_hintstring;
stub2.trigger_hintstring = stub1.trigger_hintstring; stub2.trigger_hintstring = stub1.trigger_hintstring;
stub1.trigger_hintstring = ths; stub1.trigger_hintstring = ths;
tp = stub2.persistent; tp = stub2.persistent;
stub2.persistent = stub1.persistent; stub2.persistent = stub1.persistent;
stub1.persistent = tp; stub1.persistent = tp;
tobu = stub2.onbeginuse; tobu = stub2.onbeginuse;
stub2.onbeginuse = stub1.onbeginuse; stub2.onbeginuse = stub1.onbeginuse;
stub1.onbeginuse = tobu; stub1.onbeginuse = tobu;
tocu = stub2.oncantuse; tocu = stub2.oncantuse;
stub2.oncantuse = stub1.oncantuse; stub2.oncantuse = stub1.oncantuse;
stub1.oncantuse = tocu; stub1.oncantuse = tocu;
toeu = stub2.onenduse; toeu = stub2.onenduse;
stub2.onenduse = stub1.onenduse; stub2.onenduse = stub1.onenduse;
stub1.onenduse = toeu; stub1.onenduse = toeu;
tt = stub2.target; tt = stub2.target;
stub2.target = stub1.target; stub2.target = stub1.target;
stub1.target = tt; stub1.target = tt;
ttn = stub2.targetname; ttn = stub2.targetname;
stub2.targetname = stub1.targetname; stub2.targetname = stub1.targetname;
stub1.targetname = ttn; stub1.targetname = ttn;
twn = stub2.weaponname; twn = stub2.weaponname;
stub2.weaponname = stub1.weaponname; stub2.weaponname = stub1.weaponname;
stub1.weaponname = twn; stub1.weaponname = twn;
pav = stub2.original_prompt_and_visibility_func; pav = stub2.original_prompt_and_visibility_func;
stub2.original_prompt_and_visibility_func = stub1.original_prompt_and_visibility_func; stub2.original_prompt_and_visibility_func = stub1.original_prompt_and_visibility_func;
stub1.original_prompt_and_visibility_func = pav; stub1.original_prompt_and_visibility_func = pav;
bench1 = undefined; bench1 = undefined;
bench2 = undefined; bench2 = undefined;
transfer_pos_as_is = 1; transfer_pos_as_is = 1;
if ( isDefined( stub1.model.target ) && isDefined( stub2.model.target ) )
{ if ( isdefined( stub1.model.target ) && isdefined( stub2.model.target ) )
bench1 = find_bench( stub1.model.target ); {
bench2 = find_bench( stub2.model.target ); bench1 = find_bench( stub1.model.target );
if ( isDefined( bench1 ) && isDefined( bench2 ) ) bench2 = find_bench( stub2.model.target );
{
transfer_pos_as_is = 0; if ( isdefined( bench1 ) && isdefined( bench2 ) )
w2lo1 = bench1 worldtolocalcoords( stub1.model.origin ); {
w2la1 = stub1.model.angles - bench1.angles; transfer_pos_as_is = 0;
w2lo2 = bench2 worldtolocalcoords( stub2.model.origin ); w2lo1 = bench1 worldtolocalcoords( stub1.model.origin );
w2la2 = stub2.model.angles - bench2.angles; w2la1 = stub1.model.angles - bench1.angles;
stub1.model.origin = bench2 localtoworldcoords( w2lo1 ); w2lo2 = bench2 worldtolocalcoords( stub2.model.origin );
stub1.model.angles = bench2.angles + w2la1; w2la2 = stub2.model.angles - bench2.angles;
stub2.model.origin = bench1 localtoworldcoords( w2lo2 ); stub1.model.origin = bench2 localtoworldcoords( w2lo1 );
stub2.model.angles = bench1.angles + w2la2; stub1.model.angles = bench2.angles + w2la1;
} stub2.model.origin = bench1 localtoworldcoords( w2lo2 );
tmt = stub2.model.target; stub2.model.angles = bench1.angles + w2la2;
stub2.model.target = stub1.model.target; }
stub1.model.target = tmt;
} tmt = stub2.model.target;
tm = stub2.model; stub2.model.target = stub1.model.target;
stub2.model = stub1.model; stub1.model.target = tmt;
stub1.model = tm; }
if ( transfer_pos_as_is )
{ tm = stub2.model;
tmo = stub2.model.origin; stub2.model = stub1.model;
tma = stub2.model.angles; stub1.model = tm;
stub2.model.origin = stub1.model.origin;
stub2.model.angles = stub1.model.angles; if ( transfer_pos_as_is )
stub1.model.origin = tmo; {
stub1.model.angles = tma; tmo = stub2.model.origin;
} tma = stub2.model.angles;
stub2.model.origin = stub1.model.origin;
stub2.model.angles = stub1.model.angles;
stub1.model.origin = tmo;
stub1.model.angles = tma;
}
} }
pooled_buildable_place_think() pooled_buildable_place_think()
{ {
self endon( "kill_trigger" ); self endon( "kill_trigger" );
if ( isDefined( self.stub.built ) && self.stub.built )
{ if ( isdefined( self.stub.built ) && self.stub.built )
return buildable_place_think(); return buildable_place_think();
}
player_built = undefined; player_built = undefined;
while ( isDefined( self.stub.built ) && !self.stub.built )
{ while ( !( isdefined( self.stub.built ) && self.stub.built ) )
self waittill( "trigger", player ); {
while ( player != self.parent_player ) self waittill( "trigger", player );
{
continue; if ( player != self.parent_player )
} continue;
while ( isDefined( player.screecher_weapon ) )
{ if ( isdefined( player.screecher_weapon ) )
continue; continue;
}
while ( !is_player_valid( player ) ) if ( !is_player_valid( player ) )
{ {
player thread ignore_triggers( 0,5 ); player thread ignore_triggers( 0.5 );
} continue;
bind_to = self.stub; }
slot = bind_to.buildablestruct.buildable_slot;
if ( !isDefined( self.stub.bound_to_buildable ) ) bind_to = self.stub;
{ slot = bind_to.buildablestruct.buildable_slot;
bind_to = self.stub.buildable_pool pooledbuildable_stub_for_piece( player player_get_buildable_piece( slot ) );
} if ( !isdefined( self.stub.bound_to_buildable ) )
while ( isDefined( bind_to ) && isDefined( self.stub.bound_to_buildable ) || self.stub.bound_to_buildable != bind_to && isDefined( bind_to.bound_to_buildable ) && self.stub != bind_to.bound_to_buildable ) bind_to = self.stub.buildable_pool pooledbuildable_stub_for_piece( player player_get_buildable_piece( slot ) );
{
self.stub.hint_string = ""; if ( !isdefined( bind_to ) || isdefined( self.stub.bound_to_buildable ) && self.stub.bound_to_buildable != bind_to || isdefined( bind_to.bound_to_buildable ) && self.stub != bind_to.bound_to_buildable )
self sethintstring( self.stub.hint_string ); {
if ( isDefined( self.stub.oncantuse ) ) self.stub.hint_string = "";
{ self sethintstring( self.stub.hint_string );
self.stub [[ self.stub.oncantuse ]]( player );
} if ( isdefined( self.stub.oncantuse ) )
} self.stub [[ self.stub.oncantuse ]]( player );
status = player player_can_build( bind_to.buildablezone );
if ( !status ) continue;
{ }
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string ); status = player player_can_build( bind_to.buildablezone );
if ( isDefined( bind_to.oncantuse ) )
{ if ( !status )
bind_to [[ bind_to.oncantuse ]]( player ); {
} self.stub.hint_string = "";
continue; self sethintstring( self.stub.hint_string );
}
else if ( isdefined( bind_to.oncantuse ) )
{ bind_to [[ bind_to.oncantuse ]]( player );
if ( isDefined( bind_to.onbeginuse ) ) }
{ else
self.stub [[ bind_to.onbeginuse ]]( player ); {
} if ( isdefined( bind_to.onbeginuse ) )
result = self buildable_use_hold_think( player, bind_to ); self.stub [[ bind_to.onbeginuse ]]( player );
team = player.pers[ "team" ];
if ( result ) result = self buildable_use_hold_think( player, bind_to );
{ team = player.pers["team"];
if ( isDefined( self.stub.bound_to_buildable ) && self.stub.bound_to_buildable != bind_to )
{ if ( result )
result = 0; {
} if ( isdefined( self.stub.bound_to_buildable ) && self.stub.bound_to_buildable != bind_to )
if ( isDefined( bind_to.bound_to_buildable ) && self.stub != bind_to.bound_to_buildable ) result = 0;
{
result = 0; if ( isdefined( bind_to.bound_to_buildable ) && self.stub != bind_to.bound_to_buildable )
} result = 0;
} }
if ( isDefined( bind_to.onenduse ) )
{ if ( isdefined( bind_to.onenduse ) )
self.stub [[ bind_to.onenduse ]]( team, player, result ); self.stub [[ bind_to.onenduse ]]( team, player, result );
}
while ( !result ) if ( !result )
{ continue;
continue;
} if ( !isdefined( self.stub.bound_to_buildable ) && isdefined( bind_to ) )
if ( !isDefined( self.stub.bound_to_buildable ) && isDefined( bind_to ) ) {
{ if ( bind_to != self.stub )
if ( bind_to != self.stub ) swap_buildable_fields( self.stub, bind_to );
{
swap_buildable_fields( self.stub, bind_to ); self.stub.bound_to_buildable = self.stub;
} }
self.stub.bound_to_buildable = self.stub;
} if ( isdefined( self.stub.onuse ) )
if ( isDefined( self.stub.onuse ) ) self.stub [[ self.stub.onuse ]]( player );
{
self.stub [[ self.stub.onuse ]]( player ); if ( isdefined( player player_get_buildable_piece( slot ) ) )
} {
if ( isDefined( player player_get_buildable_piece( slot ) ) ) prompt = player player_build( self.stub.buildablezone );
{ player_built = player;
prompt = player player_build( self.stub.buildablezone ); self.stub.hint_string = prompt;
player_built = player; self sethintstring( self.stub.hint_string );
self.stub.hint_string = prompt; }
self sethintstring( self.stub.hint_string ); }
} }
}
} switch ( self.stub.persistent )
switch( self.stub.persistent ) {
{ case "1":
case 1: self bptrigger_think_persistent( player_built );
self bptrigger_think_persistent( player_built ); break;
break; case "0":
case 0: self bptrigger_think_one_time( player_built );
self bptrigger_think_one_time( player_built ); break;
break; case "3":
case 3: self bptrigger_think_unbuild( player_built );
self bptrigger_think_unbuild( player_built ); break;
break; case "2":
case 2: self bptrigger_think_one_use_and_fly( player_built );
self bptrigger_think_one_use_and_fly( player_built ); break;
break; case "4":
case 4: self [[ self.stub.custom_completion_callback ]]( player_built );
self [[ self.stub.custom_completion_callback ]]( player_built ); break;
break; }
}
} }

View File

@ -1,17 +1,22 @@
#include maps/mp/zombies/_zm_turned; // 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/gametypes_zm/_hud_util; #include maps\mp\gametypes_zm\_hud_util;
#include maps/mp/_utility; #include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_turned;
register_game_module() register_game_module()
{ {
} }
onstartgametype( name ) onstartgametype( name )
{ {
} }
onstartcleansedgametype() onstartcleansedgametype()
{ {
} }

View File

@ -1,11 +1,14 @@
#include maps/mp/zombies/_zm_game_module_utility; // 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/gametypes_zm/_hud_util; #include maps\mp\gametypes_zm\_hud_util;
#include maps/mp/_utility; #include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_utility;
#include maps\mp\zombies\_zm_game_module;
register_game_module() 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,6 +1,9 @@
#include maps/mp/zombies/_zm_game_module_utility; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_game_module_meat_utility; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include common_scripts/utility; #include maps\mp\gametypes_zm\_hud_util;
#include maps/mp/gametypes_zm/_hud_util; #include common_scripts\utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_meat_utility;
#include maps\mp\zombies\_zm_game_module_utility;

View File

@ -1,64 +1,59 @@
#include maps/mp/zombies/_zm_game_module_cleansed; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_turned; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include common_scripts/utility; #include maps\mp\gametypes_zm\_hud_util;
#include maps/mp/gametypes_zm/_hud_util; #include common_scripts\utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_turned;
#include maps\mp\zombies\_zm_game_module;
#include maps\mp\zombies\_zm_game_module_cleansed;
register_game_module() register_game_module()
{ {
level.game_module_turned_index = 6; level.game_module_turned_index = 6;
maps/mp/zombies/_zm_game_module::register_game_module( level.game_module_turned_index, "zturned", ::maps/mp/zombies/_zm_game_module_cleansed::onpreinitgametype, ::onpostinitgametype, undefined, ::maps/mp/zombies/_zm_game_module_cleansed::onspawnzombie, ::maps/mp/zombies/_zm_game_module_cleansed::onstartgametype ); maps\mp\zombies\_zm_game_module::register_game_module( level.game_module_turned_index, "zturned", maps\mp\zombies\_zm_game_module_cleansed::onpreinitgametype, ::onpostinitgametype, undefined, maps\mp\zombies\_zm_game_module_cleansed::onspawnzombie, maps\mp\zombies\_zm_game_module_cleansed::onstartgametype );
} }
register_turned_match( start_func, end_func, name ) register_turned_match( start_func, end_func, name )
{ {
if ( !isDefined( level._registered_turned_matches ) ) if ( !isdefined( level._registered_turned_matches ) )
{ level._registered_turned_matches = [];
level._registered_turned_matches = [];
} match = spawnstruct();
match = spawnstruct(); match.match_name = name;
match.match_name = name; match.match_start_func = start_func;
match.match_start_func = start_func; match.match_end_func = end_func;
match.match_end_func = end_func; level._registered_turned_matches[level._registered_turned_matches.size] = match;
level._registered_turned_matches[ level._registered_turned_matches.size ] = match;
} }
get_registered_turned_match( name ) get_registered_turned_match( name )
{ {
_a41 = level._registered_turned_matches; foreach ( struct in level._registered_turned_matches )
_k41 = getFirstArrayKey( _a41 ); {
while ( isDefined( _k41 ) ) if ( struct.match_name == name )
{ return struct;
struct = _a41[ _k41 ]; }
if ( struct.match_name == name )
{
return struct;
}
_k41 = getNextArrayKey( _a41, _k41 );
}
} }
set_current_turned_match( name ) set_current_turned_match( name )
{ {
level._current_turned_match = name; level._current_turned_match = name;
} }
get_current_turned_match() get_current_turned_match()
{ {
return level._current_turned_match; return level._current_turned_match;
} }
init_zombie_weapon() init_zombie_weapon()
{ {
maps/mp/zombies/_zm_turned::init(); maps\mp\zombies\_zm_turned::init();
} }
onpostinitgametype() onpostinitgametype()
{ {
if ( level.scr_zm_game_module != level.game_module_turned_index ) if ( level.scr_zm_game_module != level.game_module_turned_index )
{ return;
return;
} level thread init_zombie_weapon();
level thread init_zombie_weapon();
} }

View File

@ -1,46 +1,46 @@
#include maps/mp/zombies/_zm_game_module_meat; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_game_module_meat_utility; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_utility; #include maps\mp\_utility;
#include common_scripts/utility; #include maps\mp\gametypes_zm\_hud_util;
#include maps/mp/gametypes_zm/_hud_util; #include common_scripts\utility;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_game_module_meat_utility;
#include maps\mp\zombies\_zm_game_module_meat;
init_item_meat() 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 ) 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 )
_a23 = positions; {
_k23 = getFirstArrayKey( _a23 ); foreach ( position in positions )
while ( isDefined( _k23 ) ) {
{ self moveto( position.origin, randomintrange( 30, 45 ) );
position = _a23[ _k23 ];
self moveto( position.origin, randomintrange( 30, 45 ) ); self waittill( "movedone" );
self waittill( "movedone" ); }
_k23 = getNextArrayKey( _a23, _k23 ); }
}
}
} }
rotate_ring( forward ) 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,139 +1,172 @@
#include maps/mp/_visionset_mgr; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_perks; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_net; #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_net;
#include maps\mp\zombies\_zm_perks;
#include maps\mp\_visionset_mgr;
enable_divetonuke_perk_for_level() 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() 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() 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" );
precacheshader( "specialty_divetonuke_zombies" ); precacheitem( "zombie_perk_bottle_nuke" );
precachemodel( "zombie_vending_nuke" ); precacheshader( "specialty_divetonuke_zombies" );
precachemodel( "zombie_vending_nuke_on" ); precachemodel( "zombie_vending_nuke" );
precachestring( &"ZOMBIE_PERK_DIVETONUKE" ); precachemodel( "zombie_vending_nuke_on" );
level._effect[ "divetonuke_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); precachestring( &"ZOMBIE_PERK_DIVETONUKE" );
level.machine_assets[ "divetonuke" ] = spawnstruct(); level._effect["divetonuke_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" );
level.machine_assets[ "divetonuke" ].weapon = "zombie_perk_bottle_nuke"; level.machine_assets["divetonuke"] = spawnstruct();
level.machine_assets[ "divetonuke" ].off_model = "zombie_vending_nuke"; level.machine_assets["divetonuke"].weapon = "zombie_perk_bottle_nuke";
level.machine_assets[ "divetonuke" ].on_model = "zombie_vending_nuke_on"; level.machine_assets["divetonuke"].off_model = "zombie_vending_nuke";
level.machine_assets["divetonuke"].on_model = "zombie_vending_nuke_on";
} }
divetonuke_register_clientfield() 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 ) 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 ) 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";
use_trigger.script_label = "mus_perks_phd_sting"; use_trigger.script_label = "mus_perks_phd_sting";
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() divetonuke_perk_machine_think()
{ {
init_divetonuke(); init_divetonuke();
while ( 1 )
{ while ( true )
machine = getentarray( "vending_divetonuke", "targetname" ); {
machine_triggers = getentarray( "vending_divetonuke", "target" ); machine = getentarray( "vending_divetonuke", "targetname" );
i = 0; machine_triggers = getentarray( "vending_divetonuke", "target" );
while ( i < machine.size )
{ 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 );
i++;
} 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" );
i = 0;
while ( i < machine.size ) 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();
i++; }
}
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() divetonuke_host_migration_func()
{ {
flop = getentarray( "vending_divetonuke", "targetname" ); flop = getentarray( "vending_divetonuke", "targetname" );
_a138 = flop;
_k138 = getFirstArrayKey( _a138 ); foreach ( perk in flop )
while ( isDefined( _k138 ) ) {
{ if ( isdefined( perk.model ) && perk.model == level.machine_assets["divetonuke"].on_model )
perk = _a138[ _k138 ]; {
if ( isDefined( perk.model ) && perk.model == level.machine_assets[ "divetonuke" ].on_model ) perk perk_fx( undefined, 1 );
{ perk thread perk_fx( "divetonuke_light" );
perk perk_fx( undefined, 1 ); }
perk thread perk_fx( "divetonuke_light" ); }
}
_k138 = getNextArrayKey( _a138, _k138 );
}
} }
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"];
radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
playfx( level._effect[ "divetonuke_groundhit" ], origin ); if ( isdefined( level.flopper_network_optimized ) && level.flopper_network_optimized )
attacker playsound( "zmb_phdflop_explo" ); attacker thread divetonuke_explode_network_optimized( origin, radius, max_damage, min_damage, "MOD_GRENADE_SPLASH" );
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker ); else
wait 1; radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker );
playfx( level._effect["divetonuke_groundhit"], origin );
attacker playsound( "zmb_phdflop_explo" );
maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker );
wait 1;
maps\mp\_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker );
}
divetonuke_explode_network_optimized( origin, radius, max_damage, min_damage, damage_mod )
{
self endon( "disconnect" );
a_zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius );
network_stall_counter = 0;
if ( isdefined( a_zombies ) )
{
for ( i = 0; i < a_zombies.size; i++ )
{
e_zombie = a_zombies[i];
if ( !isdefined( e_zombie ) || !isalive( e_zombie ) )
continue;
dist = distance( e_zombie.origin, origin );
damage = min_damage + ( max_damage - min_damage ) * ( 1.0 - dist / radius );
e_zombie dodamage( damage, e_zombie.origin, self, self, 0, damage_mod );
network_stall_counter--;
if ( network_stall_counter <= 0 )
{
wait_network_frame();
network_stall_counter = randomintrange( 1, 3 );
}
}
}
} }

View File

@ -1,308 +1,302 @@
#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.ballistic_knife_autorecover ) ) if ( !isdefined( level.ballistic_knife_autorecover ) )
{ level.ballistic_knife_autorecover = 1;
level.ballistic_knife_autorecover = 1;
} if ( isdefined( level._uses_retrievable_ballisitic_knives ) && level._uses_retrievable_ballisitic_knives == 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" ); }
}
} }
on_spawn( watcher, player ) on_spawn( watcher, player )
{ {
player endon( "death" ); player endon( "death" );
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 );
isfriendly = 0; self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
if ( isDefined( endpos ) )
{ isfriendly = 0;
retrievable_model = spawn( "script_model", endpos );
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" ); if ( isdefined( endpos ) )
retrievable_model setowner( player ); {
retrievable_model.owner = player; retrievable_model = spawn( "script_model", endpos );
retrievable_model.angles = angles; retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
retrievable_model.name = watcher.weapon; retrievable_model setowner( player );
if ( isDefined( prey ) ) retrievable_model.owner = player;
{ retrievable_model.angles = angles;
if ( isplayer( prey ) && player.team == prey.team ) retrievable_model.name = watcher.weapon;
{
isfriendly = 1; if ( isdefined( prey ) )
} {
else if ( isplayer( prey ) && player.team == prey.team )
{ isfriendly = 1;
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 thread force_drop_knives_to_ground_on_death( player, prey );
retrievable_model linkto( prey, bone ); }
retrievable_model thread force_drop_knives_to_ground_on_death( player, prey ); else if ( isfriendly )
} {
else retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
{ normal = ( 0, 0, 1 );
if ( isfriendly ) }
{ }
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
normal = ( 0, 0, 1 ); watcher.objectarray[watcher.objectarray.size] = retrievable_model;
}
} if ( isfriendly )
} retrievable_model waittill( "stationary" );
watcher.objectarray[ watcher.objectarray.size ] = retrievable_model;
if ( isfriendly ) retrievable_model thread drop_knives_to_ground( player );
{
retrievable_model waittill( "stationary" ); if ( isfriendly )
} player notify( "ballistic_knife_stationary", retrievable_model, normal );
retrievable_model thread drop_knives_to_ground( player ); else
if ( isfriendly ) player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
{
player notify( "ballistic_knife_stationary" ); retrievable_model thread wait_to_show_glowing_model( prey );
} }
else
{
player notify( "ballistic_knife_stationary" );
}
retrievable_model thread wait_to_show_glowing_model( prey );
}
} }
wait_to_show_glowing_model( prey ) wait_to_show_glowing_model( prey )
{ {
level endon( "game_ended" ); level endon( "game_ended" );
self endon( "death" ); self endon( "death" );
wait 2; wait 2;
self setmodel( "t5_weapon_ballistic_knife_blade_retrieve" ); self setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
} }
on_spawn_retrieve_trigger( watcher, player ) on_spawn_retrieve_trigger( watcher, player )
{ {
player endon( "death" ); player endon( "death" );
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 );
if ( !isDefined( retrievable_model ) ) player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
{
return; if ( !isdefined( retrievable_model ) )
} return;
trigger_pos = [];
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) ) trigger_pos = [];
{
trigger_pos[ 0 ] = prey.origin[ 0 ]; if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
trigger_pos[ 1 ] = prey.origin[ 1 ]; {
trigger_pos[ 2 ] = prey.origin[ 2 ] + 10; trigger_pos[0] = prey.origin[0];
} trigger_pos[1] = prey.origin[1];
else trigger_pos[2] = prey.origin[2] + 10;
{ }
trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( 10 * normal[ 0 ] ); else
trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( 10 * normal[ 1 ] ); {
trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( 10 * normal[ 2 ] ); trigger_pos[0] = retrievable_model.origin[0] + 10 * normal[0];
} trigger_pos[1] = retrievable_model.origin[1] + 10 * normal[1];
if ( is_true( level.ballistic_knife_autorecover ) ) trigger_pos[2] = retrievable_model.origin[2] + 10 * normal[2];
{ }
trigger_pos[ 2 ] -= 50;
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ), 0, 50, 100 ); if ( is_true( level.ballistic_knife_autorecover ) )
} {
else trigger_pos[2] -= 50.0;
{ pickup_trigger = spawn( "trigger_radius", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ), 0, 50, 100 );
pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ) ); }
pickup_trigger setcursorhint( "HINT_NOICON" ); else
} {
pickup_trigger.owner = player; pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ) );
retrievable_model.retrievabletrigger = pickup_trigger; pickup_trigger setcursorhint( "HINT_NOICON" );
hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP"; }
if ( isDefined( hint_string ) )
{ pickup_trigger.owner = player;
pickup_trigger sethintstring( hint_string ); retrievable_model.retrievabletrigger = pickup_trigger;
} hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP";
else
{ if ( isdefined( hint_string ) )
pickup_trigger sethintstring( &"GENERIC_PICKUP" ); pickup_trigger sethintstring( hint_string );
} else
pickup_trigger setteamfortrigger( player.team ); pickup_trigger sethintstring( &"GENERIC_PICKUP" );
player clientclaimtrigger( pickup_trigger );
pickup_trigger enablelinkto(); pickup_trigger setteamfortrigger( player.team );
if ( isDefined( prey ) ) player clientclaimtrigger( pickup_trigger );
{ pickup_trigger enablelinkto();
pickup_trigger linkto( prey );
} if ( isdefined( prey ) )
else pickup_trigger linkto( prey );
{ 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 );
} }
debug_print( endpos ) debug_print( endpos )
{ {
/# /#
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
print3d( endpos, "pickup_trigger" ); {
wait 0,05; print3d( endpos, "pickup_trigger" );
wait 0.05;
}
#/ #/
}
} }
watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse ) watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse )
{ {
self endon( "death" ); self endon( "death" );
self endon( "delete" ); self endon( "delete" );
level endon( "game_ended" ); level endon( "game_ended" );
max_ammo = weaponmaxammo( weapon ) + 1; max_ammo = weaponmaxammo( weapon ) + 1;
autorecover = is_true( level.ballistic_knife_autorecover ); autorecover = is_true( level.ballistic_knife_autorecover );
while ( 1 )
{ while ( true )
trigger waittill( "trigger", player ); {
while ( !isalive( player ) ) trigger waittill( "trigger", player );
{
continue; if ( !isalive( player ) )
} continue;
if ( !player isonground() && !is_true( trigger.force_pickup ) )
{ 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; ammo_stock = player getweaponammostock( weapon );
} ammo_clip = player getweaponammoclip( weapon );
ammo_stock = player getweaponammostock( weapon ); current_weapon = player getcurrentweapon();
ammo_clip = player getweaponammoclip( weapon ); total_ammo = ammo_stock + ammo_clip;
current_weapon = player getcurrentweapon(); hasreloaded = 1;
total_ammo = ammo_stock + ammo_clip;
hasreloaded = 1; if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == weapon )
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == weapon ) hasreloaded = 0;
{
hasreloaded = 0; if ( total_ammo >= max_ammo || !hasreloaded )
} continue;
if ( total_ammo >= max_ammo || !hasreloaded )
{ if ( autorecover || player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() || is_true( trigger.force_pickup ) )
continue; {
} if ( isdefined( playersoundonuse ) )
if ( !autorecover && player usebuttonpressed() && !player.throwinggrenade || !player meleebuttonpressed() && is_true( trigger.force_pickup ) ) player playlocalsound( playersoundonuse );
{
if ( isDefined( playersoundonuse ) ) if ( isdefined( npcsoundonuse ) )
{ player playsound( npcsoundonuse );
player playlocalsound( playersoundonuse );
} player thread [[ callback ]]( weapon, model, trigger );
if ( isDefined( npcsoundonuse ) ) break;
{ }
player playsound( npcsoundonuse ); }
}
player thread [[ callback ]]( weapon, model, trigger );
return;
}
else
{
}
}
} }
pick_up( weapon, model, trigger ) pick_up( weapon, model, trigger )
{ {
if ( self hasweapon( weapon ) ) 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 ); {
if ( !clip_ammo ) clip_ammo = self getweaponammoclip( weapon );
{
self setweaponammoclip( weapon, 1 ); if ( !clip_ammo )
} self setweaponammoclip( weapon, 1 );
else else
{ {
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 );
} }
} }
else else
{ {
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" );
model destroy_ent(); self maps\mp\zombies\_zm_stats::increment_player_stat( "ballistic_knives_pickedup" );
trigger destroy_ent(); model 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_or_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();
} }
drop_knives_to_ground( player ) 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 ); {
if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) level waittill( "drop_objects_to_ground", origin, radius );
{
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) ); if ( distancesquared( origin, self.origin ) < radius * radius )
self thread update_retrieve_trigger( player ); {
} self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
} self thread update_retrieve_trigger( player );
}
}
} }
force_drop_knives_to_ground_on_death( player, prey ) 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" );
self unlink(); prey waittill( "death" );
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) );
self thread update_retrieve_trigger( player ); self unlink();
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
self thread update_retrieve_trigger( player );
} }
update_retrieve_trigger( player ) 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 ); {
return; self [[ level.custom_update_retrieve_trigger ]]( player );
} return;
self waittill( "stationary" ); }
trigger = self.retrievabletrigger;
trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 ); self waittill( "stationary" );
trigger linkto( self );
trigger = self.retrievabletrigger;
trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
trigger linkto( self );
} }

View File

@ -1,19 +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
} cost = 3000;
else
{ 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 );
cost = 3000; 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" );
maps/mp/zombies/_zm_melee_weapon::init( "bowie_knife_zm", "zombie_bowie_flourish", "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", cost, "bowie_upgrade", &"ZOMBIE_WEAPON_BOWIE_BUY", "bowie", undefined );
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie" );
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie_upgraded" );
} }

View File

@ -1,476 +1,466 @@
#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_equipment; #include maps\mp\zombies\_zm_equipment;
#include maps/mp/zombies/_zm_utility; #include maps\mp\zombies\_zm_score;
#include maps/mp/_utility; #include maps\mp\zombies\_zm_audio;
#include common_scripts/utility; #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; for ( i = 0; i < trigs.size; i++ )
while ( i < trigs.size ) {
{ model = getent( trigs[i].target, "targetname" );
model = getent( trigs[ i ].target, "targetname" );
if ( isDefined( model ) ) if ( isdefined( model ) )
{ model hide();
model hide(); }
}
i++; array_thread( trigs, ::buy_claymores );
} level thread give_claymores_after_rounds();
array_thread( trigs, ::buy_claymores ); level.claymores_on_damage = ::satchel_damage;
level thread give_claymores_after_rounds(); level.pickup_claymores = ::pickup_claymores;
level.claymores_on_damage = ::satchel_damage; level.pickup_claymores_trigger_listener = ::pickup_claymores_trigger_listener;
level.pickup_claymores = ::pickup_claymores; level.claymore_detectiondot = cos( 70 );
level.pickup_claymores_trigger_listener = ::pickup_claymores_trigger_listener; level.claymore_detectionmindist = 20;
level.claymore_detectiondot = cos( 70 ); level._effect["claymore_laser"] = loadfx( "weapon/claymore/fx_claymore_laser" );
level.claymore_detectionmindist = 20;
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_WEAPON", "claymore_zm" ); 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; continue;
}
while ( who has_powerup_weapon() ) if ( who has_powerup_weapon() )
{ {
wait 0,1; wait 0.1;
} continue;
if ( is_player_valid( who ) ) }
{
if ( who.score >= self.zombie_cost ) if ( is_player_valid( who ) )
{ {
if ( !who is_player_placeable_mine( "claymore_zm" ) ) if ( who.score >= self.zombie_cost )
{ {
play_sound_at_pos( "purchase", self.origin ); if ( !who is_player_placeable_mine( "claymore_zm" ) )
who maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost ); {
who thread claymore_setup(); play_sound_at_pos( "purchase", self.origin );
who thread show_claymore_hint( "claymore_purchased" ); who maps\mp\zombies\_zm_score::minus_to_player_score( self.zombie_cost );
who thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" ); who thread claymore_setup();
if ( isDefined( self.stub ) ) who thread show_claymore_hint( "claymore_purchased" );
{ who thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" );
self.claymores_triggered = self.stub.claymores_triggered;
} if ( isdefined( self.stub ) )
if ( self.claymores_triggered == 0 ) self.claymores_triggered = self.stub.claymores_triggered;
{
model = getent( self.target, "targetname" ); if ( self.claymores_triggered == 0 )
if ( isDefined( model ) ) {
{ model = getent( self.target, "targetname" );
model thread maps/mp/zombies/_zm_weapons::weapon_show( who );
} if ( isdefined( model ) )
else model thread maps\mp\zombies\_zm_weapons::weapon_show( who );
{ else if ( isdefined( self.clientfieldname ) )
if ( isDefined( self.clientfieldname ) ) level setclientfield( self.clientfieldname, 1 );
{
level setclientfield( self.clientfieldname, 1 ); self.claymores_triggered = 1;
}
} if ( isdefined( self.stub ) )
self.claymores_triggered = 1; self.stub.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 = getentarray( "claymore_purchase", "targetname" ); trigs[i] setinvisibletoplayer( who );
i = 0; }
while ( i < trigs.size ) else
{ who thread show_claymore_hint( "already_purchased" );
trigs[ i ] setinvisibletoplayer( who ); }
i++; else
} {
} who play_sound_on_ent( "no_purchase" );
else who thread show_claymore_hint( "already_purchased" ); who maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon" );
} }
} }
} }
} }
claymore_unitrigger_update_prompt( player ) claymore_unitrigger_update_prompt( player )
{ {
if ( player is_player_placeable_mine( "claymore_zm" ) ) if ( player is_player_placeable_mine( "claymore_zm" ) )
{ {
self sethintstring( "" ); self sethintstring( "" );
self setcursorhint( "HINT_NOICON" ); self setcursorhint( "HINT_NOICON" );
return 0; return false;
} }
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
self setcursorhint( "HINT_WEAPON", "claymore_zm" ); self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
return 1; 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; {
while ( j < players.size ) for ( j = 0; j < players.size; j++ )
{ {
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++;
} wait 1;
} players = get_players();
j++; }
}
wait 1;
players = get_players();
}
} }
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" );
self notify( "claymore_watch" ); self notify( "claymore_watch" );
self endon( "claymore_watch" ); self endon( "claymore_watch" );
while ( 1 )
{ while ( true )
self waittill( "grenade_fire", claymore, weapname ); {
if ( weapname == "claymore_zm" ) self waittill( "grenade_fire", claymore, weapname );
{
claymore.owner = self; if ( weapname == "claymore_zm" )
claymore.team = self.team; {
self notify( "zmb_enable_claymore_prompt" ); claymore.owner = self;
if ( claymore claymore_safe_to_plant() ) claymore.team = self.team;
{ self notify( "zmb_enable_claymore_prompt" );
if ( isDefined( level.claymore_planted ) )
{ if ( claymore claymore_safe_to_plant() )
self thread [[ level.claymore_planted ]]( claymore ); {
} if ( isdefined( level.claymore_planted ) )
claymore thread claymore_detonation(); self thread [[ level.claymore_planted ]]( claymore );
claymore thread play_claymore_effects();
self maps/mp/zombies/_zm_stats::increment_client_stat( "claymores_planted" ); claymore thread claymore_detonation();
self maps/mp/zombies/_zm_stats::increment_player_stat( "claymores_planted" ); claymore thread play_claymore_effects();
break; self maps\mp\zombies\_zm_stats::increment_client_stat( "claymores_planted" );
} self maps\mp\zombies\_zm_stats::increment_player_stat( "claymores_planted" );
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" ); self setactionslot( 4, "weapon", "claymore_zm" );
self setactionslot( 4, "weapon", "claymore_zm" ); self setweaponammostock( "claymore_zm", 2 );
self setweaponammostock( "claymore_zm", 2 );
} }
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 giveweapon( "claymore_zm" ); player thread claymore_watch();
player set_player_placeable_mine( "claymore_zm" ); player giveweapon( "claymore_zm" );
player setactionslot( 4, "weapon", "claymore_zm" ); player set_player_placeable_mine( "claymore_zm" );
player setweaponammoclip( "claymore_zm", 0 ); player setactionslot( 4, "weapon", "claymore_zm" );
player notify( "zmb_enable_claymore_prompt" ); player setweaponammoclip( "claymore_zm", 0 );
} player notify( "zmb_enable_claymore_prompt" );
else }
{ else
clip_ammo = player getweaponammoclip( self.name ); {
clip_max_ammo = weaponclipsize( self.name ); clip_ammo = player getweaponammoclip( self.name );
if ( clip_ammo >= clip_max_ammo ) clip_max_ammo = weaponclipsize( self.name );
{
self destroy_ent(); if ( clip_ammo >= clip_max_ammo )
player notify( "zmb_disable_claymore_prompt" ); {
return; self destroy_ent();
} player notify( "zmb_disable_claymore_prompt" );
} return;
self pick_up(); }
clip_ammo = player getweaponammoclip( self.name ); }
clip_max_ammo = weaponclipsize( self.name );
if ( clip_ammo >= clip_max_ammo ) self pick_up();
{ clip_ammo = player getweaponammoclip( self.name );
player notify( "zmb_disable_claymore_prompt" ); clip_max_ammo = weaponclipsize( self.name );
}
player maps/mp/zombies/_zm_stats::increment_client_stat( "claymores_pickedup" ); if ( clip_ammo >= clip_max_ammo )
player maps/mp/zombies/_zm_stats::increment_player_stat( "claymores_pickedup" ); player notify( "zmb_disable_claymore_prompt" );
player maps\mp\zombies\_zm_stats::increment_client_stat( "claymores_pickedup" );
player maps\mp\zombies\_zm_stats::increment_player_stat( "claymores_pickedup" );
} }
pickup_claymores_trigger_listener( trigger, player ) pickup_claymores_trigger_listener( trigger, player )
{ {
self thread pickup_claymores_trigger_listener_enable( trigger, player ); self thread pickup_claymores_trigger_listener_enable( trigger, player );
self thread pickup_claymores_trigger_listener_disable( trigger, player ); self thread pickup_claymores_trigger_listener_disable( trigger, player );
} }
pickup_claymores_trigger_listener_enable( trigger, player ) pickup_claymores_trigger_listener_enable( trigger, player )
{ {
self endon( "delete" ); self endon( "delete" );
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" ); {
if ( !isDefined( trigger ) ) player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" );
{
return; if ( !isdefined( trigger ) )
} return;
trigger trigger_on();
trigger linkto( self ); trigger trigger_on();
} trigger linkto( self );
}
} }
pickup_claymores_trigger_listener_disable( trigger, player ) pickup_claymores_trigger_listener_disable( trigger, player )
{ {
self endon( "delete" ); self endon( "delete" );
self endon( "death" ); self endon( "death" );
while ( 1 )
{ while ( true )
player waittill( "zmb_disable_claymore_prompt" ); {
if ( !isDefined( trigger ) ) player waittill( "zmb_disable_claymore_prompt" );
{
return; if ( !isdefined( trigger ) )
} return;
trigger unlink();
trigger trigger_off(); trigger unlink();
} trigger trigger_off();
}
} }
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;
} }
claymore_detonation() claymore_detonation()
{ {
self endon( "death" ); self endon( "death" );
self waittill_not_moving(); self waittill_not_moving();
detonateradius = 96; detonateradius = 96;
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 2 ); damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 2 );
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 ); {
if ( isDefined( self.owner ) && ent == self.owner ) damagearea waittill( "trigger", ent );
{
continue; if ( isdefined( self.owner ) && ent == self.owner )
} continue;
while ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == self.team )
{ if ( isdefined( ent.pers ) && isdefined( ent.pers["team"] ) && ent.pers["team"] == self.team )
continue; continue;
}
if ( isDefined( ent.ignore_claymore ) && ent.ignore_claymore ) if ( isdefined( ent.ignore_claymore ) && ent.ignore_claymore )
{ continue;
continue;
} if ( !ent shouldaffectweaponobject( self ) )
while ( !ent shouldaffectweaponobject( self ) ) continue;
{
continue; if ( ent damageconetrace( self.origin, self ) > 0 )
} {
if ( ent damageconetrace( self.origin, self ) > 0 ) self playsound( "wpn_claymore_alert" );
{ wait 0.4;
self playsound( "wpn_claymore_alert" );
wait 0,4; if ( isdefined( self.owner ) )
if ( isDefined( self.owner ) ) self detonate( self.owner );
{ else
self detonate( self.owner ); self detonate( undefined );
}
else return;
{ }
self detonate( undefined ); }
}
return;
}
}
} }
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 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 ); {
if ( !isDefined( self ) ) self waittill( "damage", amount, attacker );
{
return; if ( !isdefined( self ) )
} return;
self.health = self.maxhealth;
while ( !isplayer( attacker ) ) self.health = self.maxhealth;
{
continue; if ( !isplayer( attacker ) )
} 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
else wait 0,05; 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 );
} }
reset_satchel_explode_this_frame() reset_satchel_explode_this_frame()
{ {
wait 0,05; wait 0.05;
level.satchelexplodethisframe = 0; level.satchelexplodethisframe = 0;
} }
play_claymore_effects() 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(); {
i = 0; players = get_players();
while ( i < players.size )
{ for ( i = 0; i < players.size; i++ )
if ( players[ i ] is_player_placeable_mine( "claymore_zm" ) ) {
{ if ( players[i] is_player_placeable_mine( "claymore_zm" ) )
players[ i ] giveweapon( "claymore_zm" ); {
players[ i ] set_player_placeable_mine( "claymore_zm" ); players[i] giveweapon( "claymore_zm" );
players[ i ] setactionslot( 4, "weapon", "claymore_zm" ); players[i] set_player_placeable_mine( "claymore_zm" );
players[ i ] setweaponammoclip( "claymore_zm", 2 ); players[i] setactionslot( 4, "weapon", "claymore_zm" );
} players[i] setweaponammoclip( "claymore_zm", 2 );
i++; }
} }
} }
} }
} }
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"; show_equipment_hint_text( text );
}
show_equipment_hint_text( text );
} }

View File

@ -1,120 +1,123 @@
#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;
} 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 );
level.use_tazer_impact_fx = 0; maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee" );
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_upgraded" );
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee" ); maps\mp\zombies\_zm_spawner::add_cusom_zombie_spawn_logic( ::watch_bodily_functions );
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee_upgraded" ); level._effect["fx_zmb_taser_vomit"] = loadfx( "maps/zombie/fx_zmb_taser_vomit" );
maps/mp/zombies/_zm_spawner::add_cusom_zombie_spawn_logic( ::watch_bodily_functions ); level._effect["fx_zmb_taser_flourish"] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" );
level._effect[ "fx_zmb_taser_vomit" ] = loadfx( "maps/zombie/fx_zmb_taser_vomit" );
level._effect[ "fx_zmb_taser_flourish" ] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" ); if ( level.script != "zm_transit" )
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; level.tazer_flourish_delay = 0.5;
} }
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 ( isdefined( self ) && isalive( self ) )
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; if ( type != "MOD_MELEE" )
} continue;
while ( type != "MOD_MELEE" )
{ if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped )
continue; continue;
}
if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped ) ch = randomint( 100 );
{
continue; if ( ch < 4 )
} playfxontag( level._effect["fx_zmb_taser_vomit"], self, "j_neck" );
ch = randomint( 100 );
if ( ch < 4 ) if ( level.use_tazer_impact_fx )
{ {
playfxontag( level._effect[ "fx_zmb_taser_vomit" ], self, "j_neck" ); tags = [];
} tags[0] = "J_Head";
if ( level.use_tazer_impact_fx ) tags[1] = "J_Neck";
{ playfxontag( level._effect["fx_zmb_tazer_impact"], self, random( tags ) );
tags = []; }
tags[ 0 ] = "J_Head"; }
tags[ 1 ] = "J_Neck";
playfxontag( level._effect[ "fx_zmb_tazer_impact" ], self, random( tags ) );
}
}
} }
onplayerconnect() onplayerconnect()
{ {
self thread onplayerspawned(); self thread onplayerspawned();
} }
onplayerspawned() onplayerspawned()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
{ for (;;)
self waittill( "spawned_player" ); {
self thread watchtazerknucklemelee(); self waittill( "spawned_player" );
}
self thread watchtazerknucklemelee();
}
} }
watchtazerknucklemelee() watchtazerknucklemelee()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
for ( ;; )
{ for (;;)
self waittill( "weapon_melee", weapon ); {
if ( weapon == "tazer_knuckles_zm" ) self waittill( "weapon_melee", weapon );
{
self tazerknuckle_melee(); if ( weapon == "tazer_knuckles_zm" )
} self tazerknuckle_melee();
} }
} }
tazerknuckle_melee() tazerknuckle_melee()
{ {
} }
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" ); {
wait level.tazer_flourish_delay; self endon( "weapon_change" );
self thread maps/mp/zombies/_zm_audio::playerexert( "hitmed" ); wait( level.tazer_flourish_delay );
self setclientfieldtoplayer( "tazer_flourish", 1 ); self thread maps\mp\zombies\_zm_audio::playerexert( "hitmed" );
wait_network_frame(); self setclientfieldtoplayer( "tazer_flourish", 1 );
self setclientfieldtoplayer( "tazer_flourish", 0 ); wait_network_frame();
} self setclientfieldtoplayer( "tazer_flourish", 0 );
}
} }

View File

@ -1,338 +1,327 @@
#include maps/mp/zombies/_zm_audio; // T6 GSC SOURCE
#include maps/mp/zombies/_zm_unitrigger; // Decompiled by https://github.com/xensik/gsc-tool
#include maps/mp/zombies/_zm_stats; #include common_scripts\utility;
#include maps/mp/zombies/_zm_magicbox; #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_magicbox;
#include common_scripts/utility; #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() main()
{ {
if ( !isDefined( level.weapon_locker_map ) ) if ( !isdefined( level.weapon_locker_map ) )
{ level.weapon_locker_map = level.script;
level.weapon_locker_map = level.script;
} level.weapon_locker_online = sessionmodeisonlinegame();
level.weapon_locker_online = sessionmodeisonlinegame(); weapon_lockers = getstructarray( "weapons_locker", "targetname" );
weapon_lockers = getstructarray( "weapons_locker", "targetname" ); array_thread( weapon_lockers, ::triggerweaponslockerwatch );
array_thread( weapon_lockers, ::triggerweaponslockerwatch );
} }
wl_has_stored_weapondata() wl_has_stored_weapondata()
{ {
if ( level.weapon_locker_online ) if ( level.weapon_locker_online )
{ return self has_stored_weapondata( level.weapon_locker_map );
return self has_stored_weapondata( level.weapon_locker_map ); else
} return isdefined( self.stored_weapon_data );
else
{
return isDefined( self.stored_weapon_data );
}
} }
wl_get_stored_weapondata() wl_get_stored_weapondata()
{ {
if ( level.weapon_locker_online ) if ( level.weapon_locker_online )
{ return self get_stored_weapondata( level.weapon_locker_map );
return self get_stored_weapondata( level.weapon_locker_map ); else
} return self.stored_weapon_data;
else
{
return self.stored_weapon_data;
}
} }
wl_clear_stored_weapondata() wl_clear_stored_weapondata()
{ {
if ( level.weapon_locker_online ) if ( level.weapon_locker_online )
{ self clear_stored_weapondata( level.weapon_locker_map );
self clear_stored_weapondata( level.weapon_locker_map ); else
} self.stored_weapon_data = undefined;
else
{
self.stored_weapon_data = undefined;
}
} }
wl_set_stored_weapondata( weapondata ) wl_set_stored_weapondata( weapondata )
{ {
if ( level.weapon_locker_online ) if ( level.weapon_locker_online )
{ self set_stored_weapondata( weapondata, level.weapon_locker_map );
self set_stored_weapondata( weapondata, level.weapon_locker_map ); else
} self.stored_weapon_data = weapondata;
else
{
self.stored_weapon_data = weapondata;
}
} }
triggerweaponslockerwatch() triggerweaponslockerwatch()
{ {
unitrigger_stub = spawnstruct(); unitrigger_stub = spawnstruct();
unitrigger_stub.origin = self.origin; unitrigger_stub.origin = self.origin;
if ( isDefined( self.script_angles ) )
{ if ( isdefined( self.script_angles ) )
unitrigger_stub.angles = self.script_angles; unitrigger_stub.angles = self.script_angles;
} else
else unitrigger_stub.angles = self.angles;
{
unitrigger_stub.angles = self.angles; unitrigger_stub.script_angles = unitrigger_stub.angles;
}
unitrigger_stub.script_angles = unitrigger_stub.angles; if ( isdefined( self.script_length ) )
if ( isDefined( self.script_length ) ) unitrigger_stub.script_length = self.script_length;
{ else
unitrigger_stub.script_length = self.script_length; unitrigger_stub.script_length = 16;
}
else if ( isdefined( self.script_width ) )
{ unitrigger_stub.script_width = self.script_width;
unitrigger_stub.script_length = 16; else
} unitrigger_stub.script_width = 32;
if ( isDefined( self.script_width ) )
{ if ( isdefined( self.script_height ) )
unitrigger_stub.script_width = self.script_width; unitrigger_stub.script_height = self.script_height;
} else
else unitrigger_stub.script_height = 64;
{
unitrigger_stub.script_width = 32; unitrigger_stub.origin -= anglestoright( unitrigger_stub.angles ) * unitrigger_stub.script_length / 2;
} unitrigger_stub.targetname = "weapon_locker";
if ( isDefined( self.script_height ) ) unitrigger_stub.cursor_hint = "HINT_NOICON";
{ unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
unitrigger_stub.script_height = self.script_height; unitrigger_stub.clientfieldname = "weapon_locker";
} maps\mp\zombies\_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
else unitrigger_stub.prompt_and_visibility_func = ::triggerweaponslockerthinkupdateprompt;
{ maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::triggerweaponslockerthink );
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 ) triggerweaponslockerisvalidweapon( weaponname )
{ {
weaponname = get_base_weapon_name( weaponname, 1 ); weaponname = get_base_weapon_name( weaponname, 1 );
if ( !is_weapon_included( weaponname ) )
{ if ( !is_weapon_included( weaponname ) )
return 0; return false;
}
if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) ) if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) )
{ return false;
return 0;
} return true;
return 1;
} }
triggerweaponslockerisvalidweaponpromptupdate( player, weaponname ) triggerweaponslockerisvalidweaponpromptupdate( player, weaponname )
{ {
retrievingweapon = player wl_has_stored_weapondata(); retrievingweapon = player wl_has_stored_weapondata();
if ( !retrievingweapon )
{ if ( !retrievingweapon )
weaponname = player get_nonalternate_weapon( weaponname ); {
if ( !triggerweaponslockerisvalidweapon( weaponname ) ) weaponname = player get_nonalternate_weapon( weaponname );
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" ); if ( !triggerweaponslockerisvalidweapon( weaponname ) )
} self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
else else
{ self sethintstring( &"ZOMBIE_WEAPON_LOCKER_STORE" );
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_STORE" ); }
} else
} {
else weapondata = player wl_get_stored_weapondata();
{
weapondata = player wl_get_stored_weapondata(); if ( isdefined( level.remap_weapon_locker_weapons ) )
if ( isDefined( level.remap_weapon_locker_weapons ) ) weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
{
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons ); weapontogive = weapondata["name"];
} primaries = player getweaponslistprimaries();
weapontogive = weapondata[ "name" ]; maxweapons = get_player_weapon_limit( player );
primaries = player getweaponslistprimaries(); weaponname = player get_nonalternate_weapon( weaponname );
maxweapons = get_player_weapon_limit( player );
weaponname = player get_nonalternate_weapon( weaponname ); if ( isdefined( primaries ) && primaries.size >= maxweapons || weapontogive == weaponname )
if ( isDefined( primaries ) || primaries.size >= maxweapons && weapontogive == weaponname ) {
{ if ( !triggerweaponslockerisvalidweapon( weaponname ) )
if ( !triggerweaponslockerisvalidweapon( weaponname ) ) {
{ self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" ); return;
return; }
} }
}
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_GRAB" ); self sethintstring( &"ZOMBIE_WEAPON_LOCKER_GRAB" );
} }
} }
triggerweaponslockerthinkupdateprompt( player ) triggerweaponslockerthinkupdateprompt( player )
{ {
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() ); self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
return 1; return 1;
} }
triggerweaponslockerthink() triggerweaponslockerthink()
{ {
self.parent_player thread triggerweaponslockerweaponchangethink( self ); self.parent_player thread triggerweaponslockerweaponchangethink( self );
while ( 1 )
{ while ( true )
self waittill( "trigger", player ); {
retrievingweapon = player wl_has_stored_weapondata(); self waittill( "trigger", player );
if ( !retrievingweapon )
{ retrievingweapon = player wl_has_stored_weapondata();
curweapon = player getcurrentweapon();
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon ); if ( !retrievingweapon )
while ( !triggerweaponslockerisvalidweapon( curweapon ) ) {
{ curweapon = player getcurrentweapon();
continue; curweapon = player maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( curweapon );
}
weapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player ); if ( !triggerweaponslockerisvalidweapon( curweapon ) )
player wl_set_stored_weapondata( weapondata ); 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" ); assert( curweapon == weapondata["name"], "weapon data does not match" );
#/ #/
player takeweapon( curweapon ); player takeweapon( curweapon );
primaries = player getweaponslistprimaries(); primaries = player getweaponslistprimaries();
if ( isDefined( primaries[ 0 ] ) )
{ if ( isdefined( primaries[0] ) )
player switchtoweapon( primaries[ 0 ] ); player switchtoweapon( primaries[0] );
} else
else player maps\mp\zombies\_zm_weapons::give_fallback_weapon();
{
player maps/mp/zombies/_zm_weapons::give_fallback_weapon(); self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
} player playsoundtoplayer( "evt_fridge_locker_close", player );
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() ); player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "weapon_storage" );
player playsoundtoplayer( "evt_fridge_locker_close", player ); }
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "weapon_storage" ); else
} {
else curweapon = player getcurrentweapon();
{ primaries = player getweaponslistprimaries();
curweapon = player getcurrentweapon(); weapondata = player wl_get_stored_weapondata();
primaries = player getweaponslistprimaries();
weapondata = player wl_get_stored_weapondata(); if ( isdefined( level.remap_weapon_locker_weapons ) )
if ( isDefined( level.remap_weapon_locker_weapons ) ) weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
{
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons ); weapontogive = weapondata["name"];
}
weapontogive = weapondata[ "name" ]; if ( !triggerweaponslockerisvalidweapon( weapontogive ) )
while ( !triggerweaponslockerisvalidweapon( weapontogive ) ) {
{ player playlocalsound( level.zmb_laugh_alias );
player playlocalsound( level.zmb_laugh_alias ); player wl_clear_stored_weapondata();
player wl_clear_stored_weapondata(); self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
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 ); curweap_base = maps\mp\zombies\_zm_weapons::get_base_weapon_name( curweapon, 1 );
while ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base ) weap_base = maps\mp\zombies\_zm_weapons::get_base_weapon_name( weapontogive, 1 );
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" ); if ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base )
wait 3; {
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() ); self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
} wait 3;
maxweapons = get_player_weapon_limit( player ); self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
if ( isDefined( primaries ) || primaries.size >= maxweapons && weapontogive == curweapon ) continue;
{ }
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
while ( !triggerweaponslockerisvalidweapon( curweapon ) ) maxweapons = get_player_weapon_limit( player );
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" ); if ( isdefined( primaries ) && primaries.size >= maxweapons || weapontogive == curweapon )
wait 3; {
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() ); curweapon = player maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( curweapon );
}
curweapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player ); if ( !triggerweaponslockerisvalidweapon( curweapon ) )
player takeweapon( curweapondata[ "name" ] ); {
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata ); self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
player wl_clear_stored_weapondata(); wait 3;
player wl_set_stored_weapondata( curweapondata ); self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
player switchtoweapon( weapondata[ "name" ] ); continue;
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() ); }
}
else curweapondata = player maps\mp\zombies\_zm_weapons::get_player_weapondata( player );
{ player takeweapon( curweapondata["name"] );
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "wall_withdrawl" ); player maps\mp\zombies\_zm_weapons::weapondata_give( weapondata );
player wl_clear_stored_weapondata(); player wl_clear_stored_weapondata();
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata ); player wl_set_stored_weapondata( curweapondata );
player switchtoweapon( weapondata[ "name" ] ); player switchtoweapon( weapondata["name"] );
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() ); self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
} }
level notify( "weapon_locker_grab" ); else
player playsoundtoplayer( "evt_fridge_locker_open", player ); {
} player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "wall_withdrawl" );
wait 0,5; 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 ) triggerweaponslockerweaponchangethink( trigger )
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "death" ); self endon( "death" );
trigger endon( "kill_trigger" ); trigger endon( "kill_trigger" );
while ( 1 )
{ while ( true )
self waittill( "weapon_change", newweapon ); {
trigger triggerweaponslockerisvalidweaponpromptupdate( self, newweapon ); self waittill( "weapon_change", newweapon );
}
trigger triggerweaponslockerisvalidweaponpromptupdate( self, newweapon );
}
} }
add_weapon_locker_mapping( fromweapon, toweapon ) add_weapon_locker_mapping( fromweapon, toweapon )
{ {
if ( !isDefined( level.remap_weapon_locker_weapons ) ) if ( !isdefined( level.remap_weapon_locker_weapons ) )
{ level.remap_weapon_locker_weapons = [];
level.remap_weapon_locker_weapons = [];
} level.remap_weapon_locker_weapons[fromweapon] = toweapon;
level.remap_weapon_locker_weapons[ fromweapon ] = toweapon;
} }
remap_weapon( weapondata, maptable ) remap_weapon( weapondata, maptable )
{ {
name = get_base_name( weapondata[ "name" ] ); name = get_base_name( weapondata["name"] );
att = get_attachment_name( weapondata[ "name" ] ); att = get_attachment_name( weapondata["name"] );
if ( isDefined( maptable[ name ] ) )
{ if ( isdefined( maptable[name] ) )
weapondata[ "name" ] = maptable[ name ]; {
name = weapondata[ "name" ]; weapondata["name"] = maptable[name];
if ( is_weapon_upgraded( name ) ) name = weapondata["name"];
{
if ( isDefined( att ) && weapon_supports_attachments( name ) ) if ( is_weapon_upgraded( name ) )
{ {
base = get_base_weapon_name( name, 1 ); if ( isdefined( att ) && weapon_supports_attachments( name ) )
if ( !weapon_supports_this_attachment( base, att ) ) {
{ base = get_base_weapon_name( name, 1 );
att = random_attachment( base );
} if ( !weapon_supports_this_attachment( base, att ) )
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att; att = random_attachment( base );
}
else weapondata["name"] = weapondata["name"] + "+" + att;
{ }
if ( weapon_supports_default_attachment( name ) ) else if ( weapon_supports_default_attachment( name ) )
{ {
att = default_attachment( name ); att = default_attachment( name );
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att; weapondata["name"] = weapondata["name"] + "+" + att;
} }
} }
} }
} else
else return weapondata;
{
return weapondata; name = weapondata["name"];
} dw_name = weapondualwieldweaponname( name );
name = weapondata[ "name" ]; alt_name = weaponaltweaponname( name );
dw_name = weapondualwieldweaponname( name );
alt_name = weaponaltweaponname( name ); if ( name != "none" )
if ( name != "none" ) {
{ weapondata["clip"] = int( min( weapondata["clip"], weaponclipsize( name ) ) );
weapondata[ "clip" ] = int( min( weapondata[ "clip" ], weaponclipsize( name ) ) ); weapondata["stock"] = int( min( weapondata["stock"], weaponmaxammo( name ) ) );
weapondata[ "stock" ] = int( min( weapondata[ "stock" ], weaponmaxammo( name ) ) ); }
}
if ( dw_name != "none" ) if ( dw_name != "none" )
{ weapondata["lh_clip"] = int( min( weapondata["lh_clip"], weaponclipsize( dw_name ) ) );
weapondata[ "lh_clip" ] = int( min( weapondata[ "lh_clip" ], weaponclipsize( dw_name ) ) );
} if ( alt_name != "none" )
if ( alt_name != "none" ) {
{ weapondata["alt_clip"] = int( min( weapondata["alt_clip"], weaponclipsize( alt_name ) ) );
weapondata[ "alt_clip" ] = int( min( weapondata[ "alt_clip" ], weaponclipsize( alt_name ) ) ); weapondata["alt_stock"] = int( min( weapondata["alt_stock"], weaponmaxammo( alt_name ) ) );
weapondata[ "alt_stock" ] = int( min( weapondata[ "alt_stock" ], weaponmaxammo( alt_name ) ) ); }
}
weapondata[ "dw_name" ] = dw_name; weapondata["dw_name"] = dw_name;
weapondata[ "alt_name" ] = alt_name; weapondata["alt_name"] = alt_name;
return weapondata; return weapondata;
} }

View File

@ -1,7 +1,9 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
a[ 0 ] = "c_zom_zombie_buried_sgirl_head1_mp"; a[0] = "c_zom_zombie_buried_sgirl_head1_mp";
a[ 1 ] = "c_zom_zombie_buried_sgirl_head2_mp"; a[1] = "c_zom_zombie_buried_sgirl_head2_mp";
return a; return a;
} }

View File

@ -1,8 +1,10 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
a[ 0 ] = "c_zom_zombie_buried_sgirl_body1_mp"; a[0] = "c_zom_zombie_buried_sgirl_body1_mp";
a[ 1 ] = "c_zom_zombie_buried_sgirl_body2_mp"; a[1] = "c_zom_zombie_buried_sgirl_body2_mp";
a[ 2 ] = "c_zom_zombie_buried_sgirl_body3_mp"; a[2] = "c_zom_zombie_buried_sgirl_body3_mp";
return a; return a;
} }

View File

@ -1,11 +1,13 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
main() main()
{ {
a[ 0 ] = "c_zom_zombie_buried_sgirl_hair1"; a[0] = "c_zom_zombie_buried_sgirl_hair1";
a[ 1 ] = "c_zom_zombie_buried_sgirl_hair1_2"; a[1] = "c_zom_zombie_buried_sgirl_hair1_2";
a[ 2 ] = "c_zom_zombie_buried_sgirl_hair1_3"; a[2] = "c_zom_zombie_buried_sgirl_hair1_3";
a[ 3 ] = "c_zom_zombie_buried_sgirl_hair2"; a[3] = "c_zom_zombie_buried_sgirl_hair2";
a[ 4 ] = "c_zom_zombie_buried_sgirl_hair2_2"; a[4] = "c_zom_zombie_buried_sgirl_hair2_2";
a[ 5 ] = "c_zom_zombie_buried_sgirl_hair1_3"; a[5] = "c_zom_zombie_buried_sgirl_hair1_3";
return a; return a;
} }