mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-08 01:47:50 -05:00
see description
Added several new scripts to the no known errors category, but also moved some scripts to improper debug methods category. Added new scripts that need debugging which includes the remainder of the zombies class of scripts in patch_zm. Updated the debugging script and readme with more exact instructions to its usage. Will work on many of the remaining zombies scripts and eventually move to gametypes_zm scripts.
This commit is contained in:
parent
c06a6c4b00
commit
3b86338236
@ -1,3 +1,6 @@
|
||||
#include maps/mp/_utility;
|
||||
#include maps/common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
debug_tracker();
|
||||
@ -8,13 +11,109 @@ debug_tracker()
|
||||
numberOfScriptsBeingLogged = 0;
|
||||
if ( !isDefined( level.debugLogging ) )
|
||||
{
|
||||
level.debugLogging = 1;
|
||||
level.debugLogging = getDvarIntDefault( "debugModDebugLoggingActive", 1 );
|
||||
}
|
||||
if ( isDefined( level.customZgrief_loaded ) && level.customZgrief_loaded )
|
||||
{
|
||||
level.debugLoggingZgrief = getDvarIntDefault( "debugModDebugLoggingZgrief", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_loaded ) && level.custom_zm_loaded )
|
||||
{
|
||||
level.debugLogging_zm = getDvarIntDefault( "debugModDebugLogging_zm", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_ai_dogs_loaded ) && level.custom_zm_ai_dogs_loaded )
|
||||
{
|
||||
level.debugLogging_zm_ai_dogs = 1;
|
||||
level.debugLogging_zm_ai_dogs = getDvarIntDefault( "debugModDebugLogging_zm_ai_dogs", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
level.player_starting_points = 1000000;
|
||||
if ( isDefined( level.custom_zm_audio_loaded ) && level.custom_zm_audio_loaded )
|
||||
{
|
||||
level.debugLogging_zm_audio = getDvarIntDefault( "debugModDebugLogging_zm_audio", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_magicbox_loaded ) && level.custom_zm_magicbox_loaded )
|
||||
{
|
||||
level.debugLogging_zm_magicbox = getDvarIntDefault( "debugModDebugLogging_zm_magicbox", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_perks_loaded ) && level.custom_zm_perks_loaded )
|
||||
{
|
||||
level.debugLogging_zm_perks = getDvarIntDefault( "debugModDebugLogging_zm_perks", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_perk_electric_cherry_loaded ) && level.custom_zm_perk_electric_cherry_loaded )
|
||||
{
|
||||
level.debugLogging_zm_perk_electric_cherry = getDvarIntDefault( "debugModDebugLogging_zm_perk_electric_cherry", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_powerups_loaded ) && level.custom_zm_powerups_loaded )
|
||||
{
|
||||
level.debugLogging_zm_powerups = getDvarIntDefault( "debugModDebugLogging_zm_powerups", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_spawner_loaded ) && level.custom_zm_spawner_loaded )
|
||||
{
|
||||
level.debugLogging_zm_spawner = getDvarIntDefault( "debugModDebugLogging_zm_spawner", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
if ( isDefined( level.custom_zm_weapons_loaded ) && level.custom_zm_weapons_loaded )
|
||||
{
|
||||
level.debugLogging_zm_weapons = getDvarIntDefault( "debugModDebugLogging_zm_weapons", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
level.player_starting_points = getDvarIntDefault( "debugModStartingPoints", 500 );
|
||||
if ( getDvarIntDefault( "debugModTestBotsEnabled", 0 ) == 1 )
|
||||
{
|
||||
level thread add_bots();
|
||||
}
|
||||
level.errorDisplayLevel = getDvarIntDefault( "debugModErrorDisplay", 0 ); //Use this to choose what is written to the log
|
||||
//Error levels:
|
||||
//0 - Display all types of log messages
|
||||
//1 - Display only errors
|
||||
//2 - Display only warnings
|
||||
//3 - Display only info
|
||||
}
|
||||
|
||||
add_bots()
|
||||
{
|
||||
//Wait for the host!
|
||||
players = get_players();
|
||||
while ( players.size < 1 )
|
||||
{
|
||||
players = get_players();
|
||||
wait 1;
|
||||
}
|
||||
//Then spawn bots
|
||||
botsToSpawn = getDvarIntDefault( "debugModBotsToSpawn", 1 )
|
||||
for ( currentBots = 0; currentBots < botsToSpawn; currentBots++ )
|
||||
{
|
||||
zbot_spawn();
|
||||
wait 1;
|
||||
}
|
||||
SetDvar("bot_AllowMovement", "1");
|
||||
SetDvar("bot_PressAttackBtn", "1");
|
||||
SetDvar("bot_PressMeleeBtn", "1");
|
||||
}
|
||||
|
||||
zbot_spawn()
|
||||
{
|
||||
bot = AddTestClient();
|
||||
if ( !IsDefined( bot ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bot.pers["isBot"] = true;
|
||||
bot.equipment_enabled = false;
|
||||
return bot;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -6,7 +6,17 @@ What is does it override the typical _zm_bot.gsc logic, and replaces it with glo
|
||||
|
||||
**Currently only the following scripts are supported**:
|
||||
```
|
||||
zgrief.gsc
|
||||
_zm_ai_dogs.gsc
|
||||
_zm_audio.gsc
|
||||
_zm_magicbox.gsc
|
||||
_perks.gsc
|
||||
_zm_perk_electric_cherry.gsc
|
||||
_zm_powerups.gsc
|
||||
_zm_spawner.gsc
|
||||
_zm_weapons.gsc
|
||||
|
||||
|
||||
```
|
||||
|
||||
## How it Works
|
||||
@ -14,3 +24,40 @@ _zm_ai_dogs.gsc
|
||||
Compile _zm_bot.gsc as _zm_bot.gsc and place it in maps/mp/zombies. It automatically has the debug variables set to 1 so it will be active.
|
||||
It works by writing to the log useful events that may need monitoring in order to determine broken aspects of the script.
|
||||
To disable it simply remove the mod or modify the vars in the mod.
|
||||
|
||||
## How to Make Use of The Mod
|
||||
|
||||
If you want to debug scripts on your own copy and paste this template into the code you would like to monitor:
|
||||
```
|
||||
if ( ( level.errorDisplayLevel == 0 || level.errorDisplayLevel == 1 ) && level.debugLogging_zm_audio )
|
||||
{
|
||||
logline1 = "ERROR_TYPE: GSC_FILE_NAME.gsc FUNCTION_THIS_IS_CALLED_IN yourtext" + "\n";
|
||||
logprint( logline1 );
|
||||
}
|
||||
```
|
||||
By using this exact template to debug your code you can run multiple loglines that will print to your server log in data/logs.
|
||||
Key:
|
||||
ERROR_TYPE = INFO or ERROR or WARNING use these to indicate whether a log message is just information or is an unexpected error or something isn't right.
|
||||
GSC_FILE_NAME = this is the actual .gsc you are currently debugging this can be useful if you are debugging mutliple scripts at once so it easier to sift thru the log.
|
||||
FUNCTION_THIS_IS_CALLED_IN = use this to indicate what function this log message is inside of to again make it easier to tell what messages are coming from what.
|
||||
If you would like to debug a script that isn't already supported use this template and place it in the very top of the init() in whatever script you would like to debug:
|
||||
```
|
||||
//begin debug code
|
||||
level.custom_GSC_FILE_NAME_loaded = 1;
|
||||
maps/mp/zombies/_zm_bot::init();
|
||||
if ( !isDefined( level.debugLogging_GSC_FILE_NAME ) )
|
||||
{
|
||||
level.debugLogging_GSC_FILE_NAME = 0;
|
||||
}
|
||||
//end debug code
|
||||
```
|
||||
and then put this in the _zm_bot.gsc debug_tracker() included with this guide:
|
||||
```
|
||||
if ( isDefined( level.custom_GSC_FILE_NAME_loaded ) && level.custom_GSC_FILE_NAME_loaded )
|
||||
{
|
||||
level.debugLogging_GSC_FILE_NAME = getDvarIntDefault( "debugModDebugLogging_GSC_FILE_NAME", 1 );
|
||||
numberOfScriptsBeingLogged++;
|
||||
}
|
||||
```
|
||||
In both of these replace GSC_FILE_NAME with the name of the .gsc you are debugging.
|
||||
|
||||
|
@ -47,3 +47,4 @@ This can also happen when a client connects so controls are frozen.
|
||||
|
||||
This can also happen with a blackscreen that doesn't pass.
|
||||
|
||||
|
||||
|
@ -20,15 +20,12 @@
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
main()
|
||||
main() //checked matches cerberus output
|
||||
{
|
||||
//the bare minimum for a zombies game
|
||||
maps/mp/gametypes_zm/_globallogic::init();
|
||||
maps/mp/gametypes_zm/_callbacksetup::setupcallbacks();
|
||||
globallogic_setupdefault_zombiecallbacks();
|
||||
menu_init();
|
||||
|
||||
//controls several gamemode specific variables non essential
|
||||
registerroundlimit( 1, 1 );
|
||||
registertimelimit( 0, 0 );
|
||||
registerscorelimit( 0, 0 );
|
||||
@ -38,9 +35,6 @@ main()
|
||||
maps/mp/gametypes_zm/_weapons::registerthrowngrenadeduddvar( level.gametype, 0, 0, 1440 );
|
||||
maps/mp/gametypes_zm/_weapons::registerkillstreakdelay( level.gametype, 0, 0, 1440 );
|
||||
maps/mp/gametypes_zm/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 );
|
||||
|
||||
|
||||
//determines many aspects of the game non essential
|
||||
level.takelivesondeath = 1;
|
||||
level.teambased = 1;
|
||||
level.disableprematchmessages = 1;
|
||||
@ -60,14 +54,11 @@ main()
|
||||
level.dontshowendreason = 1;
|
||||
level.forceallallies = 0;
|
||||
level.allow_teamchange = 0;
|
||||
|
||||
//non essential dvars
|
||||
setdvar( "scr_disable_team_selection", 1 );
|
||||
makedvarserverinfo( "scr_disable_team_selection", 1 );
|
||||
setmatchflag( "hud_zombie", 1 );
|
||||
setdvar( "scr_disable_weapondrop", 1 );
|
||||
setdvar( "scr_xpscale", 0 );
|
||||
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level.onspawnplayer = ::blank;
|
||||
level.onspawnplayerunified = ::onspawnplayerunified;
|
||||
@ -77,12 +68,8 @@ main()
|
||||
set_game_var( "ZM_scoreLimit", 1 );
|
||||
set_game_var( "_team1_num", 0 );
|
||||
set_game_var( "_team2_num", 0 );
|
||||
|
||||
//all working non essential
|
||||
map_name = level.script;
|
||||
mode = getDvar( "ui_gametype" );
|
||||
|
||||
//condition was incorrect
|
||||
if ( !isDefined( mode ) && isDefined( level.default_game_mode ) || mode == "" && isDefined( level.default_game_mode ) )
|
||||
{
|
||||
mode = level.default_game_mode;
|
||||
@ -97,8 +84,6 @@ main()
|
||||
set_gamemode_var_once( "location", location );
|
||||
set_gamemode_var_once( "randomize_mode", getDvarInt( "zm_rand_mode" ) );
|
||||
set_gamemode_var_once( "randomize_location", getDvarInt( "zm_rand_loc" ) );
|
||||
|
||||
//non essential vars
|
||||
set_gamemode_var_once( "team_1_score", 0 );
|
||||
set_gamemode_var_once( "team_2_score", 0 );
|
||||
set_gamemode_var_once( "current_round", 0 );
|
||||
@ -114,8 +99,6 @@ main()
|
||||
set_gamemode_var( "match_end_notify", undefined );
|
||||
set_gamemode_var( "match_end_func", undefined );
|
||||
setscoreboardcolumns( "score", "kills", "downs", "revives", "headshots" );
|
||||
|
||||
//causes no crashes probably fine
|
||||
onplayerconnect_callback( ::onplayerconnect_check_for_hotjoin );
|
||||
}
|
||||
|
||||
@ -248,54 +231,57 @@ globallogic_setupdefault_zombiecallbacks() //checked matches cerberus output
|
||||
setup_standard_objects( location ) //checked partially used cerberus output
|
||||
{
|
||||
structs = getstructarray( "game_mode_object" );
|
||||
foreach ( struct in structs )
|
||||
i = 0;
|
||||
while ( i < structs.size )
|
||||
{
|
||||
if ( isdefined( struct.script_noteworthy ) && struct.script_noteworthy != location )
|
||||
if ( isdefined( structs[ i ].script_noteworthy ) && structs[ i ].script_noteworthy != location )
|
||||
{
|
||||
//continue;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( struct.script_string ) )
|
||||
if ( isdefined( structs[ i ].script_string ) )
|
||||
{
|
||||
keep = 0;
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
_a300 = tokens;
|
||||
_k300 = getFirstArrayKey( _a300 );
|
||||
while ( isDefined( _k300 ) )
|
||||
tokens = strtok( structs[ i ].script_string, " " );
|
||||
i = 0;
|
||||
while ( i < tokens.size )
|
||||
{
|
||||
token = _a300[ _k300 ];
|
||||
if(token == level.scr_zm_ui_gametype && token != "zstandard")
|
||||
if ( tokens[ i ] == level.scr_zm_ui_gametype && tokens[ i ] != "zstandard" )
|
||||
{
|
||||
keep = 1;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( tokens[ i ] == "zstandard" )
|
||||
{
|
||||
keep = 1;
|
||||
}
|
||||
if(token == "zstandard")
|
||||
{
|
||||
keep = 1;
|
||||
}
|
||||
_k300 = getNextArrayKey( _a300, _k300 );
|
||||
}
|
||||
if ( !keep )
|
||||
{
|
||||
//break;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
barricade = spawn("script_model", struct.origin);
|
||||
barricade.angles = struct.angles;
|
||||
barricade setmodel(struct.script_parameters);
|
||||
barricade = spawn( "script_model", structs[ i ].origin );
|
||||
barricade.angles = structs[ i ].angles;
|
||||
barricade setmodel( structs[ i ].script_parameters );
|
||||
}
|
||||
objects = getentarray();
|
||||
foreach ( object in objects )
|
||||
i = 0;
|
||||
while ( i < objects.size )
|
||||
{
|
||||
if ( !object is_survival_object() )
|
||||
if ( !objects[ i ] is_survival_object() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
if ( isdefined( objects[ i ].spawnflags ) && objects[ i ].spawnflags == 1 && objects[ i ].classname != "trigger_multiple" )
|
||||
{
|
||||
if ( isdefined(object.spawnflags) && object.spawnflags == 1 && object.classname != "trigger_multiple" )
|
||||
{
|
||||
object connectpaths();
|
||||
}
|
||||
object delete();
|
||||
objects[ i ] connectpaths();
|
||||
}
|
||||
objects[ i ] delete();
|
||||
i++;
|
||||
}
|
||||
if ( isdefined( level._classic_setup_func ) )
|
||||
{
|
||||
@ -1444,34 +1430,6 @@ onspawnplayer( predictedspawn ) //fixed checked changed partially to match cerbe
|
||||
|
||||
spawnpoints = [];
|
||||
structs = getstructarray( "initial_spawn", "script_noteworthy" );
|
||||
/*
|
||||
if ( isDefined( structs ) )
|
||||
{
|
||||
_a1757 = structs;
|
||||
_k1757 = getFirstArrayKey( _a1757 );
|
||||
while ( isDefined( _k1757 ) )
|
||||
{
|
||||
struct = _a1757[ _k1757 ];
|
||||
if ( isDefined( struct.script_string ) )
|
||||
{
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
_a1763 = tokens;
|
||||
_k1763 = getFirstArrayKey( _a1763 );
|
||||
while ( isDefined( _k1763 ) )
|
||||
{
|
||||
token = _a1763[ _k1763 ];
|
||||
if ( token == match_string )
|
||||
{
|
||||
spawnpoints[ spawnpoints.size ] = struct;
|
||||
|
||||
}
|
||||
_k1763 = getNextArrayKey( _a1763, _k1763 );
|
||||
}
|
||||
}
|
||||
_k1757 = getNextArrayKey( _a1757, _k1757 );
|
||||
}
|
||||
}
|
||||
*/
|
||||
if ( isdefined( structs ) )
|
||||
{
|
||||
i = 0;
|
||||
@ -1865,7 +1823,7 @@ kill_all_zombies() //changed to match cerberus output
|
||||
if ( isdefined( zombie ) )
|
||||
{
|
||||
zombie dodamage( zombie.maxhealth * 2, zombie.origin, zombie, zombie, "none", "MOD_SUICIDE" );
|
||||
wait(0.05);
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2042,3 +2000,5 @@ blank()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main( bscriptgened, bcsvgened, bsgenabled )
|
||||
main( bscriptgened, bcsvgened, bsgenabled ) //checked partially changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( level.script_gen_dump_reasons ) )
|
||||
{
|
||||
@ -35,7 +35,10 @@ main( bscriptgened, bcsvgened, bsgenabled )
|
||||
level.bscriptgened = bscriptgened;
|
||||
level._loadstarted = 1;
|
||||
struct_class_init();
|
||||
level.clientscripts = getDvar( "cg_usingClientScripts" ) != "";
|
||||
if ( getDvar( "cg_usingClientScripts" ) != "" ) //changed at own discretion
|
||||
{
|
||||
level.clientscripts = getDvar( "cg_usingClientScripts" );
|
||||
}
|
||||
level._client_exploders = [];
|
||||
level._client_exploder_ids = [];
|
||||
if ( !isDefined( level.flag ) )
|
||||
@ -62,13 +65,11 @@ main( bscriptgened, bcsvgened, bsgenabled )
|
||||
{
|
||||
script_gen_dump_addline( "maps\\mp\\createfx\\" + level.script + "_fx::main();", level.script + "_fx" );
|
||||
}
|
||||
while ( isDefined( level.script_gen_dump_preload ) )
|
||||
if ( isDefined( level.script_gen_dump_preload ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level.script_gen_dump_preload.size )
|
||||
for ( i = 0; i < level.script_gen_dump_preload.size; i++ )
|
||||
{
|
||||
script_gen_dump_addline( level.script_gen_dump_preload[ i ].string, level.script_gen_dump_preload[ i ].signature );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( getDvar( "scr_RequiredMapAspectratio" ) == "" )
|
||||
@ -93,7 +94,10 @@ main( bscriptgened, bcsvgened, bsgenabled )
|
||||
level.physicstracemaskwater = 4;
|
||||
level.physicstracemaskclip = 8;
|
||||
level.physicstracecontentsvehicleclip = 16;
|
||||
level.createfx_enabled = getDvar( "createfx" ) != "";
|
||||
if ( getDvar( "createfx" ) != "" ) //changed at own discretion
|
||||
{
|
||||
level.createfx_enabled = getDvar( "createfx" );
|
||||
}
|
||||
level thread start_intro_screen_zm();
|
||||
thread maps/mp/_interactive_objects::init();
|
||||
maps/mp/_audio::init();
|
||||
@ -130,8 +134,7 @@ main( bscriptgened, bcsvgened, bsgenabled )
|
||||
}
|
||||
thread maps/mp/_global_fx::main();
|
||||
maps/mp/_demo::init();
|
||||
p = 0;
|
||||
while ( p < 6 )
|
||||
for ( p = 0; p < 6; p++ )
|
||||
{
|
||||
switch( p )
|
||||
{
|
||||
@ -160,8 +163,7 @@ main( bscriptgened, bcsvgened, bsgenabled )
|
||||
break;
|
||||
}
|
||||
triggers = getentarray( triggertype, "classname" );
|
||||
i = 0;
|
||||
while ( i < triggers.size )
|
||||
for ( i = 0; i < triggers.size; i++ )
|
||||
{
|
||||
if ( isDefined( triggers[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
@ -171,13 +173,11 @@ main( bscriptgened, bcsvgened, bsgenabled )
|
||||
{
|
||||
level thread maps/mp/zombies/_load::exploder_load( triggers[ i ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
level_notify_listener()
|
||||
level_notify_listener() //checked matches cerberus output
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
@ -191,7 +191,7 @@ level_notify_listener()
|
||||
}
|
||||
}
|
||||
|
||||
client_notify_listener()
|
||||
client_notify_listener() //checked matches cerberus output
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
@ -205,7 +205,7 @@ client_notify_listener()
|
||||
}
|
||||
}
|
||||
|
||||
footsteps()
|
||||
footsteps() //checked matches cerberus output
|
||||
{
|
||||
if ( is_true( level.fx_exclude_footsteps ) )
|
||||
{
|
||||
@ -230,10 +230,9 @@ footsteps()
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "wood", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
}
|
||||
|
||||
parse_structs()
|
||||
parse_structs() //checked matches cerberus output
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level.struct.size )
|
||||
for ( i = 0; i < level.struct.size; i++ )
|
||||
{
|
||||
if ( isDefined( level.struct[ i ].targetname ) )
|
||||
{
|
||||
@ -253,11 +252,10 @@ parse_structs()
|
||||
level._effect[ "spotlight_beam" ] = loadfx( "env/light/fx_ray_spotlight_md" );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
exploder_load( trigger )
|
||||
exploder_load( trigger ) //checked matches cerberus output
|
||||
{
|
||||
level endon( "killexplodertridgers" + trigger.script_exploder );
|
||||
trigger waittill( "trigger" );
|
||||
@ -278,15 +276,13 @@ exploder_load( trigger )
|
||||
level notify( "killexplodertridgers" + trigger.script_exploder );
|
||||
}
|
||||
|
||||
setupexploders()
|
||||
setupexploders() //checked partially changed to match cerberus output
|
||||
{
|
||||
ents = getentarray( "script_brushmodel", "classname" );
|
||||
smodels = getentarray( "script_model", "classname" );
|
||||
i = 0;
|
||||
while ( i < smodels.size )
|
||||
for ( i = 0; i < smodels.size; i++ )
|
||||
{
|
||||
ents[ ents.size ] = smodels[ i ];
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < ents.size )
|
||||
@ -303,8 +299,6 @@ setupexploders()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploder" )
|
||||
{
|
||||
ents[ i ] hide();
|
||||
@ -312,22 +306,17 @@ setupexploders()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploderchunk" )
|
||||
{
|
||||
ents[ i ] hide();
|
||||
ents[ i ] notsolid();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
script_exploders = [];
|
||||
potentialexploders = getentarray( "script_brushmodel", "classname" );
|
||||
i = 0;
|
||||
while ( i < potentialexploders.size )
|
||||
for ( i = 0; i < potentialexploders.size; i++ )
|
||||
{
|
||||
if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
@ -337,11 +326,9 @@ setupexploders()
|
||||
{
|
||||
script_exploders[ script_exploders.size ] = potentialexploders[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
potentialexploders = getentarray( "script_model", "classname" );
|
||||
i = 0;
|
||||
while ( i < potentialexploders.size )
|
||||
for ( i = 0; i < potentialexploders.size; i++ )
|
||||
{
|
||||
if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
@ -351,11 +338,9 @@ setupexploders()
|
||||
{
|
||||
script_exploders[ script_exploders.size ] = potentialexploders[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
potentialexploders = getentarray( "item_health", "classname" );
|
||||
i = 0;
|
||||
while ( i < potentialexploders.size )
|
||||
for ( i = 0; i < potentialexploders.size; i++ )
|
||||
{
|
||||
if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
@ -365,7 +350,6 @@ setupexploders()
|
||||
{
|
||||
script_exploders[ script_exploders.size ] = potentialexploders[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !isDefined( level.createfxent ) )
|
||||
{
|
||||
@ -375,8 +359,7 @@ setupexploders()
|
||||
acceptabletargetnames[ "exploderchunk visible" ] = 1;
|
||||
acceptabletargetnames[ "exploderchunk" ] = 1;
|
||||
acceptabletargetnames[ "exploder" ] = 1;
|
||||
i = 0;
|
||||
while ( i < script_exploders.size )
|
||||
for ( i = 0; i < script_exploders.size; i++ )
|
||||
{
|
||||
exploder = script_exploders[ i ];
|
||||
ent = createexploder( exploder.script_fxid );
|
||||
@ -435,7 +418,6 @@ setupexploders()
|
||||
ent.v[ "exploder_type" ] = "normal";
|
||||
}
|
||||
ent maps/mp/_createfx::post_entity_creation_function();
|
||||
i++;
|
||||
}
|
||||
level.createfxexploders = [];
|
||||
i = 0;
|
||||
@ -447,35 +429,30 @@ setupexploders()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
ent.v[ "exploder_id" ] = getexploderid( ent );
|
||||
if ( !isDefined( level.createfxexploders[ ent.v[ "exploder" ] ] ) )
|
||||
{
|
||||
level.createfxexploders[ ent.v[ "exploder" ] ] = [];
|
||||
}
|
||||
level.createfxexploders[ ent.v[ "exploder" ] ][ level.createfxexploders[ ent.v[ "exploder" ] ].size ] = ent;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
setup_traversals()
|
||||
setup_traversals() //checked changed to match cerberus output
|
||||
{
|
||||
potential_traverse_nodes = getallnodes();
|
||||
i = 0;
|
||||
while ( i < potential_traverse_nodes.size )
|
||||
for ( i = 0; i < potential_traverse_nodes.size; i++ )
|
||||
{
|
||||
node = potential_traverse_nodes[ i ];
|
||||
if ( node.type == "Begin" )
|
||||
{
|
||||
node maps/mp/animscripts/traverse/shared::init_traverse();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
calculate_map_center()
|
||||
calculate_map_center() //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( level.mapcenter ) )
|
||||
{
|
||||
@ -491,7 +468,7 @@ calculate_map_center()
|
||||
}
|
||||
}
|
||||
|
||||
start_intro_screen_zm()
|
||||
start_intro_screen_zm() //checked changed to match cerberus output
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
@ -512,12 +489,11 @@ start_intro_screen_zm()
|
||||
}
|
||||
level.introscreen.alpha = 1;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ] freezecontrols( 1 );
|
||||
i++;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
|
||||
|
||||
|
2513
patch_zm/maps/mp/zombies/_zm_blockers.gsc
Normal file
2513
patch_zm/maps/mp/zombies/_zm_blockers.gsc
Normal file
File diff suppressed because it is too large
Load Diff
3195
patch_zm/maps/mp/zombies/_zm_buildables.gsc
Normal file
3195
patch_zm/maps/mp/zombies/_zm_buildables.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2344
patch_zm/maps/mp/zombies/_zm_devgui.gsc
Normal file
2344
patch_zm/maps/mp/zombies/_zm_devgui.gsc
Normal file
File diff suppressed because it is too large
Load Diff
789
patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc
Normal file
789
patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc
Normal file
@ -0,0 +1,789 @@
|
||||
#include maps/mp/zombies/_zm_buildables;
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_power;
|
||||
#include maps/mp/gametypes_zm/_weaponobjects;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "zombie_turbine" );
|
||||
|
||||
init( hint, howto )
|
||||
{
|
||||
if ( !isDefined( hint ) )
|
||||
{
|
||||
hint = &"ZOMBIE_EQUIP_TURBINE_PICKUP_HINT_STRING";
|
||||
}
|
||||
if ( !isDefined( howto ) )
|
||||
{
|
||||
howto = &"ZOMBIE_EQUIP_TURBINE_HOWTO";
|
||||
}
|
||||
if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_turbine_zm" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.turbine_name = "equip_turbine_zm";
|
||||
maps/mp/zombies/_zm_equipment::register_equipment( "equip_turbine_zm", hint, howto, "turbine_zm_icon", "turbine", undefined, ::transferturbine, ::dropturbine, ::pickupturbine, ::placeturbine );
|
||||
maps/mp/zombies/_zm_equipment::add_placeable_equipment( "equip_turbine_zm", "p6_anim_zm_buildable_turbine", ::destroy_placed_turbine );
|
||||
level thread onplayerconnect();
|
||||
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "equip_turbine", hint );
|
||||
level._effect[ "turbine_on" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_on" );
|
||||
level._effect[ "turbine_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_med" );
|
||||
level._effect[ "turbine_low" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_low" );
|
||||
level._effect[ "turbine_aoe" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_aoe" );
|
||||
level._turbine_disappear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_turbine_explo" );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread setupwatchers();
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread watchturbineuse();
|
||||
}
|
||||
}
|
||||
|
||||
setupwatchers()
|
||||
{
|
||||
self waittill( "weapon_watchers_created" );
|
||||
watcher = maps/mp/gametypes_zm/_weaponobjects::getweaponobjectwatcher( "equip_turbine" );
|
||||
watcher.onspawnretrievetriggers = ::maps/mp/zombies/_zm_equipment::equipment_onspawnretrievableweaponobject;
|
||||
}
|
||||
|
||||
watchturbineuse()
|
||||
{
|
||||
self notify( "watchTurbineUse" );
|
||||
self endon( "watchTurbineUse" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "equipment_placed", weapon, weapname );
|
||||
if ( weapname == level.turbine_name )
|
||||
{
|
||||
self cleanupoldturbine();
|
||||
self.buildableturbine = weapon;
|
||||
self thread startturbinedeploy( weapon );
|
||||
level notify( "turbine_deployed" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cleanupoldturbine( preserve_state )
|
||||
{
|
||||
if ( isDefined( self.localpower ) )
|
||||
{
|
||||
maps/mp/zombies/_zm_power::end_local_power( self.localpower );
|
||||
self notify( "depower_on_disconnect" );
|
||||
self.localpower = undefined;
|
||||
self.turbine_power_is_on = 0;
|
||||
}
|
||||
self.turbine_is_powering_on = 0;
|
||||
if ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
if ( isDefined( self.buildableturbine.stub ) )
|
||||
{
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturbine.stub );
|
||||
self.buildableturbine.stub = undefined;
|
||||
}
|
||||
self.buildableturbine stoploopsound();
|
||||
self.buildableturbine delete();
|
||||
if ( isDefined( preserve_state ) && !preserve_state )
|
||||
{
|
||||
self.turbine_health = undefined;
|
||||
self.turbine_emped = undefined;
|
||||
self.turbine_emp_time = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchforcleanup()
|
||||
{
|
||||
self notify( "turbine_cleanup" );
|
||||
self endon( "turbine_cleanup" );
|
||||
evt = self waittill_any_return( "death_or_disconnect", "equip_turbine_zm_taken", "equip_turbine_zm_pickup" );
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self cleanupoldturbine( evt == "equip_turbine_zm_pickup" );
|
||||
}
|
||||
}
|
||||
|
||||
depower_on_disconnect( localpower )
|
||||
{
|
||||
self notify( "depower_on_disconnect" );
|
||||
self endon( "depower_on_disconnect" );
|
||||
self waittill( "disconnect" );
|
||||
if ( isDefined( localpower ) )
|
||||
{
|
||||
maps/mp/zombies/_zm_power::end_local_power( localpower );
|
||||
}
|
||||
}
|
||||
|
||||
placeturbine( origin, angles )
|
||||
{
|
||||
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_turbine", "equip_turbine_zm", origin, angles );
|
||||
return item;
|
||||
}
|
||||
|
||||
dropturbine()
|
||||
{
|
||||
item = thread maps/mp/zombies/_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_turbine", "equip_turbine_zm", self.origin, self.angles );
|
||||
if ( isDefined( item ) )
|
||||
{
|
||||
item.turbine_power_on = self.turbine_power_on;
|
||||
item.turbine_power_level = self.turbine_power_level;
|
||||
item.turbine_round_start = self.turbine_round_start;
|
||||
item.turbine_health = self.turbine_health;
|
||||
item.turbine_emped = self.turbine_emped;
|
||||
item.turbine_emp_time = self.turbine_emp_time;
|
||||
}
|
||||
self.turbine_is_powering_on = undefined;
|
||||
self.turbine_power_on = undefined;
|
||||
self.turbine_power_level = undefined;
|
||||
self.turbine_round_start = undefined;
|
||||
self.turbine_health = undefined;
|
||||
self.turbine_emped = undefined;
|
||||
self.turbine_emp_time = undefined;
|
||||
return item;
|
||||
}
|
||||
|
||||
pickupturbine( item )
|
||||
{
|
||||
item.owner = self;
|
||||
self.turbine_power_on = item.turbine_power_on;
|
||||
item.turbine_power_on = undefined;
|
||||
self.turbine_power_level = item.turbine_power_level;
|
||||
self.turbine_round_start = item.turbine_round_start;
|
||||
self.turbine_health = item.turbine_health;
|
||||
item.turbine_health = undefined;
|
||||
item.turbine_power_level = undefined;
|
||||
item.turbine_round_start = undefined;
|
||||
self.turbine_emped = item.turbine_emped;
|
||||
self.turbine_emp_time = item.turbine_emp_time;
|
||||
item.turbine_emped = undefined;
|
||||
item.turbine_emp_time = undefined;
|
||||
self.turbine_is_powering_on = undefined;
|
||||
}
|
||||
|
||||
transferturbine( fromplayer, toplayer )
|
||||
{
|
||||
while ( isDefined( toplayer.turbine_is_powering_on ) || toplayer.turbine_is_powering_on && isDefined( fromplayer.turbine_is_powering_on ) && fromplayer.turbine_is_powering_on )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
if ( isDefined( fromplayer.buildableturbine ) && isDefined( fromplayer.buildableturbine.dying ) && fromplayer.buildableturbine.dying )
|
||||
{
|
||||
fromplayer cleanupoldturbine( 0 );
|
||||
}
|
||||
if ( isDefined( toplayer.buildableturbine ) && isDefined( toplayer.buildableturbine.dying ) && toplayer.buildableturbine.dying )
|
||||
{
|
||||
toplayer cleanupoldturbine( 0 );
|
||||
}
|
||||
buildableturbine = toplayer.buildableturbine;
|
||||
localpower = toplayer.localpower;
|
||||
turbine_power_on = toplayer.turbine_power_on;
|
||||
turbine_power_is_on = toplayer.turbine_power_is_on;
|
||||
turbine_power_level = toplayer.turbine_power_level;
|
||||
turbine_round_start = toplayer.turbine_round_start;
|
||||
turbine_health = toplayer.turbine_health;
|
||||
turbine_emped = toplayer.turbine_emped;
|
||||
turbine_emp_time = toplayer.turbine_emp_time;
|
||||
toplayer.buildableturbine = fromplayer.buildableturbine;
|
||||
fromplayer.buildableturbine = buildableturbine;
|
||||
toplayer.localpower = fromplayer.localpower;
|
||||
fromplayer.localpower = localpower;
|
||||
toplayer.turbine_power_on = fromplayer.turbine_power_on;
|
||||
fromplayer.turbine_power_on = turbine_power_on;
|
||||
toplayer.turbine_power_is_on = fromplayer.turbine_power_is_on;
|
||||
fromplayer.turbine_power_is_on = turbine_power_is_on;
|
||||
toplayer.turbine_power_level = fromplayer.turbine_power_level;
|
||||
toplayer.turbine_round_start = fromplayer.turbine_round_start;
|
||||
fromplayer.turbine_power_level = turbine_power_level;
|
||||
fromplayer.turbine_round_start = turbine_round_start;
|
||||
toplayer.turbine_health = fromplayer.turbine_health;
|
||||
fromplayer.turbine_health = turbine_health;
|
||||
toplayer.turbine_emped = fromplayer.turbine_emped;
|
||||
fromplayer.turbine_emped = turbine_emped;
|
||||
toplayer.turbine_emp_time = fromplayer.turbine_emp_time;
|
||||
fromplayer.turbine_emp_time = turbine_emp_time;
|
||||
toplayer.turbine_is_powering_on = undefined;
|
||||
fromplayer.turbine_is_powering_on = undefined;
|
||||
toplayer notify( "equip_turbine_zm_taken" );
|
||||
toplayer.buildableturbine.original_owner = toplayer;
|
||||
toplayer thread startturbinedeploy( toplayer.buildableturbine );
|
||||
fromplayer notify( "equip_turbine_zm_taken" );
|
||||
if ( isDefined( fromplayer.buildableturbine ) )
|
||||
{
|
||||
fromplayer thread startturbinedeploy( fromplayer.buildableturbine );
|
||||
fromplayer.buildableturbine.original_owner = fromplayer;
|
||||
fromplayer.buildableturbine.owner = fromplayer;
|
||||
}
|
||||
else
|
||||
{
|
||||
fromplayer maps/mp/zombies/_zm_equipment::equipment_release( "equip_turbine_zm" );
|
||||
}
|
||||
}
|
||||
|
||||
startturbinedeploy( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self thread watchforcleanup();
|
||||
origin = weapon.origin;
|
||||
powerradius = 335;
|
||||
if ( !isDefined( self.turbine_health ) )
|
||||
{
|
||||
self.turbine_health = 1200;
|
||||
self.turbine_power_level = 4;
|
||||
self.turbine_power_on = 1;
|
||||
self.turbine_is_powering_on = undefined;
|
||||
}
|
||||
if ( !isDefined( self.turbine_round_start ) )
|
||||
{
|
||||
self.turbine_round_start = level.round_number;
|
||||
self.turbine_power_on = 1;
|
||||
}
|
||||
self thread turbinedecay();
|
||||
self thread turbinepowerdiminish( origin, powerradius );
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
/#
|
||||
self thread debugturbine( powerradius );
|
||||
#/
|
||||
self thread turbineaudio();
|
||||
self thread turbineanim();
|
||||
self thread turbinepowerthink( weapon, powerradius );
|
||||
if ( isDefined( weapon.equipment_can_move ) && weapon.equipment_can_move )
|
||||
{
|
||||
self thread turbinepowermove( weapon );
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( weapon );
|
||||
weapon waittill( "death" );
|
||||
self thread turbinepoweroff( origin, powerradius );
|
||||
self notify( "turbine_cleanup" );
|
||||
}
|
||||
}
|
||||
|
||||
turbine_watch_for_emp( weapon, powerradius )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
if ( !should_watch_for_emp() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "emp_detonate", origin, radius );
|
||||
if ( distancesquared( origin, self.buildableturbine.origin ) < ( radius * radius ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self.turbine_emped = 1;
|
||||
self.turbine_emp_time = getTime();
|
||||
self notify( "turbine_power_change" );
|
||||
}
|
||||
|
||||
turbinepowerthink( weapon, powerradius )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
origin = weapon.origin;
|
||||
self thread turbine_watch_for_emp( weapon, powerradius );
|
||||
if ( isDefined( self.turbine_power_on ) || self.turbine_power_on && isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
self thread turbinepoweron( origin, powerradius );
|
||||
}
|
||||
while ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
self waittill( "turbine_power_change" );
|
||||
if ( isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
self thread turbinepoweroff( origin, powerradius );
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
origin = weapon.origin;
|
||||
}
|
||||
self thread turbinepoweron( origin, powerradius );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turbine_power_is_on ) && !self.turbine_power_is_on )
|
||||
{
|
||||
self thread turbinepoweroff( origin, powerradius );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
origin = weapon.origin;
|
||||
}
|
||||
self thread turbinepoweron( origin, powerradius );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
turbinepowermove( weapon )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
origin = weapon.origin;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( origin != weapon.origin )
|
||||
{
|
||||
if ( isDefined( self.localpower ) )
|
||||
{
|
||||
self.localpower = maps/mp/zombies/_zm_power::move_local_power( self.localpower, origin );
|
||||
}
|
||||
origin = weapon.origin;
|
||||
}
|
||||
wait 0,5;
|
||||
}
|
||||
}
|
||||
|
||||
turbinewarmup()
|
||||
{
|
||||
if ( isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
emp_time = level.zombie_vars[ "emp_perk_off_time" ];
|
||||
now = getTime();
|
||||
emp_time_left = emp_time - ( ( now - self.turbine_emp_time ) / 1000 );
|
||||
if ( emp_time_left > 0 )
|
||||
{
|
||||
wait emp_time_left;
|
||||
}
|
||||
self.turbine_emped = undefined;
|
||||
self.turbine_emp_time = undefined;
|
||||
}
|
||||
self.buildableturbine maps/mp/zombies/_zm_equipment::signal_equipment_activated( 3 );
|
||||
wait 0,5;
|
||||
self.buildableturbine maps/mp/zombies/_zm_equipment::signal_equipment_activated( 2 );
|
||||
wait 0,5;
|
||||
self.buildableturbine maps/mp/zombies/_zm_equipment::signal_equipment_activated( 1 );
|
||||
wait 0,5;
|
||||
}
|
||||
|
||||
turbinepoweron( origin, powerradius )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
if ( isDefined( self.turbine_power_is_on ) && !self.turbine_power_is_on && isDefined( self.turbine_is_powering_on ) && !self.turbine_is_powering_on && isDefined( self.buildableturbine.dying ) && !self.buildableturbine.dying )
|
||||
{
|
||||
self.turbine_is_powering_on = 1;
|
||||
self.buildableturbine playloopsound( "zmb_turbine_loop", 2 );
|
||||
self turbinewarmup();
|
||||
if ( isDefined( self.localpower ) )
|
||||
{
|
||||
maps/mp/zombies/_zm_power::end_local_power( self.localpower );
|
||||
}
|
||||
self.localpower = undefined;
|
||||
self.turbine_power_is_on = 0;
|
||||
if ( isDefined( self.turbine_emped ) && !self.turbine_emped )
|
||||
{
|
||||
self.localpower = maps/mp/zombies/_zm_power::add_local_power( origin, powerradius );
|
||||
self thread depower_on_disconnect( self.localpower );
|
||||
self.turbine_power_is_on = 1;
|
||||
self thread turbineaudio();
|
||||
}
|
||||
self.turbine_is_powering_on = 0;
|
||||
self thread turbinefx();
|
||||
self thread turbinedecay();
|
||||
}
|
||||
}
|
||||
|
||||
turbinepoweroff( origin, powerradius )
|
||||
{
|
||||
if ( isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on )
|
||||
{
|
||||
if ( isDefined( self.localpower ) )
|
||||
{
|
||||
maps/mp/zombies/_zm_power::end_local_power( self.localpower );
|
||||
}
|
||||
self notify( "depower_on_disconnect" );
|
||||
self.localpower = undefined;
|
||||
self.turbine_power_is_on = 0;
|
||||
self thread turbineaudio();
|
||||
if ( isDefined( self.buildableturbine.dying ) && !self.buildableturbine.dying )
|
||||
{
|
||||
self thread turbineanim();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
turbine_disappear_fx( origin, waittime )
|
||||
{
|
||||
if ( isDefined( waittime ) && waittime > 0 )
|
||||
{
|
||||
wait waittime;
|
||||
}
|
||||
playfx( level._turbine_disappear_fx, origin );
|
||||
if ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
playsoundatposition( "zmb_turbine_explo", self.buildableturbine.origin );
|
||||
}
|
||||
}
|
||||
|
||||
turbinefxonce( withaoe )
|
||||
{
|
||||
if ( isDefined( self ) && isDefined( self.buildableturbine ) && isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on )
|
||||
{
|
||||
value = 0;
|
||||
switch( self.turbine_power_level )
|
||||
{
|
||||
case 3:
|
||||
case 4:
|
||||
value = 1;
|
||||
break;
|
||||
case 2:
|
||||
value = 2;
|
||||
break;
|
||||
case 1:
|
||||
value = 3;
|
||||
break;
|
||||
}
|
||||
if ( withaoe )
|
||||
{
|
||||
if ( isDefined( self.buildableturbine.equipment_can_move ) && self.buildableturbine.equipment_can_move && isDefined( self.buildableturbine.move_parent.ismoving ) && self.buildableturbine.move_parent.ismoving )
|
||||
{
|
||||
value |= 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
value |= 8;
|
||||
}
|
||||
}
|
||||
if ( value && isDefined( self.buildableturbine ) && isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on )
|
||||
{
|
||||
self.buildableturbine thread maps/mp/zombies/_zm_equipment::signal_equipment_activated( value );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
turbinefx()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
while ( isDefined( self ) && isDefined( self.buildableturbine ) && isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on )
|
||||
{
|
||||
self turbinefxonce( 1 );
|
||||
wait 0,5;
|
||||
self turbinefxonce( 0 );
|
||||
wait 0,5;
|
||||
}
|
||||
}
|
||||
|
||||
turbineaudio()
|
||||
{
|
||||
if ( !isDefined( self.buildableturbine ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.turbine_power_is_on ) || !self.turbine_power_is_on && isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
self.buildableturbine stoploopsound();
|
||||
return;
|
||||
}
|
||||
self.buildableturbine playloopsound( "zmb_turbine_loop", 2 );
|
||||
}
|
||||
|
||||
init_animtree()
|
||||
{
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
||||
turbineanim( wait_for_end )
|
||||
{
|
||||
if ( !isDefined( self.buildableturbine ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
animlength = 0;
|
||||
self.buildableturbine useanimtree( -1 );
|
||||
if ( isDefined( self.buildableturbine.dying ) && self.buildableturbine.dying )
|
||||
{
|
||||
animlength = getanimlength( %o_zombie_buildable_turbine_death );
|
||||
self.buildableturbine setanim( %o_zombie_buildable_turbine_death );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
self.buildableturbine clearanim( %o_zombie_buildable_turbine_fullpower, 0 );
|
||||
return;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( self.turbine_power_level )
|
||||
{
|
||||
case 3:
|
||||
case 4:
|
||||
animlength = getanimlength( %o_zombie_buildable_turbine_fullpower );
|
||||
self.buildableturbine setanim( %o_zombie_buildable_turbine_fullpower );
|
||||
break;
|
||||
case 2:
|
||||
animlength = getanimlength( %o_zombie_buildable_turbine_halfpower );
|
||||
self.buildableturbine setanim( %o_zombie_buildable_turbine_halfpower );
|
||||
break;
|
||||
case 1:
|
||||
animlength = getanimlength( %o_zombie_buildable_turbine_neardeath );
|
||||
self.buildableturbine setanim( %o_zombie_buildable_turbine_neardeath );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( wait_for_end ) && wait_for_end )
|
||||
{
|
||||
wait animlength;
|
||||
}
|
||||
}
|
||||
|
||||
turbinedecay()
|
||||
{
|
||||
self notify( "turbineDecay" );
|
||||
self endon( "turbineDecay" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
roundlives = 4;
|
||||
if ( !isDefined( self.turbine_power_level ) )
|
||||
{
|
||||
self.turbine_power_level = roundlives;
|
||||
}
|
||||
while ( self.turbine_health > 0 )
|
||||
{
|
||||
old_power_level = self.turbine_power_level;
|
||||
if ( isDefined( self.turbine_emped ) && self.turbine_emped && isDefined( self.turbine_is_powering_on ) && self.turbine_is_powering_on )
|
||||
{
|
||||
emp_time = level.zombie_vars[ "emp_perk_off_time" ];
|
||||
now = getTime();
|
||||
emp_time_left = emp_time - ( ( now - self.turbine_emp_time ) / 1000 );
|
||||
if ( emp_time_left <= 0 )
|
||||
{
|
||||
self.turbine_emped = undefined;
|
||||
self.turbine_emp_time = undefined;
|
||||
self.turbine_power_is_on = 0;
|
||||
old_power_level = -1;
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
self.turbine_power_level = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on )
|
||||
{
|
||||
cost = 1;
|
||||
if ( isDefined( self.localpower ) )
|
||||
{
|
||||
cost += maps/mp/zombies/_zm_power::get_local_power_cost( self.localpower );
|
||||
}
|
||||
self.turbine_health -= cost;
|
||||
if ( self.turbine_health < 200 )
|
||||
{
|
||||
self.turbine_power_level = 1;
|
||||
break;
|
||||
}
|
||||
else if ( self.turbine_health < 600 )
|
||||
{
|
||||
self.turbine_power_level = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.turbine_power_level = 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( old_power_level != self.turbine_power_level )
|
||||
{
|
||||
self notify( "turbine_power_change" );
|
||||
self thread turbineaudio();
|
||||
if ( isDefined( self.buildableturbine.dying ) && !self.buildableturbine.dying )
|
||||
{
|
||||
self thread turbineanim();
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
self destroy_placed_turbine();
|
||||
if ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
turbine_disappear_fx( self.buildableturbine.origin );
|
||||
}
|
||||
self thread wait_and_take_equipment();
|
||||
self.turbine_health = undefined;
|
||||
self.turbine_power_level = undefined;
|
||||
self.turbine_round_start = undefined;
|
||||
self.turbine_power_on = undefined;
|
||||
self.turbine_emped = undefined;
|
||||
self.turbine_emp_time = undefined;
|
||||
self cleanupoldturbine();
|
||||
}
|
||||
|
||||
destroy_placed_turbine()
|
||||
{
|
||||
if ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
if ( isDefined( self.buildableturbine.dying ) && self.buildableturbine.dying )
|
||||
{
|
||||
while ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.buildableturbine.stub ) )
|
||||
{
|
||||
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturbine.stub );
|
||||
}
|
||||
thread turbine_disappear_fx( self.buildableturbine.origin, 0,75 );
|
||||
self.buildableturbine.dying = 1;
|
||||
self turbineanim( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
wait_and_take_equipment()
|
||||
{
|
||||
wait 0,05;
|
||||
self thread maps/mp/zombies/_zm_equipment::equipment_release( "equip_turbine_zm" );
|
||||
}
|
||||
|
||||
turbinepowerdiminish( origin, powerradius )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
while ( isDefined( self.buildableturbine.dying ) && !self.buildableturbine.dying )
|
||||
{
|
||||
if ( isDefined( self.turbine_power_level ) && isDefined( self.buildableturbine ) )
|
||||
{
|
||||
switch( self.turbine_power_level )
|
||||
{
|
||||
case 4:
|
||||
break;
|
||||
case 3:
|
||||
case 2:
|
||||
self.turbine_power_on = 1;
|
||||
wait randomintrange( 12, 20 );
|
||||
self turbinepoweroff( origin, powerradius );
|
||||
self.turbine_power_on = 0;
|
||||
wait randomintrange( 3, 8 );
|
||||
self turbinepoweron( origin, powerradius );
|
||||
break;
|
||||
case 1:
|
||||
self.turbine_power_on = 1;
|
||||
wait randomintrange( 3, 7 );
|
||||
self turbinepoweroff( origin, powerradius );
|
||||
self.turbine_power_on = 0;
|
||||
wait randomintrange( 6, 12 );
|
||||
self turbinepoweron( origin, powerradius );
|
||||
break;
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debugturbine( radius )
|
||||
{
|
||||
/#
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_turbine_zm_taken" );
|
||||
self.buildableturbine endon( "death" );
|
||||
while ( isDefined( self.buildableturbine ) )
|
||||
{
|
||||
if ( getDvarInt( #"EB512CB7" ) )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
text = "";
|
||||
if ( isDefined( self.turbine_health ) )
|
||||
{
|
||||
text = "" + self.turbine_health + "";
|
||||
}
|
||||
if ( isDefined( self.buildableturbine.dying ) && self.buildableturbine.dying )
|
||||
{
|
||||
text = "dying";
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turbine_emped ) && self.turbine_emped )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
emp_time = level.zombie_vars[ "emp_perk_off_time" ];
|
||||
now = getTime();
|
||||
emp_time_left = int( emp_time - ( ( now - self.turbine_emp_time ) / 1000 ) );
|
||||
text = ( text + " emp(" ) + emp_time_left + ")";
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turbine_is_powering_on ) && self.turbine_is_powering_on )
|
||||
{
|
||||
text += " warmup";
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on )
|
||||
{
|
||||
if ( self.turbine_health < 200 )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
break;
|
||||
}
|
||||
else if ( self.turbine_health < 600 )
|
||||
{
|
||||
color = ( 1, 0,7, 0 );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
print3d( self.buildableturbine.origin + vectorScale( ( 0, 0, 1 ), 60 ), text, color, 1, 0,5, 1 );
|
||||
}
|
||||
wait 0,05;
|
||||
#/
|
||||
}
|
||||
}
|
491
patch_zm/maps/mp/zombies/_zm_game_module.gsc
Normal file
491
patch_zm/maps/mp/zombies/_zm_game_module.gsc
Normal file
@ -0,0 +1,491 @@
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_audio_announcer;
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
register_game_module( index, module_name, pre_init_func, post_init_func, pre_init_zombie_spawn_func, post_init_zombie_spawn_func, hub_start_func )
|
||||
{
|
||||
if ( !isDefined( level._game_modules ) )
|
||||
{
|
||||
level._game_modules = [];
|
||||
level._num_registered_game_modules = 0;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level._num_registered_game_modules )
|
||||
{
|
||||
if ( !isDefined( level._game_modules[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level._game_modules[ i ].index ) && level._game_modules[ i ].index == index )
|
||||
{
|
||||
/#
|
||||
assert( level._game_modules[ i ].index != index, "A Game module is already registered for index (" + index + ")" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
level._game_modules[ level._num_registered_game_modules ] = spawnstruct();
|
||||
level._game_modules[ level._num_registered_game_modules ].index = index;
|
||||
level._game_modules[ level._num_registered_game_modules ].module_name = module_name;
|
||||
level._game_modules[ level._num_registered_game_modules ].pre_init_func = pre_init_func;
|
||||
level._game_modules[ level._num_registered_game_modules ].post_init_func = post_init_func;
|
||||
level._game_modules[ level._num_registered_game_modules ].pre_init_zombie_spawn_func = pre_init_zombie_spawn_func;
|
||||
level._game_modules[ level._num_registered_game_modules ].post_init_zombie_spawn_func = post_init_zombie_spawn_func;
|
||||
level._game_modules[ level._num_registered_game_modules ].hub_start_func = hub_start_func;
|
||||
level._num_registered_game_modules++;
|
||||
}
|
||||
|
||||
set_current_game_module( game_module_index )
|
||||
{
|
||||
if ( !isDefined( game_module_index ) )
|
||||
{
|
||||
level.current_game_module = level.game_module_classic_index;
|
||||
level.scr_zm_game_module = level.game_module_classic_index;
|
||||
return;
|
||||
}
|
||||
game_module = get_game_module( game_module_index );
|
||||
if ( !isDefined( game_module ) )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( game_module ), "unknown game module (" + game_module_index + ")" );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
level.current_game_module = game_module_index;
|
||||
}
|
||||
|
||||
get_current_game_module()
|
||||
{
|
||||
return get_game_module( level.current_game_module );
|
||||
}
|
||||
|
||||
get_game_module( game_module_index )
|
||||
{
|
||||
if ( !isDefined( game_module_index ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level._game_modules.size )
|
||||
{
|
||||
if ( level._game_modules[ i ].index == game_module_index )
|
||||
{
|
||||
return level._game_modules[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
game_module_pre_zombie_spawn_init()
|
||||
{
|
||||
current_module = get_current_game_module();
|
||||
if ( !isDefined( current_module ) || !isDefined( current_module.pre_init_zombie_spawn_func ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self [[ current_module.pre_init_zombie_spawn_func ]]();
|
||||
}
|
||||
|
||||
game_module_post_zombie_spawn_init()
|
||||
{
|
||||
current_module = get_current_game_module();
|
||||
if ( !isDefined( current_module ) || !isDefined( current_module.post_init_zombie_spawn_func ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self [[ current_module.post_init_zombie_spawn_func ]]();
|
||||
}
|
||||
|
||||
kill_all_zombies()
|
||||
{
|
||||
ai = get_round_enemy_array();
|
||||
_a115 = ai;
|
||||
_k115 = getFirstArrayKey( _a115 );
|
||||
while ( isDefined( _k115 ) )
|
||||
{
|
||||
zombie = _a115[ _k115 ];
|
||||
if ( isDefined( zombie ) )
|
||||
{
|
||||
zombie dodamage( zombie.maxhealth * 2, zombie.origin, zombie, zombie, "none", "MOD_SUICIDE" );
|
||||
wait 0,05;
|
||||
}
|
||||
_k115 = getNextArrayKey( _a115, _k115 );
|
||||
}
|
||||
}
|
||||
|
||||
freeze_players( freeze )
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
players[ i ] freeze_player_controls( freeze );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
turn_power_on_and_open_doors()
|
||||
{
|
||||
level.local_doors_stay_open = 1;
|
||||
level.power_local_doors_globally = 1;
|
||||
flag_set( "power_on" );
|
||||
level setclientfield( "zombie_power_on", 1 );
|
||||
zombie_doors = getentarray( "zombie_door", "targetname" );
|
||||
_a144 = zombie_doors;
|
||||
_k144 = getFirstArrayKey( _a144 );
|
||||
while ( isDefined( _k144 ) )
|
||||
{
|
||||
door = _a144[ _k144 ];
|
||||
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" )
|
||||
{
|
||||
door notify( "power_on" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" )
|
||||
{
|
||||
door notify( "local_power_on" );
|
||||
}
|
||||
}
|
||||
_k144 = getNextArrayKey( _a144, _k144 );
|
||||
}
|
||||
}
|
||||
|
||||
respawn_spectators_and_freeze_players()
|
||||
{
|
||||
players = get_players();
|
||||
_a161 = players;
|
||||
_k161 = getFirstArrayKey( _a161 );
|
||||
while ( isDefined( _k161 ) )
|
||||
{
|
||||
player = _a161[ _k161 ];
|
||||
if ( player.sessionstate == "spectator" )
|
||||
{
|
||||
if ( isDefined( player.spectate_hud ) )
|
||||
{
|
||||
player.spectate_hud destroy();
|
||||
}
|
||||
player [[ level.spawnplayer ]]();
|
||||
}
|
||||
player freeze_player_controls( 1 );
|
||||
_k161 = getNextArrayKey( _a161, _k161 );
|
||||
}
|
||||
}
|
||||
|
||||
damage_callback_no_pvp_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
|
||||
{
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker == self )
|
||||
{
|
||||
return idamage;
|
||||
}
|
||||
if ( isDefined( eattacker ) && !isplayer( eattacker ) )
|
||||
{
|
||||
return idamage;
|
||||
}
|
||||
if ( !isDefined( eattacker ) )
|
||||
{
|
||||
return idamage;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
respawn_players()
|
||||
{
|
||||
players = get_players();
|
||||
_a196 = players;
|
||||
_k196 = getFirstArrayKey( _a196 );
|
||||
while ( isDefined( _k196 ) )
|
||||
{
|
||||
player = _a196[ _k196 ];
|
||||
player [[ level.spawnplayer ]]();
|
||||
player freeze_player_controls( 1 );
|
||||
_k196 = getNextArrayKey( _a196, _k196 );
|
||||
}
|
||||
}
|
||||
|
||||
zombie_goto_round( target_round )
|
||||
{
|
||||
level notify( "restart_round" );
|
||||
if ( target_round < 1 )
|
||||
{
|
||||
target_round = 1;
|
||||
}
|
||||
level.zombie_total = 0;
|
||||
maps/mp/zombies/_zm::ai_calculate_health( target_round );
|
||||
zombies = get_round_enemy_array();
|
||||
while ( isDefined( zombies ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
zombies[ i ] dodamage( zombies[ i ].health + 666, zombies[ i ].origin );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
respawn_players();
|
||||
wait 1;
|
||||
}
|
||||
|
||||
wait_for_team_death_and_round_end()
|
||||
{
|
||||
level endon( "game_module_ended" );
|
||||
level endon( "end_game" );
|
||||
checking_for_round_end = 0;
|
||||
level.isresetting_grief = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
cdc_alive = 0;
|
||||
cia_alive = 0;
|
||||
players = get_players();
|
||||
_a244 = players;
|
||||
_k244 = getFirstArrayKey( _a244 );
|
||||
while ( isDefined( _k244 ) )
|
||||
{
|
||||
player = _a244[ _k244 ];
|
||||
if ( !isDefined( player._encounters_team ) )
|
||||
{
|
||||
}
|
||||
else if ( player._encounters_team == "A" )
|
||||
{
|
||||
if ( is_player_valid( player ) )
|
||||
{
|
||||
cia_alive++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_player_valid( player ) )
|
||||
{
|
||||
cdc_alive++;
|
||||
}
|
||||
}
|
||||
_k244 = getNextArrayKey( _a244, _k244 );
|
||||
}
|
||||
if ( cia_alive == 0 && cdc_alive == 0 && !level.isresetting_grief && isDefined( level.host_ended_game ) && !level.host_ended_game )
|
||||
{
|
||||
wait 0,5;
|
||||
if ( isDefined( level._grief_reset_message ) )
|
||||
{
|
||||
level thread [[ level._grief_reset_message ]]();
|
||||
}
|
||||
level.isresetting_grief = 1;
|
||||
level notify( "end_round_think" );
|
||||
level.zombie_vars[ "spectators_respawn" ] = 1;
|
||||
level notify( "keep_griefing" );
|
||||
checking_for_round_end = 0;
|
||||
zombie_goto_round( level.round_number );
|
||||
level thread reset_grief();
|
||||
level thread maps/mp/zombies/_zm::round_think( 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !checking_for_round_end )
|
||||
{
|
||||
if ( cia_alive == 0 )
|
||||
{
|
||||
level thread check_for_round_end( "B" );
|
||||
checking_for_round_end = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( cdc_alive == 0 )
|
||||
{
|
||||
level thread check_for_round_end( "A" );
|
||||
checking_for_round_end = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( cia_alive > 0 && cdc_alive > 0 )
|
||||
{
|
||||
level notify( "stop_round_end_check" );
|
||||
checking_for_round_end = 0;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
reset_grief()
|
||||
{
|
||||
wait 1;
|
||||
level.isresetting_grief = 0;
|
||||
}
|
||||
|
||||
check_for_round_end( winner )
|
||||
{
|
||||
level endon( "keep_griefing" );
|
||||
level endon( "stop_round_end_check" );
|
||||
level waittill( "end_of_round" );
|
||||
level.gamemodulewinningteam = winner;
|
||||
level.zombie_vars[ "spectators_respawn" ] = 0;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
players[ i ] freezecontrols( 1 );
|
||||
if ( players[ i ]._encounters_team == winner )
|
||||
{
|
||||
players[ i ] thread maps/mp/zombies/_zm_audio_announcer::leaderdialogonplayer( "grief_won" );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
players[ i ] thread maps/mp/zombies/_zm_audio_announcer::leaderdialogonplayer( "grief_lost" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
level notify( "game_module_ended" );
|
||||
level._game_module_game_end_check = undefined;
|
||||
maps/mp/gametypes_zm/_zm_gametype::track_encounters_win_stats( level.gamemodulewinningteam );
|
||||
level notify( "end_game" );
|
||||
}
|
||||
|
||||
wait_for_team_death()
|
||||
{
|
||||
wait 15;
|
||||
winner = undefined;
|
||||
while ( !isDefined( winner ) )
|
||||
{
|
||||
cdc_alive = 0;
|
||||
cia_alive = 0;
|
||||
players = get_players();
|
||||
_a418 = players;
|
||||
_k418 = getFirstArrayKey( _a418 );
|
||||
while ( isDefined( _k418 ) )
|
||||
{
|
||||
player = _a418[ _k418 ];
|
||||
if ( player._encounters_team == "A" )
|
||||
{
|
||||
if ( is_player_valid( player ) || isDefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive && isDefined( player.lives ) && player.lives > 0 )
|
||||
{
|
||||
cia_alive++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( is_player_valid( player ) || isDefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive && isDefined( player.lives ) && player.lives > 0 )
|
||||
{
|
||||
cdc_alive++;
|
||||
}
|
||||
}
|
||||
_k418 = getNextArrayKey( _a418, _k418 );
|
||||
}
|
||||
if ( cia_alive == 0 )
|
||||
{
|
||||
winner = "B";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( cdc_alive == 0 )
|
||||
{
|
||||
winner = "A";
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
level notify( "game_module_ended" );
|
||||
}
|
||||
|
||||
make_supersprinter()
|
||||
{
|
||||
self set_zombie_run_cycle( "super_sprint" );
|
||||
}
|
||||
|
||||
game_module_custom_intermission( intermission_struct )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
level endon( "stop_intermission" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self notify( "_zombie_game_over" );
|
||||
self.score = self.score_total;
|
||||
self.sessionstate = "intermission";
|
||||
self.spectatorclient = -1;
|
||||
self.killcamentity = -1;
|
||||
self.archivetime = 0;
|
||||
self.psoffsettime = 0;
|
||||
self.friendlydamage = undefined;
|
||||
s_point = getstruct( intermission_struct, "targetname" );
|
||||
if ( !isDefined( level.intermission_cam_model ) )
|
||||
{
|
||||
level.intermission_cam_model = spawn( "script_model", s_point.origin );
|
||||
level.intermission_cam_model.angles = s_point.angles;
|
||||
level.intermission_cam_model setmodel( "tag_origin" );
|
||||
}
|
||||
self.game_over_bg = newclienthudelem( self );
|
||||
self.game_over_bg.horzalign = "fullscreen";
|
||||
self.game_over_bg.vertalign = "fullscreen";
|
||||
self.game_over_bg setshader( "black", 640, 480 );
|
||||
self.game_over_bg.alpha = 1;
|
||||
self spawn( level.intermission_cam_model.origin, level.intermission_cam_model.angles );
|
||||
self camerasetposition( level.intermission_cam_model );
|
||||
self camerasetlookat();
|
||||
self cameraactivate( 1 );
|
||||
self linkto( level.intermission_cam_model );
|
||||
level.intermission_cam_model moveto( getstruct( s_point.target, "targetname" ).origin, 12 );
|
||||
if ( isDefined( level.intermission_cam_model.angles ) )
|
||||
{
|
||||
level.intermission_cam_model rotateto( getstruct( s_point.target, "targetname" ).angles, 12 );
|
||||
}
|
||||
self.game_over_bg fadeovertime( 2 );
|
||||
self.game_over_bg.alpha = 0;
|
||||
wait 2;
|
||||
self.game_over_bg thread maps/mp/zombies/_zm::fade_up_over_time( 1 );
|
||||
}
|
||||
|
||||
create_fireworks( launch_spots, min_wait, max_wait, randomize )
|
||||
{
|
||||
level endon( "stop_fireworks" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( randomize ) && randomize )
|
||||
{
|
||||
launch_spots = array_randomize( launch_spots );
|
||||
}
|
||||
_a516 = launch_spots;
|
||||
_k516 = getFirstArrayKey( _a516 );
|
||||
while ( isDefined( _k516 ) )
|
||||
{
|
||||
spot = _a516[ _k516 ];
|
||||
level thread fireworks_launch( spot );
|
||||
wait randomfloatrange( min_wait, max_wait );
|
||||
_k516 = getNextArrayKey( _a516, _k516 );
|
||||
}
|
||||
wait randomfloatrange( min_wait, max_wait );
|
||||
}
|
||||
}
|
||||
|
||||
fireworks_launch( launch_spot )
|
||||
{
|
||||
firework = spawn( "script_model", launch_spot.origin + ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ) );
|
||||
firework setmodel( "tag_origin" );
|
||||
wait_network_frame();
|
||||
playfxontag( level._effect[ "fw_trail_cheap" ], firework, "tag_origin" );
|
||||
firework playloopsound( "zmb_souls_loop", 0,75 );
|
||||
dest = launch_spot;
|
||||
while ( isDefined( dest ) && isDefined( dest.target ) )
|
||||
{
|
||||
random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 );
|
||||
new_dests = getstructarray( dest.target, "targetname" );
|
||||
new_dest = random( new_dests );
|
||||
dest = new_dest;
|
||||
dist = distance( new_dest.origin + random_offset, firework.origin );
|
||||
time = dist / 700;
|
||||
firework moveto( new_dest.origin + random_offset, time );
|
||||
firework waittill( "movedone" );
|
||||
}
|
||||
firework playsound( "zmb_souls_end" );
|
||||
playfx( level._effect[ "fw_pre_burst" ], firework.origin );
|
||||
firework delete();
|
||||
}
|
557
patch_zm/maps/mp/zombies/_zm_jump_pad.gsc
Normal file
557
patch_zm/maps/mp/zombies/_zm_jump_pad.gsc
Normal file
@ -0,0 +1,557 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( is_true( level._uses_jump_pads ) )
|
||||
{
|
||||
level jump_pad_init();
|
||||
}
|
||||
}
|
||||
|
||||
jump_pad_init()
|
||||
{
|
||||
level._jump_pad_override = [];
|
||||
jump_pad_triggers = getentarray( "trig_jump_pad", "targetname" );
|
||||
if ( !isDefined( jump_pad_triggers ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < jump_pad_triggers.size )
|
||||
{
|
||||
jump_pad_triggers[ i ].start = getstruct( jump_pad_triggers[ i ].target, "targetname" );
|
||||
jump_pad_triggers[ i ].destination = getstructarray( jump_pad_triggers[ i ].start.target, "targetname" );
|
||||
if ( isDefined( jump_pad_triggers[ i ].script_string ) )
|
||||
{
|
||||
jump_pad_triggers[ i ].overrides = strtok( jump_pad_triggers[ i ].script_string, "," );
|
||||
}
|
||||
jump_pad_triggers[ i ] thread jump_pad_think();
|
||||
i++;
|
||||
}
|
||||
onplayerconnect_callback( ::jump_pad_player_variables );
|
||||
}
|
||||
|
||||
jump_pad_player_variables()
|
||||
{
|
||||
self._padded = 0;
|
||||
self.lander = 0;
|
||||
}
|
||||
|
||||
jump_pad_think()
|
||||
{
|
||||
self endon( "destroyed" );
|
||||
end_point = undefined;
|
||||
start_point = undefined;
|
||||
z_velocity = undefined;
|
||||
z_dist = undefined;
|
||||
fling_this_way = undefined;
|
||||
jump_time = undefined;
|
||||
world_gravity = getDvarInt( "bg_gravity" );
|
||||
gravity_pulls = -13,3;
|
||||
top_velocity_sq = 810000;
|
||||
forward_scaling = 1;
|
||||
if ( isDefined( self.script_flag_wait ) )
|
||||
{
|
||||
if ( !isDefined( level.flag[ self.script_flag_wait ] ) )
|
||||
{
|
||||
flag_init( self.script_flag_wait );
|
||||
}
|
||||
flag_wait( self.script_flag_wait );
|
||||
}
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
if ( isplayer( who ) )
|
||||
{
|
||||
self thread trigger_thread( who, ::jump_pad_start, ::jump_pad_cancel );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jump_pad_start( ent_player, endon_condition )
|
||||
{
|
||||
self endon( "endon_condition" );
|
||||
ent_player endon( "left_jump_pad" );
|
||||
ent_player endon( "death" );
|
||||
ent_player endon( "disconnect" );
|
||||
end_point = undefined;
|
||||
start_point = undefined;
|
||||
z_velocity = undefined;
|
||||
z_dist = undefined;
|
||||
fling_this_way = undefined;
|
||||
jump_time = undefined;
|
||||
world_gravity = getDvarInt( "bg_gravity" );
|
||||
gravity_pulls = -13,3;
|
||||
top_velocity_sq = 810000;
|
||||
forward_scaling = 1;
|
||||
start_point = self.start;
|
||||
while ( isDefined( self.name ) )
|
||||
{
|
||||
self._action_overrides = strtok( self.name, "," );
|
||||
while ( isDefined( self._action_overrides ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self._action_overrides.size )
|
||||
{
|
||||
ent_player jump_pad_player_overrides( self._action_overrides[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.script_wait ) )
|
||||
{
|
||||
if ( self.script_wait < 1 )
|
||||
{
|
||||
self playsound( "evt_jump_pad_charge_short" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self playsound( "evt_jump_pad_charge" );
|
||||
}
|
||||
wait self.script_wait;
|
||||
}
|
||||
else
|
||||
{
|
||||
self playsound( "evt_jump_pad_charge" );
|
||||
wait 1;
|
||||
}
|
||||
if ( isDefined( self.script_parameters ) && isDefined( level._jump_pad_override[ self.script_parameters ] ) )
|
||||
{
|
||||
end_point = self [[ level._jump_pad_override[ self.script_parameters ] ]]( ent_player );
|
||||
}
|
||||
if ( !isDefined( end_point ) )
|
||||
{
|
||||
end_point = self.destination[ randomint( self.destination.size ) ];
|
||||
}
|
||||
if ( isDefined( self.script_string ) && isDefined( level._jump_pad_override[ self.script_string ] ) )
|
||||
{
|
||||
info_array = self [[ level._jump_pad_override[ self.script_string ] ]]( start_point, end_point );
|
||||
fling_this_way = info_array[ 0 ];
|
||||
jump_time = info_array[ 1 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
end_spot = end_point.origin;
|
||||
if ( !is_true( self.script_airspeed ) )
|
||||
{
|
||||
rand_end = ( randomfloatrange( -1, 1 ), randomfloatrange( -1, 1 ), 0 );
|
||||
rand_scale = randomint( 100 );
|
||||
rand_spot = vectorScale( rand_end, rand_scale );
|
||||
end_spot = end_point.origin + rand_spot;
|
||||
}
|
||||
pad_dist = distance( start_point.origin, end_spot );
|
||||
z_dist = end_spot[ 2 ] - start_point.origin[ 2 ];
|
||||
jump_velocity = end_spot - start_point.origin;
|
||||
if ( z_dist > 40 && z_dist < 135 )
|
||||
{
|
||||
z_dist *= 2,5;
|
||||
forward_scaling = 1,1;
|
||||
/#
|
||||
if ( getDvarInt( #"D5FD01C3" ) )
|
||||
{
|
||||
if ( getDvar( #"E2494021" ) != "" )
|
||||
{
|
||||
z_dist *= getDvarFloat( #"E2494021" );
|
||||
}
|
||||
if ( getDvar( #"4E3BC729" ) != "" )
|
||||
{
|
||||
forward_scaling = getDvarFloat( #"4E3BC729" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( z_dist >= 135 )
|
||||
{
|
||||
z_dist *= 2,7;
|
||||
forward_scaling = 1,3;
|
||||
/#
|
||||
if ( getDvarInt( #"D5FD01C3" ) )
|
||||
{
|
||||
if ( getDvar( #"E2494021" ) != "" )
|
||||
{
|
||||
z_dist *= getDvarFloat( #"E2494021" );
|
||||
}
|
||||
if ( getDvar( #"4E3BC729" ) != "" )
|
||||
{
|
||||
forward_scaling = getDvarFloat( #"4E3BC729" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( z_dist < 0 )
|
||||
{
|
||||
z_dist *= 2,4;
|
||||
forward_scaling = 1;
|
||||
/#
|
||||
if ( getDvarInt( #"D5FD01C3" ) )
|
||||
{
|
||||
if ( getDvar( #"E2494021" ) != "" )
|
||||
{
|
||||
z_dist *= getDvarFloat( #"E2494021" );
|
||||
}
|
||||
if ( getDvar( #"4E3BC729" ) != "" )
|
||||
{
|
||||
forward_scaling = getDvarFloat( #"4E3BC729" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
z_velocity = 2 * z_dist * world_gravity;
|
||||
if ( z_velocity < 0 )
|
||||
{
|
||||
z_velocity *= -1;
|
||||
}
|
||||
if ( z_dist < 0 )
|
||||
{
|
||||
z_dist *= -1;
|
||||
}
|
||||
jump_time = sqrt( ( 2 * pad_dist ) / world_gravity );
|
||||
jump_time_2 = sqrt( ( 2 * z_dist ) / world_gravity );
|
||||
jump_time += jump_time_2;
|
||||
if ( jump_time < 0 )
|
||||
{
|
||||
jump_time *= -1;
|
||||
}
|
||||
x = ( jump_velocity[ 0 ] * forward_scaling ) / jump_time;
|
||||
y = ( jump_velocity[ 1 ] * forward_scaling ) / jump_time;
|
||||
z = z_velocity / jump_time;
|
||||
fling_this_way = ( x, y, z );
|
||||
}
|
||||
if ( isDefined( end_point.target ) )
|
||||
{
|
||||
poi_spot = getstruct( end_point.target, "targetname" );
|
||||
}
|
||||
else
|
||||
{
|
||||
poi_spot = end_point;
|
||||
}
|
||||
if ( !isDefined( self.script_index ) )
|
||||
{
|
||||
ent_player.script_index = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
ent_player.script_index = self.script_index;
|
||||
}
|
||||
if ( isDefined( self.script_start ) && self.script_start == 1 )
|
||||
{
|
||||
if ( !is_true( ent_player._padded ) )
|
||||
{
|
||||
self playsound( "evt_jump_pad_launch" );
|
||||
playfx( level._effect[ "jump_pad_jump" ], self.origin );
|
||||
ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot, self );
|
||||
if ( isDefined( self.script_label ) )
|
||||
{
|
||||
level notify( self.script_label );
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ent_player isonground() && !is_true( ent_player._padded ) )
|
||||
{
|
||||
self playsound( "evt_jump_pad_launch" );
|
||||
playfx( level._effect[ "jump_pad_jump" ], self.origin );
|
||||
ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot, self );
|
||||
if ( isDefined( self.script_label ) )
|
||||
{
|
||||
level notify( self.script_label );
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
wait 0,5;
|
||||
if ( ent_player istouching( self ) )
|
||||
{
|
||||
self jump_pad_start( ent_player, endon_condition );
|
||||
}
|
||||
}
|
||||
|
||||
jump_pad_cancel( ent_player )
|
||||
{
|
||||
ent_player notify( "left_jump_pad" );
|
||||
if ( isDefined( ent_player.poi_spot ) && !is_true( ent_player._padded ) )
|
||||
{
|
||||
}
|
||||
while ( isDefined( self.name ) )
|
||||
{
|
||||
self._action_overrides = strtok( self.name, "," );
|
||||
while ( isDefined( self._action_overrides ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self._action_overrides.size )
|
||||
{
|
||||
ent_player jump_pad_player_overrides( self._action_overrides[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jump_pad_move( vec_direction, flt_time, struct_poi, trigger )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
start_time = getTime();
|
||||
jump_time = flt_time * 500;
|
||||
attract_dist = undefined;
|
||||
num_attractors = 30;
|
||||
added_poi_value = 0;
|
||||
start_turned_on = 1;
|
||||
poi_start_func = undefined;
|
||||
while ( is_true( self.divetoprone ) || is_true( self._padded ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
self._padded = 1;
|
||||
self.lander = 1;
|
||||
self setstance( "stand" );
|
||||
wait 0,1;
|
||||
if ( isDefined( trigger.script_label ) )
|
||||
{
|
||||
if ( issubstr( trigger.script_label, "low" ) )
|
||||
{
|
||||
self.jump_pad_current = undefined;
|
||||
self.jump_pad_previous = undefined;
|
||||
}
|
||||
else if ( !isDefined( self.jump_pad_current ) )
|
||||
{
|
||||
self.jump_pad_current = trigger;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.jump_pad_previous = self.jump_pad_current;
|
||||
self.jump_pad_current = trigger;
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.poi_spot ) )
|
||||
{
|
||||
level jump_pad_ignore_poi_cleanup( self.poi_spot );
|
||||
self.poi_spot deactivate_zombie_point_of_interest();
|
||||
self.poi_spot delete();
|
||||
}
|
||||
if ( isDefined( struct_poi ) )
|
||||
{
|
||||
self.poi_spot = spawn( "script_origin", struct_poi.origin );
|
||||
if ( isDefined( level._pad_poi_ignore ) )
|
||||
{
|
||||
level [[ level._pad_poi_ignore ]]( self.poi_spot );
|
||||
}
|
||||
self thread jump_pad_enemy_follow_or_ignore( self.poi_spot );
|
||||
if ( isDefined( level._jump_pad_poi_start_override ) && !is_true( self.script_index ) )
|
||||
{
|
||||
poi_start_func = level._jump_pad_poi_start_override;
|
||||
}
|
||||
if ( isDefined( level._jump_pad_poi_end_override ) )
|
||||
{
|
||||
poi_end_func = level._jump_pad_poi_end_override;
|
||||
}
|
||||
self.poi_spot create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, poi_start_func );
|
||||
self thread disconnect_failsafe_pad_poi_clean();
|
||||
}
|
||||
self setorigin( self.origin + ( 0, 0, 1 ) );
|
||||
if ( randomintrange( 0, 101 ) < 20 )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "jumppad" );
|
||||
}
|
||||
while ( ( getTime() - start_time ) < jump_time )
|
||||
{
|
||||
self setvelocity( vec_direction );
|
||||
wait 0,05;
|
||||
}
|
||||
while ( !self isonground() )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
self._padded = 0;
|
||||
self.lander = 0;
|
||||
jump_pad_triggers = getentarray( "trig_jump_pad", "targetname" );
|
||||
i = 0;
|
||||
while ( i < jump_pad_triggers.size )
|
||||
{
|
||||
if ( self istouching( jump_pad_triggers[ i ] ) )
|
||||
{
|
||||
level thread failsafe_pad_poi_clean( jump_pad_triggers[ i ], self.poi_spot );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( isDefined( self.poi_spot ) )
|
||||
{
|
||||
level jump_pad_ignore_poi_cleanup( self.poi_spot );
|
||||
self.poi_spot delete();
|
||||
}
|
||||
}
|
||||
|
||||
disconnect_failsafe_pad_poi_clean()
|
||||
{
|
||||
self notify( "kill_disconnect_failsafe_pad_poi_clean" );
|
||||
self endon( "kill_disconnect_failsafe_pad_poi_clean" );
|
||||
self.poi_spot endon( "death" );
|
||||
self waittill( "disconnect" );
|
||||
if ( isDefined( self.poi_spot ) )
|
||||
{
|
||||
level jump_pad_ignore_poi_cleanup( self.poi_spot );
|
||||
self.poi_spot deactivate_zombie_point_of_interest();
|
||||
self.poi_spot delete();
|
||||
}
|
||||
}
|
||||
|
||||
failsafe_pad_poi_clean( ent_trig, ent_poi )
|
||||
{
|
||||
if ( isDefined( ent_trig.script_wait ) )
|
||||
{
|
||||
wait ent_trig.script_wait;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,5;
|
||||
}
|
||||
if ( isDefined( ent_poi ) )
|
||||
{
|
||||
level jump_pad_ignore_poi_cleanup( ent_poi );
|
||||
ent_poi deactivate_zombie_point_of_interest();
|
||||
ent_poi delete();
|
||||
}
|
||||
}
|
||||
|
||||
jump_pad_enemy_follow_or_ignore( ent_poi )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
players = getplayers();
|
||||
valid_players = 0;
|
||||
p = 0;
|
||||
while ( p < players.size )
|
||||
{
|
||||
if ( is_player_valid( players[ p ] ) )
|
||||
{
|
||||
valid_players++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
ignore_poi = 0;
|
||||
if ( !isDefined( zombies[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else enemy = zombies[ i ].favoriteenemy;
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
if ( players.size > 1 && valid_players > 1 )
|
||||
{
|
||||
if ( enemy != self || isDefined( enemy.jump_pad_previous ) && enemy.jump_pad_previous == enemy.jump_pad_current )
|
||||
{
|
||||
ignore_poi = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( is_true( ignore_poi ) )
|
||||
{
|
||||
zombies[ i ] thread add_poi_to_ignore_list( ent_poi );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
zombies[ i ].ignore_distance_tracking = 1;
|
||||
zombies[ i ]._pad_follow = 1;
|
||||
zombies[ i ] thread stop_chasing_the_sky( ent_poi );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
jump_pad_ignore_poi_cleanup( ent_poi )
|
||||
{
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( isDefined( zombies[ i ] ) )
|
||||
{
|
||||
if ( is_true( zombies[ i ]._pad_follow ) )
|
||||
{
|
||||
zombies[ i ]._pad_follow = 0;
|
||||
zombies[ i ] notify( "stop_chasing_the_sky" );
|
||||
zombies[ i ].ignore_distance_tracking = 0;
|
||||
}
|
||||
if ( isDefined( ent_poi ) )
|
||||
{
|
||||
zombies[ i ] thread remove_poi_from_ignore_list( ent_poi );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
stop_chasing_the_sky( ent_poi )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_chasing_the_sky" );
|
||||
while ( is_true( self._pad_follow ) )
|
||||
{
|
||||
while ( isDefined( self.favoriteenemy ) )
|
||||
{
|
||||
players = getplayers();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( is_player_valid( players[ i ] ) && players[ i ] != self.favoriteenemy )
|
||||
{
|
||||
if ( distance2dsquared( players[ i ].origin, self.origin ) < 10000 )
|
||||
{
|
||||
self add_poi_to_ignore_list( ent_poi );
|
||||
return;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
wait 0,1;
|
||||
}
|
||||
self._pad_follow = 0;
|
||||
self.ignore_distance_tracking = 0;
|
||||
self notify( "stop_chasing_the_sky" );
|
||||
}
|
||||
|
||||
jump_pad_player_overrides( st_behavior, int_clean )
|
||||
{
|
||||
if ( !isDefined( st_behavior ) || !isstring( st_behavior ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( int_clean ) )
|
||||
{
|
||||
int_clean = 0;
|
||||
}
|
||||
switch( st_behavior )
|
||||
{
|
||||
case "no_sprint":
|
||||
if ( !int_clean )
|
||||
{
|
||||
}
|
||||
default:
|
||||
if ( isDefined( level._jump_pad_level_behavior ) )
|
||||
{
|
||||
self [[ level._jump_pad_level_behavior ]]( st_behavior, int_clean );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1459
patch_zm/maps/mp/zombies/_zm_laststand.gsc
Normal file
1459
patch_zm/maps/mp/zombies/_zm_laststand.gsc
Normal file
File diff suppressed because it is too large
Load Diff
98
patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc
Normal file
98
patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc
Normal file
@ -0,0 +1,98 @@
|
||||
#include maps/mp/zombies/_zm_unitrigger;
|
||||
#include maps/mp/zombies/_zm_magicbox_lock;
|
||||
#include maps/mp/zombies/_zm_magicbox;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
precachemodel( "p6_anim_zm_al_magic_box_lock_red" );
|
||||
level.locked_magic_box_cost = 2000;
|
||||
level.custom_magicbox_state_handler = ::set_locked_magicbox_state;
|
||||
add_zombie_hint( "locked_magic_box_cost", &"ZOMBIE_LOCKED_COST_2000" );
|
||||
}
|
||||
|
||||
watch_for_lock()
|
||||
{
|
||||
self endon( "user_grabbed_weapon" );
|
||||
self endon( "chest_accessed" );
|
||||
self waittill( "box_locked" );
|
||||
self notify( "kill_chest_think" );
|
||||
self.grab_weapon_hint = 0;
|
||||
self.chest_user = undefined;
|
||||
wait 0,1;
|
||||
self thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think );
|
||||
self.unitrigger_stub run_visibility_function_for_all_triggers();
|
||||
self thread treasure_chest_think();
|
||||
}
|
||||
|
||||
clean_up_locked_box()
|
||||
{
|
||||
self endon( "box_spin_done" );
|
||||
self.owner waittill( "box_locked" );
|
||||
if ( isDefined( self.weapon_model ) )
|
||||
{
|
||||
self.weapon_model delete();
|
||||
self.weapon_model = undefined;
|
||||
}
|
||||
if ( isDefined( self.weapon_model_dw ) )
|
||||
{
|
||||
self.weapon_model_dw delete();
|
||||
self.weapon_model_dw = undefined;
|
||||
}
|
||||
self hidezbarrierpiece( 3 );
|
||||
self hidezbarrierpiece( 4 );
|
||||
self setzbarrierpiecestate( 3, "closed" );
|
||||
self setzbarrierpiecestate( 4, "closed" );
|
||||
}
|
||||
|
||||
magic_box_locks()
|
||||
{
|
||||
self.owner.is_locked = 1;
|
||||
self.owner notify( "box_locked" );
|
||||
self playsound( "zmb_hellbox_lock" );
|
||||
self setclientfield( "magicbox_open_fx", 0 );
|
||||
self setclientfield( "magicbox_amb_fx", 2 );
|
||||
self setzbarrierpiecestate( 5, "closing" );
|
||||
while ( self getzbarrierpiecestate( 5 ) == "closing" )
|
||||
{
|
||||
wait 0,5;
|
||||
}
|
||||
self notify( "locked" );
|
||||
}
|
||||
|
||||
magic_box_unlocks()
|
||||
{
|
||||
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.owner.unitrigger_stub );
|
||||
self playsound( "zmb_hellbox_unlock" );
|
||||
self setzbarrierpiecestate( 5, "opening" );
|
||||
while ( self getzbarrierpiecestate( 5 ) == "opening" )
|
||||
{
|
||||
wait 0,5;
|
||||
}
|
||||
self setzbarrierpiecestate( 2, "closed" );
|
||||
self showzbarrierpiece( 2 );
|
||||
self hidezbarrierpiece( 5 );
|
||||
self notify( "unlocked" );
|
||||
self.owner.is_locked = 0;
|
||||
maps/mp/zombies/_zm_unitrigger::register_unitrigger( self.owner.unitrigger_stub );
|
||||
self setclientfield( "magicbox_amb_fx", 1 );
|
||||
}
|
||||
|
||||
set_locked_magicbox_state( state )
|
||||
{
|
||||
switch( state )
|
||||
{
|
||||
case "locking":
|
||||
self showzbarrierpiece( 5 );
|
||||
self thread magic_box_locks();
|
||||
self.state = "locking";
|
||||
break;
|
||||
case "unlocking":
|
||||
self showzbarrierpiece( 5 );
|
||||
self magic_box_unlocks();
|
||||
self.state = "close";
|
||||
break;
|
||||
}
|
||||
}
|
339
patch_zm/maps/mp/zombies/_zm_mgturret.gsc
Normal file
339
patch_zm/maps/mp/zombies/_zm_mgturret.gsc
Normal file
@ -0,0 +1,339 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
main()
|
||||
{
|
||||
if ( getDvar( #"7C9A91DF" ) == "" )
|
||||
{
|
||||
setdvar( "mgTurret", "off" );
|
||||
}
|
||||
level.magic_distance = 24;
|
||||
turretinfos = getentarray( "turretInfo", "targetname" );
|
||||
index = 0;
|
||||
while ( index < turretinfos.size )
|
||||
{
|
||||
turretinfos[ index ] delete();
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
set_difficulty( difficulty )
|
||||
{
|
||||
init_turret_difficulty_settings();
|
||||
turrets = getentarray( "misc_turret", "classname" );
|
||||
index = 0;
|
||||
while ( index < turrets.size )
|
||||
{
|
||||
if ( isDefined( turrets[ index ].script_skilloverride ) )
|
||||
{
|
||||
switch( turrets[ index ].script_skilloverride )
|
||||
{
|
||||
case "easy":
|
||||
difficulty = "easy";
|
||||
break;
|
||||
break;
|
||||
case "medium":
|
||||
difficulty = "medium";
|
||||
break;
|
||||
break;
|
||||
case "hard":
|
||||
difficulty = "hard";
|
||||
break;
|
||||
break;
|
||||
case "fu":
|
||||
difficulty = "fu";
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
turret_set_difficulty( turrets[ index ], difficulty );
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init_turret_difficulty_settings()
|
||||
{
|
||||
level.mgturretsettings[ "easy" ][ "convergenceTime" ] = 2,5;
|
||||
level.mgturretsettings[ "easy" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "easy" ][ "accuracy" ] = 0,38;
|
||||
level.mgturretsettings[ "easy" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "easy" ][ "playerSpread" ] = 0,5;
|
||||
level.mgturretsettings[ "medium" ][ "convergenceTime" ] = 1,5;
|
||||
level.mgturretsettings[ "medium" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "medium" ][ "accuracy" ] = 0,38;
|
||||
level.mgturretsettings[ "medium" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "medium" ][ "playerSpread" ] = 0,5;
|
||||
level.mgturretsettings[ "hard" ][ "convergenceTime" ] = 0,8;
|
||||
level.mgturretsettings[ "hard" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "hard" ][ "accuracy" ] = 0,38;
|
||||
level.mgturretsettings[ "hard" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "hard" ][ "playerSpread" ] = 0,5;
|
||||
level.mgturretsettings[ "fu" ][ "convergenceTime" ] = 0,4;
|
||||
level.mgturretsettings[ "fu" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "fu" ][ "accuracy" ] = 0,38;
|
||||
level.mgturretsettings[ "fu" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "fu" ][ "playerSpread" ] = 0,5;
|
||||
}
|
||||
|
||||
turret_set_difficulty( turret, difficulty )
|
||||
{
|
||||
turret.convergencetime = level.mgturretsettings[ difficulty ][ "convergenceTime" ];
|
||||
turret.suppressiontime = level.mgturretsettings[ difficulty ][ "suppressionTime" ];
|
||||
turret.accuracy = level.mgturretsettings[ difficulty ][ "accuracy" ];
|
||||
turret.aispread = level.mgturretsettings[ difficulty ][ "aiSpread" ];
|
||||
turret.playerspread = level.mgturretsettings[ difficulty ][ "playerSpread" ];
|
||||
}
|
||||
|
||||
turret_suppression_fire( targets )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_suppression_fire" );
|
||||
if ( !isDefined( self.suppresionfire ) )
|
||||
{
|
||||
self.suppresionfire = 1;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
while ( self.suppresionfire )
|
||||
{
|
||||
self settargetentity( targets[ randomint( targets.size ) ] );
|
||||
wait ( 2 + randomfloat( 2 ) );
|
||||
}
|
||||
self cleartargetentity();
|
||||
while ( !self.suppresionfire )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
burst_fire_settings( setting )
|
||||
{
|
||||
if ( setting == "delay" )
|
||||
{
|
||||
return 0,2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( setting == "delay_range" )
|
||||
{
|
||||
return 0,5;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( setting == "burst" )
|
||||
{
|
||||
return 0,5;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( setting == "burst_range" )
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
burst_fire( turret, manual_target )
|
||||
{
|
||||
turret endon( "death" );
|
||||
turret endon( "stopfiring" );
|
||||
self endon( "stop_using_built_in_burst_fire" );
|
||||
if ( isDefined( turret.script_delay_min ) )
|
||||
{
|
||||
turret_delay = turret.script_delay_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay = burst_fire_settings( "delay" );
|
||||
}
|
||||
if ( isDefined( turret.script_delay_max ) )
|
||||
{
|
||||
turret_delay_range = turret.script_delay_max - turret_delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay_range = burst_fire_settings( "delay_range" );
|
||||
}
|
||||
if ( isDefined( turret.script_burst_min ) )
|
||||
{
|
||||
turret_burst = turret.script_burst_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst = burst_fire_settings( "burst" );
|
||||
}
|
||||
if ( isDefined( turret.script_burst_max ) )
|
||||
{
|
||||
turret_burst_range = turret.script_burst_max - turret_burst;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst_range = burst_fire_settings( "burst_range" );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
turret startfiring();
|
||||
if ( isDefined( manual_target ) )
|
||||
{
|
||||
turret thread random_spread( manual_target );
|
||||
}
|
||||
turret do_shoot();
|
||||
wait ( turret_burst + randomfloat( turret_burst_range ) );
|
||||
turret stopshootturret();
|
||||
turret stopfiring();
|
||||
wait ( turret_delay + randomfloat( turret_delay_range ) );
|
||||
}
|
||||
}
|
||||
|
||||
burst_fire_unmanned()
|
||||
{
|
||||
self notify( "stop_burst_fire_unmanned" );
|
||||
self endon( "stop_burst_fire_unmanned" );
|
||||
self endon( "death" );
|
||||
self endon( "remote_start" );
|
||||
level endon( "game_ended" );
|
||||
if ( isDefined( self.controlled ) && self.controlled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.script_delay_min ) )
|
||||
{
|
||||
turret_delay = self.script_delay_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay = burst_fire_settings( "delay" );
|
||||
}
|
||||
if ( isDefined( self.script_delay_max ) )
|
||||
{
|
||||
turret_delay_range = self.script_delay_max - turret_delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay_range = burst_fire_settings( "delay_range" );
|
||||
}
|
||||
if ( isDefined( self.script_burst_min ) )
|
||||
{
|
||||
turret_burst = self.script_burst_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst = burst_fire_settings( "burst" );
|
||||
}
|
||||
if ( isDefined( self.script_burst_max ) )
|
||||
{
|
||||
turret_burst_range = self.script_burst_max - turret_burst;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst_range = burst_fire_settings( "burst_range" );
|
||||
}
|
||||
pauseuntiltime = getTime();
|
||||
turretstate = "start";
|
||||
self.script_shooting = 0;
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( self.manual_targets ) )
|
||||
{
|
||||
self cleartargetentity();
|
||||
self settargetentity( self.manual_targets[ randomint( self.manual_targets.size ) ] );
|
||||
}
|
||||
duration = ( pauseuntiltime - getTime() ) * 0,001;
|
||||
if ( self isfiringturret() && duration <= 0 )
|
||||
{
|
||||
if ( turretstate != "fire" )
|
||||
{
|
||||
turretstate = "fire";
|
||||
self playsound( "mpl_turret_alert" );
|
||||
self thread do_shoot();
|
||||
self.script_shooting = 1;
|
||||
}
|
||||
duration = turret_burst + randomfloat( turret_burst_range );
|
||||
self thread turret_timer( duration );
|
||||
self waittill( "turretstatechange" );
|
||||
self.script_shooting = 0;
|
||||
duration = turret_delay + randomfloat( turret_delay_range );
|
||||
pauseuntiltime = getTime() + int( duration * 1000 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( turretstate != "aim" )
|
||||
{
|
||||
turretstate = "aim";
|
||||
}
|
||||
self thread turret_timer( duration );
|
||||
self waittill( "turretstatechange" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
avoid_synchronization( time )
|
||||
{
|
||||
if ( !isDefined( level._zm_mgturret_firing ) )
|
||||
{
|
||||
level._zm_mgturret_firing = 0;
|
||||
}
|
||||
level._zm_mgturret_firing++;
|
||||
wait time;
|
||||
level._zm_mgturret_firing--;
|
||||
|
||||
}
|
||||
|
||||
do_shoot()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "turretstatechange" );
|
||||
for ( ;; )
|
||||
{
|
||||
while ( is_true( level._zm_mgturret_firing ) )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
thread avoid_synchronization( 0,1 );
|
||||
self shootturret();
|
||||
wait 0,112;
|
||||
}
|
||||
}
|
||||
|
||||
turret_timer( duration )
|
||||
{
|
||||
if ( duration <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "turretstatechange" );
|
||||
wait duration;
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self notify( "turretstatechange" );
|
||||
}
|
||||
}
|
||||
|
||||
random_spread( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "stop random_spread" );
|
||||
self endon( "stop random_spread" );
|
||||
self endon( "stopfiring" );
|
||||
self settargetentity( ent );
|
||||
self.manual_target = ent;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isplayer( ent ) )
|
||||
{
|
||||
ent.origin = self.manual_target getorigin();
|
||||
}
|
||||
else
|
||||
{
|
||||
ent.origin = self.manual_target.origin;
|
||||
}
|
||||
ent.origin += ( 20 - randomfloat( 40 ), 20 - randomfloat( 40 ), 20 - randomfloat( 60 ) );
|
||||
wait 0,2;
|
||||
}
|
||||
}
|
@ -37,7 +37,6 @@ init() //checked partially changed to match cerberus output
|
||||
}
|
||||
initialize_custom_perk_arrays();
|
||||
perk_machine_spawn_init();
|
||||
//not broken
|
||||
vending_weapon_upgrade_trigger = [];
|
||||
vending_triggers = getentarray( "zombie_vending", "targetname" );
|
||||
for ( i = 0; i < vending_triggers.size; i++ )
|
||||
@ -450,7 +449,7 @@ can_pack_weapon( weaponname ) //checked did not match cebrerus output changed at
|
||||
}
|
||||
if ( flag( "pack_machine_in_use" ) )
|
||||
{
|
||||
return 0; //was 1
|
||||
return 1;
|
||||
}
|
||||
weaponname = self get_nonalternate_weapon( weaponname );
|
||||
if ( !maps/mp/zombies/_zm_weapons::is_weapon_or_base_included( weaponname ) )
|
||||
@ -492,14 +491,17 @@ vending_machine_trigger_think() //changed 3/30/20 4:17 pm //checked matches cerb
|
||||
while( 1 )
|
||||
{
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( isdefined( self.pack_player ) && self.pack_player != players[ i ] || !players[ i ] player_use_can_pack_now() )
|
||||
{
|
||||
self setinvisibletoplayer( players[ i ], 1 );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
self setinvisibletoplayer( players[ i ], 0 );
|
||||
i++;
|
||||
}
|
||||
wait 0.1;
|
||||
}
|
||||
@ -752,8 +754,7 @@ wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) //
|
||||
while ( 1 )
|
||||
{
|
||||
packa_timer playloopsound( "zmb_perks_packa_ticktock" );
|
||||
self waittill( "trigger", trigger_player ); //working
|
||||
|
||||
self waittill( "trigger", trigger_player );
|
||||
if ( isDefined( level.pap_grab_by_anyone ) && level.pap_grab_by_anyone )
|
||||
{
|
||||
player = trigger_player;
|
||||
@ -773,7 +774,7 @@ wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) //
|
||||
#/
|
||||
}
|
||||
*/
|
||||
if ( is_player_valid( player ) && !player.is_drinking > 0 && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon && current_weapon != "none" && !player hacker_active() )
|
||||
if ( is_player_valid( player ) && !player.is_drinking && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon && current_weapon != "none" && !player hacker_active() )
|
||||
{
|
||||
maps/mp/_demo::bookmark( "zm_player_grabbed_packapunch", getTime(), player );
|
||||
self notify( "pap_taken" );
|
||||
@ -816,7 +817,7 @@ wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) //
|
||||
return;
|
||||
}
|
||||
}
|
||||
wait 0.05;
|
||||
//wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
@ -841,15 +842,11 @@ wait_for_disconnect( player ) //checked //checked matches cerberus output
|
||||
{
|
||||
self endon( "pap_taken" );
|
||||
self endon( "pap_timeout" );
|
||||
name = player.name;
|
||||
while ( isDefined( player ) )
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
println( "*** PAP : User disconnected." );
|
||||
#/
|
||||
*/
|
||||
self notify( "pap_player_disconnected" );
|
||||
}
|
||||
|
||||
@ -1604,7 +1601,10 @@ electric_perks_dialog() //checked partially changed to match cerberus output
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else dist = distancesquared( players[ i ].origin, self.origin );
|
||||
else
|
||||
{
|
||||
dist = distancesquared( players[ i ].origin, self.origin );
|
||||
}
|
||||
if ( dist > 4900 )
|
||||
{
|
||||
timer = 0;
|
||||
@ -1853,72 +1853,34 @@ vending_trigger_think() //checked changed to match cerberus output
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "trigger", player );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
logline10 = "_zm_perks.gsc vending_trigger_think() player is not defined for trigger!" + "\n";
|
||||
logprint( logline10 );
|
||||
}
|
||||
}
|
||||
index = maps/mp/zombies/_zm_weapons::get_player_index( player );
|
||||
if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline11 = "_zm_perks.gsc vending_trigger_think() player is in laststand or game is intermission; continue" + "\n";
|
||||
logprint( logline11 );
|
||||
}
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
if ( player in_revive_trigger() )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline11 = "_zm_perks.gsc vending_trigger_think() player is in revive trigger; continue" + "\n";
|
||||
logprint( logline11 );
|
||||
}
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
if ( !player maps/mp/zombies/_zm_magicbox::can_buy_weapon() )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline12 = "_zm_perks.gsc vending_trigger_think() player is in revive trigger; continue" + "\n";
|
||||
logprint( logline12 );
|
||||
}
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
if ( player isthrowinggrenade() )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline13 = "_zm_perks.gsc vending_trigger_think() player is throwing grenade; continue" + "\n";
|
||||
logprint( logline13 );
|
||||
}
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
if ( player isswitchingweapons() )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline14 = "_zm_perks.gsc vending_trigger_think() player is switching weapons; continue" + "\n";
|
||||
logprint( logline14 );
|
||||
}
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
if ( player.is_drinking > 0 )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline15 = "_zm_perks.gsc vending_trigger_think() player is drinking; continue" + "\n";
|
||||
logprint( logline15 );
|
||||
}
|
||||
wait 0.1;
|
||||
continue;
|
||||
}
|
||||
@ -1935,11 +1897,6 @@ vending_trigger_think() //checked changed to match cerberus output
|
||||
*/
|
||||
if ( cheat != 1 )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline16 = "_zm_perks.gsc vending_trigger_think() player has perk; continue!" + "\n";
|
||||
logprint( logline16 );
|
||||
}
|
||||
self playsound( "deny" );
|
||||
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 1 );
|
||||
continue;
|
||||
@ -1950,11 +1907,6 @@ vending_trigger_think() //checked changed to match cerberus output
|
||||
valid = self [[ level.custom_perk_validation ]]( player );
|
||||
if ( !valid )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline17 = "_zm_perks.gsc vending_trigger_think() [[ level.custom_perk_validation ]] determines player is not eligble for perk; continue" + "\n";
|
||||
logprint( logline17 );
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -1965,11 +1917,6 @@ vending_trigger_think() //checked changed to match cerberus output
|
||||
}
|
||||
if ( player.score < current_cost )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline18 = "_zm_perks.gsc vending_trigger_think() player does not have enough points for perk; continue" + "\n";
|
||||
logprint( logline18 );
|
||||
}
|
||||
self playsound( "evt_perk_deny" );
|
||||
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 );
|
||||
continue;
|
||||
@ -1977,11 +1924,6 @@ vending_trigger_think() //checked changed to match cerberus output
|
||||
|
||||
if ( player.num_perks >= player get_player_perk_purchase_limit() )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline19 = "_zm_perks.gsc vending_trigger_think() player has reach their perk limit; continue" + "\n";
|
||||
logprint( logline19 );
|
||||
}
|
||||
self playsound( "evt_perk_deny" );
|
||||
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "sigh" );
|
||||
continue;
|
||||
@ -2001,32 +1943,11 @@ vending_trigger_post_think( player, perk ) //checked matches cerberus output
|
||||
player endon( "end_game" );
|
||||
player endon( "perk_abort_drinking" );
|
||||
gun = player perk_give_bottle_begin( perk );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline29 = "_zm_perks.gsc vending_trigger_post_think(); perk_give_bottle_begin() completed its operation " + " \n";
|
||||
logprint( logline29 );
|
||||
}
|
||||
evt = player waittill_any_return( "fake_death", "death", "player_downed", "weapon_change_complete" );
|
||||
//evt = waittill( "weapon_change_complete" );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline28 = "_zm_perks.gsc vending_trigger_post_think() finished waiting for event: " + evt + " \n";
|
||||
logprint( logline28 );
|
||||
}
|
||||
if ( evt == "weapon_change_complete" )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline26 = "_zm_perks.gsc vending_trigger_post_think() weapon_change_complete occured calling wait_give_perk() " + " \n";
|
||||
logprint( logline26 );
|
||||
}
|
||||
player thread wait_give_perk( perk, 1 );
|
||||
}
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline27 = "_zm_perks.gsc vending_trigger_post_think(); wait_give_perk() finished; calling perk_give_bottle_end() " + " \n";
|
||||
logprint( logline27 );
|
||||
}
|
||||
player perk_give_bottle_end( gun, perk );
|
||||
if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission )
|
||||
{
|
||||
@ -2091,11 +2012,6 @@ wait_give_perk( perk, bought ) //checked matches cerberus output
|
||||
self endon( "end_game" );
|
||||
self endon( "perk_abort_drinking" );
|
||||
self waittill_notify_or_timeout( "burp", 0.5 );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline23 = "_zm_perks.gsc wait_give_perk() gives player a perk" + "\n";
|
||||
logprint( logline23 );
|
||||
}
|
||||
self give_perk( perk, bought );
|
||||
}
|
||||
|
||||
@ -2116,11 +2032,6 @@ return_retained_perks() //checked changed to match cerberus output
|
||||
|
||||
give_perk( perk, bought ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline24 = "_zm_perks.gsc give_perk() gives player perk: " + perk + " \n";
|
||||
logprint( logline24 );
|
||||
}
|
||||
self setperk( perk );
|
||||
self.num_perks++;
|
||||
if ( isDefined( bought ) && bought )
|
||||
@ -2204,11 +2115,6 @@ give_perk( perk, bought ) //checked changed to match cerberus output
|
||||
}
|
||||
self.perks_active[ self.perks_active.size ] = perk;
|
||||
self notify( "perk_acquired" );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline25 = "_zm_perks.gsc give_perk() calls perk_think" + " \n";
|
||||
logprint( logline25 );
|
||||
}
|
||||
self thread perk_think( perk );
|
||||
}
|
||||
|
||||
@ -2578,18 +2484,8 @@ perk_give_bottle_begin( perk ) //checked matches cerberus output
|
||||
{
|
||||
weapon = level._custom_perks[ perk ].perk_bottle;
|
||||
}
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline20 = "_zm_perks.gsc perk_give_bottle_begin() gives perk bottle to player" + "\n";
|
||||
logprint( logline20 );
|
||||
}
|
||||
self giveweapon( weapon );
|
||||
self switchtoweapon( weapon );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline21 = "_zm_perks.gsc perk_give_bottle_begin() returns gun" + "\n";
|
||||
logprint( logline21 );
|
||||
}
|
||||
return gun;
|
||||
}
|
||||
|
||||
@ -2689,11 +2585,7 @@ perk_give_bottle_end( gun, perk ) //checked matches cerberus output
|
||||
{
|
||||
self decrement_is_drinking();
|
||||
}
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline22 = "_zm_perks.gsc perk_give_bottle_end() finishes returning gun to player" + "\n";
|
||||
logprint( logline22 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
perk_abort_drinking( post_delay ) //checked matches cerberus output
|
||||
@ -3075,90 +2967,40 @@ perk_machine_spawn_init()
|
||||
}
|
||||
if ( match_string == "zclassic_perks_rooftop" || match_string == "zclassic_perks_tomb" || match_string == "zstandard_perks_nuked" )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline1 = "_zm_perks.gsc: perk_machine_spawn_init() uses default location " + "\n";
|
||||
logprint( logline1 );
|
||||
}
|
||||
useDefaultLocation = 1;
|
||||
}
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline2 = "_zm_perks.gsc: perk_machine_spawn_init() found: " + structs.size + " zm_perk_machines" + " \n";
|
||||
logprint( logline2 );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < structs.size )
|
||||
{
|
||||
if ( isdefined( structs[ i ].script_string ) )
|
||||
{
|
||||
tokens = strtok( structs[ i ].script_string, " " );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline3 = "_zm_perks.gsc: perk_machine_spawn_init() found: " + tokens.size + " match_strings" + " \n";
|
||||
logprint( logline3 );
|
||||
}
|
||||
k = 0;
|
||||
while ( k < tokens.size )
|
||||
{
|
||||
if ( tokens[ k ] == match_string )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline4 = "_zm_perks.gsc: perk_machine_spawn_init() found that token matches match_string, setting perk location to match_string location" + " \n";
|
||||
logprint( logline4 );
|
||||
}
|
||||
pos[ pos.size ] = structs[ i ];
|
||||
}
|
||||
k++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline5 = "_zm_perks.gsc: perk_machine_spawn_init() found that token did not match match_string, skipping " + "\n";
|
||||
logprint( logline5 );
|
||||
}
|
||||
//pos[ pos.size ] = structs[ i ];
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( isDefined( useDefaultLocation ) && useDefaultLocation )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline6 = "_zm_perks.gsc: perk_machine_spawn_init() found that map only has one location, setting to match_string by default " + "\n";
|
||||
logprint( logline6 );
|
||||
}
|
||||
pos[ pos.size ] = structs[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !IsDefined( pos ) || pos.size == 0 )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline7 = "_zm_perks.gsc: perk_machine_spawn_init() returning because pos is undefined or pos.size is 0 " + "\n";
|
||||
logprint( logline7 );
|
||||
}
|
||||
return;
|
||||
}
|
||||
PreCacheModel("zm_collision_perks1");
|
||||
for ( i = 0; i < pos.size; i++ )
|
||||
{
|
||||
perk = pos[ i ].script_noteworthy;
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline8 = "_zm_perks.gsc: perk_machine_spawn_init() checking perk: " + perk + " \n";
|
||||
logprint( logline8 );
|
||||
}
|
||||
if ( IsDefined( perk ) && IsDefined( pos[ i ].model ) )
|
||||
{
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline9 = "_zm_perks.gsc: perk_machine_spawn_init() found perk and perk model; spawning in: " + perk + " \n";
|
||||
logprint( logline9 );
|
||||
}
|
||||
use_trigger = Spawn( "trigger_radius_use", pos[ i ].origin + ( 0, 0, 30 ), 0, 40, 70 );
|
||||
use_trigger.targetname = "zombie_vending";
|
||||
use_trigger.script_noteworthy = perk;
|
||||
@ -3350,11 +3192,6 @@ perk_machine_spawn_init()
|
||||
if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_machine_set_kvps ) )
|
||||
{
|
||||
[[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision );
|
||||
if ( level.debugLogging_zm_perks )
|
||||
{
|
||||
logline30 = "_zm_perks.gsc: perk_machine_spawn_init() called level._custom_perks[ perk ].perk_machine_set_kvps on perk: " + perk + " \n";
|
||||
logprint( logline30 );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -4098,3 +3935,6 @@ _register_undefined_perk( str_perk ) //checked matches cerberus output
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
583
patch_zm/maps/mp/zombies/_zm_playerhealth.gsc
Normal file
583
patch_zm/maps/mp/zombies/_zm_playerhealth.gsc
Normal file
@ -0,0 +1,583 @@
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isDefined( level.script ) )
|
||||
{
|
||||
level.script = tolower( getDvar( "mapname" ) );
|
||||
}
|
||||
precacheshader( "overlay_low_health" );
|
||||
level.global_damage_func_ads = ::empty_kill_func;
|
||||
level.global_damage_func = ::empty_kill_func;
|
||||
level.difficultytype[ 0 ] = "easy";
|
||||
level.difficultytype[ 1 ] = "normal";
|
||||
level.difficultytype[ 2 ] = "hardened";
|
||||
level.difficultytype[ 3 ] = "veteran";
|
||||
level.difficultystring[ "easy" ] = &"GAMESKILL_EASY";
|
||||
level.difficultystring[ "normal" ] = &"GAMESKILL_NORMAL";
|
||||
level.difficultystring[ "hardened" ] = &"GAMESKILL_HARDENED";
|
||||
level.difficultystring[ "veteran" ] = &"GAMESKILL_VETERAN";
|
||||
/#
|
||||
thread playerhealthdebug();
|
||||
#/
|
||||
level.gameskill = 1;
|
||||
switch( level.gameskill )
|
||||
{
|
||||
case 0:
|
||||
setdvar( "currentDifficulty", "easy" );
|
||||
break;
|
||||
case 1:
|
||||
setdvar( "currentDifficulty", "normal" );
|
||||
break;
|
||||
case 2:
|
||||
setdvar( "currentDifficulty", "hardened" );
|
||||
break;
|
||||
case 3:
|
||||
setdvar( "currentDifficulty", "veteran" );
|
||||
break;
|
||||
}
|
||||
logstring( "difficulty: " + level.gameskill );
|
||||
level.player_deathinvulnerabletime = 1700;
|
||||
level.longregentime = 5000;
|
||||
level.healthoverlaycutoff = 0,2;
|
||||
level.invultime_preshield = 0,35;
|
||||
level.invultime_onshield = 0,5;
|
||||
level.invultime_postshield = 0,3;
|
||||
level.playerhealth_regularregendelay = 2400;
|
||||
level.worthydamageratio = 0,1;
|
||||
setdvar( "player_meleeDamageMultiplier", 0,4 );
|
||||
onplayerconnect_callback( ::onplayerconnect );
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
self thread onplayerspawned();
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 );
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self notify( "noHealthOverlay" );
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerhurtcheck()
|
||||
{
|
||||
self endon( "noHealthOverlay" );
|
||||
self.hurtagain = 0;
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, dir, point, mod );
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) && attacker.team == self.team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.hurtagain = 1;
|
||||
self.damagepoint = point;
|
||||
self.damageattacker = attacker;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerhealthregen()
|
||||
{
|
||||
self notify( "playerHealthRegen" );
|
||||
self endon( "playerHealthRegen" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
if ( !isDefined( self.flag ) )
|
||||
{
|
||||
self.flag = [];
|
||||
self.flags_lock = [];
|
||||
}
|
||||
if ( !isDefined( self.flag[ "player_has_red_flashing_overlay" ] ) )
|
||||
{
|
||||
self player_flag_init( "player_has_red_flashing_overlay" );
|
||||
self player_flag_init( "player_is_invulnerable" );
|
||||
}
|
||||
self player_flag_clear( "player_has_red_flashing_overlay" );
|
||||
self player_flag_clear( "player_is_invulnerable" );
|
||||
self thread healthoverlay();
|
||||
oldratio = 1;
|
||||
health_add = 0;
|
||||
regenrate = 0,1;
|
||||
veryhurt = 0;
|
||||
playerjustgotredflashing = 0;
|
||||
invultime = 0;
|
||||
hurttime = 0;
|
||||
newhealth = 0;
|
||||
lastinvulratio = 1;
|
||||
self thread playerhurtcheck();
|
||||
if ( !isDefined( self.veryhurt ) )
|
||||
{
|
||||
self.veryhurt = 0;
|
||||
}
|
||||
self.bolthit = 0;
|
||||
if ( getDvar( "scr_playerInvulTimeScale" ) == "" )
|
||||
{
|
||||
setdvar( "scr_playerInvulTimeScale", 1 );
|
||||
}
|
||||
playerinvultimescale = getDvarFloat( "scr_playerInvulTimeScale" );
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0,05;
|
||||
waittillframeend;
|
||||
if ( self.health == self.maxhealth )
|
||||
{
|
||||
if ( self player_flag( "player_has_red_flashing_overlay" ) )
|
||||
{
|
||||
player_flag_clear( "player_has_red_flashing_overlay" );
|
||||
}
|
||||
lastinvulratio = 1;
|
||||
playerjustgotredflashing = 0;
|
||||
veryhurt = 0;
|
||||
continue;
|
||||
}
|
||||
else if ( self.health <= 0 )
|
||||
{
|
||||
/#
|
||||
showhitlog();
|
||||
#/
|
||||
return;
|
||||
}
|
||||
wasveryhurt = veryhurt;
|
||||
health_ratio = self.health / self.maxhealth;
|
||||
if ( health_ratio <= level.healthoverlaycutoff )
|
||||
{
|
||||
veryhurt = 1;
|
||||
if ( !wasveryhurt )
|
||||
{
|
||||
hurttime = getTime();
|
||||
self startfadingblur( 3,6, 2 );
|
||||
self player_flag_set( "player_has_red_flashing_overlay" );
|
||||
playerjustgotredflashing = 1;
|
||||
}
|
||||
}
|
||||
if ( self.hurtagain )
|
||||
{
|
||||
hurttime = getTime();
|
||||
self.hurtagain = 0;
|
||||
}
|
||||
if ( health_ratio >= oldratio )
|
||||
{
|
||||
if ( ( getTime() - hurttime ) < level.playerhealth_regularregendelay )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( veryhurt )
|
||||
{
|
||||
self.veryhurt = 1;
|
||||
newhealth = health_ratio;
|
||||
if ( getTime() > ( hurttime + level.longregentime ) )
|
||||
{
|
||||
newhealth += regenrate;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
newhealth = 1;
|
||||
self.veryhurt = 0;
|
||||
}
|
||||
if ( newhealth > 1 )
|
||||
{
|
||||
newhealth = 1;
|
||||
}
|
||||
if ( newhealth <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/#
|
||||
if ( newhealth > health_ratio )
|
||||
{
|
||||
logregen( newhealth );
|
||||
#/
|
||||
}
|
||||
self setnormalhealth( newhealth );
|
||||
oldratio = self.health / self.maxhealth;
|
||||
continue;
|
||||
}
|
||||
else invulworthyhealthdrop = ( lastinvulratio - health_ratio ) > level.worthydamageratio;
|
||||
if ( self.health <= 1 )
|
||||
{
|
||||
self setnormalhealth( 2 / self.maxhealth );
|
||||
invulworthyhealthdrop = 1;
|
||||
/#
|
||||
if ( !isDefined( level.player_deathinvulnerabletimeout ) )
|
||||
{
|
||||
level.player_deathinvulnerabletimeout = 0;
|
||||
}
|
||||
if ( level.player_deathinvulnerabletimeout < getTime() )
|
||||
{
|
||||
level.player_deathinvulnerabletimeout = getTime() + getDvarInt( "player_deathInvulnerableTime" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
oldratio = self.health / self.maxhealth;
|
||||
level notify( "hit_again" );
|
||||
health_add = 0;
|
||||
hurttime = getTime();
|
||||
self startfadingblur( 3, 0,8 );
|
||||
if ( !invulworthyhealthdrop || playerinvultimescale <= 0 )
|
||||
{
|
||||
/#
|
||||
loghit( self.health, 0 );
|
||||
#/
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self player_flag( "player_is_invulnerable" ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self player_flag_set( "player_is_invulnerable" );
|
||||
level notify( "player_becoming_invulnerable" );
|
||||
if ( playerjustgotredflashing )
|
||||
{
|
||||
invultime = level.invultime_onshield;
|
||||
playerjustgotredflashing = 0;
|
||||
}
|
||||
else if ( veryhurt )
|
||||
{
|
||||
invultime = level.invultime_postshield;
|
||||
}
|
||||
else
|
||||
{
|
||||
invultime = level.invultime_preshield;
|
||||
}
|
||||
invultime *= playerinvultimescale;
|
||||
/#
|
||||
loghit( self.health, invultime );
|
||||
#/
|
||||
lastinvulratio = self.health / self.maxhealth;
|
||||
self thread playerinvul( invultime );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerinvul( timer )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
if ( timer > 0 )
|
||||
{
|
||||
/#
|
||||
level.playerinvultimeend = getTime() + ( timer * 1000 );
|
||||
#/
|
||||
wait timer;
|
||||
}
|
||||
self player_flag_clear( "player_is_invulnerable" );
|
||||
}
|
||||
|
||||
healthoverlay()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "noHealthOverlay" );
|
||||
if ( !isDefined( self._health_overlay ) )
|
||||
{
|
||||
self._health_overlay = newclienthudelem( self );
|
||||
self._health_overlay.x = 0;
|
||||
self._health_overlay.y = 0;
|
||||
self._health_overlay setshader( "overlay_low_health", 640, 480 );
|
||||
self._health_overlay.alignx = "left";
|
||||
self._health_overlay.aligny = "top";
|
||||
self._health_overlay.horzalign = "fullscreen";
|
||||
self._health_overlay.vertalign = "fullscreen";
|
||||
self._health_overlay.alpha = 0;
|
||||
}
|
||||
overlay = self._health_overlay;
|
||||
self thread healthoverlay_remove( overlay );
|
||||
self thread watchhideredflashingoverlay( overlay );
|
||||
pulsetime = 0,8;
|
||||
for ( ;; )
|
||||
{
|
||||
if ( overlay.alpha > 0 )
|
||||
{
|
||||
overlay fadeovertime( 0,5 );
|
||||
}
|
||||
overlay.alpha = 0;
|
||||
self player_flag_wait( "player_has_red_flashing_overlay" );
|
||||
self redflashingoverlay( overlay );
|
||||
}
|
||||
}
|
||||
|
||||
fadefunc( overlay, severity, mult, hud_scaleonly )
|
||||
{
|
||||
pulsetime = 0,8;
|
||||
scalemin = 0,5;
|
||||
fadeintime = pulsetime * 0,1;
|
||||
stayfulltime = pulsetime * ( 0,1 + ( severity * 0,2 ) );
|
||||
fadeouthalftime = pulsetime * ( 0,1 + ( severity * 0,1 ) );
|
||||
fadeoutfulltime = pulsetime * 0,3;
|
||||
remainingtime = pulsetime - fadeintime - stayfulltime - fadeouthalftime - fadeoutfulltime;
|
||||
/#
|
||||
assert( remainingtime >= -0,001 );
|
||||
#/
|
||||
if ( remainingtime < 0 )
|
||||
{
|
||||
remainingtime = 0;
|
||||
}
|
||||
halfalpha = 0,8 + ( severity * 0,1 );
|
||||
leastalpha = 0,5 + ( severity * 0,3 );
|
||||
overlay fadeovertime( fadeintime );
|
||||
overlay.alpha = mult * 1;
|
||||
wait ( fadeintime + stayfulltime );
|
||||
overlay fadeovertime( fadeouthalftime );
|
||||
overlay.alpha = mult * halfalpha;
|
||||
wait fadeouthalftime;
|
||||
overlay fadeovertime( fadeoutfulltime );
|
||||
overlay.alpha = mult * leastalpha;
|
||||
wait fadeoutfulltime;
|
||||
wait remainingtime;
|
||||
}
|
||||
|
||||
watchhideredflashingoverlay( overlay )
|
||||
{
|
||||
self endon( "death_or_disconnect" );
|
||||
while ( isDefined( overlay ) )
|
||||
{
|
||||
self waittill( "clear_red_flashing_overlay" );
|
||||
self player_flag_clear( "player_has_red_flashing_overlay" );
|
||||
overlay fadeovertime( 0,05 );
|
||||
overlay.alpha = 0;
|
||||
setclientsysstate( "levelNotify", "rfo3", self );
|
||||
self notify( "hit_again" );
|
||||
}
|
||||
}
|
||||
|
||||
redflashingoverlay( overlay )
|
||||
{
|
||||
self endon( "hit_again" );
|
||||
self endon( "damage" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "clear_red_flashing_overlay" );
|
||||
self.stopflashingbadlytime = getTime() + level.longregentime;
|
||||
if ( isDefined( self.is_in_process_of_zombify ) && !self.is_in_process_of_zombify && isDefined( self.is_zombie ) && !self.is_zombie )
|
||||
{
|
||||
fadefunc( overlay, 1, 1, 0 );
|
||||
while ( getTime() < self.stopflashingbadlytime && isalive( self ) && isDefined( self.is_in_process_of_zombify ) && !self.is_in_process_of_zombify && isDefined( self.is_zombie ) && !self.is_zombie )
|
||||
{
|
||||
fadefunc( overlay, 0,9, 1, 0 );
|
||||
}
|
||||
if ( isDefined( self.is_in_process_of_zombify ) && !self.is_in_process_of_zombify && isDefined( self.is_zombie ) && !self.is_zombie )
|
||||
{
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
fadefunc( overlay, 0,65, 0,8, 0 );
|
||||
}
|
||||
fadefunc( overlay, 0, 0,6, 1 );
|
||||
}
|
||||
}
|
||||
overlay fadeovertime( 0,5 );
|
||||
overlay.alpha = 0;
|
||||
self player_flag_clear( "player_has_red_flashing_overlay" );
|
||||
setclientsysstate( "levelNotify", "rfo3", self );
|
||||
wait 0,5;
|
||||
self notify( "hit_again" );
|
||||
}
|
||||
|
||||
healthoverlay_remove( overlay )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self waittill_any( "noHealthOverlay", "death" );
|
||||
overlay fadeovertime( 3,5 );
|
||||
overlay.alpha = 0;
|
||||
}
|
||||
|
||||
empty_kill_func( type, loc, point, attacker, amount )
|
||||
{
|
||||
}
|
||||
|
||||
loghit( newhealth, invultime )
|
||||
{
|
||||
/#
|
||||
#/
|
||||
}
|
||||
|
||||
logregen( newhealth )
|
||||
{
|
||||
/#
|
||||
#/
|
||||
}
|
||||
|
||||
showhitlog()
|
||||
{
|
||||
/#
|
||||
#/
|
||||
}
|
||||
|
||||
playerhealthdebug()
|
||||
{
|
||||
/#
|
||||
if ( getDvar( "scr_health_debug" ) == "" )
|
||||
{
|
||||
setdvar( "scr_health_debug", "0" );
|
||||
}
|
||||
waittillframeend;
|
||||
while ( 1 )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
if ( getDvar( "scr_health_debug" ) != "0" )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,5;
|
||||
}
|
||||
}
|
||||
thread printhealthdebug();
|
||||
while ( 1 )
|
||||
{
|
||||
if ( getDvar( "scr_health_debug" ) == "0" )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,5;
|
||||
}
|
||||
}
|
||||
level notify( "stop_printing_grenade_timers" );
|
||||
destroyhealthdebug();
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
printhealthdebug()
|
||||
{
|
||||
/#
|
||||
level notify( "stop_printing_health_bars" );
|
||||
level endon( "stop_printing_health_bars" );
|
||||
x = 40;
|
||||
y = 40;
|
||||
level.healthbarhudelems = [];
|
||||
level.healthbarkeys[ 0 ] = "Health";
|
||||
level.healthbarkeys[ 1 ] = "No Hit Time";
|
||||
level.healthbarkeys[ 2 ] = "No Die Time";
|
||||
if ( !isDefined( level.playerinvultimeend ) )
|
||||
{
|
||||
level.playerinvultimeend = 0;
|
||||
}
|
||||
if ( !isDefined( level.player_deathinvulnerabletimeout ) )
|
||||
{
|
||||
level.player_deathinvulnerabletimeout = 0;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.healthbarkeys.size )
|
||||
{
|
||||
key = level.healthbarkeys[ i ];
|
||||
textelem = newhudelem();
|
||||
textelem.x = x;
|
||||
textelem.y = y;
|
||||
textelem.alignx = "left";
|
||||
textelem.aligny = "top";
|
||||
textelem.horzalign = "fullscreen";
|
||||
textelem.vertalign = "fullscreen";
|
||||
textelem settext( key );
|
||||
bgbar = newhudelem();
|
||||
bgbar.x = x + 79;
|
||||
bgbar.y = y + 1;
|
||||
bgbar.alignx = "left";
|
||||
bgbar.aligny = "top";
|
||||
bgbar.horzalign = "fullscreen";
|
||||
bgbar.vertalign = "fullscreen";
|
||||
bgbar.maxwidth = 3;
|
||||
bgbar setshader( "white", bgbar.maxwidth, 10 );
|
||||
bgbar.color = vectorScale( ( 1, 1, 1 ), 0,5 );
|
||||
bar = newhudelem();
|
||||
bar.x = x + 80;
|
||||
bar.y = y + 2;
|
||||
bar.alignx = "left";
|
||||
bar.aligny = "top";
|
||||
bar.horzalign = "fullscreen";
|
||||
bar.vertalign = "fullscreen";
|
||||
bar setshader( "black", 1, 8 );
|
||||
textelem.bar = bar;
|
||||
textelem.bgbar = bgbar;
|
||||
textelem.key = key;
|
||||
y += 10;
|
||||
level.healthbarhudelems[ key ] = textelem;
|
||||
i++;
|
||||
}
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,05;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < level.healthbarkeys.size && players.size > 0 )
|
||||
{
|
||||
key = level.healthbarkeys[ i ];
|
||||
player = players[ 0 ];
|
||||
width = 0;
|
||||
if ( i == 0 )
|
||||
{
|
||||
width = ( player.health / player.maxhealth ) * 300;
|
||||
}
|
||||
else if ( i == 1 )
|
||||
{
|
||||
width = ( ( level.playerinvultimeend - getTime() ) / 1000 ) * 40;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( i == 2 )
|
||||
{
|
||||
width = ( ( level.player_deathinvulnerabletimeout - getTime() ) / 1000 ) * 40;
|
||||
}
|
||||
}
|
||||
width = int( max( width, 1 ) );
|
||||
width = int( min( width, 300 ) );
|
||||
bar = level.healthbarhudelems[ key ].bar;
|
||||
bar setshader( "black", width, 8 );
|
||||
bgbar = level.healthbarhudelems[ key ].bgbar;
|
||||
if ( ( width + 2 ) > bgbar.maxwidth )
|
||||
{
|
||||
bgbar.maxwidth = width + 2;
|
||||
bgbar setshader( "white", bgbar.maxwidth, 10 );
|
||||
bgbar.color = vectorScale( ( 1, 1, 1 ), 0,5 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
destroyhealthdebug()
|
||||
{
|
||||
/#
|
||||
if ( !isDefined( level.healthbarhudelems ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.healthbarkeys.size )
|
||||
{
|
||||
level.healthbarhudelems[ level.healthbarkeys[ i ] ].bgbar destroy();
|
||||
level.healthbarhudelems[ level.healthbarkeys[ i ] ].bar destroy();
|
||||
level.healthbarhudelems[ level.healthbarkeys[ i ] ] destroy();
|
||||
i++;
|
||||
#/
|
||||
}
|
||||
}
|
741
patch_zm/maps/mp/zombies/_zm_power.gsc
Normal file
741
patch_zm/maps/mp/zombies/_zm_power.gsc
Normal file
@ -0,0 +1,741 @@
|
||||
#include maps/mp/zombies/_zm_ai_basic;
|
||||
#include maps/mp/_demo;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isDefined( level.powered_items ) )
|
||||
{
|
||||
level.powered_items = [];
|
||||
}
|
||||
if ( !isDefined( level.local_power ) )
|
||||
{
|
||||
level.local_power = [];
|
||||
}
|
||||
thread standard_powered_items();
|
||||
/#
|
||||
thread debug_powered_items();
|
||||
#/
|
||||
}
|
||||
|
||||
debug_powered_items()
|
||||
{
|
||||
/#
|
||||
while ( 1 )
|
||||
{
|
||||
while ( getDvarInt( #"EB512CB7" ) )
|
||||
{
|
||||
while ( isDefined( level.local_power ) )
|
||||
{
|
||||
_a32 = level.local_power;
|
||||
_k32 = getFirstArrayKey( _a32 );
|
||||
while ( isDefined( _k32 ) )
|
||||
{
|
||||
localpower = _a32[ _k32 ];
|
||||
circle( localpower.origin, localpower.radius, ( 0, 0, 1 ), 0, 1, 1 );
|
||||
_k32 = getNextArrayKey( _a32, _k32 );
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
watch_global_power()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
flag_wait( "power_on" );
|
||||
level thread set_global_power( 1 );
|
||||
flag_waitopen( "power_on" );
|
||||
level thread set_global_power( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
standard_powered_items()
|
||||
{
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
vending_triggers = getentarray( "zombie_vending", "targetname" );
|
||||
_a67 = vending_triggers;
|
||||
_k67 = getFirstArrayKey( _a67 );
|
||||
while ( isDefined( _k67 ) )
|
||||
{
|
||||
trigger = _a67[ _k67 ];
|
||||
if ( trigger.script_noteworthy == "specialty_weapupgrade" )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( trigger.script_noteworthy );
|
||||
add_powered_item( ::perk_power_on, ::perk_power_off, ::perk_range, ::cost_low_if_local, 0, powered_on, trigger );
|
||||
}
|
||||
_k67 = getNextArrayKey( _a67, _k67 );
|
||||
}
|
||||
pack_a_punch = getentarray( "specialty_weapupgrade", "script_noteworthy" );
|
||||
_a77 = pack_a_punch;
|
||||
_k77 = getFirstArrayKey( _a77 );
|
||||
while ( isDefined( _k77 ) )
|
||||
{
|
||||
trigger = _a77[ _k77 ];
|
||||
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( trigger.script_noteworthy );
|
||||
trigger.powered = add_powered_item( ::pap_power_on, ::pap_power_off, ::pap_range, ::cost_low_if_local, 0, powered_on, trigger );
|
||||
_k77 = getNextArrayKey( _a77, _k77 );
|
||||
}
|
||||
zombie_doors = getentarray( "zombie_door", "targetname" );
|
||||
_a86 = zombie_doors;
|
||||
_k86 = getFirstArrayKey( _a86 );
|
||||
while ( isDefined( _k86 ) )
|
||||
{
|
||||
door = _a86[ _k86 ];
|
||||
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" )
|
||||
{
|
||||
add_powered_item( ::door_power_on, ::door_power_off, ::door_range, ::cost_door, 0, 0, door );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" )
|
||||
{
|
||||
power_sources = 0;
|
||||
if ( isDefined( level.power_local_doors_globally ) && !level.power_local_doors_globally )
|
||||
{
|
||||
power_sources = 1;
|
||||
}
|
||||
add_powered_item( ::door_local_power_on, ::door_local_power_off, ::door_range, ::cost_door, power_sources, 0, door );
|
||||
}
|
||||
}
|
||||
_k86 = getNextArrayKey( _a86, _k86 );
|
||||
}
|
||||
thread watch_global_power();
|
||||
}
|
||||
|
||||
add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target )
|
||||
{
|
||||
powered = spawnstruct();
|
||||
powered.power_on_func = power_on_func;
|
||||
powered.power_off_func = power_off_func;
|
||||
powered.range_func = range_func;
|
||||
powered.power_sources = power_sources;
|
||||
powered.self_powered = self_powered;
|
||||
powered.target = target;
|
||||
powered.cost_func = cost_func;
|
||||
powered.power = self_powered;
|
||||
powered.powered_count = self_powered;
|
||||
powered.depowered_count = 0;
|
||||
if ( !isDefined( level.powered_items ) )
|
||||
{
|
||||
level.powered_items = [];
|
||||
}
|
||||
level.powered_items[ level.powered_items.size ] = powered;
|
||||
return powered;
|
||||
}
|
||||
|
||||
remove_powered_item( powered )
|
||||
{
|
||||
arrayremovevalue( level.powered_items, powered, 0 );
|
||||
}
|
||||
|
||||
add_temp_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target )
|
||||
{
|
||||
powered = add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target );
|
||||
while ( isDefined( level.local_power ) )
|
||||
{
|
||||
_a140 = level.local_power;
|
||||
_k140 = getFirstArrayKey( _a140 );
|
||||
while ( isDefined( _k140 ) )
|
||||
{
|
||||
localpower = _a140[ _k140 ];
|
||||
if ( powered [[ powered.range_func ]]( 1, localpower.origin, localpower.radius ) )
|
||||
{
|
||||
powered change_power( 1, localpower.origin, localpower.radius );
|
||||
if ( !isDefined( localpower.added_list ) )
|
||||
{
|
||||
localpower.added_list = [];
|
||||
}
|
||||
localpower.added_list[ localpower.added_list.size ] = powered;
|
||||
}
|
||||
_k140 = getNextArrayKey( _a140, _k140 );
|
||||
}
|
||||
}
|
||||
thread watch_temp_powered_item( powered );
|
||||
return powered;
|
||||
}
|
||||
|
||||
watch_temp_powered_item( powered )
|
||||
{
|
||||
powered.target waittill( "death" );
|
||||
remove_powered_item( powered );
|
||||
while ( isDefined( level.local_power ) )
|
||||
{
|
||||
_a161 = level.local_power;
|
||||
_k161 = getFirstArrayKey( _a161 );
|
||||
while ( isDefined( _k161 ) )
|
||||
{
|
||||
localpower = _a161[ _k161 ];
|
||||
if ( isDefined( localpower.added_list ) )
|
||||
{
|
||||
arrayremovevalue( localpower.added_list, powered, 0 );
|
||||
}
|
||||
if ( isDefined( localpower.enabled_list ) )
|
||||
{
|
||||
arrayremovevalue( localpower.enabled_list, powered, 0 );
|
||||
}
|
||||
_k161 = getNextArrayKey( _a161, _k161 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
change_power_in_radius( delta, origin, radius )
|
||||
{
|
||||
changed_list = [];
|
||||
i = 0;
|
||||
while ( i < level.powered_items.size )
|
||||
{
|
||||
powered = level.powered_items[ i ];
|
||||
if ( powered.power_sources != 2 )
|
||||
{
|
||||
if ( powered [[ powered.range_func ]]( delta, origin, radius ) )
|
||||
{
|
||||
powered change_power( delta, origin, radius );
|
||||
changed_list[ changed_list.size ] = powered;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return changed_list;
|
||||
}
|
||||
|
||||
change_power( delta, origin, radius )
|
||||
{
|
||||
if ( delta > 0 )
|
||||
{
|
||||
if ( !self.power )
|
||||
{
|
||||
self.power = 1;
|
||||
self [[ self.power_on_func ]]( origin, radius );
|
||||
}
|
||||
self.powered_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( delta < 0 )
|
||||
{
|
||||
if ( self.power )
|
||||
{
|
||||
self.power = 0;
|
||||
self [[ self.power_off_func ]]( origin, radius );
|
||||
}
|
||||
self.depowered_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
revert_power_to_list( delta, origin, radius, powered_list )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < powered_list.size )
|
||||
{
|
||||
powered = powered_list[ i ];
|
||||
powered revert_power( delta, origin, radius );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
revert_power( delta, origin, radius, powered_list )
|
||||
{
|
||||
if ( delta > 0 )
|
||||
{
|
||||
self.depowered_count--;
|
||||
|
||||
/#
|
||||
assert( self.depowered_count >= 0, "Depower underflow in power system" );
|
||||
#/
|
||||
if ( self.depowered_count == 0 && self.powered_count > 0 && !self.power )
|
||||
{
|
||||
self.power = 1;
|
||||
self [[ self.power_on_func ]]( origin, radius );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( delta < 0 )
|
||||
{
|
||||
self.powered_count--;
|
||||
|
||||
/#
|
||||
assert( self.powered_count >= 0, "Repower underflow in power system" );
|
||||
#/
|
||||
if ( self.powered_count == 0 && self.power )
|
||||
{
|
||||
self.power = 0;
|
||||
self [[ self.power_off_func ]]( origin, radius );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
add_local_power( origin, radius )
|
||||
{
|
||||
localpower = spawnstruct();
|
||||
/#
|
||||
println( "ZM POWER: local power on at " + origin + " radius " + radius + "\n" );
|
||||
#/
|
||||
localpower.origin = origin;
|
||||
localpower.radius = radius;
|
||||
localpower.enabled_list = change_power_in_radius( 1, origin, radius );
|
||||
if ( !isDefined( level.local_power ) )
|
||||
{
|
||||
level.local_power = [];
|
||||
}
|
||||
level.local_power[ level.local_power.size ] = localpower;
|
||||
return localpower;
|
||||
}
|
||||
|
||||
move_local_power( localpower, origin )
|
||||
{
|
||||
changed_list = [];
|
||||
i = 0;
|
||||
while ( i < level.powered_items.size )
|
||||
{
|
||||
powered = level.powered_items[ i ];
|
||||
if ( powered.power_sources == 2 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else waspowered = isinarray( localpower.enabled_list, powered );
|
||||
ispowered = powered [[ powered.range_func ]]( 1, origin, localpower.radius );
|
||||
if ( ispowered && !waspowered )
|
||||
{
|
||||
powered change_power( 1, origin, localpower.radius );
|
||||
localpower.enabled_list[ localpower.enabled_list.size ] = powered;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !ispowered && waspowered )
|
||||
{
|
||||
powered revert_power( -1, localpower.origin, localpower.radius, localpower.enabled_list );
|
||||
arrayremovevalue( localpower.enabled_list, powered, 0 );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
localpower.origin = origin;
|
||||
return localpower;
|
||||
}
|
||||
|
||||
end_local_power( localpower )
|
||||
{
|
||||
/#
|
||||
println( "ZM POWER: local power off at " + localpower.origin + " radius " + localpower.radius + "\n" );
|
||||
#/
|
||||
if ( isDefined( localpower.enabled_list ) )
|
||||
{
|
||||
revert_power_to_list( -1, localpower.origin, localpower.radius, localpower.enabled_list );
|
||||
}
|
||||
localpower.enabled_list = undefined;
|
||||
if ( isDefined( localpower.added_list ) )
|
||||
{
|
||||
revert_power_to_list( -1, localpower.origin, localpower.radius, localpower.added_list );
|
||||
}
|
||||
localpower.added_list = undefined;
|
||||
arrayremovevalue( level.local_power, localpower, 0 );
|
||||
}
|
||||
|
||||
has_local_power( origin )
|
||||
{
|
||||
while ( isDefined( level.local_power ) )
|
||||
{
|
||||
_a309 = level.local_power;
|
||||
_k309 = getFirstArrayKey( _a309 );
|
||||
while ( isDefined( _k309 ) )
|
||||
{
|
||||
localpower = _a309[ _k309 ];
|
||||
if ( distancesquared( localpower.origin, origin ) < ( localpower.radius * localpower.radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
_k309 = getNextArrayKey( _a309, _k309 );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
get_powered_item_cost()
|
||||
{
|
||||
if ( isDefined( self.power ) && !self.power )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( level._power_global ) && level._power_global && self.power_sources != 1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
cost = [[ self.cost_func ]]();
|
||||
power_sources = self.powered_count;
|
||||
if ( power_sources < 1 )
|
||||
{
|
||||
power_sources = 1;
|
||||
}
|
||||
return cost / power_sources;
|
||||
}
|
||||
|
||||
get_local_power_cost( localpower )
|
||||
{
|
||||
cost = 0;
|
||||
while ( isDefined( localpower ) && isDefined( localpower.enabled_list ) )
|
||||
{
|
||||
_a340 = localpower.enabled_list;
|
||||
_k340 = getFirstArrayKey( _a340 );
|
||||
while ( isDefined( _k340 ) )
|
||||
{
|
||||
powered = _a340[ _k340 ];
|
||||
cost += powered get_powered_item_cost();
|
||||
_k340 = getNextArrayKey( _a340, _k340 );
|
||||
}
|
||||
}
|
||||
while ( isDefined( localpower ) && isDefined( localpower.added_list ) )
|
||||
{
|
||||
_a345 = localpower.added_list;
|
||||
_k345 = getFirstArrayKey( _a345 );
|
||||
while ( isDefined( _k345 ) )
|
||||
{
|
||||
powered = _a345[ _k345 ];
|
||||
cost += powered get_powered_item_cost();
|
||||
_k345 = getNextArrayKey( _a345, _k345 );
|
||||
}
|
||||
}
|
||||
return cost;
|
||||
}
|
||||
|
||||
set_global_power( on_off )
|
||||
{
|
||||
maps/mp/_demo::bookmark( "zm_power", getTime(), undefined, undefined, 1 );
|
||||
level._power_global = on_off;
|
||||
i = 0;
|
||||
while ( i < level.powered_items.size )
|
||||
{
|
||||
powered = level.powered_items[ i ];
|
||||
if ( isDefined( powered.target ) && powered.power_sources != 1 )
|
||||
{
|
||||
powered global_power( on_off );
|
||||
wait_network_frame();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
global_power( on_off )
|
||||
{
|
||||
if ( on_off )
|
||||
{
|
||||
/#
|
||||
println( "ZM POWER: global power on\n" );
|
||||
#/
|
||||
if ( !self.power )
|
||||
{
|
||||
self.power = 1;
|
||||
self [[ self.power_on_func ]]();
|
||||
}
|
||||
self.powered_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "ZM POWER: global power off\n" );
|
||||
#/
|
||||
self.powered_count--;
|
||||
|
||||
/#
|
||||
assert( self.powered_count >= 0, "Repower underflow in power system" );
|
||||
#/
|
||||
if ( self.powered_count == 0 && self.power )
|
||||
{
|
||||
self.power = 0;
|
||||
self [[ self.power_off_func ]]();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
never_power_on( origin, radius )
|
||||
{
|
||||
}
|
||||
|
||||
never_power_off( origin, radius )
|
||||
{
|
||||
}
|
||||
|
||||
cost_negligible()
|
||||
{
|
||||
if ( isDefined( self.one_time_cost ) )
|
||||
{
|
||||
cost = self.one_time_cost;
|
||||
self.one_time_cost = undefined;
|
||||
return cost;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
cost_low_if_local()
|
||||
{
|
||||
if ( isDefined( self.one_time_cost ) )
|
||||
{
|
||||
cost = self.one_time_cost;
|
||||
self.one_time_cost = undefined;
|
||||
return cost;
|
||||
}
|
||||
if ( isDefined( level._power_global ) && level._power_global )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.self_powered ) && self.self_powered )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
cost_high()
|
||||
{
|
||||
if ( isDefined( self.one_time_cost ) )
|
||||
{
|
||||
cost = self.one_time_cost;
|
||||
self.one_time_cost = undefined;
|
||||
return cost;
|
||||
}
|
||||
return 10;
|
||||
}
|
||||
|
||||
door_range( delta, origin, radius )
|
||||
{
|
||||
if ( delta < 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
door_power_on( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: door on\n" );
|
||||
#/
|
||||
self.target.power_on = 1;
|
||||
self.target notify( "power_on" );
|
||||
}
|
||||
|
||||
door_power_off( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: door off\n" );
|
||||
#/
|
||||
self.target notify( "power_off" );
|
||||
self.target.power_on = 0;
|
||||
}
|
||||
|
||||
door_local_power_on( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: door on (local)\n" );
|
||||
#/
|
||||
self.target.local_power_on = 1;
|
||||
self.target notify( "local_power_on" );
|
||||
}
|
||||
|
||||
door_local_power_off( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: door off (local)\n" );
|
||||
#/
|
||||
self.target notify( "local_power_off" );
|
||||
self.target.local_power_on = 0;
|
||||
}
|
||||
|
||||
cost_door()
|
||||
{
|
||||
if ( isDefined( self.target.power_cost ) )
|
||||
{
|
||||
if ( !isDefined( self.one_time_cost ) )
|
||||
{
|
||||
self.one_time_cost = 0;
|
||||
}
|
||||
self.one_time_cost += self.target.power_cost;
|
||||
self.target.power_cost = 0;
|
||||
}
|
||||
if ( isDefined( self.one_time_cost ) )
|
||||
{
|
||||
cost = self.one_time_cost;
|
||||
self.one_time_cost = undefined;
|
||||
return cost;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
zombie_range( delta, origin, radius )
|
||||
{
|
||||
if ( delta > 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius );
|
||||
if ( !isDefined( self.zombies ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.power = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
zombie_power_off( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: zombies off\n" );
|
||||
#/
|
||||
i = 0;
|
||||
while ( i < self.zombies.size )
|
||||
{
|
||||
self.zombies[ i ] thread stun_zombie();
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
stun_zombie()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "stun_zombie" );
|
||||
self endon( "stun_zombie" );
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
/#
|
||||
iprintln( "trying to stun a dead zombie" );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.ignore_inert ) && self.ignore_inert )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.stun_zombie ) )
|
||||
{
|
||||
self thread [[ self.stun_zombie ]]();
|
||||
return;
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_ai_basic::start_inert();
|
||||
}
|
||||
|
||||
perk_range( delta, origin, radius )
|
||||
{
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
perkorigin = self.target.origin;
|
||||
if ( isDefined( self.target.trigger_off ) && self.target.trigger_off )
|
||||
{
|
||||
perkorigin = self.target.realorigin;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.target.disabled ) && self.target.disabled )
|
||||
{
|
||||
perkorigin += vectorScale( ( 0, 0, 1 ), 10000 );
|
||||
}
|
||||
}
|
||||
if ( distancesquared( perkorigin, origin ) < ( radius * radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
perk_power_on( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: perk " + self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + " on\n" );
|
||||
#/
|
||||
level notify( self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + "_on" );
|
||||
maps/mp/zombies/_zm_perks::perk_unpause( self.target.script_noteworthy );
|
||||
}
|
||||
|
||||
perk_power_off( origin, radius )
|
||||
{
|
||||
notify_name = self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify();
|
||||
if ( isDefined( notify_name ) && notify_name == "revive" )
|
||||
{
|
||||
if ( level flag_exists( "solo_game" ) && flag( "solo_game" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
/#
|
||||
println( "^1ZM POWER: perk " + self.target.script_noteworthy + " off\n" );
|
||||
#/
|
||||
self.target notify( "death" );
|
||||
self.target thread maps/mp/zombies/_zm_perks::vending_trigger_think();
|
||||
if ( isDefined( self.target.perk_hum ) )
|
||||
{
|
||||
self.target.perk_hum delete();
|
||||
}
|
||||
maps/mp/zombies/_zm_perks::perk_pause( self.target.script_noteworthy );
|
||||
level notify( self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + "_off" );
|
||||
}
|
||||
|
||||
pap_range( delta, origin, radius )
|
||||
{
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
paporigin = self.target.origin;
|
||||
if ( isDefined( self.target.trigger_off ) && self.target.trigger_off )
|
||||
{
|
||||
paporigin = self.target.realorigin;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.target.disabled ) && self.target.disabled )
|
||||
{
|
||||
paporigin += vectorScale( ( 0, 0, 1 ), 10000 );
|
||||
}
|
||||
}
|
||||
if ( distancesquared( paporigin, origin ) < ( radius * radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
pap_power_on( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: PaP on\n" );
|
||||
#/
|
||||
level notify( "Pack_A_Punch_on" );
|
||||
}
|
||||
|
||||
pap_power_off( origin, radius )
|
||||
{
|
||||
/#
|
||||
println( "^1ZM POWER: PaP off\n" );
|
||||
#/
|
||||
level notify( "Pack_A_Punch_off" );
|
||||
self.target notify( "death" );
|
||||
self.target thread maps/mp/zombies/_zm_perks::vending_weapon_upgrade();
|
||||
}
|
||||
|
||||
pap_is_on()
|
||||
{
|
||||
if ( isDefined( self.powered ) )
|
||||
{
|
||||
return self.powered.power;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -22,6 +22,19 @@
|
||||
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
//begin debug code
|
||||
level.custom_zm_powerups_loaded = 1;
|
||||
maps/mp/zombies/_zm_bot::init();
|
||||
if ( !isDefined( level.debugLogging_zm_powerups ) )
|
||||
{
|
||||
level.debugLogging_zm_powerups = 0;
|
||||
}
|
||||
if ( level.debugLogging_zm_powerups )
|
||||
{
|
||||
level.zombiesAlwaysDropPowerups = getDvarIntDefault( "zombiesAlwaysDropPowerups", 0 );
|
||||
thread zombies_always_drop_powerups();
|
||||
}
|
||||
//end debug code
|
||||
precacheshader( "specialty_doublepoints_zombies" );
|
||||
precacheshader( "specialty_instakill_zombies" );
|
||||
precacheshader( "specialty_firesale_zombies" );
|
||||
@ -43,6 +56,11 @@ init() //checked matches cerberus output
|
||||
set_zombie_var( "zombie_powerup_point_doubler_time", 30, undefined, undefined, 1 );
|
||||
set_zombie_var( "zombie_powerup_drop_increment", 2000 );
|
||||
set_zombie_var( "zombie_powerup_drop_max_per_round", 4 );
|
||||
if ( level.debugLogging_zm_powerups )
|
||||
{
|
||||
level.maxPowerupsPerRound = getDvarIntDefault( "maxPowerupsPerRound", 4 );
|
||||
level.zombie_vars["zombie_powerup_drop_max_per_round"] = level.maxPowerupsPerRound;
|
||||
}
|
||||
onplayerconnect_callback( ::init_player_zombie_vars );
|
||||
level._effect[ "powerup_on" ] = loadfx( "misc/fx_zombie_powerup_on" );
|
||||
level._effect[ "powerup_off" ] = loadfx( "misc/fx_zombie_powerup_off" );
|
||||
@ -187,8 +205,7 @@ powerup_hud_monitor() //checked partially changed to match cerberus output
|
||||
}
|
||||
client_fields = [];
|
||||
powerup_keys = getarraykeys( level.zombie_powerups );
|
||||
powerup_key_index = 0;
|
||||
while ( powerup_key_index < powerup_keys.size )
|
||||
for ( powerup_key_index = 0; powerup_key_index < powerup_keys.size; powerup_key_index++ )
|
||||
{
|
||||
if ( isDefined( level.zombie_powerups[ powerup_keys[ powerup_key_index ] ].client_field_name ) )
|
||||
{
|
||||
@ -199,20 +216,19 @@ powerup_hud_monitor() //checked partially changed to match cerberus output
|
||||
client_fields[ powerup_name ].time_name = level.zombie_powerups[ powerup_name ].time_name;
|
||||
client_fields[ powerup_name ].on_name = level.zombie_powerups[ powerup_name ].on_name;
|
||||
}
|
||||
powerup_key_index++;
|
||||
}
|
||||
client_field_keys = getarraykeys( client_fields );
|
||||
|
||||
while ( 1 )
|
||||
{
|
||||
wait(0.05);
|
||||
wait 0.05;
|
||||
waittillframeend;
|
||||
players = get_players();
|
||||
|
||||
for ( playerindex = 0; playerindex < players.size; playerindex++ )
|
||||
{
|
||||
|
||||
for(client_field_key_index = 0; client_field_key_index < client_field_keys.size; client_field_key_index++)
|
||||
client_field_key_index = 0;
|
||||
while ( client_field_key_index < client_field_keys.size )
|
||||
{
|
||||
|
||||
player = players[ playerindex ];
|
||||
@ -220,6 +236,7 @@ powerup_hud_monitor() //checked partially changed to match cerberus output
|
||||
{
|
||||
if ( ![[ level.powerup_player_valid ]]( player ) )
|
||||
{
|
||||
client_field_key_index++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -257,6 +274,7 @@ powerup_hud_monitor() //checked partially changed to match cerberus output
|
||||
{
|
||||
player setclientfieldtoplayer( client_field_name, 0 );
|
||||
}
|
||||
client_field_key_index++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -365,14 +383,12 @@ minigun_no_drop() //checked matches cerberus output
|
||||
get_num_window_destroyed() //checked partially matches cerberus output did not change
|
||||
{
|
||||
num = 0;
|
||||
i = 0;
|
||||
while ( i < level.exterior_goals.size )
|
||||
for ( i = 0; i < level.exterior_goals.size; i++ )
|
||||
{
|
||||
if ( all_chunks_destroyed( level.exterior_goals[ i ], level.exterior_goals[ i ].barrier_chunks ) )
|
||||
{
|
||||
num += 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
@ -388,14 +404,12 @@ watch_for_drop() //checked partially matches cerberus output did not change
|
||||
flag_wait( "zombie_drop_powerups" );
|
||||
players = get_players();
|
||||
curr_total_score = 0;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( isDefined( players[ i ].score_total ) )
|
||||
{
|
||||
curr_total_score += players[ i ].score_total;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( curr_total_score > score_to_drop )
|
||||
{
|
||||
@ -503,15 +517,13 @@ powerup_drop( drop_point ) //checked partially changed to match cerberus output
|
||||
level.powerup_drop_count++;
|
||||
powerup = maps/mp/zombies/_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + vectorScale( ( 0, 0, 1 ), 40 ) );
|
||||
valid_drop = 0;
|
||||
i = 0;
|
||||
while ( i < playable_area.size )
|
||||
for ( i = 0; i < playable_area.size; i++ )
|
||||
{
|
||||
if ( powerup istouching( playable_area[ i ] ) )
|
||||
{
|
||||
valid_drop = 1;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( valid_drop && level.rare_powerups_active )
|
||||
{
|
||||
@ -556,7 +568,7 @@ specific_powerup_drop( powerup_name, drop_spot, powerup_team, powerup_location )
|
||||
}
|
||||
}
|
||||
|
||||
quantum_bomb_random_powerup_result( position ) //unused did not check
|
||||
quantum_bomb_random_powerup_result( position ) //changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size )
|
||||
{
|
||||
@ -595,15 +607,15 @@ quantum_bomb_random_powerup_result( position ) //unused did not check
|
||||
break;
|
||||
default:
|
||||
}
|
||||
while ( skip )
|
||||
if ( skip )
|
||||
{
|
||||
arrayremovevalue( keys, keys[ index ] );
|
||||
continue;
|
||||
}
|
||||
self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" );
|
||||
[[ level.quantum_bomb_play_player_effect_at_position_func ]]( position );
|
||||
level specific_powerup_drop( keys[ index ], position );
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -612,7 +624,7 @@ quantum_bomb_random_powerup_result( position ) //unused did not check
|
||||
}
|
||||
}
|
||||
|
||||
quantum_bomb_random_zombie_grab_powerup_result( position ) //unused did not check
|
||||
quantum_bomb_random_zombie_grab_powerup_result( position ) //changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size )
|
||||
{
|
||||
@ -628,7 +640,6 @@ quantum_bomb_random_zombie_grab_powerup_result( position ) //unused did not chec
|
||||
[[ level.quantum_bomb_play_player_effect_at_position_func ]]( position );
|
||||
level specific_powerup_drop( keys[ index ], position );
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -637,14 +648,14 @@ quantum_bomb_random_zombie_grab_powerup_result( position ) //unused did not chec
|
||||
}
|
||||
}
|
||||
|
||||
quantum_bomb_random_weapon_powerup_result( position ) //unused did not check
|
||||
quantum_bomb_random_weapon_powerup_result( position ) //checked matches cerberus output
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" );
|
||||
[[ level.quantum_bomb_play_player_effect_at_position_func ]]( position );
|
||||
level specific_powerup_drop( "random_weapon", position );
|
||||
}
|
||||
|
||||
quantum_bomb_random_bonus_or_lose_points_powerup_result( position ) //unused did not check
|
||||
quantum_bomb_random_bonus_or_lose_points_powerup_result( position ) //checked matches cerberus output
|
||||
{
|
||||
rand = randomint( 10 );
|
||||
powerup = "bonus_points_team";
|
||||
@ -674,7 +685,7 @@ quantum_bomb_random_bonus_or_lose_points_powerup_result( position ) //unused did
|
||||
level specific_powerup_drop( powerup, position );
|
||||
}
|
||||
|
||||
special_powerup_drop( drop_point ) //checked partially changed to match cerberus output
|
||||
special_powerup_drop( drop_point ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 )
|
||||
{
|
||||
@ -683,7 +694,6 @@ special_powerup_drop( drop_point ) //checked partially changed to match cerberus
|
||||
powerup = spawn( "script_model", drop_point + vectorScale( ( 0, 0, 1 ), 40 ) );
|
||||
playable_area = getentarray( "player_volume", "script_noteworthy" );
|
||||
valid_drop = 0;
|
||||
i = 0;
|
||||
for ( i = 0; i < playable_area.size; i++ )
|
||||
{
|
||||
if ( powerup istouching( playable_area[ i ] ) )
|
||||
@ -880,7 +890,7 @@ powerup_zombie_grab_trigger_cleanup( trigger ) //checked matches cerberus output
|
||||
trigger delete();
|
||||
}
|
||||
|
||||
powerup_zombie_grab( powerup_team ) //checked partially changed to match cerberus output
|
||||
powerup_zombie_grab( powerup_team ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "powerup_timedout" );
|
||||
self endon( "powerup_grabbed" );
|
||||
@ -901,7 +911,7 @@ powerup_zombie_grab( powerup_team ) //checked partially changed to match cerberu
|
||||
zombie_grab_trigger waittill( "trigger", who );
|
||||
if ( isDefined( level._powerup_grab_check ) )
|
||||
{
|
||||
while ( !( self [[ level._powerup_grab_check ]]( who ) ) )
|
||||
if ( !self [[ level._powerup_grab_check ]]( who ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -960,17 +970,19 @@ powerup_grab(powerup_team) //checked partially changed to match cerberus output
|
||||
while ( isdefined( self ) )
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
for (i = 0; i < players.size; i++)
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
// Don't let them grab the minigun, tesla, or random weapon if they're downed or reviving
|
||||
// due to weapon switching issues.
|
||||
if ( self.powerup_name != "minigun" || self.powerup_name != "tesla" || self.powerup_name != "random_weapon" || self.powerup_name == "meat_stink" && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ] usebuttonpressed() && players[ i ] in_revive_trigger() )
|
||||
if ( ( self.powerup_name == "minigun" || self.powerup_name == "tesla" ) && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && ( self.powerup_name == "random_weapon" || self.powerup_name == "meat_stink" ) || players[ i ] usebuttonpressed() && players[ i ] in_revive_trigger() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( self.can_pick_up_in_last_stand ) && !self.can_pick_up_in_last_stand && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
ignore_range = 0;
|
||||
@ -985,10 +997,11 @@ powerup_grab(powerup_team) //checked partially changed to match cerberus output
|
||||
{
|
||||
if ( !self [[ level._powerup_grab_check ]]( players[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if(isdefined(level.zombie_powerup_grab_func))
|
||||
else if ( isdefined( level.zombie_powerup_grab_func ) )
|
||||
{
|
||||
level thread [[ level.zombie_powerup_grab_func ]]();
|
||||
break;
|
||||
@ -1029,54 +1042,44 @@ powerup_grab(powerup_team) //checked partially changed to match cerberus output
|
||||
}
|
||||
players[ i ] thread powerup_vo( "carpenter" );
|
||||
break;
|
||||
|
||||
case "fire_sale":
|
||||
level thread start_fire_sale( self );
|
||||
players[ i ] thread powerup_vo( "firesale" );
|
||||
break;
|
||||
|
||||
case "bonfire_sale":
|
||||
level thread start_bonfire_sale( self );
|
||||
players[ i ] thread powerup_vo( "firesale" );
|
||||
break;
|
||||
|
||||
case "minigun":
|
||||
level thread minigun_weapon_powerup( players[ i ] );
|
||||
players[ i ] thread powerup_vo( "minigun" );
|
||||
break;
|
||||
|
||||
case "free_perk":
|
||||
level thread free_perk_powerup( self );
|
||||
break;
|
||||
|
||||
case "tesla":
|
||||
level thread tesla_weapon_powerup( players[ i ] );
|
||||
players[ i ] thread powerup_vo( "tesla" );
|
||||
break;
|
||||
|
||||
case "random_weapon":
|
||||
if ( !level random_weapon_powerup( self, players[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "bonus_points_player":
|
||||
level thread bonus_points_player_powerup( self, players[ i ] );
|
||||
players[ i ] thread powerup_vo( "bonus_points_solo" );
|
||||
break;
|
||||
|
||||
case "bonus_points_team":
|
||||
level thread bonus_points_team_powerup( self );
|
||||
players[ i ] thread powerup_vo( "bonus_points_team" );
|
||||
break;
|
||||
|
||||
case "teller_withdrawl":
|
||||
level thread teller_withdrawl( self ,players[ i ] );
|
||||
break;
|
||||
|
||||
case default:
|
||||
default:
|
||||
if ( IsDefined( level._zombiemode_powerup_grab ) )
|
||||
{
|
||||
level thread [[ level._zombiemode_powerup_grab ]]( self, players[ i ] );
|
||||
@ -1125,7 +1128,7 @@ powerup_grab(powerup_team) //checked partially changed to match cerberus output
|
||||
self.power_up_grab_player = players[ i ]; //Player who grabbed the power up
|
||||
// RAVEN END
|
||||
|
||||
wait( 0.1 );
|
||||
wait 0.1 ;
|
||||
|
||||
playsoundatposition("zmb_powerup_grabbed", self.origin);
|
||||
self stoploopsound();
|
||||
@ -1157,8 +1160,9 @@ powerup_grab(powerup_team) //checked partially changed to match cerberus output
|
||||
self powerup_delete();
|
||||
self notify( "powerup_grabbed" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait(0.1);
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1299,7 +1303,7 @@ powerup_vo( type ) //checked matches cerberus output
|
||||
self endon( "disconnect" );
|
||||
if ( isDefined( level.powerup_vo_available ) )
|
||||
{
|
||||
if ( !( [[ level.powerup_vo_available ]]() ) )
|
||||
if ( ![[ level.powerup_vo_available ]]() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -1434,7 +1438,6 @@ powerup_timeout() //checked partially changed to match cerberus output
|
||||
continue;
|
||||
}
|
||||
wait 0.1;
|
||||
|
||||
i++;
|
||||
}
|
||||
self notify( "powerup_timedout" );
|
||||
@ -1473,38 +1476,51 @@ nuke_powerup( drop_item, player_team ) //checked changed to match cerberus outpu
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
zombies = arraysort( zombies, location );
|
||||
zombies_nuked = [];
|
||||
for(i = 0; i < zombies.size; i++)
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( isdefined( zombies[ i ].ignore_nuke ) && zombies[ i ].ignore_nuke )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( zombies[ i ].marked_for_death ) && zombies[ i ].marked_for_death )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( zombies[ i ].nuke_damage_func ) )
|
||||
{
|
||||
zombies[ i ] thread [[ zombies[ i ].nuke_damage_func ]]();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( is_magic_bullet_shield_enabled( zombies[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
zombies[ i ].marked_for_death = 1;
|
||||
//imported from bo3 _zm_powerup_nuke.gsc
|
||||
if ( !zombies[ i ].nuked && !is_magic_bullet_shield_enabled( zombies[ i ] ) )
|
||||
{
|
||||
zombies[ i ].nuked = 1;
|
||||
zombies_nuked[ zombies_nuked.size ] = zombies[ i ];
|
||||
}
|
||||
for(i = 0; i < zombies_nuked.size; i++)
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < zombies_nuked.size )
|
||||
{
|
||||
wait(randomfloatrange(0.1, 0.7));
|
||||
wait randomfloatrange( 0.1, 0.7 );
|
||||
if ( !isdefined( zombies_nuked[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( is_magic_bullet_shield_enabled( zombies_nuked[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( i < 5 && !zombies_nuked[ i ].isdog )
|
||||
@ -1513,20 +1529,19 @@ nuke_powerup( drop_item, player_team ) //checked changed to match cerberus outpu
|
||||
}
|
||||
if ( !zombies_nuked[ i ].isdog )
|
||||
{
|
||||
if(!(isdefined(zombies_nuked[i].no_gib) && zombies_nuked[i].no_gib))
|
||||
if ( isdefined( zombies_nuked[ i ].no_gib ) && !zombies_nuked[ i ].no_gib )
|
||||
{
|
||||
zombies_nuked[ i ] maps/mp/zombies/_zm_spawner::zombie_head_gib();
|
||||
}
|
||||
zombies_nuked[ i ] playsound("evt_nuked");
|
||||
}
|
||||
zombies_nuked[ i ] dodamage(zombies_nuked[i].health + 666, zombies_nuked[ i ].origin );
|
||||
i++;
|
||||
}
|
||||
players = get_players( player_team );
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ] maps/mp/zombies/_zm_score::player_add_points( "nuke_powerup", 400 );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1548,7 +1563,7 @@ nuke_flash( team ) //checked matches cerberus output
|
||||
fadetowhite.vertalign = "fullscreen";
|
||||
fadetowhite.foreground = 1;
|
||||
fadetowhite setshader( "white", 640, 480 );
|
||||
fadetowhite fadeovertime( 0,2 );
|
||||
fadetowhite fadeovertime( 0.2 );
|
||||
fadetowhite.alpha = 0.8;
|
||||
wait 0.5;
|
||||
fadetowhite fadeovertime( 1 );
|
||||
@ -1583,27 +1598,23 @@ double_points_powerup( drop_item, player ) //checked partially matches cerberus
|
||||
}
|
||||
level.zombie_vars[ team ][ "zombie_point_scalar" ] = 2;
|
||||
players = get_players();
|
||||
player_index = 0;
|
||||
while ( player_index < players.size )
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
if ( team == players[ player_index ].team )
|
||||
{
|
||||
players[ player_index ] setclientfield( "score_cf_double_points_active", 1 );
|
||||
}
|
||||
player_index++;
|
||||
}
|
||||
wait 30;
|
||||
level.zombie_vars[ team ][ "zombie_point_scalar" ] = 1;
|
||||
level._race_team_double_points = undefined;
|
||||
players = get_players();
|
||||
player_index = 0;
|
||||
while ( player_index < players.size )
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
if ( team == players[ player_index ].team )
|
||||
{
|
||||
players[ player_index ] setclientfield( "score_cf_double_points_active", 0 );
|
||||
}
|
||||
player_index++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1614,10 +1625,12 @@ full_ammo_powerup( drop_item, player ) //checked changed to match cerberus outpu
|
||||
{
|
||||
players = [[ level._get_game_module_players ]]( player );
|
||||
}
|
||||
for(i = 0; i < players.size; i++)
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
primary_weapons = players[ i ] getweaponslist( 1 );
|
||||
@ -1625,25 +1638,31 @@ full_ammo_powerup( drop_item, player ) //checked changed to match cerberus outpu
|
||||
players[ i ] notify( "zmb_lost_knife" );
|
||||
players[ i ] notify( "zmb_disable_claymore_prompt" );
|
||||
players[ i ] notify( "zmb_disable_spikemore_prompt" );
|
||||
for(x = 0; x < primary_weapons.size; x++)
|
||||
x = 0;
|
||||
while ( x < primary_weapons.size )
|
||||
{
|
||||
if ( level.headshots_only && is_lethal_grenade(primary_weapons[ x ] ) )
|
||||
{
|
||||
x++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( level.zombie_include_equipment ) && isdefined( level.zombie_include_equipment[ primary_weapons[ x ] ] ) )
|
||||
{
|
||||
x++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( level.zombie_weapons_no_max_ammo ) && isdefined( level.zombie_weapons_no_max_ammo[ primary_weapons[ x ] ] ) )
|
||||
{
|
||||
x++;
|
||||
continue;
|
||||
}
|
||||
if ( players[ i ] hasweapon( primary_weapons[ x ] ) )
|
||||
{
|
||||
players[ i ] givemaxammo( primary_weapons[ x ] );
|
||||
}
|
||||
x++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
level thread full_ammo_on_hud( drop_item, player.team );
|
||||
}
|
||||
@ -1683,11 +1702,11 @@ is_insta_kill_active() //checked matches cerberus output
|
||||
return level.zombie_vars[ self.team ][ "zombie_insta_kill" ];
|
||||
}
|
||||
|
||||
check_for_instakill( player, mod, hit_location ) //cerberus output
|
||||
check_for_instakill( player, mod, hit_location ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( isDefined( player ) && isalive( player ) && isDefined( level.check_for_instakill_override ) )
|
||||
{
|
||||
if ( !( self [[ level.check_for_instakill_override ]]( player ) ) )
|
||||
if ( !self [[ level.check_for_instakill_override ]]( player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -1734,7 +1753,7 @@ check_for_instakill( player, mod, hit_location ) //cerberus output
|
||||
self dodamage( self.health + 666, self.origin, player, self, hit_location, modname );
|
||||
player notify( "zombie_killed" );
|
||||
}
|
||||
else if(!(isdefined(self.no_gib) && self.no_gib))
|
||||
else if ( isdefined( self.no_gib ) && !self.no_gib )
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_head_gib();
|
||||
}
|
||||
@ -1794,11 +1813,9 @@ time_remaining_on_point_doubler_powerup( player_team ) //checked partially match
|
||||
}
|
||||
level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] = 0;
|
||||
players = get_players( player_team );
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ] playsound( "zmb_points_loop_off" );
|
||||
i++;
|
||||
}
|
||||
temp_ent stoploopsound( 2 );
|
||||
level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] = 30;
|
||||
@ -1831,8 +1848,7 @@ toggle_fire_sale_on() //checked partially matches cerberus output did not change
|
||||
}
|
||||
while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level.chests.size )
|
||||
for ( i = 0; i < level.chests.size; i++ )
|
||||
{
|
||||
show_firesale_box = level.chests[ i ] [[ level._zombiemode_check_firesale_loc_valid_func ]]();
|
||||
if ( show_firesale_box )
|
||||
@ -1848,12 +1864,10 @@ toggle_fire_sale_on() //checked partially matches cerberus output did not change
|
||||
wait_network_frame();
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
level waittill( "fire_sale_off" );
|
||||
waittillframeend;
|
||||
i = 0;
|
||||
while ( i < level.chests.size )
|
||||
for ( i = 0; i < level.chests.size; i++ )
|
||||
{
|
||||
show_firesale_box = level.chests[ i ] [[ level._zombiemode_check_firesale_loc_valid_func ]]();
|
||||
if ( show_firesale_box )
|
||||
@ -1865,7 +1879,6 @@ toggle_fire_sale_on() //checked partially matches cerberus output did not change
|
||||
}
|
||||
level.chests[ i ].zombie_cost = level.chests[ i ].old_cost;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1892,11 +1905,9 @@ remove_temp_chest( chest_index ) //checked partially matches cerberus output did
|
||||
level.chests[ chest_index ].zombie_cost = 10;
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < chest_index )
|
||||
for ( i = 0; i < chest_index; i++ )
|
||||
{
|
||||
wait_network_frame();
|
||||
i++;
|
||||
}
|
||||
playfx( level._effect[ "poltergeist" ], level.chests[ chest_index ].orig_origin );
|
||||
level.chests[ chest_index ].zbarrier playsound( "zmb_box_poof_land" );
|
||||
@ -1999,7 +2010,6 @@ setup_bonfiresale_audio() //checked changed to match cerberus output
|
||||
{
|
||||
wait 0.2;
|
||||
}
|
||||
i = 0;
|
||||
for ( i = 0; i < intercom.size; i++ )
|
||||
{
|
||||
intercom[ i ] thread play_bonfiresale_audio();
|
||||
@ -2030,11 +2040,10 @@ play_bonfiresale_audio() //checked matches cerberus output
|
||||
self stoploopsound();
|
||||
}
|
||||
|
||||
free_perk_powerup( item ) //checked partially matches cerberus output did not change
|
||||
free_perk_powerup( item ) //checked changed to match cerberus output
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" )
|
||||
{
|
||||
@ -2051,7 +2060,6 @@ free_perk_powerup( item ) //checked partially matches cerberus output did not ch
|
||||
player thread disable_perk_before_power( free_perk );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2135,7 +2143,7 @@ bonus_points_player_powerup( item, player ) //checked matches cerberus output
|
||||
}
|
||||
}
|
||||
|
||||
bonus_points_team_powerup( item ) //checked partially matches cerberus output did not change
|
||||
bonus_points_team_powerup( item ) //checked changed to match cerberus output
|
||||
{
|
||||
points = randomintrange( 1, 25 ) * 100;
|
||||
if ( isDefined( level.bonus_points_powerup_override ) )
|
||||
@ -2143,25 +2151,23 @@ bonus_points_team_powerup( item ) //checked partially matches cerberus output di
|
||||
points = [[ level.bonus_points_powerup_override ]]();
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" )
|
||||
{
|
||||
players[ i ] maps/mp/zombies/_zm_score::player_add_points( "bonus_points_powerup", points );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
lose_points_team_powerup( item ) //checked partially matches cerberus output
|
||||
lose_points_team_powerup( item ) //checked partially changed to match cerberus output
|
||||
{
|
||||
points = randomintrange( 1, 25 ) * 100;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) && players[ i ].sessionstate != "spectator" )
|
||||
if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" )
|
||||
{
|
||||
if ( ( players[ i ].score - points ) <= 0 )
|
||||
{
|
||||
@ -2181,31 +2187,27 @@ lose_points_team_powerup( item ) //checked partially matches cerberus output
|
||||
lose_perk_powerup( item ) //checked partially matches cerberus output
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
if ( !( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) && player.sessionstate != "spectator" )
|
||||
if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" )
|
||||
{
|
||||
player maps/mp/zombies/_zm_perks::lose_random_perk();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
empty_clip_powerup( item ) //checked partially matches cerberus output
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
if ( !( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) && player.sessionstate != "spectator" )
|
||||
if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" )
|
||||
{
|
||||
weapon = player getcurrentweapon();
|
||||
player setweaponammoclip( weapon, 0 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2289,15 +2291,14 @@ minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked par
|
||||
while ( isDefined( ent_player._zombie_gun_before_minigun ) )
|
||||
{
|
||||
player_weapons = ent_player getweaponslistprimaries();
|
||||
i = 0;
|
||||
while ( i < player_weapons.size )
|
||||
|
||||
for ( i = 0; i < player_weapons.size; i++ )
|
||||
{
|
||||
if ( player_weapons[ i ] == ent_player._zombie_gun_before_minigun )
|
||||
{
|
||||
ent_player switchtoweapon( ent_player._zombie_gun_before_minigun );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
primaryweapons = ent_player getweaponslistprimaries();
|
||||
@ -2308,15 +2309,13 @@ minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked par
|
||||
else
|
||||
{
|
||||
allweapons = ent_player getweaponslist( 1 );
|
||||
i = 0;
|
||||
while ( i < allweapons.size )
|
||||
for ( i = 0; i < allweapons.size; i++ )
|
||||
{
|
||||
if ( is_melee_weapon( allweapons[ i ] ) )
|
||||
{
|
||||
ent_player switchtoweapon( allweapons[ i ] );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2333,14 +2332,12 @@ minigun_watch_gunner_downed() //checked partially matches cerberus output did no
|
||||
return;
|
||||
}
|
||||
primaryweapons = self getweaponslistprimaries();
|
||||
i = 0;
|
||||
while ( i < primaryweapons.size )
|
||||
for ( i = 0; i < primaryweapons.size; i++ )
|
||||
{
|
||||
if ( primaryweapons[ i ] == "minigun_zm" )
|
||||
{
|
||||
self takeweapon( "minigun_zm" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self notify( "minigun_time_over" );
|
||||
self.zombie_vars[ "zombie_powerup_minigun_on" ] = 0;
|
||||
@ -2350,7 +2347,7 @@ minigun_watch_gunner_downed() //checked partially matches cerberus output did no
|
||||
self.has_powerup_weapon = 0;
|
||||
}
|
||||
|
||||
tesla_weapon_powerup( ent_player, time ) //unused did not check
|
||||
tesla_weapon_powerup( ent_player, time ) //checked changed to match cerberus output
|
||||
{
|
||||
ent_player endon( "disconnect" );
|
||||
ent_player endon( "death" );
|
||||
@ -2359,7 +2356,7 @@ tesla_weapon_powerup( ent_player, time ) //unused did not check
|
||||
{
|
||||
time = 11;
|
||||
}
|
||||
if ( ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] || ent_player getcurrentweapon() == "tesla_gun_zm" && isDefined( ent_player.has_tesla ) && ent_player.has_tesla )
|
||||
if ( ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] && ent_player getcurrentweapon() == "tesla_gun_zm" || isDefined( ent_player.has_tesla ) && ent_player.has_tesla )
|
||||
{
|
||||
ent_player givemaxammo( "tesla_gun_zm" );
|
||||
if ( ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] < time )
|
||||
@ -2383,7 +2380,7 @@ tesla_weapon_powerup( ent_player, time ) //unused did not check
|
||||
level thread tesla_weapon_powerup_replace( ent_player, "tesla_time_over" );
|
||||
}
|
||||
|
||||
tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //unused did not check
|
||||
tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //checked changed to match cerberus output
|
||||
{
|
||||
ent_player endon( "death" );
|
||||
ent_player endon( "player_downed" );
|
||||
@ -2405,15 +2402,11 @@ tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //unus
|
||||
{
|
||||
ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( clip_count == 3 )
|
||||
else if ( clip_count == 3 )
|
||||
{
|
||||
ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 6;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 11;
|
||||
@ -2423,7 +2416,7 @@ tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //unus
|
||||
level thread tesla_weapon_powerup_remove( ent_player, str_gun_return_notify );
|
||||
}
|
||||
|
||||
tesla_weapon_powerup_replace( ent_player, str_gun_return_notify ) //unused did not check
|
||||
tesla_weapon_powerup_replace( ent_player, str_gun_return_notify ) //checked matches cerberus output
|
||||
{
|
||||
ent_player endon( "death" );
|
||||
ent_player endon( "disconnect" );
|
||||
@ -2436,7 +2429,7 @@ tesla_weapon_powerup_replace( ent_player, str_gun_return_notify ) //unused did n
|
||||
ent_player decrement_is_drinking();
|
||||
}
|
||||
|
||||
tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) //unused did not check
|
||||
tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked changed to match cerberus output
|
||||
{
|
||||
ent_player endon( "death" );
|
||||
ent_player endon( "player_downed" );
|
||||
@ -2447,18 +2440,16 @@ tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) //unused did no
|
||||
ent_player.has_powerup_weapon = 0;
|
||||
ent_player notify( str_gun_return_notify );
|
||||
ent_player decrement_is_drinking();
|
||||
while ( isDefined( ent_player._zombie_gun_before_tesla ) )
|
||||
if ( isDefined( ent_player._zombie_gun_before_tesla ) )
|
||||
{
|
||||
player_weapons = ent_player getweaponslistprimaries();
|
||||
i = 0;
|
||||
while ( i < player_weapons.size )
|
||||
for ( i = 0; i < player_weapons.size; i++ )
|
||||
{
|
||||
if ( player_weapons[ i ] == ent_player._zombie_gun_before_tesla )
|
||||
{
|
||||
ent_player switchtoweapon( ent_player._zombie_gun_before_tesla );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
primaryweapons = ent_player getweaponslistprimaries();
|
||||
@ -2466,42 +2457,35 @@ tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) //unused did no
|
||||
{
|
||||
ent_player switchtoweapon( primaryweapons[ 0 ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
allweapons = ent_player getweaponslist( 1 );
|
||||
i = 0;
|
||||
while ( i < allweapons.size )
|
||||
for ( i = 0; i < allweapons.size; i++ )
|
||||
{
|
||||
if ( is_melee_weapon( allweapons[ i ] ) )
|
||||
{
|
||||
ent_player switchtoweapon( allweapons[ i ] );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tesla_weapon_powerup_off() //unused did not check
|
||||
tesla_weapon_powerup_off() //checked matches cerberus output
|
||||
{
|
||||
self.zombie_vars[ "zombie_powerup_tesla_time" ] = 0;
|
||||
}
|
||||
|
||||
tesla_watch_gunner_downed() //unused did not check
|
||||
tesla_watch_gunner_downed() //checked changed to match cerberus output
|
||||
{
|
||||
if ( isDefined( self.has_tesla ) && !self.has_tesla )
|
||||
{
|
||||
return;
|
||||
}
|
||||
primaryweapons = self getweaponslistprimaries();
|
||||
i = 0;
|
||||
while ( i < primaryweapons.size )
|
||||
for ( i = 0; i < primaryweapons.size; i++ )
|
||||
{
|
||||
if ( primaryweapons[ i ] == "tesla_gun_zm" )
|
||||
{
|
||||
self takeweapon( "tesla_gun_zm" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self notify( "tesla_time_over" );
|
||||
self.zombie_vars[ "zombie_powerup_tesla_on" ] = 0;
|
||||
@ -2511,23 +2495,49 @@ tesla_watch_gunner_downed() //unused did not check
|
||||
self.has_powerup_weapon = 0;
|
||||
}
|
||||
|
||||
tesla_powerup_active() //unused did not check
|
||||
tesla_powerup_active() //checked changed to match cerberus output
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[ i ].zombie_vars[ "zombie_powerup_tesla_on" ] )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
print_powerup_drop( powerup, type ) //devcall only, deleted
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if(!isdefined(level.powerup_drop_time))
|
||||
{
|
||||
level.powerup_drop_time = 0;
|
||||
level.powerup_random_count = 0;
|
||||
level.powerup_score_count = 0;
|
||||
}
|
||||
time = GetTime() - level.powerup_drop_time * 0.001;
|
||||
level.powerup_drop_time = GetTime();
|
||||
if(type == "random")
|
||||
{
|
||||
level.powerup_random_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.powerup_score_count++;
|
||||
}
|
||||
println("========== POWER UP DROPPED ==========");
|
||||
println("DROPPED: " + powerup);
|
||||
println("HOW IT DROPPED: " + type);
|
||||
println("--------------------");
|
||||
println("Drop Time: " + time);
|
||||
println("Random Powerup Count: " + level.powerup_random_count);
|
||||
println("Random Powerup Count: " + level.powerup_score_count);
|
||||
println("======================================");
|
||||
#/
|
||||
*/
|
||||
}
|
||||
|
||||
register_carpenter_node( node, callback ) //checked matches cerberus output
|
||||
@ -2552,8 +2562,7 @@ start_carpenter_new( origin ) //checked partially changed to match cerberus outp
|
||||
carp_ent playloopsound( "evt_carpenter" );
|
||||
boards_near_players = get_near_boards( window_boards );
|
||||
boards_far_from_players = get_far_boards( window_boards );
|
||||
//broken non essential
|
||||
//level repair_far_boards( boards_far_from_players, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded() );
|
||||
level repair_far_boards( boards_far_from_players, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded() );
|
||||
|
||||
i = 0;
|
||||
while ( i < boards_near_players.size )
|
||||
@ -2616,11 +2625,9 @@ start_carpenter_new( origin ) //checked partially changed to match cerberus outp
|
||||
carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" );
|
||||
carp_ent waittill( "sound_done" );
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ] maps/mp/zombies/_zm_score::player_add_points( "carpenter_powerup", 200 );
|
||||
i++;
|
||||
}
|
||||
carp_ent delete();
|
||||
level notify( "carpenter_finished" );
|
||||
@ -2702,11 +2709,13 @@ get_far_boards( windows ) //checked changed to match cerberus output
|
||||
|
||||
repair_far_boards( barriers, upgrade ) //checked changed to match cerberus output
|
||||
{
|
||||
for(i = 0; i < barriers.size; i++)
|
||||
i = 0;
|
||||
while ( i < barriers.size )
|
||||
{
|
||||
barrier = barriers[ i ];
|
||||
if ( all_chunks_intact( barrier, barrier.barrier_chunks ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isdefined( barrier.zbarrier ) )
|
||||
@ -2714,17 +2723,20 @@ repair_far_boards( barriers, upgrade ) //checked changed to match cerberus outpu
|
||||
a_pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" );
|
||||
if ( isdefined( a_pieces ) )
|
||||
{
|
||||
for(xx = 0; xx < a_pieces.size; xx++)
|
||||
xx = 0;
|
||||
while ( xx < a_pieces.size )
|
||||
{
|
||||
chunk = a_pieces[ xx ];
|
||||
if ( upgrade )
|
||||
{
|
||||
barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk );
|
||||
barrier.zbarrier.chunk_health[ chunk ] = barrier.zbarrier getupgradedpiecenumlives( chunk );
|
||||
xx++;
|
||||
continue;
|
||||
}
|
||||
barrier.zbarrier zbarrierpieceusedefaultmodel( chunk );
|
||||
barrier.zbarrier.chunk_health[ chunk ] = 0;
|
||||
xx++;
|
||||
}
|
||||
}
|
||||
for ( x = 0; x < barrier.zbarrier getnumzbarrierpieces(); x++ )
|
||||
@ -2746,6 +2758,7 @@ repair_far_boards( barriers, upgrade ) //checked changed to match cerberus outpu
|
||||
{
|
||||
wait_network_frame();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2826,21 +2839,17 @@ powerup_emp() //checked matches cerberus output
|
||||
}
|
||||
}
|
||||
|
||||
get_powerups( origin, radius ) //checked partially matches cerberus output did not change
|
||||
get_powerups( origin, radius ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( isDefined( origin ) && isDefined( radius ) )
|
||||
{
|
||||
powerups = [];
|
||||
_a3603 = level.active_powerups;
|
||||
_k3603 = getFirstArrayKey( _a3603 );
|
||||
while ( isDefined( _k3603 ) )
|
||||
foreach ( powerup in level.active_powerups )
|
||||
{
|
||||
powerup = _a3603[ _k3603 ];
|
||||
if ( distancesquared( origin, powerup.origin ) < ( radius * radius ) )
|
||||
if ( distancesquared( origin, powerup.origin ) < radius * radius )
|
||||
{
|
||||
powerups[ powerups.size ] = powerup;
|
||||
}
|
||||
_k3603 = getNextArrayKey( _a3603, _k3603 );
|
||||
}
|
||||
return powerups;
|
||||
}
|
||||
@ -2865,6 +2874,19 @@ teller_withdrawl( powerup, player ) //checked matches cerberus output
|
||||
player maps/mp/zombies/_zm_score::add_to_player_score( powerup.value );
|
||||
}
|
||||
|
||||
zombies_always_drop_powerups() //debug code added
|
||||
{
|
||||
if ( !level.zombiesAlwaysDropPowerups )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
level.zombie_vars[ "zombie_drop_item" ] = level.zombiesAlwaysDropPowerups;
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
level.score_cf_info = [];
|
||||
score_cf_register_info( "damage", 1, 7 );
|
||||
@ -19,7 +19,7 @@ init()
|
||||
}
|
||||
}
|
||||
|
||||
score_cf_register_info( name, version, max_count )
|
||||
score_cf_register_info( name, version, max_count ) //checked matches cerberus output
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
@ -36,7 +36,7 @@ score_cf_register_info( name, version, max_count )
|
||||
registerclientfield( "allplayers", info.cf_field, info.version, info.bit_count, "int" );
|
||||
}
|
||||
|
||||
score_cf_increment_info( name )
|
||||
score_cf_increment_info( name ) //checked matches cerberus output
|
||||
{
|
||||
info = level.score_cf_info[ name ];
|
||||
player_ent_index = self getentitynumber();
|
||||
@ -52,7 +52,7 @@ score_cf_increment_info( name )
|
||||
self setclientfield( info.cf_field, info.players[ player_ent_index ] );
|
||||
}
|
||||
|
||||
score_cf_monitor()
|
||||
score_cf_monitor() //checked changed to match cerberus output
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
@ -63,25 +63,22 @@ score_cf_monitor()
|
||||
{
|
||||
wait_network_frame();
|
||||
players = get_players();
|
||||
player_index = 0;
|
||||
while ( player_index < players.size )
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
player = players[ player_index ];
|
||||
player_ent_index = player getentitynumber();
|
||||
info_index = 0;
|
||||
while ( info_index < info_keys.size )
|
||||
for ( info_index = 0; info_index < info_keys.size; info_index++ )
|
||||
{
|
||||
info = level.score_cf_info[ info_keys[ info_index ] ];
|
||||
info.players[ player_ent_index ] = 0;
|
||||
player setclientfield( info.cf_field, 0 );
|
||||
info_index++;
|
||||
}
|
||||
player_index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon )
|
||||
player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( level.intermission )
|
||||
{
|
||||
@ -169,7 +166,7 @@ player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon
|
||||
}
|
||||
player_points = multiplier * round_up_score( player_points, 5 );
|
||||
team_points = multiplier * round_up_score( team_points, 5 );
|
||||
if ( isDefined( self.point_split_receiver ) || event == "death" && event == "ballistic_knife_death" )
|
||||
if ( isDefined( self.point_split_receiver ) && event == "death" || isDefined( self.point_split_receiver ) && event == "ballistic_knife_death" )
|
||||
{
|
||||
split_player_points = player_points - round_up_score( player_points * self.point_split_keep_percent, 10 );
|
||||
self.point_split_receiver add_to_player_score( split_player_points );
|
||||
@ -187,7 +184,7 @@ player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon
|
||||
}
|
||||
}
|
||||
|
||||
get_points_multiplier( player )
|
||||
get_points_multiplier( player ) //checked matches cerberus output
|
||||
{
|
||||
multiplier = level.zombie_vars[ player.team ][ "zombie_point_scalar" ];
|
||||
if ( isDefined( level.current_game_module ) && level.current_game_module == 2 )
|
||||
@ -204,7 +201,7 @@ get_points_multiplier( player )
|
||||
return multiplier;
|
||||
}
|
||||
|
||||
get_zombie_death_player_points()
|
||||
get_zombie_death_player_points() //checked matches cerberus output
|
||||
{
|
||||
players = get_players();
|
||||
if ( players.size == 1 )
|
||||
@ -226,7 +223,7 @@ get_zombie_death_player_points()
|
||||
return points;
|
||||
}
|
||||
|
||||
get_zombie_death_team_points()
|
||||
get_zombie_death_team_points() //checked matches cerberus output
|
||||
{
|
||||
players = get_players();
|
||||
if ( players.size == 1 )
|
||||
@ -248,7 +245,7 @@ get_zombie_death_team_points()
|
||||
return points;
|
||||
}
|
||||
|
||||
player_add_points_kill_bonus( mod, hit_location )
|
||||
player_add_points_kill_bonus( mod, hit_location ) //checked matches cerberus output
|
||||
{
|
||||
if ( mod == "MOD_MELEE" )
|
||||
{
|
||||
@ -287,7 +284,7 @@ player_add_points_kill_bonus( mod, hit_location )
|
||||
return score;
|
||||
}
|
||||
|
||||
player_reduce_points( event, mod, hit_location )
|
||||
player_reduce_points( event, mod, hit_location ) //checked matches cerberus output
|
||||
{
|
||||
if ( level.intermission )
|
||||
{
|
||||
@ -326,7 +323,7 @@ player_reduce_points( event, mod, hit_location )
|
||||
self.score = points;
|
||||
}
|
||||
|
||||
add_to_player_score( points, add_to_total )
|
||||
add_to_player_score( points, add_to_total ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( add_to_total ) )
|
||||
{
|
||||
@ -345,7 +342,7 @@ add_to_player_score( points, add_to_total )
|
||||
self incrementplayerstat( "score", points );
|
||||
}
|
||||
|
||||
minus_to_player_score( points, ignore_double_points_upgrade )
|
||||
minus_to_player_score( points, ignore_double_points_upgrade ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( points ) || level.intermission )
|
||||
{
|
||||
@ -363,29 +360,27 @@ minus_to_player_score( points, ignore_double_points_upgrade )
|
||||
level notify( "spent_points" );
|
||||
}
|
||||
|
||||
add_to_team_score( points )
|
||||
add_to_team_score( points ) //checked matches cerberus output
|
||||
{
|
||||
}
|
||||
|
||||
minus_to_team_score( points )
|
||||
minus_to_team_score( points ) //checked matches cerberus output
|
||||
{
|
||||
}
|
||||
|
||||
player_died_penalty()
|
||||
player_died_penalty() //checked changed to match cerberus output
|
||||
{
|
||||
players = get_players( self.team );
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[ i ] != self && !players[ i ].is_zombie )
|
||||
{
|
||||
players[ i ] player_reduce_points( "no_revive_penalty" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
player_downed_penalty()
|
||||
player_downed_penalty() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
@ -395,3 +390,4 @@ player_downed_penalty()
|
||||
self player_reduce_points( "downed" );
|
||||
}
|
||||
|
||||
|
||||
|
1130
patch_zm/maps/mp/zombies/_zm_sidequests.gsc
Normal file
1130
patch_zm/maps/mp/zombies/_zm_sidequests.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1079
patch_zm/maps/mp/zombies/_zm_stats.gsc
Normal file
1079
patch_zm/maps/mp/zombies/_zm_stats.gsc
Normal file
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
onplayerconnect_callback( ::tombstone_player_init );
|
||||
level.tombstone_laststand_func = ::tombstone_laststand;
|
||||
@ -19,7 +19,7 @@ init()
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_player_init()
|
||||
tombstone_player_init() //checked matches cerberus output
|
||||
{
|
||||
while ( !isDefined( self.tombstone_index ) )
|
||||
{
|
||||
@ -28,7 +28,7 @@ tombstone_player_init()
|
||||
level.tombstones[ self.tombstone_index ] = spawnstruct();
|
||||
}
|
||||
|
||||
tombstone_spawn()
|
||||
tombstone_spawn() //checked matches cerberus output
|
||||
{
|
||||
dc = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
|
||||
dc.angles = self.angles;
|
||||
@ -56,13 +56,13 @@ tombstone_spawn()
|
||||
dc thread tombstone_grab();
|
||||
}
|
||||
|
||||
tombstone_clear()
|
||||
tombstone_clear() //checked matches cerberus output
|
||||
{
|
||||
result = self waittill_any_return( "tombstone_timedout", "tombstone_grabbed" );
|
||||
level.tombstones[ self.tombstone_index ] = spawnstruct();
|
||||
}
|
||||
|
||||
tombstone_revived( player )
|
||||
tombstone_revived( player ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "tombstone_timedout" );
|
||||
player endon( "disconnect" );
|
||||
@ -77,19 +77,16 @@ tombstone_revived( player )
|
||||
self.icon hide();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !shown )
|
||||
else if ( !shown )
|
||||
{
|
||||
shown = 1;
|
||||
self.icon show();
|
||||
}
|
||||
}
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_laststand()
|
||||
tombstone_laststand() //checked changed to match cerberus output
|
||||
{
|
||||
primaries = self getweaponslistprimaries();
|
||||
currentweapon = self getcurrentweapon();
|
||||
@ -97,18 +94,14 @@ tombstone_laststand()
|
||||
dc.player = self;
|
||||
dc.weapon = [];
|
||||
dc.current_weapon = -1;
|
||||
_a134 = primaries;
|
||||
index = getFirstArrayKey( _a134 );
|
||||
while ( isDefined( index ) )
|
||||
foreach ( weapon in primaries )
|
||||
{
|
||||
weapon = _a134[ index ];
|
||||
dc.weapon[ index ] = weapon;
|
||||
dc.stockcount[ index ] = self getweaponammostock( weapon );
|
||||
if ( weapon == currentweapon )
|
||||
{
|
||||
dc.current_weapon = index;
|
||||
}
|
||||
index = getNextArrayKey( _a134, index );
|
||||
}
|
||||
if ( isDefined( self.hasriotshield ) && self.hasriotshield )
|
||||
{
|
||||
@ -141,7 +134,7 @@ tombstone_laststand()
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_save_perks( ent )
|
||||
tombstone_save_perks( ent ) //checked matches cerberus output
|
||||
{
|
||||
perk_array = [];
|
||||
if ( ent hasperk( "specialty_armorvest" ) )
|
||||
@ -175,7 +168,7 @@ tombstone_save_perks( ent )
|
||||
return perk_array;
|
||||
}
|
||||
|
||||
tombstone_grab()
|
||||
tombstone_grab() //checked partially changed to match cerberus output
|
||||
{
|
||||
self endon( "tombstone_timedout" );
|
||||
wait 1;
|
||||
@ -190,22 +183,16 @@ tombstone_grab()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.player ) && players[ i ] == self.player )
|
||||
{
|
||||
tombstone_machine_triggers = getentarray( "specialty_scavenger", "script_noteworthy" );
|
||||
istombstonepowered = 0;
|
||||
_a258 = tombstone_machine_triggers;
|
||||
_k258 = getFirstArrayKey( _a258 );
|
||||
while ( isDefined( _k258 ) )
|
||||
foreach ( trigger in tombstone_machine_triggers )
|
||||
{
|
||||
trigger = _a258[ _k258 ];
|
||||
if ( isDefined( trigger.power_on ) || trigger.power_on && isDefined( trigger.turbine_power_on ) && trigger.turbine_power_on )
|
||||
if ( isdefined( trigger.power_on ) && trigger.power_on || isdefined( trigger.turbine_power_on ) && trigger.turbine_power_on )
|
||||
{
|
||||
istombstonepowered = 1;
|
||||
}
|
||||
_k258 = getNextArrayKey( _a258, _k258 );
|
||||
}
|
||||
if ( istombstonepowered )
|
||||
{
|
||||
@ -227,28 +214,23 @@ tombstone_grab()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait_network_frame();
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_give()
|
||||
tombstone_give() //checked partially changed to match cerberus output
|
||||
{
|
||||
dc = level.tombstones[ self.tombstone_index ];
|
||||
while ( !flag( "solo_game" ) )
|
||||
if ( !flag( "solo_game" ) )
|
||||
{
|
||||
primaries = self getweaponslistprimaries();
|
||||
while ( dc.weapon.size > 1 || primaries.size > 1 )
|
||||
if ( dc.weapon.size > 1 || primaries.size > 1 )
|
||||
{
|
||||
_a310 = primaries;
|
||||
_k310 = getFirstArrayKey( _a310 );
|
||||
while ( isDefined( _k310 ) )
|
||||
foreach ( weapon in primaries )
|
||||
{
|
||||
weapon = _a310[ _k310 ];
|
||||
self takeweapon( weapon );
|
||||
_k310 = getNextArrayKey( _a310, _k310 );
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
@ -259,13 +241,11 @@ tombstone_give()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( dc.weapon[ i ] == "none" )
|
||||
if ( dc.weapon[ i ] == "none" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
weapon = dc.weapon[ i ];
|
||||
stock = dc.stockcount[ i ];
|
||||
if ( !self hasweapon( weapon ) )
|
||||
@ -278,7 +258,6 @@ tombstone_give()
|
||||
self switchtoweapon( weapon );
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@ -303,7 +282,7 @@ tombstone_give()
|
||||
self giveweapon( "emp_grenade_zm" );
|
||||
self setweaponammoclip( "emp_grenade_zm", dc.empclip );
|
||||
}
|
||||
while ( isDefined( dc.perk ) && dc.perk.size > 0 )
|
||||
if ( isDefined( dc.perk ) && dc.perk.size > 0 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < dc.perk.size )
|
||||
@ -313,19 +292,16 @@ tombstone_give()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( dc.perk[ i ] == "specialty_quickrevive" && flag( "solo_game" ) )
|
||||
if ( dc.perk[ i ] == "specialty_quickrevive" && flag( "solo_game" ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
maps/mp/zombies/_zm_perks::give_perk( dc.perk[ i ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( dc.grenade > 0 && !flag( "solo_game" ) )
|
||||
else if ( dc.grenade > 0 && !flag( "solo_game" ) )
|
||||
{
|
||||
curgrenadecount = 0;
|
||||
if ( self hasweapon( self get_player_lethal_grenade() ) )
|
||||
@ -348,7 +324,7 @@ tombstone_give()
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_wobble()
|
||||
tombstone_wobble() //checked matches cerberus output
|
||||
{
|
||||
self endon( "tombstone_grabbed" );
|
||||
self endon( "tombstone_timedout" );
|
||||
@ -366,7 +342,7 @@ tombstone_wobble()
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_timeout()
|
||||
tombstone_timeout() //checked partially changed to match cerberus output
|
||||
{
|
||||
self endon( "tombstone_grabbed" );
|
||||
self thread playtombstonetimeraudio();
|
||||
@ -388,16 +364,13 @@ tombstone_timeout()
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( i < 25 )
|
||||
if ( i < 25 )
|
||||
{
|
||||
wait 0.25;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self notify( "tombstone_timedout" );
|
||||
@ -406,7 +379,7 @@ tombstone_timeout()
|
||||
self delete();
|
||||
}
|
||||
|
||||
playtombstonetimeraudio()
|
||||
playtombstonetimeraudio() //checked matches cerberus output
|
||||
{
|
||||
self endon( "tombstone_grabbed" );
|
||||
self endon( "tombstone_timedout" );
|
||||
@ -419,25 +392,24 @@ playtombstonetimeraudio()
|
||||
}
|
||||
}
|
||||
|
||||
playtombstonetimerout( player )
|
||||
playtombstonetimerout( player ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "tombstone_grabbed" );
|
||||
self waittill( "tombstone_timedout" );
|
||||
player playsoundtoplayer( "zmb_tombstone_timer_out", player );
|
||||
}
|
||||
|
||||
save_weapons_for_tombstone( player )
|
||||
save_weapons_for_tombstone( player ) //checked changed to match cerberus output
|
||||
{
|
||||
self.tombstone_melee_weapons = [];
|
||||
i = 0;
|
||||
while ( i < level._melee_weapons.size )
|
||||
|
||||
for ( i = 0; i < level._melee_weapons.size; i++; )
|
||||
{
|
||||
self save_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
save_weapon_for_tombstone( player, weapon_name )
|
||||
save_weapon_for_tombstone( player, weapon_name ) //checked matches cerberus output
|
||||
{
|
||||
if ( player hasweapon( weapon_name ) )
|
||||
{
|
||||
@ -447,18 +419,16 @@ save_weapon_for_tombstone( player, weapon_name )
|
||||
|
||||
restore_weapons_for_tombstone( player )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level._melee_weapons.size )
|
||||
for ( i = 0; i < level._melee_weapons.size; i++ )
|
||||
{
|
||||
self restore_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name );
|
||||
i++;
|
||||
}
|
||||
self.tombstone_melee_weapons = undefined;
|
||||
}
|
||||
|
||||
restore_weapon_for_tombstone( player, weapon_name )
|
||||
restore_weapon_for_tombstone( player, weapon_name ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( isDefined( weapon_name ) || !isDefined( self.tombstone_melee_weapons ) && !isDefined( self.tombstone_melee_weapons[ weapon_name ] ) )
|
||||
if ( !isDefined( weapon_name ) || !isDefined( self.tombstone_melee_weapons ) || !isDefined( self.tombstone_melee_weapons[ weapon_name ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -470,7 +440,7 @@ restore_weapon_for_tombstone( player, weapon_name )
|
||||
}
|
||||
}
|
||||
|
||||
tombstone_hostmigration()
|
||||
tombstone_hostmigration() //checked changed to match cerberus output
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level notify( "tombstone_hostmigration" );
|
||||
@ -479,18 +449,14 @@ tombstone_hostmigration()
|
||||
{
|
||||
level waittill( "host_migration_end" );
|
||||
tombstones = getentarray( "player_tombstone_model", "script_noteworthy" );
|
||||
_a580 = tombstones;
|
||||
_k580 = getFirstArrayKey( _a580 );
|
||||
while ( isDefined( _k580 ) )
|
||||
foreach ( model in tombstones )
|
||||
{
|
||||
model = _a580[ _k580 ];
|
||||
playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" );
|
||||
_k580 = getNextArrayKey( _a580, _k580 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is_weapon_available_in_tombstone( weapon, player_to_check )
|
||||
is_weapon_available_in_tombstone( weapon, player_to_check ) //checked partially changed to match cerberus output
|
||||
{
|
||||
count = 0;
|
||||
upgradedweapon = weapon;
|
||||
@ -507,13 +473,11 @@ is_weapon_available_in_tombstone( weapon, player_to_check )
|
||||
tombstone_index++;
|
||||
continue;
|
||||
}
|
||||
else if ( isDefined( player_to_check ) && dc.player != player_to_check )
|
||||
if ( isDefined( player_to_check ) && dc.player != player_to_check )
|
||||
{
|
||||
tombstone_index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
weapon_index = 0;
|
||||
while ( weapon_index < dc.weapon.size )
|
||||
{
|
||||
@ -522,19 +486,17 @@ is_weapon_available_in_tombstone( weapon, player_to_check )
|
||||
weapon_index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
tombstone_weapon = dc.weapon[ weapon_index ];
|
||||
if ( tombstone_weapon == weapon || tombstone_weapon == upgradedweapon )
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
weapon_index++;
|
||||
}
|
||||
}
|
||||
tombstone_index++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
948
patch_zm/maps/mp/zombies/_zm_traps.gsc
Normal file
948
patch_zm/maps/mp/zombies/_zm_traps.gsc
Normal file
@ -0,0 +1,948 @@
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/animscripts/zm_death;
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include maps/mp/zombies/_zm_net;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level.trap_kills = 0;
|
||||
traps = getentarray( "zombie_trap", "targetname" );
|
||||
array_thread( traps, ::trap_init );
|
||||
level thread register_visionsets( traps );
|
||||
level.burning_zombies = [];
|
||||
level.elec_trap_time = 40;
|
||||
level.elec_trap_cooldown_time = 60;
|
||||
}
|
||||
|
||||
trap_init()
|
||||
{
|
||||
self ent_flag_init( "flag_active" );
|
||||
self ent_flag_init( "flag_cooldown" );
|
||||
self._trap_type = "";
|
||||
if ( isDefined( self.script_noteworthy ) )
|
||||
{
|
||||
self._trap_type = self.script_noteworthy;
|
||||
if ( isDefined( level._zombiemode_trap_activate_funcs ) && isDefined( level._zombiemode_trap_activate_funcs[ self._trap_type ] ) )
|
||||
{
|
||||
self._trap_activate_func = level._zombiemode_trap_activate_funcs[ self._trap_type ];
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( self.script_noteworthy )
|
||||
{
|
||||
case "rotating":
|
||||
self._trap_activate_func = ::trap_activate_rotating;
|
||||
break;
|
||||
case "electric":
|
||||
self._trap_activate_func = ::trap_activate_electric;
|
||||
break;
|
||||
case "flipper":
|
||||
self._trap_activate_func = ::trap_activate_flipper;
|
||||
break;
|
||||
case "fire":
|
||||
default:
|
||||
self._trap_activate_func = ::trap_activate_fire;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level._zombiemode_trap_use_funcs ) && isDefined( level._zombiemode_trap_use_funcs[ self._trap_type ] ) )
|
||||
{
|
||||
self._trap_use_func = level._zombiemode_trap_use_funcs[ self._trap_type ];
|
||||
}
|
||||
else
|
||||
{
|
||||
self._trap_use_func = ::trap_use_think;
|
||||
}
|
||||
}
|
||||
self trap_model_type_init();
|
||||
self._trap_use_trigs = [];
|
||||
self._trap_lights = [];
|
||||
self._trap_movers = [];
|
||||
self._trap_switches = [];
|
||||
components = getentarray( self.target, "targetname" );
|
||||
i = 0;
|
||||
while ( i < components.size )
|
||||
{
|
||||
if ( isDefined( components[ i ].script_noteworthy ) )
|
||||
{
|
||||
switch( components[ i ].script_noteworthy )
|
||||
{
|
||||
case "counter_1s":
|
||||
self.counter_1s = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "counter_10s":
|
||||
self.counter_10s = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "counter_100s":
|
||||
self.counter_100s = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "mover":
|
||||
self._trap_movers[ self._trap_movers.size ] = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "switch":
|
||||
self._trap_switches[ self._trap_switches.size ] = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "light":
|
||||
self._trap_lightes[ self._trap_lightes.size ] = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( isDefined( components[ i ].script_string ) )
|
||||
{
|
||||
switch( components[ i ].script_string )
|
||||
{
|
||||
case "flipper1":
|
||||
self.flipper1 = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "flipper2":
|
||||
self.flipper2 = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "flipper1_radius_check":
|
||||
self.flipper1_radius_check = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "flipper2_radius_check":
|
||||
self.flipper2_radius_check = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "target1":
|
||||
self.target1 = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "target2":
|
||||
self.target2 = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "target3":
|
||||
self.target3 = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
switch( components[ i ].classname )
|
||||
{
|
||||
case "trigger_use":
|
||||
self._trap_use_trigs[ self._trap_use_trigs.size ] = components[ i ];
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "script_model":
|
||||
if ( components[ i ].model == self._trap_light_model_off )
|
||||
{
|
||||
self._trap_lights[ self._trap_lights.size ] = components[ i ];
|
||||
}
|
||||
else if ( components[ i ].model == self._trap_switch_model )
|
||||
{
|
||||
self._trap_switches[ self._trap_switches.size ] = components[ i ];
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self._trap_fx_structs = [];
|
||||
components = getstructarray( self.target, "targetname" );
|
||||
i = 0;
|
||||
while ( i < components.size )
|
||||
{
|
||||
if ( isDefined( components[ i ].script_string ) && components[ i ].script_string == "use_this_angle" )
|
||||
{
|
||||
self.use_this_angle = components[ i ];
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self._trap_fx_structs[ self._trap_fx_structs.size ] = components[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
/#
|
||||
assert( self._trap_use_trigs.size > 0, "_zm_traps::init no use triggers found for " + self.target );
|
||||
#/
|
||||
if ( !isDefined( self.zombie_cost ) )
|
||||
{
|
||||
self.zombie_cost = 1000;
|
||||
}
|
||||
self._trap_in_use = 0;
|
||||
self._trap_cooling_down = 0;
|
||||
self thread trap_dialog();
|
||||
flag_wait( "start_zombie_round_logic" );
|
||||
self trap_lights_red();
|
||||
i = 0;
|
||||
while ( i < self._trap_use_trigs.size )
|
||||
{
|
||||
self._trap_use_trigs[ i ] setcursorhint( "HINT_NOICON" );
|
||||
i++;
|
||||
}
|
||||
if ( !isDefined( self.script_flag_wait ) )
|
||||
{
|
||||
self trap_set_string( &"ZOMBIE_NEED_POWER" );
|
||||
flag_wait( "power_on" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( level.flag[ self.script_flag_wait ] ) )
|
||||
{
|
||||
flag_init( self.script_flag_wait );
|
||||
}
|
||||
flag_wait( self.script_flag_wait );
|
||||
}
|
||||
self trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", self.zombie_cost );
|
||||
self trap_lights_green();
|
||||
i = 0;
|
||||
while ( i < self._trap_use_trigs.size )
|
||||
{
|
||||
self._trap_use_trigs[ i ] thread [[ self._trap_use_func ]]( self );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
trap_use_think( trap )
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
while ( who in_revive_trigger() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( is_player_valid( who ) && !trap._trap_in_use )
|
||||
{
|
||||
if ( who.score >= trap.zombie_cost )
|
||||
{
|
||||
who maps/mp/zombies/_zm_score::minus_to_player_score( trap.zombie_cost );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
trap._trap_in_use = 1;
|
||||
trap trap_set_string( &"ZOMBIE_TRAP_ACTIVE" );
|
||||
play_sound_at_pos( "purchase", who.origin );
|
||||
if ( trap._trap_switches.size )
|
||||
{
|
||||
trap thread trap_move_switches();
|
||||
trap waittill( "switch_activated" );
|
||||
}
|
||||
trap trigger_on();
|
||||
trap thread [[ trap._trap_activate_func ]]();
|
||||
trap waittill( "trap_done" );
|
||||
trap trigger_off();
|
||||
trap._trap_cooling_down = 1;
|
||||
trap trap_set_string( &"ZOMBIE_TRAP_COOLDOWN" );
|
||||
/#
|
||||
if ( getDvarInt( "zombie_cheat" ) >= 1 )
|
||||
{
|
||||
trap._trap_cooldown_time = 5;
|
||||
#/
|
||||
}
|
||||
wait trap._trap_cooldown_time;
|
||||
trap._trap_cooling_down = 0;
|
||||
trap notify( "available" );
|
||||
trap._trap_in_use = 0;
|
||||
trap trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", trap.zombie_cost );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trap_lights_red()
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self._trap_lights.size )
|
||||
{
|
||||
light = self._trap_lights[ i ];
|
||||
light setmodel( self._trap_light_model_red );
|
||||
if ( isDefined( light.fx ) )
|
||||
{
|
||||
light.fx delete();
|
||||
}
|
||||
light.fx = maps/mp/zombies/_zm_net::network_safe_spawn( "trap_lights_red", 2, "script_model", light.origin );
|
||||
light.fx setmodel( "tag_origin" );
|
||||
light.fx.angles = light.angles;
|
||||
playfxontag( level._effect[ "zapper_light_notready" ], light.fx, "tag_origin" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
trap_lights_green()
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self._trap_lights.size )
|
||||
{
|
||||
light = self._trap_lights[ i ];
|
||||
if ( isDefined( light._switch_disabled ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
light setmodel( self._trap_light_model_green );
|
||||
if ( isDefined( light.fx ) )
|
||||
{
|
||||
light.fx delete();
|
||||
}
|
||||
light.fx = maps/mp/zombies/_zm_net::network_safe_spawn( "trap_lights_green", 2, "script_model", light.origin );
|
||||
light.fx setmodel( "tag_origin" );
|
||||
light.fx.angles = light.angles;
|
||||
playfxontag( level._effect[ "zapper_light_ready" ], light.fx, "tag_origin" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
trap_set_string( string, param1, param2 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self._trap_use_trigs.size )
|
||||
{
|
||||
if ( !isDefined( param1 ) )
|
||||
{
|
||||
self._trap_use_trigs[ i ] sethintstring( string );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( param2 ) )
|
||||
{
|
||||
self._trap_use_trigs[ i ] sethintstring( string, param1 );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self._trap_use_trigs[ i ] sethintstring( string, param1, param2 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
trap_move_switches()
|
||||
{
|
||||
self trap_lights_red();
|
||||
i = 0;
|
||||
while ( i < self._trap_switches.size )
|
||||
{
|
||||
self._trap_switches[ i ] rotatepitch( 180, 0,5 );
|
||||
self._trap_switches[ i ] playsound( "amb_sparks_l_b" );
|
||||
i++;
|
||||
}
|
||||
self._trap_switches[ 0 ] waittill( "rotatedone" );
|
||||
self notify( "switch_activated" );
|
||||
self waittill( "available" );
|
||||
i = 0;
|
||||
while ( i < self._trap_switches.size )
|
||||
{
|
||||
self._trap_switches[ i ] rotatepitch( -180, 0,5 );
|
||||
i++;
|
||||
}
|
||||
self._trap_switches[ 0 ] waittill( "rotatedone" );
|
||||
self trap_lights_green();
|
||||
}
|
||||
|
||||
trap_activate_electric()
|
||||
{
|
||||
self._trap_duration = 40;
|
||||
self._trap_cooldown_time = 60;
|
||||
self notify( "trap_activate" );
|
||||
if ( isDefined( self.script_string ) )
|
||||
{
|
||||
number = int( self.script_string );
|
||||
if ( number != 0 )
|
||||
{
|
||||
exploder( number );
|
||||
}
|
||||
else
|
||||
{
|
||||
clientnotify( self.script_string + "1" );
|
||||
}
|
||||
}
|
||||
fx_points = getstructarray( self.target, "targetname" );
|
||||
i = 0;
|
||||
while ( i < fx_points.size )
|
||||
{
|
||||
wait_network_frame();
|
||||
fx_points[ i ] thread trap_audio_fx( self );
|
||||
i++;
|
||||
}
|
||||
self thread trap_damage();
|
||||
wait self._trap_duration;
|
||||
self notify( "trap_done" );
|
||||
if ( isDefined( self.script_string ) )
|
||||
{
|
||||
clientnotify( self.script_string + "0" );
|
||||
}
|
||||
}
|
||||
|
||||
trap_activate_fire()
|
||||
{
|
||||
self._trap_duration = 40;
|
||||
self._trap_cooldown_time = 60;
|
||||
clientnotify( self.script_string + "1" );
|
||||
clientnotify( self.script_parameters );
|
||||
fx_points = getstructarray( self.target, "targetname" );
|
||||
i = 0;
|
||||
while ( i < fx_points.size )
|
||||
{
|
||||
wait_network_frame();
|
||||
fx_points[ i ] thread trap_audio_fx( self );
|
||||
i++;
|
||||
}
|
||||
self thread trap_damage();
|
||||
wait self._trap_duration;
|
||||
self notify( "trap_done" );
|
||||
clientnotify( self.script_string + "0" );
|
||||
clientnotify( self.script_parameters );
|
||||
}
|
||||
|
||||
trap_activate_rotating()
|
||||
{
|
||||
self endon( "trap_done" );
|
||||
self._trap_duration = 30;
|
||||
self._trap_cooldown_time = 60;
|
||||
self thread trap_damage();
|
||||
self thread trig_update( self._trap_movers[ 0 ] );
|
||||
old_angles = self._trap_movers[ 0 ].angles;
|
||||
i = 0;
|
||||
while ( i < self._trap_movers.size )
|
||||
{
|
||||
self._trap_movers[ i ] rotateyaw( 360, 5, 4,5 );
|
||||
i++;
|
||||
}
|
||||
wait 5;
|
||||
step = 1,5;
|
||||
t = 0;
|
||||
while ( t < self._trap_duration )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self._trap_movers.size )
|
||||
{
|
||||
self._trap_movers[ i ] rotateyaw( 360, step );
|
||||
i++;
|
||||
}
|
||||
wait step;
|
||||
t += step;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self._trap_movers.size )
|
||||
{
|
||||
self._trap_movers[ i ] rotateyaw( 360, 5, 0, 4,5 );
|
||||
i++;
|
||||
}
|
||||
wait 5;
|
||||
i = 0;
|
||||
while ( i < self._trap_movers.size )
|
||||
{
|
||||
self._trap_movers[ i ].angles = old_angles;
|
||||
i++;
|
||||
}
|
||||
self notify( "trap_done" );
|
||||
}
|
||||
|
||||
trap_activate_flipper()
|
||||
{
|
||||
}
|
||||
|
||||
trap_audio_fx( trap )
|
||||
{
|
||||
sound_origin = undefined;
|
||||
if ( trap.script_noteworthy == "electric" )
|
||||
{
|
||||
sound_origin = spawn( "script_origin", self.origin );
|
||||
sound_origin playsound( "zmb_elec_start" );
|
||||
sound_origin playloopsound( "zmb_elec_loop" );
|
||||
self thread play_electrical_sound( trap );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( trap.script_noteworthy == "fire" )
|
||||
{
|
||||
sound_origin = spawn( "script_origin", self.origin );
|
||||
sound_origin playsound( "zmb_firetrap_start" );
|
||||
sound_origin playloopsound( "zmb_firetrap_loop" );
|
||||
}
|
||||
}
|
||||
trap waittill_any_or_timeout( trap._trap_duration, "trap_done" );
|
||||
if ( isDefined( sound_origin ) )
|
||||
{
|
||||
if ( trap.script_noteworthy == "fire" )
|
||||
{
|
||||
playsoundatposition( "zmb_firetrap_end", sound_origin.origin );
|
||||
}
|
||||
sound_origin stoploopsound();
|
||||
wait 0,05;
|
||||
sound_origin delete();
|
||||
}
|
||||
}
|
||||
|
||||
play_electrical_sound( trap )
|
||||
{
|
||||
trap endon( "trap_done" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait randomfloatrange( 0,1, 0,5 );
|
||||
playsoundatposition( "zmb_elec_arc", self.origin );
|
||||
}
|
||||
}
|
||||
|
||||
trap_damage()
|
||||
{
|
||||
self endon( "trap_done" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", ent );
|
||||
if ( isplayer( ent ) )
|
||||
{
|
||||
switch( self._trap_type )
|
||||
{
|
||||
case "electric":
|
||||
ent thread player_elec_damage();
|
||||
break;
|
||||
case "fire":
|
||||
case "rocket":
|
||||
ent thread player_fire_damage();
|
||||
break;
|
||||
case "rotating":
|
||||
if ( ent getstance() == "stand" )
|
||||
{
|
||||
ent dodamage( 50, ent.origin + vectorScale( ( 0, 0, 1 ), 20 ) );
|
||||
ent setstance( "crouch" );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( ent.marked_for_death ) )
|
||||
{
|
||||
switch( self._trap_type )
|
||||
{
|
||||
case "rocket":
|
||||
ent thread zombie_trap_death( self, 100 );
|
||||
break;
|
||||
break;
|
||||
case "rotating":
|
||||
ent thread zombie_trap_death( self, 200 );
|
||||
break;
|
||||
break;
|
||||
case "electric":
|
||||
case "fire":
|
||||
default:
|
||||
ent thread zombie_trap_death( self, randomint( 100 ) );
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trig_update( parent )
|
||||
{
|
||||
self endon( "trap_done" );
|
||||
start_angles = self.angles;
|
||||
while ( 1 )
|
||||
{
|
||||
self.angles = parent.angles;
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
player_elec_damage()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
if ( !isDefined( level.elec_loop ) )
|
||||
{
|
||||
level.elec_loop = 0;
|
||||
}
|
||||
if ( !isDefined( self.is_burning ) && is_player_valid( self ) )
|
||||
{
|
||||
self.is_burning = 1;
|
||||
if ( is_true( level.trap_electric_visionset_registered ) )
|
||||
{
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_trap_electric", self, 1,25, 1,25 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setelectrified( 1,25 );
|
||||
}
|
||||
shocktime = 2,5;
|
||||
self shellshock( "electrocution", shocktime );
|
||||
if ( level.elec_loop == 0 )
|
||||
{
|
||||
elec_loop = 1;
|
||||
self playsound( "zmb_zombie_arc" );
|
||||
}
|
||||
if ( !self hasperk( "specialty_armorvest" ) || ( self.health - 100 ) < 1 )
|
||||
{
|
||||
radiusdamage( self.origin, 10, self.health + 100, self.health + 100 );
|
||||
self.is_burning = undefined;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( 50, self.origin );
|
||||
wait 0,1;
|
||||
self.is_burning = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player_fire_damage()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
if ( !isDefined( self.is_burning ) && !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
self.is_burning = 1;
|
||||
if ( is_true( level.trap_fire_visionset_registered ) )
|
||||
{
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_trap_burn", self, 1,25, 1,25 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setburn( 1,25 );
|
||||
}
|
||||
self notify( "burned" );
|
||||
if ( !self hasperk( "specialty_armorvest" ) || ( self.health - 100 ) < 1 )
|
||||
{
|
||||
radiusdamage( self.origin, 10, self.health + 100, self.health + 100 );
|
||||
self.is_burning = undefined;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( 50, self.origin );
|
||||
wait 0,1;
|
||||
self.is_burning = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
zombie_trap_death( trap, param )
|
||||
{
|
||||
self endon( "death" );
|
||||
self.marked_for_death = 1;
|
||||
switch( trap._trap_type )
|
||||
{
|
||||
case "electric":
|
||||
case "fire":
|
||||
case "rocket":
|
||||
if ( isDefined( self.animname ) && self.animname != "zombie_dog" )
|
||||
{
|
||||
if ( param > 90 && level.burning_zombies.size < 6 )
|
||||
{
|
||||
level.burning_zombies[ level.burning_zombies.size ] = self;
|
||||
self thread zombie_flame_watch();
|
||||
self playsound( "ignite" );
|
||||
self thread maps/mp/animscripts/zm_death::flame_death_fx();
|
||||
playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" );
|
||||
wait randomfloat( 1,25 );
|
||||
}
|
||||
else
|
||||
{
|
||||
refs[ 0 ] = "guts";
|
||||
refs[ 1 ] = "right_arm";
|
||||
refs[ 2 ] = "left_arm";
|
||||
refs[ 3 ] = "right_leg";
|
||||
refs[ 4 ] = "left_leg";
|
||||
refs[ 5 ] = "no_legs";
|
||||
refs[ 6 ] = "head";
|
||||
self.a.gib_ref = refs[ randomint( refs.size ) ];
|
||||
playsoundatposition( "zmb_zombie_arc", self.origin );
|
||||
if ( trap._trap_type == "electric" )
|
||||
{
|
||||
if ( randomint( 100 ) > 50 )
|
||||
{
|
||||
self thread electroctute_death_fx();
|
||||
self thread play_elec_vocals();
|
||||
}
|
||||
}
|
||||
wait randomfloat( 1,25 );
|
||||
self playsound( "zmb_zombie_arc" );
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.fire_damage_func ) )
|
||||
{
|
||||
self [[ self.fire_damage_func ]]( trap );
|
||||
}
|
||||
else
|
||||
{
|
||||
level notify( "trap_kill" );
|
||||
self dodamage( self.health + 666, self.origin, trap );
|
||||
}
|
||||
break;
|
||||
case "centrifuge":
|
||||
case "rotating":
|
||||
ang = vectorToAngle( trap.origin - self.origin );
|
||||
direction_vec = vectorScale( anglesToRight( ang ), param );
|
||||
if ( isDefined( self.trap_reaction_func ) )
|
||||
{
|
||||
self [[ self.trap_reaction_func ]]( trap );
|
||||
}
|
||||
level notify( "trap_kill" );
|
||||
self startragdoll();
|
||||
self launchragdoll( direction_vec );
|
||||
wait_network_frame();
|
||||
self.a.gib_ref = "head";
|
||||
self dodamage( self.health, self.origin, trap );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
zombie_flame_watch()
|
||||
{
|
||||
self waittill( "death" );
|
||||
self stoploopsound();
|
||||
arrayremovevalue( level.burning_zombies, self );
|
||||
}
|
||||
|
||||
play_elec_vocals()
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
org = self.origin;
|
||||
wait 0,15;
|
||||
playsoundatposition( "zmb_elec_vocals", org );
|
||||
playsoundatposition( "zmb_zombie_arc", org );
|
||||
playsoundatposition( "zmb_exp_jib_zombie", org );
|
||||
}
|
||||
}
|
||||
|
||||
electroctute_death_fx()
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.is_electrocuted ) && self.is_electrocuted )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.is_electrocuted = 1;
|
||||
self thread electrocute_timeout();
|
||||
if ( self.team == level.zombie_team )
|
||||
{
|
||||
level.bconfiretime = getTime();
|
||||
level.bconfireorg = self.origin;
|
||||
}
|
||||
if ( isDefined( level._effect[ "elec_torso" ] ) )
|
||||
{
|
||||
playfxontag( level._effect[ "elec_torso" ], self, "J_SpineLower" );
|
||||
}
|
||||
self playsound( "zmb_elec_jib_zombie" );
|
||||
wait 1;
|
||||
tagarray = [];
|
||||
tagarray[ 0 ] = "J_Elbow_LE";
|
||||
tagarray[ 1 ] = "J_Elbow_RI";
|
||||
tagarray[ 2 ] = "J_Knee_RI";
|
||||
tagarray[ 3 ] = "J_Knee_LE";
|
||||
tagarray = array_randomize( tagarray );
|
||||
if ( isDefined( level._effect[ "elec_md" ] ) )
|
||||
{
|
||||
playfxontag( level._effect[ "elec_md" ], self, tagarray[ 0 ] );
|
||||
}
|
||||
self playsound( "zmb_elec_jib_zombie" );
|
||||
wait 1;
|
||||
self playsound( "zmb_elec_jib_zombie" );
|
||||
tagarray[ 0 ] = "J_Wrist_RI";
|
||||
tagarray[ 1 ] = "J_Wrist_LE";
|
||||
if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" )
|
||||
{
|
||||
tagarray[ 2 ] = "J_Ankle_RI";
|
||||
tagarray[ 3 ] = "J_Ankle_LE";
|
||||
}
|
||||
tagarray = array_randomize( tagarray );
|
||||
if ( isDefined( level._effect[ "elec_sm" ] ) )
|
||||
{
|
||||
playfxontag( level._effect[ "elec_sm" ], self, tagarray[ 0 ] );
|
||||
playfxontag( level._effect[ "elec_sm" ], self, tagarray[ 1 ] );
|
||||
}
|
||||
}
|
||||
|
||||
electrocute_timeout()
|
||||
{
|
||||
self endon( "death" );
|
||||
self playloopsound( "fire_manager_0" );
|
||||
wait 12;
|
||||
self stoploopsound();
|
||||
if ( isDefined( self ) && isalive( self ) )
|
||||
{
|
||||
self.is_electrocuted = 0;
|
||||
self notify( "stop_flame_damage" );
|
||||
}
|
||||
}
|
||||
|
||||
trap_dialog()
|
||||
{
|
||||
self endon( "warning_dialog" );
|
||||
level endon( "switch_flipped" );
|
||||
timer = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,5;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
dist = distancesquared( players[ i ].origin, self.origin );
|
||||
if ( dist > 4900 )
|
||||
{
|
||||
timer = 0;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( dist < 4900 && timer < 3 )
|
||||
{
|
||||
wait 0,5;
|
||||
timer++;
|
||||
}
|
||||
if ( dist < 4900 && timer == 3 )
|
||||
{
|
||||
index = maps/mp/zombies/_zm_weapons::get_player_index( players[ i ] );
|
||||
plr = "plr_" + index + "_";
|
||||
wait 3;
|
||||
self notify( "warning_dialog" );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get_trap_array( trap_type )
|
||||
{
|
||||
ents = getentarray( "zombie_trap", "targetname" );
|
||||
traps = [];
|
||||
i = 0;
|
||||
while ( i < ents.size )
|
||||
{
|
||||
if ( ents[ i ].script_noteworthy == trap_type )
|
||||
{
|
||||
traps[ traps.size ] = ents[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return traps;
|
||||
}
|
||||
|
||||
trap_disable()
|
||||
{
|
||||
cooldown = self._trap_cooldown_time;
|
||||
if ( self._trap_in_use )
|
||||
{
|
||||
self notify( "trap_done" );
|
||||
self._trap_cooldown_time = 0,05;
|
||||
self waittill( "available" );
|
||||
}
|
||||
array_thread( self._trap_use_trigs, ::trigger_off );
|
||||
self trap_lights_red();
|
||||
self._trap_cooldown_time = cooldown;
|
||||
}
|
||||
|
||||
trap_enable()
|
||||
{
|
||||
array_thread( self._trap_use_trigs, ::trigger_on );
|
||||
self trap_lights_green();
|
||||
}
|
||||
|
||||
trap_model_type_init()
|
||||
{
|
||||
if ( !isDefined( self.script_parameters ) )
|
||||
{
|
||||
self.script_parameters = "default";
|
||||
}
|
||||
switch( self.script_parameters )
|
||||
{
|
||||
case "pentagon_electric":
|
||||
self._trap_light_model_off = "zombie_trap_switch_light";
|
||||
self._trap_light_model_green = "zombie_trap_switch_light_on_green";
|
||||
self._trap_light_model_red = "zombie_trap_switch_light_on_red";
|
||||
self._trap_switch_model = "zombie_trap_switch_handle";
|
||||
break;
|
||||
case "default":
|
||||
default:
|
||||
self._trap_light_model_off = "zombie_zapper_cagelight";
|
||||
self._trap_light_model_green = "zombie_zapper_cagelight_green";
|
||||
self._trap_light_model_red = "zombie_zapper_cagelight_red";
|
||||
self._trap_switch_model = "zombie_zapper_handle";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
register_visionsets( a_traps )
|
||||
{
|
||||
a_registered_traps = [];
|
||||
_a1177 = a_traps;
|
||||
_k1177 = getFirstArrayKey( _a1177 );
|
||||
while ( isDefined( _k1177 ) )
|
||||
{
|
||||
trap = _a1177[ _k1177 ];
|
||||
if ( isDefined( trap.script_noteworthy ) )
|
||||
{
|
||||
if ( !trap is_trap_registered( a_registered_traps ) )
|
||||
{
|
||||
a_registered_traps[ trap.script_noteworthy ] = 1;
|
||||
}
|
||||
}
|
||||
_k1177 = getNextArrayKey( _a1177, _k1177 );
|
||||
}
|
||||
keys = getarraykeys( a_registered_traps );
|
||||
_a1190 = keys;
|
||||
_k1190 = getFirstArrayKey( _a1190 );
|
||||
while ( isDefined( _k1190 ) )
|
||||
{
|
||||
key = _a1190[ _k1190 ];
|
||||
switch( key )
|
||||
{
|
||||
case "electric":
|
||||
if ( !isDefined( level.vsmgr_prio_overlay_zm_trap_electrified ) )
|
||||
{
|
||||
level.vsmgr_prio_overlay_zm_trap_electrified = 60;
|
||||
}
|
||||
maps/mp/_visionset_mgr::vsmgr_register_info( "overlay", "zm_trap_electric", 16000, level.vsmgr_prio_overlay_zm_trap_electrified, 15, 1, ::maps/mp/_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 );
|
||||
level.trap_electric_visionset_registered = 1;
|
||||
break;
|
||||
case "fire":
|
||||
if ( !isDefined( level.vsmgr_prio_overlay_zm_trap_burn ) )
|
||||
{
|
||||
level.vsmgr_prio_overlay_zm_trap_burn = 61;
|
||||
}
|
||||
maps/mp/_visionset_mgr::vsmgr_register_info( "overlay", "zm_trap_burn", 16000, level.vsmgr_prio_overlay_zm_trap_burn, 15, 1, ::maps/mp/_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 );
|
||||
level.trap_fire_visionset_registered = 1;
|
||||
break;
|
||||
}
|
||||
_k1190 = getNextArrayKey( _a1190, _k1190 );
|
||||
}
|
||||
}
|
||||
|
||||
is_trap_registered( a_registered_traps )
|
||||
{
|
||||
return isDefined( a_registered_traps[ self.script_noteworthy ] );
|
||||
}
|
447
patch_zm/maps/mp/zombies/_zm_turned.gsc
Normal file
447
patch_zm/maps/mp/zombies/_zm_turned.gsc
Normal file
@ -0,0 +1,447 @@
|
||||
#include maps/mp/gametypes_zm/_spawnlogic;
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level.turnedmeleeweapon = "zombiemelee_zm";
|
||||
level.turnedmeleeweapon_dw = "zombiemelee_dw";
|
||||
precacheitem( level.turnedmeleeweapon );
|
||||
precacheitem( level.turnedmeleeweapon_dw );
|
||||
if ( isDefined( level.custom_zombie_player_loadout_init ) && !level.custom_zombie_player_loadout_init )
|
||||
{
|
||||
precachemodel( "c_zom_player_zombie_fb" );
|
||||
precachemodel( "c_zom_zombie_viewhands" );
|
||||
}
|
||||
if ( !isDefined( level.vsmgr_prio_visionset_zombie_turned ) )
|
||||
{
|
||||
level.vsmgr_prio_visionset_zombie_turned = 123;
|
||||
}
|
||||
maps/mp/_visionset_mgr::vsmgr_register_info( "visionset", "zm_turned", 3000, level.vsmgr_prio_visionset_zombie_turned, 1, 1 );
|
||||
registerclientfield( "toplayer", "turned_ir", 3000, 1, "int" );
|
||||
registerclientfield( "allplayers", "player_has_eyes", 3000, 1, "int" );
|
||||
registerclientfield( "allplayers", "player_eyes_special", 5000, 1, "int" );
|
||||
level._effect[ "player_eye_glow" ] = loadfx( "maps/zombie/fx_zombie_eye_returned_blue" );
|
||||
level._effect[ "player_eye_glow_orng" ] = loadfx( "maps/zombie/fx_zombie_eye_returned_orng" );
|
||||
thread setup_zombie_exerts();
|
||||
}
|
||||
|
||||
setup_zombie_exerts()
|
||||
{
|
||||
wait 0,05;
|
||||
level.exert_sounds[ 1 ][ "burp" ] = "null";
|
||||
level.exert_sounds[ 1 ][ "hitmed" ] = "null";
|
||||
level.exert_sounds[ 1 ][ "hitlrg" ] = "null";
|
||||
}
|
||||
|
||||
delay_turning_on_eyes()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
wait_network_frame();
|
||||
wait 0,1;
|
||||
self setclientfield( "player_has_eyes", 1 );
|
||||
}
|
||||
|
||||
turn_to_zombie()
|
||||
{
|
||||
if ( self.sessionstate == "playing" && isDefined( self.is_zombie ) && self.is_zombie && isDefined( self.laststand ) && !self.laststand )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( isDefined( self.is_in_process_of_humanify ) && self.is_in_process_of_humanify )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
if ( !flag( "pregame" ) )
|
||||
{
|
||||
self playsoundtoplayer( "evt_spawn", self );
|
||||
playsoundatposition( "evt_disappear_3d", self.origin );
|
||||
if ( !self.is_zombie )
|
||||
{
|
||||
playsoundatposition( "vox_plr_" + randomintrange( 0, 4 ) + "_exert_death_high_" + randomintrange( 0, 4 ), self.origin );
|
||||
}
|
||||
}
|
||||
self._can_score = 1;
|
||||
self setclientfield( "player_has_eyes", 0 );
|
||||
self ghost();
|
||||
self turned_disable_player_weapons();
|
||||
self notify( "clear_red_flashing_overlay" );
|
||||
self notify( "zombify" );
|
||||
self.is_in_process_of_zombify = 1;
|
||||
self.team = level.zombie_team;
|
||||
self.pers[ "team" ] = level.zombie_team;
|
||||
self.sessionteam = level.zombie_team;
|
||||
wait_network_frame();
|
||||
self maps/mp/gametypes_zm/_zm_gametype::onspawnplayer();
|
||||
self freezecontrols( 1 );
|
||||
self.is_zombie = 1;
|
||||
self setburn( 0 );
|
||||
if ( isDefined( self.turned_visionset ) && self.turned_visionset )
|
||||
{
|
||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_turned", self );
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_turned", self );
|
||||
self.turned_visionset = 1;
|
||||
self setclientfieldtoplayer( "turned_ir", 1 );
|
||||
self maps/mp/zombies/_zm_audio::setexertvoice( 1 );
|
||||
self.laststand = undefined;
|
||||
wait_network_frame();
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self enableweapons();
|
||||
self show();
|
||||
playsoundatposition( "evt_appear_3d", self.origin );
|
||||
playsoundatposition( "zmb_zombie_spawn", self.origin );
|
||||
self thread delay_turning_on_eyes();
|
||||
self thread turned_player_buttons();
|
||||
self setperk( "specialty_noname" );
|
||||
self setperk( "specialty_unlimitedsprint" );
|
||||
self setperk( "specialty_fallheight" );
|
||||
self turned_give_melee_weapon();
|
||||
self setmovespeedscale( 1 );
|
||||
self.animname = "zombie";
|
||||
self disableoffhandweapons();
|
||||
self allowstand( 1 );
|
||||
self allowprone( 0 );
|
||||
self allowcrouch( 0 );
|
||||
self allowads( 0 );
|
||||
self allowjump( 0 );
|
||||
self disableweaponcycling();
|
||||
self setmovespeedscale( 1 );
|
||||
self setsprintduration( 4 );
|
||||
self setsprintcooldown( 0 );
|
||||
self stopshellshock();
|
||||
self.maxhealth = 256;
|
||||
self.health = 256;
|
||||
self.meleedamage = 1000;
|
||||
self detachall();
|
||||
if ( isDefined( level.custom_zombie_player_loadout ) )
|
||||
{
|
||||
self [[ level.custom_zombie_player_loadout ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
self setmodel( "c_zom_player_zombie_fb" );
|
||||
self.voice = "american";
|
||||
self.skeleton = "base";
|
||||
self setviewmodel( "c_zom_zombie_viewhands" );
|
||||
}
|
||||
self.shock_onpain = 0;
|
||||
self disableinvulnerability();
|
||||
if ( isDefined( level.player_movement_suppressed ) )
|
||||
{
|
||||
self freezecontrols( level.player_movement_suppressed );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.hostmigrationcontrolsfrozen ) && !self.hostmigrationcontrolsfrozen )
|
||||
{
|
||||
self freezecontrols( 0 );
|
||||
}
|
||||
}
|
||||
self.is_in_process_of_zombify = 0;
|
||||
}
|
||||
|
||||
turn_to_human()
|
||||
{
|
||||
if ( self.sessionstate == "playing" && isDefined( self.is_zombie ) && !self.is_zombie && isDefined( self.laststand ) && !self.laststand )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.is_in_process_of_humanify ) && self.is_in_process_of_humanify )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( isDefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
self playsoundtoplayer( "evt_spawn", self );
|
||||
playsoundatposition( "evt_disappear_3d", self.origin );
|
||||
self setclientfield( "player_has_eyes", 0 );
|
||||
self ghost();
|
||||
self notify( "humanify" );
|
||||
self.is_in_process_of_humanify = 1;
|
||||
self.is_zombie = 0;
|
||||
self notify( "clear_red_flashing_overlay" );
|
||||
self.team = self.prevteam;
|
||||
self.pers[ "team" ] = self.prevteam;
|
||||
self.sessionteam = self.prevteam;
|
||||
wait_network_frame();
|
||||
self maps/mp/gametypes_zm/_zm_gametype::onspawnplayer();
|
||||
self.maxhealth = 100;
|
||||
self.health = 100;
|
||||
self freezecontrols( 1 );
|
||||
if ( self hasweapon( "death_throe_zm" ) )
|
||||
{
|
||||
self takeweapon( "death_throe_zm" );
|
||||
}
|
||||
self unsetperk( "specialty_noname" );
|
||||
self unsetperk( "specialty_unlimitedsprint" );
|
||||
self unsetperk( "specialty_fallheight" );
|
||||
self turned_enable_player_weapons();
|
||||
self maps/mp/zombies/_zm_audio::setexertvoice( 0 );
|
||||
self.turned_visionset = 0;
|
||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_turned", self );
|
||||
self setclientfieldtoplayer( "turned_ir", 0 );
|
||||
self setmovespeedscale( 1 );
|
||||
self.ignoreme = 0;
|
||||
self.shock_onpain = 1;
|
||||
self enableweaponcycling();
|
||||
self allowstand( 1 );
|
||||
self allowprone( 1 );
|
||||
self allowcrouch( 1 );
|
||||
self allowads( 1 );
|
||||
self allowjump( 1 );
|
||||
self turnedhuman();
|
||||
self enableoffhandweapons();
|
||||
self stopshellshock();
|
||||
self.laststand = undefined;
|
||||
self.is_burning = undefined;
|
||||
self.meleedamage = undefined;
|
||||
self detachall();
|
||||
self [[ level.givecustomcharacters ]]();
|
||||
if ( !self hasweapon( "knife_zm" ) )
|
||||
{
|
||||
self giveweapon( "knife_zm" );
|
||||
}
|
||||
wait_network_frame();
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self disableinvulnerability();
|
||||
if ( isDefined( level.player_movement_suppressed ) )
|
||||
{
|
||||
self freezecontrols( level.player_movement_suppressed );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.hostmigrationcontrolsfrozen ) && !self.hostmigrationcontrolsfrozen )
|
||||
{
|
||||
self freezecontrols( 0 );
|
||||
}
|
||||
}
|
||||
self show();
|
||||
playsoundatposition( "evt_appear_3d", self.origin );
|
||||
self.is_in_process_of_humanify = 0;
|
||||
}
|
||||
|
||||
deletezombiesinradius( origin )
|
||||
{
|
||||
zombies = get_round_enemy_array();
|
||||
maxradius = 128;
|
||||
_a328 = zombies;
|
||||
_k328 = getFirstArrayKey( _a328 );
|
||||
while ( isDefined( _k328 ) )
|
||||
{
|
||||
zombie = _a328[ _k328 ];
|
||||
if ( isDefined( zombie ) && isalive( zombie ) && isDefined( zombie.is_being_used_as_spawner ) && !zombie.is_being_used_as_spawner )
|
||||
{
|
||||
if ( distancesquared( zombie.origin, origin ) < ( maxradius * maxradius ) )
|
||||
{
|
||||
playfx( level._effect[ "wood_chunk_destory" ], zombie.origin );
|
||||
zombie thread silentlyremovezombie();
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
_k328 = getNextArrayKey( _a328, _k328 );
|
||||
}
|
||||
}
|
||||
|
||||
turned_give_melee_weapon()
|
||||
{
|
||||
/#
|
||||
assert( isDefined( self.turnedmeleeweapon ) );
|
||||
#/
|
||||
/#
|
||||
assert( self.turnedmeleeweapon != "none" );
|
||||
#/
|
||||
self.turned_had_knife = self hasweapon( "knife_zm" );
|
||||
if ( isDefined( self.turned_had_knife ) && self.turned_had_knife )
|
||||
{
|
||||
self takeweapon( "knife_zm" );
|
||||
}
|
||||
self giveweapon( self.turnedmeleeweapon_dw );
|
||||
self givemaxammo( self.turnedmeleeweapon_dw );
|
||||
self giveweapon( self.turnedmeleeweapon );
|
||||
self givemaxammo( self.turnedmeleeweapon );
|
||||
self switchtoweapon( self.turnedmeleeweapon_dw );
|
||||
self switchtoweapon( self.turnedmeleeweapon );
|
||||
}
|
||||
|
||||
turned_player_buttons()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "humanify" );
|
||||
level endon( "end_game" );
|
||||
while ( isDefined( self.is_zombie ) && self.is_zombie )
|
||||
{
|
||||
while ( !self attackbuttonpressed() || self adsbuttonpressed() && self meleebuttonpressed() )
|
||||
{
|
||||
if ( cointoss() )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "attack", undefined );
|
||||
}
|
||||
while ( !self attackbuttonpressed() || self adsbuttonpressed() && self meleebuttonpressed() )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
while ( self usebuttonpressed() )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "taunt", undefined );
|
||||
while ( self usebuttonpressed() )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
while ( self issprinting() )
|
||||
{
|
||||
while ( self issprinting() )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "sprint", undefined );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
turned_disable_player_weapons()
|
||||
{
|
||||
if ( isDefined( self.is_zombie ) && self.is_zombie )
|
||||
{
|
||||
return;
|
||||
}
|
||||
weaponinventory = self getweaponslist();
|
||||
self.lastactiveweapon = self getcurrentweapon();
|
||||
self setlaststandprevweap( self.lastactiveweapon );
|
||||
self.laststandpistol = undefined;
|
||||
self.hadpistol = 0;
|
||||
if ( !isDefined( self.turnedmeleeweapon ) )
|
||||
{
|
||||
self.turnedmeleeweapon = level.turnedmeleeweapon;
|
||||
}
|
||||
if ( !isDefined( self.turnedmeleeweapon_dw ) )
|
||||
{
|
||||
self.turnedmeleeweapon_dw = level.turnedmeleeweapon_dw;
|
||||
}
|
||||
self takeallweapons();
|
||||
self disableweaponcycling();
|
||||
}
|
||||
|
||||
turned_enable_player_weapons()
|
||||
{
|
||||
self takeallweapons();
|
||||
self enableweaponcycling();
|
||||
self enableoffhandweapons();
|
||||
self.turned_had_knife = undefined;
|
||||
if ( isDefined( level.humanify_custom_loadout ) )
|
||||
{
|
||||
self thread [[ level.humanify_custom_loadout ]]();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !self hasweapon( "rottweil72_zm" ) )
|
||||
{
|
||||
self giveweapon( "rottweil72_zm" );
|
||||
self switchtoweapon( "rottweil72_zm" );
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.is_zombie ) && !self.is_zombie && !self hasweapon( level.start_weapon ) )
|
||||
{
|
||||
if ( !self hasweapon( "knife_zm" ) )
|
||||
{
|
||||
self giveweapon( "knife_zm" );
|
||||
}
|
||||
self give_start_weapon( 0 );
|
||||
}
|
||||
if ( self hasweapon( "rottweil72_zm" ) )
|
||||
{
|
||||
self setweaponammoclip( "rottweil72_zm", 2 );
|
||||
self setweaponammostock( "rottweil72_zm", 0 );
|
||||
}
|
||||
if ( self hasweapon( level.start_weapon ) )
|
||||
{
|
||||
self givemaxammo( level.start_weapon );
|
||||
}
|
||||
if ( self hasweapon( self get_player_lethal_grenade() ) )
|
||||
{
|
||||
self getweaponammoclip( self get_player_lethal_grenade() );
|
||||
}
|
||||
else
|
||||
{
|
||||
self giveweapon( self get_player_lethal_grenade() );
|
||||
}
|
||||
self setweaponammoclip( self get_player_lethal_grenade(), 2 );
|
||||
}
|
||||
|
||||
get_farthest_available_zombie( player )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
zombies = get_array_of_closest( player.origin, getaiarray( level.zombie_team ) );
|
||||
x = 0;
|
||||
while ( x < zombies.size )
|
||||
{
|
||||
zombie = zombies[ x ];
|
||||
if ( isDefined( zombie ) && isalive( zombie ) && isDefined( zombie.in_the_ground ) && !zombie.in_the_ground && isDefined( zombie.gibbed ) && !zombie.gibbed && isDefined( zombie.head_gibbed ) && !zombie.head_gibbed && isDefined( zombie.is_being_used_as_spawnpoint ) && !zombie.is_being_used_as_spawnpoint && zombie in_playable_area() )
|
||||
{
|
||||
zombie.is_being_used_as_spawnpoint = 1;
|
||||
return zombie;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
get_available_human()
|
||||
{
|
||||
players = get_players();
|
||||
_a539 = players;
|
||||
_k539 = getFirstArrayKey( _a539 );
|
||||
while ( isDefined( _k539 ) )
|
||||
{
|
||||
player = _a539[ _k539 ];
|
||||
if ( isDefined( player.is_zombie ) && !player.is_zombie )
|
||||
{
|
||||
return player;
|
||||
}
|
||||
_k539 = getNextArrayKey( _a539, _k539 );
|
||||
}
|
||||
}
|
||||
|
||||
silentlyremovezombie()
|
||||
{
|
||||
self.skip_death_notetracks = 1;
|
||||
self.nodeathragdoll = 1;
|
||||
self dodamage( self.maxhealth * 2, self.origin, self, self, "none", "MOD_SUICIDE" );
|
||||
self self_delete();
|
||||
}
|
||||
|
||||
getspawnpoint()
|
||||
{
|
||||
spawnpoint = self maps/mp/gametypes_zm/_spawnlogic::getspawnpoint_dm( level._turned_zombie_respawnpoints );
|
||||
return spawnpoint;
|
||||
}
|
800
patch_zm/maps/mp/zombies/_zm_unitrigger.gsc
Normal file
800
patch_zm/maps/mp/zombies/_zm_unitrigger.gsc
Normal file
@ -0,0 +1,800 @@
|
||||
#include maps/mp/zombies/_zm_zonemgr;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level._unitriggers = spawnstruct();
|
||||
level._unitriggers._deferredinitlist = [];
|
||||
level._unitriggers.trigger_pool = [];
|
||||
level._unitriggers.trigger_stubs = [];
|
||||
level._unitriggers.dynamic_stubs = [];
|
||||
level._unitriggers.system_trigger_funcs = [];
|
||||
level._unitriggers.largest_radius = 64;
|
||||
stubs_keys = array( "unitrigger_radius", "unitrigger_radius_use", "unitrigger_box", "unitrigger_box_use" );
|
||||
stubs = [];
|
||||
i = 0;
|
||||
while ( i < stubs_keys.size )
|
||||
{
|
||||
stubs = arraycombine( stubs, getstructarray( stubs_keys[ i ], "script_unitrigger_type" ), 1, 0 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < stubs.size )
|
||||
{
|
||||
register_unitrigger( stubs[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
register_unitrigger_system_func( system, trigger_func )
|
||||
{
|
||||
level._unitriggers.system_trigger_funcs[ system ] = trigger_func;
|
||||
}
|
||||
|
||||
unitrigger_force_per_player_triggers( unitrigger_stub, opt_on_off )
|
||||
{
|
||||
if ( !isDefined( opt_on_off ) )
|
||||
{
|
||||
opt_on_off = 1;
|
||||
}
|
||||
unitrigger_stub.trigger_per_player = opt_on_off;
|
||||
}
|
||||
|
||||
unitrigger_trigger( player )
|
||||
{
|
||||
if ( self.trigger_per_player )
|
||||
{
|
||||
return self.playertrigger[ player getentitynumber() ];
|
||||
}
|
||||
else
|
||||
{
|
||||
return self.trigger;
|
||||
}
|
||||
}
|
||||
|
||||
unitrigger_origin()
|
||||
{
|
||||
if ( isDefined( self.originfunc ) )
|
||||
{
|
||||
origin = self [[ self.originfunc ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
origin = self.origin;
|
||||
}
|
||||
return origin;
|
||||
}
|
||||
|
||||
register_unitrigger_internal( unitrigger_stub, trigger_func )
|
||||
{
|
||||
if ( !isDefined( unitrigger_stub.script_unitrigger_type ) )
|
||||
{
|
||||
/#
|
||||
println( "Cannot register a unitrigger with no script_unitrigger_type. Ignoring." );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
if ( isDefined( trigger_func ) )
|
||||
{
|
||||
unitrigger_stub.trigger_func = trigger_func;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( unitrigger_stub.unitrigger_system ) && isDefined( level._unitriggers.system_trigger_funcs[ unitrigger_stub.unitrigger_system ] ) )
|
||||
{
|
||||
unitrigger_stub.trigger_func = level._unitriggers.system_trigger_funcs[ unitrigger_stub.unitrigger_system ];
|
||||
}
|
||||
}
|
||||
switch( unitrigger_stub.script_unitrigger_type )
|
||||
{
|
||||
case "unitrigger_radius":
|
||||
case "unitrigger_radius_use":
|
||||
if ( !isDefined( unitrigger_stub.radius ) )
|
||||
{
|
||||
unitrigger_stub.radius = 32;
|
||||
}
|
||||
if ( !isDefined( unitrigger_stub.script_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = 64;
|
||||
}
|
||||
unitrigger_stub.test_radius_sq = ( unitrigger_stub.radius + 15 ) * ( unitrigger_stub.radius + 15 );
|
||||
break;
|
||||
case "unitrigger_box":
|
||||
case "unitrigger_box_use":
|
||||
if ( !isDefined( unitrigger_stub.script_width ) )
|
||||
{
|
||||
unitrigger_stub.script_width = 64;
|
||||
}
|
||||
if ( !isDefined( unitrigger_stub.script_height ) )
|
||||
{
|
||||
unitrigger_stub.script_height = 64;
|
||||
}
|
||||
if ( !isDefined( unitrigger_stub.script_length ) )
|
||||
{
|
||||
unitrigger_stub.script_length = 64;
|
||||
}
|
||||
box_radius = length( ( unitrigger_stub.script_width / 2, unitrigger_stub.script_length / 2, unitrigger_stub.script_height / 2 ) );
|
||||
if ( !isDefined( unitrigger_stub.radius ) || unitrigger_stub.radius < box_radius )
|
||||
{
|
||||
unitrigger_stub.radius = box_radius;
|
||||
}
|
||||
unitrigger_stub.test_radius_sq = ( box_radius + 15 ) * ( box_radius + 15 );
|
||||
break;
|
||||
default:
|
||||
/#
|
||||
println( "Unknown unitrigger type registered : " + unitrigger_stub.targetname + " - ignoring." );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
if ( unitrigger_stub.radius > level._unitriggers.largest_radius )
|
||||
{
|
||||
level._unitriggers.largest_radius = min( 113, unitrigger_stub.radius );
|
||||
if ( isDefined( level.fixed_max_player_use_radius ) )
|
||||
{
|
||||
if ( level.fixed_max_player_use_radius > getDvarFloat( "player_useRadius_zm" ) )
|
||||
{
|
||||
setdvar( "player_useRadius_zm", level.fixed_max_player_use_radius );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level._unitriggers.largest_radius > getDvarFloat( "player_useRadius_zm" ) )
|
||||
{
|
||||
setdvar( "player_useRadius_zm", level._unitriggers.largest_radius );
|
||||
}
|
||||
}
|
||||
}
|
||||
level._unitriggers.trigger_stubs[ level._unitriggers.trigger_stubs.size ] = unitrigger_stub;
|
||||
unitrigger_stub.registered = 1;
|
||||
}
|
||||
|
||||
register_unitrigger( unitrigger_stub, trigger_func )
|
||||
{
|
||||
register_unitrigger_internal( unitrigger_stub, trigger_func );
|
||||
level._unitriggers.dynamic_stubs[ level._unitriggers.dynamic_stubs.size ] = unitrigger_stub;
|
||||
}
|
||||
|
||||
unregister_unitrigger( unitrigger_stub )
|
||||
{
|
||||
thread unregister_unitrigger_internal( unitrigger_stub );
|
||||
}
|
||||
|
||||
unregister_unitrigger_internal( unitrigger_stub )
|
||||
{
|
||||
if ( !isDefined( unitrigger_stub ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
unitrigger_stub.registered = 0;
|
||||
if ( isDefined( unitrigger_stub.trigger_per_player ) && unitrigger_stub.trigger_per_player )
|
||||
{
|
||||
if ( isDefined( unitrigger_stub.playertrigger ) && unitrigger_stub.playertrigger.size > 0 )
|
||||
{
|
||||
keys = getarraykeys( unitrigger_stub.playertrigger );
|
||||
_a181 = keys;
|
||||
_k181 = getFirstArrayKey( _a181 );
|
||||
while ( isDefined( _k181 ) )
|
||||
{
|
||||
key = _a181[ _k181 ];
|
||||
trigger = unitrigger_stub.playertrigger[ key ];
|
||||
trigger notify( "kill_trigger" );
|
||||
if ( isDefined( trigger ) )
|
||||
{
|
||||
trigger delete();
|
||||
}
|
||||
_k181 = getNextArrayKey( _a181, _k181 );
|
||||
}
|
||||
unitrigger_stub.playertrigger = [];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( unitrigger_stub.trigger ) )
|
||||
{
|
||||
trigger = unitrigger_stub.trigger;
|
||||
trigger notify( "kill_trigger" );
|
||||
trigger.stub.trigger = undefined;
|
||||
trigger delete();
|
||||
}
|
||||
}
|
||||
if ( isDefined( unitrigger_stub.in_zone ) )
|
||||
{
|
||||
arrayremovevalue( level.zones[ unitrigger_stub.in_zone ].unitrigger_stubs, unitrigger_stub );
|
||||
unitrigger_stub.in_zone = undefined;
|
||||
}
|
||||
arrayremovevalue( level._unitriggers.trigger_stubs, unitrigger_stub );
|
||||
arrayremovevalue( level._unitriggers.dynamic_stubs, unitrigger_stub );
|
||||
}
|
||||
|
||||
delay_delete_contact_ent()
|
||||
{
|
||||
self.last_used_time = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 1;
|
||||
if ( ( getTime() - self.last_used_time ) > 1000 )
|
||||
{
|
||||
self delete();
|
||||
level._unitriggers.contact_ent = undefined;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
register_static_unitrigger( unitrigger_stub, trigger_func, recalculate_zone )
|
||||
{
|
||||
if ( level.zones.size == 0 )
|
||||
{
|
||||
unitrigger_stub.trigger_func = trigger_func;
|
||||
level._unitriggers._deferredinitlist[ level._unitriggers._deferredinitlist.size ] = unitrigger_stub;
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( level._unitriggers.contact_ent ) )
|
||||
{
|
||||
level._unitriggers.contact_ent = spawn( "script_origin", ( 0, 0, 1 ) );
|
||||
level._unitriggers.contact_ent thread delay_delete_contact_ent();
|
||||
}
|
||||
register_unitrigger_internal( unitrigger_stub, trigger_func );
|
||||
while ( !isDefined( level._no_static_unitriggers ) )
|
||||
{
|
||||
level._unitriggers.contact_ent.last_used_time = getTime();
|
||||
level._unitriggers.contact_ent.origin = unitrigger_stub.origin;
|
||||
if ( isDefined( unitrigger_stub.in_zone ) && !isDefined( recalculate_zone ) )
|
||||
{
|
||||
level.zones[ unitrigger_stub.in_zone ].unitrigger_stubs[ level.zones[ unitrigger_stub.in_zone ].unitrigger_stubs.size ] = unitrigger_stub;
|
||||
return;
|
||||
}
|
||||
keys = getarraykeys( level.zones );
|
||||
i = 0;
|
||||
while ( i < keys.size )
|
||||
{
|
||||
if ( level._unitriggers.contact_ent maps/mp/zombies/_zm_zonemgr::entity_in_zone( keys[ i ], 1 ) )
|
||||
{
|
||||
if ( !isDefined( level.zones[ keys[ i ] ].unitrigger_stubs ) )
|
||||
{
|
||||
level.zones[ keys[ i ] ].unitrigger_stubs = [];
|
||||
}
|
||||
level.zones[ keys[ i ] ].unitrigger_stubs[ level.zones[ keys[ i ] ].unitrigger_stubs.size ] = unitrigger_stub;
|
||||
unitrigger_stub.in_zone = keys[ i ];
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
level._unitriggers.dynamic_stubs[ level._unitriggers.dynamic_stubs.size ] = unitrigger_stub;
|
||||
unitrigger_stub.registered = 1;
|
||||
}
|
||||
|
||||
reregister_unitrigger_as_dynamic( unitrigger_stub )
|
||||
{
|
||||
unregister_unitrigger_internal( unitrigger_stub );
|
||||
register_unitrigger( unitrigger_stub, unitrigger_stub.trigger_func );
|
||||
}
|
||||
|
||||
debug_unitriggers()
|
||||
{
|
||||
/#
|
||||
while ( 1 )
|
||||
{
|
||||
while ( getDvarInt( #"D256F24B" ) > 0 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level._unitriggers.trigger_stubs.size )
|
||||
{
|
||||
triggerstub = level._unitriggers.trigger_stubs[ i ];
|
||||
color = vectorScale( ( 0, 0, 1 ), 0,75 );
|
||||
if ( !isDefined( triggerstub.in_zone ) )
|
||||
{
|
||||
color = vectorScale( ( 0, 0, 1 ), 0,65 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.zones[ triggerstub.in_zone ].is_active )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
if ( isDefined( triggerstub.trigger ) || isDefined( triggerstub.playertrigger ) && triggerstub.playertrigger.size > 0 )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
if ( isDefined( triggerstub.playertrigger ) && triggerstub.playertrigger.size > 0 )
|
||||
{
|
||||
print3d( triggerstub.origin, triggerstub.playertrigger.size, color, 1, 1, 1 );
|
||||
}
|
||||
}
|
||||
origin = triggerstub unitrigger_origin();
|
||||
switch( triggerstub.script_unitrigger_type )
|
||||
{
|
||||
case "unitrigger_radius":
|
||||
case "unitrigger_radius_use":
|
||||
if ( triggerstub.radius )
|
||||
{
|
||||
circle( origin, triggerstub.radius, color, 0, 0, 1 );
|
||||
}
|
||||
if ( triggerstub.script_height )
|
||||
{
|
||||
line( origin, origin + ( 0, 0, triggerstub.script_height ), color, 0, 1 );
|
||||
}
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case "unitrigger_box":
|
||||
case "unitrigger_box_use":
|
||||
vec = ( triggerstub.script_width / 2, triggerstub.script_length / 2, triggerstub.script_height / 2 );
|
||||
box( origin, vec * -1, vec, triggerstub.angles[ 1 ], color, 1, 0, 1 );
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
cleanup_trigger( trigger, player )
|
||||
{
|
||||
trigger notify( "kill_trigger" );
|
||||
if ( isDefined( trigger.stub.trigger_per_player ) && trigger.stub.trigger_per_player )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger.stub.trigger = undefined;
|
||||
}
|
||||
trigger delete();
|
||||
}
|
||||
|
||||
assess_and_apply_visibility( trigger, stub, player, default_keep )
|
||||
{
|
||||
if ( !isDefined( trigger ) || !isDefined( stub ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
keep_thread = default_keep;
|
||||
if ( !isDefined( stub.prompt_and_visibility_func ) || trigger [[ stub.prompt_and_visibility_func ]]( player ) )
|
||||
{
|
||||
keep_thread = 1;
|
||||
if ( isDefined( trigger.thread_running ) && !trigger.thread_running )
|
||||
{
|
||||
trigger thread trigger_thread( trigger.stub.trigger_func );
|
||||
}
|
||||
trigger.thread_running = 1;
|
||||
if ( isDefined( trigger.reassess_time ) && trigger.reassess_time <= 0 )
|
||||
{
|
||||
trigger.reassess_time = undefined;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( trigger.thread_running ) && trigger.thread_running )
|
||||
{
|
||||
keep_thread = 0;
|
||||
}
|
||||
trigger.thread_running = 0;
|
||||
if ( isDefined( stub.inactive_reasses_time ) )
|
||||
{
|
||||
trigger.reassess_time = stub.inactive_reasses_time;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger.reassess_time = 1;
|
||||
}
|
||||
}
|
||||
return keep_thread;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
level thread debug_unitriggers();
|
||||
if ( level._unitriggers._deferredinitlist.size )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level._unitriggers._deferredinitlist.size )
|
||||
{
|
||||
register_static_unitrigger( level._unitriggers._deferredinitlist[ i ], level._unitriggers._deferredinitlist[ i ].trigger_func );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level._unitriggers._deferredinitlist.size )
|
||||
{
|
||||
i++;
|
||||
}
|
||||
level._unitriggers._deferredinitlist = undefined;
|
||||
}
|
||||
valid_range = level._unitriggers.largest_radius + 15;
|
||||
valid_range_sq = valid_range * valid_range;
|
||||
while ( !isDefined( level.active_zone_names ) )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
waited = 0;
|
||||
active_zone_names = level.active_zone_names;
|
||||
candidate_list = [];
|
||||
j = 0;
|
||||
while ( j < active_zone_names.size )
|
||||
{
|
||||
if ( isDefined( level.zones[ active_zone_names[ j ] ].unitrigger_stubs ) )
|
||||
{
|
||||
candidate_list = arraycombine( candidate_list, level.zones[ active_zone_names[ j ] ].unitrigger_stubs, 1, 0 );
|
||||
}
|
||||
j++;
|
||||
}
|
||||
candidate_list = arraycombine( candidate_list, level._unitriggers.dynamic_stubs, 1, 0 );
|
||||
players = getplayers();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else player_origin = player.origin + vectorScale( ( 0, 0, 1 ), 35 );
|
||||
trigger = level._unitriggers.trigger_pool[ player getentitynumber() ];
|
||||
closest = [];
|
||||
if ( isDefined( trigger ) )
|
||||
{
|
||||
dst = valid_range_sq;
|
||||
origin = trigger unitrigger_origin();
|
||||
dst = trigger.stub.test_radius_sq;
|
||||
time_to_ressess = 0;
|
||||
if ( distance2dsquared( player_origin, origin ) < dst )
|
||||
{
|
||||
if ( isDefined( trigger.reassess_time ) )
|
||||
{
|
||||
trigger.reassess_time -= 0,05;
|
||||
if ( trigger.reassess_time > 0 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else time_to_ressess = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else closest = get_closest_unitriggers( player_origin, candidate_list, valid_range );
|
||||
if ( isDefined( trigger ) && time_to_ressess || closest.size < 2 && isDefined( trigger.thread_running ) && trigger.thread_running )
|
||||
{
|
||||
if ( assess_and_apply_visibility( trigger, trigger.stub, player, 1 ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if ( isDefined( trigger ) )
|
||||
{
|
||||
cleanup_trigger( trigger, player );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
closest = get_closest_unitriggers( player_origin, candidate_list, valid_range );
|
||||
}
|
||||
index = 0;
|
||||
last_trigger = undefined;
|
||||
while ( index < closest.size )
|
||||
{
|
||||
while ( !is_player_valid( player ) && isDefined( closest[ index ].ignore_player_valid ) && !closest[ index ].ignore_player_valid )
|
||||
{
|
||||
index++;
|
||||
}
|
||||
while ( isDefined( closest[ index ].registered ) && !closest[ index ].registered )
|
||||
{
|
||||
index++;
|
||||
}
|
||||
if ( isDefined( last_trigger ) )
|
||||
{
|
||||
cleanup_trigger( last_trigger, player );
|
||||
last_trigger = undefined;
|
||||
}
|
||||
trigger = undefined;
|
||||
if ( isDefined( closest[ index ].trigger_per_player ) && closest[ index ].trigger_per_player )
|
||||
{
|
||||
if ( !isDefined( closest[ index ].playertrigger ) )
|
||||
{
|
||||
closest[ index ].playertrigger = [];
|
||||
}
|
||||
if ( !isDefined( closest[ index ].playertrigger[ player getentitynumber() ] ) )
|
||||
{
|
||||
trigger = build_trigger_from_unitrigger_stub( closest[ index ], player );
|
||||
level._unitriggers.trigger_pool[ player getentitynumber() ] = trigger;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( closest[ index ].trigger ) )
|
||||
{
|
||||
trigger = build_trigger_from_unitrigger_stub( closest[ index ], player );
|
||||
level._unitriggers.trigger_pool[ player getentitynumber() ] = trigger;
|
||||
}
|
||||
}
|
||||
if ( isDefined( trigger ) )
|
||||
{
|
||||
trigger.parent_player = player;
|
||||
if ( assess_and_apply_visibility( trigger, closest[ index ], player, 0 ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
last_trigger = trigger;
|
||||
}
|
||||
index++;
|
||||
waited = 1;
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !waited )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
run_visibility_function_for_all_triggers()
|
||||
{
|
||||
if ( !isDefined( self.prompt_and_visibility_func ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.trigger_per_player ) && self.trigger_per_player )
|
||||
{
|
||||
if ( !isDefined( self.playertrigger ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = getplayers();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( isDefined( self.playertrigger[ players[ i ] getentitynumber() ] ) )
|
||||
{
|
||||
self.playertrigger[ players[ i ] getentitynumber() ] [[ self.prompt_and_visibility_func ]]( players[ i ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else if ( isDefined( self.trigger ) )
|
||||
{
|
||||
self.trigger [[ self.prompt_and_visibility_func ]]( getplayers()[ 0 ] );
|
||||
}
|
||||
}
|
||||
|
||||
build_trigger_from_unitrigger_stub( stub, player )
|
||||
{
|
||||
if ( isDefined( level._zm_build_trigger_from_unitrigger_stub_override ) )
|
||||
{
|
||||
if ( stub [[ level._zm_build_trigger_from_unitrigger_stub_override ]]( player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
radius = stub.radius;
|
||||
if ( !isDefined( radius ) )
|
||||
{
|
||||
radius = 64;
|
||||
}
|
||||
script_height = stub.script_height;
|
||||
if ( !isDefined( script_height ) )
|
||||
{
|
||||
script_height = 64;
|
||||
}
|
||||
script_width = stub.script_width;
|
||||
if ( !isDefined( script_width ) )
|
||||
{
|
||||
script_width = 64;
|
||||
}
|
||||
script_length = stub.script_length;
|
||||
if ( !isDefined( script_length ) )
|
||||
{
|
||||
script_length = 64;
|
||||
}
|
||||
trigger = undefined;
|
||||
origin = stub unitrigger_origin();
|
||||
switch( stub.script_unitrigger_type )
|
||||
{
|
||||
case "unitrigger_radius":
|
||||
trigger = spawn( "trigger_radius", origin, 0, radius, script_height );
|
||||
break;
|
||||
case "unitrigger_radius_use":
|
||||
trigger = spawn( "trigger_radius_use", origin, 0, radius, script_height );
|
||||
break;
|
||||
case "unitrigger_box":
|
||||
trigger = spawn( "trigger_box", origin, 0, script_width, script_length, script_height );
|
||||
break;
|
||||
case "unitrigger_box_use":
|
||||
trigger = spawn( "trigger_box_use", origin, 0, script_width, script_length, script_height );
|
||||
break;
|
||||
}
|
||||
if ( isDefined( trigger ) )
|
||||
{
|
||||
if ( isDefined( stub.angles ) )
|
||||
{
|
||||
trigger.angles = stub.angles;
|
||||
}
|
||||
if ( isDefined( stub.onspawnfunc ) )
|
||||
{
|
||||
stub [[ stub.onspawnfunc ]]( trigger );
|
||||
}
|
||||
if ( isDefined( stub.cursor_hint ) )
|
||||
{
|
||||
if ( stub.cursor_hint == "HINT_WEAPON" && isDefined( stub.cursor_hint_weapon ) )
|
||||
{
|
||||
trigger setcursorhint( stub.cursor_hint, stub.cursor_hint_weapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger setcursorhint( stub.cursor_hint );
|
||||
}
|
||||
}
|
||||
trigger triggerignoreteam();
|
||||
if ( isDefined( stub.require_look_at ) && stub.require_look_at )
|
||||
{
|
||||
trigger usetriggerrequirelookat();
|
||||
}
|
||||
if ( isDefined( stub.hint_string ) )
|
||||
{
|
||||
if ( isDefined( stub.hint_parm2 ) )
|
||||
{
|
||||
trigger sethintstring( stub.hint_string, stub.hint_parm1, stub.hint_parm2 );
|
||||
}
|
||||
else if ( isDefined( stub.hint_parm1 ) )
|
||||
{
|
||||
trigger sethintstring( stub.hint_string, stub.hint_parm1 );
|
||||
}
|
||||
else if ( isDefined( stub.cost ) )
|
||||
{
|
||||
trigger sethintstring( stub.hint_string, stub.cost );
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger sethintstring( stub.hint_string );
|
||||
}
|
||||
}
|
||||
trigger.stub = stub;
|
||||
}
|
||||
copy_zombie_keys_onto_trigger( trigger, stub );
|
||||
if ( isDefined( stub.trigger_per_player ) && stub.trigger_per_player )
|
||||
{
|
||||
if ( isDefined( trigger ) )
|
||||
{
|
||||
trigger setinvisibletoall();
|
||||
trigger setvisibletoplayer( player );
|
||||
}
|
||||
if ( !isDefined( stub.playertrigger ) )
|
||||
{
|
||||
stub.playertrigger = [];
|
||||
}
|
||||
stub.playertrigger[ player getentitynumber() ] = trigger;
|
||||
}
|
||||
else
|
||||
{
|
||||
stub.trigger = trigger;
|
||||
}
|
||||
trigger.thread_running = 0;
|
||||
return trigger;
|
||||
}
|
||||
|
||||
copy_zombie_keys_onto_trigger( trig, stub )
|
||||
{
|
||||
trig.script_noteworthy = stub.script_noteworthy;
|
||||
trig.targetname = stub.targetname;
|
||||
trig.target = stub.target;
|
||||
trig.zombie_weapon_upgrade = stub.zombie_weapon_upgrade;
|
||||
trig.clientfieldname = stub.clientfieldname;
|
||||
trig.usetime = stub.usetime;
|
||||
}
|
||||
|
||||
trigger_thread( trigger_func )
|
||||
{
|
||||
self endon( "kill_trigger" );
|
||||
if ( isDefined( trigger_func ) )
|
||||
{
|
||||
self [[ trigger_func ]]();
|
||||
}
|
||||
}
|
||||
|
||||
get_closest_unitrigger_index( org, array, dist )
|
||||
{
|
||||
if ( !isDefined( dist ) )
|
||||
{
|
||||
dist = 9999999;
|
||||
}
|
||||
distsq = dist * dist;
|
||||
if ( array.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
index = undefined;
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
origin = array[ i ] unitrigger_origin();
|
||||
radius_sq = array[ i ].test_radius_sq;
|
||||
newdistsq = distance2dsquared( origin, org );
|
||||
if ( newdistsq >= radius_sq )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( newdistsq >= distsq )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
distsq = newdistsq;
|
||||
index = i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
get_closest_unitriggers( org, array, dist )
|
||||
{
|
||||
triggers = [];
|
||||
if ( !isDefined( dist ) )
|
||||
{
|
||||
dist = 9999999;
|
||||
}
|
||||
distsq = dist * dist;
|
||||
if ( array.size < 1 )
|
||||
{
|
||||
return triggers;
|
||||
}
|
||||
index = undefined;
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
if ( !isDefined( array[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else origin = array[ i ] unitrigger_origin();
|
||||
radius_sq = array[ i ].test_radius_sq;
|
||||
newdistsq = distance2dsquared( origin, org );
|
||||
if ( newdistsq >= radius_sq )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( abs( origin[ 2 ] - org[ 2 ] ) > 42 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
array[ i ].dsquared = newdistsq;
|
||||
j = 0;
|
||||
while ( j < triggers.size && newdistsq > triggers[ j ].dsquared )
|
||||
{
|
||||
j++;
|
||||
}
|
||||
arrayinsert( triggers, array[ i ], j );
|
||||
if ( ( i % 10 ) == 9 )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return triggers;
|
||||
}
|
5861
patch_zm/maps/mp/zombies/_zm_utility.gsc
Normal file
5861
patch_zm/maps/mp/zombies/_zm_utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
577
patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc
Normal file
577
patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc
Normal file
@ -0,0 +1,577 @@
|
||||
#include maps/mp/zombies/_zm_clone;
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "zombie_cymbal_monkey" );
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !cymbal_monkey_exists() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/#
|
||||
level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey;
|
||||
#/
|
||||
if ( isDefined( level.legacy_cymbal_monkey ) && level.legacy_cymbal_monkey )
|
||||
{
|
||||
level.cymbal_monkey_model = "weapon_zombie_monkey_bomb";
|
||||
}
|
||||
else
|
||||
{
|
||||
level.cymbal_monkey_model = "t6_wpn_zmb_monkey_bomb_world";
|
||||
}
|
||||
level._effect[ "monkey_glow" ] = loadfx( "maps/zombie/fx_zombie_monkey_light" );
|
||||
level._effect[ "grenade_samantha_steal" ] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" );
|
||||
level.cymbal_monkeys = [];
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
||||
player_give_cymbal_monkey()
|
||||
{
|
||||
self giveweapon( "cymbal_monkey_zm" );
|
||||
self set_player_tactical_grenade( "cymbal_monkey_zm" );
|
||||
self thread player_handle_cymbal_monkey();
|
||||
}
|
||||
|
||||
player_handle_cymbal_monkey()
|
||||
{
|
||||
self notify( "starting_monkey_watch" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
attract_dist_diff = level.monkey_attract_dist_diff;
|
||||
if ( !isDefined( attract_dist_diff ) )
|
||||
{
|
||||
attract_dist_diff = 45;
|
||||
}
|
||||
num_attractors = level.num_monkey_attractors;
|
||||
if ( !isDefined( num_attractors ) )
|
||||
{
|
||||
num_attractors = 96;
|
||||
}
|
||||
max_attract_dist = level.monkey_attract_dist;
|
||||
if ( !isDefined( max_attract_dist ) )
|
||||
{
|
||||
max_attract_dist = 1536;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
grenade = get_thrown_monkey();
|
||||
self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
watch_for_dud( model, actor )
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "grenade_dud" );
|
||||
model.dud = 1;
|
||||
self playsound( "zmb_vox_monkey_scream" );
|
||||
self.monk_scream_vox = 1;
|
||||
wait 3;
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model delete();
|
||||
}
|
||||
if ( isDefined( actor ) )
|
||||
{
|
||||
actor delete();
|
||||
}
|
||||
if ( isDefined( self.damagearea ) )
|
||||
{
|
||||
self.damagearea delete();
|
||||
}
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
|
||||
watch_for_emp( model, actor )
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( !should_watch_for_emp() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "emp_detonate", origin, radius );
|
||||
if ( distancesquared( origin, self.origin ) < ( radius * radius ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self.stun_fx = 1;
|
||||
if ( isDefined( level._equipment_emp_destroy_fx ) )
|
||||
{
|
||||
playfx( level._equipment_emp_destroy_fx, self.origin + vectorScale( ( 0, 0, -1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) );
|
||||
}
|
||||
wait 0,15;
|
||||
self.attract_to_origin = 0;
|
||||
self deactivate_zombie_point_of_interest();
|
||||
model clearanim( %o_monkey_bomb, 0 );
|
||||
wait 1;
|
||||
self detonate();
|
||||
wait 1;
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model delete();
|
||||
}
|
||||
if ( isDefined( actor ) )
|
||||
{
|
||||
actor delete();
|
||||
}
|
||||
if ( isDefined( self.damagearea ) )
|
||||
{
|
||||
self.damagearea delete();
|
||||
}
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
|
||||
clone_player_angles( owner )
|
||||
{
|
||||
self endon( "death" );
|
||||
owner endon( "death" );
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
self.angles = owner.angles;
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
show_briefly( showtime )
|
||||
{
|
||||
self endon( "show_owner" );
|
||||
if ( isDefined( self.show_for_time ) )
|
||||
{
|
||||
self.show_for_time = showtime;
|
||||
return;
|
||||
}
|
||||
self.show_for_time = showtime;
|
||||
self setvisibletoall();
|
||||
while ( self.show_for_time > 0 )
|
||||
{
|
||||
self.show_for_time -= 0,05;
|
||||
wait 0,05;
|
||||
}
|
||||
self setvisibletoallexceptteam( level.zombie_team );
|
||||
self.show_for_time = undefined;
|
||||
}
|
||||
|
||||
show_owner_on_attack( owner )
|
||||
{
|
||||
owner endon( "hide_owner" );
|
||||
owner endon( "show_owner" );
|
||||
self endon( "explode" );
|
||||
self endon( "death" );
|
||||
self endon( "grenade_dud" );
|
||||
owner.show_for_time = undefined;
|
||||
for ( ;; )
|
||||
{
|
||||
owner waittill( "weapon_fired" );
|
||||
owner thread show_briefly( 0,5 );
|
||||
}
|
||||
}
|
||||
|
||||
hide_owner( owner )
|
||||
{
|
||||
owner notify( "hide_owner" );
|
||||
owner endon( "hide_owner" );
|
||||
owner setperk( "specialty_immunemms" );
|
||||
owner.no_burning_sfx = 1;
|
||||
owner notify( "stop_flame_sounds" );
|
||||
owner setvisibletoallexceptteam( level.zombie_team );
|
||||
owner.hide_owner = 1;
|
||||
if ( isDefined( level._effect[ "human_disappears" ] ) )
|
||||
{
|
||||
playfx( level._effect[ "human_disappears" ], owner.origin );
|
||||
}
|
||||
self thread show_owner_on_attack( owner );
|
||||
evt = self waittill_any_return( "explode", "death", "grenade_dud" );
|
||||
/#
|
||||
println( "ZMCLONE: Player visible again because of " + evt );
|
||||
#/
|
||||
owner notify( "show_owner" );
|
||||
owner unsetperk( "specialty_immunemms" );
|
||||
if ( isDefined( level._effect[ "human_disappears" ] ) )
|
||||
{
|
||||
playfx( level._effect[ "human_disappears" ], owner.origin );
|
||||
}
|
||||
owner.no_burning_sfx = undefined;
|
||||
owner setvisibletoall();
|
||||
owner.hide_owner = undefined;
|
||||
owner show();
|
||||
}
|
||||
|
||||
proximity_detonate( owner )
|
||||
{
|
||||
wait 1,5;
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
detonateradius = 96;
|
||||
explosionradius = detonateradius * 2;
|
||||
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 1,5 );
|
||||
damagearea setexcludeteamfortrigger( owner.team );
|
||||
damagearea enablelinkto();
|
||||
damagearea linkto( self );
|
||||
self.damagearea = damagearea;
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
damagearea waittill( "trigger", ent );
|
||||
if ( isDefined( owner ) && ent == owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( ent.team ) && ent.team == owner.team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
self playsound( "wpn_claymore_alert" );
|
||||
dist = distance( self.origin, ent.origin );
|
||||
radiusdamage( self.origin + vectorScale( ( 0, 0, -1 ), 12 ), explosionradius, 1, 1, owner, "MOD_GRENADE_SPLASH", "cymbal_monkey_zm" );
|
||||
if ( isDefined( owner ) )
|
||||
{
|
||||
self detonate( owner );
|
||||
}
|
||||
else
|
||||
{
|
||||
self detonate( undefined );
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ( isDefined( damagearea ) )
|
||||
{
|
||||
damagearea delete();
|
||||
}
|
||||
}
|
||||
|
||||
player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
if ( isDefined( grenade ) )
|
||||
{
|
||||
grenade endon( "death" );
|
||||
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
if ( isDefined( grenade.damagearea ) )
|
||||
{
|
||||
grenade.damagearea delete();
|
||||
}
|
||||
grenade delete();
|
||||
return;
|
||||
}
|
||||
grenade hide();
|
||||
model = spawn( "script_model", grenade.origin );
|
||||
model setmodel( level.cymbal_monkey_model );
|
||||
model useanimtree( -1 );
|
||||
model linkto( grenade );
|
||||
model.angles = grenade.angles;
|
||||
model thread monkey_cleanup( grenade );
|
||||
clone = undefined;
|
||||
if ( isDefined( level.cymbal_monkey_dual_view ) && level.cymbal_monkey_dual_view )
|
||||
{
|
||||
model setvisibletoallexceptteam( level.zombie_team );
|
||||
clone = maps/mp/zombies/_zm_clone::spawn_player_clone( self, vectorScale( ( 0, 0, -1 ), 999 ), level.cymbal_monkey_clone_weapon, undefined );
|
||||
model.simulacrum = clone;
|
||||
clone maps/mp/zombies/_zm_clone::clone_animate( "idle" );
|
||||
clone thread clone_player_angles( self );
|
||||
clone notsolid();
|
||||
clone ghost();
|
||||
}
|
||||
grenade thread watch_for_dud( model, clone );
|
||||
grenade thread watch_for_emp( model, clone );
|
||||
info = spawnstruct();
|
||||
info.sound_attractors = [];
|
||||
grenade thread monitor_zombie_groans( info );
|
||||
grenade waittill( "stationary" );
|
||||
if ( isDefined( level.grenade_planted ) )
|
||||
{
|
||||
self thread [[ level.grenade_planted ]]( grenade, model );
|
||||
}
|
||||
if ( isDefined( grenade ) )
|
||||
{
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model setanim( %o_monkey_bomb );
|
||||
if ( isDefined( grenade.backlinked ) && !grenade.backlinked )
|
||||
{
|
||||
model unlink();
|
||||
model.origin = grenade.origin;
|
||||
model.angles = grenade.angles;
|
||||
}
|
||||
}
|
||||
if ( isDefined( clone ) )
|
||||
{
|
||||
clone forceteleport( grenade.origin, grenade.angles );
|
||||
clone thread hide_owner( self );
|
||||
grenade thread proximity_detonate( self );
|
||||
clone show();
|
||||
clone setinvisibletoall();
|
||||
clone setvisibletoteam( level.zombie_team );
|
||||
}
|
||||
grenade resetmissiledetonationtime();
|
||||
playfxontag( level._effect[ "monkey_glow" ], model, "origin_animate_jnt" );
|
||||
valid_poi = check_point_in_enabled_zone( grenade.origin, undefined, undefined );
|
||||
if ( isDefined( level.check_valid_poi ) )
|
||||
{
|
||||
valid_poi = grenade [[ level.check_valid_poi ]]( valid_poi );
|
||||
}
|
||||
if ( valid_poi )
|
||||
{
|
||||
grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 );
|
||||
grenade.attract_to_origin = 1;
|
||||
grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff );
|
||||
grenade thread wait_for_attractor_positions_complete();
|
||||
grenade thread do_monkey_sound( model, info );
|
||||
level.cymbal_monkeys[ level.cymbal_monkeys.size ] = grenade;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenade.script_noteworthy = undefined;
|
||||
level thread grenade_stolen_by_sam( grenade, model, clone );
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenade.script_noteworthy = undefined;
|
||||
level thread grenade_stolen_by_sam( grenade, model, clone );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor )
|
||||
{
|
||||
if ( !isDefined( ent_model ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
direction = ent_model.origin;
|
||||
direction = ( direction[ 1 ], direction[ 0 ], 0 );
|
||||
if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 )
|
||||
{
|
||||
direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( direction[ 0 ] < 0 )
|
||||
{
|
||||
direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 );
|
||||
}
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( isalive( players[ i ] ) )
|
||||
{
|
||||
players[ i ] playlocalsound( level.zmb_laugh_alias );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
playfxontag( level._effect[ "grenade_samantha_steal" ], ent_model, "tag_origin" );
|
||||
ent_model movez( 60, 1, 0,25, 0,25 );
|
||||
ent_model vibrate( direction, 1,5, 2,5, 1 );
|
||||
ent_model waittill( "movedone" );
|
||||
if ( isDefined( self.damagearea ) )
|
||||
{
|
||||
self.damagearea delete();
|
||||
}
|
||||
ent_model delete();
|
||||
if ( isDefined( ent_actor ) )
|
||||
{
|
||||
ent_actor delete();
|
||||
}
|
||||
if ( isDefined( ent_grenade ) )
|
||||
{
|
||||
if ( isDefined( ent_grenade.damagearea ) )
|
||||
{
|
||||
ent_grenade.damagearea delete();
|
||||
}
|
||||
ent_grenade delete();
|
||||
}
|
||||
}
|
||||
|
||||
wait_for_attractor_positions_complete()
|
||||
{
|
||||
self waittill( "attractor_positions_generated" );
|
||||
self.attract_to_origin = 0;
|
||||
}
|
||||
|
||||
monkey_cleanup( parent )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !isDefined( parent ) )
|
||||
{
|
||||
if ( isDefined( self ) && isDefined( self.dud ) && self.dud )
|
||||
{
|
||||
wait 6;
|
||||
}
|
||||
if ( isDefined( self.simulacrum ) )
|
||||
{
|
||||
self.simulacrum delete();
|
||||
}
|
||||
self_delete();
|
||||
return;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
do_monkey_sound( model, info )
|
||||
{
|
||||
self.monk_scream_vox = 0;
|
||||
if ( isDefined( level.grenade_safe_to_bounce ) )
|
||||
{
|
||||
if ( !( [[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) )
|
||||
{
|
||||
self playsound( "zmb_vox_monkey_scream" );
|
||||
self.monk_scream_vox = 1;
|
||||
}
|
||||
}
|
||||
if ( !self.monk_scream_vox && level.music_override == 0 )
|
||||
{
|
||||
if ( isDefined( level.cymbal_monkey_dual_view ) && level.cymbal_monkey_dual_view )
|
||||
{
|
||||
self playsoundtoteam( "zmb_monkey_song", "allies" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self playsound( "zmb_monkey_song" );
|
||||
}
|
||||
}
|
||||
if ( !self.monk_scream_vox )
|
||||
{
|
||||
self thread play_delayed_explode_vox();
|
||||
}
|
||||
self waittill( "explode", position );
|
||||
level notify( "grenade_exploded" );
|
||||
monkey_index = -1;
|
||||
i = 0;
|
||||
while ( i < level.cymbal_monkeys.size )
|
||||
{
|
||||
if ( !isDefined( level.cymbal_monkeys[ i ] ) )
|
||||
{
|
||||
monkey_index = i;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( monkey_index >= 0 )
|
||||
{
|
||||
arrayremoveindex( level.cymbal_monkeys, monkey_index );
|
||||
}
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model clearanim( %o_monkey_bomb, 0,2 );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < info.sound_attractors.size )
|
||||
{
|
||||
if ( isDefined( info.sound_attractors[ i ] ) )
|
||||
{
|
||||
info.sound_attractors[ i ] notify( "monkey_blown_up" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
play_delayed_explode_vox()
|
||||
{
|
||||
wait 6,5;
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_monkey_explode" );
|
||||
}
|
||||
}
|
||||
|
||||
get_thrown_monkey()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_fire", grenade, weapname );
|
||||
if ( weapname == "cymbal_monkey_zm" )
|
||||
{
|
||||
grenade.use_grenade_special_long_bookmark = 1;
|
||||
grenade.grenade_multiattack_bookmark_count = 1;
|
||||
return grenade;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_zombie_groans( info )
|
||||
{
|
||||
self endon( "explode" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( !isDefined( self.attractor_array ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.attractor_array.size )
|
||||
{
|
||||
if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[ i ] ) )
|
||||
{
|
||||
if ( isDefined( self.origin ) && isDefined( self.attractor_array[ i ].origin ) )
|
||||
{
|
||||
if ( distancesquared( self.origin, self.attractor_array[ i ].origin ) < 250000 )
|
||||
{
|
||||
info.sound_attractors[ info.sound_attractors.size ] = self.attractor_array[ i ];
|
||||
self.attractor_array[ i ] thread play_zombie_groans();
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
play_zombie_groans()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "monkey_blown_up" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_zombie_groan" );
|
||||
wait randomfloatrange( 2, 3 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cymbal_monkey_exists()
|
||||
{
|
||||
return isDefined( level.zombie_weapons[ "cymbal_monkey_zm" ] );
|
||||
}
|
@ -5,29 +5,15 @@ patch_zm/maps/mp/gametypes_zm/_globalentities.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/_shellshock.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/zclassic.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_ai_basic.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_ai_faller.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_audio.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_audio_announcer.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_bot.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_clone.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_equip_hacker.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_equip_gasmask.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_ffotd.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_boards.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_box.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_doors.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_magicbox.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_net.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_perk_electric_cherry.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_perks.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_powerups.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_server_throttle.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_score.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_tombstone.gsc
|
||||
@ -41,8 +27,6 @@ patch_zm/maps/mp/zombies/_zm_timer.gsc
|
||||
```
|
||||
patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_chugabud.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_perks.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_powerups.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_spawner.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_weapons.gsc
|
||||
```
|
||||
@ -58,7 +42,46 @@ patch_zm/maps/mp/zombies/_load.gsc
|
||||
```
|
||||
### The following scripts are not tested yet, uploaded to setup a baseline:
|
||||
```
|
||||
patch_zm/maps/mp/zombies/_zm_blockers.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_buildables.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_devgui.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_game_module.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_jump_pad.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_laststand.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_mgturret.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_playerhealth.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_power.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_sidequests.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_stats.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_traps.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_turned.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_unitrigger.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_utility.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc
|
||||
```
|
||||
|
||||
### The following scripts have not been checked using the proper debugging methods:
|
||||
```
|
||||
patch_zm/maps/mp/zombies/_zm_ai_basic.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_ai_faller.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_clone.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_equip_hacker.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_equip_gasmask.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_ffotd.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_boards.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_box.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_doors.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc
|
||||
patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc
|
||||
```
|
||||
|
||||
### notes:
|
||||
```
|
||||
The shaders that _zm_timer.gsc relies on do not exist.
|
||||
|
Loading…
x
Reference in New Issue
Block a user