mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-07 17:37:50 -05:00
[Buried] Added gsc-tool decompiled GSCs.
This commit is contained in:
parent
0d2c068adb
commit
0d8e9c835a
@ -1,12 +1,14 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self setmodel( "c_zom_player_engineer_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
self setmodel( "c_zom_player_engineer_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
}
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "c_zom_player_engineer_fb" );
|
||||
precachemodel( "c_zom_player_engineer_fb" );
|
||||
}
|
||||
|
@ -1,12 +1,14 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self setmodel( "c_zom_player_farmgirl_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
self setmodel( "c_zom_player_farmgirl_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
}
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "c_zom_player_farmgirl_fb" );
|
||||
precachemodel( "c_zom_player_farmgirl_fb" );
|
||||
}
|
||||
|
@ -1,12 +1,14 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self setmodel( "c_zom_player_oldman_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
self setmodel( "c_zom_player_oldman_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
}
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "c_zom_player_oldman_fb" );
|
||||
precachemodel( "c_zom_player_oldman_fb" );
|
||||
}
|
||||
|
@ -1,12 +1,14 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self setmodel( "c_zom_player_reporter_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
self setmodel( "c_zom_player_reporter_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
}
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "c_zom_player_reporter_fb" );
|
||||
precachemodel( "c_zom_player_reporter_fb" );
|
||||
}
|
||||
|
@ -1,12 +1,14 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self setmodel( "c_zom_zombie_buried_sgirl_player_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
self setmodel( "c_zom_zombie_buried_sgirl_player_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
}
|
||||
|
||||
precache()
|
||||
{
|
||||
precachemodel( "c_zom_zombie_buried_sgirl_player_fb" );
|
||||
precachemodel( "c_zom_zombie_buried_sgirl_player_fb" );
|
||||
}
|
||||
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
@ -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" );
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,45 +1,46 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/zombies/_zm_ai_dogs;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes_zm\_zm_gametype;
|
||||
#include maps\mp\zombies\_zm_stats;
|
||||
#include maps\mp\zombies\_zm_ai_dogs;
|
||||
#include maps\mp\zombies\_zm;
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::main();
|
||||
level.onprecachegametype = ::onprecachegametype;
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level._game_module_custom_spawn_init_func = maps/mp/gametypes_zm/_zm_gametype::custom_spawn_init_func;
|
||||
level._game_module_stat_update_func = maps/mp/zombies/_zm_stats::survival_classic_custom_stat_update;
|
||||
maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zstandard" );
|
||||
maps\mp\gametypes_zm\_zm_gametype::main();
|
||||
level.onprecachegametype = ::onprecachegametype;
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level._game_module_custom_spawn_init_func = maps\mp\gametypes_zm\_zm_gametype::custom_spawn_init_func;
|
||||
level._game_module_stat_update_func = maps\mp\zombies\_zm_stats::survival_classic_custom_stat_update;
|
||||
maps\mp\gametypes_zm\_zm_gametype::post_gametype_main( "zstandard" );
|
||||
}
|
||||
|
||||
onprecachegametype() //checked matches cerberus output
|
||||
onprecachegametype()
|
||||
{
|
||||
level.playersuicideallowed = 1;
|
||||
level.canplayersuicide = ::canplayersuicide;
|
||||
level.suicide_weapon = "death_self_zm";
|
||||
precacheitem( "death_self_zm" );
|
||||
maps/mp/zombies/_zm_ai_dogs::init();
|
||||
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zstandard" );
|
||||
level.playersuicideallowed = 1;
|
||||
level.canplayersuicide = ::canplayersuicide;
|
||||
level.suicide_weapon = "death_self_zm";
|
||||
precacheitem( "death_self_zm" );
|
||||
maps\mp\zombies\_zm_ai_dogs::init();
|
||||
maps\mp\gametypes_zm\_zm_gametype::rungametypeprecache( "zstandard" );
|
||||
}
|
||||
|
||||
onstartgametype() //checked matches cerberus output
|
||||
onstartgametype()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_classic_gametype();
|
||||
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zstandard", ::zstandard_main );
|
||||
maps\mp\gametypes_zm\_zm_gametype::setup_classic_gametype();
|
||||
maps\mp\gametypes_zm\_zm_gametype::rungametypemain( "zstandard", ::zstandard_main );
|
||||
}
|
||||
|
||||
zstandard_main() //checked matches cerberus output
|
||||
zstandard_main()
|
||||
{
|
||||
level.dog_rounds_allowed = getgametypesetting( "allowdogs" );
|
||||
if ( level.dog_rounds_allowed )
|
||||
{
|
||||
maps/mp/zombies/_zm_ai_dogs::enable_dog_rounds();
|
||||
}
|
||||
level thread maps/mp/zombies/_zm::round_start();
|
||||
level thread maps/mp/gametypes_zm/_zm_gametype::kill_all_zombies();
|
||||
level.dog_rounds_allowed = getgametypesetting( "allowdogs" );
|
||||
|
||||
if ( level.dog_rounds_allowed )
|
||||
maps\mp\zombies\_zm_ai_dogs::enable_dog_rounds();
|
||||
|
||||
level thread maps\mp\zombies\_zm::round_start();
|
||||
level thread maps\mp\gametypes_zm\_zm_gametype::kill_all_zombies();
|
||||
}
|
||||
|
@ -1,51 +1,55 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
register()
|
||||
{
|
||||
game[ "teamset" ] = [];
|
||||
game[ "teamset" ][ "cdc" ] = ::cdc;
|
||||
game["teamset"] = [];
|
||||
game["teamset"]["cdc"] = ::cdc;
|
||||
}
|
||||
|
||||
level_init()
|
||||
{
|
||||
game[ "allies" ] = "cdc";
|
||||
game[ "axis" ] = "cia";
|
||||
setdvar( "g_TeamName_Allies", &"ZMUI_CDC_SHORT" );
|
||||
setdvar( "g_TeamName_Axis", &"ZMUI_CIA_SHORT" );
|
||||
game[ "strings" ][ "allies_win" ] = &"ZM_CDC_WIN_MATCH";
|
||||
game[ "strings" ][ "allies_win_round" ] = &"ZM_CDC_WIN_ROUND";
|
||||
game[ "strings" ][ "allies_mission_accomplished" ] = &"ZM_CDC_MISSION_ACCOMPLISHED";
|
||||
game[ "strings" ][ "allies_eliminated" ] = &"ZM_CDC_ELIMINATED";
|
||||
game[ "strings" ][ "allies_forfeited" ] = &"ZM_CDC_FORFEITED";
|
||||
game[ "strings" ][ "allies_name" ] = &"ZM_CDC_NAME";
|
||||
game[ "music" ][ "spawn_allies" ] = "SPAWN_OPS";
|
||||
game[ "music" ][ "victory_allies" ] = "mus_victory_usa";
|
||||
game[ "icons" ][ "allies" ] = "faction_cdc";
|
||||
game[ "colors" ][ "allies" ] = ( 0, 0, 0 );
|
||||
game[ "voice" ][ "allies" ] = "vox_st6_";
|
||||
setdvar( "scr_allies", "marines" );
|
||||
game[ "strings" ][ "axis_win" ] = &"ZM_CIA_WIN_MATCH";
|
||||
game[ "strings" ][ "axis_win_round" ] = &"ZM_CIA_WIN_ROUND";
|
||||
game[ "strings" ][ "axis_mission_accomplished" ] = &"ZM_CIA_MISSION_ACCOMPLISHED";
|
||||
game[ "strings" ][ "axis_eliminated" ] = &"ZM_CIA_ELIMINATED";
|
||||
game[ "strings" ][ "axis_forfeited" ] = &"ZM_CIA_FORFEITED";
|
||||
game[ "strings" ][ "axis_name" ] = &"ZM_CIA_NAME";
|
||||
game[ "music" ][ "spawn_axis" ] = "SPAWN_RUS";
|
||||
game[ "music" ][ "victory_axis" ] = "mus_victory_soviet";
|
||||
game[ "icons" ][ "axis" ] = "faction_cia";
|
||||
game[ "colors" ][ "axis" ] = ( 0,65, 0,57, 0,41 );
|
||||
game[ "voice" ][ "axis" ] = "vox_pmc_";
|
||||
game["allies"] = "cdc";
|
||||
game["axis"] = "cia";
|
||||
setdvar( "g_TeamName_Allies", &"ZMUI_CDC_SHORT" );
|
||||
setdvar( "g_TeamName_Axis", &"ZMUI_CIA_SHORT" );
|
||||
game["strings"]["allies_win"] = &"ZM_CDC_WIN_MATCH";
|
||||
game["strings"]["allies_win_round"] = &"ZM_CDC_WIN_ROUND";
|
||||
game["strings"]["allies_mission_accomplished"] = &"ZM_CDC_MISSION_ACCOMPLISHED";
|
||||
game["strings"]["allies_eliminated"] = &"ZM_CDC_ELIMINATED";
|
||||
game["strings"]["allies_forfeited"] = &"ZM_CDC_FORFEITED";
|
||||
game["strings"]["allies_name"] = &"ZM_CDC_NAME";
|
||||
game["music"]["spawn_allies"] = "SPAWN_OPS";
|
||||
game["music"]["victory_allies"] = "mus_victory_usa";
|
||||
game["icons"]["allies"] = "faction_cdc";
|
||||
game["colors"]["allies"] = ( 0, 0, 0 );
|
||||
game["voice"]["allies"] = "vox_st6_";
|
||||
setdvar( "scr_allies", "marines" );
|
||||
game["strings"]["axis_win"] = &"ZM_CIA_WIN_MATCH";
|
||||
game["strings"]["axis_win_round"] = &"ZM_CIA_WIN_ROUND";
|
||||
game["strings"]["axis_mission_accomplished"] = &"ZM_CIA_MISSION_ACCOMPLISHED";
|
||||
game["strings"]["axis_eliminated"] = &"ZM_CIA_ELIMINATED";
|
||||
game["strings"]["axis_forfeited"] = &"ZM_CIA_FORFEITED";
|
||||
game["strings"]["axis_name"] = &"ZM_CIA_NAME";
|
||||
game["music"]["spawn_axis"] = "SPAWN_RUS";
|
||||
game["music"]["victory_axis"] = "mus_victory_soviet";
|
||||
game["icons"]["axis"] = "faction_cia";
|
||||
game["colors"]["axis"] = ( 0.65, 0.57, 0.41 );
|
||||
game["voice"]["axis"] = "vox_pmc_";
|
||||
}
|
||||
|
||||
cdc()
|
||||
{
|
||||
allies();
|
||||
axis();
|
||||
allies();
|
||||
axis();
|
||||
}
|
||||
|
||||
allies()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
axis()
|
||||
{
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,184 +1,195 @@
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\gametypes_zm\_globallogic_score;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !is_gametype_active( "zclassic" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level thread achievement_buried_sidequest();
|
||||
level thread achievement_im_your_huckleberry();
|
||||
level.achievement_sound_func = ::achievement_sound_func;
|
||||
onplayerconnect_callback( ::onplayerconnect );
|
||||
if ( !is_gametype_active( "zclassic" ) )
|
||||
return;
|
||||
|
||||
level thread achievement_buried_sidequest();
|
||||
level thread achievement_im_your_huckleberry();
|
||||
level.achievement_sound_func = ::achievement_sound_func;
|
||||
onplayerconnect_callback( ::onplayerconnect );
|
||||
}
|
||||
|
||||
achievement_sound_func( achievement_name_lower )
|
||||
{
|
||||
if ( !sessionmodeisonlinegame() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self thread do_player_general_vox( "general", "achievement" );
|
||||
if ( !sessionmodeisonlinegame() )
|
||||
return;
|
||||
|
||||
self thread do_player_general_vox( "general", "achievement" );
|
||||
}
|
||||
|
||||
init_player_achievement_stats()
|
||||
{
|
||||
if ( !is_gametype_active( "zclassic" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
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_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_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_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_fsirt_against_the_wall", 0 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc3_when_the_revolution_comes", 0 );
|
||||
if ( !is_gametype_active( "zclassic" ) )
|
||||
return;
|
||||
|
||||
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_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_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_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_fsirt_against_the_wall", 0 );
|
||||
self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zm_dlc3_when_the_revolution_comes", 0 );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
self thread achievement_ectoplasmic_residue();
|
||||
self thread achievement_death_from_below();
|
||||
self thread achievement_candygram();
|
||||
self thread achievement_awaken_the_gazebo();
|
||||
self thread achievement_revisionist_historian();
|
||||
self thread achievement_mazed_and_confused();
|
||||
self thread achievement_fsirt_against_the_wall();
|
||||
self thread achievement_when_the_revolution_comes();
|
||||
self thread achievement_ectoplasmic_residue();
|
||||
self thread achievement_death_from_below();
|
||||
self thread achievement_candygram();
|
||||
self thread achievement_awaken_the_gazebo();
|
||||
self thread achievement_revisionist_historian();
|
||||
self thread achievement_mazed_and_confused();
|
||||
self thread achievement_fsirt_against_the_wall();
|
||||
self thread achievement_when_the_revolution_comes();
|
||||
}
|
||||
|
||||
achievement_buried_sidequest()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level waittill_any( "sq_richtofen_complete", "sq_maxis_complete" );
|
||||
level endon( "end_game" );
|
||||
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()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
num_barriers_broken = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "sloth_breaks_barrier" );
|
||||
num_barriers_broken++;
|
||||
if ( num_barriers_broken >= 8 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
level endon( "end_game" );
|
||||
num_barriers_broken = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "sloth_breaks_barrier" );
|
||||
|
||||
num_barriers_broken++;
|
||||
|
||||
if ( num_barriers_broken >= 8 )
|
||||
break;
|
||||
}
|
||||
/#
|
||||
|
||||
#/
|
||||
level giveachievement_wrapper( "ZM_DLC3_IM_YOUR_HUCKLEBERRY", 1 );
|
||||
level giveachievement_wrapper( "ZM_DLC3_IM_YOUR_HUCKLEBERRY", 1 );
|
||||
}
|
||||
|
||||
achievement_ectoplasmic_residue()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "player_received_ghost_round_free_perk" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
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()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
num_subwoofer_deaths = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "zombie_subwoofer_kill" );
|
||||
num_subwoofer_deaths++;
|
||||
if ( num_subwoofer_deaths >= 10 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
num_subwoofer_deaths = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "zombie_subwoofer_kill" );
|
||||
|
||||
num_subwoofer_deaths++;
|
||||
|
||||
if ( num_subwoofer_deaths >= 10 )
|
||||
break;
|
||||
}
|
||||
/#
|
||||
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_DLC3_DEATH_FROM_BELOW" );
|
||||
self giveachievement_wrapper( "ZM_DLC3_DEATH_FROM_BELOW" );
|
||||
}
|
||||
|
||||
achievement_candygram()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "player_gives_sloth_candy" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
self waittill( "player_gives_sloth_candy" );
|
||||
/#
|
||||
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_DLC3_CANDYGRAM" );
|
||||
self giveachievement_wrapper( "ZM_DLC3_CANDYGRAM" );
|
||||
}
|
||||
|
||||
achievement_awaken_the_gazebo()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
level endon( "bank_withdrawal" );
|
||||
level endon( "bank_teller_used" );
|
||||
level endon( "weapon_locker_grab" );
|
||||
self waittill( "pap_taken" );
|
||||
if ( level.round_number > 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
level endon( "bank_withdrawal" );
|
||||
level endon( "bank_teller_used" );
|
||||
level endon( "weapon_locker_grab" );
|
||||
|
||||
self waittill( "pap_taken" );
|
||||
|
||||
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()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "player_activates_timebomb" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
self waittill( "player_activates_timebomb" );
|
||||
/#
|
||||
|
||||
#/
|
||||
self giveachievement_wrapper( "ZM_DLC3_REVISIONIST_HISTORIAN" );
|
||||
self giveachievement_wrapper( "ZM_DLC3_REVISIONIST_HISTORIAN" );
|
||||
}
|
||||
|
||||
achievement_mazed_and_confused()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "player_stayed_in_maze_for_entire_high_level_round" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
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()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "player_upgraded_lsat_from_wall" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
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()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "player_used_fountain_teleporter" );
|
||||
level endon( "end_game" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
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
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,428 +1,393 @@
|
||||
#include maps/mp/zombies/_zm_ai_basic;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_spawner;
|
||||
#include maps\mp\zombies\_zm_zonemgr;
|
||||
#include maps\mp\zombies\_zm_ai_basic;
|
||||
|
||||
zombie_tracking_init()
|
||||
{
|
||||
level.zombie_respawned_health = [];
|
||||
if ( !isDefined( level.zombie_tracking_dist ) )
|
||||
{
|
||||
level.zombie_tracking_dist = 1600;
|
||||
}
|
||||
if ( !isDefined( level.zombie_tracking_high ) )
|
||||
{
|
||||
level.zombie_tracking_high = 600;
|
||||
}
|
||||
if ( !isDefined( level.zombie_tracking_wait ) )
|
||||
{
|
||||
level.zombie_tracking_wait = 0,4;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
zombies = get_round_enemy_array();
|
||||
if ( !isDefined( zombies ) || isDefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
|
||||
{
|
||||
wait level.zombie_tracking_wait;
|
||||
}
|
||||
}
|
||||
else i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( isDefined( zombies[ i ] ) && isDefined( zombies[ i ].ignore_distance_tracking ) && !zombies[ i ].ignore_distance_tracking && isDefined( zombies[ i ].ignoreall ) && !zombies[ i ].ignoreall )
|
||||
{
|
||||
zombies[ i ] thread delete_zombie_noone_looking( level.zombie_tracking_dist, level.zombie_tracking_high );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait level.zombie_tracking_wait;
|
||||
}
|
||||
level.zombie_respawned_health = [];
|
||||
|
||||
if ( !isdefined( level.zombie_tracking_dist ) )
|
||||
level.zombie_tracking_dist = 1600;
|
||||
|
||||
if ( !isdefined( level.zombie_tracking_high ) )
|
||||
level.zombie_tracking_high = 600;
|
||||
|
||||
if ( !isdefined( level.zombie_tracking_wait ) )
|
||||
level.zombie_tracking_wait = 0.4;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
zombies = get_round_enemy_array();
|
||||
|
||||
if ( !isdefined( zombies ) || isdefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking )
|
||||
{
|
||||
wait( level.zombie_tracking_wait );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( i = 0; i < zombies.size; i++ )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
delete_zombie_noone_looking( how_close, how_high )
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( self can_be_deleted_from_buried_special_zones() )
|
||||
{
|
||||
self.inview = 0;
|
||||
self.player_close = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( how_close ) )
|
||||
{
|
||||
how_close = 1000;
|
||||
}
|
||||
if ( !isDefined( how_high ) )
|
||||
{
|
||||
how_high = 500;
|
||||
}
|
||||
if ( isDefined( self.has_legs ) && !self.has_legs )
|
||||
{
|
||||
how_close *= 1,5;
|
||||
}
|
||||
distance_squared_check = how_close * how_close;
|
||||
height_squared_check = how_high * how_high;
|
||||
too_far_dist = distance_squared_check * 3;
|
||||
if ( isDefined( level.zombie_tracking_too_far_dist ) )
|
||||
{
|
||||
too_far_dist = level.zombie_tracking_too_far_dist * level.zombie_tracking_too_far_dist;
|
||||
}
|
||||
self.inview = 0;
|
||||
self.player_close = 0;
|
||||
players = get_players();
|
||||
_a98 = players;
|
||||
_k98 = getFirstArrayKey( _a98 );
|
||||
while ( isDefined( _k98 ) )
|
||||
{
|
||||
player = _a98[ _k98 ];
|
||||
if ( player.sessionstate == "spectator" )
|
||||
{
|
||||
}
|
||||
else if ( isDefined( player.laststand ) && player.laststand && isDefined( self.favoriteenemy ) && self.favoriteenemy == player )
|
||||
{
|
||||
if ( !self can_zombie_see_any_player() )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
can_be_seen = self player_can_see_me( player );
|
||||
distance_squared = distancesquared( self.origin, player.origin );
|
||||
if ( can_be_seen && distance_squared < too_far_dist )
|
||||
{
|
||||
self.inview++;
|
||||
}
|
||||
if ( distance_squared < distance_squared_check && abs( self.origin[ 2 ] - player.origin[ 2 ] ) < how_high )
|
||||
{
|
||||
self.player_close++;
|
||||
}
|
||||
}
|
||||
_k98 = getNextArrayKey( _a98, _k98 );
|
||||
}
|
||||
}
|
||||
wait 0,1;
|
||||
if ( self.inview == 0 && self.player_close == 0 )
|
||||
{
|
||||
if ( !isDefined( self.animname ) || isDefined( self.animname ) && self.animname != "zombie" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.electrified ) && self.electrified == 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
zombies = getaiarray( "axis" );
|
||||
if ( ( zombies.size + level.zombie_total ) > 24 || ( zombies.size + level.zombie_total ) <= 24 && self.health >= self.maxhealth )
|
||||
{
|
||||
if ( isDefined( self.exclude_distance_cleanup_adding_to_total ) && !self.exclude_distance_cleanup_adding_to_total && isDefined( self.isscreecher ) && !self.isscreecher )
|
||||
{
|
||||
level.zombie_total++;
|
||||
if ( self.health < level.zombie_health )
|
||||
{
|
||||
level.zombie_respawned_health[ level.zombie_respawned_health.size ] = self.health;
|
||||
}
|
||||
}
|
||||
}
|
||||
self maps/mp/zombies/_zm_spawner::reset_attack_spot();
|
||||
self notify( "zombie_delete" );
|
||||
if ( isDefined( self.anchor ) )
|
||||
{
|
||||
self.anchor delete();
|
||||
}
|
||||
self delete();
|
||||
recalc_zombie_array();
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
if ( self can_be_deleted_from_buried_special_zones() )
|
||||
{
|
||||
self.inview = 0;
|
||||
self.player_close = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isdefined( how_close ) )
|
||||
how_close = 1000;
|
||||
|
||||
if ( !isdefined( how_high ) )
|
||||
how_high = 500;
|
||||
|
||||
if ( !( isdefined( self.has_legs ) && self.has_legs ) )
|
||||
how_close *= 1.5;
|
||||
|
||||
distance_squared_check = how_close * how_close;
|
||||
height_squared_check = how_high * how_high;
|
||||
too_far_dist = distance_squared_check * 3;
|
||||
|
||||
if ( isdefined( level.zombie_tracking_too_far_dist ) )
|
||||
too_far_dist = level.zombie_tracking_too_far_dist * level.zombie_tracking_too_far_dist;
|
||||
|
||||
self.inview = 0;
|
||||
self.player_close = 0;
|
||||
players = get_players();
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
if ( player.sessionstate == "spectator" )
|
||||
continue;
|
||||
|
||||
if ( isdefined( player.laststand ) && player.laststand && ( isdefined( self.favoriteenemy ) && self.favoriteenemy == player ) )
|
||||
{
|
||||
if ( !self can_zombie_see_any_player() )
|
||||
{
|
||||
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 )
|
||||
continue;
|
||||
}
|
||||
|
||||
can_be_seen = self player_can_see_me( player );
|
||||
distance_squared = distancesquared( self.origin, player.origin );
|
||||
|
||||
if ( can_be_seen && distance_squared < too_far_dist )
|
||||
self.inview++;
|
||||
|
||||
if ( distance_squared < distance_squared_check && abs( self.origin[2] - player.origin[2] ) < how_high )
|
||||
self.player_close++;
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
|
||||
if ( self.inview == 0 && self.player_close == 0 )
|
||||
{
|
||||
if ( !isdefined( self.animname ) || isdefined( self.animname ) && self.animname != "zombie" )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.electrified ) && self.electrified == 1 )
|
||||
return;
|
||||
|
||||
zombies = getaiarray( "axis" );
|
||||
|
||||
if ( zombies.size + level.zombie_total > 24 || zombies.size + level.zombie_total <= 24 && self.health >= self.maxhealth )
|
||||
{
|
||||
if ( !( isdefined( self.exclude_distance_cleanup_adding_to_total ) && self.exclude_distance_cleanup_adding_to_total ) && !( isdefined( self.isscreecher ) && self.isscreecher ) )
|
||||
{
|
||||
level.zombie_total++;
|
||||
|
||||
if ( self.health < level.zombie_health )
|
||||
level.zombie_respawned_health[level.zombie_respawned_health.size] = self.health;
|
||||
}
|
||||
}
|
||||
|
||||
self maps\mp\zombies\_zm_spawner::reset_attack_spot();
|
||||
self notify( "zombie_delete" );
|
||||
|
||||
if ( isdefined( self.anchor ) )
|
||||
self.anchor delete();
|
||||
|
||||
self delete();
|
||||
recalc_zombie_array();
|
||||
}
|
||||
}
|
||||
|
||||
player_can_see_me( player )
|
||||
{
|
||||
playerangles = player getplayerangles();
|
||||
playerforwardvec = anglesToForward( playerangles );
|
||||
playerunitforwardvec = vectornormalize( playerforwardvec );
|
||||
banzaipos = self.origin;
|
||||
playerpos = player getorigin();
|
||||
playertobanzaivec = banzaipos - playerpos;
|
||||
playertobanzaiunitvec = vectornormalize( playertobanzaivec );
|
||||
forwarddotbanzai = vectordot( playerunitforwardvec, playertobanzaiunitvec );
|
||||
if ( forwarddotbanzai >= 1 )
|
||||
{
|
||||
anglefromcenter = 0;
|
||||
}
|
||||
else if ( forwarddotbanzai <= -1 )
|
||||
{
|
||||
anglefromcenter = 180;
|
||||
}
|
||||
else
|
||||
{
|
||||
anglefromcenter = acos( forwarddotbanzai );
|
||||
}
|
||||
playerfov = getDvarFloat( "cg_fov" );
|
||||
banzaivsplayerfovbuffer = getDvarFloat( "g_banzai_player_fov_buffer" );
|
||||
if ( banzaivsplayerfovbuffer <= 0 )
|
||||
{
|
||||
banzaivsplayerfovbuffer = 0,2;
|
||||
}
|
||||
playercanseeme = anglefromcenter <= ( ( playerfov * 0,5 ) * ( 1 - banzaivsplayerfovbuffer ) );
|
||||
return playercanseeme;
|
||||
playerangles = player getplayerangles();
|
||||
playerforwardvec = anglestoforward( playerangles );
|
||||
playerunitforwardvec = vectornormalize( playerforwardvec );
|
||||
banzaipos = self.origin;
|
||||
playerpos = player getorigin();
|
||||
playertobanzaivec = banzaipos - playerpos;
|
||||
playertobanzaiunitvec = vectornormalize( playertobanzaivec );
|
||||
forwarddotbanzai = vectordot( playerunitforwardvec, playertobanzaiunitvec );
|
||||
|
||||
if ( forwarddotbanzai >= 1 )
|
||||
anglefromcenter = 0;
|
||||
else if ( forwarddotbanzai <= -1 )
|
||||
anglefromcenter = 180;
|
||||
else
|
||||
anglefromcenter = acos( forwarddotbanzai );
|
||||
|
||||
playerfov = getdvarfloat( "cg_fov" );
|
||||
banzaivsplayerfovbuffer = getdvarfloat( _hash_BCB625CF );
|
||||
|
||||
if ( banzaivsplayerfovbuffer <= 0 )
|
||||
banzaivsplayerfovbuffer = 0.2;
|
||||
|
||||
playercanseeme = anglefromcenter <= playerfov * 0.5 * ( 1 - banzaivsplayerfovbuffer );
|
||||
return playercanseeme;
|
||||
}
|
||||
|
||||
can_be_deleted_from_buried_special_zones()
|
||||
{
|
||||
if ( self can_be_deleted_from_start_area() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( self can_be_deleted_from_maze_area() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( self can_be_deleted_from_start_area() )
|
||||
return true;
|
||||
|
||||
if ( self can_be_deleted_from_maze_area() )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
can_be_deleted_from_start_area()
|
||||
{
|
||||
start_zones = [];
|
||||
start_zones[ start_zones.size ] = "zone_start";
|
||||
start_zones[ start_zones.size ] = "zone_start_lower";
|
||||
return self can_be_deleted_from_area( start_zones );
|
||||
start_zones = [];
|
||||
start_zones[start_zones.size] = "zone_start";
|
||||
start_zones[start_zones.size] = "zone_start_lower";
|
||||
return self can_be_deleted_from_area( start_zones );
|
||||
}
|
||||
|
||||
can_be_deleted_from_maze_area()
|
||||
{
|
||||
maze_zones = [];
|
||||
maze_zones[ maze_zones.size ] = "zone_mansion_backyard";
|
||||
maze_zones[ maze_zones.size ] = "zone_maze";
|
||||
maze_zones[ maze_zones.size ] = "zone_maze_staircase";
|
||||
return self can_be_deleted_from_area( maze_zones );
|
||||
maze_zones = [];
|
||||
maze_zones[maze_zones.size] = "zone_mansion_backyard";
|
||||
maze_zones[maze_zones.size] = "zone_maze";
|
||||
maze_zones[maze_zones.size] = "zone_maze_staircase";
|
||||
return self can_be_deleted_from_area( maze_zones );
|
||||
}
|
||||
|
||||
can_be_deleted_from_area( zone_names )
|
||||
{
|
||||
self_in_zone = 0;
|
||||
_a265 = zone_names;
|
||||
_k265 = getFirstArrayKey( _a265 );
|
||||
while ( isDefined( _k265 ) )
|
||||
{
|
||||
zone_name = _a265[ _k265 ];
|
||||
if ( isDefined( level.zones[ zone_name ] ) && isDefined( level.zones[ zone_name ].is_occupied ) && level.zones[ zone_name ].is_occupied )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !self_in_zone && self maps/mp/zombies/_zm_zonemgr::entity_in_zone( zone_name ) )
|
||||
{
|
||||
self_in_zone = 1;
|
||||
}
|
||||
_k265 = getNextArrayKey( _a265, _k265 );
|
||||
}
|
||||
if ( self_in_zone )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
self_in_zone = 0;
|
||||
|
||||
foreach ( zone_name in zone_names )
|
||||
{
|
||||
if ( isdefined( level.zones[zone_name] ) && ( isdefined( level.zones[zone_name].is_occupied ) && level.zones[zone_name].is_occupied ) )
|
||||
return false;
|
||||
|
||||
if ( !self_in_zone && self maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone_name ) )
|
||||
self_in_zone = 1;
|
||||
}
|
||||
|
||||
if ( self_in_zone )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
escaped_zombies_cleanup_init()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.zombie_path_bad = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !self.zombie_path_bad )
|
||||
{
|
||||
self waittill( "bad_path" );
|
||||
}
|
||||
found_player = undefined;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( is_player_valid( players[ i ] ) && !is_true( players[ i ].is_in_ghost_zone ) && self maymovetopoint( players[ i ].origin, 1 ) )
|
||||
{
|
||||
self.favoriteenemy = players[ i ];
|
||||
found_player = 1;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
n_delete_distance = 800;
|
||||
n_delete_height = 300;
|
||||
if ( !isDefined( found_player ) && isDefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area )
|
||||
{
|
||||
self thread delete_zombie_noone_looking( n_delete_distance, n_delete_height );
|
||||
self.zombie_path_bad = 1;
|
||||
self escaped_zombies_cleanup();
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
self endon( "death" );
|
||||
self.zombie_path_bad = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( !self.zombie_path_bad )
|
||||
self waittill( "bad_path" );
|
||||
|
||||
found_player = undefined;
|
||||
players = get_players();
|
||||
|
||||
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 ) )
|
||||
{
|
||||
self.favoriteenemy = players[i];
|
||||
found_player = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
n_delete_distance = 800;
|
||||
n_delete_height = 300;
|
||||
|
||||
if ( !isdefined( found_player ) && ( isdefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area ) )
|
||||
{
|
||||
self thread delete_zombie_noone_looking( n_delete_distance, n_delete_height );
|
||||
self.zombie_path_bad = 1;
|
||||
self escaped_zombies_cleanup();
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
escaped_zombies_cleanup()
|
||||
{
|
||||
self endon( "death" );
|
||||
s_escape = self get_escape_position();
|
||||
self notify( "stop_find_flesh" );
|
||||
self notify( "zombie_acquire_enemy" );
|
||||
if ( isDefined( s_escape ) )
|
||||
{
|
||||
self setgoalpos( s_escape.origin );
|
||||
self thread check_player_available();
|
||||
self waittill_any( "goal", "reaquire_player" );
|
||||
}
|
||||
self.zombie_path_bad = !can_zombie_path_to_any_player();
|
||||
wait 0,1;
|
||||
if ( !self.zombie_path_bad )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
|
||||
}
|
||||
self endon( "death" );
|
||||
s_escape = self get_escape_position();
|
||||
self notify( "stop_find_flesh" );
|
||||
self notify( "zombie_acquire_enemy" );
|
||||
|
||||
if ( isdefined( s_escape ) )
|
||||
{
|
||||
self setgoalpos( s_escape.origin );
|
||||
self thread check_player_available();
|
||||
self waittill_any( "goal", "reaquire_player" );
|
||||
}
|
||||
|
||||
self.zombie_path_bad = !can_zombie_path_to_any_player();
|
||||
wait 0.1;
|
||||
|
||||
if ( !self.zombie_path_bad )
|
||||
self thread maps\mp\zombies\_zm_ai_basic::find_flesh();
|
||||
}
|
||||
|
||||
get_escape_position()
|
||||
{
|
||||
self endon( "death" );
|
||||
str_zone = get_current_zone();
|
||||
if ( isDefined( str_zone ) )
|
||||
{
|
||||
a_zones = get_adjacencies_to_zone( str_zone );
|
||||
a_dog_locations = get_dog_locations_in_zones( a_zones );
|
||||
s_farthest = self get_farthest_dog_location( a_dog_locations );
|
||||
}
|
||||
return s_farthest;
|
||||
self endon( "death" );
|
||||
str_zone = get_current_zone();
|
||||
|
||||
if ( isdefined( str_zone ) )
|
||||
{
|
||||
a_zones = get_adjacencies_to_zone( str_zone );
|
||||
a_dog_locations = get_dog_locations_in_zones( a_zones );
|
||||
s_farthest = self get_farthest_dog_location( a_dog_locations );
|
||||
}
|
||||
|
||||
return s_farthest;
|
||||
}
|
||||
|
||||
check_player_available()
|
||||
{
|
||||
self notify( "_check_player_available" );
|
||||
self endon( "_check_player_available" );
|
||||
self endon( "death" );
|
||||
self endon( "goal" );
|
||||
while ( self.zombie_path_bad )
|
||||
{
|
||||
if ( self can_zombie_see_any_player() )
|
||||
{
|
||||
self notify( "reaquire_player" );
|
||||
return;
|
||||
}
|
||||
wait randomfloatrange( 0,2, 0,5 );
|
||||
}
|
||||
self notify( "reaquire_player" );
|
||||
self notify( "_check_player_available" );
|
||||
self endon( "_check_player_available" );
|
||||
self endon( "death" );
|
||||
self endon( "goal" );
|
||||
|
||||
while ( self.zombie_path_bad )
|
||||
{
|
||||
if ( self can_zombie_see_any_player() )
|
||||
{
|
||||
self notify( "reaquire_player" );
|
||||
return;
|
||||
}
|
||||
|
||||
wait( randomfloatrange( 0.2, 0.5 ) );
|
||||
}
|
||||
|
||||
self notify( "reaquire_player" );
|
||||
}
|
||||
|
||||
can_zombie_path_to_any_player()
|
||||
{
|
||||
a_players = get_players();
|
||||
i = 0;
|
||||
while ( i < a_players.size )
|
||||
{
|
||||
if ( !is_player_valid( a_players[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( is_true( a_players[ i ].is_in_ghost_zone ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( findpath( self.origin, a_players[ i ].origin ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
a_players = get_players();
|
||||
|
||||
for ( i = 0; i < a_players.size; i++ )
|
||||
{
|
||||
if ( !is_player_valid( a_players[i] ) )
|
||||
continue;
|
||||
|
||||
if ( is_true( a_players[i].is_in_ghost_zone ) )
|
||||
continue;
|
||||
|
||||
if ( findpath( self.origin, a_players[i].origin ) )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
can_zombie_see_any_player()
|
||||
{
|
||||
a_players = get_players();
|
||||
i = 0;
|
||||
while ( i < a_players.size )
|
||||
{
|
||||
if ( !is_player_valid( a_players[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
path_length = 0;
|
||||
if ( !is_true( a_players[ i ].is_in_ghost_zone ) )
|
||||
{
|
||||
path_length = self calcpathlength( a_players[ i ].origin );
|
||||
}
|
||||
if ( self maymovetopoint( a_players[ i ].origin, 1 ) || path_length != 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
a_players = get_players();
|
||||
|
||||
for ( i = 0; i < a_players.size; i++ )
|
||||
{
|
||||
if ( !is_player_valid( a_players[i] ) )
|
||||
continue;
|
||||
|
||||
path_length = 0;
|
||||
|
||||
if ( !is_true( a_players[i].is_in_ghost_zone ) )
|
||||
path_length = self calcpathlength( a_players[i].origin );
|
||||
|
||||
if ( self maymovetopoint( a_players[i].origin, 1 ) || path_length != 0 )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
get_adjacencies_to_zone( str_zone )
|
||||
{
|
||||
a_adjacencies = [];
|
||||
a_adjacencies[ 0 ] = str_zone;
|
||||
a_adjacent_zones = getarraykeys( level.zones[ str_zone ].adjacent_zones );
|
||||
i = 0;
|
||||
while ( i < a_adjacent_zones.size )
|
||||
{
|
||||
if ( level.zones[ str_zone ].adjacent_zones[ a_adjacent_zones[ i ] ].is_connected )
|
||||
{
|
||||
a_adjacencies[ a_adjacencies.size ] = a_adjacent_zones[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return a_adjacencies;
|
||||
a_adjacencies = [];
|
||||
a_adjacencies[0] = str_zone;
|
||||
a_adjacent_zones = getarraykeys( level.zones[str_zone].adjacent_zones );
|
||||
|
||||
for ( i = 0; i < a_adjacent_zones.size; i++ )
|
||||
{
|
||||
if ( level.zones[str_zone].adjacent_zones[a_adjacent_zones[i]].is_connected )
|
||||
a_adjacencies[a_adjacencies.size] = a_adjacent_zones[i];
|
||||
}
|
||||
|
||||
return a_adjacencies;
|
||||
}
|
||||
|
||||
get_dog_locations_in_zones( a_zones )
|
||||
{
|
||||
a_dog_locations = [];
|
||||
_a479 = a_zones;
|
||||
_k479 = getFirstArrayKey( _a479 );
|
||||
while ( isDefined( _k479 ) )
|
||||
{
|
||||
zone = _a479[ _k479 ];
|
||||
a_dog_locations = arraycombine( a_dog_locations, level.zones[ zone ].dog_locations, 0, 0 );
|
||||
_k479 = getNextArrayKey( _a479, _k479 );
|
||||
}
|
||||
return a_dog_locations;
|
||||
a_dog_locations = [];
|
||||
|
||||
foreach ( zone in a_zones )
|
||||
a_dog_locations = arraycombine( a_dog_locations, level.zones[zone].dog_locations, 0, 0 );
|
||||
|
||||
return a_dog_locations;
|
||||
}
|
||||
|
||||
get_farthest_dog_location( a_dog_locations )
|
||||
{
|
||||
n_farthest_index = 0;
|
||||
n_distance_farthest = 0;
|
||||
i = 0;
|
||||
while ( i < a_dog_locations.size )
|
||||
{
|
||||
n_distance_sq = distancesquared( self.origin, a_dog_locations[ i ].origin );
|
||||
if ( n_distance_sq > n_distance_farthest )
|
||||
{
|
||||
n_distance_farthest = n_distance_sq;
|
||||
n_farthest_index = i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return a_dog_locations[ n_farthest_index ];
|
||||
n_farthest_index = 0;
|
||||
n_distance_farthest = 0;
|
||||
|
||||
for ( i = 0; i < a_dog_locations.size; i++ )
|
||||
{
|
||||
n_distance_sq = distancesquared( self.origin, a_dog_locations[i].origin );
|
||||
|
||||
if ( n_distance_sq > n_distance_farthest )
|
||||
{
|
||||
n_distance_farthest = n_distance_sq;
|
||||
n_farthest_index = i;
|
||||
}
|
||||
}
|
||||
|
||||
return a_dog_locations[n_farthest_index];
|
||||
}
|
||||
|
@ -1,222 +1,219 @@
|
||||
#include maps/mp/zombies/_zm_powerups;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "zm_buried_ghost" );
|
||||
#using_animtree( "fxanim_props_dlc3" );
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_score;
|
||||
#include maps\mp\zombies\_zm_perks;
|
||||
#include maps\mp\zombies\_zm_powerups;
|
||||
|
||||
init_ghost_piano()
|
||||
{
|
||||
t_bullseye = getent( "bullseye", "script_noteworthy" );
|
||||
t_chalk_line = getent( "ee_bar_chalk_line_trigger", "targetname" );
|
||||
if ( !isDefined( t_bullseye ) || !isDefined( t_chalk_line ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
t_bullseye thread wait_for_valid_damage();
|
||||
t_chalk_line thread set_flags_while_players_stand_in_trigger();
|
||||
level thread mansion_ghost_plays_piano();
|
||||
level thread reward_think();
|
||||
t_bullseye = getent( "bullseye", "script_noteworthy" );
|
||||
t_chalk_line = getent( "ee_bar_chalk_line_trigger", "targetname" );
|
||||
|
||||
if ( !isdefined( t_bullseye ) || !isdefined( t_chalk_line ) )
|
||||
return;
|
||||
|
||||
t_bullseye thread wait_for_valid_damage();
|
||||
t_chalk_line thread set_flags_while_players_stand_in_trigger();
|
||||
level thread mansion_ghost_plays_piano();
|
||||
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()
|
||||
{
|
||||
self ent_flag_init( "ee_standing_behind_chalk_line" );
|
||||
self ent_flag_init( "ee_standing_behind_chalk_line" );
|
||||
}
|
||||
|
||||
wait_for_valid_damage()
|
||||
{
|
||||
self setcandamage( 1 );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "damage" );
|
||||
if ( is_ballistic_knife_variant( 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" ) )
|
||||
{
|
||||
level notify( "player_can_interact_with_ghost_piano_player" );
|
||||
}
|
||||
}
|
||||
}
|
||||
self setcandamage( 1 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "damage", e_inflictor, str_weapon_name );
|
||||
|
||||
if ( is_ballistic_knife_variant( 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" ) )
|
||||
level notify( "player_can_interact_with_ghost_piano_player", e_inflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
if ( !player ent_flag_exist( "ee_standing_behind_chalk_line" ) )
|
||||
{
|
||||
player ent_flag_init( "ee_standing_behind_chalk_line" );
|
||||
}
|
||||
if ( !player ent_flag( "ee_standing_behind_chalk_line" ) )
|
||||
{
|
||||
player thread clear_flag_when_player_leaves_trigger( self );
|
||||
}
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
|
||||
if ( !player ent_flag_exist( "ee_standing_behind_chalk_line" ) )
|
||||
player ent_flag_init( "ee_standing_behind_chalk_line" );
|
||||
|
||||
if ( !player ent_flag( "ee_standing_behind_chalk_line" ) )
|
||||
player thread clear_flag_when_player_leaves_trigger( self );
|
||||
}
|
||||
}
|
||||
|
||||
clear_flag_when_player_leaves_trigger( trigger )
|
||||
{
|
||||
self endon( "death_or_disconnect" );
|
||||
self ent_flag_set( "ee_standing_behind_chalk_line" );
|
||||
while ( self istouching( trigger ) )
|
||||
{
|
||||
wait 0,25;
|
||||
}
|
||||
self ent_flag_clear( "ee_standing_behind_chalk_line" );
|
||||
self endon( "death_or_disconnect" );
|
||||
self ent_flag_set( "ee_standing_behind_chalk_line" );
|
||||
|
||||
while ( self istouching( trigger ) )
|
||||
wait 0.25;
|
||||
|
||||
self ent_flag_clear( "ee_standing_behind_chalk_line" );
|
||||
}
|
||||
|
||||
#using_animtree("fxanim_props_dlc3");
|
||||
|
||||
player_piano_starts()
|
||||
{
|
||||
/#
|
||||
iprintln( "player piano tune song start" );
|
||||
iprintln( "player piano tune song start" );
|
||||
#/
|
||||
flag_set( "player_piano_song_active" );
|
||||
level notify( "piano_play" );
|
||||
level setclientfield( "mansion_piano_play", 1 );
|
||||
level setclientfield( "saloon_piano_play", 1 );
|
||||
wait getanimlength( %fxanim_gp_piano_old_anim );
|
||||
flag_set( "player_piano_song_active" );
|
||||
level notify( "piano_play" );
|
||||
level setclientfield( "mansion_piano_play", 1 );
|
||||
level setclientfield( "saloon_piano_play", 1 );
|
||||
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( "saloon_piano_play", 0 );
|
||||
flag_clear( "player_piano_song_active" );
|
||||
level setclientfield( "mansion_piano_play", 0 );
|
||||
level setclientfield( "saloon_piano_play", 0 );
|
||||
flag_clear( "player_piano_song_active" );
|
||||
}
|
||||
|
||||
mansion_ghost_plays_piano()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
flag_wait( "player_piano_song_active" );
|
||||
e_ghost = spawn_and_animate_ghost_pianist();
|
||||
flag_waitopen( "player_piano_song_active" );
|
||||
e_ghost thread delete_ghost_pianist();
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
flag_wait( "player_piano_song_active" );
|
||||
e_ghost = spawn_and_animate_ghost_pianist();
|
||||
flag_waitopen( "player_piano_song_active" );
|
||||
e_ghost thread delete_ghost_pianist();
|
||||
}
|
||||
}
|
||||
|
||||
#using_animtree("zm_buried_ghost");
|
||||
|
||||
spawn_and_animate_ghost_pianist()
|
||||
{
|
||||
s_anim = getstruct( "ee_mansion_piano_anim_struct", "targetname" );
|
||||
e_temp = spawn( "script_model", s_anim.origin );
|
||||
e_temp.angles = s_anim.angles;
|
||||
e_temp setclientfield( "ghost_fx", 3 );
|
||||
e_temp setmodel( "c_zom_zombie_buried_ghost_woman_fb" );
|
||||
e_temp useanimtree( -1 );
|
||||
e_temp setanim( %ai_zombie_ghost_playing_piano );
|
||||
e_temp setclientfield( "sndGhostAudio", 1 );
|
||||
s_anim = getstruct( "ee_mansion_piano_anim_struct", "targetname" );
|
||||
e_temp = spawn( "script_model", s_anim.origin );
|
||||
e_temp.angles = s_anim.angles;
|
||||
e_temp setclientfield( "ghost_fx", 3 );
|
||||
e_temp setmodel( "c_zom_zombie_buried_ghost_woman_fb" );
|
||||
e_temp useanimtree( -1 );
|
||||
e_temp setanim( %ai_zombie_ghost_playing_piano );
|
||||
e_temp setclientfield( "sndGhostAudio", 1 );
|
||||
/#
|
||||
iprintln( "ghost piano player spawned" );
|
||||
iprintln( "ghost piano player spawned" );
|
||||
#/
|
||||
return e_temp;
|
||||
return e_temp;
|
||||
}
|
||||
|
||||
reward_think()
|
||||
{
|
||||
t_use = getent( "ee_ghost_piano_mansion_use_trigger", "targetname" );
|
||||
t_use sethintstring( &"ZM_BURIED_HINT_GHOST_PIANO", 10 );
|
||||
t_use setinvisibletoall();
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "player_can_interact_with_ghost_piano_player", player );
|
||||
level thread player_piano_starts();
|
||||
if ( !player has_player_received_reward() )
|
||||
{
|
||||
t_use setvisibletoplayer( player );
|
||||
t_use thread player_can_use_ghost_piano_trigger( player );
|
||||
}
|
||||
flag_waitopen( "player_piano_song_active" );
|
||||
t_use setinvisibletoall();
|
||||
level notify( "ghost_piano_reward_unavailable" );
|
||||
}
|
||||
t_use = getent( "ee_ghost_piano_mansion_use_trigger", "targetname" );
|
||||
t_use sethintstring( &"ZM_BURIED_HINT_GHOST_PIANO", 10 );
|
||||
t_use setinvisibletoall();
|
||||
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "player_can_interact_with_ghost_piano_player", player );
|
||||
|
||||
level thread player_piano_starts();
|
||||
|
||||
if ( !player has_player_received_reward() )
|
||||
{
|
||||
t_use setvisibletoplayer( player );
|
||||
t_use thread player_can_use_ghost_piano_trigger( player );
|
||||
}
|
||||
|
||||
flag_waitopen( "player_piano_song_active" );
|
||||
t_use setinvisibletoall();
|
||||
level notify( "ghost_piano_reward_unavailable" );
|
||||
}
|
||||
}
|
||||
|
||||
player_can_use_ghost_piano_trigger( player )
|
||||
{
|
||||
player endon( "death_or_disconnect" );
|
||||
level endon( "ghost_piano_reward_unavailable" );
|
||||
self waittill( "trigger", user );
|
||||
if ( user != player && player.score < 10 && !player has_player_received_reward() )
|
||||
{
|
||||
self give_reward( player );
|
||||
}
|
||||
player endon( "death_or_disconnect" );
|
||||
level endon( "ghost_piano_reward_unavailable" );
|
||||
|
||||
do
|
||||
self waittill( "trigger", user );
|
||||
while ( user != player || player.score < 10 || !is_player_valid( player ) );
|
||||
|
||||
if ( !player has_player_received_reward() )
|
||||
self give_reward( player );
|
||||
}
|
||||
|
||||
give_reward( player )
|
||||
{
|
||||
player maps/mp/zombies/_zm_score::minus_to_player_score( 10 );
|
||||
player.got_easter_egg_reward = 1;
|
||||
self setinvisibletoplayer( player );
|
||||
player notify( "player_received_ghost_round_free_perk" );
|
||||
free_perk = player maps/mp/zombies/_zm_perks::give_random_perk();
|
||||
if ( is_true( level.disable_free_perks_before_power ) )
|
||||
{
|
||||
player thread maps/mp/zombies/_zm_powerups::disable_perk_before_power( free_perk );
|
||||
}
|
||||
player maps\mp\zombies\_zm_score::minus_to_player_score( 10 );
|
||||
player.got_easter_egg_reward = 1;
|
||||
self setinvisibletoplayer( player );
|
||||
player notify( "player_received_ghost_round_free_perk" );
|
||||
free_perk = player maps\mp\zombies\_zm_perks::give_random_perk();
|
||||
|
||||
if ( is_true( level.disable_free_perks_before_power ) )
|
||||
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()
|
||||
{
|
||||
return is_true( self.got_easter_egg_reward );
|
||||
return is_true( self.got_easter_egg_reward );
|
||||
}
|
||||
|
||||
delete_ghost_pianist()
|
||||
{
|
||||
self setclientfield( "ghost_fx", 5 );
|
||||
self playsound( "zmb_ai_ghost_death" );
|
||||
wait_network_frame();
|
||||
self delete();
|
||||
self setclientfield( "ghost_fx", 5 );
|
||||
self playsound( "zmb_ai_ghost_death" );
|
||||
wait_network_frame();
|
||||
self delete();
|
||||
/#
|
||||
iprintln( "ghost piano player deleted" );
|
||||
iprintln( "ghost piano player deleted" );
|
||||
#/
|
||||
}
|
||||
|
||||
devgui_support_ee()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
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" )
|
||||
{
|
||||
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" );
|
||||
}
|
||||
}
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
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" )
|
||||
get_players()[0] warp_to_struct( "ee_warp_mansion_piano", "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 )
|
||||
{
|
||||
if ( !isDefined( str_key ) )
|
||||
{
|
||||
str_key = "targetname";
|
||||
}
|
||||
s_warp = getstruct( str_value, str_key );
|
||||
self setorigin( s_warp.origin );
|
||||
if ( isDefined( s_warp.angles ) )
|
||||
{
|
||||
self setplayerangles( s_warp.angles );
|
||||
}
|
||||
if ( !isdefined( str_key ) )
|
||||
str_key = "targetname";
|
||||
|
||||
s_warp = getstruct( str_value, str_key );
|
||||
self setorigin( s_warp.origin );
|
||||
|
||||
if ( isdefined( s_warp.angles ) )
|
||||
self setplayerangles( s_warp.angles );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,297 +1,287 @@
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_ai_ghost;
|
||||
#include maps/mp/zm_buried_classic;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zm_buried_classic;
|
||||
#include maps\mp\zombies\_zm_ai_ghost;
|
||||
#include maps\mp\zombies\_zm_stats;
|
||||
|
||||
init_fountain()
|
||||
{
|
||||
flag_init( "courtyard_fountain_broken" );
|
||||
flag_init( "maze_fountain_broken" );
|
||||
flag_init( "fountain_transport_active" );
|
||||
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_teleport" ] = loadfx( "maps/zombie_buried/fx_buried_teleport_flash" );
|
||||
level thread fountain_setup();
|
||||
level thread maze_fountain_collmap();
|
||||
flag_init( "courtyard_fountain_broken" );
|
||||
flag_init( "maze_fountain_broken" );
|
||||
flag_init( "fountain_transport_active" );
|
||||
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_teleport"] = loadfx( "maps/zombie_buried/fx_buried_teleport_flash" );
|
||||
level thread fountain_setup();
|
||||
level thread maze_fountain_collmap();
|
||||
}
|
||||
|
||||
fountain_setup()
|
||||
{
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
fountain_debug_print( "fountain scripts running" );
|
||||
level thread set_flag_on_notify( "courtyard_fountain_open", "courtyard_fountain_broken" );
|
||||
level thread sloth_fountain_think();
|
||||
level thread maze_fountain_think();
|
||||
level thread fountain_transport_think();
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
fountain_debug_print( "fountain scripts running" );
|
||||
level thread set_flag_on_notify( "courtyard_fountain_open", "courtyard_fountain_broken" );
|
||||
level thread sloth_fountain_think();
|
||||
level thread maze_fountain_think();
|
||||
level thread fountain_transport_think();
|
||||
/#
|
||||
level thread debug_warp_player_to_fountain();
|
||||
level thread debug_warp_player_to_fountain();
|
||||
#/
|
||||
}
|
||||
|
||||
maze_fountain_collmap()
|
||||
{
|
||||
collmap = getentarray( "maze_fountain_collmap", "targetname" );
|
||||
flag_wait( "maze_fountain_broken" );
|
||||
array_thread( collmap, ::self_delete );
|
||||
collmap = getentarray( "maze_fountain_collmap", "targetname" );
|
||||
flag_wait( "maze_fountain_broken" );
|
||||
array_thread( collmap, ::self_delete );
|
||||
}
|
||||
|
||||
sloth_fountain_think()
|
||||
{
|
||||
flag_wait( "courtyard_fountain_broken" );
|
||||
level setclientfield( "sloth_fountain_start", 1 );
|
||||
s_courtyard_fountain = getstruct( "courtyard_fountain_struct", "targetname" );
|
||||
if ( isDefined( s_courtyard_fountain ) )
|
||||
{
|
||||
sound_offset = vectorScale( ( 0, 0, 1 ), 100 );
|
||||
sound_ent = spawn( "script_origin", s_courtyard_fountain.origin + sound_offset );
|
||||
playfx( level._effect[ "fx_buried_fountain_spray" ], s_courtyard_fountain.origin );
|
||||
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" );
|
||||
flag_wait( "courtyard_fountain_broken" );
|
||||
level setclientfield( "sloth_fountain_start", 1 );
|
||||
s_courtyard_fountain = getstruct( "courtyard_fountain_struct", "targetname" );
|
||||
|
||||
if ( isdefined( s_courtyard_fountain ) )
|
||||
{
|
||||
sound_offset = vectorscale( ( 0, 0, 1 ), 100.0 );
|
||||
sound_ent = spawn( "script_origin", s_courtyard_fountain.origin + sound_offset );
|
||||
playfx( level._effect["fx_buried_fountain_spray"], s_courtyard_fountain.origin );
|
||||
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" );
|
||||
}
|
||||
|
||||
set_flag_on_notify( notifystr, strflag )
|
||||
{
|
||||
if ( notifystr != "death" )
|
||||
{
|
||||
self endon( "death" );
|
||||
}
|
||||
if ( !level.flag[ strflag ] )
|
||||
{
|
||||
self waittill( notifystr );
|
||||
flag_set( strflag );
|
||||
}
|
||||
if ( notifystr != "death" )
|
||||
self endon( "death" );
|
||||
|
||||
if ( !level.flag[strflag] )
|
||||
{
|
||||
self waittill( notifystr );
|
||||
|
||||
flag_set( strflag );
|
||||
}
|
||||
}
|
||||
|
||||
maze_fountain_think()
|
||||
{
|
||||
hide_maze_fountain_water();
|
||||
wait_for_maze_fountain_to_be_destroyed();
|
||||
destroy_maze_fountain();
|
||||
flag_wait( "courtyard_fountain_broken" );
|
||||
flag_set( "fountain_transport_active" );
|
||||
hide_maze_fountain_water();
|
||||
wait_for_maze_fountain_to_be_destroyed();
|
||||
destroy_maze_fountain();
|
||||
flag_wait( "courtyard_fountain_broken" );
|
||||
flag_set( "fountain_transport_active" );
|
||||
}
|
||||
|
||||
hide_maze_fountain_water()
|
||||
{
|
||||
t_water = getent( "maze_fountain_water_trigger", "targetname" );
|
||||
t_water enablelinkto();
|
||||
m_water = getent( "maze_fountain_water", "targetname" );
|
||||
t_water linkto( m_water );
|
||||
m_water movez( -475, 0,05 );
|
||||
t_water = getent( "maze_fountain_water_trigger", "targetname" );
|
||||
t_water enablelinkto();
|
||||
m_water = getent( "maze_fountain_water", "targetname" );
|
||||
t_water linkto( m_water );
|
||||
m_water movez( -475, 0.05 );
|
||||
}
|
||||
|
||||
show_maze_fountain_water()
|
||||
{
|
||||
m_water = getent( "maze_fountain_water", "targetname" );
|
||||
m_water movez( 398, 6 );
|
||||
m_water ghost();
|
||||
fountain_debug_print( "maze water ready" );
|
||||
m_water = getent( "maze_fountain_water", "targetname" );
|
||||
m_water movez( 398, 6 );
|
||||
m_water ghost();
|
||||
fountain_debug_print( "maze water ready" );
|
||||
}
|
||||
|
||||
wait_for_maze_fountain_to_be_destroyed()
|
||||
{
|
||||
/#
|
||||
level endon( "_destroy_maze_fountain" );
|
||||
level endon( "_destroy_maze_fountain" );
|
||||
#/
|
||||
t_damage = getent( "maze_fountain_trigger", "targetname" );
|
||||
health = 1000;
|
||||
while ( health > 0 )
|
||||
{
|
||||
t_damage waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
if ( damage < 50 )
|
||||
{
|
||||
damage = 0;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
t_damage = getent( "maze_fountain_trigger", "targetname" );
|
||||
|
||||
for ( health = 1000; health > 0; health -= damage )
|
||||
{
|
||||
t_damage waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
|
||||
asm_cond( damage < 50, loc_E9C );
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
destroy_maze_fountain()
|
||||
{
|
||||
s_fountain = getstruct( "maze_fountain_struct", "targetname" );
|
||||
level setclientfield( "maze_fountain_start", 1 );
|
||||
if ( isDefined( s_fountain ) )
|
||||
{
|
||||
playfx( level._effect[ "fountain_break" ], s_fountain.origin );
|
||||
}
|
||||
s_fountain_clip = getent( "maze_fountain_clip", "targetname" );
|
||||
s_fountain_clip delete();
|
||||
flag_set( "maze_fountain_broken" );
|
||||
s_fountain = getstruct( "maze_fountain_struct", "targetname" );
|
||||
level setclientfield( "maze_fountain_start", 1 );
|
||||
|
||||
if ( isdefined( s_fountain ) )
|
||||
playfx( level._effect["fountain_break"], s_fountain.origin );
|
||||
|
||||
s_fountain_clip = getent( "maze_fountain_clip", "targetname" );
|
||||
s_fountain_clip delete();
|
||||
flag_set( "maze_fountain_broken" );
|
||||
}
|
||||
|
||||
fountain_transport_think()
|
||||
{
|
||||
t_transporter = getent( "maze_fountain_water_trigger", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
t_transporter waittill( "trigger", player );
|
||||
if ( !isDefined( player.is_in_fountain_transport_trigger ) || !player.is_in_fountain_transport_trigger )
|
||||
{
|
||||
player.is_in_fountain_transport_trigger = 1;
|
||||
if ( flag( "fountain_transport_active" ) )
|
||||
{
|
||||
player thread transport_player_to_start_zone();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread delay_transport_check();
|
||||
}
|
||||
}
|
||||
}
|
||||
t_transporter = getent( "maze_fountain_water_trigger", "targetname" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
t_transporter waittill( "trigger", player );
|
||||
|
||||
if ( !isdefined( player.is_in_fountain_transport_trigger ) || !player.is_in_fountain_transport_trigger )
|
||||
{
|
||||
player.is_in_fountain_transport_trigger = 1;
|
||||
|
||||
if ( flag( "fountain_transport_active" ) )
|
||||
player thread transport_player_to_start_zone();
|
||||
else
|
||||
player thread delay_transport_check();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delay_transport_check()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "bled_out" );
|
||||
wait 1;
|
||||
self.is_in_fountain_transport_trigger = 0;
|
||||
self endon( "death" );
|
||||
self endon( "bled_out" );
|
||||
wait 1;
|
||||
self.is_in_fountain_transport_trigger = 0;
|
||||
}
|
||||
|
||||
transport_player_to_start_zone()
|
||||
{
|
||||
self endon( "death_or_disconnect" );
|
||||
fountain_debug_print( "transport player!" );
|
||||
if ( !isDefined( level._fountain_transporter ) )
|
||||
{
|
||||
level._fountain_transporter = spawnstruct();
|
||||
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();
|
||||
wait_network_frame();
|
||||
if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size )
|
||||
{
|
||||
level._fountain_transporter.index = 0;
|
||||
}
|
||||
tries = 0;
|
||||
while ( positionwouldtelefrag( level._fountain_transporter.end_points[ level._fountain_transporter.index ].origin ) )
|
||||
{
|
||||
tries++;
|
||||
if ( tries >= 4 )
|
||||
{
|
||||
tries = 0;
|
||||
wait 0,05;
|
||||
}
|
||||
level._fountain_transporter.index++;
|
||||
if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size )
|
||||
{
|
||||
level._fountain_transporter.index = 0;
|
||||
}
|
||||
}
|
||||
self setorigin( level._fountain_transporter.end_points[ level._fountain_transporter.index ].origin );
|
||||
self setplayerangles( level._fountain_transporter.end_points[ level._fountain_transporter.index ].angles );
|
||||
level._fountain_transporter.index++;
|
||||
wait_network_frame();
|
||||
self play_teleport_fx();
|
||||
self thread flash_screen_fade_out();
|
||||
self maps/mp/zm_buried_classic::buried_set_start_area_lighting();
|
||||
self thread maps/mp/zombies/_zm_ai_ghost::behave_after_fountain_transport( self );
|
||||
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;
|
||||
self endon( "death_or_disconnect" );
|
||||
fountain_debug_print( "transport player!" );
|
||||
|
||||
if ( !isdefined( level._fountain_transporter ) )
|
||||
{
|
||||
level._fountain_transporter = spawnstruct();
|
||||
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();
|
||||
wait_network_frame();
|
||||
|
||||
if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size )
|
||||
level._fountain_transporter.index = 0;
|
||||
|
||||
tries = 0;
|
||||
|
||||
while ( positionwouldtelefrag( level._fountain_transporter.end_points[level._fountain_transporter.index].origin ) )
|
||||
{
|
||||
tries++;
|
||||
|
||||
if ( tries >= 4 )
|
||||
{
|
||||
tries = 0;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
level._fountain_transporter.index++;
|
||||
|
||||
if ( level._fountain_transporter.index >= level._fountain_transporter.end_points.size )
|
||||
level._fountain_transporter.index = 0;
|
||||
}
|
||||
|
||||
self setorigin( level._fountain_transporter.end_points[level._fountain_transporter.index].origin );
|
||||
self setplayerangles( level._fountain_transporter.end_points[level._fountain_transporter.index].angles );
|
||||
level._fountain_transporter.index++;
|
||||
wait_network_frame();
|
||||
self play_teleport_fx();
|
||||
self thread flash_screen_fade_out();
|
||||
self maps\mp\zm_buried_classic::buried_set_start_area_lighting();
|
||||
self thread maps\mp\zombies\_zm_ai_ghost::behave_after_fountain_transport( self );
|
||||
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()
|
||||
{
|
||||
playfx( level._effect[ "fountain_teleport" ], self gettagorigin( "J_SpineLower" ) );
|
||||
playfx( level._effect["fountain_teleport"], self gettagorigin( "J_SpineLower" ) );
|
||||
}
|
||||
|
||||
flash_screen_white()
|
||||
{
|
||||
self endon( "death_or_disconnect" );
|
||||
self.hud_transporter_flash = self create_client_hud_elem();
|
||||
self.hud_transporter_flash fadeovertime( 0,2 );
|
||||
self.hud_transporter_flash.alpha = 1;
|
||||
wait 0,2;
|
||||
self endon( "death_or_disconnect" );
|
||||
self.hud_transporter_flash = self create_client_hud_elem();
|
||||
self.hud_transporter_flash fadeovertime( 0.2 );
|
||||
self.hud_transporter_flash.alpha = 1;
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
flash_screen_fade_out()
|
||||
{
|
||||
self.hud_transporter_flash fadeovertime( 0,2 );
|
||||
self.hud_transporter_flash.alpha = 0;
|
||||
wait 0,2;
|
||||
self.hud_transporter_flash destroy();
|
||||
self.hud_transporter_flash = undefined;
|
||||
self.hud_transporter_flash fadeovertime( 0.2 );
|
||||
self.hud_transporter_flash.alpha = 0;
|
||||
wait 0.2;
|
||||
self.hud_transporter_flash destroy();
|
||||
self.hud_transporter_flash = undefined;
|
||||
}
|
||||
|
||||
create_client_hud_elem()
|
||||
{
|
||||
hud_elem = newclienthudelem( self );
|
||||
hud_elem.x = 0;
|
||||
hud_elem.y = 0;
|
||||
hud_elem.horzalign = "fullscreen";
|
||||
hud_elem.vertalign = "fullscreen";
|
||||
hud_elem.foreground = 1;
|
||||
hud_elem.alpha = 0;
|
||||
hud_elem.hidewheninmenu = 0;
|
||||
hud_elem.shader = "white";
|
||||
hud_elem setshader( "white", 640, 480 );
|
||||
return hud_elem;
|
||||
hud_elem = newclienthudelem( self );
|
||||
hud_elem.x = 0;
|
||||
hud_elem.y = 0;
|
||||
hud_elem.horzalign = "fullscreen";
|
||||
hud_elem.vertalign = "fullscreen";
|
||||
hud_elem.foreground = 1;
|
||||
hud_elem.alpha = 0;
|
||||
hud_elem.hidewheninmenu = 0;
|
||||
hud_elem.shader = "white";
|
||||
hud_elem setshader( "white", 640, 480 );
|
||||
return hud_elem;
|
||||
}
|
||||
|
||||
debug_warp_player_to_fountain()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
str_notify = level waittill_any_return( "warp_player_to_maze_fountain", "warp_player_to_courtyard_fountain" );
|
||||
if ( str_notify == "warp_player_to_maze_fountain" )
|
||||
{
|
||||
str_warp_point = "teleport_player_to_maze_fountain";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( str_notify == "warp_player_to_courtyard_fountain" )
|
||||
{
|
||||
str_warp_point = "teleport_player_to_courtyard_fountain";
|
||||
}
|
||||
}
|
||||
_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 );
|
||||
}
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
str_notify = level waittill_any_return( "warp_player_to_maze_fountain", "warp_player_to_courtyard_fountain" );
|
||||
|
||||
if ( str_notify == "warp_player_to_maze_fountain" )
|
||||
str_warp_point = "teleport_player_to_maze_fountain";
|
||||
else if ( str_notify == "warp_player_to_courtyard_fountain" )
|
||||
str_warp_point = "teleport_player_to_courtyard_fountain";
|
||||
|
||||
foreach ( player in get_players() )
|
||||
{
|
||||
_warp_player_to_maze_fountain( player, str_warp_point );
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_warp_player_to_maze_fountain( player, str_teleport_point )
|
||||
{
|
||||
fountain_debug_print( "teleporting player to " + str_teleport_point );
|
||||
s_warp = getstruct( str_teleport_point, "targetname" );
|
||||
origin = s_warp.origin;
|
||||
while ( positionwouldtelefrag( origin ) )
|
||||
{
|
||||
wait 0,05;
|
||||
origin = s_warp.origin + ( randomfloatrange( -64, 64 ), randomfloatrange( -64, 64 ), 0 );
|
||||
}
|
||||
player setorigin( origin );
|
||||
player setplayerangles( s_warp.angles );
|
||||
fountain_debug_print( "teleporting player to " + str_teleport_point );
|
||||
s_warp = getstruct( str_teleport_point, "targetname" );
|
||||
|
||||
for ( origin = s_warp.origin; positionwouldtelefrag( origin ); origin = s_warp.origin + ( randomfloatrange( -64, 64 ), randomfloatrange( -64, 64 ), 0 ) )
|
||||
wait 0.05;
|
||||
|
||||
player setorigin( origin );
|
||||
player setplayerangles( s_warp.angles );
|
||||
}
|
||||
|
||||
fountain_debug_print( str_text )
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( #"AE3F04F6" ) > 0 )
|
||||
{
|
||||
iprintlnbold( str_text );
|
||||
if ( getdvarint( _hash_AE3F04F6 ) > 0 )
|
||||
iprintlnbold( str_text );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,150 +1,156 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
#using_animtree( "fxanim_props_dlc3" );
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\createfx\zm_buried_fx;
|
||||
|
||||
main()
|
||||
{
|
||||
precache_createfx_fx();
|
||||
precache_scripted_fx();
|
||||
precache_fxanim_props();
|
||||
maps/mp/createfx/zm_buried_fx::main();
|
||||
precache_createfx_fx();
|
||||
precache_scripted_fx();
|
||||
precache_fxanim_props();
|
||||
maps\mp\createfx\zm_buried_fx::main();
|
||||
}
|
||||
|
||||
precache_scripted_fx()
|
||||
{
|
||||
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_flare" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" );
|
||||
level._effect[ "poltergeist" ] = loadfx( "misc/fx_zombie_couch_effect" );
|
||||
level._effect[ "zomb_gib" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" );
|
||||
level._effect[ "blue_eyes" ] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" );
|
||||
level._effect[ "orange_eyes" ] = loadfx( "misc/fx_zombie_eye_single" );
|
||||
level._effect[ "player_possessed_eyes" ] = loadfx( "maps/zombie_buried/fx_buried_eye_stulhinger" );
|
||||
gametype = getDvar( "ui_gametype" );
|
||||
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" );
|
||||
}
|
||||
if ( isDefined( 0 ) && 0 )
|
||||
{
|
||||
level._effect[ "player_3rd_spotlight_lite" ] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_lite" );
|
||||
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[ "oillamp" ] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern" );
|
||||
}
|
||||
level._effect[ "booze_candy_spawn" ] = loadfx( "maps/zombie_buried/fx_buried_booze_candy_spawn" );
|
||||
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[ "rise_dust_foliage" ] = loadfx( "maps/zombie/fx_zm_buried_hedge_dustfall_body" );
|
||||
level._effect[ "fx_buried_key_glint" ] = loadfx( "maps/zombie_buried/fx_buried_key_glint" );
|
||||
level._effect[ "sq_glow" ] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern_ghost" );
|
||||
level._effect[ "vulture_fx_wisp" ] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_center" );
|
||||
level._effect[ "vulture_fx_wisp_orb" ] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_orbit" );
|
||||
level._effect[ "fx_wisp_m" ] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_os" );
|
||||
level._effect[ "fx_wisp_lg_m" ] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_lg_os" );
|
||||
level._effect[ "sq_bulb_blue" ] = loadfx( "maps/zombie_buried/fx_buried_eg_blu" );
|
||||
level._effect[ "sq_bulb_orange" ] = loadfx( "maps/zombie_buried/fx_buried_eg_orng" );
|
||||
level._effect[ "sq_bulb_green" ] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_green" );
|
||||
level._effect[ "sq_bulb_yellow" ] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_yellow" );
|
||||
level._effect[ "sq_ether_amp_trail" ] = loadfx( "maps/zombie_buried/fx_buried_ether_amp_trail" );
|
||||
level._effect[ "sq_tower_r" ] = loadfx( "maps/zombie_buried/fx_buried_tower_power_blue" );
|
||||
level._effect[ "sq_tower_m" ] = loadfx( "maps/zombie_buried/fx_buried_tower_power_orange" );
|
||||
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" );
|
||||
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_flare"] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" );
|
||||
level._effect["poltergeist"] = loadfx( "misc/fx_zombie_couch_effect" );
|
||||
level._effect["zomb_gib"] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" );
|
||||
level._effect["blue_eyes"] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" );
|
||||
level._effect["orange_eyes"] = loadfx( "misc/fx_zombie_eye_single" );
|
||||
level._effect["player_possessed_eyes"] = loadfx( "maps/zombie_buried/fx_buried_eye_stulhinger" );
|
||||
gametype = getdvar( "ui_gametype" );
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
if ( isdefined( 0 ) && 0 )
|
||||
{
|
||||
level._effect["player_3rd_spotlight_lite"] = loadfx( "maps/zombie_buried/fx_buried_spot_flkr_lite" );
|
||||
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["oillamp"] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern" );
|
||||
}
|
||||
|
||||
level._effect["booze_candy_spawn"] = loadfx( "maps/zombie_buried/fx_buried_booze_candy_spawn" );
|
||||
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["rise_dust_foliage"] = loadfx( "maps/zombie/fx_zm_buried_hedge_dustfall_body" );
|
||||
level._effect["fx_buried_key_glint"] = loadfx( "maps/zombie_buried/fx_buried_key_glint" );
|
||||
level._effect["sq_glow"] = loadfx( "maps/zombie_buried/fx_buried_glow_lantern_ghost" );
|
||||
level._effect["vulture_fx_wisp"] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_center" );
|
||||
level._effect["vulture_fx_wisp_orb"] = loadfx( "maps/zombie_buried/fx_buried_richt_whisp_orbit" );
|
||||
level._effect["fx_wisp_m"] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_os" );
|
||||
level._effect["fx_wisp_lg_m"] = loadfx( "maps/zombie_buried/fx_buried_maxis_whisp_lg_os" );
|
||||
level._effect["sq_bulb_blue"] = loadfx( "maps/zombie_buried/fx_buried_eg_blu" );
|
||||
level._effect["sq_bulb_orange"] = loadfx( "maps/zombie_buried/fx_buried_eg_orng" );
|
||||
level._effect["sq_bulb_green"] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_green" );
|
||||
level._effect["sq_bulb_yellow"] = loadfx( "maps/zombie_buried/fx_buried_sq_bulb_yellow" );
|
||||
level._effect["sq_ether_amp_trail"] = loadfx( "maps/zombie_buried/fx_buried_ether_amp_trail" );
|
||||
level._effect["sq_tower_r"] = loadfx( "maps/zombie_buried/fx_buried_tower_power_blue" );
|
||||
level._effect["sq_tower_m"] = loadfx( "maps/zombie_buried/fx_buried_tower_power_orange" );
|
||||
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()
|
||||
{
|
||||
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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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" );
|
||||
}
|
||||
|
||||
#using_animtree("fxanim_props_dlc3");
|
||||
|
||||
precache_fxanim_props()
|
||||
{
|
||||
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" ][ "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" ][ "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_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" ][ "lsat_catwalk" ] = %fxanim_zom_buried_catwalk_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_close" ] = %o_zombie_end_game_close;
|
||||
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" ][ "clock_old" ] = %fxanim_gp_clock_old_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" ][ "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" ][ "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_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" ][ "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" ][ "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_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_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_graveyard" ] = %fxanim_zom_buried_falling_rocks_graveyard_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_down" ] = %o_zombie_maze_switch_down;
|
||||
level.maze_switch_anim[ "switch_neutral" ] = %o_zombie_maze_switch_neutral;
|
||||
level.scr_anim[ "fxanim_props" ][ "bank_sign" ] = %fxanim_zom_buried_sign_bank_anim;
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
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"]["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"]["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_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"]["lsat_catwalk"] = %fxanim_zom_buried_catwalk_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_close"] = %o_zombie_end_game_close;
|
||||
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"]["clock_old"] = %fxanim_gp_clock_old_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"]["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"]["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_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"]["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"]["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_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_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_graveyard"] = %fxanim_zom_buried_falling_rocks_graveyard_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_down"] = %o_zombie_maze_switch_down;
|
||||
level.maze_switch_anim["switch_neutral"] = %o_zombie_maze_switch_neutral;
|
||||
level.scr_anim["fxanim_props"]["bank_sign"] = %fxanim_zom_buried_sign_bank_anim;
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
@ -1,245 +1,247 @@
|
||||
//checked includes changed to match cerberus output
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zm_buried_grief_street;
|
||||
#include maps/mp/zm_buried_turned_street;
|
||||
#include maps/mp/zm_buried_classic;
|
||||
#include maps/mp/zm_buried;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_game_module;
|
||||
#include maps\mp\gametypes_zm\_zm_gametype;
|
||||
#include maps\mp\zombies\_zm_buildables;
|
||||
#include maps\mp\zm_buried;
|
||||
#include maps\mp\zm_buried_classic;
|
||||
#include maps\mp\zm_buried_turned_street;
|
||||
#include maps\mp\zm_buried_grief_street;
|
||||
#include maps\mp\zombies\_zm_zonemgr;
|
||||
#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( "zcleansed", maps/mp/zm_buried::zcleansed_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( "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_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( "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( "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 );
|
||||
}
|
||||
|
||||
deletechalktriggers() //checked matches cerberus output
|
||||
deletechalktriggers()
|
||||
{
|
||||
chalk_triggers = getentarray( "chalk_buildable_trigger", "targetname" );
|
||||
array_thread( chalk_triggers, ::self_delete );
|
||||
chalk_triggers = getentarray( "chalk_buildable_trigger", "targetname" );
|
||||
array_thread( chalk_triggers, ::self_delete );
|
||||
}
|
||||
|
||||
deletebuyabledoors() //checked changed to match cerberus output
|
||||
deletebuyabledoors()
|
||||
{
|
||||
doors_trigs = getentarray( "zombie_door", "targetname" );
|
||||
foreach(door in doors_trigs)
|
||||
{
|
||||
doors = getentarray( door.target, "targetname" );
|
||||
array_thread( doors, ::self_delete );
|
||||
}
|
||||
array_thread( doors_trigs, ::self_delete );
|
||||
doors_trigs = getentarray( "zombie_door", "targetname" );
|
||||
|
||||
foreach ( door in doors_trigs )
|
||||
{
|
||||
doors = getentarray( door.target, "targetname" );
|
||||
array_thread( doors, ::self_delete );
|
||||
}
|
||||
|
||||
array_thread( doors_trigs, ::self_delete );
|
||||
}
|
||||
|
||||
deletebuyabledebris( justtriggers ) //checked changed to match cerberus output
|
||||
deletebuyabledebris( justtriggers )
|
||||
{
|
||||
debris_trigs = getentarray( "zombie_debris", "targetname" );
|
||||
while ( !is_true( justtriggers ) )
|
||||
{
|
||||
foreach ( trig in debris_trigs )
|
||||
{
|
||||
if ( isDefined( trig.script_flag ) )
|
||||
{
|
||||
flag_set( trig.script_flag );
|
||||
}
|
||||
parts = getentarray( trig.target, "targetname" );
|
||||
array_thread( parts, ::self_delete );
|
||||
}
|
||||
}
|
||||
array_thread( debris_trigs, ::self_delete );
|
||||
debris_trigs = getentarray( "zombie_debris", "targetname" );
|
||||
|
||||
if ( !is_true( justtriggers ) )
|
||||
{
|
||||
foreach ( trig in debris_trigs )
|
||||
{
|
||||
if ( isdefined( trig.script_flag ) )
|
||||
flag_set( trig.script_flag );
|
||||
|
||||
parts = getentarray( trig.target, "targetname" );
|
||||
array_thread( parts, ::self_delete );
|
||||
}
|
||||
}
|
||||
|
||||
array_thread( debris_trigs, ::self_delete );
|
||||
}
|
||||
|
||||
deleteslothbarricades( justtriggers ) //checked changed to match cerberus output
|
||||
deleteslothbarricades( justtriggers )
|
||||
{
|
||||
sloth_trigs = getentarray( "sloth_barricade", "targetname" );
|
||||
while ( !is_true( justtriggers ) )
|
||||
{
|
||||
foreach ( trig in sloth_trigs )
|
||||
{
|
||||
if ( isDefined( trig.script_flag ) && level flag_exists( trig.script_flag ) )
|
||||
{
|
||||
flag_set( trig.script_flag );
|
||||
}
|
||||
parts = getentarray( trig.target, "targetname" );
|
||||
array_thread( parts, ::self_delete );
|
||||
}
|
||||
}
|
||||
array_thread( sloth_trigs, ::self_delete );
|
||||
sloth_trigs = getentarray( "sloth_barricade", "targetname" );
|
||||
|
||||
if ( !is_true( justtriggers ) )
|
||||
{
|
||||
foreach ( trig in sloth_trigs )
|
||||
{
|
||||
if ( isdefined( trig.script_flag ) && level flag_exists( trig.script_flag ) )
|
||||
flag_set( trig.script_flag );
|
||||
|
||||
parts = getentarray( trig.target, "targetname" );
|
||||
array_thread( parts, ::self_delete );
|
||||
}
|
||||
}
|
||||
|
||||
array_thread( sloth_trigs, ::self_delete );
|
||||
}
|
||||
|
||||
deleteslothbarricade( location ) //checked changed to match cerberus output
|
||||
deleteslothbarricade( location )
|
||||
{
|
||||
sloth_trigs = getentarray( "sloth_barricade", "targetname" );
|
||||
foreach ( trig in sloth_trigs )
|
||||
{
|
||||
if ( isDefined( trig.script_location ) && trig.script_location == location )
|
||||
{
|
||||
if ( isDefined( trig.script_flag ) )
|
||||
{
|
||||
flag_set( trig.script_flag );
|
||||
}
|
||||
parts = getentarray( trig.target, "targetname" );
|
||||
array_thread( parts, ::self_delete );
|
||||
}
|
||||
}
|
||||
sloth_trigs = getentarray( "sloth_barricade", "targetname" );
|
||||
|
||||
foreach ( trig in sloth_trigs )
|
||||
{
|
||||
if ( isdefined( trig.script_location ) && trig.script_location == location )
|
||||
{
|
||||
if ( isdefined( trig.script_flag ) )
|
||||
flag_set( trig.script_flag );
|
||||
|
||||
parts = getentarray( trig.target, "targetname" );
|
||||
array_thread( parts, ::self_delete );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
spawnmapcollision( collision_model, origin ) //checked matches cerberus output
|
||||
spawnmapcollision( collision_model, origin )
|
||||
{
|
||||
if ( !isDefined( origin ) )
|
||||
{
|
||||
origin = ( 0, 0, 0 );
|
||||
}
|
||||
collision = spawn( "script_model", origin, 1 );
|
||||
collision setmodel( collision_model );
|
||||
collision disconnectpaths();
|
||||
if ( !isdefined( origin ) )
|
||||
origin = ( 0, 0, 0 );
|
||||
|
||||
collision = spawn( "script_model", origin, 1 );
|
||||
collision setmodel( collision_model );
|
||||
collision disconnectpaths();
|
||||
}
|
||||
|
||||
turnperkon( perk ) //checked matches cerberus output
|
||||
turnperkon( perk )
|
||||
{
|
||||
level notify( perk + "_on" );
|
||||
wait_network_frame();
|
||||
level notify( perk + "_on" );
|
||||
wait_network_frame();
|
||||
}
|
||||
|
||||
disableallzonesexcept( zones ) //checked changed to match cerberus output see compiler_limitations.md No. 1
|
||||
disableallzonesexcept( zones )
|
||||
{
|
||||
foreach ( zone in zones )
|
||||
{
|
||||
level thread maps/mp/zombies/_zm_zonemgr::enable_zone( zone );
|
||||
}
|
||||
zoneindex = 0;
|
||||
foreach ( zone in level.zones )
|
||||
{
|
||||
should_disable = 1;
|
||||
for ( i = 0; i > zones.size; i++ )
|
||||
{
|
||||
if ( zoneindex == i )
|
||||
{
|
||||
should_disable = 0;
|
||||
}
|
||||
}
|
||||
if ( is_true( should_disable ) )
|
||||
{
|
||||
zones[ i ].is_enabled = 0;
|
||||
zones[ i ].is_spawning_allowed = 0;
|
||||
}
|
||||
zoneindex++;
|
||||
}
|
||||
foreach ( zone in zones )
|
||||
level thread maps\mp\zombies\_zm_zonemgr::enable_zone( zone );
|
||||
|
||||
foreach ( zoneindex, zone in level.zones )
|
||||
{
|
||||
should_disable = 1;
|
||||
|
||||
foreach ( cleared_zone in zones )
|
||||
{
|
||||
if ( zoneindex == cleared_zone )
|
||||
should_disable = 0;
|
||||
}
|
||||
|
||||
if ( is_true( should_disable ) )
|
||||
{
|
||||
zone.is_enabled = 0;
|
||||
zone.is_spawning_allowed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 ] ) )
|
||||
{
|
||||
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 ] ) )
|
||||
{
|
||||
level.zones[ adjacent_zone ].adjacent_zones[ main_zone ] = undefined;
|
||||
}
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
foreach ( stub in level.chalk_builds )
|
||||
{
|
||||
wallbuy = getstruct( stub.target, "targetname" );
|
||||
if ( isDefined( wallbuy.script_location ) && wallbuy.script_location == location )
|
||||
{
|
||||
if ( !isDefined( wallbuy.script_noteworthy ) || issubstr( wallbuy.script_noteworthy, match_string ) )
|
||||
{
|
||||
maps/mp/zombies/_zm_weapons::add_dynamic_wallbuy( weaponname, wallbuy.targetname, 1 );
|
||||
thread wait_and_remove( stub, stub.buildablezone.pieces[ 0 ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
match_string = level.scr_zm_ui_gametype + "_" + level.scr_zm_map_start_location;
|
||||
|
||||
foreach ( stub in level.chalk_builds )
|
||||
{
|
||||
wallbuy = getstruct( stub.target, "targetname" );
|
||||
|
||||
if ( isdefined( wallbuy.script_location ) && wallbuy.script_location == location )
|
||||
{
|
||||
if ( !isdefined( wallbuy.script_noteworthy ) || issubstr( wallbuy.script_noteworthy, match_string ) )
|
||||
{
|
||||
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 ];
|
||||
foreach ( stub in level.buildable_stubs )
|
||||
{
|
||||
if ( !isDefined( buildable ) || stub.equipname == buildable )
|
||||
{
|
||||
if ( isDefined( buildable ) || stub.persistent != 3 )
|
||||
{
|
||||
stub maps/mp/zombies/_zm_buildables::buildablestub_finish_build( player );
|
||||
stub maps/mp/zombies/_zm_buildables::buildablestub_remove();
|
||||
for ( i = 0; i < stub.buildablezone.pieces.size; i++ )
|
||||
{
|
||||
stub.buildablezone.pieces[ i ] maps/mp/zombies/_zm_buildables::piece_unspawn();
|
||||
}
|
||||
stub.model notsolid();
|
||||
stub.model show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
player = get_players()[0];
|
||||
|
||||
foreach ( stub in level.buildable_stubs )
|
||||
{
|
||||
if ( !isdefined( buildable ) || stub.equipname == buildable )
|
||||
{
|
||||
if ( isdefined( buildable ) || stub.persistent != 3 )
|
||||
{
|
||||
stub maps\mp\zombies\_zm_buildables::buildablestub_finish_build( player );
|
||||
stub maps\mp\zombies\_zm_buildables::buildablestub_remove();
|
||||
|
||||
foreach ( piece in stub.buildablezone.pieces )
|
||||
piece maps\mp\zombies\_zm_buildables::piece_unspawn();
|
||||
|
||||
stub.model notsolid();
|
||||
stub.model show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wait_and_remove( stub, piece ) //checked matches cerberus output
|
||||
wait_and_remove( stub, piece )
|
||||
{
|
||||
wait 0.1;
|
||||
self buildablestub_remove();
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub );
|
||||
piece piece_unspawn();
|
||||
wait 0.1;
|
||||
self buildablestub_remove();
|
||||
thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( stub );
|
||||
piece piece_unspawn();
|
||||
}
|
||||
|
||||
generatebuildabletarps() //checked changed to match cerberus output
|
||||
generatebuildabletarps()
|
||||
{
|
||||
struct_locations = getstructarray( "buildables_tarp", "targetname" );
|
||||
level.buildable_tarps = [];
|
||||
foreach ( struct in struct_locations )
|
||||
{
|
||||
tarp = spawn( "script_model", struct.origin );
|
||||
tarp.angles = struct.angles;
|
||||
tarp setmodel( "p6_zm_bu_buildable_bench_tarp" );
|
||||
tarp.targetname = "buildable_tarp";
|
||||
if ( isDefined( struct.script_location ) )
|
||||
{
|
||||
tarp.script_location = struct.script_location;
|
||||
}
|
||||
level.buildable_tarps[ level.buildable_tarps.size ] = tarp;
|
||||
}
|
||||
struct_locations = getstructarray( "buildables_tarp", "targetname" );
|
||||
level.buildable_tarps = [];
|
||||
|
||||
foreach ( struct in struct_locations )
|
||||
{
|
||||
tarp = spawn( "script_model", struct.origin );
|
||||
tarp.angles = struct.angles;
|
||||
tarp setmodel( "p6_zm_bu_buildable_bench_tarp" );
|
||||
tarp.targetname = "buildable_tarp";
|
||||
|
||||
if ( isdefined( struct.script_location ) )
|
||||
tarp.script_location = struct.script_location;
|
||||
|
||||
level.buildable_tarps[level.buildable_tarps.size] = tarp;
|
||||
}
|
||||
}
|
||||
|
||||
deletebuildabletarp( location ) //checked changed to match cerberus output
|
||||
deletebuildabletarp( location )
|
||||
{
|
||||
foreach ( tarp in level.buildable_tarps )
|
||||
{
|
||||
if ( isDefined( tarp.script_location ) && tarp.script_location == location )
|
||||
{
|
||||
tarp delete();
|
||||
}
|
||||
}
|
||||
foreach ( tarp in level.buildable_tarps )
|
||||
{
|
||||
if ( isdefined( tarp.script_location ) && tarp.script_location == location )
|
||||
tarp delete();
|
||||
}
|
||||
}
|
||||
|
||||
powerswitchstate( on ) //checked matches cerberus output
|
||||
powerswitchstate( on )
|
||||
{
|
||||
trigger = getent( "use_elec_switch", "targetname" );
|
||||
if ( isDefined( trigger ) )
|
||||
{
|
||||
trigger delete();
|
||||
}
|
||||
master_switch = getent( "elec_switch", "targetname" );
|
||||
if ( isDefined( master_switch ) )
|
||||
{
|
||||
master_switch notsolid();
|
||||
if ( is_true( on ) )
|
||||
{
|
||||
master_switch rotateroll( -90, 0.3 );
|
||||
flag_set( "power_on" );
|
||||
}
|
||||
}
|
||||
trigger = getent( "use_elec_switch", "targetname" );
|
||||
|
||||
if ( isdefined( trigger ) )
|
||||
trigger delete();
|
||||
|
||||
master_switch = getent( "elec_switch", "targetname" );
|
||||
|
||||
if ( isdefined( master_switch ) )
|
||||
{
|
||||
master_switch notsolid();
|
||||
|
||||
if ( is_true( on ) )
|
||||
{
|
||||
master_switch rotateroll( -90, 0.3 );
|
||||
flag_set( "power_on" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,108 +1,110 @@
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_equip_subwoofer;
|
||||
#include maps/mp/zombies/_zm_equip_springpad;
|
||||
#include maps/mp/zombies/_zm_equip_turbine;
|
||||
#include maps/mp/zm_buried_buildables;
|
||||
#include maps/mp/zm_buried_gamemodes;
|
||||
#include maps/mp/zombies/_zm_race_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_race_utility;
|
||||
#include maps\mp\zm_buried_gamemodes;
|
||||
#include maps\mp\zm_buried_buildables;
|
||||
#include maps\mp\zombies\_zm_equip_turbine;
|
||||
#include maps\mp\zombies\_zm_equip_springpad;
|
||||
#include maps\mp\zombies\_zm_equip_subwoofer;
|
||||
#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( "p6_zm_bu_buildable_bench_tarp" );
|
||||
level.chalk_buildable_pieces_hide = 1;
|
||||
griefbuildables = array( "chalk", "turbine", "springpad_zm", "subwoofer_zm" );
|
||||
maps/mp/zm_buried_buildables::include_buildables( griefbuildables );
|
||||
maps/mp/zm_buried_buildables::init_buildables( griefbuildables );
|
||||
maps/mp/zombies/_zm_equip_turbine::init();
|
||||
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_subwoofer::init( &"ZM_BURIED_EQ_SW_PHS", &"ZM_BURIED_EQ_SW_HTS" );
|
||||
precachemodel( "zm_collision_buried_street_grief" );
|
||||
precachemodel( "p6_zm_bu_buildable_bench_tarp" );
|
||||
level.chalk_buildable_pieces_hide = 1;
|
||||
griefbuildables = array( "chalk", "turbine", "springpad_zm", "subwoofer_zm" );
|
||||
maps\mp\zm_buried_buildables::include_buildables( griefbuildables );
|
||||
maps\mp\zm_buried_buildables::init_buildables( griefbuildables );
|
||||
maps\mp\zombies\_zm_equip_turbine::init();
|
||||
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_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" );
|
||||
court_chest = getstruct( "courtroom_chest1", "script_noteworthy" );
|
||||
tunnel_chest = getstruct( "tunnels_chest1", "script_noteworthy" );
|
||||
jail_chest = getstruct( "jail_chest1", "script_noteworthy" );
|
||||
gun_chest = getstruct( "gunshop_chest", "script_noteworthy" );
|
||||
setdvar( "disableLookAtEntityLogic", 1 );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = start_chest;
|
||||
level.chests[ level.chests.size ] = court_chest;
|
||||
level.chests[ level.chests.size ] = tunnel_chest;
|
||||
level.chests[ level.chests.size ] = jail_chest;
|
||||
level.chests[ level.chests.size ] = gun_chest;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" );
|
||||
start_chest = getstruct( "start_chest", "script_noteworthy" );
|
||||
court_chest = getstruct( "courtroom_chest1", "script_noteworthy" );
|
||||
tunnel_chest = getstruct( "tunnels_chest1", "script_noteworthy" );
|
||||
jail_chest = getstruct( "jail_chest1", "script_noteworthy" );
|
||||
gun_chest = getstruct( "gunshop_chest", "script_noteworthy" );
|
||||
setdvar( "disableLookAtEntityLogic", 1 );
|
||||
level.chests = [];
|
||||
level.chests[level.chests.size] = start_chest;
|
||||
level.chests[level.chests.size] = court_chest;
|
||||
level.chests[level.chests.size] = tunnel_chest;
|
||||
level.chests[level.chests.size] = jail_chest;
|
||||
level.chests[level.chests.size] = gun_chest;
|
||||
maps\mp\zombies\_zm_magicbox::treasure_chest_init( "start_chest" );
|
||||
}
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
level.buildables_built[ "pap" ] = 1;
|
||||
level.equipment_team_pick_up = 1;
|
||||
level thread maps/mp/zombies/_zm_buildables::think_buildables();
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "street" );
|
||||
street_treasure_chest_init();
|
||||
generatebuildabletarps();
|
||||
deletebuildabletarp( "courthouse" );
|
||||
deletebuildabletarp( "bar" );
|
||||
deletebuildabletarp( "generalstore" );
|
||||
deleteslothbarricades();
|
||||
powerswitchstate( 1 );
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
spawnmapcollision( "zm_collision_buried_street_grief" );
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 1;
|
||||
builddynamicwallbuys();
|
||||
buildbuildables();
|
||||
turnperkon( "revive" );
|
||||
turnperkon( "doubletap" );
|
||||
turnperkon( "marathon" );
|
||||
turnperkon( "juggernog" );
|
||||
turnperkon( "sleight" );
|
||||
turnperkon( "additionalprimaryweapon" );
|
||||
turnperkon( "Pack_A_Punch" );
|
||||
level.buildables_built["pap"] = 1;
|
||||
level.equipment_team_pick_up = 1;
|
||||
level thread maps\mp\zombies\_zm_buildables::think_buildables();
|
||||
maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "street" );
|
||||
street_treasure_chest_init();
|
||||
generatebuildabletarps();
|
||||
deletebuildabletarp( "courthouse" );
|
||||
deletebuildabletarp( "bar" );
|
||||
deletebuildabletarp( "generalstore" );
|
||||
deleteslothbarricades();
|
||||
powerswitchstate( 1 );
|
||||
level.enemy_location_override_func = ::enemy_location_override;
|
||||
spawnmapcollision( "zm_collision_buried_street_grief" );
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
wait 1;
|
||||
builddynamicwallbuys();
|
||||
buildbuildables();
|
||||
turnperkon( "revive" );
|
||||
turnperkon( "doubletap" );
|
||||
turnperkon( "marathon" );
|
||||
turnperkon( "juggernog" );
|
||||
turnperkon( "sleight" );
|
||||
turnperkon( "additionalprimaryweapon" );
|
||||
turnperkon( "Pack_A_Punch" );
|
||||
}
|
||||
|
||||
enemy_location_override( zombie, enemy ) //checked matches cerberus output
|
||||
enemy_location_override( zombie, enemy )
|
||||
{
|
||||
location = enemy.origin;
|
||||
if ( isDefined( self.reroute ) && self.reroute )
|
||||
{
|
||||
if ( isDefined( self.reroute_origin ) )
|
||||
{
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
}
|
||||
return location;
|
||||
location = enemy.origin;
|
||||
|
||||
if ( isdefined( self.reroute ) && self.reroute )
|
||||
{
|
||||
if ( isdefined( self.reroute_origin ) )
|
||||
location = self.reroute_origin;
|
||||
}
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
builddynamicwallbuys() //checked matches cerberus output
|
||||
builddynamicwallbuys()
|
||||
{
|
||||
builddynamicwallbuy( "bank", "beretta93r_zm" );
|
||||
builddynamicwallbuy( "bar", "pdw57_zm" );
|
||||
builddynamicwallbuy( "church", "ak74u_zm" );
|
||||
builddynamicwallbuy( "courthouse", "mp5k_zm" );
|
||||
builddynamicwallbuy( "generalstore", "m16_zm" );
|
||||
builddynamicwallbuy( "mansion", "an94_zm" );
|
||||
builddynamicwallbuy( "morgue", "svu_zm" );
|
||||
builddynamicwallbuy( "prison", "claymore_zm" );
|
||||
builddynamicwallbuy( "stables", "bowie_knife_zm" );
|
||||
builddynamicwallbuy( "stablesroof", "frag_grenade_zm" );
|
||||
builddynamicwallbuy( "toystore", "tazer_knuckles_zm" );
|
||||
builddynamicwallbuy( "candyshop", "870mcs_zm" );
|
||||
builddynamicwallbuy( "bank", "beretta93r_zm" );
|
||||
builddynamicwallbuy( "bar", "pdw57_zm" );
|
||||
builddynamicwallbuy( "church", "ak74u_zm" );
|
||||
builddynamicwallbuy( "courthouse", "mp5k_zm" );
|
||||
builddynamicwallbuy( "generalstore", "m16_zm" );
|
||||
builddynamicwallbuy( "mansion", "an94_zm" );
|
||||
builddynamicwallbuy( "morgue", "svu_zm" );
|
||||
builddynamicwallbuy( "prison", "claymore_zm" );
|
||||
builddynamicwallbuy( "stables", "bowie_knife_zm" );
|
||||
builddynamicwallbuy( "stablesroof", "frag_grenade_zm" );
|
||||
builddynamicwallbuy( "toystore", "tazer_knuckles_zm" );
|
||||
builddynamicwallbuy( "candyshop", "870mcs_zm" );
|
||||
}
|
||||
|
||||
buildbuildables() //checked matches cerberus output
|
||||
buildbuildables()
|
||||
{
|
||||
buildbuildable( "springpad_zm" );
|
||||
buildbuildable( "subwoofer_zm" );
|
||||
buildbuildable( "turbine" );
|
||||
buildbuildable( "springpad_zm" );
|
||||
buildbuildable( "subwoofer_zm" );
|
||||
buildbuildable( "turbine" );
|
||||
}
|
||||
|
@ -1,62 +1,63 @@
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
#using_animtree( "zm_buried_props" );
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
|
||||
init_jail_animtree()
|
||||
{
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
||||
#using_animtree("zm_buried_props");
|
||||
|
||||
init_jail_anims()
|
||||
{
|
||||
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_close_idle = %o_zombie_sloth_run_into_jail_2_idle_jail;
|
||||
level.jail_close_cower = %o_zombie_sloth_cower_2_close_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_close_idle = %o_zombie_sloth_run_into_jail_2_idle_jail;
|
||||
level.jail_close_cower = %o_zombie_sloth_cower_2_close_door;
|
||||
}
|
||||
|
||||
jailuseanimtree()
|
||||
{
|
||||
self useanimtree( -1 );
|
||||
self useanimtree( -1 );
|
||||
}
|
||||
|
||||
init_jail()
|
||||
{
|
||||
init_jail_anims();
|
||||
level.cell_door = getent( "sloth_cell_door", "targetname" );
|
||||
level.cell_door.clip = getent( level.cell_door.target, "targetname" );
|
||||
level.cell_door jailuseanimtree();
|
||||
level.jail_open_door = ::jail_open_door;
|
||||
level.jail_close_door = ::jail_close_door;
|
||||
init_jail_anims();
|
||||
level.cell_door = getent( "sloth_cell_door", "targetname" );
|
||||
level.cell_door.clip = getent( level.cell_door.target, "targetname" );
|
||||
level.cell_door jailuseanimtree();
|
||||
level.jail_open_door = ::jail_open_door;
|
||||
level.jail_close_door = ::jail_close_door;
|
||||
}
|
||||
|
||||
jail_open_door( jumpback )
|
||||
{
|
||||
level.cell_door playsound( "zmb_jail_door_open" );
|
||||
if ( is_true( jumpback ) )
|
||||
{
|
||||
level.cell_door setanim( level.jail_open_jumpback, 1, 1, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
level.cell_door setanim( level.jail_open, 1, 1, 1 );
|
||||
}
|
||||
if ( isDefined( level.cell_door.clip ) )
|
||||
{
|
||||
level.cell_door.clip notsolid();
|
||||
level.cell_door.clip connectpaths();
|
||||
}
|
||||
level.cell_door playsound( "zmb_jail_door_open" );
|
||||
|
||||
if ( is_true( jumpback ) )
|
||||
level.cell_door setanim( level.jail_open_jumpback, 1, 1, 1 );
|
||||
else
|
||||
level.cell_door setanim( level.jail_open, 1, 1, 1 );
|
||||
|
||||
if ( isdefined( level.cell_door.clip ) )
|
||||
{
|
||||
level.cell_door.clip notsolid();
|
||||
level.cell_door.clip connectpaths();
|
||||
}
|
||||
}
|
||||
|
||||
jail_close_door()
|
||||
{
|
||||
level.cell_door playsound( "zmb_jail_door_close" );
|
||||
level.cell_door setanim( level.jail_close_cower, 1, 1, 1 );
|
||||
if ( isDefined( level.cell_door.clip ) )
|
||||
{
|
||||
level.cell_door.clip solid();
|
||||
level.cell_door.clip disconnectpaths();
|
||||
}
|
||||
level.cell_door playsound( "zmb_jail_door_close" );
|
||||
level.cell_door setanim( level.jail_close_cower, 1, 1, 1 );
|
||||
|
||||
if ( isdefined( level.cell_door.clip ) )
|
||||
{
|
||||
level.cell_door.clip solid();
|
||||
level.cell_door.clip disconnectpaths();
|
||||
}
|
||||
}
|
||||
|
@ -1,531 +1,524 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_weap_time_bomb;
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zombies/_zm_equip_headchopper;
|
||||
#include maps/mp/zombies/_zm_net;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_net;
|
||||
#include maps\mp\zombies\_zm_equip_headchopper;
|
||||
#include maps\mp\zombies\_zm_zonemgr;
|
||||
#include maps\mp\zombies\_zm_spawner;
|
||||
#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" );
|
||||
model_list = [];
|
||||
for ( i = 0; i < blocker_locations.size; i++ )
|
||||
{
|
||||
model_list[ blocker_locations[ i ].model ] = 1;
|
||||
}
|
||||
model_names = getarraykeys( model_list );
|
||||
for ( i = 0; i < model_names.size; i++ )
|
||||
{
|
||||
precachemodel( model_names[ i ] );
|
||||
}
|
||||
blocker_locations = getstructarray( "maze_blocker", "targetname" );
|
||||
model_list = [];
|
||||
|
||||
for ( i = 0; i < blocker_locations.size; i++ )
|
||||
model_list[blocker_locations[i].model] = 1;
|
||||
|
||||
model_names = getarraykeys( model_list );
|
||||
|
||||
for ( i = 0; i < model_names.size; 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 ( 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 ].connected_nodes[ j ], self.blocked_nodes[ i ], bignorechangeonmigrate );
|
||||
}
|
||||
}
|
||||
for ( i = 0; i < self.blocked_nodes.size; i++ )
|
||||
{
|
||||
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].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" );
|
||||
foreach ( blocker in blocker_locations )
|
||||
{
|
||||
registerclientfield( "world", "maze_blocker_" + blocker.script_noteworthy, 12000, 1, "int" );
|
||||
}
|
||||
blocker_locations = getstructarray( "maze_blocker", "targetname" );
|
||||
|
||||
foreach ( blocker in blocker_locations )
|
||||
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" );
|
||||
level._maze._blocker_locations = [];
|
||||
for ( i = 0; i < blocker_locations.size; i++ )
|
||||
{
|
||||
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[ j ].connected_nodes = getnodearray( blocker_locations[ i ].blocked_nodes[ j ].target, "targetname" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
blocker_locations[ i ].blocked_nodes = [];
|
||||
}
|
||||
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" ) );
|
||||
randomize_maze_perms();
|
||||
level._maze._active_perm_list = [];
|
||||
blocker_locations = getstructarray( "maze_blocker", "targetname" );
|
||||
level._maze._blocker_locations = [];
|
||||
|
||||
for ( i = 0; i < blocker_locations.size; i++ )
|
||||
{
|
||||
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[j].connected_nodes = getnodearray( blocker_locations[i].blocked_nodes[j].target, "targetname" );
|
||||
}
|
||||
else
|
||||
blocker_locations[i].blocked_nodes = [];
|
||||
|
||||
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" ) );
|
||||
randomize_maze_perms();
|
||||
level._maze._active_perm_list = [];
|
||||
}
|
||||
|
||||
init_maze_blocker_pool() //checked changed to match cerberus output
|
||||
init_maze_blocker_pool()
|
||||
{
|
||||
pool_size = 0;
|
||||
for ( i = 0; i < level._maze._perms.size; i++ )
|
||||
{
|
||||
if ( level._maze._perms[ i ].size > pool_size )
|
||||
{
|
||||
pool_size = level._maze._perms[ i ].size;
|
||||
}
|
||||
}
|
||||
level._maze._blocker_pool = [];
|
||||
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.in_use = 0;
|
||||
level._maze._blocker_pool[ i ] = ent;
|
||||
}
|
||||
level._maze._blocker_pool_num_free = pool_size;
|
||||
pool_size = 0;
|
||||
|
||||
for ( i = 0; i < level._maze._perms.size; i++ )
|
||||
{
|
||||
if ( level._maze._perms[i].size > pool_size )
|
||||
pool_size = level._maze._perms[i].size;
|
||||
}
|
||||
|
||||
level._maze._blocker_pool = [];
|
||||
|
||||
for ( i = 0; i < pool_size; i++ )
|
||||
{
|
||||
ent = spawn( "script_model", level._maze.players_in_maze_volume.origin - vectorscale( ( 0, 0, 1 ), 300.0 ) );
|
||||
ent ghost();
|
||||
ent.in_use = 0;
|
||||
level._maze._blocker_pool[i] = ent;
|
||||
}
|
||||
|
||||
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++ )
|
||||
{
|
||||
if ( !level._maze._blocker_pool[ i ].in_use )
|
||||
{
|
||||
level._maze._blocker_pool[ i ].in_use = 1;
|
||||
level._maze._blocker_pool_num_free--;
|
||||
|
||||
return level._maze._blocker_pool[ i ];
|
||||
}
|
||||
}
|
||||
/*
|
||||
for ( i = 0; i < level._maze._blocker_pool.size; i++ )
|
||||
{
|
||||
if ( !level._maze._blocker_pool[i].in_use )
|
||||
{
|
||||
level._maze._blocker_pool[i].in_use = 1;
|
||||
level._maze._blocker_pool_num_free--;
|
||||
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.origin = level._maze.players_in_maze_volume.origin - vectorScale( ( 0, 0, 1 ), 300 );
|
||||
ent dontinterpolate();
|
||||
ent.in_use = 0;
|
||||
level._maze._blocker_pool_num_free++;
|
||||
ent ghost();
|
||||
ent.origin = level._maze.players_in_maze_volume.origin - vectorscale( ( 0, 0, 1 ), 300.0 );
|
||||
ent dontinterpolate();
|
||||
ent.in_use = 0;
|
||||
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._cur_perm = 0;
|
||||
level._maze._perms = array_randomize( level._maze._perms );
|
||||
level._maze._cur_perm = 0;
|
||||
}
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level._maze = spawnstruct();
|
||||
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" );
|
||||
init_maze_clientfields();
|
||||
init_maze_permutations();
|
||||
init_maze_blocker_pool();
|
||||
init_hedge_maze_spawnpoints();
|
||||
register_custom_spawner_entry( "hedge_location", ::maze_do_zombie_spawn );
|
||||
level thread maze_achievement_watcher();
|
||||
level thread vo_in_maze();
|
||||
level._maze = spawnstruct();
|
||||
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" );
|
||||
init_maze_clientfields();
|
||||
init_maze_permutations();
|
||||
init_maze_blocker_pool();
|
||||
init_hedge_maze_spawnpoints();
|
||||
register_custom_spawner_entry( "hedge_location", ::maze_do_zombie_spawn );
|
||||
level thread maze_achievement_watcher();
|
||||
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 );
|
||||
if ( flag( "start_zombie_round_logic" ) )
|
||||
{
|
||||
level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 );
|
||||
}
|
||||
blocker maps/mp/zombies/_zm_equip_headchopper::destroyheadchopperstouching();
|
||||
blocker moveto( self.origin - vectorScale( ( 0, 0, 1 ), 96 ), 1 );
|
||||
blocker waittill( "movedone" );
|
||||
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();
|
||||
self waittill( "lower_" + self.script_noteworthy );
|
||||
|
||||
if ( flag( "start_zombie_round_logic" ) )
|
||||
level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 );
|
||||
|
||||
blocker maps\mp\zombies\_zm_equip_headchopper::destroyheadchopperstouching();
|
||||
blocker moveto( self.origin - vectorscale( ( 0, 0, 1 ), 96.0 ), 1.0 );
|
||||
|
||||
blocker waittill( "movedone" );
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
delay_destroy_corpses_near_blocker() //checked changed to match cerberus output
|
||||
delay_destroy_corpses_near_blocker()
|
||||
{
|
||||
wait 0.2;
|
||||
corpses = getcorpsearray();
|
||||
if ( isDefined( corpses ) )
|
||||
{
|
||||
foreach ( corpse in corpses )
|
||||
{
|
||||
if ( distancesquared( corpse.origin, self.origin ) < 2304 )
|
||||
{
|
||||
corpse delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0.2;
|
||||
corpses = getcorpsearray();
|
||||
|
||||
if ( isdefined( corpses ) )
|
||||
{
|
||||
foreach ( corpse in corpses )
|
||||
{
|
||||
if ( distancesquared( corpse.origin, self.origin ) < 2304 )
|
||||
corpse delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
maze_blocker_rises_thread() //checked changed to match cerberus output
|
||||
maze_blocker_rises_thread()
|
||||
{
|
||||
blocker = get_free_blocker_model_from_pool();
|
||||
self thread maze_blocker_sinks_thread( blocker );
|
||||
self unlink_nodes_for_blocker_location();
|
||||
blocker.origin = self.origin - vectorScale( ( 0, 0, 1 ), 96 );
|
||||
blocker.angles = self.angles;
|
||||
blocker setmodel( self.model );
|
||||
blocker dontinterpolate();
|
||||
blocker show();
|
||||
wait 0.05;
|
||||
if ( flag( "start_zombie_round_logic" ) )
|
||||
{
|
||||
level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 );
|
||||
}
|
||||
blocker maps/mp/zombies/_zm_equip_headchopper::destroyheadchopperstouching();
|
||||
blocker moveto( self.origin, 0.65 );
|
||||
blocker thread delay_destroy_corpses_near_blocker();
|
||||
blocker waittill( "movedone" );
|
||||
if ( flag( "start_zombie_round_logic" ) )
|
||||
{
|
||||
level setclientfield( "maze_blocker_" + self.script_noteworthy, 0 );
|
||||
}
|
||||
blocker = get_free_blocker_model_from_pool();
|
||||
self thread maze_blocker_sinks_thread( blocker );
|
||||
self unlink_nodes_for_blocker_location();
|
||||
blocker.origin = self.origin - vectorscale( ( 0, 0, 1 ), 96.0 );
|
||||
blocker.angles = self.angles;
|
||||
blocker setmodel( self.model );
|
||||
blocker dontinterpolate();
|
||||
blocker show();
|
||||
wait 0.05;
|
||||
|
||||
if ( flag( "start_zombie_round_logic" ) )
|
||||
level setclientfield( "maze_blocker_" + self.script_noteworthy, 1 );
|
||||
|
||||
blocker maps\mp\zombies\_zm_equip_headchopper::destroyheadchopperstouching();
|
||||
blocker moveto( self.origin, 0.65 );
|
||||
blocker thread delay_destroy_corpses_near_blocker();
|
||||
|
||||
blocker waittill( "movedone" );
|
||||
|
||||
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++;
|
||||
if ( level._maze._cur_perm == level._maze._perms.size )
|
||||
{
|
||||
randomize_maze_perms();
|
||||
}
|
||||
new_perm_list = level._maze._perms[ level._maze._cur_perm ];
|
||||
blockers_raise_list = [];
|
||||
blockers_lower_list = level._maze._active_perm_list;
|
||||
for ( i = 0; i < new_perm_list.size; i++ )
|
||||
{
|
||||
found = 0;
|
||||
for ( j = 0; j < level._maze._active_perm_list.size; j++ )
|
||||
{
|
||||
if ( new_perm_list[ i ] == level._maze._active_perm_list[ j ] )
|
||||
{
|
||||
found = 1;
|
||||
blockers_lower_list[ j ] = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
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._maze._cur_perm++;
|
||||
|
||||
if ( level._maze._cur_perm == level._maze._perms.size )
|
||||
randomize_maze_perms();
|
||||
|
||||
new_perm_list = level._maze._perms[level._maze._cur_perm];
|
||||
blockers_raise_list = [];
|
||||
blockers_lower_list = level._maze._active_perm_list;
|
||||
|
||||
for ( i = 0; i < new_perm_list.size; i++ )
|
||||
{
|
||||
found = 0;
|
||||
|
||||
for ( j = 0; j < level._maze._active_perm_list.size; j++ )
|
||||
{
|
||||
if ( new_perm_list[i] == level._maze._active_perm_list[j] )
|
||||
{
|
||||
found = 1;
|
||||
blockers_lower_list[j] = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
raise_new_perm_blockers( list ) //checked changed to match cerberus output
|
||||
raise_new_perm_blockers( list )
|
||||
{
|
||||
for ( i = 0; i < list.size; i++ )
|
||||
{
|
||||
while ( !free_blockers_available() )
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
level._maze._blocker_locations[ list[ i ] ] thread maze_blocker_rises_thread();
|
||||
wait 0.25;
|
||||
}
|
||||
for ( i = 0; i < list.size; i++ )
|
||||
{
|
||||
while ( !free_blockers_available() )
|
||||
wait 0.1;
|
||||
|
||||
level._maze._blocker_locations[list[i]] thread maze_blocker_rises_thread();
|
||||
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++ )
|
||||
{
|
||||
if ( list[ i ] != "" )
|
||||
{
|
||||
level._maze._blocker_locations[ list[ i ] ] notify( "lower_" + list[ i ] );
|
||||
}
|
||||
wait 0.25;
|
||||
}
|
||||
for ( i = 0; i < list.size; i++ )
|
||||
{
|
||||
if ( list[i] != "" )
|
||||
level._maze._blocker_locations[list[i]] notify( "lower_" + list[i] );
|
||||
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
maze_debug_print( str ) //checked matches cerberus output could not find dvar
|
||||
maze_debug_print( str )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( getDvar( #"55B04A98" ) != "" )
|
||||
{
|
||||
println( "Maze : " + str );
|
||||
if ( getdvar( _hash_55B04A98 ) != "" )
|
||||
println( "Maze : " + str );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
maze_can_change() //checked changed to match cerberus output
|
||||
maze_can_change()
|
||||
{
|
||||
players = getplayers();
|
||||
foreach ( player in players )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
foreach ( player in players )
|
||||
{
|
||||
if ( player.sessionstate != "spectator" && player istouching( level._maze.players_can_see_maze_volume ) )
|
||||
{
|
||||
if ( player maps/mp/zombies/_zm_utility::is_player_looking_at( level._maze.players_in_maze_volume.origin, 0.5, 0 ) )
|
||||
{
|
||||
maze_debug_print( "Player " + player getentitynumber() + " looking at maze. Maze cannot change." );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
maze_debug_print( "Maze mutating." );
|
||||
return 1;
|
||||
players = getplayers();
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
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 false;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
if ( player.sessionstate != "spectator" && player istouching( level._maze.players_can_see_maze_volume ) )
|
||||
{
|
||||
if ( player maps\mp\zombies\_zm_utility::is_player_looking_at( level._maze.players_in_maze_volume.origin, 0.5, 0 ) )
|
||||
{
|
||||
maze_debug_print( "Player " + player getentitynumber() + " looking at maze. Maze cannot change." );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
maze_debug_print( "Maze mutating." );
|
||||
return true;
|
||||
}
|
||||
|
||||
maze_think() //checked matches cerberus output
|
||||
maze_think()
|
||||
{
|
||||
wait 0.1;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( maze_can_change() )
|
||||
{
|
||||
maze_do_perm_change();
|
||||
level notify( "zm_buried_maze_changed" );
|
||||
}
|
||||
wait 10;
|
||||
}
|
||||
wait 0.1;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( maze_can_change() )
|
||||
{
|
||||
maze_do_perm_change();
|
||||
level notify( "zm_buried_maze_changed" );
|
||||
}
|
||||
|
||||
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" );
|
||||
spots = level.maze_hedge_spawnpoints;
|
||||
spot = undefined;
|
||||
/*
|
||||
self endon( "death" );
|
||||
spots = level.maze_hedge_spawnpoints;
|
||||
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 );
|
||||
if ( isDefined( players_in_maze ) && players_in_maze.size != 0 )
|
||||
{
|
||||
player = random( players_in_maze );
|
||||
maxdistance = 256;
|
||||
if ( randomint( 100 ) > 75 )
|
||||
{
|
||||
maxdistance = 512;
|
||||
}
|
||||
closest_spots = get_array_of_closest( player.origin, spots, undefined, undefined, maxdistance );
|
||||
favoritespots = [];
|
||||
foreach ( close_spot in closest_spots )
|
||||
{
|
||||
if ( within_fov( close_spot.origin, close_spot.angles, player.origin, -0.75 ) )
|
||||
{
|
||||
favoritespots[ favoritespots.size ] = close_spot;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( randomint( 100 ) > 75 )
|
||||
{
|
||||
favoritespots[ favoritespots.size ] = close_spot;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( favoritespots ) && favoritespots.size >= 2 )
|
||||
{
|
||||
spot = random( favoritespots );
|
||||
}
|
||||
else if ( isDefined( closest_spots ) && closest_spots.size > 0 )
|
||||
{
|
||||
spot = random( closest_spots );
|
||||
}
|
||||
}
|
||||
if ( !isDefined( spot ) )
|
||||
{
|
||||
spot = random( spots );
|
||||
}
|
||||
self.spawn_point = spot;
|
||||
if ( isDefined( spot.target ) )
|
||||
{
|
||||
self.target = spot.target;
|
||||
}
|
||||
if ( isDefined( spot.zone_name ) )
|
||||
{
|
||||
self.zone_name = spot.zone_name;
|
||||
}
|
||||
if ( isDefined( spot.script_parameters ) )
|
||||
{
|
||||
self.script_parameters = spot.script_parameters;
|
||||
}
|
||||
self thread maze_do_zombie_rise( spot );
|
||||
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 )
|
||||
{
|
||||
player = random( players_in_maze );
|
||||
maxdistance = 256;
|
||||
|
||||
if ( randomint( 100 ) > 75 )
|
||||
maxdistance = 512;
|
||||
|
||||
closest_spots = get_array_of_closest( player.origin, spots, undefined, undefined, maxdistance );
|
||||
favoritespots = [];
|
||||
|
||||
foreach ( close_spot in closest_spots )
|
||||
{
|
||||
if ( within_fov( close_spot.origin, close_spot.angles, player.origin, -0.75 ) )
|
||||
{
|
||||
favoritespots[favoritespots.size] = close_spot;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( randomint( 100 ) > 75 )
|
||||
favoritespots[favoritespots.size] = close_spot;
|
||||
}
|
||||
|
||||
if ( isdefined( favoritespots ) && favoritespots.size >= 2 )
|
||||
spot = random( favoritespots );
|
||||
else if ( isdefined( closest_spots ) && closest_spots.size > 0 )
|
||||
spot = random( closest_spots );
|
||||
}
|
||||
|
||||
if ( !isdefined( spot ) )
|
||||
spot = random( spots );
|
||||
|
||||
self.spawn_point = spot;
|
||||
|
||||
if ( isdefined( spot.target ) )
|
||||
self.target = spot.target;
|
||||
|
||||
if ( isdefined( spot.zone_name ) )
|
||||
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.in_the_ground = 1;
|
||||
if ( isDefined( self.anchor ) )
|
||||
{
|
||||
self.anchor delete();
|
||||
}
|
||||
self.anchor = spawn( "script_origin", self.origin );
|
||||
self.anchor.angles = self.angles;
|
||||
self linkto( self.anchor );
|
||||
if ( !isDefined( spot.angles ) )
|
||||
{
|
||||
spot.angles = ( 0, 0, 0 );
|
||||
}
|
||||
anim_org = spot.origin;
|
||||
anim_ang = spot.angles;
|
||||
anim_org += ( 0, 0, 0 );
|
||||
self ghost();
|
||||
self.anchor moveto( anim_org, 0.05 );
|
||||
self.anchor waittill( "movedone" );
|
||||
target_org = get_desired_origin();
|
||||
if ( isDefined( target_org ) )
|
||||
{
|
||||
anim_ang = vectorToAngles( target_org - self.origin );
|
||||
self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0.05 );
|
||||
self.anchor waittill( "rotatedone" );
|
||||
}
|
||||
self unlink();
|
||||
if ( isDefined( self.anchor ) )
|
||||
{
|
||||
self.anchor delete();
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_spawner::hide_pop();
|
||||
level thread maps/mp/zombies/_zm_spawner::zombie_rise_death( self, spot );
|
||||
spot thread maps/mp/zombies/_zm_spawner::zombie_rise_fx( self );
|
||||
substate = 0;
|
||||
if ( self.zombie_move_speed == "walk" )
|
||||
{
|
||||
substate = randomint( 2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
substate = 1;
|
||||
}
|
||||
self orientmode( "face default" );
|
||||
self animscripted( spot.origin, spot.angles, "zm_rise_hedge", substate );
|
||||
self notify( "rise_anim_finished" );
|
||||
spot notify( "stop_zombie_rise_fx" );
|
||||
self.in_the_ground = 0;
|
||||
self notify( "risen", spot.script_string );
|
||||
self endon( "death" );
|
||||
self.in_the_ground = 1;
|
||||
|
||||
if ( isdefined( self.anchor ) )
|
||||
self.anchor delete();
|
||||
|
||||
self.anchor = spawn( "script_origin", self.origin );
|
||||
self.anchor.angles = self.angles;
|
||||
self linkto( self.anchor );
|
||||
|
||||
if ( !isdefined( spot.angles ) )
|
||||
spot.angles = ( 0, 0, 0 );
|
||||
|
||||
anim_org = spot.origin;
|
||||
anim_ang = spot.angles;
|
||||
anim_org += ( 0, 0, 0 );
|
||||
self ghost();
|
||||
self.anchor moveto( anim_org, 0.05 );
|
||||
|
||||
self.anchor waittill( "movedone" );
|
||||
|
||||
target_org = get_desired_origin();
|
||||
|
||||
if ( isdefined( target_org ) )
|
||||
{
|
||||
anim_ang = vectortoangles( target_org - self.origin );
|
||||
self.anchor rotateto( ( 0, anim_ang[1], 0 ), 0.05 );
|
||||
|
||||
self.anchor waittill( "rotatedone" );
|
||||
}
|
||||
|
||||
self unlink();
|
||||
|
||||
if ( isdefined( self.anchor ) )
|
||||
self.anchor delete();
|
||||
|
||||
self thread maps\mp\zombies\_zm_spawner::hide_pop();
|
||||
level thread maps\mp\zombies\_zm_spawner::zombie_rise_death( self, spot );
|
||||
spot thread maps\mp\zombies\_zm_spawner::zombie_rise_fx( self );
|
||||
substate = 0;
|
||||
|
||||
if ( self.zombie_move_speed == "walk" )
|
||||
substate = randomint( 2 );
|
||||
else
|
||||
substate = 1;
|
||||
|
||||
self orientmode( "face default" );
|
||||
self animscripted( spot.origin, spot.angles, "zm_rise_hedge", substate );
|
||||
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 )
|
||||
{
|
||||
level waittill( "start_of_round" );
|
||||
start_maze_achievement_threads();
|
||||
level waittill( "end_of_round" );
|
||||
check_maze_achievement_threads();
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "start_of_round" );
|
||||
|
||||
start_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 )
|
||||
{
|
||||
foreach ( player in get_players() )
|
||||
{
|
||||
player.achievement_player_started_round_in_maze = player is_player_in_zone( "zone_maze" );
|
||||
if ( player.achievement_player_started_round_in_maze )
|
||||
{
|
||||
player thread watch_player_in_maze();
|
||||
}
|
||||
else
|
||||
{
|
||||
player notify( "_maze_achievement_think_done" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( level.round_number >= 20 )
|
||||
{
|
||||
foreach ( player in get_players() )
|
||||
{
|
||||
player.achievement_player_started_round_in_maze = player is_player_in_zone( "zone_maze" );
|
||||
|
||||
if ( player.achievement_player_started_round_in_maze )
|
||||
{
|
||||
player thread watch_player_in_maze();
|
||||
continue;
|
||||
}
|
||||
|
||||
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 endon( "_maze_achievement_think_done" );
|
||||
self endon( "death_or_disconnect" );
|
||||
self.achievement_player_stayed_in_maze_for_entire_round = 1;
|
||||
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 notify( "_maze_achievement_think_done" );
|
||||
self endon( "_maze_achievement_think_done" );
|
||||
self endon( "death_or_disconnect" );
|
||||
self.achievement_player_stayed_in_maze_for_entire_round = 1;
|
||||
|
||||
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.0 ) );
|
||||
}
|
||||
}
|
||||
|
||||
check_maze_achievement_threads() //checked changed to match cerberus output
|
||||
check_maze_achievement_threads()
|
||||
{
|
||||
if ( level.round_number >= 20 )
|
||||
{
|
||||
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 ( level.round_number >= 20 )
|
||||
{
|
||||
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() )
|
||||
{
|
||||
/#
|
||||
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( "_maze_achievement_think_done" );
|
||||
}
|
||||
}
|
||||
}
|
||||
player notify( "player_stayed_in_maze_for_entire_high_level_round" );
|
||||
player notify( "_maze_achievement_think_done" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vo_in_maze() //checked did not change to match cerberus output
|
||||
vo_in_maze()
|
||||
{
|
||||
flag_wait( "mansion_door1" );
|
||||
nwaittime = 300;
|
||||
nminwait = 5;
|
||||
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;
|
||||
}
|
||||
}
|
||||
flag_wait( "mansion_door1" );
|
||||
nwaittime = 300;
|
||||
nminwait = 5;
|
||||
nmaxwait = 10;
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
@ -1,37 +1,43 @@
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_audio;
|
||||
#include maps\mp\zombies\_zm_perks;
|
||||
|
||||
electric_switch()
|
||||
{
|
||||
trig = getent( "use_elec_switch", "targetname" );
|
||||
master_switch = getent( "elec_switch", "targetname" );
|
||||
master_switch notsolid();
|
||||
trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH" );
|
||||
trig setvisibletoall();
|
||||
trig waittill( "trigger", user );
|
||||
trig setinvisibletoall();
|
||||
master_switch rotateroll( -90, 0,3 );
|
||||
master_switch playsound( "zmb_switch_flip" );
|
||||
master_switch playsound( "zmb_poweron" );
|
||||
level delay_thread( 11,8, ::sndpoweronmusicstinger );
|
||||
if ( isDefined( user ) )
|
||||
{
|
||||
user thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "power", "power_on" );
|
||||
}
|
||||
level thread maps/mp/zombies/_zm_perks::perk_unpause_all_perks();
|
||||
master_switch waittill( "rotatedone" );
|
||||
playfx( level._effect[ "switch_sparks" ], master_switch.origin + ( 0, 12, -60 ), anglesToForward( master_switch.angles ) );
|
||||
master_switch playsound( "zmb_turn_on" );
|
||||
level notify( "electric_door" );
|
||||
clientnotify( "power_on" );
|
||||
flag_set( "power_on" );
|
||||
level setclientfield( "zombie_power_on", 1 );
|
||||
trig = getent( "use_elec_switch", "targetname" );
|
||||
master_switch = getent( "elec_switch", "targetname" );
|
||||
master_switch notsolid();
|
||||
trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH" );
|
||||
trig setvisibletoall();
|
||||
|
||||
trig waittill( "trigger", user );
|
||||
|
||||
trig setinvisibletoall();
|
||||
master_switch rotateroll( -90, 0.3 );
|
||||
master_switch playsound( "zmb_switch_flip" );
|
||||
master_switch playsound( "zmb_poweron" );
|
||||
level delay_thread( 11.8, ::sndpoweronmusicstinger );
|
||||
|
||||
if ( isdefined( user ) )
|
||||
user thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "power", "power_on" );
|
||||
|
||||
level thread maps\mp\zombies\_zm_perks::perk_unpause_all_perks();
|
||||
|
||||
master_switch waittill( "rotatedone" );
|
||||
|
||||
playfx( level._effect["switch_sparks"], master_switch.origin + ( 0, 12, -60 ), anglestoforward( master_switch.angles ) );
|
||||
master_switch playsound( "zmb_turn_on" );
|
||||
level notify( "electric_door" );
|
||||
clientnotify( "power_on" );
|
||||
flag_set( "power_on" );
|
||||
level setclientfield( "zombie_power_on", 1 );
|
||||
}
|
||||
|
||||
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
@ -1,208 +1,235 @@
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
|
||||
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()
|
||||
{
|
||||
flag_init( "sq_player_underground" );
|
||||
level thread stage_vo();
|
||||
level thread stage_start_watcher();
|
||||
level._cur_stage_name = "bt";
|
||||
clientnotify( "bt" );
|
||||
flag_init( "sq_player_underground" );
|
||||
level thread stage_vo();
|
||||
level thread stage_start_watcher();
|
||||
level._cur_stage_name = "bt";
|
||||
clientnotify( "bt" );
|
||||
}
|
||||
|
||||
stage_vo()
|
||||
{
|
||||
level waittill( "start_of_round" );
|
||||
level thread stage_vo_watch_underground();
|
||||
wait 5;
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_1_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_2_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_3_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_4_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_5_0" );
|
||||
flag_wait( "sq_player_underground" );
|
||||
level.m_maxis_vo_spot.origin = ( -728, -344, 280 );
|
||||
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" );
|
||||
wait 1;
|
||||
level thread stage_vo_watch_gallows();
|
||||
if ( !level.richcompleted )
|
||||
{
|
||||
if ( isDefined( level.rich_sq_player ) )
|
||||
{
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
|
||||
}
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_1_0", 3 );
|
||||
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 ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 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" );
|
||||
wait 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
|
||||
}
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_3_0", 4 );
|
||||
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 ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
|
||||
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" );
|
||||
wait 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
|
||||
}
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_5_0", 12 );
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_6_0", 8 );
|
||||
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 ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
|
||||
level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_2", "sound_done_vox_plr_1_respond_richtofen_2" );
|
||||
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();
|
||||
level waittill( "start_of_round" );
|
||||
|
||||
level thread stage_vo_watch_underground();
|
||||
wait 5;
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_1_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_2_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_3_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_4_0" );
|
||||
maxissay( "vox_maxi_sidequest_maxis_start_5_0" );
|
||||
flag_wait( "sq_player_underground" );
|
||||
level.m_maxis_vo_spot.origin = ( -728, -344, 280 );
|
||||
|
||||
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" );
|
||||
wait 1;
|
||||
level thread stage_vo_watch_gallows();
|
||||
|
||||
if ( !level.richcompleted )
|
||||
{
|
||||
if ( isdefined( level.rich_sq_player ) )
|
||||
{
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
|
||||
}
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_1_0", 3 );
|
||||
|
||||
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 ) ) )
|
||||
wait 1;
|
||||
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 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" );
|
||||
|
||||
wait 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
|
||||
}
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_3_0", 4 );
|
||||
|
||||
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 ) ) )
|
||||
wait 1;
|
||||
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
|
||||
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" );
|
||||
|
||||
wait 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 0 );
|
||||
}
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_5_0", 12 );
|
||||
richtofensay( "vox_zmba_sidequest_zmba_start_6_0", 8 );
|
||||
|
||||
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 ) ) )
|
||||
wait 1;
|
||||
|
||||
level.rich_sq_player.dontspeak = 1;
|
||||
level.rich_sq_player setclientfieldtoplayer( "isspeaking", 1 );
|
||||
level.rich_sq_player playsoundwithnotify( "vox_plr_1_respond_richtofen_2", "sound_done_vox_plr_1_respond_richtofen_2" );
|
||||
|
||||
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()
|
||||
{
|
||||
level endon( "sq_is_max_tower_built" );
|
||||
level endon( "sq_is_ric_tower_built" );
|
||||
level endon( "end_game_reward_starts_maxis" );
|
||||
level endon( "end_game_reward_starts_richtofen" );
|
||||
s_struct = getstruct( "sq_gallows", "targetname" );
|
||||
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
|
||||
m_maxis_vo_spot setmodel( "tag_origin" );
|
||||
i = 0;
|
||||
while ( i < 5 )
|
||||
{
|
||||
level waittill( "end_of_round" );
|
||||
maxissay( "vox_maxi_sidequest_nag_" + i, m_maxis_vo_spot );
|
||||
richtofensay( "vox_zmba_sidequest_nag_" + i, 10 );
|
||||
i++;
|
||||
}
|
||||
level endon( "sq_is_max_tower_built" );
|
||||
level endon( "sq_is_ric_tower_built" );
|
||||
level endon( "end_game_reward_starts_maxis" );
|
||||
level endon( "end_game_reward_starts_richtofen" );
|
||||
s_struct = getstruct( "sq_gallows", "targetname" );
|
||||
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
|
||||
m_maxis_vo_spot setmodel( "tag_origin" );
|
||||
|
||||
for ( i = 0; i < 5; i++ )
|
||||
{
|
||||
level waittill( "end_of_round" );
|
||||
|
||||
maxissay( "vox_maxi_sidequest_nag_" + i, m_maxis_vo_spot );
|
||||
richtofensay( "vox_zmba_sidequest_nag_" + i, 10 );
|
||||
}
|
||||
}
|
||||
|
||||
stage_vo_watch_guillotine()
|
||||
{
|
||||
level endon( "sq_bt_over" );
|
||||
level endon( "end_game_reward_starts_maxis" );
|
||||
level endon( "end_game_reward_starts_richtofen" );
|
||||
s_struct = getstruct( "sq_guillotine", "targetname" );
|
||||
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
|
||||
trigger waittill( "trigger" );
|
||||
trigger delete();
|
||||
richtofensay( "vox_zmba_sidequest_gallows_0", 9 );
|
||||
richtofensay( "vox_zmba_sidequest_gallows_1", 12 );
|
||||
level waittill( "rtower_object_planted" );
|
||||
richtofensay( "vox_zmba_sidequest_parts_0", 9 );
|
||||
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 );
|
||||
level endon( "sq_bt_over" );
|
||||
level endon( "end_game_reward_starts_maxis" );
|
||||
level endon( "end_game_reward_starts_richtofen" );
|
||||
s_struct = getstruct( "sq_guillotine", "targetname" );
|
||||
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
|
||||
|
||||
trigger waittill( "trigger" );
|
||||
|
||||
trigger delete();
|
||||
richtofensay( "vox_zmba_sidequest_gallows_0", 9 );
|
||||
richtofensay( "vox_zmba_sidequest_gallows_1", 12 );
|
||||
|
||||
level waittill( "rtower_object_planted" );
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_parts_0", 9 );
|
||||
|
||||
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()
|
||||
{
|
||||
level endon( "sq_bt_over" );
|
||||
level endon( "end_game_reward_starts_maxis" );
|
||||
level endon( "end_game_reward_starts_richtofen" );
|
||||
s_struct = getstruct( "sq_gallows", "targetname" );
|
||||
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
|
||||
trigger waittill( "trigger" );
|
||||
trigger delete();
|
||||
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
|
||||
m_maxis_vo_spot setmodel( "tag_origin" );
|
||||
if ( flag( "sq_intro_vo_done" ) )
|
||||
{
|
||||
maxissay( "vox_maxi_sidequest_gallows_0", m_maxis_vo_spot );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < 4 )
|
||||
{
|
||||
level waittill( "mtower_object_planted" );
|
||||
if ( flag( "sq_intro_vo_done" ) )
|
||||
{
|
||||
maxissay( "vox_maxi_sidequest_parts_" + i, m_maxis_vo_spot, 1 );
|
||||
}
|
||||
wait_network_frame();
|
||||
i++;
|
||||
}
|
||||
m_maxis_vo_spot delete();
|
||||
level endon( "sq_bt_over" );
|
||||
level endon( "end_game_reward_starts_maxis" );
|
||||
level endon( "end_game_reward_starts_richtofen" );
|
||||
s_struct = getstruct( "sq_gallows", "targetname" );
|
||||
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
|
||||
|
||||
trigger waittill( "trigger" );
|
||||
|
||||
trigger delete();
|
||||
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
|
||||
m_maxis_vo_spot setmodel( "tag_origin" );
|
||||
|
||||
if ( flag( "sq_intro_vo_done" ) )
|
||||
maxissay( "vox_maxi_sidequest_gallows_0", m_maxis_vo_spot );
|
||||
|
||||
for ( i = 0; i < 4; i++ )
|
||||
{
|
||||
level waittill( "mtower_object_planted" );
|
||||
|
||||
if ( flag( "sq_intro_vo_done" ) )
|
||||
maxissay( "vox_maxi_sidequest_parts_" + i, m_maxis_vo_spot, 1 );
|
||||
|
||||
wait_network_frame();
|
||||
}
|
||||
|
||||
m_maxis_vo_spot delete();
|
||||
}
|
||||
|
||||
stage_vo_watch_underground()
|
||||
{
|
||||
trigger_wait( "sq_player_underground", "targetname" );
|
||||
flag_set( "sq_player_underground" );
|
||||
trigger_wait( "sq_player_underground", "targetname" );
|
||||
flag_set( "sq_player_underground" );
|
||||
}
|
||||
|
||||
stage_start_watcher()
|
||||
{
|
||||
level waittill_either( "mtower_object_planted", "rtower_object_planted" );
|
||||
flag_set( "sq_started" );
|
||||
level waittill_either( "mtower_object_planted", "rtower_object_planted" );
|
||||
flag_set( "sq_started" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "BT Started" );
|
||||
iprintlnbold( "BT Started" );
|
||||
#/
|
||||
level thread wait_for_maxis_tower();
|
||||
level thread wait_for_richtofen_tower();
|
||||
flag_wait_any( "sq_is_max_tower_built", "sq_is_ric_tower_built" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
level thread wait_for_maxis_tower();
|
||||
level thread wait_for_richtofen_tower();
|
||||
flag_wait_any( "sq_is_max_tower_built", "sq_is_ric_tower_built" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
wait_for_maxis_tower()
|
||||
{
|
||||
level endon( "sq_is_ric_tower_built" );
|
||||
wait_for_buildable( "buried_sq_bt_m_tower" );
|
||||
flag_set( "sq_is_max_tower_built" );
|
||||
level endon( "sq_is_ric_tower_built" );
|
||||
wait_for_buildable( "buried_sq_bt_m_tower" );
|
||||
flag_set( "sq_is_max_tower_built" );
|
||||
}
|
||||
|
||||
wait_for_richtofen_tower()
|
||||
{
|
||||
level endon( "sq_is_max_tower_built" );
|
||||
wait_for_buildable( "buried_sq_bt_r_tower" );
|
||||
flag_set( "sq_is_ric_tower_built" );
|
||||
level endon( "sq_is_max_tower_built" );
|
||||
wait_for_buildable( "buried_sq_bt_r_tower" );
|
||||
flag_set( "sq_is_ric_tower_built" );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,428 +1,441 @@
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_wisp_failed" );
|
||||
flag_init( "sq_m_wisp_weak" );
|
||||
level.sq_ctw_m_tubes_lit = 0;
|
||||
declare_sidequest_stage( "sq", "ctw", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
flag_init( "sq_wisp_failed" );
|
||||
flag_init( "sq_m_wisp_weak" );
|
||||
level.sq_ctw_m_tubes_lit = 0;
|
||||
declare_sidequest_stage( "sq", "ctw", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
flag_clear( "sq_wisp_failed" );
|
||||
level._cur_stage_name = "ctw";
|
||||
clientnotify( "ctw" );
|
||||
flag_clear( "sq_wisp_failed" );
|
||||
level._cur_stage_name = "ctw";
|
||||
clientnotify( "ctw" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "CTW Started" );
|
||||
iprintlnbold( "CTW Started" );
|
||||
#/
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
level thread stage_vo_max();
|
||||
ctw_max_start_wisp();
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread stage_vo_ric();
|
||||
ctw_ric_start_wisp();
|
||||
}
|
||||
flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
level thread stage_vo_max();
|
||||
ctw_max_start_wisp();
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread stage_vo_ric();
|
||||
ctw_ric_start_wisp();
|
||||
}
|
||||
|
||||
flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
stage_vo_max()
|
||||
{
|
||||
level endon( "sq_wisp_failed" );
|
||||
while ( !isDefined( level.vh_wisp ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level.vh_wisp endon( "delete" );
|
||||
maxissay( "vox_maxi_sidequest_ctw_0", level.e_sq_sign_attacker );
|
||||
maxissay( "vox_maxi_sidequest_ctw_1", level.e_sq_sign_attacker );
|
||||
wait 15;
|
||||
maxissay( "vox_maxis_sidequest_ctw_4", level.e_sq_sign_attacker );
|
||||
level endon( "sq_wisp_failed" );
|
||||
|
||||
while ( !isdefined( level.vh_wisp ) )
|
||||
wait 1;
|
||||
|
||||
level.vh_wisp endon( "delete" );
|
||||
maxissay( "vox_maxi_sidequest_ctw_0", level.e_sq_sign_attacker );
|
||||
maxissay( "vox_maxi_sidequest_ctw_1", level.e_sq_sign_attacker );
|
||||
wait 15;
|
||||
maxissay( "vox_maxis_sidequest_ctw_4", level.e_sq_sign_attacker );
|
||||
}
|
||||
|
||||
stage_vo_ric()
|
||||
{
|
||||
level endon( "sq_wisp_failed" );
|
||||
richtofensay( "vox_zmba_sidequest_ctw_0", 12 );
|
||||
richtofensay( "vox_zmba_sidequest_ctw_1", 8 );
|
||||
level waittill( "sq_ctw_zombie_powered_up" );
|
||||
richtofensay( "vox_zmba_sidequest_ctw_3", 8 );
|
||||
level endon( "sq_wisp_failed" );
|
||||
richtofensay( "vox_zmba_sidequest_ctw_0", 12 );
|
||||
richtofensay( "vox_zmba_sidequest_ctw_1", 8 );
|
||||
|
||||
level waittill( "sq_ctw_zombie_powered_up" );
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_ctw_3", 8 );
|
||||
}
|
||||
|
||||
wisp_move_from_sign_to_start( s_start )
|
||||
{
|
||||
self.origin = level.m_sq_start_sign.origin - vectorScale( ( 1, 0, 0 ), 20 );
|
||||
self moveto( s_start.origin, 2, 0,5, 0,5 );
|
||||
self waittill( "movedone" );
|
||||
wait 1;
|
||||
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 waittill( "movedone" );
|
||||
|
||||
wait 1;
|
||||
}
|
||||
|
||||
ctw_ric_start_wisp()
|
||||
{
|
||||
if ( !isDefined( level.m_sq_start_sign ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
s_start = getstruct( level.m_sq_start_sign.target, "targetname" );
|
||||
m_wisp = getent( "sq_wisp", "targetname" );
|
||||
m_wisp setclientfield( "vulture_wisp", 1 );
|
||||
m_wisp wisp_move_from_sign_to_start( s_start );
|
||||
m_wisp thread ctw_ric_move_wisp( s_start );
|
||||
if ( !isdefined( level.m_sq_start_sign ) )
|
||||
return;
|
||||
|
||||
s_start = getstruct( level.m_sq_start_sign.target, "targetname" );
|
||||
m_wisp = getent( "sq_wisp", "targetname" );
|
||||
m_wisp setclientfield( "vulture_wisp", 1 );
|
||||
m_wisp wisp_move_from_sign_to_start( s_start );
|
||||
m_wisp thread ctw_ric_move_wisp( s_start );
|
||||
}
|
||||
|
||||
ctw_ric_move_wisp( s_current )
|
||||
{
|
||||
self endon( "ctw_wisp_timeout" );
|
||||
self setclientfield( "vulture_wisp", 0 );
|
||||
self.origin = s_current.origin;
|
||||
wait_network_frame();
|
||||
self setclientfield( "vulture_wisp", 1 );
|
||||
self thread ctw_ric_watch_wisp_timeout();
|
||||
ctw_ric_watch_wisp_dist();
|
||||
s_current = ctw_ric_get_next_wisp_struct( s_current );
|
||||
self endon( "ctw_wisp_moved" );
|
||||
self ctw_ric_power_towers();
|
||||
flag_set( "sq_wisp_success" );
|
||||
self endon( "ctw_wisp_timeout" );
|
||||
|
||||
do
|
||||
{
|
||||
self setclientfield( "vulture_wisp", 0 );
|
||||
self.origin = s_current.origin;
|
||||
wait_network_frame();
|
||||
self setclientfield( "vulture_wisp", 1 );
|
||||
self thread ctw_ric_watch_wisp_timeout();
|
||||
ctw_ric_watch_wisp_dist();
|
||||
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 )
|
||||
{
|
||||
if ( !isDefined( s_current.target ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
a_structs = getstructarray( s_current.target, "targetname" );
|
||||
return array_randomize( a_structs )[ 0 ];
|
||||
if ( !isdefined( s_current.target ) )
|
||||
return undefined;
|
||||
|
||||
a_structs = getstructarray( s_current.target, "targetname" );
|
||||
return array_randomize( a_structs )[0];
|
||||
}
|
||||
|
||||
ctw_ric_watch_wisp_timeout()
|
||||
{
|
||||
self endon( "ctw_wisp_moved" );
|
||||
wait 12;
|
||||
flag_set( "sq_wisp_failed" );
|
||||
self setclientfield( "vulture_wisp", 0 );
|
||||
self notify( "ctw_wisp_timeout" );
|
||||
self endon( "ctw_wisp_moved" );
|
||||
wait 12;
|
||||
flag_set( "sq_wisp_failed" );
|
||||
self setclientfield( "vulture_wisp", 0 );
|
||||
self notify( "ctw_wisp_timeout" );
|
||||
}
|
||||
|
||||
ctw_ric_watch_wisp_dist( s_current )
|
||||
{
|
||||
self endon( "ctw_wisp_timeout" );
|
||||
is_near_wisp = 0;
|
||||
while ( !is_near_wisp )
|
||||
{
|
||||
players = getplayers();
|
||||
_a185 = players;
|
||||
_k185 = getFirstArrayKey( _a185 );
|
||||
while ( isDefined( _k185 ) )
|
||||
{
|
||||
player = _a185[ _k185 ];
|
||||
if ( !player hasperk( "specialty_nomotionsensor" ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( distancesquared( player.origin, self.origin ) < 4096 )
|
||||
{
|
||||
is_near_wisp = 1;
|
||||
}
|
||||
}
|
||||
_k185 = getNextArrayKey( _a185, _k185 );
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
self notify( "ctw_wisp_moved" );
|
||||
self endon( "ctw_wisp_timeout" );
|
||||
is_near_wisp = 0;
|
||||
|
||||
while ( !is_near_wisp )
|
||||
{
|
||||
players = getplayers();
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
if ( !player hasperk( "specialty_nomotionsensor" ) )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( player.origin, self.origin ) < 4096 )
|
||||
is_near_wisp = 1;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
self notify( "ctw_wisp_moved" );
|
||||
}
|
||||
|
||||
ctw_ric_power_towers()
|
||||
{
|
||||
m_tower = getent( "sq_guillotine", "targetname" );
|
||||
level setclientfield( "vulture_wisp_orb_count", 1 );
|
||||
wait_network_frame();
|
||||
level setclientfield( "vulture_wisp_orb_count", 0 );
|
||||
wait 2;
|
||||
v_guillotine_spot = self.origin;
|
||||
self.origin = m_tower gettagorigin( "j_crystal_01" );
|
||||
m_tower thread ctw_ric_guillotine_glow( v_guillotine_spot );
|
||||
i = 0;
|
||||
while ( i < 5 )
|
||||
{
|
||||
wait 3;
|
||||
e_powered_zombie = undefined;
|
||||
while ( !isDefined( e_powered_zombie ) )
|
||||
{
|
||||
wait 1;
|
||||
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" );
|
||||
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 );
|
||||
m_tower ctw_return_wisp_to_guillotine( v_guillotine_spot, e_powered_zombie.origin );
|
||||
i++;
|
||||
}
|
||||
m_tower = getent( "sq_guillotine", "targetname" );
|
||||
level setclientfield( "vulture_wisp_orb_count", 1 );
|
||||
wait_network_frame();
|
||||
level setclientfield( "vulture_wisp_orb_count", 0 );
|
||||
wait 2;
|
||||
v_guillotine_spot = self.origin;
|
||||
self.origin = m_tower gettagorigin( "j_crystal_01" );
|
||||
m_tower thread ctw_ric_guillotine_glow( v_guillotine_spot );
|
||||
|
||||
for ( i = 0; i < 5; i++ )
|
||||
{
|
||||
wait 3;
|
||||
|
||||
for ( e_powered_zombie = undefined; !isdefined( e_powered_zombie ); e_powered_zombie = array_randomize( a_zombies )[0] )
|
||||
{
|
||||
wait 1;
|
||||
a_zombies = ctw_find_zombies_for_powerup( self.origin, 512, m_tower );
|
||||
}
|
||||
|
||||
level notify( "stop_ctw_ric_guillotine_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 );
|
||||
m_tower ctw_return_wisp_to_guillotine( v_guillotine_spot, e_powered_zombie.origin );
|
||||
}
|
||||
}
|
||||
|
||||
ctw_ric_guillotine_glow( v_spot )
|
||||
{
|
||||
level endon( "stop_ctw_ric_guillotine_glow" );
|
||||
if ( !isDefined( self.m_glow ) )
|
||||
{
|
||||
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" );
|
||||
wait 0,25;
|
||||
self.m_glow playloopsound( "zmb_sq_wisp_loop_guillotine" );
|
||||
}
|
||||
level endon( "stop_ctw_ric_guillotine_glow" );
|
||||
|
||||
if ( !isdefined( self.m_glow ) )
|
||||
{
|
||||
self.m_glow = spawn( "script_model", v_spot );
|
||||
self.m_glow setmodel( "tag_origin" );
|
||||
}
|
||||
|
||||
while ( true )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
wait_network_frame();
|
||||
v_to_zombie = vectornormalize( self gettagorigin( "J_SpineLower" ) - m_wisp.origin );
|
||||
v_move_spot = m_wisp.origin + ( v_to_zombie * 32 );
|
||||
m_wisp.origin = v_move_spot;
|
||||
self ctw_power_up_zombie();
|
||||
do
|
||||
{
|
||||
wait_network_frame();
|
||||
v_to_zombie = vectornormalize( self gettagorigin( "J_SpineLower" ) - m_wisp.origin );
|
||||
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 )
|
||||
{
|
||||
self.m_glow.origin = v_start;
|
||||
self thread ctw_ric_guillotine_glow( v_start );
|
||||
wait_network_frame();
|
||||
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;
|
||||
self.m_glow.origin = v_spot;
|
||||
self.m_glow.origin = v_start;
|
||||
self thread ctw_ric_guillotine_glow( v_start );
|
||||
|
||||
do
|
||||
{
|
||||
wait_network_frame();
|
||||
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()
|
||||
{
|
||||
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 makevehicleunusable();
|
||||
level.vh_wisp = vh_wisp;
|
||||
vh_wisp.n_sq_max_energy = 30;
|
||||
vh_wisp.n_sq_energy = vh_wisp.n_sq_max_energy;
|
||||
vh_wisp thread ctw_max_wisp_play_fx();
|
||||
vh_wisp_mover = spawn( "script_model", vh_wisp.origin );
|
||||
vh_wisp_mover setmodel( "tag_origin" );
|
||||
vh_wisp linkto( vh_wisp_mover );
|
||||
vh_wisp_mover wisp_move_from_sign_to_start( nd_start );
|
||||
vh_wisp unlink();
|
||||
vh_wisp_mover delete();
|
||||
vh_wisp attachpath( nd_start );
|
||||
vh_wisp startpath();
|
||||
vh_wisp thread ctw_max_success_watch();
|
||||
vh_wisp thread ctw_max_fail_watch();
|
||||
vh_wisp thread ctw_max_wisp_enery_watch();
|
||||
wait_network_frame();
|
||||
flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
|
||||
vh_wisp cancelaimove();
|
||||
vh_wisp clearvehgoalpos();
|
||||
vh_wisp delete();
|
||||
if ( isDefined( level.vh_wisp ) )
|
||||
{
|
||||
level.vh_wisp delete();
|
||||
}
|
||||
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 makevehicleunusable();
|
||||
level.vh_wisp = vh_wisp;
|
||||
vh_wisp.n_sq_max_energy = 30;
|
||||
vh_wisp.n_sq_energy = vh_wisp.n_sq_max_energy;
|
||||
vh_wisp thread ctw_max_wisp_play_fx();
|
||||
vh_wisp_mover = spawn( "script_model", vh_wisp.origin );
|
||||
vh_wisp_mover setmodel( "tag_origin" );
|
||||
vh_wisp linkto( vh_wisp_mover );
|
||||
vh_wisp_mover wisp_move_from_sign_to_start( nd_start );
|
||||
vh_wisp unlink();
|
||||
vh_wisp_mover delete();
|
||||
vh_wisp attachpath( nd_start );
|
||||
vh_wisp startpath();
|
||||
vh_wisp thread ctw_max_success_watch();
|
||||
vh_wisp thread ctw_max_fail_watch();
|
||||
vh_wisp thread ctw_max_wisp_enery_watch();
|
||||
wait_network_frame();
|
||||
flag_wait_any( "sq_wisp_success", "sq_wisp_failed" );
|
||||
vh_wisp cancelaimove();
|
||||
vh_wisp clearvehgoalpos();
|
||||
vh_wisp delete();
|
||||
|
||||
if ( isdefined( level.vh_wisp ) )
|
||||
level.vh_wisp delete();
|
||||
}
|
||||
|
||||
ctw_max_wisp_play_fx()
|
||||
{
|
||||
self playloopsound( "zmb_sq_wisp_loop" );
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
playfxontag( level._effect[ "fx_wisp_m" ], self, "tag_origin" );
|
||||
if ( !flag( "sq_m_wisp_weak" ) )
|
||||
{
|
||||
playfxontag( level._effect[ "fx_wisp_lg_m" ], self, "tag_origin" );
|
||||
}
|
||||
wait 0,3;
|
||||
}
|
||||
self playloopsound( "zmb_sq_wisp_loop" );
|
||||
|
||||
while ( isdefined( self ) )
|
||||
{
|
||||
playfxontag( level._effect["fx_wisp_m"], self, "tag_origin" );
|
||||
|
||||
if ( !flag( "sq_m_wisp_weak" ) )
|
||||
playfxontag( level._effect["fx_wisp_lg_m"], self, "tag_origin" );
|
||||
|
||||
wait 0.3;
|
||||
}
|
||||
}
|
||||
|
||||
ctw_max_success_watch()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "reached_end_node" );
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "reached_end_node" );
|
||||
/#
|
||||
iprintlnbold( "Wisp Success!" );
|
||||
iprintlnbold( "Wisp Success!" );
|
||||
#/
|
||||
flag_set( "sq_wisp_success" );
|
||||
level thread ctw_light_tube();
|
||||
flag_set( "sq_wisp_success" );
|
||||
level thread ctw_light_tube();
|
||||
}
|
||||
|
||||
ctw_light_tube()
|
||||
{
|
||||
level.sq_ctw_m_tubes_lit++;
|
||||
level setclientfield( "sq_ctw_m_t_l", 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 );
|
||||
}
|
||||
|
||||
ctw_max_fail_watch()
|
||||
{
|
||||
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--;
|
||||
self endon( "death" );
|
||||
|
||||
}
|
||||
if ( self.n_sq_energy <= 15 && !flag( "sq_m_wisp_weak" ) )
|
||||
{
|
||||
flag_set( "sq_m_wisp_weak" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.n_sq_energy > 15 && flag( "sq_m_wisp_weak" ) )
|
||||
{
|
||||
flag_clear( "sq_m_wisp_weak" );
|
||||
}
|
||||
}
|
||||
do
|
||||
{
|
||||
wait 1;
|
||||
n_starter_dist = distancesquared( self.origin, level.e_sq_sign_attacker.origin );
|
||||
a_players = getplayers();
|
||||
|
||||
foreach ( player in a_players )
|
||||
{
|
||||
if ( distancesquared( self.origin, player.origin ) < 16384 )
|
||||
{
|
||||
/#
|
||||
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()
|
||||
{
|
||||
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()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self.n_sq_energy <= 0 )
|
||||
{
|
||||
flag_set( "sq_wisp_failed" );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( self.n_sq_energy <= 0 )
|
||||
flag_set( "sq_wisp_failed" );
|
||||
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
debug_origin()
|
||||
{
|
||||
/#
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
debugstar( self.origin, 1, ( 1, 0, 0 ) );
|
||||
wait 0,05;
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
debugstar( self.origin, 1, ( 1, 0, 0 ) );
|
||||
wait 0.05;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
ctw_find_zombies_for_powerup( v_origin, n_radius, m_ignore )
|
||||
{
|
||||
if ( !isDefined( m_ignore ) )
|
||||
{
|
||||
m_ignore = undefined;
|
||||
}
|
||||
a_zombies = getaispeciesarray( level.zombie_team, "zombie" );
|
||||
n_radius_sq = n_radius * n_radius;
|
||||
a_near_zombies = [];
|
||||
_a473 = a_zombies;
|
||||
_k473 = getFirstArrayKey( _a473 );
|
||||
while ( isDefined( _k473 ) )
|
||||
{
|
||||
e_zombie = _a473[ _k473 ];
|
||||
if ( distancesquared( e_zombie.origin, v_origin ) < n_radius_sq && !isDefined( e_zombie.sq_wisp_powered ) )
|
||||
{
|
||||
if ( sighttracepassed( v_origin, e_zombie gettagorigin( "J_SpineLower" ), 1, m_ignore ) )
|
||||
{
|
||||
a_near_zombies[ a_near_zombies.size ] = e_zombie;
|
||||
}
|
||||
}
|
||||
_k473 = getNextArrayKey( _a473, _k473 );
|
||||
}
|
||||
return a_near_zombies;
|
||||
if ( !isdefined( m_ignore ) )
|
||||
m_ignore = undefined;
|
||||
|
||||
a_zombies = getaispeciesarray( level.zombie_team, "zombie" );
|
||||
n_radius_sq = n_radius * n_radius;
|
||||
a_near_zombies = [];
|
||||
|
||||
foreach ( e_zombie in a_zombies )
|
||||
{
|
||||
if ( distancesquared( e_zombie.origin, v_origin ) < n_radius_sq && !isdefined( e_zombie.sq_wisp_powered ) )
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
ctw_power_up_zombie()
|
||||
{
|
||||
level notify( "sq_ctw_zombie_powered_up" );
|
||||
self.sq_wisp_powered = 1;
|
||||
n_oldhealth = self.maxhealth;
|
||||
self.maxhealth *= 2;
|
||||
if ( self.maxhealth < n_oldhealth )
|
||||
{
|
||||
self.maxhealth = n_oldhealth;
|
||||
}
|
||||
self.health = self.maxhealth;
|
||||
if ( self.zombie_move_speed != "sprint" )
|
||||
{
|
||||
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";
|
||||
}
|
||||
else
|
||||
{
|
||||
str_fx = "vulture_fx_wisp";
|
||||
}
|
||||
self thread ctw_power_up_zombie_m_fx( str_fx );
|
||||
level notify( "sq_ctw_zombie_powered_up" );
|
||||
self.sq_wisp_powered = 1;
|
||||
n_oldhealth = self.maxhealth;
|
||||
self.maxhealth *= 2;
|
||||
|
||||
if ( self.maxhealth < n_oldhealth )
|
||||
self.maxhealth = n_oldhealth;
|
||||
|
||||
self.health = self.maxhealth;
|
||||
|
||||
if ( self.zombie_move_speed != "sprint" )
|
||||
{
|
||||
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";
|
||||
else
|
||||
str_fx = "vulture_fx_wisp";
|
||||
|
||||
self thread ctw_power_up_zombie_m_fx( str_fx );
|
||||
}
|
||||
|
||||
ctw_power_up_zombie_m_fx( str_fx )
|
||||
{
|
||||
self endon( "delete" );
|
||||
self endon( "death" );
|
||||
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_LE" );
|
||||
wait 0,25;
|
||||
self playloopsound( "zmb_sq_wisp_possess" );
|
||||
}
|
||||
self endon( "delete" );
|
||||
self endon( "death" );
|
||||
|
||||
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_LE" );
|
||||
wait 0.25;
|
||||
self playloopsound( "zmb_sq_wisp_possess" );
|
||||
}
|
||||
}
|
||||
|
@ -1,216 +1,197 @@
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zm_buried_sq_ftl;
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zombies\_zm_buildables;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
#include maps\mp\zm_buried_sq_ftl;
|
||||
#include maps\mp\zombies\_zm_spawner;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "ftl_lantern_charged" );
|
||||
declare_sidequest_stage( "sq", "ftl", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
flag_init( "ftl_lantern_charged" );
|
||||
declare_sidequest_stage( "sq", "ftl", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
level.sq_ftl_lantern_fuel = 0;
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
level thread stage_vo_max();
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread stage_vo_ric();
|
||||
}
|
||||
level._cur_stage_name = "ftl";
|
||||
clientnotify( "ftl" );
|
||||
level.sq_ftl_lantern_fuel = 0;
|
||||
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
level thread stage_vo_max();
|
||||
else
|
||||
level thread stage_vo_ric();
|
||||
|
||||
level._cur_stage_name = "ftl";
|
||||
clientnotify( "ftl" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "FTL Started" );
|
||||
iprintlnbold( "FTL Started" );
|
||||
#/
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
max_fill_lantern_watcher();
|
||||
}
|
||||
else
|
||||
{
|
||||
ric_fill_lantern_watcher();
|
||||
}
|
||||
flag_wait( "ftl_lantern_charged" );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
thread stage_vo_filled_max();
|
||||
}
|
||||
else
|
||||
{
|
||||
thread stage_vo_filled_ric();
|
||||
}
|
||||
sq_ftl_show_marker();
|
||||
wait_for_buildable( "buried_sq_oillamp" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
max_fill_lantern_watcher();
|
||||
else
|
||||
ric_fill_lantern_watcher();
|
||||
|
||||
flag_wait( "ftl_lantern_charged" );
|
||||
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
thread stage_vo_filled_max();
|
||||
else
|
||||
thread stage_vo_filled_ric();
|
||||
|
||||
sq_ftl_show_marker();
|
||||
wait_for_buildable( "buried_sq_oillamp" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
stage_vo_max()
|
||||
{
|
||||
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_3" );
|
||||
level waittill( "sq_ftl_lantern_inc" );
|
||||
sq_ftl_maxis_vo_on_holder( "vox_maxi_sidequest_pl_2" );
|
||||
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_3" );
|
||||
|
||||
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 )
|
||||
{
|
||||
player = sq_ftl_get_lantern_holder();
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
maxissay( str_vox, player );
|
||||
}
|
||||
player = sq_ftl_get_lantern_holder();
|
||||
|
||||
if ( isdefined( player ) )
|
||||
maxissay( str_vox, player );
|
||||
}
|
||||
|
||||
sq_ftl_show_marker()
|
||||
{
|
||||
m_marker = getent( "sq_lantern_symbol", "targetname" );
|
||||
m_marker.origin += vectorScale( ( 0, 0, 1 ), 2 );
|
||||
level.sq_lamp_generator_unitrig.origin = level.sq_lamp_generator_unitrig.realorigin;
|
||||
m_marker = getent( "sq_lantern_symbol", "targetname" );
|
||||
m_marker.origin += vectorscale( ( 0, 0, 1 ), 2.0 );
|
||||
level.sq_lamp_generator_unitrig.origin = level.sq_lamp_generator_unitrig.realorigin;
|
||||
}
|
||||
|
||||
sq_ftl_get_lantern_holder()
|
||||
{
|
||||
players = get_players();
|
||||
_a107 = players;
|
||||
_k107 = getFirstArrayKey( _a107 );
|
||||
while ( isDefined( _k107 ) )
|
||||
{
|
||||
player = _a107[ _k107 ];
|
||||
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 );
|
||||
}
|
||||
players = get_players();
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
if ( isdefined( player player_get_buildable_piece( 2 ) ) && isdefined( player player_get_buildable_piece( 2 ).buildablename == "sq_ghost_lamp" ) )
|
||||
return player;
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
richtofensay( "vox_zmba_sidequest_pl_0", 12 );
|
||||
level waittill( "sq_ftl_lantern_inc" );
|
||||
richtofensay( "vox_zmba_sidequest_pl_1", 6 );
|
||||
richtofensay( "vox_zmba_sidequest_pl_0", 12 );
|
||||
|
||||
level waittill( "sq_ftl_lantern_inc" );
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_pl_1", 6 );
|
||||
}
|
||||
|
||||
stage_vo_filled_ric()
|
||||
{
|
||||
richtofensay( "vox_zmba_sidequest_ll_0", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_ll_1", 7 );
|
||||
richtofensay( "vox_zmba_sidequest_ll_0", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_ll_1", 7 );
|
||||
}
|
||||
|
||||
max_fill_lantern_watcher()
|
||||
{
|
||||
a_zombies = getaispeciesarray( level.zombie_team, "zombie" );
|
||||
array_thread( a_zombies, ::max_lantern_zombie_death_watcher );
|
||||
maps/mp/zombies/_zm_spawner::add_custom_zombie_spawn_logic( ::max_lantern_zombie_death_watcher );
|
||||
a_zombies = getaispeciesarray( level.zombie_team, "zombie" );
|
||||
array_thread( a_zombies, ::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()
|
||||
{
|
||||
level endon( "ftl_lantern_charged" );
|
||||
if ( flag( "ftl_lantern_charged" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self waittill( "death", attacker );
|
||||
if ( !isDefined( attacker ) || isplayer( attacker ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = getplayers();
|
||||
_a164 = players;
|
||||
_k164 = getFirstArrayKey( _a164 );
|
||||
while ( isDefined( _k164 ) )
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
_k164 = getNextArrayKey( _a164, _k164 );
|
||||
}
|
||||
level endon( "ftl_lantern_charged" );
|
||||
|
||||
if ( flag( "ftl_lantern_charged" ) )
|
||||
return;
|
||||
|
||||
self waittill( "death", attacker );
|
||||
|
||||
if ( !isdefined( attacker ) || isplayer( attacker ) )
|
||||
return;
|
||||
|
||||
players = getplayers();
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ric_fill_lantern_watcher()
|
||||
{
|
||||
a_axis = getaiarray( "axis" );
|
||||
a_ghost = [];
|
||||
_a183 = a_axis;
|
||||
_k183 = getFirstArrayKey( _a183 );
|
||||
while ( isDefined( _k183 ) )
|
||||
{
|
||||
e_axis = _a183[ _k183 ];
|
||||
if ( is_true( e_axis.is_ghost ) )
|
||||
{
|
||||
a_ghost[ a_ghost.size ] = e_axis;
|
||||
}
|
||||
_k183 = getNextArrayKey( _a183, _k183 );
|
||||
}
|
||||
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 );
|
||||
a_axis = getaiarray( "axis" );
|
||||
a_ghost = [];
|
||||
|
||||
foreach ( e_axis in a_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" );
|
||||
array_thread( a_ghost_spawners, ::add_spawn_function, ::ric_lantern_ghost_death_watcher );
|
||||
}
|
||||
|
||||
ric_lantern_ghost_death_watcher()
|
||||
{
|
||||
level endon( "ftl_lantern_charged" );
|
||||
if ( flag( "ftl_lantern_charged" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self waittill( "death", attacker );
|
||||
players = getplayers();
|
||||
_a210 = players;
|
||||
_k210 = getFirstArrayKey( _a210 );
|
||||
while ( isDefined( _k210 ) )
|
||||
{
|
||||
player = _a210[ _k210 ];
|
||||
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();
|
||||
}
|
||||
}
|
||||
_k210 = getNextArrayKey( _a210, _k210 );
|
||||
}
|
||||
level endon( "ftl_lantern_charged" );
|
||||
|
||||
if ( flag( "ftl_lantern_charged" ) )
|
||||
return;
|
||||
|
||||
self waittill( "death", attacker );
|
||||
|
||||
players = getplayers();
|
||||
|
||||
foreach ( player in players )
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ftl_lantern_increment()
|
||||
{
|
||||
level.sq_ftl_lantern_fuel++;
|
||||
level notify( "sq_ftl_lantern_inc" );
|
||||
self playsound( "zmb_lantern_fill_" + level.sq_ftl_lantern_fuel );
|
||||
level.sq_ftl_lantern_fuel++;
|
||||
level notify( "sq_ftl_lantern_inc" );
|
||||
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 )
|
||||
{
|
||||
self playsound( "zmb_lantern_fill_done" );
|
||||
flag_set( "ftl_lantern_charged" );
|
||||
}
|
||||
if ( level.sq_ftl_lantern_fuel >= 10 )
|
||||
{
|
||||
self playsound( "zmb_lantern_fill_done" );
|
||||
flag_set( "ftl_lantern_charged" );
|
||||
}
|
||||
}
|
||||
|
@ -1,257 +1,262 @@
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zombies\_zm_buildables;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_gl_lantern_aquired" );
|
||||
declare_sidequest_stage( "sq", "gl", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
level thread sq_gl_setup_buildable_trig();
|
||||
flag_init( "sq_gl_lantern_aquired" );
|
||||
declare_sidequest_stage( "sq", "gl", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
level thread sq_gl_setup_buildable_trig();
|
||||
}
|
||||
|
||||
sq_gl_setup_buildable_trig()
|
||||
{
|
||||
while ( !isDefined( level.sq_lamp_generator_unitrig ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
level.sq_lamp_generator_unitrig.realorigin = level.sq_lamp_generator_unitrig.origin;
|
||||
level.sq_lamp_generator_unitrig.origin += vectorScale( ( 0, 0, 1 ), 10000 );
|
||||
while ( !isdefined( level.sq_lamp_generator_unitrig ) )
|
||||
wait 1;
|
||||
|
||||
level.sq_lamp_generator_unitrig.realorigin = level.sq_lamp_generator_unitrig.origin;
|
||||
level.sq_lamp_generator_unitrig.origin += vectorscale( ( 0, 0, -1 ), 10000.0 );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" );
|
||||
gl_lantern_spawn( s_start );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
level thread stage_vo_max();
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread stage_vo_ric();
|
||||
}
|
||||
level._cur_stage_name = "gl";
|
||||
clientnotify( "gl" );
|
||||
s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" );
|
||||
gl_lantern_spawn( s_start );
|
||||
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
level thread stage_vo_max();
|
||||
else
|
||||
level thread stage_vo_ric();
|
||||
|
||||
level._cur_stage_name = "gl";
|
||||
clientnotify( "gl" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "GL Started" );
|
||||
iprintlnbold( "GL Started" );
|
||||
#/
|
||||
s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" );
|
||||
gl_lantern_move( s_start );
|
||||
flag_wait( "sq_gl_lantern_aquired" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
s_start = getstruct( "sq_ghost_lamp_start", "script_noteworthy" );
|
||||
gl_lantern_move( s_start );
|
||||
flag_wait( "sq_gl_lantern_aquired" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
stage_vo_max()
|
||||
{
|
||||
level waittill( "lantern_crashing" );
|
||||
maxissay( "vox_maxi_sidequest_gl_2", level.vh_lantern );
|
||||
level waittill( "lantern_crashing" );
|
||||
|
||||
maxissay( "vox_maxi_sidequest_gl_2", level.vh_lantern );
|
||||
}
|
||||
|
||||
stage_vo_ric()
|
||||
{
|
||||
richtofensay( "vox_zmba_sidequest_gl_0", 8 );
|
||||
level waittill( "lantern_crashing" );
|
||||
richtofensay( "vox_zmba_sidequest_gl_1", 6 );
|
||||
richtofensay( "vox_zmba_sidequest_gl_0", 8 );
|
||||
|
||||
level waittill( "lantern_crashing" );
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_gl_1", 6 );
|
||||
}
|
||||
|
||||
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 makevehicleunusable();
|
||||
level.vh_lantern setneargoalnotifydist( 128 );
|
||||
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 linkto( level.vh_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 playloopsound( "zmb_sq_glantern_full_loop_3d" );
|
||||
level.vh_lantern thread gl_lantern_damage_watcher();
|
||||
wait_network_frame();
|
||||
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 setneargoalnotifydist( 128 );
|
||||
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 linkto( level.vh_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 playloopsound( "zmb_sq_glantern_full_loop_3d" );
|
||||
level.vh_lantern thread gl_lantern_damage_watcher();
|
||||
wait_network_frame();
|
||||
}
|
||||
|
||||
gl_lantern_delete()
|
||||
{
|
||||
if ( isDefined( level.vh_lantern ) )
|
||||
{
|
||||
if ( isDefined( level.vh_lantern.m_lantern ) )
|
||||
{
|
||||
level.vh_lantern.m_lantern delete();
|
||||
}
|
||||
if ( isDefined( level.vh_lantern.t_pickup ) )
|
||||
{
|
||||
level.vh_lantern.t_pickup delete();
|
||||
}
|
||||
level.vh_lantern cancelaimove();
|
||||
level.vh_lantern clearvehgoalpos();
|
||||
if ( isDefined( level.vh_lantern.m_link ) )
|
||||
{
|
||||
level.vh_lantern.m_link delete();
|
||||
}
|
||||
level.vh_lantern delete();
|
||||
}
|
||||
if ( isdefined( level.vh_lantern ) )
|
||||
{
|
||||
if ( isdefined( level.vh_lantern.m_lantern ) )
|
||||
level.vh_lantern.m_lantern delete();
|
||||
|
||||
if ( isdefined( level.vh_lantern.t_pickup ) )
|
||||
level.vh_lantern.t_pickup delete();
|
||||
|
||||
level.vh_lantern cancelaimove();
|
||||
level.vh_lantern clearvehgoalpos();
|
||||
|
||||
if ( isdefined( level.vh_lantern.m_link ) )
|
||||
level.vh_lantern.m_link delete();
|
||||
|
||||
level.vh_lantern delete();
|
||||
}
|
||||
}
|
||||
|
||||
gl_lantern_move( s_current )
|
||||
{
|
||||
level endon( "lantern_crashing" );
|
||||
while ( 1 )
|
||||
{
|
||||
s_current = gl_lantern_get_next_struct( s_current );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
if ( randomint( 100 ) < 50 )
|
||||
{
|
||||
s_current = level.vh_lantern gl_lantern_teleport();
|
||||
}
|
||||
}
|
||||
level.vh_lantern gl_lantern_move_to_struct( s_current );
|
||||
}
|
||||
level endon( "lantern_crashing" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
s_current = gl_lantern_get_next_struct( s_current );
|
||||
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
if ( randomint( 100 ) < 50 )
|
||||
s_current = level.vh_lantern gl_lantern_teleport();
|
||||
}
|
||||
|
||||
level.vh_lantern gl_lantern_move_to_struct( s_current );
|
||||
}
|
||||
}
|
||||
|
||||
gl_lantern_get_next_struct( s_current )
|
||||
{
|
||||
a_struct_links = [];
|
||||
a_target_structs = getstructarray( s_current.target, "targetname" );
|
||||
while ( isDefined( s_current.script_string ) )
|
||||
{
|
||||
a_names = strtok( s_current.script_string, " " );
|
||||
_a171 = a_names;
|
||||
_k171 = getFirstArrayKey( _a171 );
|
||||
while ( isDefined( _k171 ) )
|
||||
{
|
||||
str_name = _a171[ _k171 ];
|
||||
a_new_structs = getstructarray( str_name, "targetname" );
|
||||
a_target_structs = arraycombine( a_target_structs, a_new_structs, 0, 0 );
|
||||
_k171 = getNextArrayKey( _a171, _k171 );
|
||||
}
|
||||
}
|
||||
return array_randomize( a_target_structs )[ 0 ];
|
||||
a_struct_links = [];
|
||||
a_target_structs = getstructarray( s_current.target, "targetname" );
|
||||
|
||||
if ( isdefined( s_current.script_string ) )
|
||||
{
|
||||
a_names = strtok( s_current.script_string, " " );
|
||||
|
||||
foreach ( str_name in a_names )
|
||||
{
|
||||
a_new_structs = getstructarray( str_name, "targetname" );
|
||||
a_target_structs = arraycombine( a_target_structs, a_new_structs, 0, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
return array_randomize( a_target_structs )[0];
|
||||
}
|
||||
|
||||
gl_lantern_move_to_struct( s_goto )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
self setvehgoalpos( s_goto.origin, 1 );
|
||||
self pathvariableoffset( vectorScale( ( 0, 0, 1 ), 128 ), 1 );
|
||||
self waittill_either( "goal", "near_goal" );
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
self setvehgoalpos( s_goto.origin, 1 );
|
||||
self pathvariableoffset( vectorscale( ( 1, 1, 1 ), 128.0 ), 1 );
|
||||
self waittill_either( "goal", "near_goal" );
|
||||
}
|
||||
|
||||
gl_lantern_teleport()
|
||||
{
|
||||
self notify( "lantern_teleporting" );
|
||||
playfx( level._effect[ "fx_wisp_lg_m" ], self.origin );
|
||||
playsoundatposition( "zmb_sq_glantern_impact", self.origin );
|
||||
gl_lantern_delete();
|
||||
a_path_spots = getstructarray( "sq_ghost_lamp_path", "script_noteworthy" );
|
||||
s_teleport_spot = array_randomize( a_path_spots )[ 0 ];
|
||||
gl_lantern_spawn( s_teleport_spot );
|
||||
return s_teleport_spot;
|
||||
self notify( "lantern_teleporting" );
|
||||
playfx( level._effect["fx_wisp_lg_m"], self.origin );
|
||||
playsoundatposition( "zmb_sq_glantern_impact", self.origin );
|
||||
gl_lantern_delete();
|
||||
a_path_spots = getstructarray( "sq_ghost_lamp_path", "script_noteworthy" );
|
||||
s_teleport_spot = array_randomize( a_path_spots )[0];
|
||||
gl_lantern_spawn( s_teleport_spot );
|
||||
return s_teleport_spot;
|
||||
}
|
||||
|
||||
gl_lantern_damage_watcher()
|
||||
{
|
||||
self.m_lantern endon( "delete" );
|
||||
self.m_lantern setcandamage( 1 );
|
||||
while ( 1 )
|
||||
{
|
||||
self.m_lantern waittill( "damage", amount, attacker, dir, point, dmg_type );
|
||||
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 thread gl_lantern_pickup_watch();
|
||||
self thread gl_lantern_stop_spin_on_land();
|
||||
level thread gl_lantern_respawn_wait();
|
||||
level waittill( "gl_lantern_respawn" );
|
||||
if ( isDefined( self.m_lantern ) )
|
||||
{
|
||||
s_start_spot = gl_lantern_teleport();
|
||||
gl_lantern_move( s_start_spot );
|
||||
}
|
||||
self.m_lantern endon( "delete" );
|
||||
self.m_lantern setcandamage( 1 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.m_lantern waittill( "damage", amount, attacker, dir, point, dmg_type );
|
||||
|
||||
if ( dmg_type == "MOD_GRENADE" || dmg_type == "MOD_GRENADE_SPLASH" )
|
||||
break;
|
||||
}
|
||||
|
||||
self.m_lantern playsound( "zmb_sq_glantern_impact" );
|
||||
self gl_lantern_crash_movement();
|
||||
self thread gl_lantern_pickup_watch();
|
||||
self thread gl_lantern_stop_spin_on_land();
|
||||
level thread gl_lantern_respawn_wait();
|
||||
|
||||
level waittill( "gl_lantern_respawn" );
|
||||
|
||||
if ( isdefined( self.m_lantern ) )
|
||||
{
|
||||
s_start_spot = gl_lantern_teleport();
|
||||
gl_lantern_move( s_start_spot );
|
||||
}
|
||||
}
|
||||
|
||||
gl_lantern_stop_spin_on_land()
|
||||
{
|
||||
self endon( "delete" );
|
||||
while ( isDefined( self ) && length( self.velocity ) > 3 )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self.m_link = spawn( "script_model", self.origin );
|
||||
self.m_link setmodel( "tag_origin" );
|
||||
self linkto( self.m_link );
|
||||
}
|
||||
self endon( "delete" );
|
||||
|
||||
while ( isdefined( self ) && length( self.velocity ) > 3 )
|
||||
wait 0.1;
|
||||
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
self.m_link = spawn( "script_model", self.origin );
|
||||
self.m_link setmodel( "tag_origin" );
|
||||
self linkto( self.m_link );
|
||||
}
|
||||
}
|
||||
|
||||
gl_lantern_respawn_wait()
|
||||
{
|
||||
wait 30;
|
||||
level notify( "gl_lantern_respawn" );
|
||||
wait 30;
|
||||
level notify( "gl_lantern_respawn" );
|
||||
}
|
||||
|
||||
gl_lantern_pickup_watch()
|
||||
{
|
||||
self endon( "lantern_teleporting" );
|
||||
self.t_pickup = spawn( "trigger_radius_use", self.origin, 0, 48, 32 );
|
||||
self.t_pickup setcursorhint( "HINT_NOICON" );
|
||||
self.t_pickup sethintstring( &"ZM_BURIED_SQ_LANTERN_G" );
|
||||
self.t_pickup triggerignoreteam();
|
||||
self.t_pickup enablelinkto();
|
||||
self.t_pickup linkto( self );
|
||||
self.t_pickup waittill( "trigger", player );
|
||||
player player_take_piece( level.zombie_buildables[ "buried_sq_oillamp" ].buildablepieces[ 0 ] );
|
||||
piece = player player_get_buildable_piece( 2 );
|
||||
if ( isDefined( piece ) )
|
||||
{
|
||||
piece.sq_is_ghost_lamp = 1;
|
||||
piece.start_origin = vectorScale( ( 0, 0, 1 ), 512 );
|
||||
piece.start_angles = ( 0, 0, 1 );
|
||||
}
|
||||
self.t_pickup delete();
|
||||
self.m_lantern delete();
|
||||
self delete();
|
||||
flag_set( "sq_gl_lantern_aquired" );
|
||||
self endon( "lantern_teleporting" );
|
||||
self.t_pickup = spawn( "trigger_radius_use", self.origin, 0, 48, 32 );
|
||||
self.t_pickup setcursorhint( "HINT_NOICON" );
|
||||
self.t_pickup sethintstring( &"ZM_BURIED_SQ_LANTERN_G" );
|
||||
self.t_pickup triggerignoreteam();
|
||||
self.t_pickup enablelinkto();
|
||||
self.t_pickup linkto( self );
|
||||
|
||||
self.t_pickup waittill( "trigger", player );
|
||||
|
||||
player player_take_piece( level.zombie_buildables["buried_sq_oillamp"].buildablepieces[0] );
|
||||
piece = player player_get_buildable_piece( 2 );
|
||||
|
||||
if ( isdefined( piece ) )
|
||||
{
|
||||
piece.sq_is_ghost_lamp = 1;
|
||||
piece.start_origin = vectorscale( ( 0, 0, -1 ), 512.0 );
|
||||
piece.start_angles = ( 0, 0, 0 );
|
||||
}
|
||||
|
||||
self.t_pickup delete();
|
||||
self.m_lantern delete();
|
||||
self delete();
|
||||
flag_set( "sq_gl_lantern_aquired" );
|
||||
}
|
||||
|
||||
gl_lantern_crash_movement()
|
||||
{
|
||||
level notify( "lantern_crashing" );
|
||||
self cancelaimove();
|
||||
self clearvehgoalpos();
|
||||
self setphysacceleration( vectorScale( ( 0, 0, 1 ), 800 ) );
|
||||
hitdir = ( 0, 0, 1 );
|
||||
side_dir = vectorcross( hitdir, ( 0, 0, 1 ) );
|
||||
side_dir_mag = randomfloatrange( -100, 100 );
|
||||
side_dir_mag += sign( side_dir_mag ) * 80;
|
||||
side_dir *= side_dir_mag;
|
||||
self setvehvelocity( self.velocity + vectorScale( ( 0, 0, 1 ), 100 ) + vectornormalize( side_dir ) );
|
||||
ang_vel = self getangularvelocity();
|
||||
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 += sign( yaw_vel ) * 180;
|
||||
ang_vel += ( randomfloatrange( -1, 1 ), yaw_vel, randomfloatrange( -1, 1 ) );
|
||||
self setangularvelocity( ang_vel );
|
||||
self.crash_accel = randomfloatrange( 75, 110 );
|
||||
level notify( "lantern_crashing" );
|
||||
self cancelaimove();
|
||||
self clearvehgoalpos();
|
||||
self setphysacceleration( vectorscale( ( 0, 0, -1 ), 800.0 ) );
|
||||
hitdir = ( 1, 0, 0 );
|
||||
side_dir = vectorcross( hitdir, ( 0, 0, 1 ) );
|
||||
side_dir_mag = randomfloatrange( -100, 100 );
|
||||
side_dir_mag += sign( side_dir_mag ) * 80;
|
||||
side_dir *= side_dir_mag;
|
||||
self setvehvelocity( self.velocity + vectorscale( ( 0, 0, 1 ), 100.0 ) + vectornormalize( side_dir ) );
|
||||
ang_vel = self getangularvelocity();
|
||||
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 += sign( yaw_vel ) * 180;
|
||||
ang_vel += ( randomfloatrange( -1, 1 ), yaw_vel, randomfloatrange( -1, 1 ) );
|
||||
self setangularvelocity( ang_vel );
|
||||
self.crash_accel = randomfloatrange( 75, 110 );
|
||||
}
|
||||
|
@ -1,420 +1,409 @@
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "fxanim_props_dlc3" );
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
#include maps\mp\zombies\_zm_zonemgr;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_ip_puzzle_complete" );
|
||||
level.sq_bp_buttons = [];
|
||||
s_lightboard = getstruct( "zm_sq_lightboard", "targetname" );
|
||||
s_lightboard sq_bp_spawn_board();
|
||||
declare_sidequest_stage( "sq", "ip", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
flag_init( "sq_ip_puzzle_complete" );
|
||||
level.sq_bp_buttons = [];
|
||||
s_lightboard = getstruct( "zm_sq_lightboard", "targetname" );
|
||||
s_lightboard sq_bp_spawn_board();
|
||||
declare_sidequest_stage( "sq", "ip", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
level thread stage_vo_max();
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread stage_vo_ric();
|
||||
}
|
||||
level._cur_stage_name = "ip";
|
||||
clientnotify( "ip" );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
level thread stage_vo_max();
|
||||
else
|
||||
level thread stage_vo_ric();
|
||||
|
||||
level._cur_stage_name = "ip";
|
||||
clientnotify( "ip" );
|
||||
}
|
||||
|
||||
stage_vo_max()
|
||||
{
|
||||
s_struct = getstruct( "sq_gallows", "targetname" );
|
||||
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
|
||||
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
|
||||
m_maxis_vo_spot setmodel( "tag_origin" );
|
||||
maxissay( "vox_maxi_sidequest_ip_0", m_maxis_vo_spot );
|
||||
maxissay( "vox_maxi_sidequest_ip_1", m_maxis_vo_spot );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
trigger = spawn( "trigger_radius", m_lightboard.origin, 0, 128, 72 );
|
||||
trigger waittill( "trigger" );
|
||||
maxissay( "vox_maxi_sidequest_ip_2", m_lightboard );
|
||||
maxissay( "vox_maxi_sidequest_ip_3", m_lightboard );
|
||||
s_struct = getstruct( "sq_gallows", "targetname" );
|
||||
trigger = spawn( "trigger_radius", s_struct.origin, 0, 128, 72 );
|
||||
m_maxis_vo_spot = spawn( "script_model", s_struct.origin );
|
||||
m_maxis_vo_spot setmodel( "tag_origin" );
|
||||
maxissay( "vox_maxi_sidequest_ip_0", m_maxis_vo_spot );
|
||||
maxissay( "vox_maxi_sidequest_ip_1", m_maxis_vo_spot );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
trigger = spawn( "trigger_radius", m_lightboard.origin, 0, 128, 72 );
|
||||
|
||||
trigger waittill( "trigger" );
|
||||
|
||||
maxissay( "vox_maxi_sidequest_ip_2", m_lightboard );
|
||||
maxissay( "vox_maxi_sidequest_ip_3", m_lightboard );
|
||||
}
|
||||
|
||||
stage_vo_ric()
|
||||
{
|
||||
richtofensay( "vox_zmba_sidequest_ip_0", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_1", 5,5 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_2", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_3", 11 );
|
||||
if ( !isDefined( level.rich_sq_player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( !level.rich_sq_player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_maze" ) )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
richtofensay( "vox_zmba_sidequest_ip_4", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_0", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_1", 5.5 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_2", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_3", 11 );
|
||||
|
||||
if ( !isdefined( level.rich_sq_player ) )
|
||||
return;
|
||||
|
||||
while ( !level.rich_sq_player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_maze" ) )
|
||||
wait 1;
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_ip_4", 8 );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "IP Started" );
|
||||
iprintlnbold( "IP Started" );
|
||||
#/
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
array_thread( a_button_structs, ::sq_bp_spawn_trigger );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
m_lightboard setclientfield( "buried_sq_bp_set_lightboard", 1 );
|
||||
while ( !flag( "sq_ip_puzzle_complete" ) )
|
||||
{
|
||||
sq_bp_start_puzzle_lights();
|
||||
sq_bp_delete_green_lights();
|
||||
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" );
|
||||
array_thread( a_levers, ::sq_ml_spawn_trigger );
|
||||
level thread sq_ml_puzzle_logic();
|
||||
flag_wait( "sq_ip_puzzle_complete" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
array_thread( a_button_structs, ::sq_bp_spawn_trigger );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
m_lightboard setclientfield( "buried_sq_bp_set_lightboard", 1 );
|
||||
|
||||
while ( !flag( "sq_ip_puzzle_complete" ) )
|
||||
{
|
||||
sq_bp_start_puzzle_lights();
|
||||
sq_bp_delete_green_lights();
|
||||
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" );
|
||||
array_thread( a_levers, ::sq_ml_spawn_trigger );
|
||||
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 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
sq_bp_spawn_trigger()
|
||||
{
|
||||
level endon( "sq_ip_puzzle_complete" );
|
||||
self.trig = spawn( "trigger_radius_use", self.origin, 0, 16, 16 );
|
||||
self.trig setcursorhint( "HINT_NOICON" );
|
||||
self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" );
|
||||
self.trig triggerignoreteam();
|
||||
self.trig usetriggerrequirelookat();
|
||||
while ( 1 )
|
||||
{
|
||||
self.trig waittill( "trigger" );
|
||||
self.trig sethintstring( "" );
|
||||
level thread sq_bp_button_pressed( self.script_string, self.trig );
|
||||
wait 1;
|
||||
self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" );
|
||||
}
|
||||
level endon( "sq_ip_puzzle_complete" );
|
||||
self.trig = spawn( "trigger_radius_use", self.origin, 0, 16, 16 );
|
||||
self.trig setcursorhint( "HINT_NOICON" );
|
||||
self.trig sethintstring( &"ZM_BURIED_SQ_BUT_U" );
|
||||
self.trig triggerignoreteam();
|
||||
self.trig usetriggerrequirelookat();
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.trig waittill( "trigger" );
|
||||
|
||||
self.trig sethintstring( "" );
|
||||
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()
|
||||
{
|
||||
m_board = spawn( "script_model", self.origin );
|
||||
m_board.angles = self.angles;
|
||||
m_board setmodel( "p6_zm_bu_bulb_puzzle_machine" );
|
||||
m_board.targetname = "sq_bp_board";
|
||||
m_board = spawn( "script_model", self.origin );
|
||||
m_board.angles = self.angles;
|
||||
m_board setmodel( "p6_zm_bu_bulb_puzzle_machine" );
|
||||
m_board.targetname = "sq_bp_board";
|
||||
}
|
||||
|
||||
sq_bp_button_pressed( str_tag, trig )
|
||||
{
|
||||
if ( isDefined( level.str_sq_bp_active_light ) )
|
||||
{
|
||||
if ( level.str_sq_bp_active_light == str_tag )
|
||||
{
|
||||
trig playsound( "zmb_sq_bell_yes" );
|
||||
sq_bp_light_on( str_tag, "green" );
|
||||
level notify( "sq_bp_correct_button" );
|
||||
}
|
||||
else
|
||||
{
|
||||
trig playsound( "zmb_sq_bell_no" );
|
||||
level notify( "sq_bp_wrong_button" );
|
||||
m_light = sq_bp_light_on( str_tag, "yellow" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_light = sq_bp_light_on( str_tag, "yellow" );
|
||||
trig playsound( "zmb_sq_bell_no" );
|
||||
}
|
||||
wait 1;
|
||||
if ( isDefined( m_light ) )
|
||||
{
|
||||
level setclientfield( m_light, 0 );
|
||||
}
|
||||
if ( isdefined( level.str_sq_bp_active_light ) )
|
||||
{
|
||||
if ( level.str_sq_bp_active_light == str_tag )
|
||||
{
|
||||
trig playsound( "zmb_sq_bell_yes" );
|
||||
sq_bp_light_on( str_tag, "green" );
|
||||
level notify( "sq_bp_correct_button" );
|
||||
}
|
||||
else
|
||||
{
|
||||
trig playsound( "zmb_sq_bell_no" );
|
||||
level notify( "sq_bp_wrong_button" );
|
||||
m_light = sq_bp_light_on( str_tag, "yellow" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_light = sq_bp_light_on( str_tag, "yellow" );
|
||||
trig playsound( "zmb_sq_bell_no" );
|
||||
}
|
||||
|
||||
wait 1;
|
||||
|
||||
if ( isdefined( m_light ) )
|
||||
level setclientfield( m_light, 0 );
|
||||
}
|
||||
|
||||
sq_bp_start_puzzle_lights()
|
||||
{
|
||||
level endon( "sq_bp_wrong_button" );
|
||||
level endon( "sq_bp_timeout" );
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
a_tags = [];
|
||||
_a190 = a_button_structs;
|
||||
_k190 = getFirstArrayKey( _a190 );
|
||||
while ( isDefined( _k190 ) )
|
||||
{
|
||||
m_button = _a190[ _k190 ];
|
||||
a_tags[ a_tags.size ] = m_button.script_string;
|
||||
_k190 = getNextArrayKey( _a190, _k190 );
|
||||
}
|
||||
a_tags = array_randomize( a_tags );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
if ( !isDefined( level.t_start ) )
|
||||
{
|
||||
level.t_start = spawn( "trigger_radius_use", m_lightboard.origin, 0, 16, 16 );
|
||||
}
|
||||
level.t_start setcursorhint( "HINT_NOICON" );
|
||||
level.t_start sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
|
||||
level.t_start triggerignoreteam();
|
||||
level.t_start usetriggerrequirelookat();
|
||||
level.t_start waittill( "trigger" );
|
||||
level.t_start delete();
|
||||
_a210 = a_tags;
|
||||
_k210 = getFirstArrayKey( _a210 );
|
||||
while ( isDefined( _k210 ) )
|
||||
{
|
||||
str_tag = _a210[ _k210 ];
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
level thread sq_bp_set_current_bulb( str_tag );
|
||||
level waittill( "sq_bp_correct_button" );
|
||||
_k210 = getNextArrayKey( _a210, _k210 );
|
||||
}
|
||||
flag_set( "sq_ip_puzzle_complete" );
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
_a221 = a_button_structs;
|
||||
_k221 = getFirstArrayKey( _a221 );
|
||||
while ( isDefined( _k221 ) )
|
||||
{
|
||||
s_button = _a221[ _k221 ];
|
||||
if ( isDefined( s_button.trig ) )
|
||||
{
|
||||
s_button.trig delete();
|
||||
}
|
||||
_k221 = getNextArrayKey( _a221, _k221 );
|
||||
}
|
||||
level endon( "sq_bp_wrong_button" );
|
||||
level endon( "sq_bp_timeout" );
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
a_tags = [];
|
||||
|
||||
foreach ( m_button in a_button_structs )
|
||||
a_tags[a_tags.size] = m_button.script_string;
|
||||
|
||||
a_tags = array_randomize( a_tags );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
|
||||
if ( !isdefined( level.t_start ) )
|
||||
level.t_start = spawn( "trigger_radius_use", m_lightboard.origin, 0, 16, 16 );
|
||||
|
||||
level.t_start setcursorhint( "HINT_NOICON" );
|
||||
level.t_start sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
|
||||
level.t_start triggerignoreteam();
|
||||
level.t_start usetriggerrequirelookat();
|
||||
|
||||
level.t_start waittill( "trigger" );
|
||||
|
||||
level.t_start delete();
|
||||
|
||||
foreach ( str_tag in a_tags )
|
||||
{
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
level thread sq_bp_set_current_bulb( str_tag );
|
||||
|
||||
level waittill( "sq_bp_correct_button" );
|
||||
}
|
||||
|
||||
flag_set( "sq_ip_puzzle_complete" );
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
|
||||
foreach ( s_button in a_button_structs )
|
||||
{
|
||||
if ( isdefined( s_button.trig ) )
|
||||
s_button.trig delete();
|
||||
}
|
||||
}
|
||||
|
||||
sq_bp_set_current_bulb( str_tag )
|
||||
{
|
||||
level endon( "sq_bp_correct_button" );
|
||||
level endon( "sq_bp_wrong_button" );
|
||||
level endon( "sq_bp_timeout" );
|
||||
if ( isDefined( level.m_sq_bp_active_light ) )
|
||||
{
|
||||
level.str_sq_bp_active_light = "";
|
||||
}
|
||||
level.m_sq_bp_active_light = sq_bp_light_on( str_tag, "yellow" );
|
||||
level.str_sq_bp_active_light = str_tag;
|
||||
wait 10;
|
||||
level notify( "sq_bp_timeout" );
|
||||
level endon( "sq_bp_correct_button" );
|
||||
level endon( "sq_bp_wrong_button" );
|
||||
level endon( "sq_bp_timeout" );
|
||||
|
||||
if ( isdefined( level.m_sq_bp_active_light ) )
|
||||
level.str_sq_bp_active_light = "";
|
||||
|
||||
level.m_sq_bp_active_light = sq_bp_light_on( str_tag, "yellow" );
|
||||
level.str_sq_bp_active_light = str_tag;
|
||||
wait 10;
|
||||
level notify( "sq_bp_timeout" );
|
||||
}
|
||||
|
||||
sq_bp_delete_green_lights()
|
||||
{
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
_a251 = a_button_structs;
|
||||
_k251 = getFirstArrayKey( _a251 );
|
||||
while ( isDefined( _k251 ) )
|
||||
{
|
||||
m_button = _a251[ _k251 ];
|
||||
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 = "";
|
||||
}
|
||||
a_button_structs = getstructarray( "sq_bp_button", "targetname" );
|
||||
|
||||
foreach ( m_button in a_button_structs )
|
||||
{
|
||||
str_clientfield = "buried_sq_bp_" + m_button.script_string;
|
||||
level setclientfield( str_clientfield, 0 );
|
||||
}
|
||||
|
||||
if ( isdefined( level.m_sq_bp_active_light ) )
|
||||
level.str_sq_bp_active_light = "";
|
||||
}
|
||||
|
||||
sq_bp_light_on( str_tag, str_color )
|
||||
{
|
||||
str_clientfield = "buried_sq_bp_" + str_tag;
|
||||
n_color = 1;
|
||||
if ( str_color == "green" )
|
||||
{
|
||||
n_color = 2;
|
||||
}
|
||||
level setclientfield( str_clientfield, 0 );
|
||||
wait_network_frame();
|
||||
level setclientfield( str_clientfield, n_color );
|
||||
return str_clientfield;
|
||||
str_clientfield = "buried_sq_bp_" + str_tag;
|
||||
n_color = 1;
|
||||
|
||||
if ( str_color == "green" )
|
||||
n_color = 2;
|
||||
|
||||
level setclientfield( str_clientfield, 0 );
|
||||
wait_network_frame();
|
||||
level setclientfield( str_clientfield, n_color );
|
||||
return str_clientfield;
|
||||
}
|
||||
|
||||
debug_tag( str_tag )
|
||||
{
|
||||
/#
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
debugstar( self gettagorigin( str_tag ), 1, ( 0, 1, 0 ) );
|
||||
wait 0,05;
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
debugstar( self gettagorigin( str_tag ), 1, ( 1, 0, 0 ) );
|
||||
wait 0.05;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
sq_ml_spawn_lever( n_index )
|
||||
{
|
||||
m_lever = spawn( "script_model", ( 0, 1, 0 ) );
|
||||
m_lever setmodel( self.model );
|
||||
m_lever.targetname = "sq_ml_lever";
|
||||
while ( 1 )
|
||||
{
|
||||
v_spot = self.origin;
|
||||
v_angles = self.angles;
|
||||
if ( isDefined( level._maze._active_perm_list[ n_index ] ) )
|
||||
{
|
||||
is_flip = randomint( 2 );
|
||||
s_spot = getstruct( level._maze._active_perm_list[ n_index ], "script_noteworthy" );
|
||||
v_right = anglesToRight( s_spot.angles );
|
||||
v_offset = vectornormalize( v_right ) * 2;
|
||||
if ( is_flip )
|
||||
{
|
||||
v_offset *= -1;
|
||||
}
|
||||
v_spot = s_spot.origin + vectorScale( ( 0, 1, 0 ), 48 ) + v_offset;
|
||||
v_angles = s_spot.angles + vectorScale( ( 0, 1, 0 ), 90 );
|
||||
if ( is_flip )
|
||||
{
|
||||
v_angles = s_spot.angles - vectorScale( ( 0, 1, 0 ), 90 );
|
||||
}
|
||||
}
|
||||
m_lever.origin = v_spot;
|
||||
m_lever.angles = v_angles;
|
||||
m_lever = spawn( "script_model", ( 0, 0, 0 ) );
|
||||
m_lever setmodel( self.model );
|
||||
m_lever.targetname = "sq_ml_lever";
|
||||
|
||||
while ( true )
|
||||
{
|
||||
v_spot = self.origin;
|
||||
v_angles = self.angles;
|
||||
|
||||
if ( isdefined( level._maze._active_perm_list[n_index] ) )
|
||||
{
|
||||
is_flip = randomint( 2 );
|
||||
s_spot = getstruct( level._maze._active_perm_list[n_index], "script_noteworthy" );
|
||||
v_right = anglestoright( s_spot.angles );
|
||||
v_offset = vectornormalize( v_right ) * 2;
|
||||
|
||||
if ( is_flip )
|
||||
v_offset *= -1;
|
||||
|
||||
v_spot = s_spot.origin + vectorscale( ( 0, 0, 1 ), 48.0 ) + v_offset;
|
||||
v_angles = s_spot.angles + vectorscale( ( 0, 1, 0 ), 90.0 );
|
||||
|
||||
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 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 )
|
||||
{
|
||||
level endon( "zm_buried_maze_changed" );
|
||||
level endon( "zm_buried_maze_changed" );
|
||||
/#
|
||||
while ( 1 )
|
||||
{
|
||||
line( self.origin, v_spot, ( 0, 1, 0 ) );
|
||||
print3d( self.origin, "" + n_index, ( 0, 1, 0 ), 1, 2 );
|
||||
wait 0,05;
|
||||
while ( true )
|
||||
{
|
||||
line( self.origin, v_spot, ( 0, 0, 1 ) );
|
||||
print3d( self.origin, "" + n_index, ( 0, 1, 0 ), 1, 2 );
|
||||
wait 0.05;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
sq_ml_spawn_trigger()
|
||||
{
|
||||
v_right = anglesToForward( self.angles );
|
||||
v_offset = vectornormalize( v_right ) * 8;
|
||||
self.trig = spawn( "trigger_box_use", self.origin - v_offset, 0, 16, 16, 16 );
|
||||
self.trig enablelinkto();
|
||||
self.trig linkto( self );
|
||||
self.trig setcursorhint( "HINT_NOICON" );
|
||||
self.trig sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
|
||||
self.trig triggerignoreteam();
|
||||
self.trig usetriggerrequirelookat();
|
||||
self.is_flipped = 0;
|
||||
self useanimtree( -1 );
|
||||
while ( 1 )
|
||||
{
|
||||
self.trig waittill( "trigger" );
|
||||
self setanim( level.maze_switch_anim[ "switch_down" ] );
|
||||
self.trig sethintstring( "" );
|
||||
self.is_flipped = 1;
|
||||
self.n_flip_number = level.sq_ml_curr_lever;
|
||||
level.sq_ml_curr_lever++;
|
||||
self.trig playsound( "zmb_sq_maze_switch" );
|
||||
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;
|
||||
}
|
||||
v_right = anglestoforward( self.angles );
|
||||
v_offset = vectornormalize( v_right ) * 8;
|
||||
self.trig = spawn( "trigger_box_use", self.origin - v_offset, 0, 16, 16, 16 );
|
||||
self.trig enablelinkto();
|
||||
self.trig linkto( self );
|
||||
self.trig setcursorhint( "HINT_NOICON" );
|
||||
self.trig sethintstring( &"ZM_BURIED_SQ_SWIT_U" );
|
||||
self.trig triggerignoreteam();
|
||||
self.trig usetriggerrequirelookat();
|
||||
self.is_flipped = 0;
|
||||
self useanimtree( -1 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.trig waittill( "trigger" );
|
||||
|
||||
self setanim( level.maze_switch_anim["switch_down"] );
|
||||
self.trig sethintstring( "" );
|
||||
self.is_flipped = 1;
|
||||
self.n_flip_number = level.sq_ml_curr_lever;
|
||||
level.sq_ml_curr_lever++;
|
||||
self.trig playsound( "zmb_sq_maze_switch" );
|
||||
|
||||
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()
|
||||
{
|
||||
if ( maps/mp/zombies/_zm_zonemgr::player_in_zone( "zone_maze" ) )
|
||||
{
|
||||
level waittill( "zm_buried_maze_changed" );
|
||||
}
|
||||
a_lever_structs = getstructarray( "sq_maze_lever", "targetname" );
|
||||
i = 0;
|
||||
while ( i < a_lever_structs.size )
|
||||
{
|
||||
a_lever_structs[ i ] thread sq_ml_spawn_lever( i );
|
||||
i++;
|
||||
}
|
||||
if ( maps\mp\zombies\_zm_zonemgr::player_in_zone( "zone_maze" ) )
|
||||
level waittill( "zm_buried_maze_changed" );
|
||||
|
||||
a_lever_structs = getstructarray( "sq_maze_lever", "targetname" );
|
||||
|
||||
for ( i = 0; i < a_lever_structs.size; i++ )
|
||||
a_lever_structs[i] thread sq_ml_spawn_lever( i );
|
||||
}
|
||||
|
||||
sq_ml_puzzle_logic()
|
||||
{
|
||||
a_levers = getentarray( "sq_ml_lever", "targetname" );
|
||||
level.sq_ml_curr_lever = 0;
|
||||
a_levers = array_randomize( a_levers );
|
||||
i = 0;
|
||||
while ( i < a_levers.size )
|
||||
{
|
||||
a_levers[ i ].n_lever_order = i;
|
||||
i++;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
level.sq_ml_curr_lever = 0;
|
||||
sq_ml_puzzle_wait_for_levers();
|
||||
n_correct = 0;
|
||||
_a424 = a_levers;
|
||||
_k424 = getFirstArrayKey( _a424 );
|
||||
while ( isDefined( _k424 ) )
|
||||
{
|
||||
m_lever = _a424[ _k424 ];
|
||||
if ( m_lever.n_flip_number == m_lever.n_lever_order )
|
||||
{
|
||||
playfxontag( level._effect[ "sq_spark" ], m_lever, "tag_origin" );
|
||||
n_correct++;
|
||||
m_lever playsound( "zmb_sq_maze_correct_spark" );
|
||||
}
|
||||
_k424 = getNextArrayKey( _a424, _k424 );
|
||||
}
|
||||
a_levers = getentarray( "sq_ml_lever", "targetname" );
|
||||
level.sq_ml_curr_lever = 0;
|
||||
a_levers = array_randomize( a_levers );
|
||||
|
||||
for ( i = 0; i < a_levers.size; i++ )
|
||||
a_levers[i].n_lever_order = i;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
level.sq_ml_curr_lever = 0;
|
||||
sq_ml_puzzle_wait_for_levers();
|
||||
n_correct = 0;
|
||||
|
||||
foreach ( m_lever in a_levers )
|
||||
{
|
||||
if ( m_lever.n_flip_number == m_lever.n_lever_order )
|
||||
{
|
||||
playfxontag( level._effect["sq_spark"], m_lever, "tag_origin" );
|
||||
n_correct++;
|
||||
m_lever playsound( "zmb_sq_maze_correct_spark" );
|
||||
}
|
||||
}
|
||||
/#
|
||||
iprintlnbold( "Levers Correct: " + n_correct );
|
||||
iprintlnbold( "Levers Correct: " + n_correct );
|
||||
#/
|
||||
if ( n_correct == a_levers.size )
|
||||
{
|
||||
flag_set( "sq_ip_puzzle_complete" );
|
||||
}
|
||||
level waittill( "zm_buried_maze_changed" );
|
||||
level notify( "sq_ml_reset_levers" );
|
||||
wait 1;
|
||||
}
|
||||
if ( n_correct == a_levers.size )
|
||||
flag_set( "sq_ip_puzzle_complete" );
|
||||
|
||||
level waittill( "zm_buried_maze_changed" );
|
||||
|
||||
level notify( "sq_ml_reset_levers" );
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
sq_ml_puzzle_wait_for_levers()
|
||||
{
|
||||
a_levers = getentarray( "sq_ml_lever", "targetname" );
|
||||
are_all_flipped = 0;
|
||||
while ( !are_all_flipped )
|
||||
{
|
||||
are_all_flipped = 1;
|
||||
_a458 = a_levers;
|
||||
_k458 = getFirstArrayKey( _a458 );
|
||||
while ( isDefined( _k458 ) )
|
||||
{
|
||||
m_lever = _a458[ _k458 ];
|
||||
if ( m_lever.is_flipped == 0 )
|
||||
{
|
||||
are_all_flipped = 0;
|
||||
}
|
||||
_k458 = getNextArrayKey( _a458, _k458 );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
a_levers = getentarray( "sq_ml_lever", "targetname" );
|
||||
are_all_flipped = 0;
|
||||
|
||||
while ( !are_all_flipped )
|
||||
{
|
||||
are_all_flipped = 1;
|
||||
|
||||
foreach ( m_lever in a_levers )
|
||||
{
|
||||
if ( m_lever.is_flipped == 0 )
|
||||
are_all_flipped = 0;
|
||||
}
|
||||
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
@ -1,102 +1,90 @@
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_ll_generator_on" );
|
||||
declare_sidequest_stage( "sq", "ll", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
flag_init( "sq_ll_generator_on" );
|
||||
declare_sidequest_stage( "sq", "ll", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
level._cur_stage_name = "ll";
|
||||
clientnotify( "ll" );
|
||||
level._cur_stage_name = "ll";
|
||||
clientnotify( "ll" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "LL Started" );
|
||||
iprintlnbold( "LL Started" );
|
||||
#/
|
||||
if ( !isDefined( level.generator_power_states_color ) )
|
||||
{
|
||||
level.generator_power_states_color = 0;
|
||||
}
|
||||
sq_ll_show_code();
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
if ( !isdefined( level.generator_power_states_color ) )
|
||||
level.generator_power_states_color = 0;
|
||||
|
||||
sq_ll_show_code();
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
sq_ll_show_code()
|
||||
{
|
||||
a_spots = getstructarray( "sq_code_pos", "targetname" );
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
a_codes = [];
|
||||
_a50 = a_signs;
|
||||
_k50 = getFirstArrayKey( _a50 );
|
||||
while ( isDefined( _k50 ) )
|
||||
{
|
||||
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";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( m_sign.is_ric_sign ) )
|
||||
{
|
||||
a_codes[ a_codes.size ] = m_sign.model + "_code";
|
||||
}
|
||||
}
|
||||
_k50 = getNextArrayKey( _a50, _k50 );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < a_codes.size )
|
||||
{
|
||||
if ( a_codes[ i ] == "p6_zm_bu_sign_tunnel_consumption_code" )
|
||||
{
|
||||
a_codes[ i ] = "p6_zm_bu_sign_tunnel_consump_code";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < a_codes.size )
|
||||
{
|
||||
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();
|
||||
}
|
||||
a_spots = getstructarray( "sq_code_pos", "targetname" );
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
a_codes = [];
|
||||
|
||||
foreach ( m_sign in a_signs )
|
||||
{
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
if ( isdefined( m_sign.is_max_sign ) )
|
||||
a_codes[a_codes.size] = m_sign.model + "_code";
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( m_sign.is_ric_sign ) )
|
||||
a_codes[a_codes.size] = m_sign.model + "_code";
|
||||
}
|
||||
|
||||
for ( i = 0; i < a_codes.size; i++ )
|
||||
{
|
||||
if ( a_codes[i] == "p6_zm_bu_sign_tunnel_consumption_code" )
|
||||
a_codes[i] = "p6_zm_bu_sign_tunnel_consump_code";
|
||||
}
|
||||
|
||||
for ( i = 0; i < a_codes.size; i++ )
|
||||
{
|
||||
m_code = spawn( "script_model", a_spots[i].origin );
|
||||
m_code.angles = a_spots[i].angles;
|
||||
m_code setmodel( a_codes[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 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
sq_ll_show_code_vo_max()
|
||||
{
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
maxissay( "vox_maxi_sidequest_signs_0", a_signs[ 0 ] );
|
||||
maxissay( "vox_maxi_sidequest_signs_1", a_signs[ 0 ] );
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
maxissay( "vox_maxi_sidequest_signs_0", a_signs[0] );
|
||||
maxissay( "vox_maxi_sidequest_signs_1", a_signs[0] );
|
||||
}
|
||||
|
||||
sq_ll_show_code_vo_ric()
|
||||
{
|
||||
richtofensay( "vox_zmba_sidequest_signs_0", 7 );
|
||||
richtofensay( "vox_zmba_sidequest_signs_1", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_signs_2", 9 );
|
||||
richtofensay( "vox_zmba_sidequest_signs_0", 7 );
|
||||
richtofensay( "vox_zmba_sidequest_signs_1", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_signs_2", 9 );
|
||||
}
|
||||
|
@ -1,204 +1,205 @@
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_amplifiers_on" );
|
||||
a_amp_structs = getstructarray( "sq_amplifier_spot" );
|
||||
_a16 = a_amp_structs;
|
||||
_k16 = getFirstArrayKey( _a16 );
|
||||
while ( isDefined( _k16 ) )
|
||||
{
|
||||
s_amp_spot = _a16[ _k16 ];
|
||||
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 );
|
||||
flag_init( "sq_amplifiers_on" );
|
||||
a_amp_structs = getstructarray( "sq_amplifier_spot" );
|
||||
|
||||
foreach ( s_amp_spot in a_amp_structs )
|
||||
{
|
||||
m_amplifier = spawn( "script_model", s_amp_spot.origin );
|
||||
m_amplifier thread mta_amplifier_init();
|
||||
}
|
||||
|
||||
declare_sidequest_stage( "sq", "mta", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
a_amplifiers = getentarray( "sq_amplifier", "targetname" );
|
||||
array_thread( a_amplifiers, ::mta_amplifier_found_watcher );
|
||||
level thread stage_vo_max();
|
||||
level thread stage_vo_ric();
|
||||
level._cur_stage_name = "mta";
|
||||
clientnotify( "mta" );
|
||||
a_amplifiers = getentarray( "sq_amplifier", "targetname" );
|
||||
array_thread( a_amplifiers, ::mta_amplifier_found_watcher );
|
||||
level thread stage_vo_max();
|
||||
level thread stage_vo_ric();
|
||||
level._cur_stage_name = "mta";
|
||||
clientnotify( "mta" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "MTA Started" );
|
||||
iprintlnbold( "MTA Started" );
|
||||
#/
|
||||
flag_wait_any( "sq_amplifiers_on", "sq_amplifiers_broken" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
flag_wait_any( "sq_amplifiers_on", "sq_amplifiers_broken" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
stage_vo_max()
|
||||
{
|
||||
level thread stage_vo_max_amp_broken();
|
||||
level waittill( "mta_amp_found", amp );
|
||||
maxissay( "vox_maxi_sidequest_amp_0", amp );
|
||||
maxissay( "vox_maxi_sidequest_amp_1", amp );
|
||||
level thread stage_vo_max_amp_broken();
|
||||
|
||||
level waittill( "mta_amp_found", amp );
|
||||
|
||||
maxissay( "vox_maxi_sidequest_amp_0", amp );
|
||||
maxissay( "vox_maxi_sidequest_amp_1", amp );
|
||||
}
|
||||
|
||||
stage_vo_max_amp_broken()
|
||||
{
|
||||
level waittill( "mta_amp_broken", amp );
|
||||
maxissay( "vox_maxi_sidequest_amp_2", amp );
|
||||
level waittill( "mta_amp_broken", amp );
|
||||
maxissay( "vox_maxi_sidequest_amp_3", 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_5", amp );
|
||||
maxissay( "vox_maxi_sidequest_gl_0", amp );
|
||||
maxissay( "vox_maxi_sidequest_gl_1", 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_3", 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_5", amp );
|
||||
maxissay( "vox_maxi_sidequest_gl_0", amp );
|
||||
maxissay( "vox_maxi_sidequest_gl_1", amp );
|
||||
}
|
||||
|
||||
stage_vo_ric()
|
||||
{
|
||||
level thread stage_vo_ric_amp_amplified();
|
||||
level waittill( "mta_amp_found_by_sam" );
|
||||
richtofensay( "vox_zmba_sidequest_amp_0", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_amp_1", 7 );
|
||||
level thread stage_vo_ric_amp_amplified();
|
||||
|
||||
level waittill( "mta_amp_found_by_sam" );
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_amp_0", 10 );
|
||||
richtofensay( "vox_zmba_sidequest_amp_1", 7 );
|
||||
}
|
||||
|
||||
stage_vo_ric_amp_amplified()
|
||||
{
|
||||
level waittill( "mta_amp_amplified" );
|
||||
richtofensay( "vox_zmba_sidequest_amp_2", 6 );
|
||||
richtofensay( "vox_zmba_sidequest_amp_3", 4 );
|
||||
level waittill( "mta_amp_amplified" );
|
||||
|
||||
richtofensay( "vox_zmba_sidequest_amp_2", 6 );
|
||||
richtofensay( "vox_zmba_sidequest_amp_3", 4 );
|
||||
}
|
||||
|
||||
mta_amplifier_found_watcher()
|
||||
{
|
||||
self endon( "damaged_by_subwoofer" );
|
||||
self endon( "amplifier_filled" );
|
||||
if ( self.amplifier_state != "base" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
trigger = spawn( "trigger_radius", self.origin, 0, 128, 72 );
|
||||
trigger waittill( "trigger", who );
|
||||
if ( isDefined( level.rich_sq_player ) && who == level.rich_sq_player )
|
||||
{
|
||||
level notify( "mta_amp_found_by_sam" );
|
||||
}
|
||||
else
|
||||
{
|
||||
level notify( "mta_amp_found" );
|
||||
}
|
||||
self endon( "damaged_by_subwoofer" );
|
||||
self endon( "amplifier_filled" );
|
||||
|
||||
if ( self.amplifier_state != "base" )
|
||||
return;
|
||||
|
||||
trigger = spawn( "trigger_radius", self.origin, 0, 128, 72 );
|
||||
|
||||
trigger waittill( "trigger", who );
|
||||
|
||||
if ( isdefined( level.rich_sq_player ) && who == level.rich_sq_player )
|
||||
level notify( "mta_amp_found_by_sam" );
|
||||
else
|
||||
level notify( "mta_amp_found", self );
|
||||
}
|
||||
|
||||
mta_amplifier_init()
|
||||
{
|
||||
self setmodel( "p6_zm_bu_ether_amplifier" );
|
||||
self.targetname = "sq_amplifier";
|
||||
self.script_noteworthy = "subwoofer_target";
|
||||
self.amplifier_state = "base";
|
||||
self playloopsound( "zmb_sq_amplifier_empty_loop", 1 );
|
||||
self setcandamage( 1 );
|
||||
self thread mta_amplifier_subwoofer_watch();
|
||||
self mta_amplifier_damage_watch();
|
||||
self setmodel( "p6_zm_bu_ether_amplifier" );
|
||||
self.targetname = "sq_amplifier";
|
||||
self.script_noteworthy = "subwoofer_target";
|
||||
self.amplifier_state = "base";
|
||||
self playloopsound( "zmb_sq_amplifier_empty_loop", 1 );
|
||||
self setcandamage( 1 );
|
||||
self thread mta_amplifier_subwoofer_watch();
|
||||
self mta_amplifier_damage_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 setmodel( "p6_zm_bu_ether_amplifier_dmg" );
|
||||
self stoploopsound( 0,1 );
|
||||
self playsound( "zmb_sq_amplifier_destroy" );
|
||||
level notify( "mta_amp_broken" );
|
||||
mta_check_all_amplifier_states();
|
||||
self.amplifier_state = "broken";
|
||||
self setmodel( "p6_zm_bu_ether_amplifier_dmg" );
|
||||
self stoploopsound( 0.1 );
|
||||
self playsound( "zmb_sq_amplifier_destroy" );
|
||||
level notify( "mta_amp_broken", self );
|
||||
mta_check_all_amplifier_states();
|
||||
}
|
||||
|
||||
mta_amplifier_damage_watch()
|
||||
{
|
||||
self endon( "damaged_by_subwoofer" );
|
||||
n_slowgun_count = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
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" )
|
||||
{
|
||||
n_slowgun_count++;
|
||||
shader_amount = linear_map( n_slowgun_count, 0, 25, 0, 1 );
|
||||
self setclientfield( "AmplifierShaderConstant", shader_amount );
|
||||
if ( n_slowgun_count >= 25 )
|
||||
{
|
||||
self endon( "damaged_by_subwoofer" );
|
||||
n_slowgun_count = 0;
|
||||
|
||||
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" )
|
||||
{
|
||||
n_slowgun_count++;
|
||||
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.amplifier_state = "filled";
|
||||
self playsound( "zmb_sq_amplifier_fill" );
|
||||
self playloopsound( "zmb_sq_amplifier_full_loop", 1 );
|
||||
self notify( "amplifier_filled" );
|
||||
level notify( "mta_amp_amplified" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wait_network_frame();
|
||||
}
|
||||
}
|
||||
mta_check_all_amplifier_states();
|
||||
self thread mta_amplifier_filled_fx();
|
||||
self.amplifier_state = "filled";
|
||||
self playsound( "zmb_sq_amplifier_fill" );
|
||||
self playloopsound( "zmb_sq_amplifier_full_loop", 1 );
|
||||
self notify( "amplifier_filled" );
|
||||
level notify( "mta_amp_amplified" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wait_network_frame();
|
||||
}
|
||||
|
||||
mta_check_all_amplifier_states();
|
||||
}
|
||||
|
||||
mta_amplifier_filled_fx()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
playfx( level._effect[ "sq_ether_amp_trail" ], self.origin + vectorScale( ( 0, 0, 1 ), 46 ) );
|
||||
wait 1;
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
playfx( level._effect["sq_ether_amp_trail"], self.origin + vectorscale( ( 0, 0, 1 ), 46.0 ) );
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
mta_check_all_amplifier_states()
|
||||
{
|
||||
is_all_broken = 1;
|
||||
is_all_filled = 1;
|
||||
a_amplifiers = getentarray( "sq_amplifier", "targetname" );
|
||||
_a226 = a_amplifiers;
|
||||
_k226 = getFirstArrayKey( _a226 );
|
||||
while ( isDefined( _k226 ) )
|
||||
{
|
||||
m_amplifier = _a226[ _k226 ];
|
||||
if ( m_amplifier.amplifier_state != "filled" )
|
||||
{
|
||||
is_all_filled = 0;
|
||||
}
|
||||
if ( m_amplifier.amplifier_state != "broken" )
|
||||
{
|
||||
is_all_broken = 0;
|
||||
}
|
||||
_k226 = getNextArrayKey( _a226, _k226 );
|
||||
}
|
||||
if ( is_all_filled )
|
||||
{
|
||||
flag_set( "sq_amplifiers_on" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_all_broken )
|
||||
{
|
||||
flag_set( "sq_amplifiers_broken" );
|
||||
}
|
||||
}
|
||||
is_all_broken = 1;
|
||||
is_all_filled = 1;
|
||||
a_amplifiers = getentarray( "sq_amplifier", "targetname" );
|
||||
|
||||
foreach ( m_amplifier in a_amplifiers )
|
||||
{
|
||||
if ( m_amplifier.amplifier_state != "filled" )
|
||||
is_all_filled = 0;
|
||||
|
||||
if ( m_amplifier.amplifier_state != "broken" )
|
||||
is_all_broken = 0;
|
||||
}
|
||||
|
||||
if ( is_all_filled )
|
||||
flag_set( "sq_amplifiers_on" );
|
||||
else if ( is_all_broken )
|
||||
flag_set( "sq_amplifiers_broken" );
|
||||
}
|
||||
|
@ -1,223 +1,231 @@
|
||||
#include maps/mp/zm_buried_sq;
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
#include maps\mp\zm_buried_sq;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_ows_start" );
|
||||
flag_init( "sq_ows_target_missed" );
|
||||
flag_init( "sq_ows_success" );
|
||||
declare_sidequest_stage( "sq", "ows", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
flag_init( "sq_ows_start" );
|
||||
flag_init( "sq_ows_target_missed" );
|
||||
flag_init( "sq_ows_success" );
|
||||
declare_sidequest_stage( "sq", "ows", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
{
|
||||
level thread stage_vo_max();
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread stage_vo_ric();
|
||||
}
|
||||
level._cur_stage_name = "ows";
|
||||
clientnotify( "ows" );
|
||||
if ( flag( "sq_is_max_tower_built" ) )
|
||||
level thread stage_vo_max();
|
||||
else
|
||||
level thread stage_vo_ric();
|
||||
|
||||
level._cur_stage_name = "ows";
|
||||
clientnotify( "ows" );
|
||||
}
|
||||
|
||||
stage_vo_max()
|
||||
{
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
maxissay( "vox_maxi_sidequest_ip_4", m_lightboard );
|
||||
m_lightboard = getent( "sq_bp_board", "targetname" );
|
||||
maxissay( "vox_maxi_sidequest_ip_4", m_lightboard );
|
||||
}
|
||||
|
||||
stage_vo_ric()
|
||||
{
|
||||
richtofensay( "vox_zmba_sidequest_ip_5", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_6", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_7", 11 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_5", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_6", 8 );
|
||||
richtofensay( "vox_zmba_sidequest_ip_7", 11 );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "OWS Started" );
|
||||
iprintlnbold( "OWS Started" );
|
||||
#/
|
||||
while ( !flag( "sq_ows_success" ) )
|
||||
{
|
||||
level thread ows_fountain_wait();
|
||||
flag_wait( "sq_ows_start" );
|
||||
ows_targets_start();
|
||||
flag_clear( "sq_ows_start" );
|
||||
}
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
while ( !flag( "sq_ows_success" ) )
|
||||
{
|
||||
level thread ows_fountain_wait();
|
||||
flag_wait( "sq_ows_start" );
|
||||
ows_targets_start();
|
||||
flag_clear( "sq_ows_start" );
|
||||
}
|
||||
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ows_fountain_wait()
|
||||
{
|
||||
level endon( "sq_ows_start" );
|
||||
s_fountain_spot = getstruct( "sq_ows_fountain", "targetname" );
|
||||
t_fountain = spawn( "trigger_radius_use", s_fountain_spot.origin, 0, 55, 64 );
|
||||
t_fountain setcursorhint( "HINT_NOICON" );
|
||||
t_fountain sethintstring( &"ZM_BURIED_SQ_FOUNT_U" );
|
||||
t_fountain triggerignoreteam();
|
||||
t_fountain usetriggerrequirelookat();
|
||||
t_fountain waittill( "trigger" );
|
||||
t_fountain playsound( "zmb_sq_coin_toss" );
|
||||
t_fountain delete();
|
||||
flag_set( "sq_ows_start" );
|
||||
level endon( "sq_ows_start" );
|
||||
s_fountain_spot = getstruct( "sq_ows_fountain", "targetname" );
|
||||
t_fountain = spawn( "trigger_radius_use", s_fountain_spot.origin, 0, 55, 64 );
|
||||
t_fountain setcursorhint( "HINT_NOICON" );
|
||||
t_fountain sethintstring( &"ZM_BURIED_SQ_FOUNT_U" );
|
||||
t_fountain triggerignoreteam();
|
||||
t_fountain usetriggerrequirelookat();
|
||||
|
||||
t_fountain waittill( "trigger" );
|
||||
|
||||
t_fountain playsound( "zmb_sq_coin_toss" );
|
||||
t_fountain delete();
|
||||
flag_set( "sq_ows_start" );
|
||||
}
|
||||
|
||||
ows_targets_start()
|
||||
{
|
||||
n_cur_second = 0;
|
||||
flag_clear( "sq_ows_target_missed" );
|
||||
level thread sndsidequestowsmusic();
|
||||
a_sign_spots = getstructarray( "otw_target_spot", "script_noteworthy" );
|
||||
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 )
|
||||
{
|
||||
ows_targets_spawn( a_spawn_spots );
|
||||
}
|
||||
wait 1;
|
||||
n_cur_second++;
|
||||
}
|
||||
if ( !flag( "sq_ows_target_missed" ) )
|
||||
{
|
||||
flag_set( "sq_ows_success" );
|
||||
playsoundatposition( "zmb_sq_target_success", ( 0, 0, 0 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
playsoundatposition( "zmb_sq_target_fail", ( 0, 0, 0 ) );
|
||||
}
|
||||
level notify( "sndEndOWSMusic" );
|
||||
n_cur_second = 0;
|
||||
flag_clear( "sq_ows_target_missed" );
|
||||
level thread sndsidequestowsmusic();
|
||||
a_sign_spots = getstructarray( "otw_target_spot", "script_noteworthy" );
|
||||
|
||||
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 )
|
||||
ows_targets_spawn( a_spawn_spots );
|
||||
|
||||
wait 1;
|
||||
n_cur_second++;
|
||||
}
|
||||
|
||||
if ( !flag( "sq_ows_target_missed" ) )
|
||||
{
|
||||
flag_set( "sq_ows_success" );
|
||||
playsoundatposition( "zmb_sq_target_success", ( 0, 0, 0 ) );
|
||||
}
|
||||
else
|
||||
playsoundatposition( "zmb_sq_target_fail", ( 0, 0, 0 ) );
|
||||
|
||||
level notify( "sndEndOWSMusic" );
|
||||
}
|
||||
|
||||
ows_targets_get_cur_spots( n_time )
|
||||
{
|
||||
a_target_spots = getstructarray( "otw_target_spot", "script_noteworthy" );
|
||||
a_to_spawn = [];
|
||||
str_time = "" + n_time;
|
||||
_a133 = a_target_spots;
|
||||
_k133 = getFirstArrayKey( _a133 );
|
||||
while ( isDefined( _k133 ) )
|
||||
{
|
||||
s_spot = _a133[ _k133 ];
|
||||
if ( isDefined( s_spot.script_string ) )
|
||||
{
|
||||
a_spawn_times = strtok( s_spot.script_string, " " );
|
||||
if ( isinarray( a_spawn_times, str_time ) )
|
||||
{
|
||||
a_to_spawn[ a_to_spawn.size ] = s_spot;
|
||||
}
|
||||
}
|
||||
_k133 = getNextArrayKey( _a133, _k133 );
|
||||
}
|
||||
return a_to_spawn;
|
||||
a_target_spots = getstructarray( "otw_target_spot", "script_noteworthy" );
|
||||
a_to_spawn = [];
|
||||
str_time = "" + n_time;
|
||||
|
||||
foreach ( s_spot in a_target_spots )
|
||||
{
|
||||
if ( isdefined( s_spot.script_string ) )
|
||||
{
|
||||
a_spawn_times = strtok( s_spot.script_string, " " );
|
||||
|
||||
if ( isinarray( a_spawn_times, str_time ) )
|
||||
a_to_spawn[a_to_spawn.size] = s_spot;
|
||||
}
|
||||
}
|
||||
|
||||
return a_to_spawn;
|
||||
}
|
||||
|
||||
ows_targets_spawn( a_spawn_spots )
|
||||
{
|
||||
_a151 = a_spawn_spots;
|
||||
_k151 = getFirstArrayKey( _a151 );
|
||||
while ( isDefined( _k151 ) )
|
||||
{
|
||||
s_spot = _a151[ _k151 ];
|
||||
m_target = spawn( "script_model", s_spot.origin );
|
||||
m_target.angles = s_spot.angles;
|
||||
m_target setmodel( "p6_zm_bu_target" );
|
||||
m_target ghost();
|
||||
wait_network_frame();
|
||||
m_target show();
|
||||
playfxontag( level._effect[ "sq_spawn" ], m_target, "tag_origin" );
|
||||
m_target playsound( "zmb_sq_target_spawn" );
|
||||
if ( isDefined( s_spot.target ) )
|
||||
{
|
||||
m_target thread ows_target_move( s_spot.target );
|
||||
}
|
||||
m_target thread ows_target_think();
|
||||
m_target thread sndhit();
|
||||
m_target thread sndtime();
|
||||
_k151 = getNextArrayKey( _a151, _k151 );
|
||||
}
|
||||
foreach ( s_spot in a_spawn_spots )
|
||||
{
|
||||
m_target = spawn( "script_model", s_spot.origin );
|
||||
m_target.angles = s_spot.angles;
|
||||
m_target setmodel( "p6_zm_bu_target" );
|
||||
m_target ghost();
|
||||
wait_network_frame();
|
||||
m_target show();
|
||||
playfxontag( level._effect["sq_spawn"], m_target, "tag_origin" );
|
||||
m_target playsound( "zmb_sq_target_spawn" );
|
||||
|
||||
if ( isdefined( s_spot.target ) )
|
||||
m_target thread ows_target_move( s_spot.target );
|
||||
|
||||
m_target thread ows_target_think();
|
||||
m_target thread sndhit();
|
||||
m_target thread sndtime();
|
||||
}
|
||||
}
|
||||
|
||||
ows_target_think()
|
||||
{
|
||||
self setcandamage( 1 );
|
||||
self thread ows_target_delete_timer();
|
||||
self waittill_either( "ows_target_timeout", "damage" );
|
||||
if ( isDefined( self.m_linker ) )
|
||||
{
|
||||
self unlink();
|
||||
self.m_linker delete();
|
||||
}
|
||||
self rotatepitch( -90, 0,15, 0,05, 0,05 );
|
||||
self waittill( "rotatedone" );
|
||||
self delete();
|
||||
self setcandamage( 1 );
|
||||
self thread ows_target_delete_timer();
|
||||
self waittill_either( "ows_target_timeout", "damage" );
|
||||
|
||||
if ( isdefined( self.m_linker ) )
|
||||
{
|
||||
self unlink();
|
||||
self.m_linker delete();
|
||||
}
|
||||
|
||||
self rotatepitch( -90, 0.15, 0.05, 0.05 );
|
||||
|
||||
self waittill( "rotatedone" );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
ows_target_move( str_target )
|
||||
{
|
||||
s_target = getstruct( str_target, "targetname" );
|
||||
self.m_linker = spawn( "script_model", self.origin );
|
||||
self.m_linker.angles = self.angles;
|
||||
self linkto( self.m_linker );
|
||||
self.m_linker moveto( s_target.origin, 4, 0,05, 0,05 );
|
||||
s_target = getstruct( str_target, "targetname" );
|
||||
self.m_linker = spawn( "script_model", self.origin );
|
||||
self.m_linker.angles = self.angles;
|
||||
self linkto( self.m_linker );
|
||||
self.m_linker moveto( s_target.origin, 4, 0.05, 0.05 );
|
||||
}
|
||||
|
||||
ows_target_delete_timer()
|
||||
{
|
||||
self endon( "death" );
|
||||
wait 4;
|
||||
self notify( "ows_target_timeout" );
|
||||
flag_set( "sq_ows_target_missed" );
|
||||
self endon( "death" );
|
||||
wait 4;
|
||||
self notify( "ows_target_timeout" );
|
||||
flag_set( "sq_ows_target_missed" );
|
||||
/#
|
||||
iprintlnbold( "missed target! step failed. target @ " + self.origin );
|
||||
iprintlnbold( "missed target! step failed. target @ " + self.origin );
|
||||
#/
|
||||
}
|
||||
|
||||
sndsidequestowsmusic()
|
||||
{
|
||||
while ( is_true( level.music_override ) )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
level.music_override = 1;
|
||||
level setclientfield( "mus_zmb_egg_snapshot_loop", 1 );
|
||||
ent = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
ent playloopsound( "mus_sidequest_ows" );
|
||||
level waittill( "sndEndOWSMusic" );
|
||||
level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
|
||||
level.music_override = 0;
|
||||
ent stoploopsound( 4 );
|
||||
if ( !flag( "sq_ows_success" ) )
|
||||
{
|
||||
wait 0,5;
|
||||
ent playsound( "mus_sidequest_0" );
|
||||
}
|
||||
wait 3,5;
|
||||
ent delete();
|
||||
while ( is_true( level.music_override ) )
|
||||
wait 0.1;
|
||||
|
||||
level.music_override = 1;
|
||||
level setclientfield( "mus_zmb_egg_snapshot_loop", 1 );
|
||||
ent = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
ent playloopsound( "mus_sidequest_ows" );
|
||||
|
||||
level waittill( "sndEndOWSMusic" );
|
||||
|
||||
level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
|
||||
level.music_override = 0;
|
||||
ent stoploopsound( 4 );
|
||||
|
||||
if ( !flag( "sq_ows_success" ) )
|
||||
{
|
||||
wait 0.5;
|
||||
ent playsound( "mus_sidequest_0" );
|
||||
}
|
||||
|
||||
wait 3.5;
|
||||
ent delete();
|
||||
}
|
||||
|
||||
sndhit()
|
||||
{
|
||||
self endon( "ows_target_timeout" );
|
||||
self waittill( "damage" );
|
||||
self playsound( "zmb_sq_target_hit" );
|
||||
self endon( "ows_target_timeout" );
|
||||
|
||||
self waittill( "damage" );
|
||||
|
||||
self playsound( "zmb_sq_target_hit" );
|
||||
}
|
||||
|
||||
sndtime()
|
||||
{
|
||||
self endon( "zmb_sq_target_hit" );
|
||||
self waittill( "ows_target_timeout" );
|
||||
self playsound( "zmb_sq_target_flip" );
|
||||
self endon( "zmb_sq_target_hit" );
|
||||
|
||||
self waittill( "ows_target_timeout" );
|
||||
|
||||
self playsound( "zmb_sq_target_flip" );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,152 +1,151 @@
|
||||
#include maps/mp/zombies/_zm_sidequests;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_sidequests;
|
||||
|
||||
init()
|
||||
{
|
||||
flag_init( "sq_ts_quicktest" );
|
||||
declare_sidequest_stage( "sq", "ts", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
flag_init( "sq_ts_quicktest" );
|
||||
declare_sidequest_stage( "sq", "ts", ::init_stage, ::stage_logic, ::exit_stage );
|
||||
}
|
||||
|
||||
init_stage()
|
||||
{
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
_a18 = a_signs;
|
||||
_k18 = getFirstArrayKey( _a18 );
|
||||
while ( isDefined( _k18 ) )
|
||||
{
|
||||
m_sign = _a18[ _k18 ];
|
||||
m_sign setcandamage( 1 );
|
||||
m_sign thread ts_sign_damage_watch();
|
||||
_k18 = getNextArrayKey( _a18, _k18 );
|
||||
}
|
||||
level._cur_stage_name = "ts";
|
||||
clientnotify( "ts" );
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
|
||||
foreach ( m_sign in a_signs )
|
||||
{
|
||||
m_sign setcandamage( 1 );
|
||||
m_sign thread ts_sign_damage_watch();
|
||||
}
|
||||
|
||||
level._cur_stage_name = "ts";
|
||||
clientnotify( "ts" );
|
||||
}
|
||||
|
||||
stage_logic()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "TS Started" );
|
||||
iprintlnbold( "TS Started" );
|
||||
#/
|
||||
level waittill( "sq_sign_damaged" );
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
level waittill( "sq_sign_damaged" );
|
||||
|
||||
wait_network_frame();
|
||||
stage_completed( "sq", level._cur_stage_name );
|
||||
}
|
||||
|
||||
exit_stage( success )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ts_sign_damage_watch()
|
||||
{
|
||||
level endon( "sq_sign_damaged" );
|
||||
self ts_sign_deactivate();
|
||||
while ( 1 )
|
||||
{
|
||||
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" ) )
|
||||
{
|
||||
level.m_sq_start_sign = self;
|
||||
level.e_sq_sign_attacker = e_attacker;
|
||||
level notify( "sq_sign_damaged" );
|
||||
}
|
||||
if ( ts_is_bowie_knife( str_weapon ) || ts_is_galvaknuckles( str_weapon ) )
|
||||
{
|
||||
if ( self.ts_sign_activated )
|
||||
{
|
||||
self thread ts_sign_deactivate();
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread ts_sign_activate();
|
||||
}
|
||||
ts_sign_check_all_activated( e_attacker, self );
|
||||
}
|
||||
}
|
||||
level endon( "sq_sign_damaged" );
|
||||
self ts_sign_deactivate();
|
||||
|
||||
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" ) )
|
||||
{
|
||||
level.m_sq_start_sign = self;
|
||||
level.e_sq_sign_attacker = e_attacker;
|
||||
level notify( "sq_sign_damaged" );
|
||||
}
|
||||
|
||||
if ( ts_is_bowie_knife( str_weapon ) || ts_is_galvaknuckles( str_weapon ) )
|
||||
{
|
||||
if ( self.ts_sign_activated )
|
||||
self thread ts_sign_deactivate();
|
||||
else
|
||||
self thread ts_sign_activate();
|
||||
|
||||
ts_sign_check_all_activated( e_attacker, self );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ts_sign_activate()
|
||||
{
|
||||
self.ts_sign_activated = 1;
|
||||
while ( !isDefined( self.fx_ent ) )
|
||||
{
|
||||
v_forward = anglesToForward( self.angles );
|
||||
v_offset = vectornormalize( v_forward ) * 2;
|
||||
self.fx_ent = spawn( "script_model", ( self.origin - vectorScale( ( 0, 0, 1 ), 20 ) ) + v_offset );
|
||||
self.fx_ent.angles = anglesToForward( self.angles );
|
||||
self.fx_ent setmodel( "tag_origin" );
|
||||
self.fx_ent playsound( "zmb_sq_wisp_spawn" );
|
||||
self.fx_ent playloopsound( "zmb_sq_wisp_wall_loop" );
|
||||
while ( isDefined( self.fx_ent ) )
|
||||
{
|
||||
playfxontag( level._effect[ "sq_ether_amp_trail" ], self.fx_ent, "tag_origin" );
|
||||
wait 0,3;
|
||||
}
|
||||
}
|
||||
self.ts_sign_activated = 1;
|
||||
|
||||
if ( !isdefined( self.fx_ent ) )
|
||||
{
|
||||
v_forward = anglestoforward( self.angles );
|
||||
v_offset = vectornormalize( v_forward ) * 2;
|
||||
self.fx_ent = spawn( "script_model", self.origin - vectorscale( ( 0, 0, 1 ), 20.0 ) + v_offset );
|
||||
self.fx_ent.angles = anglestoforward( self.angles );
|
||||
self.fx_ent setmodel( "tag_origin" );
|
||||
self.fx_ent playsound( "zmb_sq_wisp_spawn" );
|
||||
self.fx_ent playloopsound( "zmb_sq_wisp_wall_loop" );
|
||||
|
||||
while ( isdefined( self.fx_ent ) )
|
||||
{
|
||||
playfxontag( level._effect["sq_ether_amp_trail"], self.fx_ent, "tag_origin" );
|
||||
wait 0.3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ts_sign_deactivate()
|
||||
{
|
||||
self.ts_sign_activated = 0;
|
||||
if ( isDefined( self.fx_ent ) )
|
||||
{
|
||||
self.fx_ent stoploopsound( 2 );
|
||||
self.fx_ent delete();
|
||||
}
|
||||
self.ts_sign_activated = 0;
|
||||
|
||||
if ( isdefined( self.fx_ent ) )
|
||||
{
|
||||
self.fx_ent stoploopsound( 2 );
|
||||
self.fx_ent delete();
|
||||
}
|
||||
}
|
||||
|
||||
ts_sign_check_all_activated( e_attacker, m_last_touched )
|
||||
{
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
a_signs_active = [];
|
||||
is_max_complete = 1;
|
||||
is_ric_complete = 1;
|
||||
_a125 = a_signs;
|
||||
_k125 = getFirstArrayKey( _a125 );
|
||||
while ( isDefined( _k125 ) )
|
||||
{
|
||||
m_sign = _a125[ _k125 ];
|
||||
if ( m_sign.ts_sign_activated )
|
||||
{
|
||||
a_signs_active[ a_signs_active.size ] = m_sign;
|
||||
if ( !is_true( m_sign.is_max_sign ) )
|
||||
{
|
||||
is_max_complete = 0;
|
||||
}
|
||||
if ( !is_true( m_sign.is_ric_sign ) )
|
||||
{
|
||||
is_ric_complete = 0;
|
||||
}
|
||||
}
|
||||
_k125 = getNextArrayKey( _a125, _k125 );
|
||||
}
|
||||
if ( a_signs_active.size == 3 )
|
||||
{
|
||||
if ( is_max_complete || is_ric_complete )
|
||||
{
|
||||
level.m_sq_start_sign = m_last_touched;
|
||||
level.e_sq_sign_attacker = e_attacker;
|
||||
level notify( "sq_sign_damaged" );
|
||||
}
|
||||
}
|
||||
a_signs = getentarray( "sq_tunnel_sign", "targetname" );
|
||||
a_signs_active = [];
|
||||
is_max_complete = 1;
|
||||
is_ric_complete = 1;
|
||||
|
||||
foreach ( m_sign in a_signs )
|
||||
{
|
||||
if ( m_sign.ts_sign_activated )
|
||||
{
|
||||
a_signs_active[a_signs_active.size] = m_sign;
|
||||
|
||||
if ( !is_true( m_sign.is_max_sign ) )
|
||||
is_max_complete = 0;
|
||||
|
||||
if ( !is_true( m_sign.is_ric_sign ) )
|
||||
is_ric_complete = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ( a_signs_active.size == 3 )
|
||||
{
|
||||
if ( is_max_complete || is_ric_complete )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if ( str_weapon != "knife_ballistic_bowie_zm" || str_weapon == "knife_ballistic_bowie_upgraded_zm" && str_weapon == "bowie_knife_zm" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( str_weapon == "knife_ballistic_bowie_zm" || str_weapon == "knife_ballistic_bowie_upgraded_zm" || str_weapon == "bowie_knife_zm" )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ts_is_galvaknuckles( str_weapon )
|
||||
{
|
||||
if ( str_weapon == "tazer_knuckles_zm" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( str_weapon == "tazer_knuckles_zm" )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1,26 +1,29 @@
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_game_module;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\gametypes_zm\_zm_gametype;
|
||||
#include maps\mp\zombies\_zm_game_module;
|
||||
#include maps\mp\zombies\_zm_magicbox;
|
||||
|
||||
precache()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
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 );
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
zm_treasure_chest_init();
|
||||
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 );
|
||||
flag_wait( "initial_blackscreen_passed" );
|
||||
zm_treasure_chest_init();
|
||||
}
|
||||
|
||||
zm_treasure_chest_init()
|
||||
{
|
||||
chest1 = getstruct( "start_chest", "script_noteworthy" );
|
||||
level.chests = [];
|
||||
level.chests[ level.chests.size ] = chest1;
|
||||
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" );
|
||||
chest1 = getstruct( "start_chest", "script_noteworthy" );
|
||||
level.chests = [];
|
||||
level.chests[level.chests.size] = chest1;
|
||||
maps\mp\zombies\_zm_magicbox::treasure_chest_init( "start_chest" );
|
||||
}
|
||||
|
@ -1,66 +1,70 @@
|
||||
//checked includes changed to match cerberus output
|
||||
#include maps/mp/gametypes_zm/zcleansed;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include character/c_zom_zombie_buried_saloongirl_mp;
|
||||
#include maps/mp/zm_buried_gamemodes;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zm_buried_gamemodes;
|
||||
#include character\c_zom_zombie_buried_saloongirl_mp;
|
||||
#include maps\mp\_visionset_mgr;
|
||||
#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( "p6_zm_bu_buildable_bench_tarp" );
|
||||
character/c_zom_zombie_buried_saloongirl_mp::precache();
|
||||
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 );
|
||||
precachemodel( "zm_collision_buried_street_turned" );
|
||||
precachemodel( "p6_zm_bu_buildable_bench_tarp" );
|
||||
character\c_zom_zombie_buried_saloongirl_mp::precache();
|
||||
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 );
|
||||
}
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
flag_init( "sloth_blocker_towneast" );
|
||||
level.custom_zombie_player_loadout = ::custom_zombie_player_loadout;
|
||||
getspawnpoints();
|
||||
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "street" );
|
||||
generatebuildabletarps();
|
||||
deletechalktriggers();
|
||||
deleteslothbarricade( "candystore_alley" );
|
||||
deleteslothbarricades( 1 );
|
||||
deletebuyabledebris( 1 );
|
||||
powerswitchstate( 1 );
|
||||
level.cleansed_loadout = getgametypesetting( "cleansedLoadout" );
|
||||
if ( level.cleansed_loadout )
|
||||
{
|
||||
level.humanify_custom_loadout = maps/mp/gametypes_zm/zcleansed::gunprogressionthink;
|
||||
level.cleansed_zombie_round = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
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" );
|
||||
flag_set( "power_on" );
|
||||
clientnotify( "pwr" );
|
||||
flag_init( "sloth_blocker_towneast" );
|
||||
level.custom_zombie_player_loadout = ::custom_zombie_player_loadout;
|
||||
getspawnpoints();
|
||||
maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "street" );
|
||||
generatebuildabletarps();
|
||||
deletechalktriggers();
|
||||
deleteslothbarricade( "candystore_alley" );
|
||||
deleteslothbarricades( 1 );
|
||||
deletebuyabledebris( 1 );
|
||||
powerswitchstate( 1 );
|
||||
level.cleansed_loadout = getgametypesetting( "cleansedLoadout" );
|
||||
|
||||
if ( level.cleansed_loadout )
|
||||
{
|
||||
level.humanify_custom_loadout = maps\mp\gametypes_zm\zcleansed::gunprogressionthink;
|
||||
level.cleansed_zombie_round = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
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" );
|
||||
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 setviewmodel( "c_zom_buried_zombie_sgirl_viewhands" );
|
||||
self character\c_zom_zombie_buried_saloongirl_mp::main();
|
||||
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_spawnpoints = getstructarray( "street_turned_zombie_spawn", "targetname" );
|
||||
level._turned_zombie_respawnpoints = getstructarray( "street_turned_player_respawns", "targetname" );
|
||||
level._turned_powerup_spawnpoints = getstructarray( "street_turned_powerups", "targetname" );
|
||||
level._turned_zombie_spawners = getentarray( "game_mode_spawners", "targetname" );
|
||||
level._turned_zombie_spawnpoints = getstructarray( "street_turned_zombie_spawn", "targetname" );
|
||||
level._turned_zombie_respawnpoints = getstructarray( "street_turned_player_respawns", "targetname" );
|
||||
level._turned_powerup_spawnpoints = getstructarray( "street_turned_powerups", "targetname" );
|
||||
}
|
||||
|
||||
onendgame() //checked matches cerberus output
|
||||
onendgame()
|
||||
{
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,333 +1,302 @@
|
||||
#include maps/mp/zombies/_zm_ai_ghost;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zm_buried;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zm_buried;
|
||||
#include maps\mp\zombies\_zm_zonemgr;
|
||||
#include maps\mp\zombies\_zm_ai_ghost;
|
||||
|
||||
ghost_init_start()
|
||||
{
|
||||
level ghost_bad_path_init();
|
||||
level.is_player_in_ghost_zone = ::is_player_in_ghost_zone;
|
||||
level ghost_bad_spawn_zone_init();
|
||||
level.ghost_round_start_monitor_time = 10;
|
||||
level ghost_bad_path_init();
|
||||
level.is_player_in_ghost_zone = ::is_player_in_ghost_zone;
|
||||
level ghost_bad_spawn_zone_init();
|
||||
level.ghost_round_start_monitor_time = 10;
|
||||
}
|
||||
|
||||
ghost_init_end()
|
||||
{
|
||||
disable_traversal_clip_around_mansion();
|
||||
disable_traversal_clip_around_mansion();
|
||||
}
|
||||
|
||||
prespawn_start()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
prespawn_end()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ghost_round_start()
|
||||
{
|
||||
level thread ghost_teleport_to_playable_area();
|
||||
level thread ghost_teleport_to_playable_area();
|
||||
}
|
||||
|
||||
ghost_round_end()
|
||||
{
|
||||
disable_traversal_clip_around_mansion();
|
||||
disable_traversal_clip_around_mansion();
|
||||
}
|
||||
|
||||
is_player_in_ghost_zone( player )
|
||||
{
|
||||
result = 0;
|
||||
if ( !isDefined( level.ghost_zone_overrides ) )
|
||||
{
|
||||
level.ghost_zone_overrides = getentarray( "ghost_round_override", "script_noteworthy" );
|
||||
}
|
||||
is_player_in_override_trigger = 0;
|
||||
while ( isDefined( level.zombie_ghost_round_states ) && !is_true( level.zombie_ghost_round_states.is_started ) )
|
||||
{
|
||||
_a86 = level.ghost_zone_overrides;
|
||||
_k86 = getFirstArrayKey( _a86 );
|
||||
while ( isDefined( _k86 ) )
|
||||
{
|
||||
trigger = _a86[ _k86 ];
|
||||
if ( player istouching( trigger ) )
|
||||
{
|
||||
is_player_in_override_trigger = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
_k86 = getNextArrayKey( _a86, _k86 );
|
||||
}
|
||||
}
|
||||
}
|
||||
curr_zone = player get_current_zone();
|
||||
if ( !is_player_in_override_trigger && isDefined( curr_zone ) && curr_zone == "zone_mansion" )
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
return result;
|
||||
result = 0;
|
||||
|
||||
if ( !isdefined( level.ghost_zone_overrides ) )
|
||||
level.ghost_zone_overrides = getentarray( "ghost_round_override", "script_noteworthy" );
|
||||
|
||||
is_player_in_override_trigger = 0;
|
||||
|
||||
if ( isdefined( level.zombie_ghost_round_states ) && !is_true( level.zombie_ghost_round_states.is_started ) )
|
||||
{
|
||||
foreach ( trigger in level.ghost_zone_overrides )
|
||||
{
|
||||
if ( player istouching( trigger ) )
|
||||
{
|
||||
is_player_in_override_trigger = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
curr_zone = player get_current_zone();
|
||||
|
||||
if ( !is_player_in_override_trigger && isdefined( curr_zone ) && curr_zone == "zone_mansion" )
|
||||
result = 1;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
ghost_bad_path_init()
|
||||
{
|
||||
level.bad_zones = [];
|
||||
level.bad_zones[ 0 ] = spawnstruct();
|
||||
level.bad_zones[ 0 ].name = "zone_underground_courthouse";
|
||||
level.bad_zones[ 0 ].adjacent = [];
|
||||
level.bad_zones[ 0 ].adjacent[ 0 ] = "zone_underground_courthouse2";
|
||||
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[ 1 ] = spawnstruct();
|
||||
level.bad_zones[ 1 ].name = "zone_underground_courthouse2";
|
||||
level.bad_zones[ 1 ].adjacent = [];
|
||||
level.bad_zones[ 1 ].adjacent[ 0 ] = "zone_underground_courthouse";
|
||||
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[ 2 ] = spawnstruct();
|
||||
level.bad_zones[ 2 ].name = "zone_tunnels_north2";
|
||||
level.bad_zones[ 2 ].adjacent = [];
|
||||
level.bad_zones[ 2 ].adjacent[ 0 ] = "zone_underground_courthouse2";
|
||||
level.bad_zones[ 2 ].adjacent[ 1 ] = "zone_underground_courthouse";
|
||||
level.bad_zones[ 2 ].flag = "tunnels2courthouse";
|
||||
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[ 3 ] = spawnstruct();
|
||||
level.bad_zones[ 3 ].name = "zone_tunnels_north";
|
||||
level.bad_zones[ 3 ].adjacent = [];
|
||||
level.bad_zones[ 3 ].adjacent[ 0 ] = "zone_tunnels_center";
|
||||
level.bad_zones[ 3 ].flag = "tunnels2courthouse";
|
||||
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[ 4 ] = spawnstruct();
|
||||
level.bad_zones[ 4 ].name = "zone_tunnels_center";
|
||||
level.bad_zones[ 4 ].adjacent = [];
|
||||
level.bad_zones[ 4 ].adjacent[ 0 ] = "zone_tunnels_north";
|
||||
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[ 5 ] = spawnstruct();
|
||||
level.bad_zones[ 5 ].name = "zone_tunnels_south";
|
||||
level.bad_zones[ 5 ].adjacent = [];
|
||||
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 = [];
|
||||
level.bad_zones[0] = spawnstruct();
|
||||
level.bad_zones[0].name = "zone_underground_courthouse";
|
||||
level.bad_zones[0].adjacent = [];
|
||||
level.bad_zones[0].adjacent[0] = "zone_underground_courthouse2";
|
||||
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[1] = spawnstruct();
|
||||
level.bad_zones[1].name = "zone_underground_courthouse2";
|
||||
level.bad_zones[1].adjacent = [];
|
||||
level.bad_zones[1].adjacent[0] = "zone_underground_courthouse";
|
||||
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[2] = spawnstruct();
|
||||
level.bad_zones[2].name = "zone_tunnels_north2";
|
||||
level.bad_zones[2].adjacent = [];
|
||||
level.bad_zones[2].adjacent[0] = "zone_underground_courthouse2";
|
||||
level.bad_zones[2].adjacent[1] = "zone_underground_courthouse";
|
||||
level.bad_zones[2].flag = "tunnels2courthouse";
|
||||
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[3] = spawnstruct();
|
||||
level.bad_zones[3].name = "zone_tunnels_north";
|
||||
level.bad_zones[3].adjacent = [];
|
||||
level.bad_zones[3].adjacent[0] = "zone_tunnels_center";
|
||||
level.bad_zones[3].flag = "tunnels2courthouse";
|
||||
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[4] = spawnstruct();
|
||||
level.bad_zones[4].name = "zone_tunnels_center";
|
||||
level.bad_zones[4].adjacent = [];
|
||||
level.bad_zones[4].adjacent[0] = "zone_tunnels_north";
|
||||
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[5] = spawnstruct();
|
||||
level.bad_zones[5].name = "zone_tunnels_south";
|
||||
level.bad_zones[5].adjacent = [];
|
||||
level.bad_zones[5].adjacent[0] = "zone_tunnels_center";
|
||||
level.bad_zones[5].ignore_func = maps\mp\zm_buried::is_tunnel_open;
|
||||
}
|
||||
|
||||
ghost_bad_path_failsafe()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "stop_bad_path_failsafe" );
|
||||
self endon( "stop_bad_path_failsafe" );
|
||||
self thread non_ghost_round_failsafe();
|
||||
while ( 1 )
|
||||
{
|
||||
player = self.favoriteenemy;
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
in_bad_zone = 0;
|
||||
_a174 = level.bad_zones;
|
||||
_k174 = getFirstArrayKey( _a174 );
|
||||
while ( isDefined( _k174 ) )
|
||||
{
|
||||
zone = _a174[ _k174 ];
|
||||
if ( isDefined( zone.ignore_func ) )
|
||||
{
|
||||
if ( level [[ zone.ignore_func ]]() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
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 ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else ghost_is_adjacent = 0;
|
||||
_a192 = zone.adjacent;
|
||||
_k192 = getFirstArrayKey( _a192 );
|
||||
while ( isDefined( _k192 ) )
|
||||
{
|
||||
adjacent = _a192[ _k192 ];
|
||||
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( adjacent ) )
|
||||
{
|
||||
ghost_is_adjacent = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
_k192 = getNextArrayKey( _a192, _k192 );
|
||||
}
|
||||
}
|
||||
if ( isDefined( zone.flag ) && flag( zone.flag ) )
|
||||
{
|
||||
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( zone.flag_adjacent ) )
|
||||
{
|
||||
ghost_is_adjacent = 1;
|
||||
}
|
||||
}
|
||||
if ( !ghost_is_adjacent )
|
||||
{
|
||||
in_bad_zone = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_k174 = getNextArrayKey( _a174, _k174 );
|
||||
}
|
||||
}
|
||||
if ( in_bad_zone )
|
||||
{
|
||||
nodes = getnodesinradiussorted( player.origin, 540, 180, 60, "Path" );
|
||||
if ( nodes.size > 0 )
|
||||
{
|
||||
node = nodes[ randomint( nodes.size ) ];
|
||||
}
|
||||
else
|
||||
{
|
||||
node = getnearestnode( player.origin );
|
||||
}
|
||||
if ( isDefined( node ) )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !is_true( self.is_traversing ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
self forceteleport( node.origin, ( 0, 0, 0 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0,25;
|
||||
}
|
||||
self endon( "death" );
|
||||
self notify( "stop_bad_path_failsafe" );
|
||||
self endon( "stop_bad_path_failsafe" );
|
||||
self thread non_ghost_round_failsafe();
|
||||
|
||||
while ( true )
|
||||
{
|
||||
player = self.favoriteenemy;
|
||||
|
||||
if ( isdefined( player ) )
|
||||
{
|
||||
in_bad_zone = 0;
|
||||
|
||||
foreach ( zone in level.bad_zones )
|
||||
{
|
||||
if ( isdefined( zone.ignore_func ) )
|
||||
{
|
||||
if ( level [[ zone.ignore_func ]]() )
|
||||
break;
|
||||
}
|
||||
|
||||
if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone.name ) )
|
||||
{
|
||||
if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone.name ) )
|
||||
break;
|
||||
|
||||
ghost_is_adjacent = 0;
|
||||
|
||||
foreach ( adjacent in zone.adjacent )
|
||||
{
|
||||
if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( adjacent ) )
|
||||
{
|
||||
ghost_is_adjacent = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( zone.flag ) && flag( zone.flag ) )
|
||||
{
|
||||
if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( zone.flag_adjacent ) )
|
||||
ghost_is_adjacent = 1;
|
||||
}
|
||||
|
||||
if ( !ghost_is_adjacent )
|
||||
{
|
||||
in_bad_zone = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( in_bad_zone )
|
||||
{
|
||||
nodes = getnodesinradiussorted( player.origin, 540, 180, 60, "Path" );
|
||||
|
||||
if ( nodes.size > 0 )
|
||||
node = nodes[randomint( nodes.size )];
|
||||
else
|
||||
node = getnearestnode( player.origin );
|
||||
|
||||
if ( isdefined( node ) )
|
||||
{
|
||||
while ( true )
|
||||
{
|
||||
if ( !is_true( self.is_traversing ) )
|
||||
break;
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
self forceteleport( node.origin, ( 0, 0, 0 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
non_ghost_round_failsafe()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "bad_path" );
|
||||
if ( self.state == "runaway_update" )
|
||||
{
|
||||
if ( !maps/mp/zombies/_zm_ai_ghost::is_ghost_round_started() && is_true( self.is_spawned_in_ghost_zone ) )
|
||||
{
|
||||
self maps/mp/zombies/_zm_ai_ghost::start_evaporate( 1 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
wait 0,25;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "bad_path" );
|
||||
|
||||
if ( self.state == "runaway_update" )
|
||||
{
|
||||
if ( !maps\mp\zombies\_zm_ai_ghost::is_ghost_round_started() && is_true( self.is_spawned_in_ghost_zone ) )
|
||||
{
|
||||
self maps\mp\zombies\_zm_ai_ghost::start_evaporate( 1 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
disable_traversal_clip_around_mansion()
|
||||
{
|
||||
while ( isDefined( level.ghost_zone_door_clips ) && level.ghost_zone_door_clips.size > 0 )
|
||||
{
|
||||
_a276 = level.ghost_zone_door_clips;
|
||||
_k276 = getFirstArrayKey( _a276 );
|
||||
while ( isDefined( _k276 ) )
|
||||
{
|
||||
door_clip = _a276[ _k276 ];
|
||||
door_clip notsolid();
|
||||
_k276 = getNextArrayKey( _a276, _k276 );
|
||||
}
|
||||
}
|
||||
if ( isdefined( level.ghost_zone_door_clips ) && level.ghost_zone_door_clips.size > 0 )
|
||||
{
|
||||
foreach ( door_clip in level.ghost_zone_door_clips )
|
||||
door_clip notsolid();
|
||||
}
|
||||
}
|
||||
|
||||
ghost_bad_spawn_zone_init()
|
||||
{
|
||||
level.ghost_bad_spawn_zones = [];
|
||||
level.ghost_bad_spawn_zones[ 0 ] = "zone_mansion_backyard";
|
||||
level.ghost_bad_spawn_zones[ 1 ] = "zone_maze";
|
||||
level.ghost_bad_spawn_zones[ 2 ] = "zone_maze_staircase";
|
||||
level.ghost_bad_spawn_zones = [];
|
||||
level.ghost_bad_spawn_zones[0] = "zone_mansion_backyard";
|
||||
level.ghost_bad_spawn_zones[1] = "zone_maze";
|
||||
level.ghost_bad_spawn_zones[2] = "zone_maze_staircase";
|
||||
}
|
||||
|
||||
can_use_mansion_back_flying_out_node( zone_name )
|
||||
{
|
||||
if ( zone_name == "zone_mansion_backyard" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( zone_name == "zone_maze" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( zone_name == "zone_maze_staircase" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( zone_name == "zone_mansion_backyard" )
|
||||
return true;
|
||||
|
||||
if ( zone_name == "zone_maze" )
|
||||
return true;
|
||||
|
||||
if ( zone_name == "zone_maze_staircase" )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ghost_teleport_to_playable_area()
|
||||
{
|
||||
level endon( "intermission" );
|
||||
if ( level.intermission )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level endon( "ghost_round_end" );
|
||||
monitor_time = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
ghosts = get_current_ghosts();
|
||||
_a332 = ghosts;
|
||||
_k332 = getFirstArrayKey( _a332 );
|
||||
while ( isDefined( _k332 ) )
|
||||
{
|
||||
ghost = _a332[ _k332 ];
|
||||
while ( !is_true( self.is_spawned_in_ghost_zone ) && !is_true( self.is_teleported_in_bad_zone ) )
|
||||
{
|
||||
_a336 = level.ghost_bad_spawn_zones;
|
||||
_k336 = getFirstArrayKey( _a336 );
|
||||
while ( isDefined( _k336 ) )
|
||||
{
|
||||
bad_spawn_zone_name = _a336[ _k336 ];
|
||||
if ( ghost maps/mp/zombies/_zm_zonemgr::entity_in_zone( bad_spawn_zone_name ) )
|
||||
{
|
||||
if ( is_player_valid( ghost.favoriteenemy ) )
|
||||
{
|
||||
destination_node = ghost maps/mp/zombies/_zm_ai_ghost::get_best_flying_target_node( ghost.favoriteenemy );
|
||||
if ( isDefined( destination_node ) )
|
||||
{
|
||||
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 ( 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 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
ghost forceteleport( level.ghost_front_flying_out_path_starts[ 0 ].origin, ( 0, 0, 0 ) );
|
||||
}
|
||||
self.is_teleported_in_bad_zone = 1;
|
||||
}
|
||||
}
|
||||
_k336 = getNextArrayKey( _a336, _k336 );
|
||||
}
|
||||
}
|
||||
_k332 = getNextArrayKey( _a332, _k332 );
|
||||
}
|
||||
monitor_time += 0,1;
|
||||
if ( monitor_time > level.ghost_round_start_monitor_time )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
level endon( "intermission" );
|
||||
|
||||
if ( level.intermission )
|
||||
return;
|
||||
|
||||
level endon( "ghost_round_end" );
|
||||
monitor_time = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
ghosts = get_current_ghosts();
|
||||
|
||||
foreach ( ghost in ghosts )
|
||||
{
|
||||
if ( !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 )
|
||||
{
|
||||
if ( ghost maps\mp\zombies\_zm_zonemgr::entity_in_zone( bad_spawn_zone_name ) )
|
||||
{
|
||||
if ( is_player_valid( ghost.favoriteenemy ) )
|
||||
{
|
||||
destination_node = ghost maps\mp\zombies\_zm_ai_ghost::get_best_flying_target_node( ghost.favoriteenemy );
|
||||
|
||||
if ( isdefined( destination_node ) )
|
||||
{
|
||||
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 ( 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 ) );
|
||||
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;
|
||||
|
||||
if ( monitor_time > level.ghost_round_start_monitor_time )
|
||||
break;
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,434 +1,422 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_run;
|
||||
#include maps/mp/zombies/_zm_ai_sloth;
|
||||
#include maps/mp/zombies/_zm_ai_sloth_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_ai_sloth_utility;
|
||||
#include maps\mp\zombies\_zm_ai_sloth;
|
||||
#include maps\mp\animscripts\zm_run;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
|
||||
crawler_condition()
|
||||
{
|
||||
zombies = get_round_enemy_array();
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
zombie = zombies[ i ];
|
||||
if ( !is_true( zombie.has_legs ) )
|
||||
{
|
||||
dist = distancesquared( self.origin, zombie.origin );
|
||||
if ( dist < 32400 )
|
||||
{
|
||||
self.crawler = zombie;
|
||||
if ( isDefined( level.sloth.custom_crawler_pickup_func ) )
|
||||
{
|
||||
self.crawler thread [[ level.sloth.custom_crawler_pickup_func ]]();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
zombies = get_round_enemy_array();
|
||||
|
||||
for ( i = 0; i < zombies.size; i++ )
|
||||
{
|
||||
zombie = zombies[i];
|
||||
|
||||
if ( !is_true( zombie.has_legs ) )
|
||||
{
|
||||
dist = distancesquared( self.origin, zombie.origin );
|
||||
|
||||
if ( dist < 32400 )
|
||||
{
|
||||
self.crawler = zombie;
|
||||
|
||||
if ( isdefined( level.sloth.custom_crawler_pickup_func ) )
|
||||
self.crawler thread [[ level.sloth.custom_crawler_pickup_func ]]();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
crawler_action()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps/mp/zombies/_zm_ai_sloth::common_context_action();
|
||||
self thread watch_sloth_on_exit_side();
|
||||
self thread watch_sloth_on_same_side();
|
||||
self thread crawler_watch_death();
|
||||
self.release_crawler = 0;
|
||||
anim_id = self getanimfromasd( "zm_sloth_pickup_crawler", 0 );
|
||||
sloth_goal = getstartorigin( self.crawler.origin, self.crawler.angles, anim_id );
|
||||
sloth_offset = distance( sloth_goal, self.crawler.origin );
|
||||
while ( 1 )
|
||||
{
|
||||
while ( self sloth_is_traversing() )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
vec_forward = vectornormalize( anglesToForward( self.crawler.angles ) );
|
||||
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 );
|
||||
height_check = abs( self.crawler.origin[ 2 ] - ground_pos[ 2 ] );
|
||||
if ( height_check > 8 )
|
||||
{
|
||||
self setanimstatefromasd( "zm_player_idle" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/animscripts/zm_run::needsupdate();
|
||||
self setgoalpos( start_pos );
|
||||
}
|
||||
if ( !isDefined( self.crawler ) || self.crawler.health <= 0 )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return;
|
||||
}
|
||||
dist = distancesquared( self.origin, start_pos );
|
||||
z_dist = abs( self.origin[ 2 ] - start_pos[ 2 ] );
|
||||
if ( dist < 1024 && z_dist < 12 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
self orientmode( "face angle", self.crawler.angles[ 1 ] );
|
||||
wait 0,25;
|
||||
self.crawler.is_inert = 1;
|
||||
self.crawler.ignoreall = 1;
|
||||
self.crawler notify( "stop_find_flesh" );
|
||||
self.crawler notify( "zombie_acquire_enemy" );
|
||||
self.anchor.origin = self.crawler.origin;
|
||||
self.anchor.angles = self.crawler.angles;
|
||||
sloth_pickup = self append_hunched( "zm_sloth_pickup_crawler" );
|
||||
crawler_pickup = self append_hunched( "zm_crawler_pickup_by_sloth" );
|
||||
self animscripted( self.anchor.origin, self.anchor.angles, sloth_pickup );
|
||||
self.crawler animscripted( self.anchor.origin, self.anchor.angles, crawler_pickup );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "sloth_pickup_crawler_anim" );
|
||||
self.carrying_crawler = 1;
|
||||
self.crawler.guts_explosion = 1;
|
||||
self.pre_traverse = ::crawler_pre_traverse;
|
||||
self.post_traverse = ::crawler_post_traverse;
|
||||
self.crawler notsolid();
|
||||
self.crawler linkto( self, "tag_weapon_right" );
|
||||
self.ignore_common_run = 1;
|
||||
self set_zombie_run_cycle( "walk_crawlerhold" );
|
||||
self.locomotion = "walk_crawlerhold";
|
||||
self.setanimstatefromspeed = ::slothanimstatefromspeed;
|
||||
self.crawler_end = getTime() + 5000;
|
||||
self.crawler.actor_damage_func = ::crawler_damage_func;
|
||||
self.sloth_damage_func = ::crawler_damage_func;
|
||||
roam = array_randomize( level.roam_points );
|
||||
roam_index = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( is_true( self.release_crawler ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( self sloth_is_traversing() )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
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 ) )
|
||||
{
|
||||
self.check_turn = 1;
|
||||
self setgoalpos( self.origin );
|
||||
sloth_idle = self append_hunched( "zm_sloth_crawlerhold_idle" );
|
||||
crawler_idle = self append_hunched( "zm_crawler_crawlerhold_idle" );
|
||||
self animscripted( self.origin, self.angles, sloth_idle );
|
||||
self.crawler animscripted( self.origin, self.angles, crawler_idle );
|
||||
}
|
||||
else
|
||||
{
|
||||
self stopanimscripted();
|
||||
self.crawler stopanimscripted();
|
||||
if ( should_ignore_candybooze( self.candy_player ) )
|
||||
{
|
||||
dist = distancesquared( self.origin, roam[ roam_index ].origin );
|
||||
if ( dist < 1024 )
|
||||
{
|
||||
roam_index++;
|
||||
if ( roam_index >= roam.size )
|
||||
{
|
||||
roam_index = 0;
|
||||
}
|
||||
}
|
||||
self maps/mp/zombies/_zm_ai_sloth::sloth_check_turn( roam[ roam_index ].origin );
|
||||
self setgoalpos( roam[ roam_index ].origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !self sloth_move_to_same_side() )
|
||||
{
|
||||
if ( is_true( self.check_turn ) )
|
||||
{
|
||||
self.check_turn = 0;
|
||||
if ( self sloth_is_same_zone( self.candy_player ) )
|
||||
{
|
||||
self maps/mp/zombies/_zm_ai_sloth::sloth_check_turn( self.candy_player.origin, -0,965 );
|
||||
}
|
||||
}
|
||||
self setgoalpos( self.candy_player.origin );
|
||||
}
|
||||
}
|
||||
self crawler_update_locomotion();
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
self.setanimstatefromspeed = undefined;
|
||||
self.crawler unlink();
|
||||
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.crawler animscripted( self.origin, self.angles, crawler_putdown );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "sloth_putdown_crawler_anim" );
|
||||
self.carrying_crawler = 0;
|
||||
self.crawler.deathfunction = ::crawler_death;
|
||||
sloth_kill = self append_hunched( "zm_sloth_kill_crawler_stomp" );
|
||||
crawler_kill = self append_hunched( "zm_crawler_slothkill_stomp" );
|
||||
self notify( "stop_crawler_watch" );
|
||||
self animscripted( self.origin, self.angles, sloth_kill );
|
||||
self.crawler animscripted( self.origin, self.angles, crawler_kill );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "sloth_kill_crawler_anim" );
|
||||
if ( isDefined( self.crawler ) )
|
||||
{
|
||||
self.crawler dodamage( self.crawler.health * 10, self.crawler.origin );
|
||||
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;
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps\mp\zombies\_zm_ai_sloth::common_context_action();
|
||||
self thread watch_sloth_on_exit_side();
|
||||
self thread watch_sloth_on_same_side();
|
||||
self thread crawler_watch_death();
|
||||
self.release_crawler = 0;
|
||||
anim_id = self getanimfromasd( "zm_sloth_pickup_crawler", 0 );
|
||||
sloth_goal = getstartorigin( self.crawler.origin, self.crawler.angles, anim_id );
|
||||
sloth_offset = distance( sloth_goal, self.crawler.origin );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( self sloth_is_traversing() )
|
||||
{
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
|
||||
vec_forward = vectornormalize( anglestoforward( self.crawler.angles ) );
|
||||
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 );
|
||||
height_check = abs( self.crawler.origin[2] - ground_pos[2] );
|
||||
|
||||
if ( height_check > 8 )
|
||||
self setanimstatefromasd( "zm_player_idle" );
|
||||
else
|
||||
{
|
||||
self maps\mp\animscripts\zm_run::needsupdate();
|
||||
self setgoalpos( start_pos );
|
||||
}
|
||||
|
||||
if ( !isdefined( self.crawler ) || self.crawler.health <= 0 )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
dist = distancesquared( self.origin, start_pos );
|
||||
z_dist = abs( self.origin[2] - start_pos[2] );
|
||||
|
||||
if ( dist < 1024 && z_dist < 12 )
|
||||
break;
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
self orientmode( "face angle", self.crawler.angles[1] );
|
||||
wait 0.25;
|
||||
self.crawler.is_inert = 1;
|
||||
self.crawler.ignoreall = 1;
|
||||
self.crawler notify( "stop_find_flesh" );
|
||||
self.crawler notify( "zombie_acquire_enemy" );
|
||||
self.anchor.origin = self.crawler.origin;
|
||||
self.anchor.angles = self.crawler.angles;
|
||||
sloth_pickup = self append_hunched( "zm_sloth_pickup_crawler" );
|
||||
crawler_pickup = self append_hunched( "zm_crawler_pickup_by_sloth" );
|
||||
self animscripted( self.anchor.origin, self.anchor.angles, sloth_pickup );
|
||||
self.crawler animscripted( self.anchor.origin, self.anchor.angles, crawler_pickup );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "sloth_pickup_crawler_anim" );
|
||||
self.carrying_crawler = 1;
|
||||
self.crawler.guts_explosion = 1;
|
||||
self.pre_traverse = ::crawler_pre_traverse;
|
||||
self.post_traverse = ::crawler_post_traverse;
|
||||
self.crawler notsolid();
|
||||
self.crawler linkto( self, "tag_weapon_right" );
|
||||
self.ignore_common_run = 1;
|
||||
self set_zombie_run_cycle( "walk_crawlerhold" );
|
||||
self.locomotion = "walk_crawlerhold";
|
||||
self.setanimstatefromspeed = ::slothanimstatefromspeed;
|
||||
self.crawler_end = gettime() + 5000;
|
||||
self.crawler.actor_damage_func = ::crawler_damage_func;
|
||||
self.sloth_damage_func = ::crawler_damage_func;
|
||||
roam = array_randomize( level.roam_points );
|
||||
roam_index = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( is_true( self.release_crawler ) )
|
||||
break;
|
||||
|
||||
if ( self sloth_is_traversing() )
|
||||
{
|
||||
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 ) )
|
||||
{
|
||||
self.check_turn = 1;
|
||||
self setgoalpos( self.origin );
|
||||
sloth_idle = self append_hunched( "zm_sloth_crawlerhold_idle" );
|
||||
crawler_idle = self append_hunched( "zm_crawler_crawlerhold_idle" );
|
||||
self animscripted( self.origin, self.angles, sloth_idle );
|
||||
self.crawler animscripted( self.origin, self.angles, crawler_idle );
|
||||
}
|
||||
else
|
||||
{
|
||||
self stopanimscripted();
|
||||
self.crawler stopanimscripted();
|
||||
|
||||
if ( should_ignore_candybooze( self.candy_player ) )
|
||||
{
|
||||
dist = distancesquared( self.origin, roam[roam_index].origin );
|
||||
|
||||
if ( dist < 1024 )
|
||||
{
|
||||
roam_index++;
|
||||
|
||||
if ( roam_index >= roam.size )
|
||||
roam_index = 0;
|
||||
}
|
||||
|
||||
self maps\mp\zombies\_zm_ai_sloth::sloth_check_turn( roam[roam_index].origin );
|
||||
self setgoalpos( roam[roam_index].origin );
|
||||
}
|
||||
else if ( !self sloth_move_to_same_side() )
|
||||
{
|
||||
if ( is_true( self.check_turn ) )
|
||||
{
|
||||
self.check_turn = 0;
|
||||
|
||||
if ( self sloth_is_same_zone( self.candy_player ) )
|
||||
self maps\mp\zombies\_zm_ai_sloth::sloth_check_turn( self.candy_player.origin, -0.965 );
|
||||
}
|
||||
|
||||
self setgoalpos( self.candy_player.origin );
|
||||
}
|
||||
|
||||
self crawler_update_locomotion();
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
self.setanimstatefromspeed = undefined;
|
||||
self.crawler unlink();
|
||||
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.crawler animscripted( self.origin, self.angles, crawler_putdown );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "sloth_putdown_crawler_anim" );
|
||||
self.carrying_crawler = 0;
|
||||
self.crawler.deathfunction = ::crawler_death;
|
||||
sloth_kill = self append_hunched( "zm_sloth_kill_crawler_stomp" );
|
||||
crawler_kill = self append_hunched( "zm_crawler_slothkill_stomp" );
|
||||
self notify( "stop_crawler_watch" );
|
||||
self animscripted( self.origin, self.angles, sloth_kill );
|
||||
self.crawler animscripted( self.origin, self.angles, crawler_kill );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "sloth_kill_crawler_anim" );
|
||||
|
||||
if ( isdefined( self.crawler ) )
|
||||
{
|
||||
self.crawler dodamage( self.crawler.health * 10, self.crawler.origin );
|
||||
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()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( is_true( self.context_done ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.on_exit_side = 0;
|
||||
player = self.candy_player;
|
||||
if ( isDefined( player ) && is_true( player.is_in_ghost_zone ) )
|
||||
{
|
||||
name = player.current_ghost_room_name;
|
||||
if ( isDefined( name ) )
|
||||
{
|
||||
room = level.ghost_rooms[ name ];
|
||||
if ( is_true( room.to_maze ) )
|
||||
{
|
||||
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
|
||||
{
|
||||
self.on_exit_side = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_true( room.from_maze ) )
|
||||
{
|
||||
if ( !self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
|
||||
{
|
||||
self.on_exit_side = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0,25;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( is_true( self.context_done ) )
|
||||
return;
|
||||
|
||||
self.on_exit_side = 0;
|
||||
player = self.candy_player;
|
||||
|
||||
if ( isdefined( player ) && is_true( player.is_in_ghost_zone ) )
|
||||
{
|
||||
name = player.current_ghost_room_name;
|
||||
|
||||
if ( isdefined( name ) )
|
||||
{
|
||||
room = level.ghost_rooms[name];
|
||||
|
||||
if ( is_true( room.to_maze ) )
|
||||
{
|
||||
if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
|
||||
self.on_exit_side = 1;
|
||||
}
|
||||
else if ( is_true( room.from_maze ) )
|
||||
{
|
||||
if ( !self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
|
||||
self.on_exit_side = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
watch_sloth_on_same_side()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( is_true( self.context_done ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.on_same_side = 0;
|
||||
player = self.candy_player;
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
|
||||
{
|
||||
if ( player maps/mp/zombies/_zm_ai_sloth::behind_mansion_zone() )
|
||||
{
|
||||
self.on_same_side = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !player maps/mp/zombies/_zm_ai_sloth::behind_mansion_zone() )
|
||||
{
|
||||
self.on_same_side = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0,25;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( is_true( self.context_done ) )
|
||||
return;
|
||||
|
||||
self.on_same_side = 0;
|
||||
player = self.candy_player;
|
||||
|
||||
if ( isdefined( player ) )
|
||||
{
|
||||
if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
|
||||
{
|
||||
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() )
|
||||
self.on_same_side = 1;
|
||||
}
|
||||
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
sloth_move_to_same_side()
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.teleport_time ) )
|
||||
{
|
||||
if ( ( getTime() - self.teleport_time ) < 1000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
player = self.candy_player;
|
||||
if ( is_true( player.is_in_ghost_zone ) )
|
||||
{
|
||||
if ( is_true( self.on_exit_side ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_true( self.on_same_side ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
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 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
|
||||
}
|
||||
return 1;
|
||||
self endon( "death" );
|
||||
|
||||
if ( isdefined( self.teleport_time ) )
|
||||
{
|
||||
if ( gettime() - self.teleport_time < 1000 )
|
||||
return false;
|
||||
}
|
||||
|
||||
player = self.candy_player;
|
||||
|
||||
if ( is_true( player.is_in_ghost_zone ) )
|
||||
{
|
||||
if ( is_true( self.on_exit_side ) )
|
||||
return false;
|
||||
}
|
||||
else if ( is_true( self.on_same_side ) )
|
||||
return false;
|
||||
|
||||
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 );
|
||||
else
|
||||
self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sloth_is_same_zone( player )
|
||||
{
|
||||
zone_sloth = self get_current_zone();
|
||||
zone_player = player get_current_zone();
|
||||
if ( !isDefined( zone_sloth ) || !isDefined( zone_player ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( zone_sloth == zone_player )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
zone_sloth = self get_current_zone();
|
||||
zone_player = player get_current_zone();
|
||||
|
||||
if ( !isdefined( zone_sloth ) || !isdefined( zone_player ) )
|
||||
return false;
|
||||
|
||||
if ( zone_sloth == zone_player )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
append_hunched( asd_name )
|
||||
{
|
||||
if ( self.is_inside )
|
||||
{
|
||||
return asd_name + "_hunched";
|
||||
}
|
||||
return asd_name;
|
||||
if ( self.is_inside )
|
||||
return asd_name + "_hunched";
|
||||
|
||||
return asd_name;
|
||||
}
|
||||
|
||||
crawler_update_locomotion()
|
||||
{
|
||||
if ( self.zombie_move_speed == "walk_crawlerhold" )
|
||||
{
|
||||
if ( self.is_inside )
|
||||
{
|
||||
self set_zombie_run_cycle( "walk_crawlerhold_hunched" );
|
||||
self.locomotion = "walk_crawlerhold_hunched";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.zombie_move_speed == "walk_crawlerhold_hunched" )
|
||||
{
|
||||
if ( !self.is_inside )
|
||||
{
|
||||
self set_zombie_run_cycle( "walk_crawlerhold" );
|
||||
self.locomotion = "walk_crawlerhold";
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( self.zombie_move_speed == "walk_crawlerhold" )
|
||||
{
|
||||
if ( self.is_inside )
|
||||
{
|
||||
self set_zombie_run_cycle( "walk_crawlerhold_hunched" );
|
||||
self.locomotion = "walk_crawlerhold_hunched";
|
||||
}
|
||||
}
|
||||
else if ( self.zombie_move_speed == "walk_crawlerhold_hunched" )
|
||||
{
|
||||
if ( !self.is_inside )
|
||||
{
|
||||
self set_zombie_run_cycle( "walk_crawlerhold" );
|
||||
self.locomotion = "walk_crawlerhold";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
crawler_watch_death()
|
||||
{
|
||||
self endon( "stop_crawler_watch" );
|
||||
self.crawler waittill( "death" );
|
||||
self stop_action();
|
||||
self endon( "stop_crawler_watch" );
|
||||
|
||||
self.crawler waittill( "death" );
|
||||
|
||||
self stop_action();
|
||||
/#
|
||||
sloth_print( "crawler died" );
|
||||
sloth_print( "crawler died" );
|
||||
#/
|
||||
if ( isDefined( self.crawler ) )
|
||||
{
|
||||
self.crawler unlink();
|
||||
}
|
||||
self.setanimstatefromspeed = undefined;
|
||||
self.sloth_damage_func = undefined;
|
||||
self maps/mp/zombies/_zm_ai_sloth::sloth_set_traverse_funcs();
|
||||
self.crawler = undefined;
|
||||
self.context_done = 1;
|
||||
if ( isdefined( self.crawler ) )
|
||||
self.crawler unlink();
|
||||
|
||||
self.setanimstatefromspeed = undefined;
|
||||
self.sloth_damage_func = undefined;
|
||||
self maps\mp\zombies\_zm_ai_sloth::sloth_set_traverse_funcs();
|
||||
self.crawler = undefined;
|
||||
self.context_done = 1;
|
||||
}
|
||||
|
||||
crawler_pre_traverse()
|
||||
{
|
||||
sloth_sling = self append_hunched( "zm_sloth_crawlerhold_sling" );
|
||||
crawler_sling = self append_hunched( "zm_crawler_sloth_crawlerhold_sling" );
|
||||
self setanimstatefromasd( sloth_sling );
|
||||
self.crawler setanimstatefromasd( crawler_sling );
|
||||
self maps/mp/animscripts/zm_shared::donotetracks( "sloth_crawlerhold_sling_anim" );
|
||||
self.crawler thread crawler_traverse_idle();
|
||||
sloth_sling = self append_hunched( "zm_sloth_crawlerhold_sling" );
|
||||
crawler_sling = self append_hunched( "zm_crawler_sloth_crawlerhold_sling" );
|
||||
self setanimstatefromasd( sloth_sling );
|
||||
self.crawler setanimstatefromasd( crawler_sling );
|
||||
self maps\mp\animscripts\zm_shared::donotetracks( "sloth_crawlerhold_sling_anim" );
|
||||
self.crawler thread crawler_traverse_idle();
|
||||
}
|
||||
|
||||
crawler_traverse_idle()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_traverse_idle" );
|
||||
while ( 1 )
|
||||
{
|
||||
self setanimstatefromasd( "zm_crawler_sloth_crawlerhold_slung_idle" );
|
||||
wait 0,1;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "stop_traverse_idle" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self setanimstatefromasd( "zm_crawler_sloth_crawlerhold_slung_idle" );
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
crawler_post_traverse()
|
||||
{
|
||||
self.crawler notify( "stop_traverse_idle" );
|
||||
sloth_unsling = self append_hunched( "zm_sloth_crawlerhold_unsling" );
|
||||
crawler_unsling = self append_hunched( "zm_crawler_sloth_crawlerhold_unsling" );
|
||||
self setanimstatefromasd( sloth_unsling );
|
||||
self.crawler setanimstatefromasd( crawler_unsling );
|
||||
self maps/mp/animscripts/zm_shared::donotetracks( "sloth_crawlerhold_unsling_anim" );
|
||||
self.crawler notify( "stop_traverse_idle" );
|
||||
sloth_unsling = self append_hunched( "zm_sloth_crawlerhold_unsling" );
|
||||
crawler_unsling = self append_hunched( "zm_crawler_sloth_crawlerhold_unsling" );
|
||||
self setanimstatefromasd( sloth_unsling );
|
||||
self.crawler setanimstatefromasd( crawler_unsling );
|
||||
self maps\mp\animscripts\zm_shared::donotetracks( "sloth_crawlerhold_unsling_anim" );
|
||||
}
|
||||
|
||||
crawler_death()
|
||||
{
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
crawler_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex )
|
||||
{
|
||||
level.sloth.release_crawler = 1;
|
||||
return 0;
|
||||
level.sloth.release_crawler = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
is_crawler_alive()
|
||||
{
|
||||
if ( isDefined( self.crawler ) && self.crawler.health > 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( isdefined( self.crawler ) && self.crawler.health > 0 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
slothanimstatefromspeed( animstate, substate )
|
||||
{
|
||||
if ( isDefined( self.crawler ) )
|
||||
{
|
||||
crawler_walk = "zm_crawler_crawlerhold_walk";
|
||||
if ( self.is_inside )
|
||||
{
|
||||
crawler_walk += "_hunched";
|
||||
}
|
||||
self.crawler setanimstatefromasd( crawler_walk );
|
||||
}
|
||||
if ( isdefined( self.crawler ) )
|
||||
{
|
||||
crawler_walk = "zm_crawler_crawlerhold_walk";
|
||||
|
||||
if ( self.is_inside )
|
||||
crawler_walk += "_hunched";
|
||||
|
||||
self.crawler setanimstatefromasd( crawler_walk );
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,17 @@
|
||||
#include maps/mp/zombies/_zm_ai_sloth_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_ai_sloth_utility;
|
||||
|
||||
sloth_ffotd_init()
|
||||
{
|
||||
level.double_wide_override = undefined;
|
||||
level.interior_override = undefined;
|
||||
level.double_wide_override = undefined;
|
||||
level.interior_override = undefined;
|
||||
}
|
||||
|
||||
sloth_ffotd_prespawn()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,519 +1,498 @@
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_hackables_box;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zm_buried;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/zombies/_zm_ai_sloth;
|
||||
#include maps/mp/zombies/_zm_ai_sloth_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_ai_sloth_utility;
|
||||
#include maps\mp\zombies\_zm_ai_sloth;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps\mp\zm_buried;
|
||||
#include maps\mp\zombies\_zm_magicbox;
|
||||
#include maps\mp\zombies\_zm_hackables_box;
|
||||
#include maps\mp\zombies\_zm_unitrigger;
|
||||
|
||||
box_lock_condition()
|
||||
{
|
||||
box = level.chests[ level.chest_index ];
|
||||
if ( !isDefined( box ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
box = level.chests[level.chest_index];
|
||||
|
||||
if ( !isdefined( box ) )
|
||||
return false;
|
||||
/#
|
||||
self sloth_debug_context( box, sqrt( 32400 ) );
|
||||
self sloth_debug_context( box, sqrt( 32400 ) );
|
||||
#/
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
dist = distancesquared( self.origin, box.origin );
|
||||
if ( dist < 32400 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
return false;
|
||||
|
||||
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
|
||||
return false;
|
||||
|
||||
dist = distancesquared( self.origin, box.origin );
|
||||
|
||||
if ( dist < 32400 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
box_get_ground_offset()
|
||||
{
|
||||
vec_right = vectornormalize( anglesToRight( self.angles ) );
|
||||
box_pos = self.origin - ( vec_right * 36 );
|
||||
ground_pos = groundpos( box_pos );
|
||||
return ground_pos;
|
||||
vec_right = vectornormalize( anglestoright( self.angles ) );
|
||||
box_pos = self.origin - vec_right * 36;
|
||||
ground_pos = groundpos( box_pos );
|
||||
return ground_pos;
|
||||
}
|
||||
|
||||
common_abort_box( box )
|
||||
{
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( box ) )
|
||||
{
|
||||
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
|
||||
{
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( isdefined( box ) )
|
||||
{
|
||||
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;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
self.context_done = 1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
common_move_to_maze( box )
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self common_abort_box( box ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
|
||||
wait 0,2;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( self common_abort_box( box ) )
|
||||
return false;
|
||||
|
||||
if ( self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
|
||||
break;
|
||||
|
||||
self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
common_move_to_courtyard( box )
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self common_abort_box( box ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
|
||||
wait 0,2;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( self common_abort_box( box ) )
|
||||
return false;
|
||||
|
||||
if ( !self maps\mp\zombies\_zm_ai_sloth::sloth_behind_mansion() )
|
||||
break;
|
||||
|
||||
self maps\mp\zombies\_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
common_move_to_box( box, range, ignore_open, asd_name )
|
||||
{
|
||||
if ( isDefined( asd_name ) )
|
||||
{
|
||||
anim_id = self getanimfromasd( asd_name, 0 );
|
||||
start_org = getstartorigin( box.origin, box.angles, anim_id );
|
||||
start_ang = getstartangles( box.origin, box.angles, anim_id );
|
||||
self setgoalpos( start_org );
|
||||
ground_pos = start_org;
|
||||
}
|
||||
else
|
||||
{
|
||||
vec_right = vectornormalize( anglesToRight( box.angles ) );
|
||||
box_pos = box.origin - ( vec_right * 36 );
|
||||
ground_pos = groundpos( box_pos );
|
||||
self setgoalpos( ground_pos );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return 0;
|
||||
}
|
||||
if ( !is_true( ignore_open ) || is_true( box._box_open ) && is_true( box._box_opened_by_fire_sale ) )
|
||||
{
|
||||
if ( isdefined( asd_name ) )
|
||||
{
|
||||
anim_id = self getanimfromasd( asd_name, 0 );
|
||||
start_org = getstartorigin( box.origin, box.angles, anim_id );
|
||||
start_ang = getstartangles( box.origin, box.angles, anim_id );
|
||||
self setgoalpos( start_org );
|
||||
ground_pos = start_org;
|
||||
}
|
||||
else
|
||||
{
|
||||
vec_right = vectornormalize( anglestoright( box.angles ) );
|
||||
box_pos = box.origin - vec_right * 36;
|
||||
ground_pos = groundpos( box_pos );
|
||||
self setgoalpos( ground_pos );
|
||||
}
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
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;
|
||||
return 0;
|
||||
}
|
||||
dist = distancesquared( self.origin, ground_pos );
|
||||
if ( dist < range )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
if ( isDefined( asd_name ) )
|
||||
{
|
||||
self setgoalpos( self.origin );
|
||||
self sloth_face_object( box, "angle", start_ang[ 1 ], 0,9 );
|
||||
}
|
||||
else
|
||||
{
|
||||
angles = vectorToAngle( vec_right );
|
||||
self.anchor.origin = self.origin;
|
||||
self.anchor.angles = angles;
|
||||
self orientmode( "face angle", angles[ 1 ] );
|
||||
wait 0,2;
|
||||
}
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
self.context_done = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
dist = distancesquared( self.origin, ground_pos );
|
||||
|
||||
if ( dist < range )
|
||||
break;
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
|
||||
if ( isdefined( asd_name ) )
|
||||
{
|
||||
self setgoalpos( self.origin );
|
||||
self sloth_face_object( box, "angle", start_ang[1], 0.9 );
|
||||
}
|
||||
else
|
||||
{
|
||||
angles = vectortoangles( vec_right );
|
||||
self.anchor.origin = self.origin;
|
||||
self.anchor.angles = angles;
|
||||
self orientmode( "face angle", angles[1] );
|
||||
wait 0.2;
|
||||
}
|
||||
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
box_lock_action()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps/mp/zombies/_zm_ai_sloth::common_context_action();
|
||||
box = level.chests[ level.chest_index ];
|
||||
if ( !self common_move_to_box( box, 1024 ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self animscripted( box.origin, box.angles, "zm_lock_magicbox" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "lock_magicbox_anim", ::box_notetracks, box );
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return;
|
||||
}
|
||||
setdvar( "magic_chest_movable", "0" );
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps\mp\zombies\_zm_ai_sloth::common_context_action();
|
||||
box = level.chests[level.chest_index];
|
||||
|
||||
if ( !self common_move_to_box( box, 1024 ) )
|
||||
return;
|
||||
|
||||
self animscripted( box.origin, box.angles, "zm_lock_magicbox" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "lock_magicbox_anim", ::box_notetracks, box );
|
||||
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
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_move" );
|
||||
self.context_done = 1;
|
||||
maps\mp\zombies\_zm_ai_sloth::unregister_candy_context( "box_lock" );
|
||||
maps\mp\zombies\_zm_ai_sloth::unregister_candy_context( "box_move" );
|
||||
self.context_done = 1;
|
||||
}
|
||||
|
||||
box_move_condition()
|
||||
{
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.box_move = undefined;
|
||||
self.box_current = undefined;
|
||||
self.box_current_in_maze = 0;
|
||||
box_current = level.chests[ level.chest_index ];
|
||||
if ( is_true( box_current._box_open ) || is_true( box_current._box_opened_by_fire_sale ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( box_current.script_noteworthy == "courtroom_chest1" )
|
||||
{
|
||||
if ( !maps/mp/zm_buried::is_courthouse_open() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( box_current.script_noteworthy == "tunnels_chest1" )
|
||||
{
|
||||
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 ( !is_maze_open() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.chests.size )
|
||||
{
|
||||
if ( i == level.chest_index )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
box = level.chests[ i ];
|
||||
if ( box.script_noteworthy != "maze_chest1" )
|
||||
{
|
||||
self.box_move_in_maze = box.script_noteworthy == "maze_chest2";
|
||||
}
|
||||
dist = distancesquared( self.origin, box.origin );
|
||||
if ( dist < 32400 )
|
||||
{
|
||||
self.box_move_index = i;
|
||||
self.box_move = box;
|
||||
self.box_current = box_current;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
return false;
|
||||
|
||||
self.box_move = undefined;
|
||||
self.box_current = undefined;
|
||||
self.box_current_in_maze = 0;
|
||||
box_current = level.chests[level.chest_index];
|
||||
|
||||
if ( is_true( box_current._box_open ) || is_true( box_current._box_opened_by_fire_sale ) )
|
||||
return false;
|
||||
|
||||
if ( box_current.script_noteworthy == "courtroom_chest1" )
|
||||
{
|
||||
if ( !maps\mp\zm_buried::is_courthouse_open() )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( box_current.script_noteworthy == "tunnels_chest1" )
|
||||
{
|
||||
if ( !maps\mp\zm_buried::is_tunnel_open() )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( box_current.script_noteworthy == "maze_chest1" || box_current.script_noteworthy == "maze_chest2" )
|
||||
{
|
||||
self.box_current_in_maze = 1;
|
||||
|
||||
if ( !is_maze_open() )
|
||||
return false;
|
||||
}
|
||||
|
||||
for ( i = 0; i < level.chests.size; i++ )
|
||||
{
|
||||
if ( i == level.chest_index )
|
||||
continue;
|
||||
|
||||
box = level.chests[i];
|
||||
self.box_move_in_maze = box.script_noteworthy == "maze_chest1" || box.script_noteworthy == "maze_chest2";
|
||||
dist = distancesquared( self.origin, box.origin );
|
||||
|
||||
if ( dist < 32400 )
|
||||
{
|
||||
self.box_move_index = i;
|
||||
self.box_move = box;
|
||||
self.box_current = box_current;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
box_move_action()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps/mp/zombies/_zm_ai_sloth::common_context_action();
|
||||
self endon( "death" );
|
||||
self endon( "stop_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" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
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_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_maze( self.box_current ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_true( self.box_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_courtyard( self.box_current ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !self common_move_to_box( self.box_current, 1024, 0, "zm_pull_magicbox" ) )
|
||||
{
|
||||
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 ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
if ( isDefined( level.sloth.custom_box_move_func ) )
|
||||
{
|
||||
self thread [[ level.sloth.custom_box_move_func ]]( 0 );
|
||||
}
|
||||
level.sloth_moving_box = 1;
|
||||
self.ignore_common_run = 1;
|
||||
self set_zombie_run_cycle( "run_holding_magicbox" );
|
||||
self.locomotion = "run_holding_magicbox";
|
||||
if ( is_true( self.box_current_in_maze ) )
|
||||
{
|
||||
if ( !is_true( self.box_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_courtyard( undefined ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_true( self.box_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_maze( undefined ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_place_magicbox" ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
self animscripted( self.box_move.origin, self.box_move.angles, "zm_place_magicbox" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "place_magicbox_anim", ::box_notetracks, self.box_move );
|
||||
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 );
|
||||
}
|
||||
if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_magicbox_point" ) )
|
||||
return;
|
||||
|
||||
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_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_maze( self.box_current ) )
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( is_true( self.box_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_courtyard( self.box_current ) )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !self common_move_to_box( self.box_current, 1024, 0, "zm_pull_magicbox" ) )
|
||||
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 ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( level.sloth.custom_box_move_func ) )
|
||||
self thread [[ level.sloth.custom_box_move_func ]]( 0 );
|
||||
|
||||
level.sloth_moving_box = 1;
|
||||
self.ignore_common_run = 1;
|
||||
self set_zombie_run_cycle( "run_holding_magicbox" );
|
||||
self.locomotion = "run_holding_magicbox";
|
||||
|
||||
if ( is_true( self.box_current_in_maze ) )
|
||||
{
|
||||
if ( !is_true( self.box_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_courtyard( undefined ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( is_true( self.box_move_in_maze ) )
|
||||
{
|
||||
if ( !self common_move_to_maze( undefined ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !self common_move_to_box( self.box_move, 1024, 0, "zm_place_magicbox" ) )
|
||||
{
|
||||
self box_move_interrupt();
|
||||
return;
|
||||
}
|
||||
|
||||
self animscripted( self.box_move.origin, self.box_move.angles, "zm_place_magicbox" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "place_magicbox_anim", ::box_notetracks, self.box_move );
|
||||
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 )
|
||||
{
|
||||
if ( !flag( "moving_chest_now" ) || is_true( box._box_open ) && is_true( box._box_opened_by_fire_sale ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( note == "pulled" )
|
||||
{
|
||||
playfx( level._effect[ "fx_buried_sloth_box_slam" ], box.origin );
|
||||
tag_name = "tag_stowed_back";
|
||||
twr_origin = self gettagorigin( tag_name );
|
||||
twr_angles = self gettagangles( tag_name );
|
||||
if ( !isDefined( self.box_model ) )
|
||||
{
|
||||
self.box_model = spawn( "script_model", twr_origin );
|
||||
self.box_model.angles = twr_angles;
|
||||
self.box_model setmodel( level.small_magic_box );
|
||||
self.box_model linkto( self, tag_name );
|
||||
self.box_model_visible = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.box_model show();
|
||||
self.box_model_visible = 1;
|
||||
}
|
||||
self.box_current maps/mp/zombies/_zm_magicbox::hide_chest();
|
||||
}
|
||||
else if ( note == "placed" )
|
||||
{
|
||||
playfx( level._effect[ "fx_buried_sloth_box_slam" ], box.origin );
|
||||
self box_model_hide();
|
||||
if ( isDefined( self.box_move.zbarrier ) )
|
||||
{
|
||||
self.box_move.zbarrier maps/mp/zombies/_zm_magicbox::set_magic_box_zbarrier_state( "initial" );
|
||||
self.box_move.hidden = 0;
|
||||
self.box_move thread [[ level.pandora_show_func ]]();
|
||||
level.chest_index = self.box_move_index;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( note == "locked" )
|
||||
{
|
||||
playfx( level._effect[ "fx_buried_sloth_box_slam" ], box.origin );
|
||||
}
|
||||
}
|
||||
if ( flag( "moving_chest_now" ) || is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
|
||||
return 0;
|
||||
|
||||
if ( note == "pulled" )
|
||||
{
|
||||
playfx( level._effect["fx_buried_sloth_box_slam"], box.origin );
|
||||
tag_name = "tag_stowed_back";
|
||||
twr_origin = self gettagorigin( tag_name );
|
||||
twr_angles = self gettagangles( tag_name );
|
||||
|
||||
if ( !isdefined( self.box_model ) )
|
||||
{
|
||||
self.box_model = spawn( "script_model", twr_origin );
|
||||
self.box_model.angles = twr_angles;
|
||||
self.box_model setmodel( level.small_magic_box );
|
||||
self.box_model linkto( self, tag_name );
|
||||
self.box_model_visible = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.box_model show();
|
||||
self.box_model_visible = 1;
|
||||
}
|
||||
|
||||
self.box_current maps\mp\zombies\_zm_magicbox::hide_chest();
|
||||
}
|
||||
else if ( note == "placed" )
|
||||
{
|
||||
playfx( level._effect["fx_buried_sloth_box_slam"], box.origin );
|
||||
self box_model_hide();
|
||||
|
||||
if ( isdefined( self.box_move.zbarrier ) )
|
||||
{
|
||||
self.box_move.zbarrier maps\mp\zombies\_zm_magicbox::set_magic_box_zbarrier_state( "initial" );
|
||||
self.box_move.hidden = 0;
|
||||
self.box_move thread [[ level.pandora_show_func ]]();
|
||||
level.chest_index = self.box_move_index;
|
||||
}
|
||||
}
|
||||
else if ( note == "locked" )
|
||||
playfx( level._effect["fx_buried_sloth_box_slam"], box.origin );
|
||||
}
|
||||
|
||||
box_model_hide()
|
||||
{
|
||||
if ( isDefined( self.box_model ) )
|
||||
{
|
||||
self.box_model ghost();
|
||||
self.box_model_visible = 0;
|
||||
}
|
||||
if ( isdefined( self.box_model ) )
|
||||
{
|
||||
self.box_model ghost();
|
||||
self.box_model_visible = 0;
|
||||
}
|
||||
}
|
||||
|
||||
box_move_interrupt()
|
||||
{
|
||||
if ( isDefined( self.box_current ) )
|
||||
{
|
||||
if ( isDefined( self.box_current.zbarrier ) )
|
||||
{
|
||||
self.box_current.zbarrier maps/mp/zombies/_zm_magicbox::set_magic_box_zbarrier_state( "initial" );
|
||||
self.box_current.hidden = 0;
|
||||
self.box_current thread [[ level.pandora_show_func ]]();
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.sloth.custom_box_move_func ) )
|
||||
{
|
||||
self thread [[ level.sloth.custom_box_move_func ]]( 1 );
|
||||
}
|
||||
level.sloth_moving_box = undefined;
|
||||
self box_model_hide();
|
||||
if ( isdefined( self.box_current ) )
|
||||
{
|
||||
if ( isdefined( self.box_current.zbarrier ) )
|
||||
{
|
||||
self.box_current.zbarrier maps\mp\zombies\_zm_magicbox::set_magic_box_zbarrier_state( "initial" );
|
||||
self.box_current.hidden = 0;
|
||||
self.box_current thread [[ level.pandora_show_func ]]();
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( level.sloth.custom_box_move_func ) )
|
||||
self thread [[ level.sloth.custom_box_move_func ]]( 1 );
|
||||
|
||||
level.sloth_moving_box = undefined;
|
||||
self box_model_hide();
|
||||
}
|
||||
|
||||
box_spin_condition()
|
||||
{
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
box = level.chests[ level.chest_index ];
|
||||
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
|
||||
{
|
||||
ground_pos = groundpos( box.origin );
|
||||
dist = distancesquared( self.origin, ground_pos );
|
||||
if ( dist < 32400 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
if ( flag( "moving_chest_now" ) )
|
||||
return false;
|
||||
|
||||
box = level.chests[level.chest_index];
|
||||
|
||||
if ( is_true( box._box_open ) || is_true( box._box_opened_by_fire_sale ) )
|
||||
{
|
||||
ground_pos = groundpos( box.origin );
|
||||
dist = distancesquared( self.origin, ground_pos );
|
||||
|
||||
if ( dist < 32400 )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
box_spin_action()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps/mp/zombies/_zm_ai_sloth::common_context_action();
|
||||
box = level.chests[ level.chest_index ];
|
||||
hackable = spawnstruct();
|
||||
hackable.chest = box;
|
||||
if ( !self common_move_to_box( box, 1024, 1, "zm_cycle_magicbox" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !self box_spin_qualifier( hackable ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self animscripted( box.origin, box.angles, "zm_cycle_magicbox" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "cycle_magicbox_anim", ::box_kick, hackable );
|
||||
self.context_done = 1;
|
||||
self endon( "death" );
|
||||
self endon( "stop_action" );
|
||||
self maps\mp\zombies\_zm_ai_sloth::common_context_action();
|
||||
box = level.chests[level.chest_index];
|
||||
hackable = spawnstruct();
|
||||
hackable.chest = box;
|
||||
|
||||
if ( !self common_move_to_box( box, 1024, 1, "zm_cycle_magicbox" ) )
|
||||
return;
|
||||
|
||||
if ( !self box_spin_qualifier( hackable ) )
|
||||
return;
|
||||
|
||||
self animscripted( box.origin, box.angles, "zm_cycle_magicbox" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "cycle_magicbox_anim", ::box_kick, hackable );
|
||||
self.context_done = 1;
|
||||
}
|
||||
|
||||
box_kick( note, hackable )
|
||||
{
|
||||
if ( note == "kick" )
|
||||
{
|
||||
if ( !self box_spin_qualifier( hackable ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !flag( "moving_chest_now" ) )
|
||||
{
|
||||
hackable thread box_trigger();
|
||||
hackable maps/mp/zombies/_zm_hackables_box::respin_box( self.candy_player );
|
||||
}
|
||||
}
|
||||
if ( note == "kick" )
|
||||
{
|
||||
if ( !self box_spin_qualifier( hackable ) )
|
||||
return;
|
||||
|
||||
if ( !flag( "moving_chest_now" ) )
|
||||
{
|
||||
hackable thread box_trigger();
|
||||
hackable maps\mp\zombies\_zm_hackables_box::respin_box( self.candy_player );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
box_trigger()
|
||||
{
|
||||
if ( isDefined( self.chest ) )
|
||||
{
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.chest.unitrigger_stub );
|
||||
self.chest.zbarrier waittill( "randomization_done" );
|
||||
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 );
|
||||
}
|
||||
}
|
||||
if ( isdefined( self.chest ) )
|
||||
{
|
||||
thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.chest.unitrigger_stub );
|
||||
|
||||
self.chest.zbarrier waittill( "randomization_done" );
|
||||
|
||||
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 )
|
||||
{
|
||||
if ( isDefined( hackable.chest ) )
|
||||
{
|
||||
if ( !isDefined( hackable.chest.chest_user ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( !hackable maps/mp/zombies/_zm_hackables_box::hack_box_qualifier( self.candy_player ) )
|
||||
{
|
||||
if ( isdefined( hackable.chest ) )
|
||||
{
|
||||
if ( !isdefined( hackable.chest.chest_user ) )
|
||||
{
|
||||
self.context_done = 1;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
self.context_done = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1,211 +1,197 @@
|
||||
#include maps/mp/zombies/_zm_ai_sloth;
|
||||
#include maps/mp/zm_buried;
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\zombies\_zm_zonemgr;
|
||||
#include maps\mp\zm_buried;
|
||||
#include maps\mp\zombies\_zm_ai_sloth;
|
||||
|
||||
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 ( !maps/mp/zm_buried::is_courthouse_open() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_tunnels_north2" ) )
|
||||
{
|
||||
if ( !maps/mp/zm_buried::is_courthouse_open() )
|
||||
{
|
||||
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 ( !maps/mp/zm_buried::is_tunnel_open() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_start_lower" ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_underground_bar" ) )
|
||||
{
|
||||
if ( !maps/mp/zombies/_zm_ai_sloth::is_bar_open() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
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() )
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( player maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_tunnels_north2" ) )
|
||||
{
|
||||
if ( !maps\mp\zm_buried::is_courthouse_open() )
|
||||
return true;
|
||||
}
|
||||
|
||||
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 ( 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_underground_bar" ) )
|
||||
{
|
||||
if ( !maps\mp\zombies\_zm_ai_sloth::is_bar_open() )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
watch_crash_pos()
|
||||
{
|
||||
dist_crash = 4096;
|
||||
level.crash_pos = [];
|
||||
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, 1056, 56 );
|
||||
while ( 1 )
|
||||
{
|
||||
while ( !isDefined( self.state ) || self.state != "berserk" )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
_a82 = level.crash_pos;
|
||||
_k82 = getFirstArrayKey( _a82 );
|
||||
while ( isDefined( _k82 ) )
|
||||
{
|
||||
pos = _a82[ _k82 ];
|
||||
dist = distancesquared( self.origin, pos );
|
||||
if ( dist < dist_crash )
|
||||
{
|
||||
self.anchor.origin = self.origin;
|
||||
self.anchor.angles = self.angles;
|
||||
self linkto( self.anchor );
|
||||
self setclientfield( "sloth_berserk", 0 );
|
||||
self sloth_set_state( "crash", 0 );
|
||||
wait 0,25;
|
||||
self unlink();
|
||||
}
|
||||
_k82 = getNextArrayKey( _a82, _k82 );
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
dist_crash = 4096;
|
||||
level.crash_pos = [];
|
||||
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, 1056, 56 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( !isdefined( self.state ) || self.state != "berserk" )
|
||||
{
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ( pos in level.crash_pos )
|
||||
{
|
||||
dist = distancesquared( self.origin, pos );
|
||||
|
||||
if ( dist < dist_crash )
|
||||
{
|
||||
self.anchor.origin = self.origin;
|
||||
self.anchor.angles = self.angles;
|
||||
self linkto( self.anchor );
|
||||
self setclientfield( "sloth_berserk", 0 );
|
||||
self sloth_set_state( "crash", 0 );
|
||||
wait 0.25;
|
||||
self unlink();
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
sloth_is_pain()
|
||||
{
|
||||
if ( is_true( self.is_pain ) )
|
||||
{
|
||||
anim_state = self getanimstatefromasd();
|
||||
if ( anim_state == "zm_pain" || anim_state == "zm_pain_no_restart" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.reset_asd = undefined;
|
||||
self animmode( "normal" );
|
||||
self.is_pain = 0;
|
||||
self.damage_accumulating = 0;
|
||||
self notify( "stop_accumulation" );
|
||||
if ( is_true( self.is_pain ) )
|
||||
{
|
||||
anim_state = self getanimstatefromasd();
|
||||
|
||||
if ( anim_state == "zm_pain" || anim_state == "zm_pain_no_restart" )
|
||||
return true;
|
||||
else
|
||||
{
|
||||
self.reset_asd = undefined;
|
||||
self animmode( "normal" );
|
||||
self.is_pain = 0;
|
||||
self.damage_accumulating = 0;
|
||||
self notify( "stop_accumulation" );
|
||||
/#
|
||||
sloth_print( "pain was interrupted" );
|
||||
sloth_print( "pain was interrupted" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
sloth_is_traversing()
|
||||
{
|
||||
if ( is_true( self.is_traversing ) )
|
||||
{
|
||||
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" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.is_traversing = 0;
|
||||
if ( is_true( self.is_traversing ) )
|
||||
{
|
||||
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" )
|
||||
return true;
|
||||
else
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if ( type == "angle" )
|
||||
{
|
||||
self orientmode( "face angle", data );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type == "point" )
|
||||
{
|
||||
self orientmode( "face point", data );
|
||||
}
|
||||
}
|
||||
time_started = getTime();
|
||||
while ( 1 )
|
||||
{
|
||||
if ( type == "angle" )
|
||||
{
|
||||
delta = abs( self.angles[ 1 ] - data );
|
||||
if ( delta <= 15 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else }
|
||||
else if ( isDefined( dot_limit ) )
|
||||
{
|
||||
if ( self is_facing( facee, dot_limit ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else }
|
||||
else if ( self is_facing( facee ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( ( getTime() - time_started ) > 1000 )
|
||||
{
|
||||
if ( type == "angle" )
|
||||
self orientmode( "face angle", data );
|
||||
else if ( type == "point" )
|
||||
self orientmode( "face point", data );
|
||||
|
||||
time_started = gettime();
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( type == "angle" )
|
||||
{
|
||||
delta = abs( self.angles[1] - data );
|
||||
|
||||
if ( delta <= 15 )
|
||||
break;
|
||||
}
|
||||
else if ( isdefined( dot_limit ) )
|
||||
{
|
||||
if ( self is_facing( facee, dot_limit ) )
|
||||
break;
|
||||
}
|
||||
else if ( self is_facing( facee ) )
|
||||
break;
|
||||
|
||||
if ( gettime() - time_started > 1000 )
|
||||
{
|
||||
/#
|
||||
sloth_print( "face took too long" );
|
||||
sloth_print( "face took too long" );
|
||||
#/
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
/#
|
||||
time_elapsed = getTime() - time_started;
|
||||
sloth_print( "time to face: " + time_elapsed );
|
||||
time_elapsed = gettime() - time_started;
|
||||
sloth_print( "time to face: " + time_elapsed );
|
||||
#/
|
||||
}
|
||||
|
||||
sloth_print( str )
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( #"B6252E7C" ) )
|
||||
{
|
||||
iprintln( "sloth: " + str );
|
||||
if ( isDefined( self.debug_msg ) )
|
||||
{
|
||||
self.debug_msg[ self.debug_msg.size ] = str;
|
||||
if ( self.debug_msg.size > 64 )
|
||||
{
|
||||
self.debug_msg = [];
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.debug_msg = [];
|
||||
self.debug_msg[ self.debug_msg.size ] = str;
|
||||
if ( getdvarint( _hash_B6252E7C ) )
|
||||
{
|
||||
iprintln( "sloth: " + str );
|
||||
|
||||
if ( isdefined( self.debug_msg ) )
|
||||
{
|
||||
self.debug_msg[self.debug_msg.size] = str;
|
||||
|
||||
if ( self.debug_msg.size > 64 )
|
||||
self.debug_msg = [];
|
||||
}
|
||||
else
|
||||
{
|
||||
self.debug_msg = [];
|
||||
self.debug_msg[self.debug_msg.size] = str;
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sloth_debug_context( item, dist )
|
||||
{
|
||||
/#
|
||||
if ( is_true( self.context_debug ) )
|
||||
{
|
||||
debugstar( item.origin, 100, ( 1, 1, 1 ) );
|
||||
circle( item.origin, dist, ( 1, 1, 1 ), 0, 1, 100 );
|
||||
if ( is_true( self.context_debug ) )
|
||||
{
|
||||
debugstar( item.origin, 100, ( 1, 1, 1 ) );
|
||||
circle( item.origin, dist, ( 1, 1, 1 ), 0, 1, 100 );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,326 +1,304 @@
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm_powerups;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_magicbox;
|
||||
#include maps\mp\zombies\_zm_weapons;
|
||||
#include maps\mp\zombies\_zm_powerups;
|
||||
#include maps\mp\zombies\_zm_score;
|
||||
#include maps\mp\zombies\_zm_stats;
|
||||
#include maps\mp\zombies\_zm_unitrigger;
|
||||
|
||||
init()
|
||||
{
|
||||
onplayerconnect_callback( ::onplayerconnect_bank_deposit_box );
|
||||
if ( !isDefined( level.ta_vaultfee ) )
|
||||
{
|
||||
level.ta_vaultfee = 100;
|
||||
}
|
||||
if ( !isDefined( level.ta_tellerfee ) )
|
||||
{
|
||||
level.ta_tellerfee = 100;
|
||||
}
|
||||
onplayerconnect_callback( ::onplayerconnect_bank_deposit_box );
|
||||
|
||||
if ( !isdefined( level.ta_vaultfee ) )
|
||||
level.ta_vaultfee = 100;
|
||||
|
||||
if ( !isdefined( level.ta_tellerfee ) )
|
||||
level.ta_tellerfee = 100;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
if ( !isDefined( level.banking_map ) )
|
||||
{
|
||||
level.banking_map = level.script;
|
||||
}
|
||||
level thread bank_teller_init();
|
||||
level thread bank_deposit_box();
|
||||
if ( !isdefined( level.banking_map ) )
|
||||
level.banking_map = level.script;
|
||||
|
||||
level thread bank_teller_init();
|
||||
level thread bank_deposit_box();
|
||||
}
|
||||
|
||||
bank_teller_init()
|
||||
{
|
||||
level.bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
|
||||
if ( isDefined( level.bank_teller_dmg_trig ) )
|
||||
{
|
||||
level.bank_teller_transfer_trig = getent( level.bank_teller_dmg_trig.target, "targetname" );
|
||||
level.bank_teller_powerup_spot = getstruct( level.bank_teller_transfer_trig.target, "targetname" );
|
||||
level thread bank_teller_logic();
|
||||
level.bank_teller_transfer_trig.origin += vectorScale( ( 0, 0, -1 ), 25 );
|
||||
level.bank_teller_transfer_trig trigger_off();
|
||||
level.bank_teller_transfer_trig sethintstring( &"ZOMBIE_TELLER_GIVE_MONEY", level.ta_tellerfee );
|
||||
}
|
||||
level.bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
|
||||
|
||||
if ( isdefined( level.bank_teller_dmg_trig ) )
|
||||
{
|
||||
level.bank_teller_transfer_trig = getent( level.bank_teller_dmg_trig.target, "targetname" );
|
||||
level.bank_teller_powerup_spot = getstruct( level.bank_teller_transfer_trig.target, "targetname" );
|
||||
level thread bank_teller_logic();
|
||||
level.bank_teller_transfer_trig.origin += vectorscale( ( -1, 0, 0 ), 25.0 );
|
||||
level.bank_teller_transfer_trig trigger_off();
|
||||
level.bank_teller_transfer_trig sethintstring( &"ZOMBIE_TELLER_GIVE_MONEY", level.ta_tellerfee );
|
||||
}
|
||||
}
|
||||
|
||||
bank_teller_logic()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
while ( 1 )
|
||||
{
|
||||
level.bank_teller_dmg_trig waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, blah );
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) && damage == 1500 && type == "MOD_MELEE" )
|
||||
{
|
||||
bank_teller_give_money();
|
||||
level.bank_teller_transfer_trig trigger_off();
|
||||
}
|
||||
}
|
||||
level endon( "end_game" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
level.bank_teller_dmg_trig waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, blah );
|
||||
|
||||
if ( isdefined( attacker ) && isplayer( attacker ) && damage == 1500 && type == "MOD_MELEE" )
|
||||
{
|
||||
bank_teller_give_money();
|
||||
level.bank_teller_transfer_trig trigger_off();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bank_teller_give_money()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level endon( "stop_bank_teller" );
|
||||
level.bank_teller_transfer_trig trigger_on();
|
||||
bank_transfer = undefined;
|
||||
while ( 1 )
|
||||
{
|
||||
level.bank_teller_transfer_trig waittill( "trigger", player );
|
||||
if ( !is_player_valid( player, 0 ) || player.score < ( 1000 + level.ta_tellerfee ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( bank_transfer ) )
|
||||
{
|
||||
bank_transfer = maps/mp/zombies/_zm_powerups::specific_powerup_drop( "teller_withdrawl", level.bank_teller_powerup_spot.origin + vectorScale( ( 0, 0, -1 ), 40 ) );
|
||||
bank_transfer thread stop_bank_teller();
|
||||
bank_transfer.value = 0;
|
||||
}
|
||||
bank_transfer.value += 1000;
|
||||
bank_transfer notify( "powerup_reset" );
|
||||
bank_transfer thread maps/mp/zombies/_zm_powerups::powerup_timeout();
|
||||
player maps/mp/zombies/_zm_score::minus_to_player_score( 1000 + level.ta_tellerfee );
|
||||
level notify( "bank_teller_used" );
|
||||
}
|
||||
level endon( "end_game" );
|
||||
level endon( "stop_bank_teller" );
|
||||
level.bank_teller_transfer_trig trigger_on();
|
||||
bank_transfer = undefined;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
level.bank_teller_transfer_trig waittill( "trigger", player );
|
||||
|
||||
if ( !is_player_valid( player, 0 ) || player.score < 1000 + level.ta_tellerfee )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( bank_transfer ) )
|
||||
{
|
||||
bank_transfer = maps\mp\zombies\_zm_powerups::specific_powerup_drop( "teller_withdrawl", level.bank_teller_powerup_spot.origin + vectorscale( ( 0, 0, -1 ), 40.0 ) );
|
||||
bank_transfer thread stop_bank_teller();
|
||||
bank_transfer.value = 0;
|
||||
}
|
||||
|
||||
bank_transfer.value += 1000;
|
||||
bank_transfer notify( "powerup_reset" );
|
||||
bank_transfer thread maps\mp\zombies\_zm_powerups::powerup_timeout();
|
||||
player maps\mp\zombies\_zm_score::minus_to_player_score( 1000 + level.ta_tellerfee );
|
||||
level notify( "bank_teller_used" );
|
||||
}
|
||||
}
|
||||
|
||||
stop_bank_teller()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
self waittill( "death" );
|
||||
level notify( "stop_bank_teller" );
|
||||
level endon( "end_game" );
|
||||
|
||||
self waittill( "death" );
|
||||
|
||||
level notify( "stop_bank_teller" );
|
||||
}
|
||||
|
||||
delete_bank_teller()
|
||||
{
|
||||
wait 1;
|
||||
level notify( "stop_bank_teller" );
|
||||
bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
|
||||
bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" );
|
||||
bank_teller_dmg_trig delete();
|
||||
bank_teller_transfer_trig delete();
|
||||
wait 1;
|
||||
level notify( "stop_bank_teller" );
|
||||
bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
|
||||
bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" );
|
||||
bank_teller_dmg_trig delete();
|
||||
bank_teller_transfer_trig delete();
|
||||
}
|
||||
|
||||
onplayerconnect_bank_deposit_box()
|
||||
{
|
||||
online_game = sessionmodeisonlinegame();
|
||||
if ( !online_game )
|
||||
{
|
||||
self.account_value = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.account_value = self maps/mp/zombies/_zm_stats::get_map_stat( "depositBox", level.banking_map );
|
||||
}
|
||||
online_game = sessionmodeisonlinegame();
|
||||
|
||||
if ( !online_game )
|
||||
self.account_value = 0;
|
||||
else
|
||||
self.account_value = self maps\mp\zombies\_zm_stats::get_map_stat( "depositBox", level.banking_map );
|
||||
}
|
||||
|
||||
bank_deposit_box()
|
||||
{
|
||||
level.bank_deposit_max_amount = 250000;
|
||||
level.bank_deposit_ddl_increment_amount = 1000;
|
||||
level.bank_account_max = level.bank_deposit_max_amount / level.bank_deposit_ddl_increment_amount;
|
||||
level.bank_account_increment = int( level.bank_deposit_ddl_increment_amount / 1000 );
|
||||
deposit_triggers = getstructarray( "bank_deposit", "targetname" );
|
||||
array_thread( deposit_triggers, ::bank_deposit_unitrigger );
|
||||
withdraw_triggers = getstructarray( "bank_withdraw", "targetname" );
|
||||
array_thread( withdraw_triggers, ::bank_withdraw_unitrigger );
|
||||
level.bank_deposit_max_amount = 250000;
|
||||
level.bank_deposit_ddl_increment_amount = 1000;
|
||||
level.bank_account_max = level.bank_deposit_max_amount / level.bank_deposit_ddl_increment_amount;
|
||||
level.bank_account_increment = int( level.bank_deposit_ddl_increment_amount / 1000 );
|
||||
deposit_triggers = getstructarray( "bank_deposit", "targetname" );
|
||||
array_thread( deposit_triggers, ::bank_deposit_unitrigger );
|
||||
withdraw_triggers = getstructarray( "bank_withdraw", "targetname" );
|
||||
array_thread( withdraw_triggers, ::bank_withdraw_unitrigger );
|
||||
}
|
||||
|
||||
bank_deposit_unitrigger()
|
||||
{
|
||||
bank_unitrigger( "bank_deposit", ::trigger_deposit_update_prompt, ::trigger_deposit_think, 5, 5, undefined, 5 );
|
||||
bank_unitrigger( "bank_deposit", ::trigger_deposit_update_prompt, ::trigger_deposit_think, 5, 5, undefined, 5 );
|
||||
}
|
||||
|
||||
bank_withdraw_unitrigger()
|
||||
{
|
||||
bank_unitrigger( "bank_withdraw", ::trigger_withdraw_update_prompt, ::trigger_withdraw_think, 5, 5, undefined, 5 );
|
||||
bank_unitrigger( "bank_withdraw", ::trigger_withdraw_update_prompt, ::trigger_withdraw_think, 5, 5, undefined, 5 );
|
||||
}
|
||||
|
||||
bank_unitrigger( name, prompt_fn, think_fn, override_length, override_width, override_height, override_radius )
|
||||
{
|
||||
unitrigger_stub = spawnstruct();
|
||||
unitrigger_stub.origin = self.origin;
|
||||
if ( isDefined( self.script_angles ) )
|
||||
{
|
||||
unitrigger_stub.angles = self.script_angles;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.angles = self.angles;
|
||||
}
|
||||
unitrigger_stub.script_angles = unitrigger_stub.angles;
|
||||
if ( isDefined( override_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = override_length;
|
||||
}
|
||||
else if ( isDefined( self.script_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = self.script_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_length = 32;
|
||||
}
|
||||
if ( isDefined( override_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = override_width;
|
||||
}
|
||||
else if ( isDefined( self.script_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = self.script_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_width = 32;
|
||||
}
|
||||
if ( isDefined( override_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = override_height;
|
||||
}
|
||||
else if ( isDefined( self.script_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = self.script_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_height = 64;
|
||||
}
|
||||
if ( isDefined( override_radius ) )
|
||||
{
|
||||
unitrigger_stub.script_radius = override_radius;
|
||||
}
|
||||
else if ( isDefined( self.radius ) )
|
||||
{
|
||||
unitrigger_stub.radius = self.radius;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.radius = 32;
|
||||
}
|
||||
if ( isDefined( self.script_unitrigger_type ) )
|
||||
{
|
||||
unitrigger_stub.script_unitrigger_type = self.script_unitrigger_type;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
|
||||
unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length / 2 );
|
||||
}
|
||||
unitrigger_stub.cursor_hint = "HINT_NOICON";
|
||||
unitrigger_stub.targetname = name;
|
||||
maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
|
||||
unitrigger_stub.prompt_and_visibility_func = prompt_fn;
|
||||
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, think_fn );
|
||||
unitrigger_stub = spawnstruct();
|
||||
unitrigger_stub.origin = self.origin;
|
||||
|
||||
if ( isdefined( self.script_angles ) )
|
||||
unitrigger_stub.angles = self.script_angles;
|
||||
else
|
||||
unitrigger_stub.angles = self.angles;
|
||||
|
||||
unitrigger_stub.script_angles = unitrigger_stub.angles;
|
||||
|
||||
if ( isdefined( override_length ) )
|
||||
unitrigger_stub.script_length = override_length;
|
||||
else if ( isdefined( self.script_length ) )
|
||||
unitrigger_stub.script_length = self.script_length;
|
||||
else
|
||||
unitrigger_stub.script_length = 32;
|
||||
|
||||
if ( isdefined( override_width ) )
|
||||
unitrigger_stub.script_width = override_width;
|
||||
else if ( isdefined( self.script_width ) )
|
||||
unitrigger_stub.script_width = self.script_width;
|
||||
else
|
||||
unitrigger_stub.script_width = 32;
|
||||
|
||||
if ( isdefined( override_height ) )
|
||||
unitrigger_stub.script_height = override_height;
|
||||
else if ( isdefined( self.script_height ) )
|
||||
unitrigger_stub.script_height = self.script_height;
|
||||
else
|
||||
unitrigger_stub.script_height = 64;
|
||||
|
||||
if ( isdefined( override_radius ) )
|
||||
unitrigger_stub.script_radius = override_radius;
|
||||
else if ( isdefined( self.radius ) )
|
||||
unitrigger_stub.radius = self.radius;
|
||||
else
|
||||
unitrigger_stub.radius = 32;
|
||||
|
||||
if ( isdefined( self.script_unitrigger_type ) )
|
||||
unitrigger_stub.script_unitrigger_type = self.script_unitrigger_type;
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
|
||||
unitrigger_stub.origin -= anglestoright( unitrigger_stub.angles ) * unitrigger_stub.script_length / 2;
|
||||
}
|
||||
|
||||
unitrigger_stub.cursor_hint = "HINT_NOICON";
|
||||
unitrigger_stub.targetname = name;
|
||||
maps\mp\zombies\_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
|
||||
unitrigger_stub.prompt_and_visibility_func = prompt_fn;
|
||||
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, think_fn );
|
||||
}
|
||||
|
||||
trigger_deposit_update_prompt( player )
|
||||
{
|
||||
if ( player.score < level.bank_deposit_ddl_increment_amount || player.account_value >= level.bank_account_max )
|
||||
{
|
||||
player show_balance();
|
||||
self sethintstring( "" );
|
||||
return 0;
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount );
|
||||
return 1;
|
||||
if ( player.score < level.bank_deposit_ddl_increment_amount || player.account_value >= level.bank_account_max )
|
||||
{
|
||||
player show_balance();
|
||||
self sethintstring( "" );
|
||||
return false;
|
||||
}
|
||||
|
||||
self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount );
|
||||
return true;
|
||||
}
|
||||
|
||||
trigger_deposit_think()
|
||||
{
|
||||
self endon( "kill_trigger" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
while ( !is_player_valid( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( player.score >= level.bank_deposit_ddl_increment_amount && player.account_value < level.bank_account_max )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_vault_bank_deposit", player );
|
||||
player.score -= level.bank_deposit_ddl_increment_amount;
|
||||
player.account_value += level.bank_account_increment;
|
||||
player maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
|
||||
if ( isDefined( level.custom_bank_deposit_vo ) )
|
||||
{
|
||||
player thread [[ level.custom_bank_deposit_vo ]]();
|
||||
}
|
||||
if ( player.account_value >= level.bank_account_max )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
|
||||
}
|
||||
player show_balance();
|
||||
}
|
||||
self endon( "kill_trigger" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
|
||||
if ( !is_player_valid( player ) )
|
||||
continue;
|
||||
|
||||
if ( player.score >= level.bank_deposit_ddl_increment_amount && player.account_value < level.bank_account_max )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_vault_bank_deposit", player );
|
||||
player.score -= level.bank_deposit_ddl_increment_amount;
|
||||
player.account_value += level.bank_account_increment;
|
||||
player maps\mp\zombies\_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
|
||||
|
||||
if ( isdefined( level.custom_bank_deposit_vo ) )
|
||||
player thread [[ level.custom_bank_deposit_vo ]]();
|
||||
|
||||
if ( player.account_value >= level.bank_account_max )
|
||||
self sethintstring( "" );
|
||||
}
|
||||
else
|
||||
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
|
||||
|
||||
player show_balance();
|
||||
}
|
||||
}
|
||||
|
||||
trigger_withdraw_update_prompt( player )
|
||||
{
|
||||
if ( player.account_value <= 0 )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
player show_balance();
|
||||
return 0;
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee );
|
||||
return 1;
|
||||
if ( player.account_value <= 0 )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
player show_balance();
|
||||
return false;
|
||||
}
|
||||
|
||||
self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee );
|
||||
return true;
|
||||
}
|
||||
|
||||
trigger_withdraw_think()
|
||||
{
|
||||
self endon( "kill_trigger" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
while ( !is_player_valid( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( player.account_value >= level.bank_account_increment )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_vault_bank_withdraw", player );
|
||||
player.score += level.bank_deposit_ddl_increment_amount;
|
||||
level notify( "bank_withdrawal" );
|
||||
player.account_value -= level.bank_account_increment;
|
||||
player maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
|
||||
if ( isDefined( level.custom_bank_withdrawl_vo ) )
|
||||
{
|
||||
player thread [[ level.custom_bank_withdrawl_vo ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread do_player_general_vox( "general", "exert_laugh", 10, 50 );
|
||||
}
|
||||
player thread player_withdraw_fee();
|
||||
if ( player.account_value < level.bank_account_increment )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
|
||||
}
|
||||
player show_balance();
|
||||
}
|
||||
self endon( "kill_trigger" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
|
||||
if ( !is_player_valid( player ) )
|
||||
continue;
|
||||
|
||||
if ( player.account_value >= level.bank_account_increment )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_vault_bank_withdraw", player );
|
||||
player.score += level.bank_deposit_ddl_increment_amount;
|
||||
level notify( "bank_withdrawal" );
|
||||
player.account_value -= level.bank_account_increment;
|
||||
player maps\mp\zombies\_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
|
||||
|
||||
if ( isdefined( level.custom_bank_withdrawl_vo ) )
|
||||
player thread [[ level.custom_bank_withdrawl_vo ]]();
|
||||
else
|
||||
player thread do_player_general_vox( "general", "exert_laugh", 10, 50 );
|
||||
|
||||
player thread player_withdraw_fee();
|
||||
|
||||
if ( player.account_value < level.bank_account_increment )
|
||||
self sethintstring( "" );
|
||||
}
|
||||
else
|
||||
player thread do_player_general_vox( "general", "exert_sigh", 10, 50 );
|
||||
|
||||
player show_balance();
|
||||
}
|
||||
}
|
||||
|
||||
player_withdraw_fee()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
wait_network_frame();
|
||||
self.score -= level.ta_vaultfee;
|
||||
self endon( "disconnect" );
|
||||
wait_network_frame();
|
||||
self.score -= level.ta_vaultfee;
|
||||
}
|
||||
|
||||
show_balance()
|
||||
{
|
||||
/#
|
||||
iprintlnbold( "DEBUG BANKER: " + self.name + " account worth " + self.account_value );
|
||||
iprintlnbold( "DEBUG BANKER: " + self.name + " account worth " + self.account_value );
|
||||
#/
|
||||
}
|
||||
|
@ -1,443 +1,406 @@
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_buildables;
|
||||
#include maps\mp\zombies\_zm_unitrigger;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
|
||||
add_buildable_to_pool( stub, poolname )
|
||||
{
|
||||
if ( !isDefined( level.buildablepools ) )
|
||||
{
|
||||
level.buildablepools = [];
|
||||
}
|
||||
if ( !isDefined( level.buildablepools[ poolname ] ) )
|
||||
{
|
||||
level.buildablepools[ poolname ] = spawnstruct();
|
||||
level.buildablepools[ poolname ].stubs = [];
|
||||
}
|
||||
level.buildablepools[ poolname ].stubs[ level.buildablepools[ poolname ].stubs.size ] = stub;
|
||||
if ( !isDefined( level.buildablepools[ poolname ].buildable_slot ) )
|
||||
{
|
||||
level.buildablepools[ poolname ].buildable_slot = stub.buildablestruct.buildable_slot;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isdefined( level.buildablepools ) )
|
||||
level.buildablepools = [];
|
||||
|
||||
if ( !isdefined( level.buildablepools[poolname] ) )
|
||||
{
|
||||
level.buildablepools[poolname] = spawnstruct();
|
||||
level.buildablepools[poolname].stubs = [];
|
||||
}
|
||||
|
||||
level.buildablepools[poolname].stubs[level.buildablepools[poolname].stubs.size] = stub;
|
||||
|
||||
if ( !isdefined( level.buildablepools[poolname].buildable_slot ) )
|
||||
level.buildablepools[poolname].buildable_slot = stub.buildablestruct.buildable_slot;
|
||||
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.original_trigger_func = stub.trigger_func;
|
||||
stub.prompt_and_visibility_func = ::pooledbuildabletrigger_update_prompt;
|
||||
reregister_unitrigger( stub, ::pooled_buildable_place_think );
|
||||
}
|
||||
|
||||
stub.buildable_pool = level.buildablepools[poolname];
|
||||
stub.original_prompt_and_visibility_func = stub.prompt_and_visibility_func;
|
||||
stub.original_trigger_func = stub.trigger_func;
|
||||
stub.prompt_and_visibility_func = ::pooledbuildabletrigger_update_prompt;
|
||||
reregister_unitrigger( stub, ::pooled_buildable_place_think );
|
||||
}
|
||||
|
||||
reregister_unitrigger( unitrigger_stub, new_trigger_func )
|
||||
{
|
||||
static = 0;
|
||||
if ( isDefined( unitrigger_stub.in_zone ) )
|
||||
{
|
||||
static = 1;
|
||||
}
|
||||
unregister_unitrigger( unitrigger_stub );
|
||||
unitrigger_stub.trigger_func = new_trigger_func;
|
||||
if ( static )
|
||||
{
|
||||
register_static_unitrigger( unitrigger_stub, new_trigger_func, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
register_unitrigger( unitrigger_stub, new_trigger_func );
|
||||
}
|
||||
static = 0;
|
||||
|
||||
if ( isdefined( unitrigger_stub.in_zone ) )
|
||||
static = 1;
|
||||
|
||||
unregister_unitrigger( unitrigger_stub );
|
||||
unitrigger_stub.trigger_func = new_trigger_func;
|
||||
|
||||
if ( static )
|
||||
register_static_unitrigger( unitrigger_stub, new_trigger_func, 0 );
|
||||
else
|
||||
register_unitrigger( unitrigger_stub, new_trigger_func );
|
||||
}
|
||||
|
||||
randomize_pooled_buildables( poolname )
|
||||
{
|
||||
level waittill( "buildables_setup" );
|
||||
while ( isDefined( level.buildablepools[ poolname ] ) )
|
||||
{
|
||||
count = level.buildablepools[ poolname ].stubs.size;
|
||||
while ( count > 1 )
|
||||
{
|
||||
targets = [];
|
||||
i = 0;
|
||||
while ( i < count )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
p = randomint( count );
|
||||
if ( !isDefined( targets[ p ] ) )
|
||||
{
|
||||
targets[ p ] = i;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
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 ] ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
level waittill( "buildables_setup" );
|
||||
|
||||
if ( isdefined( level.buildablepools[poolname] ) )
|
||||
{
|
||||
count = level.buildablepools[poolname].stubs.size;
|
||||
|
||||
if ( count > 1 )
|
||||
{
|
||||
targets = [];
|
||||
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
while ( true )
|
||||
{
|
||||
p = randomint( count );
|
||||
|
||||
if ( !isdefined( targets[p] ) )
|
||||
{
|
||||
targets[p] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
if ( isdefined( targets[i] ) && targets[i] != i )
|
||||
swap_buildable_fields( level.buildablepools[poolname].stubs[i], level.buildablepools[poolname].stubs[targets[i]] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
_a104 = self.stubs;
|
||||
_k104 = getFirstArrayKey( _a104 );
|
||||
while ( isDefined( _k104 ) )
|
||||
{
|
||||
stub = _a104[ _k104 ];
|
||||
if ( isDefined( stub.bound_to_buildable ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( stub.buildablezone buildable_has_piece( piece ) )
|
||||
{
|
||||
return stub;
|
||||
}
|
||||
}
|
||||
_k104 = getNextArrayKey( _a104, _k104 );
|
||||
}
|
||||
return undefined;
|
||||
foreach ( stub in self.stubs )
|
||||
{
|
||||
if ( isdefined( stub.bound_to_buildable ) )
|
||||
continue;
|
||||
|
||||
if ( stub.buildablezone buildable_has_piece( piece ) )
|
||||
return stub;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
pooledbuildabletrigger_update_prompt( player )
|
||||
{
|
||||
can_use = self.stub pooledbuildablestub_update_prompt( player, self );
|
||||
self sethintstring( self.stub.hint_string );
|
||||
if ( isDefined( self.stub.cursor_hint ) )
|
||||
{
|
||||
if ( self.stub.cursor_hint == "HINT_WEAPON" && isDefined( self.stub.cursor_hint_weapon ) )
|
||||
{
|
||||
self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setcursorhint( self.stub.cursor_hint );
|
||||
}
|
||||
}
|
||||
return can_use;
|
||||
can_use = self.stub pooledbuildablestub_update_prompt( player, self );
|
||||
self sethintstring( self.stub.hint_string );
|
||||
|
||||
if ( isdefined( self.stub.cursor_hint ) )
|
||||
{
|
||||
if ( self.stub.cursor_hint == "HINT_WEAPON" && isdefined( self.stub.cursor_hint_weapon ) )
|
||||
self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon );
|
||||
else
|
||||
self setcursorhint( self.stub.cursor_hint );
|
||||
}
|
||||
|
||||
return can_use;
|
||||
}
|
||||
|
||||
pooledbuildablestub_update_prompt( player, trigger )
|
||||
{
|
||||
if ( !self anystub_update_prompt( player ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
can_use = 1;
|
||||
if ( isDefined( self.custom_buildablestub_update_prompt ) && !( self [[ self.custom_buildablestub_update_prompt ]]( player ) ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.cursor_hint = "HINT_NOICON";
|
||||
self.cursor_hint_weapon = undefined;
|
||||
if ( isDefined( self.built ) && !self.built )
|
||||
{
|
||||
slot = self.buildablestruct.buildable_slot;
|
||||
if ( !isDefined( player player_get_buildable_piece( slot ) ) )
|
||||
{
|
||||
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_more ) )
|
||||
{
|
||||
self.hint_string = level.zombie_buildables[ self.equipname ].hint_more;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE";
|
||||
}
|
||||
if ( isDefined( level.custom_buildable_need_part_vo ) )
|
||||
{
|
||||
player thread [[ level.custom_buildable_need_part_vo ]]();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.bound_to_buildable ) && !self.bound_to_buildable.buildablezone buildable_has_piece( player player_get_buildable_piece( slot ) ) )
|
||||
{
|
||||
if ( isDefined( level.zombie_buildables[ self.bound_to_buildable.equipname ].hint_wrong ) )
|
||||
{
|
||||
self.hint_string = level.zombie_buildables[ self.bound_to_buildable.equipname ].hint_wrong;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
|
||||
}
|
||||
if ( isDefined( level.custom_buildable_wrong_part_vo ) )
|
||||
{
|
||||
player thread [[ level.custom_buildable_wrong_part_vo ]]();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
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 ) )
|
||||
{
|
||||
if ( !self anystub_update_prompt( player ) )
|
||||
return 0;
|
||||
|
||||
can_use = 1;
|
||||
|
||||
if ( isdefined( self.custom_buildablestub_update_prompt ) && !self [[ self.custom_buildablestub_update_prompt ]]( player ) )
|
||||
return 0;
|
||||
|
||||
self.cursor_hint = "HINT_NOICON";
|
||||
self.cursor_hint_weapon = undefined;
|
||||
|
||||
if ( !( isdefined( self.built ) && self.built ) )
|
||||
{
|
||||
slot = self.buildablestruct.buildable_slot;
|
||||
|
||||
if ( !isdefined( player player_get_buildable_piece( slot ) ) )
|
||||
{
|
||||
if ( isdefined( level.zombie_buildables[self.equipname].hint_more ) )
|
||||
self.hint_string = level.zombie_buildables[self.equipname].hint_more;
|
||||
else
|
||||
self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE";
|
||||
|
||||
if ( isdefined( level.custom_buildable_need_part_vo ) )
|
||||
player thread [[ level.custom_buildable_need_part_vo ]]();
|
||||
|
||||
return 0;
|
||||
}
|
||||
else if ( isdefined( self.bound_to_buildable ) && !self.bound_to_buildable.buildablezone buildable_has_piece( player player_get_buildable_piece( slot ) ) )
|
||||
{
|
||||
if ( isdefined( level.zombie_buildables[self.bound_to_buildable.equipname].hint_wrong ) )
|
||||
self.hint_string = level.zombie_buildables[self.bound_to_buildable.equipname].hint_wrong;
|
||||
else
|
||||
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
|
||||
|
||||
if ( isdefined( level.custom_buildable_wrong_part_vo ) )
|
||||
player thread [[ level.custom_buildable_wrong_part_vo ]]();
|
||||
|
||||
return 0;
|
||||
}
|
||||
else 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 ) )
|
||||
{
|
||||
self.hint_string = level.zombie_buildables[ self.equipname ].hint;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.hint_string = "Missing buildable hint";
|
||||
}
|
||||
}
|
||||
else /#
|
||||
assert( isDefined( level.zombie_buildables[ self.equipname ].hint ), "Missing buildable hint" );
|
||||
if ( isdefined( level.zombie_buildables[self.equipname].hint ) )
|
||||
self.hint_string = level.zombie_buildables[self.equipname].hint;
|
||||
else
|
||||
self.hint_string = "Missing buildable hint";
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
assert( isdefined( level.zombie_buildables[self.equipname].hint ), "Missing buildable hint" );
|
||||
#/
|
||||
if ( isDefined( level.zombie_buildables[ self.equipname ].hint ) )
|
||||
{
|
||||
self.hint_string = level.zombie_buildables[ self.equipname ].hint;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.hint_string = "Missing buildable hint";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return trigger [[ self.original_prompt_and_visibility_func ]]( player );
|
||||
}
|
||||
return 1;
|
||||
if ( isdefined( level.zombie_buildables[self.equipname].hint ) )
|
||||
self.hint_string = level.zombie_buildables[self.equipname].hint;
|
||||
else
|
||||
self.hint_string = "Missing buildable hint";
|
||||
}
|
||||
}
|
||||
else
|
||||
return trigger [[ self.original_prompt_and_visibility_func ]]( player );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
find_bench( bench_name )
|
||||
{
|
||||
return getent( bench_name, "targetname" );
|
||||
return getent( bench_name, "targetname" );
|
||||
}
|
||||
|
||||
swap_buildable_fields( stub1, stub2 )
|
||||
{
|
||||
tbz = stub2.buildablezone;
|
||||
stub2.buildablezone = stub1.buildablezone;
|
||||
stub2.buildablezone.stub = stub2;
|
||||
stub1.buildablezone = tbz;
|
||||
stub1.buildablezone.stub = stub1;
|
||||
tbs = stub2.buildablestruct;
|
||||
stub2.buildablestruct = stub1.buildablestruct;
|
||||
stub1.buildablestruct = tbs;
|
||||
te = stub2.equipname;
|
||||
stub2.equipname = stub1.equipname;
|
||||
stub1.equipname = te;
|
||||
th = stub2.hint_string;
|
||||
stub2.hint_string = stub1.hint_string;
|
||||
stub1.hint_string = th;
|
||||
ths = stub2.trigger_hintstring;
|
||||
stub2.trigger_hintstring = stub1.trigger_hintstring;
|
||||
stub1.trigger_hintstring = ths;
|
||||
tp = stub2.persistent;
|
||||
stub2.persistent = stub1.persistent;
|
||||
stub1.persistent = tp;
|
||||
tobu = stub2.onbeginuse;
|
||||
stub2.onbeginuse = stub1.onbeginuse;
|
||||
stub1.onbeginuse = tobu;
|
||||
tocu = stub2.oncantuse;
|
||||
stub2.oncantuse = stub1.oncantuse;
|
||||
stub1.oncantuse = tocu;
|
||||
toeu = stub2.onenduse;
|
||||
stub2.onenduse = stub1.onenduse;
|
||||
stub1.onenduse = toeu;
|
||||
tt = stub2.target;
|
||||
stub2.target = stub1.target;
|
||||
stub1.target = tt;
|
||||
ttn = stub2.targetname;
|
||||
stub2.targetname = stub1.targetname;
|
||||
stub1.targetname = ttn;
|
||||
twn = stub2.weaponname;
|
||||
stub2.weaponname = stub1.weaponname;
|
||||
stub1.weaponname = twn;
|
||||
pav = stub2.original_prompt_and_visibility_func;
|
||||
stub2.original_prompt_and_visibility_func = stub1.original_prompt_and_visibility_func;
|
||||
stub1.original_prompt_and_visibility_func = pav;
|
||||
bench1 = undefined;
|
||||
bench2 = undefined;
|
||||
transfer_pos_as_is = 1;
|
||||
if ( isDefined( stub1.model.target ) && isDefined( stub2.model.target ) )
|
||||
{
|
||||
bench1 = find_bench( stub1.model.target );
|
||||
bench2 = find_bench( stub2.model.target );
|
||||
if ( isDefined( bench1 ) && isDefined( bench2 ) )
|
||||
{
|
||||
transfer_pos_as_is = 0;
|
||||
w2lo1 = bench1 worldtolocalcoords( stub1.model.origin );
|
||||
w2la1 = stub1.model.angles - bench1.angles;
|
||||
w2lo2 = bench2 worldtolocalcoords( stub2.model.origin );
|
||||
w2la2 = stub2.model.angles - bench2.angles;
|
||||
stub1.model.origin = bench2 localtoworldcoords( w2lo1 );
|
||||
stub1.model.angles = bench2.angles + w2la1;
|
||||
stub2.model.origin = bench1 localtoworldcoords( w2lo2 );
|
||||
stub2.model.angles = bench1.angles + w2la2;
|
||||
}
|
||||
tmt = stub2.model.target;
|
||||
stub2.model.target = stub1.model.target;
|
||||
stub1.model.target = tmt;
|
||||
}
|
||||
tm = stub2.model;
|
||||
stub2.model = stub1.model;
|
||||
stub1.model = tm;
|
||||
if ( transfer_pos_as_is )
|
||||
{
|
||||
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;
|
||||
}
|
||||
tbz = stub2.buildablezone;
|
||||
stub2.buildablezone = stub1.buildablezone;
|
||||
stub2.buildablezone.stub = stub2;
|
||||
stub1.buildablezone = tbz;
|
||||
stub1.buildablezone.stub = stub1;
|
||||
tbs = stub2.buildablestruct;
|
||||
stub2.buildablestruct = stub1.buildablestruct;
|
||||
stub1.buildablestruct = tbs;
|
||||
te = stub2.equipname;
|
||||
stub2.equipname = stub1.equipname;
|
||||
stub1.equipname = te;
|
||||
th = stub2.hint_string;
|
||||
stub2.hint_string = stub1.hint_string;
|
||||
stub1.hint_string = th;
|
||||
ths = stub2.trigger_hintstring;
|
||||
stub2.trigger_hintstring = stub1.trigger_hintstring;
|
||||
stub1.trigger_hintstring = ths;
|
||||
tp = stub2.persistent;
|
||||
stub2.persistent = stub1.persistent;
|
||||
stub1.persistent = tp;
|
||||
tobu = stub2.onbeginuse;
|
||||
stub2.onbeginuse = stub1.onbeginuse;
|
||||
stub1.onbeginuse = tobu;
|
||||
tocu = stub2.oncantuse;
|
||||
stub2.oncantuse = stub1.oncantuse;
|
||||
stub1.oncantuse = tocu;
|
||||
toeu = stub2.onenduse;
|
||||
stub2.onenduse = stub1.onenduse;
|
||||
stub1.onenduse = toeu;
|
||||
tt = stub2.target;
|
||||
stub2.target = stub1.target;
|
||||
stub1.target = tt;
|
||||
ttn = stub2.targetname;
|
||||
stub2.targetname = stub1.targetname;
|
||||
stub1.targetname = ttn;
|
||||
twn = stub2.weaponname;
|
||||
stub2.weaponname = stub1.weaponname;
|
||||
stub1.weaponname = twn;
|
||||
pav = stub2.original_prompt_and_visibility_func;
|
||||
stub2.original_prompt_and_visibility_func = stub1.original_prompt_and_visibility_func;
|
||||
stub1.original_prompt_and_visibility_func = pav;
|
||||
bench1 = undefined;
|
||||
bench2 = undefined;
|
||||
transfer_pos_as_is = 1;
|
||||
|
||||
if ( isdefined( stub1.model.target ) && isdefined( stub2.model.target ) )
|
||||
{
|
||||
bench1 = find_bench( stub1.model.target );
|
||||
bench2 = find_bench( stub2.model.target );
|
||||
|
||||
if ( isdefined( bench1 ) && isdefined( bench2 ) )
|
||||
{
|
||||
transfer_pos_as_is = 0;
|
||||
w2lo1 = bench1 worldtolocalcoords( stub1.model.origin );
|
||||
w2la1 = stub1.model.angles - bench1.angles;
|
||||
w2lo2 = bench2 worldtolocalcoords( stub2.model.origin );
|
||||
w2la2 = stub2.model.angles - bench2.angles;
|
||||
stub1.model.origin = bench2 localtoworldcoords( w2lo1 );
|
||||
stub1.model.angles = bench2.angles + w2la1;
|
||||
stub2.model.origin = bench1 localtoworldcoords( w2lo2 );
|
||||
stub2.model.angles = bench1.angles + w2la2;
|
||||
}
|
||||
|
||||
tmt = stub2.model.target;
|
||||
stub2.model.target = stub1.model.target;
|
||||
stub1.model.target = tmt;
|
||||
}
|
||||
|
||||
tm = stub2.model;
|
||||
stub2.model = stub1.model;
|
||||
stub1.model = tm;
|
||||
|
||||
if ( transfer_pos_as_is )
|
||||
{
|
||||
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()
|
||||
{
|
||||
self endon( "kill_trigger" );
|
||||
if ( isDefined( self.stub.built ) && self.stub.built )
|
||||
{
|
||||
return buildable_place_think();
|
||||
}
|
||||
player_built = undefined;
|
||||
while ( isDefined( self.stub.built ) && !self.stub.built )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
while ( player != self.parent_player )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( isDefined( player.screecher_weapon ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( !is_player_valid( player ) )
|
||||
{
|
||||
player thread ignore_triggers( 0,5 );
|
||||
}
|
||||
bind_to = self.stub;
|
||||
slot = bind_to.buildablestruct.buildable_slot;
|
||||
if ( !isDefined( self.stub.bound_to_buildable ) )
|
||||
{
|
||||
bind_to = self.stub.buildable_pool pooledbuildable_stub_for_piece( player player_get_buildable_piece( slot ) );
|
||||
}
|
||||
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 )
|
||||
{
|
||||
self.stub.hint_string = "";
|
||||
self sethintstring( self.stub.hint_string );
|
||||
if ( isDefined( self.stub.oncantuse ) )
|
||||
{
|
||||
self.stub [[ self.stub.oncantuse ]]( player );
|
||||
}
|
||||
}
|
||||
status = player player_can_build( bind_to.buildablezone );
|
||||
if ( !status )
|
||||
{
|
||||
self.stub.hint_string = "";
|
||||
self sethintstring( self.stub.hint_string );
|
||||
if ( isDefined( bind_to.oncantuse ) )
|
||||
{
|
||||
bind_to [[ bind_to.oncantuse ]]( player );
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( bind_to.onbeginuse ) )
|
||||
{
|
||||
self.stub [[ bind_to.onbeginuse ]]( player );
|
||||
}
|
||||
result = self buildable_use_hold_think( player, bind_to );
|
||||
team = player.pers[ "team" ];
|
||||
if ( result )
|
||||
{
|
||||
if ( isDefined( self.stub.bound_to_buildable ) && self.stub.bound_to_buildable != bind_to )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
if ( isDefined( bind_to.bound_to_buildable ) && self.stub != bind_to.bound_to_buildable )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
}
|
||||
if ( isDefined( bind_to.onenduse ) )
|
||||
{
|
||||
self.stub [[ bind_to.onenduse ]]( team, player, result );
|
||||
}
|
||||
while ( !result )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( self.stub.bound_to_buildable ) && isDefined( bind_to ) )
|
||||
{
|
||||
if ( bind_to != self.stub )
|
||||
{
|
||||
swap_buildable_fields( self.stub, bind_to );
|
||||
}
|
||||
self.stub.bound_to_buildable = self.stub;
|
||||
}
|
||||
if ( isDefined( self.stub.onuse ) )
|
||||
{
|
||||
self.stub [[ self.stub.onuse ]]( player );
|
||||
}
|
||||
if ( isDefined( player player_get_buildable_piece( slot ) ) )
|
||||
{
|
||||
prompt = player player_build( self.stub.buildablezone );
|
||||
player_built = player;
|
||||
self.stub.hint_string = prompt;
|
||||
self sethintstring( self.stub.hint_string );
|
||||
}
|
||||
}
|
||||
}
|
||||
switch( self.stub.persistent )
|
||||
{
|
||||
case 1:
|
||||
self bptrigger_think_persistent( player_built );
|
||||
break;
|
||||
case 0:
|
||||
self bptrigger_think_one_time( player_built );
|
||||
break;
|
||||
case 3:
|
||||
self bptrigger_think_unbuild( player_built );
|
||||
break;
|
||||
case 2:
|
||||
self bptrigger_think_one_use_and_fly( player_built );
|
||||
break;
|
||||
case 4:
|
||||
self [[ self.stub.custom_completion_callback ]]( player_built );
|
||||
break;
|
||||
}
|
||||
self endon( "kill_trigger" );
|
||||
|
||||
if ( isdefined( self.stub.built ) && self.stub.built )
|
||||
return buildable_place_think();
|
||||
|
||||
player_built = undefined;
|
||||
|
||||
while ( !( isdefined( self.stub.built ) && self.stub.built ) )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
|
||||
if ( player != self.parent_player )
|
||||
continue;
|
||||
|
||||
if ( isdefined( player.screecher_weapon ) )
|
||||
continue;
|
||||
|
||||
if ( !is_player_valid( player ) )
|
||||
{
|
||||
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.buildable_pool pooledbuildable_stub_for_piece( player player_get_buildable_piece( slot ) );
|
||||
|
||||
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.stub.hint_string = "";
|
||||
self sethintstring( self.stub.hint_string );
|
||||
|
||||
if ( isdefined( self.stub.oncantuse ) )
|
||||
self.stub [[ self.stub.oncantuse ]]( player );
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
status = player player_can_build( bind_to.buildablezone );
|
||||
|
||||
if ( !status )
|
||||
{
|
||||
self.stub.hint_string = "";
|
||||
self sethintstring( self.stub.hint_string );
|
||||
|
||||
if ( isdefined( bind_to.oncantuse ) )
|
||||
bind_to [[ bind_to.oncantuse ]]( player );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isdefined( bind_to.onbeginuse ) )
|
||||
self.stub [[ bind_to.onbeginuse ]]( player );
|
||||
|
||||
result = self buildable_use_hold_think( player, bind_to );
|
||||
team = player.pers["team"];
|
||||
|
||||
if ( result )
|
||||
{
|
||||
if ( isdefined( self.stub.bound_to_buildable ) && self.stub.bound_to_buildable != bind_to )
|
||||
result = 0;
|
||||
|
||||
if ( isdefined( bind_to.bound_to_buildable ) && self.stub != bind_to.bound_to_buildable )
|
||||
result = 0;
|
||||
}
|
||||
|
||||
if ( isdefined( bind_to.onenduse ) )
|
||||
self.stub [[ bind_to.onenduse ]]( team, player, result );
|
||||
|
||||
if ( !result )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( self.stub.bound_to_buildable ) && isdefined( bind_to ) )
|
||||
{
|
||||
if ( bind_to != self.stub )
|
||||
swap_buildable_fields( self.stub, bind_to );
|
||||
|
||||
self.stub.bound_to_buildable = self.stub;
|
||||
}
|
||||
|
||||
if ( isdefined( self.stub.onuse ) )
|
||||
self.stub [[ self.stub.onuse ]]( player );
|
||||
|
||||
if ( isdefined( player player_get_buildable_piece( slot ) ) )
|
||||
{
|
||||
prompt = player player_build( self.stub.buildablezone );
|
||||
player_built = player;
|
||||
self.stub.hint_string = prompt;
|
||||
self sethintstring( self.stub.hint_string );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch ( self.stub.persistent )
|
||||
{
|
||||
case "1":
|
||||
self bptrigger_think_persistent( player_built );
|
||||
break;
|
||||
case "0":
|
||||
self bptrigger_think_one_time( player_built );
|
||||
break;
|
||||
case "3":
|
||||
self bptrigger_think_unbuild( player_built );
|
||||
break;
|
||||
case "2":
|
||||
self bptrigger_think_one_use_and_fly( player_built );
|
||||
break;
|
||||
case "4":
|
||||
self [[ self.stub.custom_completion_callback ]]( player_built );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,17 +1,22 @@
|
||||
#include maps/mp/zombies/_zm_turned;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_turned;
|
||||
|
||||
register_game_module()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
onstartgametype( name )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
onstartcleansedgametype()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,11 +1,14 @@
|
||||
#include maps/mp/zombies/_zm_game_module_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_game_module_utility;
|
||||
#include maps\mp\zombies\_zm_game_module;
|
||||
|
||||
register_game_module()
|
||||
{
|
||||
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 );
|
||||
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 );
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
#include maps/mp/zombies/_zm_game_module_utility;
|
||||
#include maps/mp/zombies/_zm_game_module_meat_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_game_module_meat_utility;
|
||||
#include maps\mp\zombies\_zm_game_module_utility;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,64 +1,59 @@
|
||||
#include maps/mp/zombies/_zm_game_module_cleansed;
|
||||
#include maps/mp/zombies/_zm_turned;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_turned;
|
||||
#include maps\mp\zombies\_zm_game_module;
|
||||
#include maps\mp\zombies\_zm_game_module_cleansed;
|
||||
|
||||
register_game_module()
|
||||
{
|
||||
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 );
|
||||
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 );
|
||||
}
|
||||
|
||||
register_turned_match( start_func, end_func, name )
|
||||
{
|
||||
if ( !isDefined( level._registered_turned_matches ) )
|
||||
{
|
||||
level._registered_turned_matches = [];
|
||||
}
|
||||
match = spawnstruct();
|
||||
match.match_name = name;
|
||||
match.match_start_func = start_func;
|
||||
match.match_end_func = end_func;
|
||||
level._registered_turned_matches[ level._registered_turned_matches.size ] = match;
|
||||
if ( !isdefined( level._registered_turned_matches ) )
|
||||
level._registered_turned_matches = [];
|
||||
|
||||
match = spawnstruct();
|
||||
match.match_name = name;
|
||||
match.match_start_func = start_func;
|
||||
match.match_end_func = end_func;
|
||||
level._registered_turned_matches[level._registered_turned_matches.size] = match;
|
||||
}
|
||||
|
||||
get_registered_turned_match( name )
|
||||
{
|
||||
_a41 = level._registered_turned_matches;
|
||||
_k41 = getFirstArrayKey( _a41 );
|
||||
while ( isDefined( _k41 ) )
|
||||
{
|
||||
struct = _a41[ _k41 ];
|
||||
if ( struct.match_name == name )
|
||||
{
|
||||
return struct;
|
||||
}
|
||||
_k41 = getNextArrayKey( _a41, _k41 );
|
||||
}
|
||||
foreach ( struct in level._registered_turned_matches )
|
||||
{
|
||||
if ( struct.match_name == name )
|
||||
return struct;
|
||||
}
|
||||
}
|
||||
|
||||
set_current_turned_match( name )
|
||||
{
|
||||
level._current_turned_match = name;
|
||||
level._current_turned_match = name;
|
||||
}
|
||||
|
||||
get_current_turned_match()
|
||||
{
|
||||
return level._current_turned_match;
|
||||
return level._current_turned_match;
|
||||
}
|
||||
|
||||
init_zombie_weapon()
|
||||
{
|
||||
maps/mp/zombies/_zm_turned::init();
|
||||
maps\mp\zombies\_zm_turned::init();
|
||||
}
|
||||
|
||||
onpostinitgametype()
|
||||
{
|
||||
if ( level.scr_zm_game_module != level.game_module_turned_index )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level thread init_zombie_weapon();
|
||||
if ( level.scr_zm_game_module != level.game_module_turned_index )
|
||||
return;
|
||||
|
||||
level thread init_zombie_weapon();
|
||||
}
|
||||
|
@ -1,46 +1,46 @@
|
||||
#include maps/mp/zombies/_zm_game_module_meat;
|
||||
#include maps/mp/zombies/_zm_game_module_meat_utility;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_game_module_meat_utility;
|
||||
#include maps\mp\zombies\_zm_game_module_meat;
|
||||
|
||||
init_item_meat()
|
||||
{
|
||||
level.item_meat_name = "item_meat_zm";
|
||||
precacheitem( level.item_meat_name );
|
||||
level.item_meat_name = "item_meat_zm";
|
||||
precacheitem( level.item_meat_name );
|
||||
}
|
||||
|
||||
move_ring( ring )
|
||||
{
|
||||
positions = getstructarray( ring.target, "targetname" );
|
||||
positions = array_randomize( positions );
|
||||
level endon( "end_game" );
|
||||
while ( 1 )
|
||||
{
|
||||
_a23 = positions;
|
||||
_k23 = getFirstArrayKey( _a23 );
|
||||
while ( isDefined( _k23 ) )
|
||||
{
|
||||
position = _a23[ _k23 ];
|
||||
self moveto( position.origin, randomintrange( 30, 45 ) );
|
||||
self waittill( "movedone" );
|
||||
_k23 = getNextArrayKey( _a23, _k23 );
|
||||
}
|
||||
}
|
||||
positions = getstructarray( ring.target, "targetname" );
|
||||
positions = array_randomize( positions );
|
||||
level endon( "end_game" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
foreach ( position in positions )
|
||||
{
|
||||
self moveto( position.origin, randomintrange( 30, 45 ) );
|
||||
|
||||
self waittill( "movedone" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rotate_ring( forward )
|
||||
{
|
||||
level endon( "end_game" );
|
||||
dir = -360;
|
||||
if ( forward )
|
||||
{
|
||||
dir = 360;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self rotateyaw( dir, 9 );
|
||||
wait 9;
|
||||
}
|
||||
level endon( "end_game" );
|
||||
dir = -360;
|
||||
|
||||
if ( forward )
|
||||
dir = 360;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self rotateyaw( dir, 9 );
|
||||
wait 9;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,139 +1,172 @@
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/zombies/_zm_net;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_net;
|
||||
#include maps\mp\zombies\_zm_perks;
|
||||
#include maps\mp\_visionset_mgr;
|
||||
|
||||
enable_divetonuke_perk_for_level()
|
||||
{
|
||||
maps/mp/zombies/_zm_perks::register_perk_basic_info( "specialty_flakjacket", "divetonuke", 2000, &"ZOMBIE_PERK_DIVETONUKE", "zombie_perk_bottle_nuke" );
|
||||
maps/mp/zombies/_zm_perks::register_perk_precache_func( "specialty_flakjacket", ::divetonuke_precache );
|
||||
maps/mp/zombies/_zm_perks::register_perk_clientfields( "specialty_flakjacket", ::divetonuke_register_clientfield, ::divetonuke_set_clientfield );
|
||||
maps/mp/zombies/_zm_perks::register_perk_machine( "specialty_flakjacket", ::divetonuke_perk_machine_setup, ::divetonuke_perk_machine_think );
|
||||
maps/mp/zombies/_zm_perks::register_perk_host_migration_func( "specialty_flakjacket", ::divetonuke_host_migration_func );
|
||||
maps\mp\zombies\_zm_perks::register_perk_basic_info( "specialty_flakjacket", "divetonuke", 2000, &"ZOMBIE_PERK_DIVETONUKE", "zombie_perk_bottle_nuke" );
|
||||
maps\mp\zombies\_zm_perks::register_perk_precache_func( "specialty_flakjacket", ::divetonuke_precache );
|
||||
maps\mp\zombies\_zm_perks::register_perk_clientfields( "specialty_flakjacket", ::divetonuke_register_clientfield, ::divetonuke_set_clientfield );
|
||||
maps\mp\zombies\_zm_perks::register_perk_machine( "specialty_flakjacket", ::divetonuke_perk_machine_setup, ::divetonuke_perk_machine_think );
|
||||
maps\mp\zombies\_zm_perks::register_perk_host_migration_func( "specialty_flakjacket", ::divetonuke_host_migration_func );
|
||||
}
|
||||
|
||||
init_divetonuke()
|
||||
{
|
||||
level.zombiemode_divetonuke_perk_func = ::divetonuke_explode;
|
||||
maps/mp/_visionset_mgr::vsmgr_register_info( "visionset", "zm_perk_divetonuke", 9000, 400, 5, 1 );
|
||||
level._effect[ "divetonuke_groundhit" ] = loadfx( "maps/zombie/fx_zmb_phdflopper_exp" );
|
||||
set_zombie_var( "zombie_perk_divetonuke_radius", 300 );
|
||||
set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 );
|
||||
set_zombie_var( "zombie_perk_divetonuke_max_damage", 5000 );
|
||||
level.zombiemode_divetonuke_perk_func = ::divetonuke_explode;
|
||||
maps\mp\_visionset_mgr::vsmgr_register_info( "visionset", "zm_perk_divetonuke", 9000, 400, 5, 1 );
|
||||
level._effect["divetonuke_groundhit"] = loadfx( "maps/zombie/fx_zmb_phdflopper_exp" );
|
||||
set_zombie_var( "zombie_perk_divetonuke_radius", 300 );
|
||||
set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 );
|
||||
set_zombie_var( "zombie_perk_divetonuke_max_damage", 5000 );
|
||||
}
|
||||
|
||||
divetonuke_precache()
|
||||
{
|
||||
if ( isDefined( level.divetonuke_precache_override_func ) )
|
||||
{
|
||||
[[ level.divetonuke_precache_override_func ]]();
|
||||
return;
|
||||
}
|
||||
precacheitem( "zombie_perk_bottle_nuke" );
|
||||
precacheshader( "specialty_divetonuke_zombies" );
|
||||
precachemodel( "zombie_vending_nuke" );
|
||||
precachemodel( "zombie_vending_nuke_on" );
|
||||
precachestring( &"ZOMBIE_PERK_DIVETONUKE" );
|
||||
level._effect[ "divetonuke_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" );
|
||||
level.machine_assets[ "divetonuke" ] = spawnstruct();
|
||||
level.machine_assets[ "divetonuke" ].weapon = "zombie_perk_bottle_nuke";
|
||||
level.machine_assets[ "divetonuke" ].off_model = "zombie_vending_nuke";
|
||||
level.machine_assets[ "divetonuke" ].on_model = "zombie_vending_nuke_on";
|
||||
if ( isdefined( level.divetonuke_precache_override_func ) )
|
||||
{
|
||||
[[ level.divetonuke_precache_override_func ]]();
|
||||
return;
|
||||
}
|
||||
|
||||
precacheitem( "zombie_perk_bottle_nuke" );
|
||||
precacheshader( "specialty_divetonuke_zombies" );
|
||||
precachemodel( "zombie_vending_nuke" );
|
||||
precachemodel( "zombie_vending_nuke_on" );
|
||||
precachestring( &"ZOMBIE_PERK_DIVETONUKE" );
|
||||
level._effect["divetonuke_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" );
|
||||
level.machine_assets["divetonuke"] = spawnstruct();
|
||||
level.machine_assets["divetonuke"].weapon = "zombie_perk_bottle_nuke";
|
||||
level.machine_assets["divetonuke"].off_model = "zombie_vending_nuke";
|
||||
level.machine_assets["divetonuke"].on_model = "zombie_vending_nuke_on";
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
use_trigger.script_sound = "mus_perks_phd_jingle";
|
||||
use_trigger.script_string = "divetonuke_perk";
|
||||
use_trigger.script_label = "mus_perks_phd_sting";
|
||||
use_trigger.target = "vending_divetonuke";
|
||||
perk_machine.script_string = "divetonuke_perk";
|
||||
perk_machine.targetname = "vending_divetonuke";
|
||||
if ( isDefined( bump_trigger ) )
|
||||
{
|
||||
bump_trigger.script_string = "divetonuke_perk";
|
||||
}
|
||||
use_trigger.script_sound = "mus_perks_phd_jingle";
|
||||
use_trigger.script_string = "divetonuke_perk";
|
||||
use_trigger.script_label = "mus_perks_phd_sting";
|
||||
use_trigger.target = "vending_divetonuke";
|
||||
perk_machine.script_string = "divetonuke_perk";
|
||||
perk_machine.targetname = "vending_divetonuke";
|
||||
|
||||
if ( isdefined( bump_trigger ) )
|
||||
bump_trigger.script_string = "divetonuke_perk";
|
||||
}
|
||||
|
||||
divetonuke_perk_machine_think()
|
||||
{
|
||||
init_divetonuke();
|
||||
while ( 1 )
|
||||
{
|
||||
machine = getentarray( "vending_divetonuke", "targetname" );
|
||||
machine_triggers = getentarray( "vending_divetonuke", "target" );
|
||||
i = 0;
|
||||
while ( i < machine.size )
|
||||
{
|
||||
machine[ i ] setmodel( level.machine_assets[ "divetonuke" ].off_model );
|
||||
i++;
|
||||
}
|
||||
array_thread( machine_triggers, ::set_power_on, 0 );
|
||||
level thread do_initial_power_off_callback( machine, "divetonuke" );
|
||||
level waittill( "divetonuke_on" );
|
||||
i = 0;
|
||||
while ( i < machine.size )
|
||||
{
|
||||
machine[ i ] setmodel( level.machine_assets[ "divetonuke" ].on_model );
|
||||
machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0,3, 0,4, 3 );
|
||||
machine[ i ] playsound( "zmb_perks_power_on" );
|
||||
machine[ i ] thread perk_fx( "divetonuke_light" );
|
||||
machine[ i ] thread play_loop_on_machine();
|
||||
i++;
|
||||
}
|
||||
level notify( "specialty_flakjacket_power_on" );
|
||||
array_thread( machine_triggers, ::set_power_on, 1 );
|
||||
if ( isDefined( level.machine_assets[ "divetonuke" ].power_on_callback ) )
|
||||
{
|
||||
array_thread( machine, level.machine_assets[ "divetonuke" ].power_on_callback );
|
||||
}
|
||||
level waittill( "divetonuke_off" );
|
||||
if ( isDefined( level.machine_assets[ "divetonuke" ].power_off_callback ) )
|
||||
{
|
||||
array_thread( machine, level.machine_assets[ "divetonuke" ].power_off_callback );
|
||||
}
|
||||
array_thread( machine, ::turn_perk_off );
|
||||
}
|
||||
init_divetonuke();
|
||||
|
||||
while ( true )
|
||||
{
|
||||
machine = getentarray( "vending_divetonuke", "targetname" );
|
||||
machine_triggers = getentarray( "vending_divetonuke", "target" );
|
||||
|
||||
for ( i = 0; i < machine.size; i++ )
|
||||
machine[i] setmodel( level.machine_assets["divetonuke"].off_model );
|
||||
|
||||
array_thread( machine_triggers, ::set_power_on, 0 );
|
||||
level thread do_initial_power_off_callback( machine, "divetonuke" );
|
||||
|
||||
level waittill( "divetonuke_on" );
|
||||
|
||||
for ( i = 0; i < machine.size; i++ )
|
||||
{
|
||||
machine[i] setmodel( level.machine_assets["divetonuke"].on_model );
|
||||
machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 );
|
||||
machine[i] playsound( "zmb_perks_power_on" );
|
||||
machine[i] thread perk_fx( "divetonuke_light" );
|
||||
machine[i] thread play_loop_on_machine();
|
||||
}
|
||||
|
||||
level notify( "specialty_flakjacket_power_on" );
|
||||
array_thread( machine_triggers, ::set_power_on, 1 );
|
||||
|
||||
if ( isdefined( level.machine_assets["divetonuke"].power_on_callback ) )
|
||||
array_thread( machine, level.machine_assets["divetonuke"].power_on_callback );
|
||||
|
||||
level waittill( "divetonuke_off" );
|
||||
|
||||
if ( isdefined( level.machine_assets["divetonuke"].power_off_callback ) )
|
||||
array_thread( machine, level.machine_assets["divetonuke"].power_off_callback );
|
||||
|
||||
array_thread( machine, ::turn_perk_off );
|
||||
}
|
||||
}
|
||||
|
||||
divetonuke_host_migration_func()
|
||||
{
|
||||
flop = getentarray( "vending_divetonuke", "targetname" );
|
||||
_a138 = flop;
|
||||
_k138 = getFirstArrayKey( _a138 );
|
||||
while ( isDefined( _k138 ) )
|
||||
{
|
||||
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" );
|
||||
}
|
||||
_k138 = getNextArrayKey( _a138, _k138 );
|
||||
}
|
||||
flop = getentarray( "vending_divetonuke", "targetname" );
|
||||
|
||||
foreach ( perk in flop )
|
||||
{
|
||||
if ( isdefined( perk.model ) && perk.model == level.machine_assets["divetonuke"].on_model )
|
||||
{
|
||||
perk perk_fx( undefined, 1 );
|
||||
perk thread perk_fx( "divetonuke_light" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
divetonuke_explode( attacker, origin )
|
||||
{
|
||||
radius = level.zombie_vars[ "zombie_perk_divetonuke_radius" ];
|
||||
min_damage = level.zombie_vars[ "zombie_perk_divetonuke_min_damage" ];
|
||||
max_damage = level.zombie_vars[ "zombie_perk_divetonuke_max_damage" ];
|
||||
radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
|
||||
playfx( level._effect[ "divetonuke_groundhit" ], origin );
|
||||
attacker playsound( "zmb_phdflop_explo" );
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker );
|
||||
wait 1;
|
||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker );
|
||||
radius = level.zombie_vars["zombie_perk_divetonuke_radius"];
|
||||
min_damage = level.zombie_vars["zombie_perk_divetonuke_min_damage"];
|
||||
max_damage = level.zombie_vars["zombie_perk_divetonuke_max_damage"];
|
||||
|
||||
if ( isdefined( level.flopper_network_optimized ) && level.flopper_network_optimized )
|
||||
attacker thread divetonuke_explode_network_optimized( origin, radius, max_damage, min_damage, "MOD_GRENADE_SPLASH" );
|
||||
else
|
||||
radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
|
||||
|
||||
playfx( level._effect["divetonuke_groundhit"], origin );
|
||||
attacker playsound( "zmb_phdflop_explo" );
|
||||
maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker );
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,308 +1,302 @@
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\zombies\_zm_stats;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isDefined( level.ballistic_knife_autorecover ) )
|
||||
{
|
||||
level.ballistic_knife_autorecover = 1;
|
||||
}
|
||||
if ( isDefined( level._uses_retrievable_ballisitic_knives ) && level._uses_retrievable_ballisitic_knives == 1 )
|
||||
{
|
||||
precachemodel( "t5_weapon_ballistic_knife_projectile" );
|
||||
precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
if ( !isdefined( level.ballistic_knife_autorecover ) )
|
||||
level.ballistic_knife_autorecover = 1;
|
||||
|
||||
if ( isdefined( level._uses_retrievable_ballisitic_knives ) && level._uses_retrievable_ballisitic_knives == 1 )
|
||||
{
|
||||
precachemodel( "t5_weapon_ballistic_knife_projectile" );
|
||||
precachemodel( "t5_weapon_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
}
|
||||
|
||||
on_spawn( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
level endon( "game_ended" );
|
||||
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
|
||||
isfriendly = 0;
|
||||
if ( isDefined( endpos ) )
|
||||
{
|
||||
retrievable_model = spawn( "script_model", endpos );
|
||||
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
|
||||
retrievable_model setowner( player );
|
||||
retrievable_model.owner = player;
|
||||
retrievable_model.angles = angles;
|
||||
retrievable_model.name = watcher.weapon;
|
||||
if ( isDefined( prey ) )
|
||||
{
|
||||
if ( isplayer( prey ) && player.team == prey.team )
|
||||
{
|
||||
isfriendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isai( prey ) && player.team == prey.team )
|
||||
{
|
||||
isfriendly = 1;
|
||||
}
|
||||
}
|
||||
if ( !isfriendly )
|
||||
{
|
||||
retrievable_model linkto( prey, bone );
|
||||
retrievable_model thread force_drop_knives_to_ground_on_death( player, prey );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isfriendly )
|
||||
{
|
||||
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
|
||||
normal = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
watcher.objectarray[ watcher.objectarray.size ] = retrievable_model;
|
||||
if ( isfriendly )
|
||||
{
|
||||
retrievable_model waittill( "stationary" );
|
||||
}
|
||||
retrievable_model thread drop_knives_to_ground( player );
|
||||
if ( isfriendly )
|
||||
{
|
||||
player notify( "ballistic_knife_stationary" );
|
||||
}
|
||||
else
|
||||
{
|
||||
player notify( "ballistic_knife_stationary" );
|
||||
}
|
||||
retrievable_model thread wait_to_show_glowing_model( prey );
|
||||
}
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
|
||||
|
||||
isfriendly = 0;
|
||||
|
||||
if ( isdefined( endpos ) )
|
||||
{
|
||||
retrievable_model = spawn( "script_model", endpos );
|
||||
retrievable_model setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
|
||||
retrievable_model setowner( player );
|
||||
retrievable_model.owner = player;
|
||||
retrievable_model.angles = angles;
|
||||
retrievable_model.name = watcher.weapon;
|
||||
|
||||
if ( isdefined( prey ) )
|
||||
{
|
||||
if ( isplayer( prey ) && player.team == prey.team )
|
||||
isfriendly = 1;
|
||||
else if ( isai( prey ) && player.team == prey.team )
|
||||
isfriendly = 1;
|
||||
|
||||
if ( !isfriendly )
|
||||
{
|
||||
retrievable_model linkto( prey, bone );
|
||||
retrievable_model thread force_drop_knives_to_ground_on_death( player, prey );
|
||||
}
|
||||
else if ( isfriendly )
|
||||
{
|
||||
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
|
||||
normal = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
watcher.objectarray[watcher.objectarray.size] = retrievable_model;
|
||||
|
||||
if ( isfriendly )
|
||||
retrievable_model waittill( "stationary" );
|
||||
|
||||
retrievable_model thread drop_knives_to_ground( player );
|
||||
|
||||
if ( isfriendly )
|
||||
player notify( "ballistic_knife_stationary", retrievable_model, normal );
|
||||
else
|
||||
player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
|
||||
retrievable_model thread wait_to_show_glowing_model( prey );
|
||||
}
|
||||
}
|
||||
|
||||
wait_to_show_glowing_model( prey )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
wait 2;
|
||||
self setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
wait 2;
|
||||
self setmodel( "t5_weapon_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
|
||||
on_spawn_retrieve_trigger( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
level endon( "game_ended" );
|
||||
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
if ( !isDefined( retrievable_model ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
trigger_pos = [];
|
||||
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
|
||||
{
|
||||
trigger_pos[ 0 ] = prey.origin[ 0 ];
|
||||
trigger_pos[ 1 ] = prey.origin[ 1 ];
|
||||
trigger_pos[ 2 ] = prey.origin[ 2 ] + 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( 10 * normal[ 0 ] );
|
||||
trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( 10 * normal[ 1 ] );
|
||||
trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( 10 * normal[ 2 ] );
|
||||
}
|
||||
if ( is_true( level.ballistic_knife_autorecover ) )
|
||||
{
|
||||
trigger_pos[ 2 ] -= 50;
|
||||
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ), 0, 50, 100 );
|
||||
}
|
||||
else
|
||||
{
|
||||
pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ) );
|
||||
pickup_trigger setcursorhint( "HINT_NOICON" );
|
||||
}
|
||||
pickup_trigger.owner = player;
|
||||
retrievable_model.retrievabletrigger = pickup_trigger;
|
||||
hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP";
|
||||
if ( isDefined( hint_string ) )
|
||||
{
|
||||
pickup_trigger sethintstring( hint_string );
|
||||
}
|
||||
else
|
||||
{
|
||||
pickup_trigger sethintstring( &"GENERIC_PICKUP" );
|
||||
}
|
||||
pickup_trigger setteamfortrigger( player.team );
|
||||
player clientclaimtrigger( pickup_trigger );
|
||||
pickup_trigger enablelinkto();
|
||||
if ( isDefined( prey ) )
|
||||
{
|
||||
pickup_trigger linkto( prey );
|
||||
}
|
||||
else
|
||||
{
|
||||
pickup_trigger linkto( retrievable_model );
|
||||
}
|
||||
if ( isDefined( level.knife_planted ) )
|
||||
{
|
||||
[[ level.knife_planted ]]( retrievable_model, pickup_trigger, prey );
|
||||
}
|
||||
retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.weapon, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
player thread watch_shutdown( pickup_trigger, retrievable_model );
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
|
||||
if ( !isdefined( retrievable_model ) )
|
||||
return;
|
||||
|
||||
trigger_pos = [];
|
||||
|
||||
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
|
||||
{
|
||||
trigger_pos[0] = prey.origin[0];
|
||||
trigger_pos[1] = prey.origin[1];
|
||||
trigger_pos[2] = prey.origin[2] + 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_pos[0] = retrievable_model.origin[0] + 10 * normal[0];
|
||||
trigger_pos[1] = retrievable_model.origin[1] + 10 * normal[1];
|
||||
trigger_pos[2] = retrievable_model.origin[2] + 10 * normal[2];
|
||||
}
|
||||
|
||||
if ( is_true( level.ballistic_knife_autorecover ) )
|
||||
{
|
||||
trigger_pos[2] -= 50.0;
|
||||
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ), 0, 50, 100 );
|
||||
}
|
||||
else
|
||||
{
|
||||
pickup_trigger = spawn( "trigger_radius_use", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ) );
|
||||
pickup_trigger setcursorhint( "HINT_NOICON" );
|
||||
}
|
||||
|
||||
pickup_trigger.owner = player;
|
||||
retrievable_model.retrievabletrigger = pickup_trigger;
|
||||
hint_string = &"WEAPON_BALLISTIC_KNIFE_PICKUP";
|
||||
|
||||
if ( isdefined( hint_string ) )
|
||||
pickup_trigger sethintstring( hint_string );
|
||||
else
|
||||
pickup_trigger sethintstring( &"GENERIC_PICKUP" );
|
||||
|
||||
pickup_trigger setteamfortrigger( player.team );
|
||||
player clientclaimtrigger( pickup_trigger );
|
||||
pickup_trigger enablelinkto();
|
||||
|
||||
if ( isdefined( prey ) )
|
||||
pickup_trigger linkto( prey );
|
||||
else
|
||||
pickup_trigger linkto( retrievable_model );
|
||||
|
||||
if ( isdefined( level.knife_planted ) )
|
||||
[[ level.knife_planted ]]( retrievable_model, pickup_trigger, prey );
|
||||
|
||||
retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.weapon, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
player thread watch_shutdown( pickup_trigger, retrievable_model );
|
||||
}
|
||||
|
||||
debug_print( endpos )
|
||||
{
|
||||
/#
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
print3d( endpos, "pickup_trigger" );
|
||||
wait 0,05;
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
print3d( endpos, "pickup_trigger" );
|
||||
wait 0.05;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundonuse )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
level endon( "game_ended" );
|
||||
max_ammo = weaponmaxammo( weapon ) + 1;
|
||||
autorecover = is_true( level.ballistic_knife_autorecover );
|
||||
while ( 1 )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
while ( !isalive( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !player isonground() && !is_true( trigger.force_pickup ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
ammo_stock = player getweaponammostock( weapon );
|
||||
ammo_clip = player getweaponammoclip( weapon );
|
||||
current_weapon = player getcurrentweapon();
|
||||
total_ammo = ammo_stock + ammo_clip;
|
||||
hasreloaded = 1;
|
||||
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == weapon )
|
||||
{
|
||||
hasreloaded = 0;
|
||||
}
|
||||
if ( total_ammo >= max_ammo || !hasreloaded )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !autorecover && player usebuttonpressed() && !player.throwinggrenade || !player meleebuttonpressed() && is_true( trigger.force_pickup ) )
|
||||
{
|
||||
if ( isDefined( playersoundonuse ) )
|
||||
{
|
||||
player playlocalsound( playersoundonuse );
|
||||
}
|
||||
if ( isDefined( npcsoundonuse ) )
|
||||
{
|
||||
player playsound( npcsoundonuse );
|
||||
}
|
||||
player thread [[ callback ]]( weapon, model, trigger );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
level endon( "game_ended" );
|
||||
max_ammo = weaponmaxammo( weapon ) + 1;
|
||||
autorecover = is_true( level.ballistic_knife_autorecover );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
|
||||
if ( !isalive( player ) )
|
||||
continue;
|
||||
|
||||
if ( !player isonground() && !is_true( trigger.force_pickup ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
continue;
|
||||
|
||||
ammo_stock = player getweaponammostock( weapon );
|
||||
ammo_clip = player getweaponammoclip( weapon );
|
||||
current_weapon = player getcurrentweapon();
|
||||
total_ammo = ammo_stock + ammo_clip;
|
||||
hasreloaded = 1;
|
||||
|
||||
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == weapon )
|
||||
hasreloaded = 0;
|
||||
|
||||
if ( total_ammo >= max_ammo || !hasreloaded )
|
||||
continue;
|
||||
|
||||
if ( autorecover || player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() || is_true( trigger.force_pickup ) )
|
||||
{
|
||||
if ( isdefined( playersoundonuse ) )
|
||||
player playlocalsound( playersoundonuse );
|
||||
|
||||
if ( isdefined( npcsoundonuse ) )
|
||||
player playsound( npcsoundonuse );
|
||||
|
||||
player thread [[ callback ]]( weapon, model, trigger );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pick_up( weapon, model, trigger )
|
||||
{
|
||||
if ( self hasweapon( weapon ) )
|
||||
{
|
||||
current_weapon = self getcurrentweapon();
|
||||
if ( current_weapon != weapon )
|
||||
{
|
||||
clip_ammo = self getweaponammoclip( weapon );
|
||||
if ( !clip_ammo )
|
||||
{
|
||||
self setweaponammoclip( weapon, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = self getweaponammostock( weapon ) + 1;
|
||||
self setweaponammostock( weapon, new_ammo_stock );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = self getweaponammostock( weapon ) + 1;
|
||||
self setweaponammostock( weapon, new_ammo_stock );
|
||||
}
|
||||
}
|
||||
self maps/mp/zombies/_zm_stats::increment_client_stat( "ballistic_knives_pickedup" );
|
||||
self maps/mp/zombies/_zm_stats::increment_player_stat( "ballistic_knives_pickedup" );
|
||||
model destroy_ent();
|
||||
trigger destroy_ent();
|
||||
if ( self hasweapon( weapon ) )
|
||||
{
|
||||
current_weapon = self getcurrentweapon();
|
||||
|
||||
if ( current_weapon != weapon )
|
||||
{
|
||||
clip_ammo = self getweaponammoclip( weapon );
|
||||
|
||||
if ( !clip_ammo )
|
||||
self setweaponammoclip( weapon, 1 );
|
||||
else
|
||||
{
|
||||
new_ammo_stock = self getweaponammostock( weapon ) + 1;
|
||||
self setweaponammostock( weapon, new_ammo_stock );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = self getweaponammostock( weapon ) + 1;
|
||||
self setweaponammostock( weapon, new_ammo_stock );
|
||||
}
|
||||
}
|
||||
|
||||
self maps\mp\zombies\_zm_stats::increment_client_stat( "ballistic_knives_pickedup" );
|
||||
self maps\mp\zombies\_zm_stats::increment_player_stat( "ballistic_knives_pickedup" );
|
||||
model destroy_ent();
|
||||
trigger destroy_ent();
|
||||
}
|
||||
|
||||
destroy_ent()
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
if ( isDefined( self.glowing_model ) )
|
||||
{
|
||||
self.glowing_model delete();
|
||||
}
|
||||
self delete();
|
||||
}
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
if ( isdefined( self.glowing_model ) )
|
||||
self.glowing_model delete();
|
||||
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
|
||||
watch_shutdown( trigger, model )
|
||||
{
|
||||
self waittill_any( "death_or_disconnect", "zmb_lost_knife" );
|
||||
trigger destroy_ent();
|
||||
model destroy_ent();
|
||||
self waittill_any( "death_or_disconnect", "zmb_lost_knife" );
|
||||
trigger destroy_ent();
|
||||
model destroy_ent();
|
||||
}
|
||||
|
||||
drop_knives_to_ground( player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "drop_objects_to_ground", origin, radius );
|
||||
if ( distancesquared( origin, self.origin ) < ( radius * radius ) )
|
||||
{
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) );
|
||||
self thread update_retrieve_trigger( player );
|
||||
}
|
||||
}
|
||||
player endon( "death" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "drop_objects_to_ground", origin, radius );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) < radius * radius )
|
||||
{
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
|
||||
self thread update_retrieve_trigger( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
force_drop_knives_to_ground_on_death( player, prey )
|
||||
{
|
||||
self endon( "death" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
prey waittill( "death" );
|
||||
self unlink();
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) );
|
||||
self thread update_retrieve_trigger( player );
|
||||
self endon( "death" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
|
||||
prey waittill( "death" );
|
||||
|
||||
self unlink();
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
|
||||
self thread update_retrieve_trigger( player );
|
||||
}
|
||||
|
||||
update_retrieve_trigger( player )
|
||||
{
|
||||
self endon( "death" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
if ( isDefined( level.custom_update_retrieve_trigger ) )
|
||||
{
|
||||
self [[ level.custom_update_retrieve_trigger ]]( player );
|
||||
return;
|
||||
}
|
||||
self waittill( "stationary" );
|
||||
trigger = self.retrievabletrigger;
|
||||
trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 );
|
||||
trigger linkto( self );
|
||||
self endon( "death" );
|
||||
player endon( "zmb_lost_knife" );
|
||||
|
||||
if ( isdefined( level.custom_update_retrieve_trigger ) )
|
||||
{
|
||||
self [[ level.custom_update_retrieve_trigger ]]( player );
|
||||
return;
|
||||
}
|
||||
|
||||
self waittill( "stationary" );
|
||||
|
||||
trigger = self.retrievabletrigger;
|
||||
trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
|
||||
trigger linkto( self );
|
||||
}
|
||||
|
@ -1,19 +1,19 @@
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_melee_weapon;
|
||||
#include maps\mp\zombies\_zm_weapons;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( isDefined( level.bowie_cost ) )
|
||||
{
|
||||
cost = level.bowie_cost;
|
||||
}
|
||||
else
|
||||
{
|
||||
cost = 3000;
|
||||
}
|
||||
maps/mp/zombies/_zm_melee_weapon::init( "bowie_knife_zm", "zombie_bowie_flourish", "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", cost, "bowie_upgrade", &"ZOMBIE_WEAPON_BOWIE_BUY", "bowie", undefined );
|
||||
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie" );
|
||||
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie_upgraded" );
|
||||
if ( isdefined( level.bowie_cost ) )
|
||||
cost = level.bowie_cost;
|
||||
else
|
||||
cost = 3000;
|
||||
|
||||
maps\mp\zombies\_zm_melee_weapon::init( "bowie_knife_zm", "zombie_bowie_flourish", "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", cost, "bowie_upgrade", &"ZOMBIE_WEAPON_BOWIE_BUY", "bowie", undefined );
|
||||
maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie" );
|
||||
maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_bowie_upgraded" );
|
||||
}
|
||||
|
@ -1,476 +1,466 @@
|
||||
#include maps/mp/gametypes_zm/_weaponobjects;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_equipment;
|
||||
#include maps\mp\zombies\_zm_score;
|
||||
#include maps\mp\zombies\_zm_audio;
|
||||
#include maps\mp\zombies\_zm_weapons;
|
||||
#include maps\mp\zombies\_zm_stats;
|
||||
#include maps\mp\gametypes_zm\_weaponobjects;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isDefined( level.claymores_max_per_player ) )
|
||||
{
|
||||
level.claymores_max_per_player = 12;
|
||||
}
|
||||
trigs = getentarray( "claymore_purchase", "targetname" );
|
||||
i = 0;
|
||||
while ( i < trigs.size )
|
||||
{
|
||||
model = getent( trigs[ i ].target, "targetname" );
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model hide();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
array_thread( trigs, ::buy_claymores );
|
||||
level thread give_claymores_after_rounds();
|
||||
level.claymores_on_damage = ::satchel_damage;
|
||||
level.pickup_claymores = ::pickup_claymores;
|
||||
level.pickup_claymores_trigger_listener = ::pickup_claymores_trigger_listener;
|
||||
level.claymore_detectiondot = cos( 70 );
|
||||
level.claymore_detectionmindist = 20;
|
||||
level._effect[ "claymore_laser" ] = loadfx( "weapon/claymore/fx_claymore_laser" );
|
||||
if ( !isdefined( level.claymores_max_per_player ) )
|
||||
level.claymores_max_per_player = 12;
|
||||
|
||||
trigs = getentarray( "claymore_purchase", "targetname" );
|
||||
|
||||
for ( i = 0; i < trigs.size; i++ )
|
||||
{
|
||||
model = getent( trigs[i].target, "targetname" );
|
||||
|
||||
if ( isdefined( model ) )
|
||||
model hide();
|
||||
}
|
||||
|
||||
array_thread( trigs, ::buy_claymores );
|
||||
level thread give_claymores_after_rounds();
|
||||
level.claymores_on_damage = ::satchel_damage;
|
||||
level.pickup_claymores = ::pickup_claymores;
|
||||
level.pickup_claymores_trigger_listener = ::pickup_claymores_trigger_listener;
|
||||
level.claymore_detectiondot = cos( 70 );
|
||||
level.claymore_detectionmindist = 20;
|
||||
level._effect["claymore_laser"] = loadfx( "weapon/claymore/fx_claymore_laser" );
|
||||
}
|
||||
|
||||
buy_claymores()
|
||||
{
|
||||
self.zombie_cost = 1000;
|
||||
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
|
||||
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
|
||||
self endon( "kill_trigger" );
|
||||
if ( !isDefined( self.stub ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.stub ) && !isDefined( self.stub.claymores_triggered ) )
|
||||
{
|
||||
self.stub.claymores_triggered = 0;
|
||||
}
|
||||
self.claymores_triggered = self.stub.claymores_triggered;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
while ( who in_revive_trigger() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( who has_powerup_weapon() )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
if ( is_player_valid( who ) )
|
||||
{
|
||||
if ( who.score >= self.zombie_cost )
|
||||
{
|
||||
if ( !who is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
play_sound_at_pos( "purchase", self.origin );
|
||||
who maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost );
|
||||
who thread claymore_setup();
|
||||
who thread show_claymore_hint( "claymore_purchased" );
|
||||
who thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" );
|
||||
if ( isDefined( self.stub ) )
|
||||
{
|
||||
self.claymores_triggered = self.stub.claymores_triggered;
|
||||
}
|
||||
if ( self.claymores_triggered == 0 )
|
||||
{
|
||||
model = getent( self.target, "targetname" );
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model thread maps/mp/zombies/_zm_weapons::weapon_show( who );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.clientfieldname ) )
|
||||
{
|
||||
level setclientfield( self.clientfieldname, 1 );
|
||||
}
|
||||
}
|
||||
self.claymores_triggered = 1;
|
||||
if ( isDefined( self.stub ) )
|
||||
{
|
||||
self.stub.claymores_triggered = 1;
|
||||
}
|
||||
}
|
||||
trigs = getentarray( "claymore_purchase", "targetname" );
|
||||
i = 0;
|
||||
while ( i < trigs.size )
|
||||
{
|
||||
trigs[ i ] setinvisibletoplayer( who );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else who thread show_claymore_hint( "already_purchased" );
|
||||
}
|
||||
}
|
||||
}
|
||||
self.zombie_cost = 1000;
|
||||
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
|
||||
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
|
||||
self endon( "kill_trigger" );
|
||||
|
||||
if ( !isdefined( self.stub ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.stub ) && !isdefined( self.stub.claymores_triggered ) )
|
||||
self.stub.claymores_triggered = 0;
|
||||
|
||||
self.claymores_triggered = self.stub.claymores_triggered;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
|
||||
if ( who in_revive_trigger() )
|
||||
continue;
|
||||
|
||||
if ( who has_powerup_weapon() )
|
||||
{
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( is_player_valid( who ) )
|
||||
{
|
||||
if ( who.score >= self.zombie_cost )
|
||||
{
|
||||
if ( !who is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
play_sound_at_pos( "purchase", self.origin );
|
||||
who maps\mp\zombies\_zm_score::minus_to_player_score( self.zombie_cost );
|
||||
who thread claymore_setup();
|
||||
who thread show_claymore_hint( "claymore_purchased" );
|
||||
who thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" );
|
||||
|
||||
if ( isdefined( self.stub ) )
|
||||
self.claymores_triggered = self.stub.claymores_triggered;
|
||||
|
||||
if ( self.claymores_triggered == 0 )
|
||||
{
|
||||
model = getent( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( model ) )
|
||||
model thread maps\mp\zombies\_zm_weapons::weapon_show( who );
|
||||
else if ( isdefined( self.clientfieldname ) )
|
||||
level setclientfield( self.clientfieldname, 1 );
|
||||
|
||||
self.claymores_triggered = 1;
|
||||
|
||||
if ( isdefined( self.stub ) )
|
||||
self.stub.claymores_triggered = 1;
|
||||
}
|
||||
|
||||
trigs = getentarray( "claymore_purchase", "targetname" );
|
||||
|
||||
for ( i = 0; i < trigs.size; i++ )
|
||||
trigs[i] setinvisibletoplayer( who );
|
||||
}
|
||||
else
|
||||
who thread show_claymore_hint( "already_purchased" );
|
||||
}
|
||||
else
|
||||
{
|
||||
who play_sound_on_ent( "no_purchase" );
|
||||
who maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
claymore_unitrigger_update_prompt( player )
|
||||
{
|
||||
if ( player is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
self setcursorhint( "HINT_NOICON" );
|
||||
return 0;
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
|
||||
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
|
||||
return 1;
|
||||
if ( player is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
self sethintstring( "" );
|
||||
self setcursorhint( "HINT_NOICON" );
|
||||
return false;
|
||||
}
|
||||
|
||||
self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" );
|
||||
self setcursorhint( "HINT_WEAPON", "claymore_zm" );
|
||||
return true;
|
||||
}
|
||||
|
||||
set_claymore_visible()
|
||||
{
|
||||
players = get_players();
|
||||
trigs = getentarray( "claymore_purchase", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
j = 0;
|
||||
while ( j < players.size )
|
||||
{
|
||||
while ( !players[ j ] is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < trigs.size )
|
||||
{
|
||||
trigs[ i ] setinvisibletoplayer( players[ j ], 0 );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
j++;
|
||||
}
|
||||
wait 1;
|
||||
players = get_players();
|
||||
}
|
||||
players = get_players();
|
||||
trigs = getentarray( "claymore_purchase", "targetname" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
for ( j = 0; j < players.size; j++ )
|
||||
{
|
||||
if ( !players[j] is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
for ( i = 0; i < trigs.size; i++ )
|
||||
trigs[i] setinvisibletoplayer( players[j], 0 );
|
||||
}
|
||||
}
|
||||
|
||||
wait 1;
|
||||
players = get_players();
|
||||
}
|
||||
}
|
||||
|
||||
claymore_safe_to_plant()
|
||||
{
|
||||
if ( self.owner.claymores.size >= level.claymores_max_per_player )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( level.claymore_safe_to_plant ) )
|
||||
{
|
||||
return self [[ level.claymore_safe_to_plant ]]();
|
||||
}
|
||||
return 1;
|
||||
if ( self.owner.claymores.size >= level.claymores_max_per_player )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( level.claymore_safe_to_plant ) )
|
||||
return self [[ level.claymore_safe_to_plant ]]();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
claymore_wait_and_detonate()
|
||||
{
|
||||
wait 0,1;
|
||||
self detonate( self.owner );
|
||||
wait 0.1;
|
||||
self detonate( self.owner );
|
||||
}
|
||||
|
||||
claymore_watch()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "claymore_watch" );
|
||||
self endon( "claymore_watch" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_fire", claymore, weapname );
|
||||
if ( weapname == "claymore_zm" )
|
||||
{
|
||||
claymore.owner = self;
|
||||
claymore.team = self.team;
|
||||
self notify( "zmb_enable_claymore_prompt" );
|
||||
if ( claymore claymore_safe_to_plant() )
|
||||
{
|
||||
if ( isDefined( level.claymore_planted ) )
|
||||
{
|
||||
self thread [[ level.claymore_planted ]]( claymore );
|
||||
}
|
||||
claymore thread claymore_detonation();
|
||||
claymore thread play_claymore_effects();
|
||||
self maps/mp/zombies/_zm_stats::increment_client_stat( "claymores_planted" );
|
||||
self maps/mp/zombies/_zm_stats::increment_player_stat( "claymores_planted" );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
claymore thread claymore_wait_and_detonate();
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self notify( "claymore_watch" );
|
||||
self endon( "claymore_watch" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "grenade_fire", claymore, weapname );
|
||||
|
||||
if ( weapname == "claymore_zm" )
|
||||
{
|
||||
claymore.owner = self;
|
||||
claymore.team = self.team;
|
||||
self notify( "zmb_enable_claymore_prompt" );
|
||||
|
||||
if ( claymore claymore_safe_to_plant() )
|
||||
{
|
||||
if ( isdefined( level.claymore_planted ) )
|
||||
self thread [[ level.claymore_planted ]]( claymore );
|
||||
|
||||
claymore thread claymore_detonation();
|
||||
claymore thread play_claymore_effects();
|
||||
self maps\mp\zombies\_zm_stats::increment_client_stat( "claymores_planted" );
|
||||
self maps\mp\zombies\_zm_stats::increment_player_stat( "claymores_planted" );
|
||||
}
|
||||
else
|
||||
claymore thread claymore_wait_and_detonate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
claymore_setup()
|
||||
{
|
||||
if ( !isDefined( self.claymores ) )
|
||||
{
|
||||
self.claymores = [];
|
||||
}
|
||||
self thread claymore_watch();
|
||||
self giveweapon( "claymore_zm" );
|
||||
self set_player_placeable_mine( "claymore_zm" );
|
||||
self setactionslot( 4, "weapon", "claymore_zm" );
|
||||
self setweaponammostock( "claymore_zm", 2 );
|
||||
if ( !isdefined( self.claymores ) )
|
||||
self.claymores = [];
|
||||
|
||||
self thread claymore_watch();
|
||||
self giveweapon( "claymore_zm" );
|
||||
self set_player_placeable_mine( "claymore_zm" );
|
||||
self setactionslot( 4, "weapon", "claymore_zm" );
|
||||
self setweaponammostock( "claymore_zm", 2 );
|
||||
}
|
||||
|
||||
adjust_trigger_origin( origin )
|
||||
{
|
||||
origin += vectorScale( ( 0, 0, 1 ), 20 );
|
||||
return origin;
|
||||
origin += vectorscale( ( 0, 0, 1 ), 20.0 );
|
||||
return origin;
|
||||
}
|
||||
|
||||
on_spawn_retrieve_trigger( watcher, player )
|
||||
{
|
||||
self maps/mp/gametypes_zm/_weaponobjects::onspawnretrievableweaponobject( watcher, player );
|
||||
if ( isDefined( self.pickuptrigger ) )
|
||||
{
|
||||
self.pickuptrigger sethintlowpriority( 0 );
|
||||
}
|
||||
self maps\mp\gametypes_zm\_weaponobjects::onspawnretrievableweaponobject( watcher, player );
|
||||
|
||||
if ( isdefined( self.pickuptrigger ) )
|
||||
self.pickuptrigger sethintlowpriority( 0 );
|
||||
}
|
||||
|
||||
pickup_claymores()
|
||||
{
|
||||
player = self.owner;
|
||||
if ( !player hasweapon( "claymore_zm" ) )
|
||||
{
|
||||
player thread claymore_watch();
|
||||
player giveweapon( "claymore_zm" );
|
||||
player set_player_placeable_mine( "claymore_zm" );
|
||||
player setactionslot( 4, "weapon", "claymore_zm" );
|
||||
player setweaponammoclip( "claymore_zm", 0 );
|
||||
player notify( "zmb_enable_claymore_prompt" );
|
||||
}
|
||||
else
|
||||
{
|
||||
clip_ammo = player getweaponammoclip( self.name );
|
||||
clip_max_ammo = weaponclipsize( self.name );
|
||||
if ( clip_ammo >= clip_max_ammo )
|
||||
{
|
||||
self destroy_ent();
|
||||
player notify( "zmb_disable_claymore_prompt" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
self pick_up();
|
||||
clip_ammo = player getweaponammoclip( self.name );
|
||||
clip_max_ammo = weaponclipsize( self.name );
|
||||
if ( clip_ammo >= clip_max_ammo )
|
||||
{
|
||||
player notify( "zmb_disable_claymore_prompt" );
|
||||
}
|
||||
player maps/mp/zombies/_zm_stats::increment_client_stat( "claymores_pickedup" );
|
||||
player maps/mp/zombies/_zm_stats::increment_player_stat( "claymores_pickedup" );
|
||||
player = self.owner;
|
||||
|
||||
if ( !player hasweapon( "claymore_zm" ) )
|
||||
{
|
||||
player thread claymore_watch();
|
||||
player giveweapon( "claymore_zm" );
|
||||
player set_player_placeable_mine( "claymore_zm" );
|
||||
player setactionslot( 4, "weapon", "claymore_zm" );
|
||||
player setweaponammoclip( "claymore_zm", 0 );
|
||||
player notify( "zmb_enable_claymore_prompt" );
|
||||
}
|
||||
else
|
||||
{
|
||||
clip_ammo = player getweaponammoclip( self.name );
|
||||
clip_max_ammo = weaponclipsize( self.name );
|
||||
|
||||
if ( clip_ammo >= clip_max_ammo )
|
||||
{
|
||||
self destroy_ent();
|
||||
player notify( "zmb_disable_claymore_prompt" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
self pick_up();
|
||||
clip_ammo = player getweaponammoclip( self.name );
|
||||
clip_max_ammo = weaponclipsize( self.name );
|
||||
|
||||
if ( clip_ammo >= clip_max_ammo )
|
||||
player notify( "zmb_disable_claymore_prompt" );
|
||||
|
||||
player maps\mp\zombies\_zm_stats::increment_client_stat( "claymores_pickedup" );
|
||||
player maps\mp\zombies\_zm_stats::increment_player_stat( "claymores_pickedup" );
|
||||
}
|
||||
|
||||
pickup_claymores_trigger_listener( trigger, player )
|
||||
{
|
||||
self thread pickup_claymores_trigger_listener_enable( trigger, player );
|
||||
self thread pickup_claymores_trigger_listener_disable( trigger, player );
|
||||
self thread pickup_claymores_trigger_listener_enable( trigger, player );
|
||||
self thread pickup_claymores_trigger_listener_disable( trigger, player );
|
||||
}
|
||||
|
||||
pickup_claymores_trigger_listener_enable( trigger, player )
|
||||
{
|
||||
self endon( "delete" );
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" );
|
||||
if ( !isDefined( trigger ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
trigger trigger_on();
|
||||
trigger linkto( self );
|
||||
}
|
||||
self endon( "delete" );
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" );
|
||||
|
||||
if ( !isdefined( trigger ) )
|
||||
return;
|
||||
|
||||
trigger trigger_on();
|
||||
trigger linkto( self );
|
||||
}
|
||||
}
|
||||
|
||||
pickup_claymores_trigger_listener_disable( trigger, player )
|
||||
{
|
||||
self endon( "delete" );
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
player waittill( "zmb_disable_claymore_prompt" );
|
||||
if ( !isDefined( trigger ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
trigger unlink();
|
||||
trigger trigger_off();
|
||||
}
|
||||
self endon( "delete" );
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
player waittill( "zmb_disable_claymore_prompt" );
|
||||
|
||||
if ( !isdefined( trigger ) )
|
||||
return;
|
||||
|
||||
trigger unlink();
|
||||
trigger trigger_off();
|
||||
}
|
||||
}
|
||||
|
||||
shouldaffectweaponobject( object )
|
||||
{
|
||||
pos = self.origin + vectorScale( ( 0, 0, 1 ), 32 );
|
||||
dirtopos = pos - object.origin;
|
||||
objectforward = anglesToForward( object.angles );
|
||||
dist = vectordot( dirtopos, objectforward );
|
||||
if ( dist < level.claymore_detectionmindist )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
dirtopos = vectornormalize( dirtopos );
|
||||
dot = vectordot( dirtopos, objectforward );
|
||||
return dot > level.claymore_detectiondot;
|
||||
pos = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 );
|
||||
dirtopos = pos - object.origin;
|
||||
objectforward = anglestoforward( object.angles );
|
||||
dist = vectordot( dirtopos, objectforward );
|
||||
|
||||
if ( dist < level.claymore_detectionmindist )
|
||||
return 0;
|
||||
|
||||
dirtopos = vectornormalize( dirtopos );
|
||||
dot = vectordot( dirtopos, objectforward );
|
||||
return dot > level.claymore_detectiondot;
|
||||
}
|
||||
|
||||
claymore_detonation()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill_not_moving();
|
||||
detonateradius = 96;
|
||||
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 2 );
|
||||
damagearea setexcludeteamfortrigger( self.team );
|
||||
damagearea enablelinkto();
|
||||
damagearea linkto( self );
|
||||
if ( is_true( self.isonbus ) )
|
||||
{
|
||||
damagearea setmovingplatformenabled( 1 );
|
||||
}
|
||||
self.damagearea = damagearea;
|
||||
self thread delete_claymores_on_death( self.owner, damagearea );
|
||||
self.owner.claymores[ self.owner.claymores.size ] = self;
|
||||
while ( 1 )
|
||||
{
|
||||
damagearea waittill( "trigger", ent );
|
||||
if ( isDefined( self.owner ) && ent == self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == self.team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( ent.ignore_claymore ) && ent.ignore_claymore )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( !ent shouldaffectweaponobject( self ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( ent damageconetrace( self.origin, self ) > 0 )
|
||||
{
|
||||
self playsound( "wpn_claymore_alert" );
|
||||
wait 0,4;
|
||||
if ( isDefined( self.owner ) )
|
||||
{
|
||||
self detonate( self.owner );
|
||||
}
|
||||
else
|
||||
{
|
||||
self detonate( undefined );
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self waittill_not_moving();
|
||||
detonateradius = 96;
|
||||
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 2 );
|
||||
damagearea setexcludeteamfortrigger( self.team );
|
||||
damagearea enablelinkto();
|
||||
damagearea linkto( self );
|
||||
|
||||
if ( is_true( self.isonbus ) )
|
||||
damagearea setmovingplatformenabled( 1 );
|
||||
|
||||
self.damagearea = damagearea;
|
||||
self thread delete_claymores_on_death( self.owner, damagearea );
|
||||
self.owner.claymores[self.owner.claymores.size] = self;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
damagearea waittill( "trigger", ent );
|
||||
|
||||
if ( isdefined( self.owner ) && ent == self.owner )
|
||||
continue;
|
||||
|
||||
if ( isdefined( ent.pers ) && isdefined( ent.pers["team"] ) && ent.pers["team"] == self.team )
|
||||
continue;
|
||||
|
||||
if ( isdefined( ent.ignore_claymore ) && ent.ignore_claymore )
|
||||
continue;
|
||||
|
||||
if ( !ent shouldaffectweaponobject( self ) )
|
||||
continue;
|
||||
|
||||
if ( ent damageconetrace( self.origin, self ) > 0 )
|
||||
{
|
||||
self playsound( "wpn_claymore_alert" );
|
||||
wait 0.4;
|
||||
|
||||
if ( isdefined( self.owner ) )
|
||||
self detonate( self.owner );
|
||||
else
|
||||
self detonate( undefined );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete_claymores_on_death( player, ent )
|
||||
{
|
||||
self waittill( "death" );
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
arrayremovevalue( player.claymores, self );
|
||||
}
|
||||
wait 0,05;
|
||||
if ( isDefined( ent ) )
|
||||
{
|
||||
ent delete();
|
||||
}
|
||||
self waittill( "death" );
|
||||
|
||||
if ( isdefined( player ) )
|
||||
arrayremovevalue( player.claymores, self );
|
||||
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( ent ) )
|
||||
ent delete();
|
||||
}
|
||||
|
||||
satchel_damage()
|
||||
{
|
||||
self endon( "death" );
|
||||
self setcandamage( 1 );
|
||||
self.health = 100000;
|
||||
self.maxhealth = self.health;
|
||||
attacker = undefined;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "damage", amount, attacker );
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.health = self.maxhealth;
|
||||
while ( !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( self.owner ) && attacker == self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( isDefined( attacker.pers ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] != level.zombie_team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( level.satchelexplodethisframe )
|
||||
{
|
||||
wait ( 0,1 + randomfloat( 0,4 ) );
|
||||
}
|
||||
else wait 0,05;
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.satchelexplodethisframe = 1;
|
||||
thread reset_satchel_explode_this_frame();
|
||||
self detonate( attacker );
|
||||
self endon( "death" );
|
||||
self setcandamage( 1 );
|
||||
self.health = 100000;
|
||||
self.maxhealth = self.health;
|
||||
attacker = undefined;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "damage", amount, attacker );
|
||||
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
self.health = self.maxhealth;
|
||||
|
||||
if ( !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.owner ) && attacker == self.owner )
|
||||
continue;
|
||||
|
||||
if ( isdefined( attacker.pers ) && isdefined( attacker.pers["team"] ) && attacker.pers["team"] != level.zombie_team )
|
||||
continue;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if ( level.satchelexplodethisframe )
|
||||
wait( 0.1 + randomfloat( 0.4 ) );
|
||||
else
|
||||
wait 0.05;
|
||||
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
level.satchelexplodethisframe = 1;
|
||||
thread reset_satchel_explode_this_frame();
|
||||
self detonate( attacker );
|
||||
}
|
||||
|
||||
reset_satchel_explode_this_frame()
|
||||
{
|
||||
wait 0,05;
|
||||
level.satchelexplodethisframe = 0;
|
||||
wait 0.05;
|
||||
level.satchelexplodethisframe = 0;
|
||||
}
|
||||
|
||||
play_claymore_effects()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill_not_moving();
|
||||
playfxontag( level._effect[ "claymore_laser" ], self, "tag_fx" );
|
||||
self endon( "death" );
|
||||
self waittill_not_moving();
|
||||
playfxontag( level._effect["claymore_laser"], self, "tag_fx" );
|
||||
}
|
||||
|
||||
give_claymores_after_rounds()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "between_round_over" );
|
||||
while ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) )
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ] is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
players[ i ] giveweapon( "claymore_zm" );
|
||||
players[ i ] set_player_placeable_mine( "claymore_zm" );
|
||||
players[ i ] setactionslot( 4, "weapon", "claymore_zm" );
|
||||
players[ i ] setweaponammoclip( "claymore_zm", 2 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "between_round_over" );
|
||||
|
||||
if ( !level flag_exists( "teleporter_used" ) || !flag( "teleporter_used" ) )
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i] is_player_placeable_mine( "claymore_zm" ) )
|
||||
{
|
||||
players[i] giveweapon( "claymore_zm" );
|
||||
players[i] set_player_placeable_mine( "claymore_zm" );
|
||||
players[i] setactionslot( 4, "weapon", "claymore_zm" );
|
||||
players[i] setweaponammoclip( "claymore_zm", 2 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
show_claymore_hint( string )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
if ( string == "claymore_purchased" )
|
||||
{
|
||||
text = &"ZOMBIE_CLAYMORE_HOWTO";
|
||||
}
|
||||
else
|
||||
{
|
||||
text = &"ZOMBIE_CLAYMORE_ALREADY_PURCHASED";
|
||||
}
|
||||
show_equipment_hint_text( text );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
if ( string == "claymore_purchased" )
|
||||
text = &"ZOMBIE_CLAYMORE_HOWTO";
|
||||
else
|
||||
text = &"ZOMBIE_CLAYMORE_ALREADY_PURCHASED";
|
||||
|
||||
show_equipment_hint_text( text );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,120 +1,123 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_net;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_net;
|
||||
#include maps\mp\zombies\_zm_melee_weapon;
|
||||
#include maps\mp\zombies\_zm_weapons;
|
||||
#include maps\mp\zombies\_zm_spawner;
|
||||
#include maps\mp\zombies\_zm_audio;
|
||||
|
||||
init()
|
||||
{
|
||||
registerclientfield( "toplayer", "tazer_flourish", 1, 1, "int" );
|
||||
register_melee_weapon_for_level( "tazer_knuckles_zm" );
|
||||
if ( isDefined( level.tazer_cost ) )
|
||||
{
|
||||
cost = level.tazer_cost;
|
||||
}
|
||||
else
|
||||
{
|
||||
cost = 6000;
|
||||
}
|
||||
level.use_tazer_impact_fx = 0;
|
||||
maps/mp/zombies/_zm_melee_weapon::init( "tazer_knuckles_zm", "zombie_tazer_flourish", "knife_ballistic_no_melee_zm", "knife_ballistic_no_melee_upgraded_zm", cost, "tazer_upgrade", &"ZOMBIE_WEAPON_TAZER_BUY", "tazerknuckles", ::tazer_flourish_fx );
|
||||
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee" );
|
||||
maps/mp/zombies/_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee_upgraded" );
|
||||
maps/mp/zombies/_zm_spawner::add_cusom_zombie_spawn_logic( ::watch_bodily_functions );
|
||||
level._effect[ "fx_zmb_taser_vomit" ] = loadfx( "maps/zombie/fx_zmb_taser_vomit" );
|
||||
level._effect[ "fx_zmb_taser_flourish" ] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" );
|
||||
if ( level.script != "zm_transit" )
|
||||
{
|
||||
level._effect[ "fx_zmb_tazer_impact" ] = loadfx( "weapon/taser/fx_taser_knuckles_impact_zmb" );
|
||||
level.use_tazer_impact_fx = 1;
|
||||
}
|
||||
level.tazer_flourish_delay = 0,5;
|
||||
registerclientfield( "toplayer", "tazer_flourish", 1, 1, "int" );
|
||||
register_melee_weapon_for_level( "tazer_knuckles_zm" );
|
||||
|
||||
if ( isdefined( level.tazer_cost ) )
|
||||
cost = level.tazer_cost;
|
||||
else
|
||||
cost = 6000;
|
||||
|
||||
level.use_tazer_impact_fx = 0;
|
||||
maps\mp\zombies\_zm_melee_weapon::init( "tazer_knuckles_zm", "zombie_tazer_flourish", "knife_ballistic_no_melee_zm", "knife_ballistic_no_melee_upgraded_zm", cost, "tazer_upgrade", &"ZOMBIE_WEAPON_TAZER_BUY", "tazerknuckles", ::tazer_flourish_fx );
|
||||
maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee" );
|
||||
maps\mp\zombies\_zm_weapons::add_retrievable_knife_init_name( "knife_ballistic_no_melee_upgraded" );
|
||||
maps\mp\zombies\_zm_spawner::add_cusom_zombie_spawn_logic( ::watch_bodily_functions );
|
||||
level._effect["fx_zmb_taser_vomit"] = loadfx( "maps/zombie/fx_zmb_taser_vomit" );
|
||||
level._effect["fx_zmb_taser_flourish"] = loadfx( "weapon/taser/fx_taser_knuckles_anim_zmb" );
|
||||
|
||||
if ( level.script != "zm_transit" )
|
||||
{
|
||||
level._effect["fx_zmb_tazer_impact"] = loadfx( "weapon/taser/fx_taser_knuckles_impact_zmb" );
|
||||
level.use_tazer_impact_fx = 1;
|
||||
}
|
||||
|
||||
level.tazer_flourish_delay = 0.5;
|
||||
}
|
||||
|
||||
watch_bodily_functions()
|
||||
{
|
||||
if ( isDefined( self.isscreecher ) || self.isscreecher && isDefined( self.is_avogadro ) && self.is_avogadro )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( isDefined( self ) && isalive( self ) )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, point, type );
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( attacker ) || !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( type != "MOD_MELEE" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
ch = randomint( 100 );
|
||||
if ( ch < 4 )
|
||||
{
|
||||
playfxontag( level._effect[ "fx_zmb_taser_vomit" ], self, "j_neck" );
|
||||
}
|
||||
if ( level.use_tazer_impact_fx )
|
||||
{
|
||||
tags = [];
|
||||
tags[ 0 ] = "J_Head";
|
||||
tags[ 1 ] = "J_Neck";
|
||||
playfxontag( level._effect[ "fx_zmb_tazer_impact" ], self, random( tags ) );
|
||||
}
|
||||
}
|
||||
if ( isdefined( self.isscreecher ) && self.isscreecher || isdefined( self.is_avogadro ) && self.is_avogadro )
|
||||
return;
|
||||
|
||||
while ( isdefined( self ) && isalive( self ) )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, point, type );
|
||||
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( attacker ) || !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( type != "MOD_MELEE" )
|
||||
continue;
|
||||
|
||||
if ( !attacker hasweapon( "tazer_knuckles_zm" ) || isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped )
|
||||
continue;
|
||||
|
||||
ch = randomint( 100 );
|
||||
|
||||
if ( ch < 4 )
|
||||
playfxontag( level._effect["fx_zmb_taser_vomit"], self, "j_neck" );
|
||||
|
||||
if ( level.use_tazer_impact_fx )
|
||||
{
|
||||
tags = [];
|
||||
tags[0] = "J_Head";
|
||||
tags[1] = "J_Neck";
|
||||
playfxontag( level._effect["fx_zmb_tazer_impact"], self, random( tags ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
self thread onplayerspawned();
|
||||
self thread onplayerspawned();
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread watchtazerknucklemelee();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread watchtazerknucklemelee();
|
||||
}
|
||||
}
|
||||
|
||||
watchtazerknucklemelee()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "weapon_melee", weapon );
|
||||
if ( weapon == "tazer_knuckles_zm" )
|
||||
{
|
||||
self tazerknuckle_melee();
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "weapon_melee", weapon );
|
||||
|
||||
if ( weapon == "tazer_knuckles_zm" )
|
||||
self tazerknuckle_melee();
|
||||
}
|
||||
}
|
||||
|
||||
tazerknuckle_melee()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
tazer_flourish_fx()
|
||||
{
|
||||
self waittill( "weapon_change", newweapon );
|
||||
if ( newweapon == "zombie_tazer_flourish" )
|
||||
{
|
||||
self endon( "weapon_change" );
|
||||
wait level.tazer_flourish_delay;
|
||||
self thread maps/mp/zombies/_zm_audio::playerexert( "hitmed" );
|
||||
self setclientfieldtoplayer( "tazer_flourish", 1 );
|
||||
wait_network_frame();
|
||||
self setclientfieldtoplayer( "tazer_flourish", 0 );
|
||||
}
|
||||
self waittill( "weapon_change", newweapon );
|
||||
|
||||
if ( newweapon == "zombie_tazer_flourish" )
|
||||
{
|
||||
self endon( "weapon_change" );
|
||||
wait( level.tazer_flourish_delay );
|
||||
self thread maps\mp\zombies\_zm_audio::playerexert( "hitmed" );
|
||||
self setclientfieldtoplayer( "tazer_flourish", 1 );
|
||||
wait_network_frame();
|
||||
self setclientfieldtoplayer( "tazer_flourish", 0 );
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,338 +1,327 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_magicbox;
|
||||
#include maps\mp\zombies\_zm_weapons;
|
||||
#include maps\mp\zombies\_zm_stats;
|
||||
#include maps\mp\zombies\_zm_unitrigger;
|
||||
#include maps\mp\zombies\_zm_audio;
|
||||
|
||||
main()
|
||||
{
|
||||
if ( !isDefined( level.weapon_locker_map ) )
|
||||
{
|
||||
level.weapon_locker_map = level.script;
|
||||
}
|
||||
level.weapon_locker_online = sessionmodeisonlinegame();
|
||||
weapon_lockers = getstructarray( "weapons_locker", "targetname" );
|
||||
array_thread( weapon_lockers, ::triggerweaponslockerwatch );
|
||||
if ( !isdefined( level.weapon_locker_map ) )
|
||||
level.weapon_locker_map = level.script;
|
||||
|
||||
level.weapon_locker_online = sessionmodeisonlinegame();
|
||||
weapon_lockers = getstructarray( "weapons_locker", "targetname" );
|
||||
array_thread( weapon_lockers, ::triggerweaponslockerwatch );
|
||||
}
|
||||
|
||||
wl_has_stored_weapondata()
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
return self has_stored_weapondata( level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
return isDefined( self.stored_weapon_data );
|
||||
}
|
||||
if ( level.weapon_locker_online )
|
||||
return self has_stored_weapondata( level.weapon_locker_map );
|
||||
else
|
||||
return isdefined( self.stored_weapon_data );
|
||||
}
|
||||
|
||||
wl_get_stored_weapondata()
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
return self get_stored_weapondata( level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
return self.stored_weapon_data;
|
||||
}
|
||||
if ( level.weapon_locker_online )
|
||||
return self get_stored_weapondata( level.weapon_locker_map );
|
||||
else
|
||||
return self.stored_weapon_data;
|
||||
}
|
||||
|
||||
wl_clear_stored_weapondata()
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
self clear_stored_weapondata( level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stored_weapon_data = undefined;
|
||||
}
|
||||
if ( level.weapon_locker_online )
|
||||
self clear_stored_weapondata( level.weapon_locker_map );
|
||||
else
|
||||
self.stored_weapon_data = undefined;
|
||||
}
|
||||
|
||||
wl_set_stored_weapondata( weapondata )
|
||||
{
|
||||
if ( level.weapon_locker_online )
|
||||
{
|
||||
self set_stored_weapondata( weapondata, level.weapon_locker_map );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stored_weapon_data = weapondata;
|
||||
}
|
||||
if ( level.weapon_locker_online )
|
||||
self set_stored_weapondata( weapondata, level.weapon_locker_map );
|
||||
else
|
||||
self.stored_weapon_data = weapondata;
|
||||
}
|
||||
|
||||
triggerweaponslockerwatch()
|
||||
{
|
||||
unitrigger_stub = spawnstruct();
|
||||
unitrigger_stub.origin = self.origin;
|
||||
if ( isDefined( self.script_angles ) )
|
||||
{
|
||||
unitrigger_stub.angles = self.script_angles;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.angles = self.angles;
|
||||
}
|
||||
unitrigger_stub.script_angles = unitrigger_stub.angles;
|
||||
if ( isDefined( self.script_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = self.script_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_length = 16;
|
||||
}
|
||||
if ( isDefined( self.script_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = self.script_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_width = 32;
|
||||
}
|
||||
if ( isDefined( self.script_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = self.script_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
unitrigger_stub.script_height = 64;
|
||||
}
|
||||
unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length / 2 );
|
||||
unitrigger_stub.targetname = "weapon_locker";
|
||||
unitrigger_stub.cursor_hint = "HINT_NOICON";
|
||||
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
|
||||
unitrigger_stub.clientfieldname = "weapon_locker";
|
||||
maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
|
||||
unitrigger_stub.prompt_and_visibility_func = ::triggerweaponslockerthinkupdateprompt;
|
||||
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::triggerweaponslockerthink );
|
||||
unitrigger_stub = spawnstruct();
|
||||
unitrigger_stub.origin = self.origin;
|
||||
|
||||
if ( isdefined( self.script_angles ) )
|
||||
unitrigger_stub.angles = self.script_angles;
|
||||
else
|
||||
unitrigger_stub.angles = self.angles;
|
||||
|
||||
unitrigger_stub.script_angles = unitrigger_stub.angles;
|
||||
|
||||
if ( isdefined( self.script_length ) )
|
||||
unitrigger_stub.script_length = self.script_length;
|
||||
else
|
||||
unitrigger_stub.script_length = 16;
|
||||
|
||||
if ( isdefined( self.script_width ) )
|
||||
unitrigger_stub.script_width = self.script_width;
|
||||
else
|
||||
unitrigger_stub.script_width = 32;
|
||||
|
||||
if ( isdefined( self.script_height ) )
|
||||
unitrigger_stub.script_height = self.script_height;
|
||||
else
|
||||
unitrigger_stub.script_height = 64;
|
||||
|
||||
unitrigger_stub.origin -= anglestoright( unitrigger_stub.angles ) * unitrigger_stub.script_length / 2;
|
||||
unitrigger_stub.targetname = "weapon_locker";
|
||||
unitrigger_stub.cursor_hint = "HINT_NOICON";
|
||||
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
|
||||
unitrigger_stub.clientfieldname = "weapon_locker";
|
||||
maps\mp\zombies\_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
|
||||
unitrigger_stub.prompt_and_visibility_func = ::triggerweaponslockerthinkupdateprompt;
|
||||
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::triggerweaponslockerthink );
|
||||
}
|
||||
|
||||
triggerweaponslockerisvalidweapon( weaponname )
|
||||
{
|
||||
weaponname = get_base_weapon_name( weaponname, 1 );
|
||||
if ( !is_weapon_included( weaponname ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
weaponname = get_base_weapon_name( weaponname, 1 );
|
||||
|
||||
if ( !is_weapon_included( weaponname ) )
|
||||
return false;
|
||||
|
||||
if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
triggerweaponslockerisvalidweaponpromptupdate( player, weaponname )
|
||||
{
|
||||
retrievingweapon = player wl_has_stored_weapondata();
|
||||
if ( !retrievingweapon )
|
||||
{
|
||||
weaponname = player get_nonalternate_weapon( weaponname );
|
||||
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_STORE" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weapondata = player wl_get_stored_weapondata();
|
||||
if ( isDefined( level.remap_weapon_locker_weapons ) )
|
||||
{
|
||||
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
|
||||
}
|
||||
weapontogive = weapondata[ "name" ];
|
||||
primaries = player getweaponslistprimaries();
|
||||
maxweapons = get_player_weapon_limit( player );
|
||||
weaponname = player get_nonalternate_weapon( weaponname );
|
||||
if ( isDefined( primaries ) || primaries.size >= maxweapons && weapontogive == weaponname )
|
||||
{
|
||||
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_GRAB" );
|
||||
}
|
||||
retrievingweapon = player wl_has_stored_weapondata();
|
||||
|
||||
if ( !retrievingweapon )
|
||||
{
|
||||
weaponname = player get_nonalternate_weapon( weaponname );
|
||||
|
||||
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
else
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_STORE" );
|
||||
}
|
||||
else
|
||||
{
|
||||
weapondata = player wl_get_stored_weapondata();
|
||||
|
||||
if ( isdefined( level.remap_weapon_locker_weapons ) )
|
||||
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
|
||||
|
||||
weapontogive = weapondata["name"];
|
||||
primaries = player getweaponslistprimaries();
|
||||
maxweapons = get_player_weapon_limit( player );
|
||||
weaponname = player get_nonalternate_weapon( weaponname );
|
||||
|
||||
if ( isdefined( primaries ) && primaries.size >= maxweapons || weapontogive == weaponname )
|
||||
{
|
||||
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_GRAB" );
|
||||
}
|
||||
}
|
||||
|
||||
triggerweaponslockerthinkupdateprompt( player )
|
||||
{
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
return 1;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
return 1;
|
||||
}
|
||||
|
||||
triggerweaponslockerthink()
|
||||
{
|
||||
self.parent_player thread triggerweaponslockerweaponchangethink( self );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
retrievingweapon = player wl_has_stored_weapondata();
|
||||
if ( !retrievingweapon )
|
||||
{
|
||||
curweapon = player getcurrentweapon();
|
||||
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
|
||||
while ( !triggerweaponslockerisvalidweapon( curweapon ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
weapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player );
|
||||
player wl_set_stored_weapondata( weapondata );
|
||||
self.parent_player thread triggerweaponslockerweaponchangethink( self );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
|
||||
retrievingweapon = player wl_has_stored_weapondata();
|
||||
|
||||
if ( !retrievingweapon )
|
||||
{
|
||||
curweapon = player getcurrentweapon();
|
||||
curweapon = player maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( curweapon );
|
||||
|
||||
if ( !triggerweaponslockerisvalidweapon( curweapon ) )
|
||||
continue;
|
||||
|
||||
weapondata = player maps\mp\zombies\_zm_weapons::get_player_weapondata( player );
|
||||
player wl_set_stored_weapondata( weapondata );
|
||||
/#
|
||||
assert( curweapon == weapondata[ "name" ], "weapon data does not match" );
|
||||
assert( curweapon == weapondata["name"], "weapon data does not match" );
|
||||
#/
|
||||
player takeweapon( curweapon );
|
||||
primaries = player getweaponslistprimaries();
|
||||
if ( isDefined( primaries[ 0 ] ) )
|
||||
{
|
||||
player switchtoweapon( primaries[ 0 ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
player maps/mp/zombies/_zm_weapons::give_fallback_weapon();
|
||||
}
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
player playsoundtoplayer( "evt_fridge_locker_close", player );
|
||||
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "weapon_storage" );
|
||||
}
|
||||
else
|
||||
{
|
||||
curweapon = player getcurrentweapon();
|
||||
primaries = player getweaponslistprimaries();
|
||||
weapondata = player wl_get_stored_weapondata();
|
||||
if ( isDefined( level.remap_weapon_locker_weapons ) )
|
||||
{
|
||||
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
|
||||
}
|
||||
weapontogive = weapondata[ "name" ];
|
||||
while ( !triggerweaponslockerisvalidweapon( weapontogive ) )
|
||||
{
|
||||
player playlocalsound( level.zmb_laugh_alias );
|
||||
player wl_clear_stored_weapondata();
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
curweap_base = maps/mp/zombies/_zm_weapons::get_base_weapon_name( curweapon, 1 );
|
||||
weap_base = maps/mp/zombies/_zm_weapons::get_base_weapon_name( weapontogive, 1 );
|
||||
while ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
wait 3;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
maxweapons = get_player_weapon_limit( player );
|
||||
if ( isDefined( primaries ) || primaries.size >= maxweapons && weapontogive == curweapon )
|
||||
{
|
||||
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
|
||||
while ( !triggerweaponslockerisvalidweapon( curweapon ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
wait 3;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
curweapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player );
|
||||
player takeweapon( curweapondata[ "name" ] );
|
||||
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata );
|
||||
player wl_clear_stored_weapondata();
|
||||
player wl_set_stored_weapondata( curweapondata );
|
||||
player switchtoweapon( weapondata[ "name" ] );
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "wall_withdrawl" );
|
||||
player wl_clear_stored_weapondata();
|
||||
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata );
|
||||
player switchtoweapon( weapondata[ "name" ] );
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
level notify( "weapon_locker_grab" );
|
||||
player playsoundtoplayer( "evt_fridge_locker_open", player );
|
||||
}
|
||||
wait 0,5;
|
||||
}
|
||||
player takeweapon( curweapon );
|
||||
primaries = player getweaponslistprimaries();
|
||||
|
||||
if ( isdefined( primaries[0] ) )
|
||||
player switchtoweapon( primaries[0] );
|
||||
else
|
||||
player maps\mp\zombies\_zm_weapons::give_fallback_weapon();
|
||||
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
player playsoundtoplayer( "evt_fridge_locker_close", player );
|
||||
player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "weapon_storage" );
|
||||
}
|
||||
else
|
||||
{
|
||||
curweapon = player getcurrentweapon();
|
||||
primaries = player getweaponslistprimaries();
|
||||
weapondata = player wl_get_stored_weapondata();
|
||||
|
||||
if ( isdefined( level.remap_weapon_locker_weapons ) )
|
||||
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
|
||||
|
||||
weapontogive = weapondata["name"];
|
||||
|
||||
if ( !triggerweaponslockerisvalidweapon( weapontogive ) )
|
||||
{
|
||||
player playlocalsound( level.zmb_laugh_alias );
|
||||
player wl_clear_stored_weapondata();
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
continue;
|
||||
}
|
||||
|
||||
curweap_base = maps\mp\zombies\_zm_weapons::get_base_weapon_name( curweapon, 1 );
|
||||
weap_base = maps\mp\zombies\_zm_weapons::get_base_weapon_name( weapontogive, 1 );
|
||||
|
||||
if ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
wait 3;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
continue;
|
||||
}
|
||||
|
||||
maxweapons = get_player_weapon_limit( player );
|
||||
|
||||
if ( isdefined( primaries ) && primaries.size >= maxweapons || weapontogive == curweapon )
|
||||
{
|
||||
curweapon = player maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( curweapon );
|
||||
|
||||
if ( !triggerweaponslockerisvalidweapon( curweapon ) )
|
||||
{
|
||||
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
|
||||
wait 3;
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
continue;
|
||||
}
|
||||
|
||||
curweapondata = player maps\mp\zombies\_zm_weapons::get_player_weapondata( player );
|
||||
player takeweapon( curweapondata["name"] );
|
||||
player maps\mp\zombies\_zm_weapons::weapondata_give( weapondata );
|
||||
player wl_clear_stored_weapondata();
|
||||
player wl_set_stored_weapondata( curweapondata );
|
||||
player switchtoweapon( weapondata["name"] );
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
else
|
||||
{
|
||||
player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "wall_withdrawl" );
|
||||
player wl_clear_stored_weapondata();
|
||||
player maps\mp\zombies\_zm_weapons::weapondata_give( weapondata );
|
||||
player switchtoweapon( weapondata["name"] );
|
||||
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
|
||||
}
|
||||
|
||||
level notify( "weapon_locker_grab" );
|
||||
player playsoundtoplayer( "evt_fridge_locker_open", player );
|
||||
}
|
||||
|
||||
wait 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
triggerweaponslockerweaponchangethink( trigger )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
trigger endon( "kill_trigger" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "weapon_change", newweapon );
|
||||
trigger triggerweaponslockerisvalidweaponpromptupdate( self, newweapon );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
trigger endon( "kill_trigger" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "weapon_change", newweapon );
|
||||
|
||||
trigger triggerweaponslockerisvalidweaponpromptupdate( self, newweapon );
|
||||
}
|
||||
}
|
||||
|
||||
add_weapon_locker_mapping( fromweapon, toweapon )
|
||||
{
|
||||
if ( !isDefined( level.remap_weapon_locker_weapons ) )
|
||||
{
|
||||
level.remap_weapon_locker_weapons = [];
|
||||
}
|
||||
level.remap_weapon_locker_weapons[ fromweapon ] = toweapon;
|
||||
if ( !isdefined( level.remap_weapon_locker_weapons ) )
|
||||
level.remap_weapon_locker_weapons = [];
|
||||
|
||||
level.remap_weapon_locker_weapons[fromweapon] = toweapon;
|
||||
}
|
||||
|
||||
remap_weapon( weapondata, maptable )
|
||||
{
|
||||
name = get_base_name( weapondata[ "name" ] );
|
||||
att = get_attachment_name( weapondata[ "name" ] );
|
||||
if ( isDefined( maptable[ name ] ) )
|
||||
{
|
||||
weapondata[ "name" ] = maptable[ name ];
|
||||
name = weapondata[ "name" ];
|
||||
if ( is_weapon_upgraded( name ) )
|
||||
{
|
||||
if ( isDefined( att ) && weapon_supports_attachments( name ) )
|
||||
{
|
||||
base = get_base_weapon_name( name, 1 );
|
||||
if ( !weapon_supports_this_attachment( base, att ) )
|
||||
{
|
||||
att = random_attachment( base );
|
||||
}
|
||||
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( weapon_supports_default_attachment( name ) )
|
||||
{
|
||||
att = default_attachment( name );
|
||||
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return weapondata;
|
||||
}
|
||||
name = weapondata[ "name" ];
|
||||
dw_name = weapondualwieldweaponname( name );
|
||||
alt_name = weaponaltweaponname( name );
|
||||
if ( name != "none" )
|
||||
{
|
||||
weapondata[ "clip" ] = int( min( weapondata[ "clip" ], weaponclipsize( name ) ) );
|
||||
weapondata[ "stock" ] = int( min( weapondata[ "stock" ], weaponmaxammo( name ) ) );
|
||||
}
|
||||
if ( dw_name != "none" )
|
||||
{
|
||||
weapondata[ "lh_clip" ] = int( min( weapondata[ "lh_clip" ], weaponclipsize( dw_name ) ) );
|
||||
}
|
||||
if ( alt_name != "none" )
|
||||
{
|
||||
weapondata[ "alt_clip" ] = int( min( weapondata[ "alt_clip" ], weaponclipsize( alt_name ) ) );
|
||||
weapondata[ "alt_stock" ] = int( min( weapondata[ "alt_stock" ], weaponmaxammo( alt_name ) ) );
|
||||
}
|
||||
weapondata[ "dw_name" ] = dw_name;
|
||||
weapondata[ "alt_name" ] = alt_name;
|
||||
return weapondata;
|
||||
name = get_base_name( weapondata["name"] );
|
||||
att = get_attachment_name( weapondata["name"] );
|
||||
|
||||
if ( isdefined( maptable[name] ) )
|
||||
{
|
||||
weapondata["name"] = maptable[name];
|
||||
name = weapondata["name"];
|
||||
|
||||
if ( is_weapon_upgraded( name ) )
|
||||
{
|
||||
if ( isdefined( att ) && weapon_supports_attachments( name ) )
|
||||
{
|
||||
base = get_base_weapon_name( name, 1 );
|
||||
|
||||
if ( !weapon_supports_this_attachment( base, att ) )
|
||||
att = random_attachment( base );
|
||||
|
||||
weapondata["name"] = weapondata["name"] + "+" + att;
|
||||
}
|
||||
else if ( weapon_supports_default_attachment( name ) )
|
||||
{
|
||||
att = default_attachment( name );
|
||||
weapondata["name"] = weapondata["name"] + "+" + att;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
return weapondata;
|
||||
|
||||
name = weapondata["name"];
|
||||
dw_name = weapondualwieldweaponname( name );
|
||||
alt_name = weaponaltweaponname( name );
|
||||
|
||||
if ( name != "none" )
|
||||
{
|
||||
weapondata["clip"] = int( min( weapondata["clip"], weaponclipsize( name ) ) );
|
||||
weapondata["stock"] = int( min( weapondata["stock"], weaponmaxammo( name ) ) );
|
||||
}
|
||||
|
||||
if ( dw_name != "none" )
|
||||
weapondata["lh_clip"] = int( min( weapondata["lh_clip"], weaponclipsize( dw_name ) ) );
|
||||
|
||||
if ( alt_name != "none" )
|
||||
{
|
||||
weapondata["alt_clip"] = int( min( weapondata["alt_clip"], weaponclipsize( alt_name ) ) );
|
||||
weapondata["alt_stock"] = int( min( weapondata["alt_stock"], weaponmaxammo( alt_name ) ) );
|
||||
}
|
||||
|
||||
weapondata["dw_name"] = dw_name;
|
||||
weapondata["alt_name"] = alt_name;
|
||||
return weapondata;
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
a[ 0 ] = "c_zom_zombie_buried_sgirl_head1_mp";
|
||||
a[ 1 ] = "c_zom_zombie_buried_sgirl_head2_mp";
|
||||
return a;
|
||||
a[0] = "c_zom_zombie_buried_sgirl_head1_mp";
|
||||
a[1] = "c_zom_zombie_buried_sgirl_head2_mp";
|
||||
return a;
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
a[ 0 ] = "c_zom_zombie_buried_sgirl_body1_mp";
|
||||
a[ 1 ] = "c_zom_zombie_buried_sgirl_body2_mp";
|
||||
a[ 2 ] = "c_zom_zombie_buried_sgirl_body3_mp";
|
||||
return a;
|
||||
a[0] = "c_zom_zombie_buried_sgirl_body1_mp";
|
||||
a[1] = "c_zom_zombie_buried_sgirl_body2_mp";
|
||||
a[2] = "c_zom_zombie_buried_sgirl_body3_mp";
|
||||
return a;
|
||||
}
|
||||
|
@ -1,11 +1,13 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
a[ 0 ] = "c_zom_zombie_buried_sgirl_hair1";
|
||||
a[ 1 ] = "c_zom_zombie_buried_sgirl_hair1_2";
|
||||
a[ 2 ] = "c_zom_zombie_buried_sgirl_hair1_3";
|
||||
a[ 3 ] = "c_zom_zombie_buried_sgirl_hair2";
|
||||
a[ 4 ] = "c_zom_zombie_buried_sgirl_hair2_2";
|
||||
a[ 5 ] = "c_zom_zombie_buried_sgirl_hair1_3";
|
||||
return a;
|
||||
a[0] = "c_zom_zombie_buried_sgirl_hair1";
|
||||
a[1] = "c_zom_zombie_buried_sgirl_hair1_2";
|
||||
a[2] = "c_zom_zombie_buried_sgirl_hair1_3";
|
||||
a[3] = "c_zom_zombie_buried_sgirl_hair2";
|
||||
a[4] = "c_zom_zombie_buried_sgirl_hair2_2";
|
||||
a[5] = "c_zom_zombie_buried_sgirl_hair1_3";
|
||||
return a;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user