mirror of
https://github.com/JezuzLizard/Public-BO2-Mods.git
synced 2025-06-08 02:58:24 -05:00
initial commit
This commit is contained in:
parent
e4e90bfc4f
commit
80ffa1a3d7
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
level.clientid = 0;
|
||||||
|
level thread onplayerconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
onplayerconnect()
|
||||||
|
{
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
level waittill( "connecting", player );
|
||||||
|
player.clientid = level.clientid;
|
||||||
|
level.clientid++;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
setdvar( "g_ScoresColor_Spectator", ".25 .25 .25" );
|
||||||
|
setdvar( "g_ScoresColor_Free", ".76 .78 .10" );
|
||||||
|
setdvar( "g_teamColor_MyTeam", ".4 .7 .4" );
|
||||||
|
setdvar( "g_teamColor_EnemyTeam", "1 .315 0.35" );
|
||||||
|
setdvar( "g_teamColor_MyTeamAlt", ".35 1 1" );
|
||||||
|
setdvar( "g_teamColor_EnemyTeamAlt", "1 .5 0" );
|
||||||
|
setdvar( "g_teamColor_Squad", ".315 0.35 1" );
|
||||||
|
if ( level.createfx_enabled )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( sessionmodeiszombiesgame() )
|
||||||
|
{
|
||||||
|
setdvar( "g_TeamIcon_Axis", "faction_cia" );
|
||||||
|
setdvar( "g_TeamIcon_Allies", "faction_cdc" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setdvar( "g_TeamIcon_Axis", game[ "icons" ][ "axis" ] );
|
||||||
|
setdvar( "g_TeamIcon_Allies", game[ "icons" ][ "allies" ] );
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
#include common_scripts/utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
precacheshellshock( "frag_grenade_mp" );
|
||||||
|
precacheshellshock( "damage_mp" );
|
||||||
|
precacherumble( "artillery_rumble" );
|
||||||
|
precacherumble( "grenade_rumble" );
|
||||||
|
}
|
||||||
|
|
||||||
|
shellshockondamage( cause, damage )
|
||||||
|
{
|
||||||
|
if ( cause != "MOD_EXPLOSIVE" && cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" && cause == "MOD_PROJECTILE_SPLASH" )
|
||||||
|
{
|
||||||
|
time = 0;
|
||||||
|
if ( damage >= 90 )
|
||||||
|
{
|
||||||
|
time = 4;
|
||||||
|
}
|
||||||
|
else if ( damage >= 50 )
|
||||||
|
{
|
||||||
|
time = 3;
|
||||||
|
}
|
||||||
|
else if ( damage >= 25 )
|
||||||
|
{
|
||||||
|
time = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( damage > 10 )
|
||||||
|
{
|
||||||
|
time = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( time )
|
||||||
|
{
|
||||||
|
if ( self mayapplyscreeneffect() )
|
||||||
|
{
|
||||||
|
self shellshock( "frag_grenade_mp", 0.5 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
endondeath()
|
||||||
|
{
|
||||||
|
self waittill( "death" );
|
||||||
|
waittillframeend;
|
||||||
|
self notify( "end_explode" );
|
||||||
|
}
|
||||||
|
|
||||||
|
endontimer( timer )
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
wait timer;
|
||||||
|
self notify( "end_on_timer" );
|
||||||
|
}
|
||||||
|
|
||||||
|
rcbomb_earthquake( position )
|
||||||
|
{
|
||||||
|
playrumbleonposition( "grenade_rumble", position );
|
||||||
|
earthquake( 0.5, 0.5, self.origin, 512 );
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
|||||||
|
#include maps/mp/zombies/_zm_stats;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
#include maps/mp/gametypes_zm/_hud_util;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||||
|
#include maps/mp/zombies/_zm_stats;
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::main();
|
||||||
|
level.onprecachegametype = ::onprecachegametype;
|
||||||
|
level.onstartgametype = ::onstartgametype;
|
||||||
|
level._game_module_custom_spawn_init_func = ::custom_spawn_init_func;
|
||||||
|
level._game_module_stat_update_func = ::survival_classic_custom_stat_update;
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zclassic" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onprecachegametype()
|
||||||
|
{
|
||||||
|
level.playersuicideallowed = 1;
|
||||||
|
level.canplayersuicide = ::canplayersuicide;
|
||||||
|
level.suicide_weapon = "death_self_zm";
|
||||||
|
precacheitem( "death_self_zm" );
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zclassic" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onstartgametype()
|
||||||
|
{
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zclassic", ::zclassic_main );
|
||||||
|
}
|
||||||
|
|
6086
Fixed Zombies GSCs for compiling/patch_zm/maps/mp/zombies/_zm.gsc
Normal file
6086
Fixed Zombies GSCs for compiling/patch_zm/maps/mp/zombies/_zm.gsc
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,742 @@
|
|||||||
|
#include maps/mp/zombies/_zm_net;
|
||||||
|
#include maps/mp/zombies/_zm_stats;
|
||||||
|
#include maps/mp/zombies/_zm_score;
|
||||||
|
#include maps/mp/zombies/_zm;
|
||||||
|
#include maps/mp/zombies/_zm_powerups;
|
||||||
|
#include maps/mp/zombies/_zm_audio;
|
||||||
|
#include maps/mp/zombies/_zm_spawner;
|
||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
level.dogs_enabled = 1;
|
||||||
|
level.dog_rounds_enabled = 0;
|
||||||
|
level.dog_round_count = 1;
|
||||||
|
level.dog_spawners = [];
|
||||||
|
level.enemy_dog_spawns = [];
|
||||||
|
level.enemy_dog_locations = [];
|
||||||
|
flag_init( "dog_clips" );
|
||||||
|
precacherumble( "explosion_generic" );
|
||||||
|
precacheshellshock( "dog_bite" );
|
||||||
|
if ( getDvar( "zombie_dog_animset" ) == "" )
|
||||||
|
{
|
||||||
|
setdvar( "zombie_dog_animset", "zombie" );
|
||||||
|
}
|
||||||
|
if ( getDvar( "scr_dog_health_walk_multiplier" ) == "" )
|
||||||
|
{
|
||||||
|
setdvar( "scr_dog_health_walk_multiplier", "4.0" );
|
||||||
|
}
|
||||||
|
if ( getDvar( "scr_dog_run_distance" ) == "" )
|
||||||
|
{
|
||||||
|
setdvar( "scr_dog_run_distance", "500" );
|
||||||
|
}
|
||||||
|
level.melee_range_sav = getDvar( "ai_meleeRange" );
|
||||||
|
level.melee_width_sav = getDvar( "ai_meleeWidth" );
|
||||||
|
level.melee_height_sav = getDvar( "ai_meleeHeight" );
|
||||||
|
setdvar( "dog_MeleeDamage", "100" );
|
||||||
|
set_zombie_var( "dog_fire_trail_percent", 50 );
|
||||||
|
level._effect[ "lightning_dog_spawn" ] = loadfx( "maps/zombie/fx_zombie_dog_lightning_buildup" );
|
||||||
|
level._effect[ "dog_eye_glow" ] = loadfx( "maps/zombie/fx_zombie_dog_eyes" );
|
||||||
|
level._effect[ "dog_gib" ] = loadfx( "maps/zombie/fx_zombie_dog_explosion" );
|
||||||
|
level._effect[ "dog_trail_fire" ] = loadfx( "maps/zombie/fx_zombie_dog_fire_trail" );
|
||||||
|
level._effect[ "dog_trail_ash" ] = loadfx( "maps/zombie/fx_zombie_dog_ash_trail" );
|
||||||
|
dog_spawner_init();
|
||||||
|
level thread dog_clip_monitor();
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_dog_rounds()
|
||||||
|
{
|
||||||
|
level.dog_rounds_enabled = 1;
|
||||||
|
if ( !isDefined( level.dog_round_track_override ) )
|
||||||
|
{
|
||||||
|
level.dog_round_track_override = ::dog_round_tracker;
|
||||||
|
}
|
||||||
|
level thread [[ level.dog_round_track_override ]]();
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_spawner_init()
|
||||||
|
{
|
||||||
|
level.dog_spawners = getentarray( "zombie_dog_spawner", "script_noteworthy" );
|
||||||
|
later_dogs = getentarray( "later_round_dog_spawners", "script_noteworthy" );
|
||||||
|
level.dog_spawners = arraycombine( level.dog_spawners, later_dogs, 1, 0 );
|
||||||
|
if ( level.dog_spawners.size == 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while ( i < level.dog_spawners.size )
|
||||||
|
{
|
||||||
|
if ( maps/mp/zombies/_zm_spawner::is_spawner_targeted_by_blocker( level.dog_spawners[ i ] ) )
|
||||||
|
{
|
||||||
|
level.dog_spawners[ i ].is_enabled = 0;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
level.dog_spawners[ i ].is_enabled = 1;
|
||||||
|
level.dog_spawners[ i ].script_forcespawn = 1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
level.dog_health = 100;
|
||||||
|
array_thread( level.dog_spawners, ::add_spawn_function, ::dog_init );
|
||||||
|
level.enemy_dog_spawns = getentarray( "zombie_spawner_dog_init", "targetname" );
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_round_spawning()
|
||||||
|
{
|
||||||
|
level endon( "intermission" );
|
||||||
|
level.dog_targets = getplayers();
|
||||||
|
i = 0;
|
||||||
|
while ( i < level.dog_targets.size )
|
||||||
|
{
|
||||||
|
level.dog_targets[ i ].hunted_by = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if ( level.intermission )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
level.dog_intermission = 1;
|
||||||
|
level thread dog_round_aftermath();
|
||||||
|
players = get_players();
|
||||||
|
array_thread( players, ::play_dog_round );
|
||||||
|
wait 1;
|
||||||
|
playsoundatposition( "vox_zmba_event_dogstart_0", ( 0, 0, 0 ) );
|
||||||
|
wait 6;
|
||||||
|
if ( level.dog_round_count < 3 )
|
||||||
|
{
|
||||||
|
max = players.size * 6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
max = players.size * 8;
|
||||||
|
}
|
||||||
|
level.zombie_total = max;
|
||||||
|
dog_health_increase();
|
||||||
|
count = 0;
|
||||||
|
while ( count < max )
|
||||||
|
{
|
||||||
|
num_player_valid = get_number_of_valid_players();
|
||||||
|
while ( get_current_zombie_count() >= ( num_player_valid * 2 ) )
|
||||||
|
{
|
||||||
|
wait 2;
|
||||||
|
num_player_valid = get_number_of_valid_players();
|
||||||
|
}
|
||||||
|
players = get_players();
|
||||||
|
favorite_enemy = get_favorite_enemy();
|
||||||
|
if ( isDefined( level.dog_spawn_func ) )
|
||||||
|
{
|
||||||
|
spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy );
|
||||||
|
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||||
|
if ( isDefined( ai ) )
|
||||||
|
{
|
||||||
|
ai.favoriteenemy = favorite_enemy;
|
||||||
|
spawn_loc thread dog_spawn_fx( ai, spawn_loc );
|
||||||
|
level.zombie_total--;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy );
|
||||||
|
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||||
|
if ( isDefined( ai ) )
|
||||||
|
{
|
||||||
|
ai.favoriteenemy = favorite_enemy;
|
||||||
|
spawn_point thread dog_spawn_fx( ai, spawn_point );
|
||||||
|
level.zombie_total--;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
flag_set( "dog_clips" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
waiting_for_next_dog_spawn( count, max );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
waiting_for_next_dog_spawn( count, max )
|
||||||
|
{
|
||||||
|
default_wait = 1.5;
|
||||||
|
if ( level.dog_round_count == 1 )
|
||||||
|
{
|
||||||
|
default_wait = 3;
|
||||||
|
}
|
||||||
|
else if ( level.dog_round_count == 2 )
|
||||||
|
{
|
||||||
|
default_wait = 2.5;
|
||||||
|
}
|
||||||
|
else if ( level.dog_round_count == 3 )
|
||||||
|
{
|
||||||
|
default_wait = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
default_wait = 1.5;
|
||||||
|
}
|
||||||
|
default_wait -= count / max;
|
||||||
|
wait default_wait;
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_round_aftermath()
|
||||||
|
{
|
||||||
|
level waittill( "last_dog_down" );
|
||||||
|
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "dog_end" );
|
||||||
|
power_up_origin = level.last_dog_origin;
|
||||||
|
if ( isDefined( power_up_origin ) )
|
||||||
|
{
|
||||||
|
level thread maps/mp/zombies/_zm_powerups::specific_powerup_drop( "full_ammo", power_up_origin );
|
||||||
|
}
|
||||||
|
wait 2;
|
||||||
|
clientnotify( "dog_stop" );
|
||||||
|
wait 6;
|
||||||
|
level.dog_intermission = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_spawn_fx( ai, ent )
|
||||||
|
{
|
||||||
|
ai endon( "death" );
|
||||||
|
ai setfreecameralockonallowed( 0 );
|
||||||
|
playfx( level._effect[ "lightning_dog_spawn" ], ent.origin );
|
||||||
|
playsoundatposition( "zmb_hellhound_prespawn", ent.origin );
|
||||||
|
wait 1.5;
|
||||||
|
playsoundatposition( "zmb_hellhound_bolt", ent.origin );
|
||||||
|
earthquake( 0.5, 0.75, ent.origin, 1000 );
|
||||||
|
playrumbleonposition( "explosion_generic", ent.origin );
|
||||||
|
playsoundatposition( "zmb_hellhound_spawn", ent.origin );
|
||||||
|
angle = vectorToAngles( ai.favoriteenemy.origin - ent.origin );
|
||||||
|
angles = ( ai.angles[ 0 ], angle[ 1 ], ai.angles[ 2 ] );
|
||||||
|
ai forceteleport( ent.origin, angles );
|
||||||
|
ai zombie_setup_attack_properties_dog();
|
||||||
|
ai stop_magic_bullet_shield();
|
||||||
|
wait 0.1;
|
||||||
|
ai show();
|
||||||
|
ai setfreecameralockonallowed( 1 );
|
||||||
|
ai.ignoreme = 0;
|
||||||
|
ai notify( "visible" );
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_spawn_sumpf_logic( dog_array, favorite_enemy )
|
||||||
|
{
|
||||||
|
dog_array = array_randomize( dog_array );
|
||||||
|
i = 0;
|
||||||
|
while ( i < dog_array.size )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_array[ i ] )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( distancesquared( dog_array[ i ].origin, favorite_enemy.origin ) > 160000 && distancesquared( dog_array[ i ].origin, favorite_enemy.origin ) < 640000 )
|
||||||
|
{
|
||||||
|
if ( distancesquared( ( 0, 0, dog_array[ i ].origin[ 2 ] ), ( 0, 0, favorite_enemy.origin[ 2 ] ) ) > 10000 )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else level.old_dog_spawn = dog_array[ i ];
|
||||||
|
return dog_array[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return dog_array[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_spawn_factory_logic( dog_array, favorite_enemy )
|
||||||
|
{
|
||||||
|
dog_locs = array_randomize( level.enemy_dog_locations );
|
||||||
|
i = 0;
|
||||||
|
while ( i < dog_locs.size )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_locs[ i ] )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dist_squared = distancesquared( dog_locs[ i ].origin, favorite_enemy.origin );
|
||||||
|
if ( dist_squared > 160000 && dist_squared < 1000000 )
|
||||||
|
{
|
||||||
|
level.old_dog_spawn = dog_locs[ i ];
|
||||||
|
return dog_locs[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return dog_locs[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
get_favorite_enemy()
|
||||||
|
{
|
||||||
|
dog_targets = getplayers();
|
||||||
|
least_hunted = dog_targets[ 0 ];
|
||||||
|
i = 0;
|
||||||
|
while ( i < dog_targets.size )
|
||||||
|
{
|
||||||
|
if ( !isDefined( dog_targets[ i ].hunted_by ) )
|
||||||
|
{
|
||||||
|
dog_targets[ i ].hunted_by = 0;
|
||||||
|
}
|
||||||
|
if ( !is_player_valid( dog_targets[ i ] ) )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !is_player_valid( least_hunted ) )
|
||||||
|
{
|
||||||
|
least_hunted = dog_targets[ i ];
|
||||||
|
}
|
||||||
|
if ( dog_targets[ i ].hunted_by < least_hunted.hunted_by )
|
||||||
|
{
|
||||||
|
least_hunted = dog_targets[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
least_hunted.hunted_by += 1;
|
||||||
|
return least_hunted;
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_health_increase()
|
||||||
|
{
|
||||||
|
players = getplayers();
|
||||||
|
if ( level.dog_round_count == 1 )
|
||||||
|
{
|
||||||
|
level.dog_health = 400;
|
||||||
|
}
|
||||||
|
else if ( level.dog_round_count == 2 )
|
||||||
|
{
|
||||||
|
level.dog_health = 900;
|
||||||
|
}
|
||||||
|
else if ( level.dog_round_count == 3 )
|
||||||
|
{
|
||||||
|
level.dog_health = 1300;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( level.dog_round_count == 4 )
|
||||||
|
{
|
||||||
|
level.dog_health = 1600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( level.dog_health > 1600 )
|
||||||
|
{
|
||||||
|
level.dog_health = 1600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_round_tracker()
|
||||||
|
{
|
||||||
|
level.dog_round_count = 1;
|
||||||
|
level.next_dog_round = level.round_number + randomintrange( 4, 7 );
|
||||||
|
old_spawn_func = level.round_spawn_func;
|
||||||
|
old_wait_func = level.round_wait_func;
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
level waittill( "between_round_over" );
|
||||||
|
if ( level.round_number == level.next_dog_round )
|
||||||
|
{
|
||||||
|
level.music_round_override = 1;
|
||||||
|
old_spawn_func = level.round_spawn_func;
|
||||||
|
old_wait_func = level.round_wait_func;
|
||||||
|
dog_round_start();
|
||||||
|
level.round_spawn_func = ::dog_round_spawning;
|
||||||
|
level.next_dog_round = level.round_number + randomintrange( 4, 6 );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( flag( "dog_round" ) )
|
||||||
|
{
|
||||||
|
dog_round_stop();
|
||||||
|
level.round_spawn_func = old_spawn_func;
|
||||||
|
level.round_wait_func = old_wait_func;
|
||||||
|
level.music_round_override = 0;
|
||||||
|
level.dog_round_count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_round_start()
|
||||||
|
{
|
||||||
|
flag_set( "dog_round" );
|
||||||
|
flag_set( "dog_clips" );
|
||||||
|
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "dog_start" );
|
||||||
|
if ( !isDefined( level.doground_nomusic ) )
|
||||||
|
{
|
||||||
|
level.doground_nomusic = 0;
|
||||||
|
}
|
||||||
|
level.doground_nomusic = 1;
|
||||||
|
level notify( "dog_round_starting" );
|
||||||
|
clientnotify( "dog_start" );
|
||||||
|
if ( isDefined( level.dog_melee_range ) )
|
||||||
|
{
|
||||||
|
setdvar( "ai_meleeRange", level.dog_melee_range );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setdvar( "ai_meleeRange", 100 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_round_stop()
|
||||||
|
{
|
||||||
|
flag_clear( "dog_round" );
|
||||||
|
flag_clear( "dog_clips" );
|
||||||
|
if ( !isDefined( level.doground_nomusic ) )
|
||||||
|
{
|
||||||
|
level.doground_nomusic = 0;
|
||||||
|
}
|
||||||
|
level.doground_nomusic = 0;
|
||||||
|
level notify( "dog_round_ending" );
|
||||||
|
clientnotify( "dog_stop" );
|
||||||
|
setdvar( "ai_meleeRange", level.melee_range_sav );
|
||||||
|
setdvar( "ai_meleeWidth", level.melee_width_sav );
|
||||||
|
setdvar( "ai_meleeHeight", level.melee_height_sav );
|
||||||
|
}
|
||||||
|
|
||||||
|
play_dog_round()
|
||||||
|
{
|
||||||
|
self playlocalsound( "zmb_dog_round_start" );
|
||||||
|
variation_count = 5;
|
||||||
|
wait 4.5;
|
||||||
|
players = getplayers();
|
||||||
|
num = randomintrange( 0, players.size );
|
||||||
|
players[ num ] maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "dog_spawn" );
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_init()
|
||||||
|
{
|
||||||
|
self.targetname = "zombie_dog";
|
||||||
|
self.script_noteworthy = undefined;
|
||||||
|
self.animname = "zombie_dog";
|
||||||
|
self.ignoreall = 1;
|
||||||
|
self.ignoreme = 1;
|
||||||
|
self.allowdeath = 1;
|
||||||
|
self.allowpain = 0;
|
||||||
|
self.force_gib = 1;
|
||||||
|
self.is_zombie = 1;
|
||||||
|
self.has_legs = 1;
|
||||||
|
self.gibbed = 0;
|
||||||
|
self.head_gibbed = 0;
|
||||||
|
self.default_goalheight = 40;
|
||||||
|
self.ignore_inert = 1;
|
||||||
|
self.grenadeawareness = 0;
|
||||||
|
self.badplaceawareness = 0;
|
||||||
|
self.ignoresuppression = 1;
|
||||||
|
self.suppressionthreshold = 1;
|
||||||
|
self.nododgemove = 1;
|
||||||
|
self.dontshootwhilemoving = 1;
|
||||||
|
self.pathenemylookahead = 0;
|
||||||
|
self.badplaceawareness = 0;
|
||||||
|
self.chatinitialized = 0;
|
||||||
|
self.team = level.zombie_team;
|
||||||
|
health_multiplier = 1;
|
||||||
|
if ( getDvar( "scr_dog_health_walk_multiplier" ) != "" )
|
||||||
|
{
|
||||||
|
health_multiplier = getDvarFloat( "scr_dog_health_walk_multiplier" );
|
||||||
|
}
|
||||||
|
self.maxhealth = int( level.dog_health * health_multiplier );
|
||||||
|
self.health = int( level.dog_health * health_multiplier );
|
||||||
|
self.freezegun_damage = 0;
|
||||||
|
self.zombie_move_speed = "sprint";
|
||||||
|
self thread dog_run_think();
|
||||||
|
self thread dog_stalk_audio();
|
||||||
|
self thread maps/mp/zombies/_zm::round_spawn_failsafe();
|
||||||
|
self ghost();
|
||||||
|
self thread magic_bullet_shield();
|
||||||
|
self dog_fx_eye_glow();
|
||||||
|
self dog_fx_trail();
|
||||||
|
self thread dog_death();
|
||||||
|
level thread maps/mp/zombies/_zm_spawner::zombie_death_event( self );
|
||||||
|
self thread maps/mp/zombies/_zm_spawner::enemy_death_detection();
|
||||||
|
self.a.disablepain = 1;
|
||||||
|
self disable_react();
|
||||||
|
self clearenemy();
|
||||||
|
self cleargoalvolume();
|
||||||
|
self.flame_damage_time = 0;
|
||||||
|
self.meleedamage = 40;
|
||||||
|
self.thundergun_knockdown_func = ::dog_thundergun_knockdown;
|
||||||
|
self maps/mp/zombies/_zm_spawner::zombie_history( "zombie_dog_spawn_init -> Spawned = " + self.origin );
|
||||||
|
if ( isDefined( level.achievement_monitor_func ) )
|
||||||
|
{
|
||||||
|
self [[ level.achievement_monitor_func ]]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_fx_eye_glow()
|
||||||
|
{
|
||||||
|
self.fx_dog_eye = spawn( "script_model", self gettagorigin( "J_EyeBall_LE" ) );
|
||||||
|
self.fx_dog_eye.angles = self gettagangles( "J_EyeBall_LE" );
|
||||||
|
self.fx_dog_eye setmodel( "tag_origin" );
|
||||||
|
self.fx_dog_eye linkto( self, "J_EyeBall_LE" );
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_fx_trail()
|
||||||
|
{
|
||||||
|
if ( !is_mature() || randomint( 100 ) > level.zombie_vars[ "dog_fire_trail_percent" ] )
|
||||||
|
{
|
||||||
|
self.fx_dog_trail_type = level._effect[ "dog_trail_ash" ];
|
||||||
|
self.fx_dog_trail_sound = "zmb_hellhound_loop_breath";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.a.nodeath = 1;
|
||||||
|
self.fx_dog_trail_type = level._effect[ "dog_trail_fire" ];
|
||||||
|
self.fx_dog_trail_sound = "zmb_hellhound_loop_fire";
|
||||||
|
}
|
||||||
|
self.fx_dog_trail = spawn( "script_model", self gettagorigin( "tag_origin" ) );
|
||||||
|
self.fx_dog_trail.angles = self gettagangles( "tag_origin" );
|
||||||
|
self.fx_dog_trail setmodel( "tag_origin" );
|
||||||
|
self.fx_dog_trail linkto( self, "tag_origin" );
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_death()
|
||||||
|
{
|
||||||
|
self waittill( "death" );
|
||||||
|
if ( get_current_zombie_count() == 0 && level.zombie_total == 0 )
|
||||||
|
{
|
||||||
|
level.last_dog_origin = self.origin;
|
||||||
|
level notify( "last_dog_down" );
|
||||||
|
}
|
||||||
|
if ( isplayer( self.attacker ) )
|
||||||
|
{
|
||||||
|
event = "death";
|
||||||
|
if ( issubstr( self.damageweapon, "knife_ballistic_" ) )
|
||||||
|
{
|
||||||
|
event = "ballistic_knife_death";
|
||||||
|
}
|
||||||
|
self.attacker maps/mp/zombies/_zm_score::player_add_points( event, self.damagemod, self.damagelocation, 1 );
|
||||||
|
if ( randomintrange( 0, 100 ) >= 80 )
|
||||||
|
{
|
||||||
|
self.attacker maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "hellhound" );
|
||||||
|
}
|
||||||
|
self.attacker maps/mp/zombies/_zm_stats::increment_client_stat( "zdogs_killed" );
|
||||||
|
self.attacker maps/mp/zombies/_zm_stats::increment_player_stat( "zdogs_killed" );
|
||||||
|
}
|
||||||
|
if ( isDefined( self.attacker ) && isai( self.attacker ) )
|
||||||
|
{
|
||||||
|
self.attacker notify( "killed" );
|
||||||
|
}
|
||||||
|
self stoploopsound();
|
||||||
|
self.fx_dog_trail delete();
|
||||||
|
if ( isDefined( self.a.nodeath ) )
|
||||||
|
{
|
||||||
|
level thread dog_explode_fx( self.origin );
|
||||||
|
self delete();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self playsound( "zmb_hellhound_vocals_death" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_explode_fx( origin )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "dog_gib" ], origin );
|
||||||
|
playsoundatposition( "zmb_hellhound_explode", origin );
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_setup_attack_properties_dog()
|
||||||
|
{
|
||||||
|
self maps/mp/zombies/_zm_spawner::zombie_history( "zombie_setup_attack_properties()" );
|
||||||
|
self thread dog_behind_audio();
|
||||||
|
self.ignoreall = 0;
|
||||||
|
self.pathenemyfightdist = 64;
|
||||||
|
self.meleeattackdist = 64;
|
||||||
|
self.disablearrivals = 1;
|
||||||
|
self.disableexits = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_dog_sound_on_death()
|
||||||
|
{
|
||||||
|
self waittill( "death" );
|
||||||
|
self stopsounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_behind_audio()
|
||||||
|
{
|
||||||
|
self thread stop_dog_sound_on_death();
|
||||||
|
self endon( "death" );
|
||||||
|
self waittill_any( "dog_running", "dog_combat" );
|
||||||
|
self playsound( "zmb_hellhound_vocals_close" );
|
||||||
|
wait 3;
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
players = get_players();
|
||||||
|
i = 0;
|
||||||
|
while ( i < players.size )
|
||||||
|
{
|
||||||
|
vectorAngle = vectorToAngles( self.origin - players[ i ].origin );
|
||||||
|
dogangle = AbsAngleClamp180( vectorAngle[ 1 ] - players[ i ].angles[ 1 ] );
|
||||||
|
if ( isalive( players[ i ] ) && !isDefined( players[ i ].revivetrigger ) )
|
||||||
|
{
|
||||||
|
if ( Abs( dogangle ) > 90 && distance2d( self.origin, players[ i ].origin ) > 100 )
|
||||||
|
{
|
||||||
|
self playsound( "zmb_hellhound_vocals_close" );
|
||||||
|
wait 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
wait 0.75;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_clip_monitor()
|
||||||
|
{
|
||||||
|
clips_on = 0;
|
||||||
|
level.dog_clips = getentarray( "dog_clips", "targetname" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
while ( i < level.dog_clips.size )
|
||||||
|
{
|
||||||
|
level.dog_clips[ i ] trigger_off();
|
||||||
|
level.dog_clips[ i ] connectpaths();
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
flag_wait( "dog_clips" );
|
||||||
|
if ( isDefined( level.no_dog_clip ) && level.no_dog_clip == 1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while ( i < level.dog_clips.size )
|
||||||
|
{
|
||||||
|
level.dog_clips[ i ] trigger_on();
|
||||||
|
level.dog_clips[ i ] disconnectpaths();
|
||||||
|
wait_network_frame();
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
dog_is_alive = 1;
|
||||||
|
while ( dog_is_alive || flag( "dog_round" ) )
|
||||||
|
{
|
||||||
|
dog_is_alive = 0;
|
||||||
|
dogs = getentarray( "zombie_dog", "targetname" );
|
||||||
|
i = 0;
|
||||||
|
while ( i < dogs.size )
|
||||||
|
{
|
||||||
|
if ( isalive( dogs[ i ] ) )
|
||||||
|
{
|
||||||
|
dog_is_alive = 1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
wait 1;
|
||||||
|
}
|
||||||
|
flag_clear( "dog_clips" );
|
||||||
|
wait 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
special_dog_spawn( spawners, num_to_spawn )
|
||||||
|
{
|
||||||
|
dogs = getaispeciesarray( "all", "zombie_dog" );
|
||||||
|
if ( isDefined( dogs ) && dogs.size >= 9 )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( !isDefined( num_to_spawn ) )
|
||||||
|
{
|
||||||
|
num_to_spawn = 1;
|
||||||
|
}
|
||||||
|
spawn_point = undefined;
|
||||||
|
count = 0;
|
||||||
|
while ( count < num_to_spawn )
|
||||||
|
{
|
||||||
|
players = get_players();
|
||||||
|
favorite_enemy = get_favorite_enemy();
|
||||||
|
if ( isDefined( spawners ) )
|
||||||
|
{
|
||||||
|
spawn_point = spawners[ randomint( spawners.size ) ];
|
||||||
|
ai = spawn_zombie( spawn_point );
|
||||||
|
if ( isDefined( ai ) )
|
||||||
|
{
|
||||||
|
ai.favoriteenemy = favorite_enemy;
|
||||||
|
spawn_point thread dog_spawn_fx( ai );
|
||||||
|
count++;
|
||||||
|
flag_set( "dog_clips" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( isDefined( level.dog_spawn_func ) )
|
||||||
|
{
|
||||||
|
spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy );
|
||||||
|
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||||
|
if ( isDefined( ai ) )
|
||||||
|
{
|
||||||
|
ai.favoriteenemy = favorite_enemy;
|
||||||
|
spawn_loc thread dog_spawn_fx( ai, spawn_loc );
|
||||||
|
count++;
|
||||||
|
flag_set( "dog_clips" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy );
|
||||||
|
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||||
|
if ( isDefined( ai ) )
|
||||||
|
{
|
||||||
|
ai.favoriteenemy = favorite_enemy;
|
||||||
|
spawn_point thread dog_spawn_fx( ai, spawn_point );
|
||||||
|
count++;
|
||||||
|
flag_set( "dog_clips" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
waiting_for_next_dog_spawn( count, num_to_spawn );
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_run_think()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self waittill( "visible" );
|
||||||
|
if ( self.health > level.dog_health )
|
||||||
|
{
|
||||||
|
self.maxhealth = level.dog_health;
|
||||||
|
self.health = level.dog_health;
|
||||||
|
}
|
||||||
|
maps/mp/zombies/_zm_net::network_safe_play_fx_on_tag( "dog_fx", 2, self.fx_dog_trail_type, self.fx_dog_trail, "tag_origin" );
|
||||||
|
self playloopsound( self.fx_dog_trail_sound );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
if ( !is_player_valid( self.favoriteenemy ) )
|
||||||
|
{
|
||||||
|
self.favoriteenemy = get_favorite_enemy();
|
||||||
|
}
|
||||||
|
wait 0.2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_stalk_audio()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "dog_running" );
|
||||||
|
self endon( "dog_combat" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self playsound( "zmb_hellhound_vocals_amb" );
|
||||||
|
wait randomfloatrange( 3, 6 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dog_thundergun_knockdown( player, gib )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
damage = int( self.maxhealth * 0.5 );
|
||||||
|
self dodamage( damage, player.origin, player );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
/#
|
||||||
|
println( "ZM >> Zombiemode Server Scripts Init (_zm_bot.gsc)" );
|
||||||
|
#/
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,400 @@
|
|||||||
|
#include maps/mp/zombies/_zm_ai_basic;
|
||||||
|
#include maps/mp/animscripts/shared;
|
||||||
|
#include maps/mp/zombies/_zm_score;
|
||||||
|
#include maps/mp/zombies/_zm_perks;
|
||||||
|
#include maps/mp/zombies/_zm_net;
|
||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
|
||||||
|
enable_electric_cherry_perk_for_level()
|
||||||
|
{
|
||||||
|
register_perk_basic_info( "specialty_grenadepulldeath", "electric_cherry", 2000, &"ZM_PRISON_PERK_CHERRY", "zombie_perk_bottle_cherry" );
|
||||||
|
register_perk_precache_func( "specialty_grenadepulldeath", ::electic_cherry_precache );
|
||||||
|
register_perk_clientfields( "specialty_grenadepulldeath", ::electric_cherry_register_clientfield, ::electric_cherry_set_clientfield );
|
||||||
|
register_perk_threads( "specialty_grenadepulldeath", ::electric_cherry_reload_attack, ::electric_cherry_perk_lost );
|
||||||
|
register_perk_machine( "specialty_grenadepulldeath", ::electric_cherry_perk_machine_setup, ::electric_cherry_perk_machine_think );
|
||||||
|
register_perk_host_migration_func( "specialty_grenadepulldeath", ::electric_cherry_host_migration_func );
|
||||||
|
if ( isDefined( level.custom_electric_cherry_perk_threads ) && level.custom_electric_cherry_perk_threads )
|
||||||
|
{
|
||||||
|
level thread [[ level.custom_electric_cherry_perk_threads ]]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init_electric_cherry()
|
||||||
|
{
|
||||||
|
level.custom_laststand_func = ::electric_cherry_laststand;
|
||||||
|
set_zombie_var( "tesla_head_gib_chance", 50 );
|
||||||
|
registerclientfield( "allplayers", "electric_cherry_reload_fx", 9000, 2, "int" );
|
||||||
|
}
|
||||||
|
|
||||||
|
electic_cherry_precache()
|
||||||
|
{
|
||||||
|
precacheitem( "zombie_perk_bottle_cherry" );
|
||||||
|
precacheshader( "specialty_fastreload_zombies" );
|
||||||
|
precachemodel( "p6_zm_vending_electric_cherry_off" );
|
||||||
|
precachemodel( "p6_zm_vending_electric_cherry_on" );
|
||||||
|
precachestring( &"ZM_PRISON_PERK_CHERRY" );
|
||||||
|
level._effect[ "electriccherry" ] = loadfx( "misc/fx_zombie_cola_on" );
|
||||||
|
level._effect[ "electric_cherry_explode" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_down" );
|
||||||
|
level._effect[ "electric_cherry_reload_small" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_sm" );
|
||||||
|
level._effect[ "electric_cherry_reload_medium" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_player" );
|
||||||
|
level._effect[ "electric_cherry_reload_large" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_lg" );
|
||||||
|
level._effect[ "tesla_shock" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock" );
|
||||||
|
level._effect[ "tesla_shock_secondary" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" );
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_register_clientfield()
|
||||||
|
{
|
||||||
|
registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" );
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_set_clientfield( state )
|
||||||
|
{
|
||||||
|
self setclientfieldtoplayer( "perk_electric_cherry", state );
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision )
|
||||||
|
{
|
||||||
|
use_trigger.script_sound = "mus_perks_cherry_jingle";
|
||||||
|
use_trigger.script_string = "electric_cherry_perk";
|
||||||
|
use_trigger.script_label = "mus_perks_cherry_sting";
|
||||||
|
use_trigger.target = "vending_electriccherry";
|
||||||
|
perk_machine.script_string = "electriccherry_perk";
|
||||||
|
perk_machine.targetname = "vendingelectric_cherry";
|
||||||
|
if ( isDefined( bump_trigger ) )
|
||||||
|
{
|
||||||
|
bump_trigger.script_string = "electriccherry_perk";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_perk_machine_think()
|
||||||
|
{
|
||||||
|
init_electric_cherry();
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
machine = getentarray( "vendingelectric_cherry", "targetname" );
|
||||||
|
machine_triggers = getentarray( "vending_electriccherry", "target" );
|
||||||
|
i = 0;
|
||||||
|
while ( i < machine.size )
|
||||||
|
{
|
||||||
|
machine[ i ] setmodel( "p6_zm_vending_electric_cherry_off" );
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
level thread do_initial_power_off_callback( machine, "electriccherry" );
|
||||||
|
array_thread( machine_triggers, ::set_power_on, 0 );
|
||||||
|
level waittill( "electric_cherry_on" );
|
||||||
|
i = 0;
|
||||||
|
while ( i < machine.size )
|
||||||
|
{
|
||||||
|
machine[ i ] setmodel( "p6_zm_vending_electric_cherry_on" );
|
||||||
|
machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 );
|
||||||
|
machine[ i ] playsound( "zmb_perks_power_on" );
|
||||||
|
machine[ i ] thread perk_fx( "electriccherry" );
|
||||||
|
machine[ i ] thread play_loop_on_machine();
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
level notify( "specialty_grenadepulldeath_power_on" );
|
||||||
|
array_thread( machine_triggers, ::set_power_on, 1 );
|
||||||
|
level waittill( "electric_cherry_off" );
|
||||||
|
array_thread( machine, ::turn_perk_off );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_host_migration_func()
|
||||||
|
{
|
||||||
|
a_electric_cherry_perk_machines = getentarray( "vending_electriccherry", "targetname" );
|
||||||
|
_a130 = a_electric_cherry_perk_machines;
|
||||||
|
_k130 = getFirstArrayKey( _a130 );
|
||||||
|
while ( isDefined( _k130 ) )
|
||||||
|
{
|
||||||
|
perk_machine = _a130[ _k130 ];
|
||||||
|
if ( isDefined( perk_machine.model ) && perk_machine.model == "p6_zm_vending_electric_cherry_on" )
|
||||||
|
{
|
||||||
|
perk_machine perk_fx( undefined, 1 );
|
||||||
|
perk_machine thread perk_fx( "electriccherry" );
|
||||||
|
}
|
||||||
|
_k130 = getNextArrayKey( _a130, _k130 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_laststand()
|
||||||
|
{
|
||||||
|
visionsetlaststand( "zombie_last_stand", 1 );
|
||||||
|
if ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "electric_cherry_explode" ], self.origin );
|
||||||
|
self playsound( "zmb_cherry_explode" );
|
||||||
|
self notify( "electric_cherry_start" );
|
||||||
|
wait 0.05;
|
||||||
|
a_zombies = get_round_enemy_array();
|
||||||
|
a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, 500 );
|
||||||
|
i = 0;
|
||||||
|
while ( i < a_zombies.size )
|
||||||
|
{
|
||||||
|
if ( isalive( self ) )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( a_zombies[ i ].health <= 1000 )
|
||||||
|
{
|
||||||
|
a_zombies[ i ] thread electric_cherry_death_fx();
|
||||||
|
if ( isDefined( self.cherry_kills ) )
|
||||||
|
{
|
||||||
|
self.cherry_kills++;
|
||||||
|
}
|
||||||
|
self maps/mp/zombies/_zm_score::add_to_player_score( 40 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a_zombies[ i ] thread electric_cherry_stun();
|
||||||
|
a_zombies[ i ] thread electric_cherry_shock_fx();
|
||||||
|
}
|
||||||
|
wait 0.1;
|
||||||
|
a_zombies[ i ] dodamage( 1000, self.origin, self, self, "none" );
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
self notify( "electric_cherry_end" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_death_fx()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
tag = "J_SpineUpper";
|
||||||
|
fx = "tesla_shock";
|
||||||
|
if ( self.isdog )
|
||||||
|
{
|
||||||
|
tag = "J_Spine1";
|
||||||
|
}
|
||||||
|
self playsound( "zmb_elec_jib_zombie" );
|
||||||
|
network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[ fx ], self, tag );
|
||||||
|
if ( isDefined( self.tesla_head_gib_func ) && !self.head_gibbed )
|
||||||
|
{
|
||||||
|
[[ self.tesla_head_gib_func ]]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_shock_fx()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
tag = "J_SpineUpper";
|
||||||
|
fx = "tesla_shock_secondary";
|
||||||
|
if ( self.isdog )
|
||||||
|
{
|
||||||
|
tag = "J_Spine1";
|
||||||
|
}
|
||||||
|
self playsound( "zmb_elec_jib_zombie" );
|
||||||
|
network_safe_play_fx_on_tag( "tesla_shock_fx", 2, level._effect[ fx ], self, tag );
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_stun()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self notify( "stun_zombie" );
|
||||||
|
self endon( "stun_zombie" );
|
||||||
|
if ( self.health <= 0 )
|
||||||
|
{
|
||||||
|
/#
|
||||||
|
iprintln( "trying to stun a dead zombie" );
|
||||||
|
#/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( self.ai_state != "find_flesh" )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self.forcemovementscriptstate = 1;
|
||||||
|
self.ignoreall = 1;
|
||||||
|
i = 0;
|
||||||
|
while ( i < 2 )
|
||||||
|
{
|
||||||
|
self animscripted( self.origin, self.angles, "zm_afterlife_stun" );
|
||||||
|
self maps/mp/animscripts/shared::donotetracks( "stunned" );
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
self.forcemovementscriptstate = 0;
|
||||||
|
self.ignoreall = 0;
|
||||||
|
self setgoalpos( self.origin );
|
||||||
|
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_reload_attack()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "stop_electric_cherry_reload_attack" );
|
||||||
|
self.wait_on_reload = [];
|
||||||
|
self.consecutive_electric_cherry_attacks = 0;
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill( "reload_start" );
|
||||||
|
str_current_weapon = self getcurrentweapon();
|
||||||
|
while ( isinarray( self.wait_on_reload, str_current_weapon ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
self.wait_on_reload[ self.wait_on_reload.size ] = str_current_weapon;
|
||||||
|
self.consecutive_electric_cherry_attacks++;
|
||||||
|
n_clip_current = self getweaponammoclip( str_current_weapon );
|
||||||
|
n_clip_max = weaponclipsize( str_current_weapon );
|
||||||
|
n_fraction = n_clip_current / n_clip_max;
|
||||||
|
perk_radius = linear_map( n_fraction, 1, 0, 32, 128 );
|
||||||
|
perk_dmg = linear_map( n_fraction, 1, 0, 1, 1045 );
|
||||||
|
self thread check_for_reload_complete( str_current_weapon );
|
||||||
|
if ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
switch( self.consecutive_electric_cherry_attacks )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
n_zombie_limit = undefined;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
n_zombie_limit = 8;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
n_zombie_limit = 4;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
n_zombie_limit = 2;
|
||||||
|
break;
|
||||||
|
case default:
|
||||||
|
n_zombie_limit = 0;
|
||||||
|
}
|
||||||
|
self thread electric_cherry_cooldown_timer( str_current_weapon );
|
||||||
|
if ( isDefined( n_zombie_limit ) && n_zombie_limit == 0 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
self thread electric_cherry_reload_fx( n_fraction );
|
||||||
|
self notify( "electric_cherry_start" );
|
||||||
|
self playsound( "zmb_cherry_explode" );
|
||||||
|
a_zombies = get_round_enemy_array();
|
||||||
|
a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, perk_radius );
|
||||||
|
n_zombies_hit = 0;
|
||||||
|
i = 0;
|
||||||
|
while ( i < a_zombies.size )
|
||||||
|
{
|
||||||
|
if ( isalive( self ) )
|
||||||
|
{
|
||||||
|
if ( isDefined( n_zombie_limit ) )
|
||||||
|
{
|
||||||
|
if ( n_zombies_hit < n_zombie_limit )
|
||||||
|
{
|
||||||
|
n_zombies_hit++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( a_zombies[ i ].health <= perk_dmg )
|
||||||
|
{
|
||||||
|
a_zombies[ i ] thread electric_cherry_death_fx();
|
||||||
|
if ( isDefined( self.cherry_kills ) )
|
||||||
|
{
|
||||||
|
self.cherry_kills++;
|
||||||
|
}
|
||||||
|
self maps/mp/zombies/_zm_score::add_to_player_score( 40 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !isDefined( a_zombies[ i ].is_brutus ) )
|
||||||
|
{
|
||||||
|
a_zombies[ i ] thread electric_cherry_stun();
|
||||||
|
}
|
||||||
|
a_zombies[ i ] thread electric_cherry_shock_fx();
|
||||||
|
}
|
||||||
|
wait 0.1;
|
||||||
|
a_zombies[ i ] dodamage( perk_dmg, self.origin, self, self, "none" );
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
self notify( "electric_cherry_end" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_cooldown_timer( str_current_weapon )
|
||||||
|
{
|
||||||
|
self notify( "electric_cherry_cooldown_started" );
|
||||||
|
self endon( "electric_cherry_cooldown_started" );
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
n_reload_time = weaponreloadtime( str_current_weapon );
|
||||||
|
if ( self hasperk( "specialty_fastreload" ) )
|
||||||
|
{
|
||||||
|
n_reload_time *= getDvarFloat( "perk_weapReloadMultiplier" );
|
||||||
|
}
|
||||||
|
n_cooldown_time = n_reload_time + 3;
|
||||||
|
wait n_cooldown_time;
|
||||||
|
self.consecutive_electric_cherry_attacks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
check_for_reload_complete( weapon )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "player_lost_weapon_" + weapon );
|
||||||
|
self thread weapon_replaced_monitor( weapon );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill( "reload" );
|
||||||
|
str_current_weapon = self getcurrentweapon();
|
||||||
|
if ( str_current_weapon == weapon )
|
||||||
|
{
|
||||||
|
arrayremovevalue( self.wait_on_reload, weapon );
|
||||||
|
self notify( "weapon_reload_complete_" + weapon );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
weapon_replaced_monitor( weapon )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "weapon_reload_complete_" + weapon );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill( "weapon_change" );
|
||||||
|
primaryweapons = self getweaponslistprimaries();
|
||||||
|
if ( !isinarray( primaryweapons, weapon ) )
|
||||||
|
{
|
||||||
|
self notify( "player_lost_weapon_" + weapon );
|
||||||
|
arrayremovevalue( self.wait_on_reload, weapon );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_reload_fx( n_fraction )
|
||||||
|
{
|
||||||
|
if ( n_fraction >= 0.67 )
|
||||||
|
{
|
||||||
|
self setclientfield( "electric_cherry_reload_fx", 1 );
|
||||||
|
}
|
||||||
|
else if ( n_fraction >= 0.33 && n_fraction < 0.67 )
|
||||||
|
{
|
||||||
|
self setclientfield( "electric_cherry_reload_fx", 2 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self setclientfield( "electric_cherry_reload_fx", 3 );
|
||||||
|
}
|
||||||
|
wait 1;
|
||||||
|
self setclientfield( "electric_cherry_reload_fx", 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
electric_cherry_perk_lost()
|
||||||
|
{
|
||||||
|
self notify( "stop_electric_cherry_reload_attack" );
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,540 @@
|
|||||||
|
#include maps/mp/zombies/_zm_perks;
|
||||||
|
#include maps/mp/zombies/_zm_equipment;
|
||||||
|
#include maps/mp/zombies/_zm_weapons;
|
||||||
|
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
|
||||||
|
#include maps/mp/zombies/_zm_melee_weapon;
|
||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
onplayerconnect_callback( ::tombstone_player_init );
|
||||||
|
level.tombstone_laststand_func = ::tombstone_laststand;
|
||||||
|
level.tombstone_spawn_func = ::tombstone_spawn;
|
||||||
|
level thread tombstone_hostmigration();
|
||||||
|
if ( isDefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk )
|
||||||
|
{
|
||||||
|
add_custom_limited_weapon_check( ::is_weapon_available_in_tombstone );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_player_init()
|
||||||
|
{
|
||||||
|
while ( !isDefined( self.tombstone_index ) )
|
||||||
|
{
|
||||||
|
wait 0.1;
|
||||||
|
}
|
||||||
|
level.tombstones[ self.tombstone_index ] = spawnstruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_spawn()
|
||||||
|
{
|
||||||
|
dc = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
|
||||||
|
dc.angles = self.angles;
|
||||||
|
dc setmodel( "tag_origin" );
|
||||||
|
dc_icon = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
|
||||||
|
dc_icon.angles = self.angles;
|
||||||
|
dc_icon setmodel( "ch_tombstone1" );
|
||||||
|
dc_icon linkto( dc );
|
||||||
|
dc.icon = dc_icon;
|
||||||
|
dc.script_noteworthy = "player_tombstone_model";
|
||||||
|
dc.player = self;
|
||||||
|
self thread tombstone_clear();
|
||||||
|
dc thread tombstone_wobble();
|
||||||
|
dc thread tombstone_revived( self );
|
||||||
|
result = self waittill_any_return( "player_revived", "spawned_player", "disconnect" );
|
||||||
|
if ( result == "player_revived" || result == "disconnect" )
|
||||||
|
{
|
||||||
|
dc notify( "tombstone_timedout" );
|
||||||
|
dc_icon unlink();
|
||||||
|
dc_icon delete();
|
||||||
|
dc delete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dc thread tombstone_timeout();
|
||||||
|
dc thread tombstone_grab();
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_clear()
|
||||||
|
{
|
||||||
|
result = self waittill_any_return( "tombstone_timedout", "tombstone_grabbed" );
|
||||||
|
level.tombstones[ self.tombstone_index ] = spawnstruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_revived( player )
|
||||||
|
{
|
||||||
|
self endon( "tombstone_timedout" );
|
||||||
|
player endon( "disconnect" );
|
||||||
|
shown = 1;
|
||||||
|
while ( isDefined( self ) && isDefined( player ) )
|
||||||
|
{
|
||||||
|
if ( isDefined( player.revivetrigger ) && isDefined( player.revivetrigger.beingrevived ) && player.revivetrigger.beingrevived )
|
||||||
|
{
|
||||||
|
if ( shown )
|
||||||
|
{
|
||||||
|
shown = 0;
|
||||||
|
self.icon hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !shown )
|
||||||
|
{
|
||||||
|
shown = 1;
|
||||||
|
self.icon show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_laststand()
|
||||||
|
{
|
||||||
|
primaries = self getweaponslistprimaries();
|
||||||
|
currentweapon = self getcurrentweapon();
|
||||||
|
dc = level.tombstones[ self.tombstone_index ];
|
||||||
|
dc.player = self;
|
||||||
|
dc.weapon = [];
|
||||||
|
dc.current_weapon = -1;
|
||||||
|
_a134 = primaries;
|
||||||
|
index = getFirstArrayKey( _a134 );
|
||||||
|
while ( isDefined( index ) )
|
||||||
|
{
|
||||||
|
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 )
|
||||||
|
{
|
||||||
|
dc.hasriotshield = 1;
|
||||||
|
}
|
||||||
|
dc save_weapons_for_tombstone( self );
|
||||||
|
if ( self hasweapon( "claymore_zm" ) )
|
||||||
|
{
|
||||||
|
dc.hasclaymore = 1;
|
||||||
|
dc.claymoreclip = self getweaponammoclip( "claymore_zm" );
|
||||||
|
}
|
||||||
|
if ( self hasweapon( "emp_grenade_zm" ) )
|
||||||
|
{
|
||||||
|
dc.hasemp = 1;
|
||||||
|
dc.empclip = self getweaponammoclip( "emp_grenade_zm" );
|
||||||
|
}
|
||||||
|
dc.perk = tombstone_save_perks( self );
|
||||||
|
lethal_grenade = self get_player_lethal_grenade();
|
||||||
|
if ( self hasweapon( lethal_grenade ) )
|
||||||
|
{
|
||||||
|
dc.grenade = self getweaponammoclip( lethal_grenade );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dc.grenade = 0;
|
||||||
|
}
|
||||||
|
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
||||||
|
{
|
||||||
|
dc.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_save_perks( ent )
|
||||||
|
{
|
||||||
|
perk_array = [];
|
||||||
|
if ( ent hasperk( "specialty_armorvest" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_armorvest";
|
||||||
|
}
|
||||||
|
if ( ent hasperk( "specialty_deadshot" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_deadshot";
|
||||||
|
}
|
||||||
|
if ( ent hasperk( "specialty_fastreload" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_fastreload";
|
||||||
|
}
|
||||||
|
if ( ent hasperk( "specialty_flakjacket" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_flakjacket";
|
||||||
|
}
|
||||||
|
if ( ent hasperk( "specialty_longersprint" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_longersprint";
|
||||||
|
}
|
||||||
|
if ( ent hasperk( "specialty_quickrevive" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_quickrevive";
|
||||||
|
}
|
||||||
|
if ( ent hasperk( "specialty_rof" ) )
|
||||||
|
{
|
||||||
|
perk_array[ perk_array.size ] = "specialty_rof";
|
||||||
|
}
|
||||||
|
return perk_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_grab()
|
||||||
|
{
|
||||||
|
self endon( "tombstone_timedout" );
|
||||||
|
wait 1;
|
||||||
|
while ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
players = get_players();
|
||||||
|
i = 0;
|
||||||
|
while ( i < players.size )
|
||||||
|
{
|
||||||
|
if ( players[ i ].is_zombie )
|
||||||
|
{
|
||||||
|
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 ) )
|
||||||
|
{
|
||||||
|
trigger = _a258[ _k258 ];
|
||||||
|
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 )
|
||||||
|
{
|
||||||
|
dist = distance( players[ i ].origin, self.origin );
|
||||||
|
if ( dist < 64 )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "powerup_grabbed" ], self.origin );
|
||||||
|
playfx( level._effect[ "powerup_grabbed_wave" ], self.origin );
|
||||||
|
players[ i ] tombstone_give();
|
||||||
|
wait 0.1;
|
||||||
|
playsoundatposition( "zmb_tombstone_grab", self.origin );
|
||||||
|
self stoploopsound();
|
||||||
|
self.icon unlink();
|
||||||
|
self.icon delete();
|
||||||
|
self delete();
|
||||||
|
self notify( "tombstone_grabbed" );
|
||||||
|
players[ i ] clientnotify( "dc0" );
|
||||||
|
players[ i ] notify( "dance_on_my_grave" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
wait_network_frame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_give()
|
||||||
|
{
|
||||||
|
dc = level.tombstones[ self.tombstone_index ];
|
||||||
|
while ( !flag( "solo_game" ) )
|
||||||
|
{
|
||||||
|
primaries = self getweaponslistprimaries();
|
||||||
|
while ( dc.weapon.size > 1 || primaries.size > 1 )
|
||||||
|
{
|
||||||
|
_a310 = primaries;
|
||||||
|
_k310 = getFirstArrayKey( _a310 );
|
||||||
|
while ( isDefined( _k310 ) )
|
||||||
|
{
|
||||||
|
weapon = _a310[ _k310 ];
|
||||||
|
self takeweapon( weapon );
|
||||||
|
_k310 = getNextArrayKey( _a310, _k310 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while ( i < dc.weapon.size )
|
||||||
|
{
|
||||||
|
if ( !isDefined( dc.weapon[ i ] ) )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if ( dc.weapon[ i ] == "none" )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
weapon = dc.weapon[ i ];
|
||||||
|
stock = dc.stockcount[ i ];
|
||||||
|
if ( !self hasweapon( weapon ) )
|
||||||
|
{
|
||||||
|
self giveweapon( weapon, 0, self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) );
|
||||||
|
self setweaponammoclip( weapon, weaponclipsize( weapon ) );
|
||||||
|
self setweaponammostock( weapon, stock );
|
||||||
|
if ( i == dc.current_weapon )
|
||||||
|
{
|
||||||
|
self switchtoweapon( weapon );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isDefined( dc.hasriotshield ) && dc.hasriotshield )
|
||||||
|
{
|
||||||
|
self maps/mp/zombies/_zm_equipment::equipment_give( "riotshield_zm" );
|
||||||
|
if ( isDefined( self.player_shield_reset_health ) )
|
||||||
|
{
|
||||||
|
self [[ self.player_shield_reset_health ]]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dc restore_weapons_for_tombstone( self );
|
||||||
|
if ( isDefined( dc.hasclaymore ) && dc.hasclaymore && !self hasweapon( "claymore_zm" ) )
|
||||||
|
{
|
||||||
|
self giveweapon( "claymore_zm" );
|
||||||
|
self set_player_placeable_mine( "claymore_zm" );
|
||||||
|
self setactionslot( 4, "weapon", "claymore_zm" );
|
||||||
|
self setweaponammoclip( "claymore_zm", dc.claymoreclip );
|
||||||
|
}
|
||||||
|
if ( isDefined( dc.hasemp ) && dc.hasemp )
|
||||||
|
{
|
||||||
|
self giveweapon( "emp_grenade_zm" );
|
||||||
|
self setweaponammoclip( "emp_grenade_zm", dc.empclip );
|
||||||
|
}
|
||||||
|
while ( isDefined( dc.perk ) && dc.perk.size > 0 )
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
while ( i < dc.perk.size )
|
||||||
|
{
|
||||||
|
if ( self hasperk( dc.perk[ i ] ) )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else 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" ) )
|
||||||
|
{
|
||||||
|
curgrenadecount = 0;
|
||||||
|
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(), dc.grenade + curgrenadecount );
|
||||||
|
}
|
||||||
|
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() && !flag( "solo_game" ) )
|
||||||
|
{
|
||||||
|
if ( dc.zombie_cymbal_monkey_count )
|
||||||
|
{
|
||||||
|
self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey();
|
||||||
|
self setweaponammoclip( "cymbal_monkey_zm", dc.zombie_cymbal_monkey_count );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_wobble()
|
||||||
|
{
|
||||||
|
self endon( "tombstone_grabbed" );
|
||||||
|
self endon( "tombstone_timedout" );
|
||||||
|
if ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
wait 1;
|
||||||
|
playfxontag( level._effect[ "powerup_on" ], self, "tag_origin" );
|
||||||
|
self playsound( "zmb_tombstone_spawn" );
|
||||||
|
self playloopsound( "zmb_tombstone_looper" );
|
||||||
|
}
|
||||||
|
while ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
self rotateyaw( 360, 3 );
|
||||||
|
wait 2.9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_timeout()
|
||||||
|
{
|
||||||
|
self endon( "tombstone_grabbed" );
|
||||||
|
self thread playtombstonetimeraudio();
|
||||||
|
wait 48.5;
|
||||||
|
i = 0;
|
||||||
|
while ( i < 40 )
|
||||||
|
{
|
||||||
|
if ( i % 2 )
|
||||||
|
{
|
||||||
|
self.icon ghost();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.icon show();
|
||||||
|
}
|
||||||
|
if ( i < 15 )
|
||||||
|
{
|
||||||
|
wait 0.5;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if ( i < 25 )
|
||||||
|
{
|
||||||
|
wait 0.25;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wait 0.1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
self notify( "tombstone_timedout" );
|
||||||
|
self.icon unlink();
|
||||||
|
self.icon delete();
|
||||||
|
self delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
playtombstonetimeraudio()
|
||||||
|
{
|
||||||
|
self endon( "tombstone_grabbed" );
|
||||||
|
self endon( "tombstone_timedout" );
|
||||||
|
player = self.player;
|
||||||
|
self thread playtombstonetimerout( player );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
player playsoundtoplayer( "zmb_tombstone_timer_count", player );
|
||||||
|
wait 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
playtombstonetimerout( player )
|
||||||
|
{
|
||||||
|
self endon( "tombstone_grabbed" );
|
||||||
|
self waittill( "tombstone_timedout" );
|
||||||
|
player playsoundtoplayer( "zmb_tombstone_timer_out", player );
|
||||||
|
}
|
||||||
|
|
||||||
|
save_weapons_for_tombstone( player )
|
||||||
|
{
|
||||||
|
self.tombstone_melee_weapons = [];
|
||||||
|
i = 0;
|
||||||
|
while ( i < level._melee_weapons.size )
|
||||||
|
{
|
||||||
|
self save_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name );
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
save_weapon_for_tombstone( player, weapon_name )
|
||||||
|
{
|
||||||
|
if ( player hasweapon( weapon_name ) )
|
||||||
|
{
|
||||||
|
self.tombstone_melee_weapons[ weapon_name ] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
restore_weapons_for_tombstone( player )
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
while ( i < level._melee_weapons.size )
|
||||||
|
{
|
||||||
|
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 )
|
||||||
|
{
|
||||||
|
if ( isDefined( weapon_name ) || !isDefined( self.tombstone_melee_weapons ) && !isDefined( self.tombstone_melee_weapons[ weapon_name ] ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.tombstone_melee_weapons[ weapon_name ] ) && self.tombstone_melee_weapons[ weapon_name ] )
|
||||||
|
{
|
||||||
|
player giveweapon( weapon_name );
|
||||||
|
player change_melee_weapon( weapon_name, "none" );
|
||||||
|
self.tombstone_melee_weapons[ weapon_name ] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tombstone_hostmigration()
|
||||||
|
{
|
||||||
|
level endon( "end_game" );
|
||||||
|
level notify( "tombstone_hostmigration" );
|
||||||
|
level endon( "tombstone_hostmigration" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
level waittill( "host_migration_end" );
|
||||||
|
tombstones = getentarray( "player_tombstone_model", "script_noteworthy" );
|
||||||
|
_a580 = tombstones;
|
||||||
|
_k580 = getFirstArrayKey( _a580 );
|
||||||
|
while ( isDefined( _k580 ) )
|
||||||
|
{
|
||||||
|
model = _a580[ _k580 ];
|
||||||
|
playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" );
|
||||||
|
_k580 = getNextArrayKey( _a580, _k580 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_weapon_available_in_tombstone( weapon, player_to_check )
|
||||||
|
{
|
||||||
|
count = 0;
|
||||||
|
upgradedweapon = weapon;
|
||||||
|
if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) )
|
||||||
|
{
|
||||||
|
upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name;
|
||||||
|
}
|
||||||
|
tombstone_index = 0;
|
||||||
|
while ( tombstone_index < level.tombstones.size )
|
||||||
|
{
|
||||||
|
dc = level.tombstones[ tombstone_index ];
|
||||||
|
if ( !isDefined( dc.weapon ) )
|
||||||
|
{
|
||||||
|
tombstone_index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if ( isDefined( player_to_check ) && dc.player != player_to_check )
|
||||||
|
{
|
||||||
|
tombstone_index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
weapon_index = 0;
|
||||||
|
while ( weapon_index < dc.weapon.size )
|
||||||
|
{
|
||||||
|
if ( !isDefined( dc.weapon[ weapon_index ] ) )
|
||||||
|
{
|
||||||
|
weapon_index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tombstone_weapon = dc.weapon[ weapon_index ];
|
||||||
|
if ( tombstone_weapon == weapon || tombstone_weapon == upgradedweapon )
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
weapon_index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tombstone_index++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
25
Fixed Zombies GSCs for compiling/readme.md
Normal file
25
Fixed Zombies GSCs for compiling/readme.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
**The following gscs compile and run successfully with no known errors:**
|
||||||
|
patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc
|
||||||
|
patch_zm/maps/mp/zombies/_zm_tombstone.gsc
|
||||||
|
patch_zm/maps/mp/zombies/_zm_bot.gsc
|
||||||
|
patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc
|
||||||
|
patch_zm/maps/mp/gametypes_zm/_shellshock.gsc
|
||||||
|
|
||||||
|
zm_transit_patch/maps/mp/zm_transit_utility.gsc
|
||||||
|
|
||||||
|
**The following scripts compile and run successfully with no known errors but required minor changes to run**
|
||||||
|
patch_zm/maps/mp/gametypes_zm/zclassic.gsc
|
||||||
|
|
||||||
|
**The following scripts compile and run successfully with minor errors:**
|
||||||
|
zm_transit_patch/maps/mp/gametypes_zm/zgrief.gsc
|
||||||
|
|
||||||
|
**The following scripts compile and run successfully with major errors:**
|
||||||
|
zm_transit_patch/maps/mp/zombies/_zm_weap_jetgun.gsc
|
||||||
|
|
||||||
|
**The following scripts compile but cause a minidump or other severe error:**
|
||||||
|
patch_zm/maps/mp/zombies/_zm.gsc
|
||||||
|
patch_zm/maps/mp/zombies/_zm_powerups.gsc
|
||||||
|
patch_zm/maps/mp/zombies/_zm_magicbox.gsc
|
||||||
|
|
||||||
|
**notes:**
|
||||||
|
zm_transit_utility.gsc can be recompiled to fix tombstone
|
@ -0,0 +1,730 @@
|
|||||||
|
#include maps/mp/zombies/_zm_equipment;
|
||||||
|
#include maps/mp/zombies/_zm_weapons;
|
||||||
|
#include maps/mp/zombies/_zm_audio_announcer;
|
||||||
|
#include maps/mp/zombies/_zm_zonemgr;
|
||||||
|
#include maps/mp/_demo;
|
||||||
|
#include maps/mp/zombies/_zm_laststand;
|
||||||
|
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
|
||||||
|
#include maps/mp/zombies/_zm_magicbox;
|
||||||
|
#include maps/mp/zombies/_zm_game_module;
|
||||||
|
#include maps/mp/zombies/_zm;
|
||||||
|
#include maps/mp/zombies/_zm_game_module_meat_utility;
|
||||||
|
#include maps/mp/zombies/_zm_powerups;
|
||||||
|
#include maps/mp/gametypes_zm/zmeat;
|
||||||
|
#include maps/mp/zombies/_zm_stats;
|
||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
#include maps/mp/gametypes_zm/_hud_util;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include maps/mp/zombies/_zm_spawner;
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::main();
|
||||||
|
level.onprecachegametype = ::onprecachegametype;
|
||||||
|
level.onstartgametype = ::onstartgametype;
|
||||||
|
level.custom_spectate_permissions = ::setspectatepermissionsgrief;
|
||||||
|
level._game_module_custom_spawn_init_func = ::custom_spawn_init_func;
|
||||||
|
//level._game_module_stat_update_func = ::maps/mp/zombies/_zm_stats::grief_custom_stat_update;
|
||||||
|
level._game_module_player_damage_callback = ::game_module_player_damage_callback;
|
||||||
|
level.custom_end_screen = ::custom_end_screen;
|
||||||
|
level.gamemode_map_postinit[ "zgrief" ] = ::postinit_func;
|
||||||
|
level._supress_survived_screen = 1;
|
||||||
|
level.game_module_team_name_override_og_x = 155;
|
||||||
|
level.prevent_player_damage = ::player_prevent_damage;
|
||||||
|
level._game_module_player_damage_grief_callback = ::game_module_player_damage_grief_callback;
|
||||||
|
level._grief_reset_message = ::grief_reset_message;
|
||||||
|
level._game_module_player_laststand_callback = ::grief_laststand_weapon_save;
|
||||||
|
level.onplayerspawned_restore_previous_weapons = ::grief_laststand_weapons_return;
|
||||||
|
level.game_module_onplayerconnect = ::grief_onplayerconnect;
|
||||||
|
level.game_mode_spawn_player_logic = ::game_mode_spawn_player_logic;
|
||||||
|
level.game_mode_custom_onplayerdisconnect = ::grief_onplayerdisconnect;
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zgrief" );
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_onplayerconnect()
|
||||||
|
{
|
||||||
|
self thread move_team_icons();
|
||||||
|
self thread zgrief_player_bled_out_msg();
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_onplayerdisconnect( disconnecting_player )
|
||||||
|
{
|
||||||
|
level thread update_players_on_bleedout_or_disconnect( disconnecting_player );
|
||||||
|
}
|
||||||
|
|
||||||
|
setspectatepermissionsgrief()
|
||||||
|
{
|
||||||
|
self allowspectateteam( "allies", 1 );
|
||||||
|
self allowspectateteam( "axis", 1 );
|
||||||
|
self allowspectateteam( "freelook", 0 );
|
||||||
|
self allowspectateteam( "none", 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
custom_end_screen()
|
||||||
|
{
|
||||||
|
players = get_players();
|
||||||
|
i = 0;
|
||||||
|
while ( i < players.size )
|
||||||
|
{
|
||||||
|
players[ i ].game_over_hud = newclienthudelem( players[ i ] );
|
||||||
|
players[ i ].game_over_hud.alignx = "center";
|
||||||
|
players[ i ].game_over_hud.aligny = "middle";
|
||||||
|
players[ i ].game_over_hud.horzalign = "center";
|
||||||
|
players[ i ].game_over_hud.vertalign = "middle";
|
||||||
|
players[ i ].game_over_hud.y -= 130;
|
||||||
|
players[ i ].game_over_hud.foreground = 1;
|
||||||
|
players[ i ].game_over_hud.fontscale = 3;
|
||||||
|
players[ i ].game_over_hud.alpha = 0;
|
||||||
|
players[ i ].game_over_hud.color = ( 1, 1, 1 );
|
||||||
|
players[ i ].game_over_hud.hidewheninmenu = 1;
|
||||||
|
players[ i ].game_over_hud settext( &"ZOMBIE_GAME_OVER" );
|
||||||
|
players[ i ].game_over_hud fadeovertime( 1 );
|
||||||
|
players[ i ].game_over_hud.alpha = 1;
|
||||||
|
if ( players[ i ] issplitscreen() )
|
||||||
|
{
|
||||||
|
players[ i ].game_over_hud.fontscale = 2;
|
||||||
|
players[ i ].game_over_hud.y += 40;
|
||||||
|
}
|
||||||
|
players[ i ].survived_hud = newclienthudelem( players[ i ] );
|
||||||
|
players[ i ].survived_hud.alignx = "center";
|
||||||
|
players[ i ].survived_hud.aligny = "middle";
|
||||||
|
players[ i ].survived_hud.horzalign = "center";
|
||||||
|
players[ i ].survived_hud.vertalign = "middle";
|
||||||
|
players[ i ].survived_hud.y -= 100;
|
||||||
|
players[ i ].survived_hud.foreground = 1;
|
||||||
|
players[ i ].survived_hud.fontscale = 2;
|
||||||
|
players[ i ].survived_hud.alpha = 0;
|
||||||
|
players[ i ].survived_hud.color = ( 1, 1, 1 );
|
||||||
|
players[ i ].survived_hud.hidewheninmenu = 1;
|
||||||
|
if ( players[ i ] issplitscreen() )
|
||||||
|
{
|
||||||
|
players[ i ].survived_hud.fontscale = 1.5;
|
||||||
|
players[ i ].survived_hud.y += 40;
|
||||||
|
}
|
||||||
|
winner_text = &"ZOMBIE_GRIEF_WIN";
|
||||||
|
loser_text = &"ZOMBIE_GRIEF_LOSE";
|
||||||
|
if ( level.round_number < 2 )
|
||||||
|
{
|
||||||
|
winner_text = &"ZOMBIE_GRIEF_WIN_SINGLE";
|
||||||
|
loser_text = &"ZOMBIE_GRIEF_LOSE_SINGLE";
|
||||||
|
}
|
||||||
|
if ( isDefined( level.host_ended_game ) && level.host_ended_game )
|
||||||
|
{
|
||||||
|
players[ i ].survived_hud settext( &"MP_HOST_ENDED_GAME" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( isDefined( level.gamemodulewinningteam ) && players[ i ]._encounters_team == level.gamemodulewinningteam )
|
||||||
|
{
|
||||||
|
players[ i ].survived_hud settext( winner_text, level.round_number );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
players[ i ].survived_hud settext( loser_text, level.round_number );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
players[ i ].survived_hud fadeovertime( 1 );
|
||||||
|
players[ i ].survived_hud.alpha = 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
postinit_func()
|
||||||
|
{
|
||||||
|
level.min_humans = 1;
|
||||||
|
level.zombie_ai_limit = 24;
|
||||||
|
level.prevent_player_damage = ::player_prevent_damage;
|
||||||
|
level.lock_player_on_team_score = 1;
|
||||||
|
level._zombie_spawning = 0;
|
||||||
|
level._get_game_module_players = undefined;
|
||||||
|
level.powerup_drop_count = 0;
|
||||||
|
level.is_zombie_level = 1;
|
||||||
|
setmatchtalkflag( "DeadChatWithDead", 1 );
|
||||||
|
setmatchtalkflag( "DeadChatWithTeam", 1 );
|
||||||
|
setmatchtalkflag( "DeadHearTeamLiving", 1 );
|
||||||
|
setmatchtalkflag( "DeadHearAllLiving", 1 );
|
||||||
|
setmatchtalkflag( "EveryoneHearsEveryone", 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_game_end_check_func()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
player_prevent_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
|
||||||
|
{
|
||||||
|
if ( isDefined( eattacker ) && isplayer( eattacker ) && self != eattacker && !eattacker hasperk( "specialty_noname" ) && isDefined( self.is_zombie ) && !self.is_zombie )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
game_module_player_damage_grief_callback( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
|
||||||
|
{
|
||||||
|
penalty = 10;
|
||||||
|
if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker != self && eattacker.team != self.team && smeansofdeath == "MOD_MELEE" )
|
||||||
|
{
|
||||||
|
self applyknockback( idamage, vdir );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onprecachegametype()
|
||||||
|
{
|
||||||
|
level.playersuicideallowed = 1;
|
||||||
|
level.suicide_weapon = "death_self_zm";
|
||||||
|
precacheitem( "death_self_zm" );
|
||||||
|
precacheshellshock( "grief_stab_zm" );
|
||||||
|
precacheshader( "faction_cdc" );
|
||||||
|
precacheshader( "faction_cia" );
|
||||||
|
precacheshader( "waypoint_revive_cdc_zm" );
|
||||||
|
precacheshader( "waypoint_revive_cia_zm" );
|
||||||
|
level._effect[ "butterflies" ] = loadfx( "maps/zombie/fx_zmb_impact_noharm" );
|
||||||
|
level thread maps/mp/gametypes_zm/_zm_gametype::init();
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zgrief" );
|
||||||
|
}
|
||||||
|
|
||||||
|
onstartgametype()
|
||||||
|
{
|
||||||
|
level.no_end_game_check = 1;
|
||||||
|
level._game_module_game_end_check = ::grief_game_end_check_func;
|
||||||
|
level.round_end_custom_logic = ::grief_round_end_custom_logic;
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::setup_classic_gametype();
|
||||||
|
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zgrief", ::zgrief_main );
|
||||||
|
}
|
||||||
|
|
||||||
|
zgrief_main()
|
||||||
|
{
|
||||||
|
level thread maps/mp/zombies/_zm::round_start();
|
||||||
|
level thread maps/mp/gametypes_zm/_zm_gametype::kill_all_zombies();
|
||||||
|
flag_wait( "initial_blackscreen_passed" );
|
||||||
|
level thread maps/mp/zombies/_zm_game_module::wait_for_team_death_and_round_end();
|
||||||
|
players = get_players();
|
||||||
|
_a302 = players;
|
||||||
|
_k302 = getFirstArrayKey( _a302 );
|
||||||
|
while ( isDefined( _k302 ) )
|
||||||
|
{
|
||||||
|
player = _a302[ _k302 ];
|
||||||
|
player.is_hotjoin = 0;
|
||||||
|
_k302 = getNextArrayKey( _a302, _k302 );
|
||||||
|
}
|
||||||
|
wait 1;
|
||||||
|
playsoundatposition( "vox_zmba_grief_intro_0", ( 1, 1, 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
move_team_icons()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
flag_wait( "initial_blackscreen_passed" );
|
||||||
|
wait 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
kill_start_chest()
|
||||||
|
{
|
||||||
|
flag_wait( "initial_blackscreen_passed" );
|
||||||
|
wait 2;
|
||||||
|
start_chest = getstruct( "start_chest", "script_noteworthy" );
|
||||||
|
start_chest maps/mp/zombies/_zm_magicbox::hide_chest();
|
||||||
|
}
|
||||||
|
|
||||||
|
door_close_zombie_think()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
while ( isalive( self ) )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.enemy ) && isplayer( self.enemy ) )
|
||||||
|
{
|
||||||
|
insamezone = 0;
|
||||||
|
keys = getarraykeys( level.zones );
|
||||||
|
i = 0;
|
||||||
|
while ( i < keys.size )
|
||||||
|
{
|
||||||
|
if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( keys[ i ] ) && self.enemy maps/mp/zombies/_zm_zonemgr::entity_in_zone( keys[ i ] ) )
|
||||||
|
{
|
||||||
|
insamezone = 1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while ( insamezone )
|
||||||
|
{
|
||||||
|
wait 3;
|
||||||
|
}
|
||||||
|
nearestzombienode = getnearestnode( self.origin );
|
||||||
|
nearestplayernode = getnearestnode( self.enemy.origin );
|
||||||
|
if ( isDefined( nearestzombienode ) && isDefined( nearestplayernode ) )
|
||||||
|
{
|
||||||
|
if ( !nodesvisible( nearestzombienode, nearestplayernode ) && !nodescanpath( nearestzombienode, nearestplayernode ) )
|
||||||
|
{
|
||||||
|
self silentlyremovezombie();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
silentlyremovezombie()
|
||||||
|
{
|
||||||
|
level.zombie_total++;
|
||||||
|
playfx( level._effect[ "spawn_cloud" ], self.origin );
|
||||||
|
self.skip_death_notetracks = 1;
|
||||||
|
self.nodeathragdoll = 1;
|
||||||
|
self dodamage( self.maxhealth * 2, self.origin, self, self, "none", "MOD_SUICIDE" );
|
||||||
|
self self_delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
zgrief_player_bled_out_msg()
|
||||||
|
{
|
||||||
|
level endon( "end_game" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill( "bled_out" );
|
||||||
|
level thread update_players_on_bleedout_or_disconnect( self );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
show_grief_hud_msg( msg, msg_parm, offset, cleanup_end_game )
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
while ( isDefined( level.hostmigrationtimer ) )
|
||||||
|
{
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
zgrief_hudmsg = newclienthudelem( self );
|
||||||
|
zgrief_hudmsg.alignx = "center";
|
||||||
|
zgrief_hudmsg.aligny = "middle";
|
||||||
|
zgrief_hudmsg.horzalign = "center";
|
||||||
|
zgrief_hudmsg.vertalign = "middle";
|
||||||
|
zgrief_hudmsg.y -= 130;
|
||||||
|
if ( self issplitscreen() )
|
||||||
|
{
|
||||||
|
zgrief_hudmsg.y += 70;
|
||||||
|
}
|
||||||
|
if ( isDefined( offset ) )
|
||||||
|
{
|
||||||
|
zgrief_hudmsg.y += offset;
|
||||||
|
}
|
||||||
|
zgrief_hudmsg.foreground = 1;
|
||||||
|
zgrief_hudmsg.fontscale = 5;
|
||||||
|
zgrief_hudmsg.alpha = 0;
|
||||||
|
zgrief_hudmsg.color = ( 1, 1, 1 );
|
||||||
|
zgrief_hudmsg.hidewheninmenu = 1;
|
||||||
|
zgrief_hudmsg.font = "default";
|
||||||
|
if ( isDefined( cleanup_end_game ) && cleanup_end_game )
|
||||||
|
{
|
||||||
|
level endon( "end_game" );
|
||||||
|
zgrief_hudmsg thread show_grief_hud_msg_cleanup();
|
||||||
|
}
|
||||||
|
if ( isDefined( msg_parm ) )
|
||||||
|
{
|
||||||
|
zgrief_hudmsg settext( msg, msg_parm );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zgrief_hudmsg settext( msg );
|
||||||
|
}
|
||||||
|
zgrief_hudmsg changefontscaleovertime( 0.25 );
|
||||||
|
zgrief_hudmsg fadeovertime( 0.25 );
|
||||||
|
zgrief_hudmsg.alpha = 1;
|
||||||
|
zgrief_hudmsg.fontscale = 2;
|
||||||
|
wait 3.25;
|
||||||
|
zgrief_hudmsg changefontscaleovertime( 1 );
|
||||||
|
zgrief_hudmsg fadeovertime( 1 );
|
||||||
|
zgrief_hudmsg.alpha = 0;
|
||||||
|
zgrief_hudmsg.fontscale = 5;
|
||||||
|
wait 1;
|
||||||
|
zgrief_hudmsg notify( "death" );
|
||||||
|
if ( isDefined( zgrief_hudmsg ) )
|
||||||
|
{
|
||||||
|
zgrief_hudmsg destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
show_grief_hud_msg_cleanup()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
level waittill( "end_game" );
|
||||||
|
if ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
self destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_reset_message()
|
||||||
|
{
|
||||||
|
msg = &"ZOMBIE_GRIEF_RESET";
|
||||||
|
players = get_players();
|
||||||
|
if ( isDefined( level.hostmigrationtimer ) )
|
||||||
|
{
|
||||||
|
while ( isDefined( level.hostmigrationtimer ) )
|
||||||
|
{
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
wait 4;
|
||||||
|
}
|
||||||
|
_a697 = players;
|
||||||
|
_k697 = getFirstArrayKey( _a697 );
|
||||||
|
while ( isDefined( _k697 ) )
|
||||||
|
{
|
||||||
|
player = _a697[ _k697 ];
|
||||||
|
player thread show_grief_hud_msg( msg );
|
||||||
|
_k697 = getNextArrayKey( _a697, _k697 );
|
||||||
|
}
|
||||||
|
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "grief_restarted" );
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration )
|
||||||
|
{
|
||||||
|
self.grief_savedweapon_weapons = self getweaponslist();
|
||||||
|
self.grief_savedweapon_weaponsammo_stock = [];
|
||||||
|
self.grief_savedweapon_weaponsammo_clip = [];
|
||||||
|
self.grief_savedweapon_currentweapon = self getcurrentweapon();
|
||||||
|
self.grief_savedweapon_grenades = self get_player_lethal_grenade();
|
||||||
|
if ( isDefined( self.grief_savedweapon_grenades ) )
|
||||||
|
{
|
||||||
|
self.grief_savedweapon_grenades_clip = self getweaponammoclip( self.grief_savedweapon_grenades );
|
||||||
|
}
|
||||||
|
self.grief_savedweapon_tactical = self get_player_tactical_grenade();
|
||||||
|
if ( isDefined( self.grief_savedweapon_tactical ) )
|
||||||
|
{
|
||||||
|
self.grief_savedweapon_tactical_clip = self getweaponammoclip( self.grief_savedweapon_tactical );
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while ( i < self.grief_savedweapon_weapons.size )
|
||||||
|
{
|
||||||
|
self.grief_savedweapon_weaponsammo_clip[ i ] = self getweaponammoclip( self.grief_savedweapon_weapons[ i ] );
|
||||||
|
self.grief_savedweapon_weaponsammo_stock[ i ] = self getweaponammostock( self.grief_savedweapon_weapons[ i ] );
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.hasriotshield ) && self.hasriotshield )
|
||||||
|
{
|
||||||
|
self.grief_hasriotshield = 1;
|
||||||
|
}
|
||||||
|
if ( self hasweapon( "claymore_zm" ) )
|
||||||
|
{
|
||||||
|
self.grief_savedweapon_claymore = 1;
|
||||||
|
self.grief_savedweapon_claymore_clip = self getweaponammoclip( "claymore_zm" );
|
||||||
|
}
|
||||||
|
if ( isDefined( self.current_equipment ) )
|
||||||
|
{
|
||||||
|
self.grief_savedweapon_equipment = self.current_equipment;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_laststand_weapons_return()
|
||||||
|
{
|
||||||
|
if ( isDefined( level.isresetting_grief ) && !level.isresetting_grief )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( !isDefined( self.grief_savedweapon_weapons ) )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
primary_weapons_returned = 0;
|
||||||
|
_a766 = self.grief_savedweapon_weapons;
|
||||||
|
index = getFirstArrayKey( _a766 );
|
||||||
|
while ( isDefined( index ) )
|
||||||
|
{
|
||||||
|
weapon = _a766[ index ];
|
||||||
|
if ( isDefined( self.grief_savedweapon_grenades ) || weapon == self.grief_savedweapon_grenades && isDefined( self.grief_savedweapon_tactical ) && weapon == self.grief_savedweapon_tactical )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( isweaponprimary( weapon ) )
|
||||||
|
{
|
||||||
|
if ( primary_weapons_returned >= 2 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else primary_weapons_returned++;
|
||||||
|
}
|
||||||
|
if ( weapon == "item_meat_zm" )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self giveweapon( weapon, 0, self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) );
|
||||||
|
if ( isDefined( self.grief_savedweapon_weaponsammo_clip[ index ] ) )
|
||||||
|
{
|
||||||
|
self setweaponammoclip( weapon, self.grief_savedweapon_weaponsammo_clip[ index ] );
|
||||||
|
}
|
||||||
|
if ( isDefined( self.grief_savedweapon_weaponsammo_stock[ index ] ) )
|
||||||
|
{
|
||||||
|
self setweaponammostock( weapon, self.grief_savedweapon_weaponsammo_stock[ index ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
index = getNextArrayKey( _a766, index );
|
||||||
|
}
|
||||||
|
if ( isDefined( self.grief_savedweapon_grenades ) )
|
||||||
|
{
|
||||||
|
self giveweapon( self.grief_savedweapon_grenades );
|
||||||
|
if ( isDefined( self.grief_savedweapon_grenades_clip ) )
|
||||||
|
{
|
||||||
|
self setweaponammoclip( self.grief_savedweapon_grenades, self.grief_savedweapon_grenades_clip );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isDefined( self.grief_savedweapon_tactical ) )
|
||||||
|
{
|
||||||
|
self giveweapon( self.grief_savedweapon_tactical );
|
||||||
|
if ( isDefined( self.grief_savedweapon_tactical_clip ) )
|
||||||
|
{
|
||||||
|
self setweaponammoclip( self.grief_savedweapon_tactical, self.grief_savedweapon_tactical_clip );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isDefined( self.current_equipment ) )
|
||||||
|
{
|
||||||
|
self maps/mp/zombies/_zm_equipment::equipment_take( self.current_equipment );
|
||||||
|
}
|
||||||
|
if ( isDefined( self.grief_savedweapon_equipment ) )
|
||||||
|
{
|
||||||
|
self.do_not_display_equipment_pickup_hint = 1;
|
||||||
|
self maps/mp/zombies/_zm_equipment::equipment_give( self.grief_savedweapon_equipment );
|
||||||
|
self.do_not_display_equipment_pickup_hint = undefined;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.grief_hasriotshield ) && self.grief_hasriotshield )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.player_shield_reset_health ) )
|
||||||
|
{
|
||||||
|
self [[ self.player_shield_reset_health ]]();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isDefined( self.grief_savedweapon_claymore ) && self.grief_savedweapon_claymore )
|
||||||
|
{
|
||||||
|
self giveweapon( "claymore_zm" );
|
||||||
|
self set_player_placeable_mine( "claymore_zm" );
|
||||||
|
self setactionslot( 4, "weapon", "claymore_zm" );
|
||||||
|
self setweaponammoclip( "claymore_zm", self.grief_savedweapon_claymore_clip );
|
||||||
|
}
|
||||||
|
primaries = self getweaponslistprimaries();
|
||||||
|
_a859 = primaries;
|
||||||
|
_k859 = getFirstArrayKey( _a859 );
|
||||||
|
while ( isDefined( _k859 ) )
|
||||||
|
{
|
||||||
|
weapon = _a859[ _k859 ];
|
||||||
|
if ( isDefined( self.grief_savedweapon_currentweapon ) && self.grief_savedweapon_currentweapon == weapon )
|
||||||
|
{
|
||||||
|
self switchtoweapon( weapon );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
_k859 = getNextArrayKey( _a859, _k859 );
|
||||||
|
}
|
||||||
|
if ( primaries.size > 0 )
|
||||||
|
{
|
||||||
|
self switchtoweapon( primaries[ 0 ] );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_store_player_scores()
|
||||||
|
{
|
||||||
|
players = get_players();
|
||||||
|
_a883 = players;
|
||||||
|
_k883 = getFirstArrayKey( _a883 );
|
||||||
|
while ( isDefined( _k883 ) )
|
||||||
|
{
|
||||||
|
player = _a883[ _k883 ];
|
||||||
|
player._pre_round_score = player.score;
|
||||||
|
_k883 = getNextArrayKey( _a883, _k883 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_restore_player_score()
|
||||||
|
{
|
||||||
|
if ( !isDefined( self._pre_round_score ) )
|
||||||
|
{
|
||||||
|
self._pre_round_score = self.score;
|
||||||
|
}
|
||||||
|
if ( isDefined( self._pre_round_score ) )
|
||||||
|
{
|
||||||
|
self.score = self._pre_round_score;
|
||||||
|
self.pers[ "score" ] = self._pre_round_score;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
game_mode_spawn_player_logic()
|
||||||
|
{
|
||||||
|
if ( flag( "start_zombie_round_logic" ) && !isDefined( self.is_hotjoin ) )
|
||||||
|
{
|
||||||
|
self.is_hotjoin = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_players_on_bleedout_or_disconnect( excluded_player )
|
||||||
|
{
|
||||||
|
other_team = undefined;
|
||||||
|
players = get_players();
|
||||||
|
players_remaining = 0;
|
||||||
|
_a920 = players;
|
||||||
|
_k920 = getFirstArrayKey( _a920 );
|
||||||
|
while ( isDefined( _k920 ) )
|
||||||
|
{
|
||||||
|
player = _a920[ _k920 ];
|
||||||
|
if ( player == excluded_player )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if ( player.team == excluded_player.team )
|
||||||
|
{
|
||||||
|
if ( is_player_valid( player ) )
|
||||||
|
{
|
||||||
|
players_remaining++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_k920 = getNextArrayKey( _a920, _k920 );
|
||||||
|
}
|
||||||
|
_a937 = players;
|
||||||
|
_k937 = getFirstArrayKey( _a937 );
|
||||||
|
while ( isDefined( _k937 ) )
|
||||||
|
{
|
||||||
|
player = _a937[ _k937 ];
|
||||||
|
if ( player == excluded_player )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if ( player.team != excluded_player.team )
|
||||||
|
{
|
||||||
|
other_team = player.team;
|
||||||
|
if ( players_remaining < 1 )
|
||||||
|
{
|
||||||
|
player thread show_grief_hud_msg( &"ZOMBIE_ZGRIEF_ALL_PLAYERS_DOWN", undefined, undefined, 1 );
|
||||||
|
player delay_thread_watch_host_migrate( 2, ::show_grief_hud_msg, &"ZOMBIE_ZGRIEF_SURVIVE", undefined, 30, 1 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player thread show_grief_hud_msg( &"ZOMBIE_ZGRIEF_PLAYER_BLED_OUT", players_remaining );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_k937 = getNextArrayKey( _a937, _k937 );
|
||||||
|
}
|
||||||
|
if ( players_remaining == 1 )
|
||||||
|
{
|
||||||
|
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "last_player", excluded_player.team );
|
||||||
|
}
|
||||||
|
if ( !isDefined( other_team ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( players_remaining < 1 )
|
||||||
|
{
|
||||||
|
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "4_player_down", other_team );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( players_remaining + "_player_left", other_team );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delay_thread_watch_host_migrate( timer, func, param1, param2, param3, param4, param5, param6 )
|
||||||
|
{
|
||||||
|
self thread _delay_thread_watch_host_migrate_proc( func, timer, param1, param2, param3, param4, param5, param6 );
|
||||||
|
}
|
||||||
|
|
||||||
|
_delay_thread_watch_host_migrate_proc( func, timer, param1, param2, param3, param4, param5, param6 )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
wait timer;
|
||||||
|
if ( isDefined( level.hostmigrationtimer ) )
|
||||||
|
{
|
||||||
|
while ( isDefined( level.hostmigrationtimer ) )
|
||||||
|
{
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
wait timer;
|
||||||
|
}
|
||||||
|
single_thread( self, func, param1, param2, param3, param4, param5, param6 );
|
||||||
|
}
|
||||||
|
|
||||||
|
grief_round_end_custom_logic()
|
||||||
|
{
|
||||||
|
waittillframeend;
|
||||||
|
if ( isDefined( level.gamemodulewinningteam ) )
|
||||||
|
{
|
||||||
|
level notify( "end_round_think" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
custom_spawn_init_func()
|
||||||
|
{
|
||||||
|
array_thread( level.zombie_spawners, ::add_spawn_function, ::zombie_spawn_init );
|
||||||
|
array_thread( level.zombie_spawners, ::add_spawn_function, level._zombies_round_spawn_failsafe );
|
||||||
|
}
|
||||||
|
|
||||||
|
game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
|
||||||
|
{
|
||||||
|
self.last_damage_from_zombie_or_player = 0;
|
||||||
|
if ( isDefined( eattacker ) )
|
||||||
|
{
|
||||||
|
if ( isplayer( eattacker ) && eattacker == self )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( eattacker.is_zombie ) || eattacker.is_zombie && isplayer( eattacker ) )
|
||||||
|
{
|
||||||
|
self.last_damage_from_zombie_or_player = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isDefined( self._being_shellshocked ) || self._being_shellshocked && self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isplayer( eattacker ) && isDefined( eattacker._encounters_team ) && eattacker._encounters_team != self._encounters_team )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.hasriotshield ) && self.hasriotshield && isDefined( vdir ) )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped )
|
||||||
|
{
|
||||||
|
if ( self maps/mp/zombies/_zm::player_shield_facing_attacker( vdir, 0.2 ) && isDefined( self.player_shield_apply_damage ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !isDefined( self.riotshieldentity ) )
|
||||||
|
{
|
||||||
|
if ( !self maps/mp/zombies/_zm::player_shield_facing_attacker( vdir, -0.2 ) && isDefined( self.player_shield_apply_damage ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isDefined( level._game_module_player_damage_grief_callback ) )
|
||||||
|
{
|
||||||
|
self [[ level._game_module_player_damage_grief_callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime );
|
||||||
|
}
|
||||||
|
if ( isDefined( level._effect[ "butterflies" ] ) )
|
||||||
|
{
|
||||||
|
if ( isDefined( sweapon ) && weapontype( sweapon ) == "grenade" )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "butterflies" ], self.origin + vectorScale( ( 1, 1, 1 ), 40 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "butterflies" ], vpoint, vdir );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self thread do_game_mode_shellshock();
|
||||||
|
self playsound( "zmb_player_hit_ding" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_game_mode_shellshock()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self._being_shellshocked = 1;
|
||||||
|
self shellshock( "grief_stab_zm", 0,75 );
|
||||||
|
wait 0.75;
|
||||||
|
self._being_shellshocked = 0;
|
||||||
|
}
|
@ -0,0 +1,279 @@
|
|||||||
|
#include maps/mp/_compass;
|
||||||
|
#include maps/mp/zombies/_zm_zonemgr;
|
||||||
|
#include maps/mp/zombies/_zm_perks;
|
||||||
|
#include maps/mp/zombies/_zm_audio;
|
||||||
|
#include maps/mp/zombies/_zm_score;
|
||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
|
||||||
|
playercanafford( player, cost )
|
||||||
|
{
|
||||||
|
if ( !player usebuttonpressed() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( player in_revive_trigger() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( isDefined( cost ) )
|
||||||
|
{
|
||||||
|
if ( player.score < cost )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
player maps/mp/zombies/_zm_score::minus_to_player_score( cost );
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
setinvisibletoall()
|
||||||
|
{
|
||||||
|
players = get_players();
|
||||||
|
playerindex = 0;
|
||||||
|
while ( playerindex < players.size )
|
||||||
|
{
|
||||||
|
self setinvisibletoplayer( players[ playerindex ] );
|
||||||
|
playerindex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spawnandlinkfxtotag( effect, ent, tag )
|
||||||
|
{
|
||||||
|
fxent = spawn( "script_model", ent gettagorigin( tag ) );
|
||||||
|
fxent setmodel( "tag_origin" );
|
||||||
|
fxent linkto( ent, tag );
|
||||||
|
wait_network_frame();
|
||||||
|
playfxontag( effect, fxent, "tag_origin" );
|
||||||
|
return fxent;
|
||||||
|
}
|
||||||
|
|
||||||
|
spawnandlinkfxtooffset( effect, ent, offsetorigin, offsetangles )
|
||||||
|
{
|
||||||
|
fxent = spawn( "script_model", ( 0, 0, 0 ) );
|
||||||
|
fxent setmodel( "tag_origin" );
|
||||||
|
fxent linkto( ent, "", offsetorigin, offsetangles );
|
||||||
|
wait_network_frame();
|
||||||
|
playfxontag( effect, fxent, "tag_origin" );
|
||||||
|
return fxent;
|
||||||
|
}
|
||||||
|
|
||||||
|
custom_weapon_wall_prices()
|
||||||
|
{
|
||||||
|
if ( !isDefined( level.zombie_include_weapons ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
weapon_spawns = [];
|
||||||
|
weapon_spawns = getentarray( "weapon_upgrade", "targetname" );
|
||||||
|
i = 0;
|
||||||
|
while ( i < weapon_spawns.size )
|
||||||
|
{
|
||||||
|
if ( !isDefined( level.zombie_weapons[ weapon_spawns[ i ].zombie_weapon_upgrade ] ) )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( isDefined( weapon_spawns[ i ].script_int ) )
|
||||||
|
{
|
||||||
|
cost = weapon_spawns[ i ].script_int;
|
||||||
|
level.zombie_weapons[ weapon_spawns[ i ].zombie_weapon_upgrade ].cost = cost;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pause_zombie_spawning()
|
||||||
|
{
|
||||||
|
if ( !isDefined( level.spawnpausecount ) )
|
||||||
|
{
|
||||||
|
level.spawnpausecount = 0;
|
||||||
|
}
|
||||||
|
level.spawnpausecount++;
|
||||||
|
flag_clear( "spawn_zombies" );
|
||||||
|
}
|
||||||
|
|
||||||
|
try_resume_zombie_spawning()
|
||||||
|
{
|
||||||
|
if ( !isDefined( level.spawnpausecount ) )
|
||||||
|
{
|
||||||
|
level.spawnpausecount = 0;
|
||||||
|
}
|
||||||
|
level.spawnpausecount--;
|
||||||
|
|
||||||
|
if ( level.spawnpausecount <= 0 )
|
||||||
|
{
|
||||||
|
level.spawnpausecount = 0;
|
||||||
|
flag_set( "spawn_zombies" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
automatonspeak( category, type, response, force_variant, override )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.automaton ) && !is_true( level.automaton.disabled_by_emp ) )
|
||||||
|
{
|
||||||
|
if ( type != "leaving" && type != "leaving_warning" )
|
||||||
|
{
|
||||||
|
level.automaton notify( "want_to_be_speaking" );
|
||||||
|
level.automaton waittill( "startspeaking" );
|
||||||
|
}
|
||||||
|
level.automaton maps/mp/zombies/_zm_audio::create_and_play_dialog( category, type, response, force_variant, override );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_thedouche()
|
||||||
|
{
|
||||||
|
return self.characterindex == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_theconspiracytheorist()
|
||||||
|
{
|
||||||
|
return self.characterindex == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_thefarmersdaughter()
|
||||||
|
{
|
||||||
|
return self.characterindex == 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_theelectricalengineer()
|
||||||
|
{
|
||||||
|
return self.characterindex == 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_random_encounter_match( location )
|
||||||
|
{
|
||||||
|
match_pool = [];
|
||||||
|
return random( match_pool );
|
||||||
|
}
|
||||||
|
|
||||||
|
transit_breakable_glass_init()
|
||||||
|
{
|
||||||
|
glass = getentarray( "transit_glass", "targetname" );
|
||||||
|
if ( level.splitscreen && getDvarInt( "splitscreen_playerCount" ) > 2 )
|
||||||
|
{
|
||||||
|
array_delete( glass );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
array_thread( glass, ::transit_breakable_glass );
|
||||||
|
}
|
||||||
|
|
||||||
|
transit_breakable_glass()
|
||||||
|
{
|
||||||
|
level endon( "intermission" );
|
||||||
|
self.health = 99999;
|
||||||
|
self setcandamage( 1 );
|
||||||
|
self.damage_state = 0;
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill( "damage", amount, attacker, direction, point, dmg_type );
|
||||||
|
if ( isplayer( attacker ) )
|
||||||
|
{
|
||||||
|
if ( self.damage_state == 0 )
|
||||||
|
{
|
||||||
|
self glass_gets_destroyed();
|
||||||
|
self.damage_state = 1;
|
||||||
|
self playsound( "fly_glass_break" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glass_gets_destroyed()
|
||||||
|
{
|
||||||
|
if ( isDefined( level._effect[ "glass_impact" ] ) )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "glass_impact" ], self.origin, anglesToForward( self.angles ) );
|
||||||
|
}
|
||||||
|
wait 0.1;
|
||||||
|
if ( isDefined( self.model ) && self.damage_state == 0 )
|
||||||
|
{
|
||||||
|
self setmodel( self.model + "_broken" );
|
||||||
|
self.damage_state = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self delete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
solo_tombstone_removal()
|
||||||
|
{
|
||||||
|
if ( getnumexpectedplayers() > 1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
level notify( "tombstone_removed" );
|
||||||
|
level thread maps/mp/zombies/_zm_perks::perk_machine_removal( "specialty_scavenger" );
|
||||||
|
}
|
||||||
|
|
||||||
|
sparking_power_lines()
|
||||||
|
{
|
||||||
|
lines = getentarray( "power_line_sparking", "targetname" );
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnect_door_zones( zone_a, zone_b, flag_name )
|
||||||
|
{
|
||||||
|
level endon( "intermission" );
|
||||||
|
level endon( "end_game" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
flag_wait( flag_name );
|
||||||
|
azone = level.zones[ zone_a ].adjacent_zones[ zone_b ];
|
||||||
|
azone maps/mp/zombies/_zm_zonemgr::door_close_disconnect( flag_name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_morse_code()
|
||||||
|
{
|
||||||
|
level clientnotify( "mc1" );
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_morse_code()
|
||||||
|
{
|
||||||
|
level clientnotify( "mc0" );
|
||||||
|
}
|
||||||
|
|
||||||
|
transit_pathnode_spawning()
|
||||||
|
{
|
||||||
|
precachemodel( "collision_wall_128x128x10_standard" );
|
||||||
|
precachemodel( "collision_wall_256x256x10_standard" );
|
||||||
|
precachemodel( "collision_clip_64x64x256" );
|
||||||
|
minimap_upperl = spawn( "script_origin", ( -12248, 9496, 552 ) );
|
||||||
|
minimap_upperl.targetname = "minimap_corner";
|
||||||
|
minimap_lowerr = spawn( "script_origin", ( 14472, -8496, -776 ) );
|
||||||
|
minimap_lowerr.targetname = "minimap_corner";
|
||||||
|
maps/mp/_compass::setupminimap( "compass_map_zm_transit" );
|
||||||
|
flag_wait( "start_zombie_round_logic" );
|
||||||
|
collision1 = spawn( "script_model", ( 2273, -126, 143 ) );
|
||||||
|
collision1 setmodel( "collision_wall_128x128x10_standard" );
|
||||||
|
collision1.angles = ( 0, 0, 0 );
|
||||||
|
collision1 ghost();
|
||||||
|
collision2 = spawn( "script_model", ( 2096, -126, 143 ) );
|
||||||
|
collision2 setmodel( "collision_wall_128x128x10_standard" );
|
||||||
|
collision2.angles = ( 0, 0, 0 );
|
||||||
|
collision2 ghost();
|
||||||
|
collision3 = spawn( "script_model", ( 1959, -126, 143 ) );
|
||||||
|
collision3 setmodel( "collision_wall_128x128x10_standard" );
|
||||||
|
collision3.angles = ( 0, 0, 0 );
|
||||||
|
collision3 ghost();
|
||||||
|
collision4 = spawn( "script_model", ( 12239, 8509, -688 ) );
|
||||||
|
collision4 setmodel( "collision_wall_128x128x10_standard" );
|
||||||
|
collision4.angles = ( 0, 0, 0 );
|
||||||
|
collision4 ghost();
|
||||||
|
collision5 = spawn( "script_model", ( 8320, -6679, 362 ) );
|
||||||
|
collision5 setmodel( "collision_wall_256x256x10_standard" );
|
||||||
|
collision5.angles = vectorScale( ( 0, 0, 0 ), 300 );
|
||||||
|
collision5 ghost();
|
||||||
|
collision5 = spawn( "script_model", ( 10068, 7272, -67 ) );
|
||||||
|
collision5 setmodel( "collision_clip_64x64x256" );
|
||||||
|
collision5.angles = ( 0, 0, 0 );
|
||||||
|
collision5 ghost();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,935 @@
|
|||||||
|
#include maps/mp/animscripts/zm_run;
|
||||||
|
#include maps/mp/animscripts/zm_death;
|
||||||
|
#include maps/mp/zombies/_zm_powerups;
|
||||||
|
#include maps/mp/zombies/_zm_buildables;
|
||||||
|
#include maps/mp/gametypes_zm/_weaponobjects;
|
||||||
|
#include maps/mp/zombies/_zm_equipment;
|
||||||
|
#include maps/mp/zombies/_zm_weapons;
|
||||||
|
#include maps/mp/zombies/_zm_net;
|
||||||
|
#include maps/mp/zombies/_zm_utility;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
maps/mp/zombies/_zm_equipment::register_equipment( "jetgun_zm", &"ZOMBIE_EQUIP_JETGUN_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_JETGUN_HOWTO", "jetgun_zm_icon", "jetgun", ::jetgun_activation_watcher_thread, undefined, ::dropjetgun, ::pickupjetgun );
|
||||||
|
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "jetgun", &"ZOMBIE_EQUIP_JETGUN_PICKUP_HINT_STRING" );
|
||||||
|
level._effect[ "jetgun_smoke_cloud" ] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" );
|
||||||
|
level._effect[ "jetgun_overheat" ] = loadfx( "weapon/jet_gun/fx_jetgun_overheat" );
|
||||||
|
level._effect[ "jetgun_vortex" ] = loadfx( "weapon/jet_gun/fx_jetgun_on" );
|
||||||
|
level._effect[ "jetgun_meat_grinder" ] = loadfx( "weapon/jet_gun/fx_jetgun_kill" );
|
||||||
|
set_zombie_var( "jetgun_cylinder_radius", 1024 );
|
||||||
|
set_zombie_var( "jetgun_grind_range", 128 );
|
||||||
|
set_zombie_var( "jetgun_gib_range", 256 );
|
||||||
|
set_zombie_var( "jetgun_gib_damage", 50 );
|
||||||
|
set_zombie_var( "jetgun_knockdown_range", 256 );
|
||||||
|
set_zombie_var( "jetgun_drag_range", 2048 );
|
||||||
|
set_zombie_var( "jetgun_knockdown_damage", 15 );
|
||||||
|
set_zombie_var( "powerup_move_dist", 50 );
|
||||||
|
set_zombie_var( "powerup_drag_range", 500 );
|
||||||
|
level.jetgun_pulled_in_range = int( level.zombie_vars[ "jetgun_drag_range" ] / 8 ) * ( level.zombie_vars[ "jetgun_drag_range" ] / 8 );
|
||||||
|
level.jetgun_pulling_in_range = int( level.zombie_vars[ "jetgun_drag_range" ] / 4 ) * ( level.zombie_vars[ "jetgun_drag_range" ] / 4 );
|
||||||
|
level.jetgun_inner_range = int( level.zombie_vars[ "jetgun_drag_range" ] / 2 ) * ( level.zombie_vars[ "jetgun_drag_range" ] / 2 );
|
||||||
|
level.jetgun_outer_edge = int( level.zombie_vars[ "jetgun_drag_range" ] * level.zombie_vars[ "jetgun_drag_range" ] );
|
||||||
|
level.jetgun_gib_refs = [];
|
||||||
|
level.jetgun_gib_refs[ level.jetgun_gib_refs.size ] = "guts";
|
||||||
|
level.jetgun_gib_refs[ level.jetgun_gib_refs.size ] = "right_arm";
|
||||||
|
level.jetgun_gib_refs[ level.jetgun_gib_refs.size ] = "left_arm";
|
||||||
|
level.jetgun_gib_refs[ level.jetgun_gib_refs.size ] = "right_leg";
|
||||||
|
level.jetgun_gib_refs[ level.jetgun_gib_refs.size ] = "left_leg";
|
||||||
|
level.jetgun_gib_refs[ level.jetgun_gib_refs.size ] = "no_legs";
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
level thread jetgun_devgui_dvar_think();
|
||||||
|
level.zm_devgui_jetgun_never_overheat = ::never_overheat;
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
onplayerconnect_callback( ::jetgun_on_player_connect );
|
||||||
|
}
|
||||||
|
|
||||||
|
dropjetgun()
|
||||||
|
{
|
||||||
|
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "t6_wpn_zmb_jet_gun_world", "jetgun_zm", self.origin + vectorScale( ( 1, 0, 1 ), 30 ), self.angles );
|
||||||
|
if ( isDefined( item ) )
|
||||||
|
{
|
||||||
|
item.overheating = self.jetgun_overheating;
|
||||||
|
item.heatval = self.jetgun_heatval;
|
||||||
|
item.original_owner = self;
|
||||||
|
item.owner = undefined;
|
||||||
|
item.name = "jetgun_zm";
|
||||||
|
item.requires_pickup = 1;
|
||||||
|
}
|
||||||
|
self.jetgun_overheating = undefined;
|
||||||
|
self.jetgun_heatval = undefined;
|
||||||
|
self takeweapon( "jetgun_zm" );
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
pickupjetgun( item )
|
||||||
|
{
|
||||||
|
item.owner = self;
|
||||||
|
if ( isDefined( item.overheating ) && isDefined( item.heatval ) )
|
||||||
|
{
|
||||||
|
self.jetgun_overheating = item.overheating;
|
||||||
|
self.jetgun_heatval = item.heatval;
|
||||||
|
}
|
||||||
|
item.overheating = undefined;
|
||||||
|
item.heatval = undefined;
|
||||||
|
self setcurrentweaponspinlerp( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_activation_watcher_thread()
|
||||||
|
{
|
||||||
|
self endon( "zombified" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "jetgun_zm_taken" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill_either( "jetgun_zm_activate", "jetgun_zm_deactivate" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_devgui_dvar_think()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setdvar( "scr_jetgun_cylinder_radius", level.zombie_vars[ "jetgun_cylinder_radius" ] );
|
||||||
|
setdvar( "scr_jetgun_grind_range", level.zombie_vars[ "jetgun_grind_range" ] );
|
||||||
|
setdvar( "scr_jetgun_drag_range", level.zombie_vars[ "jetgun_drag_range" ] );
|
||||||
|
setdvar( "scr_jetgun_gib_range", level.zombie_vars[ "jetgun_gib_range" ] );
|
||||||
|
setdvar( "scr_jetgun_gib_damage", level.zombie_vars[ "jetgun_gib_damage" ] );
|
||||||
|
setdvar( "scr_jetgun_knockdown_range", level.zombie_vars[ "jetgun_knockdown_range" ] );
|
||||||
|
setdvar( "scr_jetgun_knockdown_damage", level.zombie_vars[ "jetgun_knockdown_damage" ] );
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
level.zombie_vars[ "jetgun_cylinder_radius" ] = getDvarInt( "scr_jetgun_cylinder_radius" );
|
||||||
|
level.zombie_vars[ "jetgun_grind_range" ] = getDvarInt( "scr_jetgun_grind_range" );
|
||||||
|
level.zombie_vars[ "jetgun_drag_range" ] = getDvarInt( "scr_jetgun_drag_range" );
|
||||||
|
level.zombie_vars[ "jetgun_gib_range" ] = getDvarInt( "scr_jetgun_gib_range" );
|
||||||
|
level.zombie_vars[ "jetgun_gib_damage" ] = getDvarInt( "scr_jetgun_gib_damage" );
|
||||||
|
level.zombie_vars[ "jetgun_knockdown_range" ] = getDvarInt( "scr_jetgun_knockdown_range" );
|
||||||
|
level.zombie_vars[ "jetgun_knockdown_damage" ] = getDvarInt( "scr_jetgun_knockdown_damage" );
|
||||||
|
wait 0.5;
|
||||||
|
}
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_on_player_connect()
|
||||||
|
{
|
||||||
|
self thread wait_for_jetgun_fired();
|
||||||
|
self thread watch_weapon_changes();
|
||||||
|
self thread handle_overheated_jetgun();
|
||||||
|
}
|
||||||
|
|
||||||
|
get_jetgun_engine_direction()
|
||||||
|
{
|
||||||
|
return self getcurrentweaponspinlerp();
|
||||||
|
}
|
||||||
|
|
||||||
|
set_jetgun_engine_direction( nv )
|
||||||
|
{
|
||||||
|
self setcurrentweaponspinlerp( nv );
|
||||||
|
}
|
||||||
|
|
||||||
|
never_overheat()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
self notify( "never_overheat" );
|
||||||
|
self endon( "never_overheat" );
|
||||||
|
self endon( "death_or_disconnect" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
if ( self getcurrentweapon() == "jetgun_zm" )
|
||||||
|
{
|
||||||
|
self setweaponoverheating( 0, 0 );
|
||||||
|
}
|
||||||
|
wait 0.05;
|
||||||
|
|
||||||
|
}
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
watch_overheat()
|
||||||
|
{
|
||||||
|
self endon( "death_or_disconnect" );
|
||||||
|
self endon( "weapon_change" );
|
||||||
|
if ( self getcurrentweapon() == "jetgun_zm" && isDefined( self.jetgun_overheating ) && isDefined( self.jetgun_heatval ) )
|
||||||
|
{
|
||||||
|
self setweaponoverheating( self.jetgun_overheating, self.jetgun_heatval );
|
||||||
|
}
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
if ( self getcurrentweapon() == "jetgun_zm" )
|
||||||
|
{
|
||||||
|
overheating = self isweaponoverheating( 0 );
|
||||||
|
heat = self isweaponoverheating( 1 );
|
||||||
|
self.jetgun_overheating = overheating;
|
||||||
|
self.jetgun_heatval = heat;
|
||||||
|
if ( overheating )
|
||||||
|
{
|
||||||
|
self notify( "jetgun_overheated" );
|
||||||
|
}
|
||||||
|
if ( heat > 75 )
|
||||||
|
{
|
||||||
|
self thread play_overheat_fx();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait 0.05;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
play_overheat_fx()
|
||||||
|
{
|
||||||
|
if ( isDefined( self.overheat_fx_playing ) && !self.overheat_fx_playing )
|
||||||
|
{
|
||||||
|
self.overheat_fx_playing = 1;
|
||||||
|
playfxontag( level._effect[ "jetgun_overheat" ], self, "tag_flash" );
|
||||||
|
wait 5;
|
||||||
|
if ( isDefined( self ) )
|
||||||
|
{
|
||||||
|
self.overheat_fx_playing = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_overheated_jetgun()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
self waittill( "jetgun_overheated" );
|
||||||
|
if ( self getcurrentweapon() == "jetgun_zm" )
|
||||||
|
{
|
||||||
|
if ( isDefined( level.explode_overheated_jetgun ) && level.explode_overheated_jetgun )
|
||||||
|
{
|
||||||
|
self thread maps/mp/zombies/_zm_equipment::equipment_release( "jetgun_zm" );
|
||||||
|
weapon_org = self gettagorigin( "tag_weapon" );
|
||||||
|
pcount = get_players().size;
|
||||||
|
pickup_time = 360 / pcount;
|
||||||
|
maps/mp/zombies/_zm_buildables::player_explode_buildable( "jetgun_zm", weapon_org, 250, 1, pickup_time );
|
||||||
|
self.jetgun_overheating = undefined;
|
||||||
|
self.jetgun_heatval = undefined;
|
||||||
|
self playsound( "wpn_jetgun_explo" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( isDefined( level.unbuild_overheated_jetgun ) && level.unbuild_overheated_jetgun )
|
||||||
|
{
|
||||||
|
self thread maps/mp/zombies/_zm_equipment::equipment_release( "jetgun_zm" );
|
||||||
|
maps/mp/zombies/_zm_buildables::unbuild_buildable( "jetgun_zm", 1 );
|
||||||
|
self.jetgun_overheating = undefined;
|
||||||
|
self.jetgun_heatval = undefined;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( isDefined( level.take_overheated_jetgun ) && level.take_overheated_jetgun )
|
||||||
|
{
|
||||||
|
self thread maps/mp/zombies/_zm_equipment::equipment_release( "jetgun_zm" );
|
||||||
|
self.jetgun_overheating = undefined;
|
||||||
|
self.jetgun_heatval = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
watch_weapon_changes()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self waittill( "weapon_change", weapon );
|
||||||
|
if ( weapon == "jetgun_zm" )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
if ( getDvarInt( #"BCDDAAFF" ) > 0 )
|
||||||
|
{
|
||||||
|
self thread zombie_drag_radius();
|
||||||
|
|
||||||
|
}
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
self thread watch_overheat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_jetgun_fired()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self waittill( "spawned_player" );
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self waittill( "weapon_fired" );
|
||||||
|
currentweapon = self getcurrentweapon();
|
||||||
|
if ( currentweapon == "jetgun_zm" || currentweapon == "jetgun_upgraded_zm" )
|
||||||
|
{
|
||||||
|
self jetgun_firing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_network_choke()
|
||||||
|
{
|
||||||
|
level.jetgun_network_choke_count++;
|
||||||
|
if ( level.jetgun_network_choke_count % 10 )
|
||||||
|
{
|
||||||
|
wait_network_frame();
|
||||||
|
wait_network_frame();
|
||||||
|
wait_network_frame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_jetgun_firing()
|
||||||
|
{
|
||||||
|
return abs( self get_jetgun_engine_direction() ) > 0.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_firing()
|
||||||
|
{
|
||||||
|
if ( !isDefined( self.jetsound_ent ) )
|
||||||
|
{
|
||||||
|
self.jetsound_ent = spawn( "script_origin", self.origin );
|
||||||
|
self.jetsound_ent linkto( self, "tag_origin" );
|
||||||
|
}
|
||||||
|
jetgun_fired = 0;
|
||||||
|
if ( self is_jetgun_firing() && jetgun_fired == 0 )
|
||||||
|
{
|
||||||
|
self.jetsound_ent playloopsound( "wpn_jetgun_effect_plr_loop", 0.8 );
|
||||||
|
self.jetsound_ent playsound( "wpn_jetgun_effect_plr_start" );
|
||||||
|
self notify( "jgun_snd" );
|
||||||
|
}
|
||||||
|
while ( self is_jetgun_firing() )
|
||||||
|
{
|
||||||
|
jetgun_fired = 1;
|
||||||
|
self thread jetgun_fired();
|
||||||
|
view_pos = self gettagorigin( "tag_flash" );
|
||||||
|
view_angles = self gettagangles( "tag_flash" );
|
||||||
|
if ( self get_jetgun_engine_direction() < 0 )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "jetgun_smoke_cloud" ], view_pos - self getplayerviewheight(), anglesToForward( view_angles ), anglesToUp( view_angles ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "jetgun_smoke_cloud" ], view_pos - self getplayerviewheight(), anglesToForward( view_angles ) * -1, anglesToUp( view_angles ) );
|
||||||
|
}
|
||||||
|
wait 0.25;
|
||||||
|
}
|
||||||
|
if ( jetgun_fired == 1 )
|
||||||
|
{
|
||||||
|
self.jetsound_ent stoploopsound( 0.5 );
|
||||||
|
self.jetsound_ent playsound( "wpn_jetgun_effect_plr_end" );
|
||||||
|
self.jetsound_ent thread sound_ent_cleanup();
|
||||||
|
jetgun_fired = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sound_ent_cleanup()
|
||||||
|
{
|
||||||
|
self endon( "jgun_snd" );
|
||||||
|
wait 4;
|
||||||
|
if ( isDefined( self.jetsound_ent ) )
|
||||||
|
{
|
||||||
|
self delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_fired()
|
||||||
|
{
|
||||||
|
if ( !self is_jetgun_firing() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
origin = self getweaponmuzzlepoint();
|
||||||
|
physicsjetthrust( origin, self getweaponforwarddir() * -1, level.zombie_vars[ "jetgun_grind_range" ], self get_jetgun_engine_direction(), 0.85 );
|
||||||
|
if ( !isDefined( level.jetgun_knockdown_enemies ) )
|
||||||
|
{
|
||||||
|
level.jetgun_knockdown_enemies = [];
|
||||||
|
level.jetgun_knockdown_gib = [];
|
||||||
|
level.jetgun_drag_enemies = [];
|
||||||
|
level.jetgun_fling_enemies = [];
|
||||||
|
level.jetgun_grind_enemies = [];
|
||||||
|
}
|
||||||
|
powerups = maps/mp/zombies/_zm_powerups::get_powerups();
|
||||||
|
if ( isDefined( powerups ) && powerups.size )
|
||||||
|
{
|
||||||
|
self thread try_pull_powerups( powerups );
|
||||||
|
}
|
||||||
|
self jetgun_get_enemies_in_range( self get_jetgun_engine_direction() );
|
||||||
|
level.jetgun_network_choke_count = 0;
|
||||||
|
_a408 = level.jetgun_fling_enemies;
|
||||||
|
index = getFirstArrayKey( _a408 );
|
||||||
|
while ( isDefined( index ) )
|
||||||
|
{
|
||||||
|
zombie = _a408[ index ];
|
||||||
|
jetgun_network_choke();
|
||||||
|
if ( isDefined( zombie ) )
|
||||||
|
{
|
||||||
|
zombie thread jetgun_fling_zombie( self, index );
|
||||||
|
}
|
||||||
|
index = getNextArrayKey( _a408, index );
|
||||||
|
}
|
||||||
|
_a418 = level.jetgun_drag_enemies;
|
||||||
|
_k418 = getFirstArrayKey( _a418 );
|
||||||
|
while ( isDefined( _k418 ) )
|
||||||
|
{
|
||||||
|
zombie = _a418[ _k418 ];
|
||||||
|
jetgun_network_choke();
|
||||||
|
if ( isDefined( zombie ) )
|
||||||
|
{
|
||||||
|
zombie.jetgun_owner = self;
|
||||||
|
zombie thread jetgun_drag_zombie( origin, -1 * self get_jetgun_engine_direction() );
|
||||||
|
}
|
||||||
|
_k418 = getNextArrayKey( _a418, _k418 );
|
||||||
|
}
|
||||||
|
level.jetgun_knockdown_enemies = [];
|
||||||
|
level.jetgun_knockdown_gib = [];
|
||||||
|
level.jetgun_drag_enemies = [];
|
||||||
|
level.jetgun_fling_enemies = [];
|
||||||
|
level.jetgun_grind_enemies = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
try_pull_powerups( powerups )
|
||||||
|
{
|
||||||
|
powerup_move_dist = level.zombie_vars[ "powerup_move_dist" ] * -1 * self get_jetgun_engine_direction();
|
||||||
|
powerup_range_squared = level.zombie_vars[ "powerup_drag_range" ] * level.zombie_vars[ "powerup_drag_range" ];
|
||||||
|
view_pos = self getweaponmuzzlepoint();
|
||||||
|
forward_view_angles = self getweaponforwarddir();
|
||||||
|
_a453 = powerups;
|
||||||
|
_k453 = getFirstArrayKey( _a453 );
|
||||||
|
while ( isDefined( _k453 ) )
|
||||||
|
{
|
||||||
|
powerup = _a453[ _k453 ];
|
||||||
|
if ( distancesquared( view_pos, powerup.origin ) > powerup_range_squared )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else normal = vectornormalize( powerup.origin - view_pos );
|
||||||
|
dot = vectordot( forward_view_angles, normal );
|
||||||
|
if ( abs( dot ) < 0.7 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
powerup notify( "move_powerup" );
|
||||||
|
}
|
||||||
|
_k453 = getNextArrayKey( _a453, _k453 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_get_enemies_in_range( invert )
|
||||||
|
{
|
||||||
|
view_pos = self getweaponmuzzlepoint();
|
||||||
|
zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, 3, level.zombie_vars[ "jetgun_drag_range" ] );
|
||||||
|
if ( !isDefined( zombies ) )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
knockdown_range_squared = level.zombie_vars[ "jetgun_knockdown_range" ] * level.zombie_vars[ "jetgun_knockdown_range" ];
|
||||||
|
drag_range_squared = level.zombie_vars[ "jetgun_drag_range" ] * level.zombie_vars[ "jetgun_drag_range" ];
|
||||||
|
gib_range_squared = level.zombie_vars[ "jetgun_gib_range" ] * level.zombie_vars[ "jetgun_gib_range" ];
|
||||||
|
grind_range_squared = level.zombie_vars[ "jetgun_grind_range" ] * level.zombie_vars[ "jetgun_grind_range" ];
|
||||||
|
cylinder_radius_squared = level.zombie_vars[ "jetgun_cylinder_radius" ] * level.zombie_vars[ "jetgun_cylinder_radius" ];
|
||||||
|
forward_view_angles = self getweaponforwarddir();
|
||||||
|
end_pos = view_pos + vectorScale( forward_view_angles, level.zombie_vars[ "jetgun_knockdown_range" ] );
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
if ( getDvarInt( #"BCDDAAFF" ) == 2 )
|
||||||
|
{
|
||||||
|
near_circle_pos = view_pos + vectorScale( forward_view_angles, 2 );
|
||||||
|
circle( near_circle_pos, level.zombie_vars[ "jetgun_cylinder_radius" ], ( 1, 0, 1 ), 0, 0, 100 );
|
||||||
|
line( near_circle_pos, end_pos, ( 1, 0, 1 ), 1, 0, 100 );
|
||||||
|
circle( end_pos, level.zombie_vars[ "jetgun_cylinder_radius" ], ( 1, 0, 1 ), 0, 0, 100 );
|
||||||
|
|
||||||
|
}
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
i = 0;
|
||||||
|
while ( i < zombies.size )
|
||||||
|
{
|
||||||
|
self jetgun_check_enemies_in_range( zombies[ i ], view_pos, drag_range_squared, gib_range_squared, grind_range_squared, cylinder_radius_squared, forward_view_angles, end_pos, invert );
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_check_enemies_in_range( zombie, view_pos, drag_range_squared, gib_range_squared, grind_range_squared, cylinder_radius_squared, forward_view_angles, end_pos, invert )
|
||||||
|
{
|
||||||
|
if ( !isDefined( zombie ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( !isDefined( zombie ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( zombie enemy_killed_by_jetgun() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( !isDefined( zombie.ai_state ) || zombie.ai_state != "find_flesh" && zombie.ai_state != "zombieMoveOnBus" )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( zombie.in_the_ground ) && zombie.in_the_ground )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( zombie.is_avogadro ) && zombie.is_avogadro )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( zombie.isdog ) && zombie.isdog )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( zombie.isscreecher ) && zombie.isscreecher )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.animname ) && self.animname == "quad_zombie" )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
test_origin = zombie getcentroid();
|
||||||
|
test_range_squared = distancesquared( view_pos, test_origin );
|
||||||
|
if ( test_range_squared > drag_range_squared )
|
||||||
|
{
|
||||||
|
zombie jetgun_debug_print( "range", ( 1, 0, 1 ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
normal = vectornormalize( test_origin - view_pos );
|
||||||
|
dot = vectordot( forward_view_angles, normal );
|
||||||
|
if ( abs( dot ) < 0.7 )
|
||||||
|
{
|
||||||
|
zombie jetgun_debug_print( "dot", ( 1, 0, 1 ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
|
||||||
|
if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
|
||||||
|
{
|
||||||
|
zombie jetgun_debug_print( "cylinder", ( 1, 0, 1 ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( zombie damageconetrace( view_pos, self ) == 0 )
|
||||||
|
{
|
||||||
|
zombie jetgun_debug_print( "cone", ( 1, 0, 1 ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
jetgun_blow_suck = invert;
|
||||||
|
if ( dot <= 0 )
|
||||||
|
{
|
||||||
|
jetgun_blow_suck *= -1;
|
||||||
|
}
|
||||||
|
if ( test_range_squared < grind_range_squared )
|
||||||
|
{
|
||||||
|
level.jetgun_fling_enemies[ level.jetgun_fling_enemies.size ] = zombie;
|
||||||
|
level.jetgun_grind_enemies[ level.jetgun_grind_enemies.size ] = dot < 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( test_range_squared < drag_range_squared && dot > 0 )
|
||||||
|
{
|
||||||
|
level.jetgun_drag_enemies[ level.jetgun_drag_enemies.size ] = zombie;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_debug_print( msg, color )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
if ( !getDvarInt( #"BCDDAAFF" ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( !isDefined( color ) )
|
||||||
|
{
|
||||||
|
color = ( 1, 0, 1 );
|
||||||
|
}
|
||||||
|
print3d( self.origin + vectorScale( ( 1, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_debug_print_on_ent( msg, color )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
if ( !getDvarInt( #"BCDDAAFF" ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( !isDefined( color ) )
|
||||||
|
{
|
||||||
|
color = ( 1, 0, 1 );
|
||||||
|
}
|
||||||
|
self notify( "new_jetgun_debug_print_on_ent" );
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "jetgun_end_drag_state" );
|
||||||
|
self endon( "new_jetgun_debug_print_on_ent" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
print3d( self.origin + vectorScale( ( 1, 0, 1 ), 60 ), msg, color, 1, 1 );
|
||||||
|
wait 0.05;
|
||||||
|
|
||||||
|
}
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
try_gibbing()
|
||||||
|
{
|
||||||
|
if ( isDefined( self ) && isDefined( self.a ) && isDefined( self.isscreecher ) && !self.isscreecher )
|
||||||
|
{
|
||||||
|
self.a.gib_ref = random( level.jetgun_gib_refs );
|
||||||
|
self thread maps/mp/animscripts/zm_death::do_gib();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_handle_death_notetracks( note )
|
||||||
|
{
|
||||||
|
if ( note == "jetgunned" )
|
||||||
|
{
|
||||||
|
self thread jetgun_grind_death_ending();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_grind_death_ending()
|
||||||
|
{
|
||||||
|
if ( !isDefined( self ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self hide();
|
||||||
|
wait 0.1;
|
||||||
|
self self_delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_grind_zombie( player )
|
||||||
|
{
|
||||||
|
player endon( "death" );
|
||||||
|
player endon( "disconnect" );
|
||||||
|
self endon( "death" );
|
||||||
|
if ( !isDefined( self.jetgun_grind ) )
|
||||||
|
{
|
||||||
|
self.jetgun_grind = 1;
|
||||||
|
self notify( "grinding" );
|
||||||
|
player set_jetgun_engine_direction( 0.5 * player get_jetgun_engine_direction() );
|
||||||
|
if ( is_mature() )
|
||||||
|
{
|
||||||
|
if ( isDefined( level._effect[ "zombie_guts_explosion" ] ) )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "zombie_guts_explosion" ], self gettagorigin( "J_SpineLower" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.nodeathragdoll = 1;
|
||||||
|
self.handle_death_notetracks = ::jetgun_handle_death_notetracks;
|
||||||
|
self dodamage( self.health + 666, player.origin, player );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_fling_zombie( player, index )
|
||||||
|
{
|
||||||
|
if ( !isDefined( self ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.jetgun_fling_func ) )
|
||||||
|
{
|
||||||
|
self [[ self.jetgun_fling_func ]]( player );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
was_alive = isalive( self );
|
||||||
|
if ( was_alive )
|
||||||
|
{
|
||||||
|
self.jetgun_fling = 1;
|
||||||
|
self notify( "flinging" );
|
||||||
|
deathanim = undefined;
|
||||||
|
if ( is_mature() )
|
||||||
|
{
|
||||||
|
player weaponplayejectbrass();
|
||||||
|
}
|
||||||
|
if ( isDefined( self.has_legs ) && self.has_legs )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.jetgun_drag_state ) && self.jetgun_drag_state == "jetgun_sprint" )
|
||||||
|
{
|
||||||
|
deathanim = "zm_jetgun_sprint_death";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deathanim = "zm_jetgun_death";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deathanim = "zm_jetgun_death_crawl";
|
||||||
|
}
|
||||||
|
self.deathanim = deathanim;
|
||||||
|
player playsound( "evt_jetgun_zmb_suck" );
|
||||||
|
}
|
||||||
|
self thread jetgun_grind_zombie( player );
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_drag_zombie( vdir, speed )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.jetgun_drag_func ) )
|
||||||
|
{
|
||||||
|
self [[ self.jetgun_drag_func ]]( vdir, speed );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self zombie_do_drag( vdir, speed );
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_knockdown_zombie( player, gib )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
return;
|
||||||
|
if ( isDefined( self.jetgun_knockdown_func ) )
|
||||||
|
{
|
||||||
|
self [[ self.jetgun_knockdown_func ]]( player, gib );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self dodamage( level.zombie_vars[ "jetgun_knockdown_damage" ], player.origin, player );
|
||||||
|
}
|
||||||
|
if ( gib )
|
||||||
|
{
|
||||||
|
self.a.gib_ref = random( level.jetgun_gib_refs );
|
||||||
|
self thread maps/mp/animscripts/zm_death::do_gib();
|
||||||
|
}
|
||||||
|
self.jetgun_handle_pain_notetracks = ::handle_jetgun_pain_notetracks;
|
||||||
|
self dodamage( level.zombie_vars[ "jetgun_knockdown_damage" ], player.origin, player );
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_jetgun_pain_notetracks( note )
|
||||||
|
{
|
||||||
|
if ( note == "zombie_knockdown_ground_impact" )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "jetgun_knockdown_ground" ], self.origin, anglesToForward( self.angles ), anglesToUp( self.angles ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_jetgun_damage()
|
||||||
|
{
|
||||||
|
if ( isDefined( self.damageweapon ) && self.damageweapon != "jetgun_zm" && self.damageweapon == "jetgun_upgraded_zm" )
|
||||||
|
{
|
||||||
|
if ( self.damagemod != "MOD_GRENADE" )
|
||||||
|
{
|
||||||
|
return self.damagemod != "MOD_GRENADE_SPLASH";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enemy_killed_by_jetgun()
|
||||||
|
{
|
||||||
|
if ( isDefined( self.jetgun_fling ) && !self.jetgun_fling )
|
||||||
|
{
|
||||||
|
if ( isDefined( self.jetgun_grind ) )
|
||||||
|
{
|
||||||
|
return self.jetgun_grind;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_do_drag( vdir, speed )
|
||||||
|
{
|
||||||
|
if ( !self zombie_is_in_drag_state() )
|
||||||
|
{
|
||||||
|
self zombie_enter_drag_state( vdir, speed );
|
||||||
|
self thread zombie_drag_think();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self zombie_keep_in_drag_state( vdir, speed );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_is_in_drag_state()
|
||||||
|
{
|
||||||
|
if ( isDefined( self.drag_state ) )
|
||||||
|
{
|
||||||
|
return self.drag_state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_should_stay_in_drag_state()
|
||||||
|
{
|
||||||
|
if ( !isDefined( self ) || !isalive( self ) )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.jetgun_owner ) || self.jetgun_owner getcurrentweapon() != "jetgun_zm" && !self.jetgun_owner is_jetgun_firing() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( isDefined( self.drag_state ) && self.drag_state )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_keep_in_drag_state( vdir, speed )
|
||||||
|
{
|
||||||
|
self.drag_start_time = getTime();
|
||||||
|
self.drag_target = vdir;
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_enter_drag_state( vdir, speed )
|
||||||
|
{
|
||||||
|
self.drag_state = 1;
|
||||||
|
self.jetgun_drag_state = "unaffected";
|
||||||
|
if ( isDefined( self.is_traversing ) )
|
||||||
|
{
|
||||||
|
self.was_traversing = self.is_traversing;
|
||||||
|
}
|
||||||
|
self notify( "killanimscript" );
|
||||||
|
self zombie_keep_in_drag_state( vdir, speed );
|
||||||
|
self.zombie_move_speed_pre_jetgun_drag = self.zombie_move_speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_exit_drag_state()
|
||||||
|
{
|
||||||
|
self notify( "jetgun_end_drag_state" );
|
||||||
|
self.drag_state = 0;
|
||||||
|
self.jetgun_drag_state = "unaffected";
|
||||||
|
self.needs_run_update = 1;
|
||||||
|
if ( isDefined( self.zombie_move_speed_pre_jetgun_drag ) )
|
||||||
|
{
|
||||||
|
self set_zombie_run_cycle( self.zombie_move_speed_pre_jetgun_drag );
|
||||||
|
self.zombie_move_speed_pre_jetgun_drag = undefined;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self set_zombie_run_cycle();
|
||||||
|
}
|
||||||
|
if ( isDefined( self.isdog ) && !self.isdog )
|
||||||
|
{
|
||||||
|
self maps/mp/animscripts/zm_run::moverun();
|
||||||
|
}
|
||||||
|
if ( isDefined( self.was_traversing ) && self.was_traversing )
|
||||||
|
{
|
||||||
|
self traversemode( "gravity" );
|
||||||
|
self.a.nodeath = 0;
|
||||||
|
self maps/mp/animscripts/zm_run::needsupdate();
|
||||||
|
if ( !self.isdog )
|
||||||
|
{
|
||||||
|
self maps/mp/animscripts/zm_run::moverun();
|
||||||
|
}
|
||||||
|
self.is_traversing = 0;
|
||||||
|
self notify( "zombie_end_traverse" );
|
||||||
|
if ( is_mature() )
|
||||||
|
{
|
||||||
|
if ( isDefined( level._effect[ "zombie_guts_explosion" ] ) )
|
||||||
|
{
|
||||||
|
playfx( level._effect[ "zombie_guts_explosion" ], self gettagorigin( "J_SpineLower" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.nodeathragdoll = 1;
|
||||||
|
self dodamage( self.health + 666, self.origin, self );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aiphysicstrace( start, end )
|
||||||
|
{
|
||||||
|
result = physicstrace( start, end, ( 1, 0, 1 ), ( 1, 0, 1 ), self );
|
||||||
|
return result[ "position" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_drag_think()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "flinging" );
|
||||||
|
self endon( "grinding" );
|
||||||
|
while ( self zombie_should_stay_in_drag_state() )
|
||||||
|
{
|
||||||
|
self._distance_to_jetgun_owner = distancesquared( self.origin, self.jetgun_owner.origin );
|
||||||
|
jetgun_network_choke();
|
||||||
|
if ( self.zombie_move_speed == "sprint" || self._distance_to_jetgun_owner < level.jetgun_pulled_in_range )
|
||||||
|
{
|
||||||
|
self jetgun_drag_set( "jetgun_sprint", "jetgun_walk_fast_crawl" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( self._distance_to_jetgun_owner < level.jetgun_pulling_in_range )
|
||||||
|
{
|
||||||
|
self jetgun_drag_set( "jetgun_walk_fast", "jetgun_walk_fast" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if ( self._distance_to_jetgun_owner < level.jetgun_inner_range )
|
||||||
|
{
|
||||||
|
self jetgun_drag_set( "jetgun_walk", "jetgun_walk_slow_crawl" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( self._distance_to_jetgun_owner < level.jetgun_outer_edge )
|
||||||
|
{
|
||||||
|
self jetgun_drag_set( "jetgun_walk_slow", "jetgun_walk_slow_crawl" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait 0.1;
|
||||||
|
}
|
||||||
|
self thread zombie_exit_drag_state();
|
||||||
|
}
|
||||||
|
|
||||||
|
jetgun_drag_set( legsanim, crawlanim )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self.needs_run_update = 1;
|
||||||
|
if ( self.has_legs )
|
||||||
|
{
|
||||||
|
self._had_legs = 1;
|
||||||
|
self set_zombie_run_cycle( legsanim );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self._had_legs = 0;
|
||||||
|
self set_zombie_run_cycle( crawlanim );
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
if ( self.jetgun_drag_state != legsanim )
|
||||||
|
{
|
||||||
|
self thread jetgun_debug_print_on_ent( legsanim, ( 1, 0, 1 ) );
|
||||||
|
|
||||||
|
}
|
||||||
|
self.jetgun_drag_state = legsanim;
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
zombie_drag_radius()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
self endon( "death_or_disconnect" );
|
||||||
|
self endon( "weapon_change" );
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
circle( self.origin, level.zombie_vars[ "jetgun_grind_range" ], vectorScale( ( 1, 0, 1 ), 0.5 ) );
|
||||||
|
circle( self.origin, level.zombie_vars[ "jetgun_drag_range" ] / 8, ( 1, 0, 1 ) );
|
||||||
|
circle( self.origin, level.zombie_vars[ "jetgun_drag_range" ] / 4, ( 1, 0, 1 ) );
|
||||||
|
circle( self.origin, level.zombie_vars[ "jetgun_drag_range" ] / 2, ( 1, 0, 1 ) );
|
||||||
|
circle( self.origin, level.zombie_vars[ "jetgun_drag_range" ], ( 1, 0, 1 ) );
|
||||||
|
wait 0.05;
|
||||||
|
|
||||||
|
}
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user