mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-29 03:57:51 -05:00
[Zombie Core] Replaced all scripts with scripts decompiled by...
Xensik's gsc-tool.
This commit is contained in:
@ -1,216 +1,201 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
setmodelfromarray( a )
|
||||
{
|
||||
self setmodel( a[ randomint( a.size ) ] );
|
||||
self setmodel( a[randomint( a.size )] );
|
||||
}
|
||||
|
||||
precachemodelarray( a )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < a.size )
|
||||
{
|
||||
precachemodel( a[ i ] );
|
||||
i++;
|
||||
}
|
||||
for ( i = 0; i < a.size; i++ )
|
||||
precachemodel( a[i] );
|
||||
}
|
||||
|
||||
randomelement( a )
|
||||
{
|
||||
return a[ randomint( a.size ) ];
|
||||
return a[randomint( a.size )];
|
||||
}
|
||||
|
||||
attachfromarray( a )
|
||||
{
|
||||
self attach( randomelement( a ), "", 1 );
|
||||
self attach( randomelement( a ), "", 1 );
|
||||
}
|
||||
|
||||
new()
|
||||
{
|
||||
self detachall();
|
||||
oldgunhand = self.anim_gunhand;
|
||||
if ( !isDefined( oldgunhand ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.anim_gunhand = "none";
|
||||
self [[ anim.putguninhand ]]( oldgunhand );
|
||||
self detachall();
|
||||
oldgunhand = self.anim_gunhand;
|
||||
|
||||
if ( !isdefined( oldgunhand ) )
|
||||
return;
|
||||
|
||||
self.anim_gunhand = "none";
|
||||
self [[ anim.putguninhand ]]( oldgunhand );
|
||||
}
|
||||
|
||||
save()
|
||||
{
|
||||
info[ "gunHand" ] = self.anim_gunhand;
|
||||
info[ "gunInHand" ] = self.anim_guninhand;
|
||||
info[ "model" ] = self.model;
|
||||
info[ "hatModel" ] = self.hatmodel;
|
||||
info[ "gearModel" ] = self.gearmodel;
|
||||
if ( isDefined( self.name ) )
|
||||
{
|
||||
info[ "name" ] = self.name;
|
||||
info["gunHand"] = self.anim_gunhand;
|
||||
info["gunInHand"] = self.anim_guninhand;
|
||||
info["model"] = self.model;
|
||||
info["hatModel"] = self.hatmodel;
|
||||
info["gearModel"] = self.gearmodel;
|
||||
|
||||
if ( isdefined( self.name ) )
|
||||
{
|
||||
info["name"] = self.name;
|
||||
/#
|
||||
println( "Save: Guy has name ", self.name );
|
||||
println( "Save: Guy has name ", self.name );
|
||||
#/
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "save: Guy had no name!" );
|
||||
println( "save: Guy had no name!" );
|
||||
#/
|
||||
}
|
||||
attachsize = self getattachsize();
|
||||
i = 0;
|
||||
while ( i < attachsize )
|
||||
{
|
||||
info[ "attach" ][ i ][ "model" ] = self getattachmodelname( i );
|
||||
info[ "attach" ][ i ][ "tag" ] = self getattachtagname( i );
|
||||
i++;
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
attachsize = self getattachsize();
|
||||
|
||||
for ( i = 0; i < attachsize; i++ )
|
||||
{
|
||||
info["attach"][i]["model"] = self getattachmodelname( i );
|
||||
info["attach"][i]["tag"] = self getattachtagname( i );
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
load( info )
|
||||
{
|
||||
self detachall();
|
||||
self.anim_gunhand = info[ "gunHand" ];
|
||||
self.anim_guninhand = info[ "gunInHand" ];
|
||||
self setmodel( info[ "model" ] );
|
||||
self.hatmodel = info[ "hatModel" ];
|
||||
self.gearmodel = info[ "gearModel" ];
|
||||
if ( isDefined( info[ "name" ] ) )
|
||||
{
|
||||
self.name = info[ "name" ];
|
||||
self detachall();
|
||||
self.anim_gunhand = info["gunHand"];
|
||||
self.anim_guninhand = info["gunInHand"];
|
||||
self setmodel( info["model"] );
|
||||
self.hatmodel = info["hatModel"];
|
||||
self.gearmodel = info["gearModel"];
|
||||
|
||||
if ( isdefined( info["name"] ) )
|
||||
{
|
||||
self.name = info["name"];
|
||||
/#
|
||||
println( "Load: Guy has name ", self.name );
|
||||
println( "Load: Guy has name ", self.name );
|
||||
#/
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "Load: Guy had no name!" );
|
||||
println( "Load: Guy had no name!" );
|
||||
#/
|
||||
}
|
||||
attachinfo = info[ "attach" ];
|
||||
attachsize = attachinfo.size;
|
||||
i = 0;
|
||||
while ( i < attachsize )
|
||||
{
|
||||
self attach( attachinfo[ i ][ "model" ], attachinfo[ i ][ "tag" ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
attachinfo = info["attach"];
|
||||
attachsize = attachinfo.size;
|
||||
|
||||
for ( i = 0; i < attachsize; i++ )
|
||||
self attach( attachinfo[i]["model"], attachinfo[i]["tag"] );
|
||||
}
|
||||
|
||||
precache( info )
|
||||
{
|
||||
if ( isDefined( info[ "name" ] ) )
|
||||
{
|
||||
if ( isdefined( info["name"] ) )
|
||||
{
|
||||
/#
|
||||
println( "Precache: Guy has name ", info[ "name" ] );
|
||||
println( "Precache: Guy has name ", info["name"] );
|
||||
#/
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "Precache: Guy had no name!" );
|
||||
println( "Precache: Guy had no name!" );
|
||||
#/
|
||||
}
|
||||
precachemodel( info[ "model" ] );
|
||||
attachinfo = info[ "attach" ];
|
||||
attachsize = attachinfo.size;
|
||||
i = 0;
|
||||
while ( i < attachsize )
|
||||
{
|
||||
precachemodel( attachinfo[ i ][ "model" ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
precachemodel( info["model"] );
|
||||
attachinfo = info["attach"];
|
||||
attachsize = attachinfo.size;
|
||||
|
||||
for ( i = 0; i < attachsize; i++ )
|
||||
precachemodel( attachinfo[i]["model"] );
|
||||
}
|
||||
|
||||
get_random_character( amount )
|
||||
{
|
||||
self_info = strtok( self.classname, "_" );
|
||||
if ( self_info.size <= 2 )
|
||||
{
|
||||
return randomint( amount );
|
||||
}
|
||||
group = "auto";
|
||||
index = undefined;
|
||||
prefix = self_info[ 2 ];
|
||||
if ( isDefined( self.script_char_index ) )
|
||||
{
|
||||
index = self.script_char_index;
|
||||
}
|
||||
if ( isDefined( self.script_char_group ) )
|
||||
{
|
||||
type = "grouped";
|
||||
group = "group_" + self.script_char_group;
|
||||
}
|
||||
if ( !isDefined( level.character_index_cache ) )
|
||||
{
|
||||
level.character_index_cache = [];
|
||||
}
|
||||
if ( !isDefined( level.character_index_cache[ prefix ] ) )
|
||||
{
|
||||
level.character_index_cache[ prefix ] = [];
|
||||
}
|
||||
if ( !isDefined( level.character_index_cache[ prefix ][ group ] ) )
|
||||
{
|
||||
initialize_character_group( prefix, group, amount );
|
||||
}
|
||||
if ( !isDefined( index ) )
|
||||
{
|
||||
index = get_least_used_index( prefix, group );
|
||||
if ( !isDefined( index ) )
|
||||
{
|
||||
index = randomint( 5000 );
|
||||
}
|
||||
}
|
||||
while ( index >= amount )
|
||||
{
|
||||
index -= amount;
|
||||
}
|
||||
level.character_index_cache[ prefix ][ group ][ index ]++;
|
||||
return index;
|
||||
self_info = strtok( self.classname, "_" );
|
||||
|
||||
if ( self_info.size <= 2 )
|
||||
return randomint( amount );
|
||||
|
||||
group = "auto";
|
||||
index = undefined;
|
||||
prefix = self_info[2];
|
||||
|
||||
if ( isdefined( self.script_char_index ) )
|
||||
index = self.script_char_index;
|
||||
|
||||
if ( isdefined( self.script_char_group ) )
|
||||
{
|
||||
type = "grouped";
|
||||
group = "group_" + self.script_char_group;
|
||||
}
|
||||
|
||||
if ( !isdefined( level.character_index_cache ) )
|
||||
level.character_index_cache = [];
|
||||
|
||||
if ( !isdefined( level.character_index_cache[prefix] ) )
|
||||
level.character_index_cache[prefix] = [];
|
||||
|
||||
if ( !isdefined( level.character_index_cache[prefix][group] ) )
|
||||
initialize_character_group( prefix, group, amount );
|
||||
|
||||
if ( !isdefined( index ) )
|
||||
{
|
||||
index = get_least_used_index( prefix, group );
|
||||
|
||||
if ( !isdefined( index ) )
|
||||
index = randomint( 5000 );
|
||||
}
|
||||
|
||||
while ( index >= amount )
|
||||
index -= amount;
|
||||
|
||||
level.character_index_cache[prefix][group][index]++;
|
||||
return index;
|
||||
}
|
||||
|
||||
get_least_used_index( prefix, group )
|
||||
{
|
||||
lowest_indices = [];
|
||||
lowest_use = level.character_index_cache[ prefix ][ group ][ 0 ];
|
||||
lowest_indices[ 0 ] = 0;
|
||||
i = 1;
|
||||
while ( i < level.character_index_cache[ prefix ][ group ].size )
|
||||
{
|
||||
if ( level.character_index_cache[ prefix ][ group ][ i ] > lowest_use )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.character_index_cache[ prefix ][ group ][ i ] < lowest_use )
|
||||
{
|
||||
lowest_indices = [];
|
||||
lowest_use = level.character_index_cache[ prefix ][ group ][ i ];
|
||||
}
|
||||
lowest_indices[ lowest_indices.size ] = i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
lowest_indices = [];
|
||||
lowest_use = level.character_index_cache[prefix][group][0];
|
||||
lowest_indices[0] = 0;
|
||||
|
||||
for ( i = 1; i < level.character_index_cache[prefix][group].size; i++ )
|
||||
{
|
||||
if ( level.character_index_cache[prefix][group][i] > lowest_use )
|
||||
continue;
|
||||
|
||||
if ( level.character_index_cache[prefix][group][i] < lowest_use )
|
||||
{
|
||||
lowest_indices = [];
|
||||
lowest_use = level.character_index_cache[prefix][group][i];
|
||||
}
|
||||
|
||||
lowest_indices[lowest_indices.size] = i;
|
||||
}
|
||||
/#
|
||||
assert( lowest_indices.size, "Tried to spawn a character but the lowest indices didn't exist" );
|
||||
assert( lowest_indices.size, "Tried to spawn a character but the lowest indices didn't exist" );
|
||||
#/
|
||||
return random( lowest_indices );
|
||||
return random( lowest_indices );
|
||||
}
|
||||
|
||||
initialize_character_group( prefix, group, amount )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < amount )
|
||||
{
|
||||
level.character_index_cache[ prefix ][ group ][ i ] = 0;
|
||||
i++;
|
||||
}
|
||||
for ( i = 0; i < amount; i++ )
|
||||
level.character_index_cache[prefix][group][i] = 0;
|
||||
}
|
||||
|
||||
random( array )
|
||||
{
|
||||
return array[ randomint( array.size ) ];
|
||||
return array[randomint( array.size )];
|
||||
}
|
||||
|
@ -1,23 +1,26 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
/#
|
||||
assert( isDefined( self ) );
|
||||
assert( isdefined( self ) );
|
||||
#/
|
||||
wait 0;
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
wait 0;
|
||||
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
/#
|
||||
if ( isDefined( self.classname ) )
|
||||
{
|
||||
if ( self.classname != "trigger_once" || self.classname == "trigger_radius" && self.classname == "trigger_multiple" )
|
||||
{
|
||||
println( "" );
|
||||
println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin );
|
||||
println( "" );
|
||||
if ( isdefined( self.classname ) )
|
||||
{
|
||||
if ( self.classname == "trigger_once" || self.classname == "trigger_radius" || self.classname == "trigger_multiple" )
|
||||
{
|
||||
println( "" );
|
||||
println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin );
|
||||
println( "" );
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
self delete();
|
||||
}
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
|
@ -1,41 +1,29 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
initstructs()
|
||||
{
|
||||
level.struct = [];
|
||||
level.struct = [];
|
||||
}
|
||||
|
||||
createstruct()
|
||||
{
|
||||
struct = spawnstruct();
|
||||
level.struct[ level.struct.size ] = struct;
|
||||
return struct;
|
||||
struct = spawnstruct();
|
||||
level.struct[level.struct.size] = struct;
|
||||
return struct;
|
||||
}
|
||||
|
||||
findstruct( position )
|
||||
{
|
||||
_a20 = level.struct_class_names;
|
||||
key = getFirstArrayKey( _a20 );
|
||||
while ( isDefined( key ) )
|
||||
{
|
||||
_ = _a20[ key ];
|
||||
_a22 = level.struct_class_names[ key ];
|
||||
val = getFirstArrayKey( _a22 );
|
||||
while ( isDefined( val ) )
|
||||
{
|
||||
s_array = _a22[ val ];
|
||||
_a24 = s_array;
|
||||
_k24 = getFirstArrayKey( _a24 );
|
||||
while ( isDefined( _k24 ) )
|
||||
{
|
||||
struct = _a24[ _k24 ];
|
||||
if ( distancesquared( struct.origin, position ) < 1 )
|
||||
{
|
||||
return struct;
|
||||
}
|
||||
_k24 = getNextArrayKey( _a24, _k24 );
|
||||
}
|
||||
val = getNextArrayKey( _a22, val );
|
||||
}
|
||||
key = getNextArrayKey( _a20, key );
|
||||
}
|
||||
foreach ( key, _ in level.struct_class_names )
|
||||
{
|
||||
foreach ( val, s_array in level.struct_class_names[key] )
|
||||
{
|
||||
foreach ( struct in s_array )
|
||||
{
|
||||
if ( distancesquared( struct.origin, position ) < 1 )
|
||||
return struct;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,56 +1,61 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread init_serverfaceanim();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread init_serverfaceanim();
|
||||
}
|
||||
}
|
||||
|
||||
init_serverfaceanim()
|
||||
{
|
||||
self.do_face_anims = 1;
|
||||
if ( !isDefined( level.face_event_handler ) )
|
||||
{
|
||||
level.face_event_handler = spawnstruct();
|
||||
level.face_event_handler.events = [];
|
||||
level.face_event_handler.events[ "death" ] = "face_death";
|
||||
level.face_event_handler.events[ "grenade danger" ] = "face_alert";
|
||||
level.face_event_handler.events[ "bulletwhizby" ] = "face_alert";
|
||||
level.face_event_handler.events[ "projectile_impact" ] = "face_alert";
|
||||
level.face_event_handler.events[ "explode" ] = "face_alert";
|
||||
level.face_event_handler.events[ "alert" ] = "face_alert";
|
||||
level.face_event_handler.events[ "shoot" ] = "face_shoot_single";
|
||||
level.face_event_handler.events[ "melee" ] = "face_melee";
|
||||
level.face_event_handler.events[ "damage" ] = "face_pain";
|
||||
level thread wait_for_face_event();
|
||||
}
|
||||
self.do_face_anims = 1;
|
||||
|
||||
if ( !isdefined( level.face_event_handler ) )
|
||||
{
|
||||
level.face_event_handler = spawnstruct();
|
||||
level.face_event_handler.events = [];
|
||||
level.face_event_handler.events["death"] = "face_death";
|
||||
level.face_event_handler.events["grenade danger"] = "face_alert";
|
||||
level.face_event_handler.events["bulletwhizby"] = "face_alert";
|
||||
level.face_event_handler.events["projectile_impact"] = "face_alert";
|
||||
level.face_event_handler.events["explode"] = "face_alert";
|
||||
level.face_event_handler.events["alert"] = "face_alert";
|
||||
level.face_event_handler.events["shoot"] = "face_shoot_single";
|
||||
level.face_event_handler.events["melee"] = "face_melee";
|
||||
level.face_event_handler.events["damage"] = "face_pain";
|
||||
level thread wait_for_face_event();
|
||||
}
|
||||
}
|
||||
|
||||
wait_for_face_event()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "face", face_notify, ent );
|
||||
if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isDefined( level.face_event_handler.events[ face_notify ] ) )
|
||||
{
|
||||
ent sendfaceevent( level.face_event_handler.events[ face_notify ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "face", face_notify, ent );
|
||||
|
||||
if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isdefined( level.face_event_handler.events[face_notify] ) )
|
||||
ent sendfaceevent( level.face_event_handler.events[face_notify] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,378 +1,367 @@
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "zombie_cymbal_monkey" );
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_laststand;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !cymbal_monkey_exists() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !cymbal_monkey_exists() )
|
||||
return;
|
||||
/#
|
||||
level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey;
|
||||
level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey;
|
||||
#/
|
||||
level._effect[ "monkey_glow" ] = loadfx( "maps/zombie/fx_zombie_monkey_light" );
|
||||
level._effect[ "grenade_samantha_steal" ] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" );
|
||||
level.cymbal_monkeys = [];
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
level._effect["monkey_glow"] = loadfx( "maps/zombie/fx_zombie_monkey_light" );
|
||||
level._effect["grenade_samantha_steal"] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" );
|
||||
level.cymbal_monkeys = [];
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
||||
player_give_cymbal_monkey()
|
||||
{
|
||||
self giveweapon( "cymbal_monkey_zm" );
|
||||
self set_player_tactical_grenade( "cymbal_monkey_zm" );
|
||||
self thread player_handle_cymbal_monkey();
|
||||
self giveweapon( "cymbal_monkey_zm" );
|
||||
self set_player_tactical_grenade( "cymbal_monkey_zm" );
|
||||
self thread player_handle_cymbal_monkey();
|
||||
}
|
||||
|
||||
player_handle_cymbal_monkey()
|
||||
{
|
||||
self notify( "starting_monkey_watch" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
attract_dist_diff = level.monkey_attract_dist_diff;
|
||||
if ( !isDefined( attract_dist_diff ) )
|
||||
{
|
||||
attract_dist_diff = 45;
|
||||
}
|
||||
num_attractors = level.num_monkey_attractors;
|
||||
if ( !isDefined( num_attractors ) )
|
||||
{
|
||||
num_attractors = 96;
|
||||
}
|
||||
max_attract_dist = level.monkey_attract_dist;
|
||||
if ( !isDefined( max_attract_dist ) )
|
||||
{
|
||||
max_attract_dist = 1536;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
grenade = get_thrown_monkey();
|
||||
self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff );
|
||||
wait 0,05;
|
||||
}
|
||||
self notify( "starting_monkey_watch" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
attract_dist_diff = level.monkey_attract_dist_diff;
|
||||
|
||||
if ( !isdefined( attract_dist_diff ) )
|
||||
attract_dist_diff = 45;
|
||||
|
||||
num_attractors = level.num_monkey_attractors;
|
||||
|
||||
if ( !isdefined( num_attractors ) )
|
||||
num_attractors = 96;
|
||||
|
||||
max_attract_dist = level.monkey_attract_dist;
|
||||
|
||||
if ( !isdefined( max_attract_dist ) )
|
||||
max_attract_dist = 1536;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
grenade = get_thrown_monkey();
|
||||
self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
watch_for_dud( model )
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "grenade_dud" );
|
||||
model.dud = 1;
|
||||
self playsound( "zmb_vox_monkey_scream" );
|
||||
self.monk_scream_vox = 1;
|
||||
wait 3;
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model delete();
|
||||
}
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self delete();
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "grenade_dud" );
|
||||
|
||||
model.dud = 1;
|
||||
self playsound( "zmb_vox_monkey_scream" );
|
||||
self.monk_scream_vox = 1;
|
||||
wait 3;
|
||||
|
||||
if ( isdefined( model ) )
|
||||
model delete();
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self delete();
|
||||
}
|
||||
|
||||
#using_animtree("zombie_cymbal_monkey");
|
||||
|
||||
watch_for_emp( model )
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "emp_detonate", origin, radius );
|
||||
if ( distancesquared( origin, self.origin ) < ( radius * radius ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self.stun_fx = 1;
|
||||
if ( isDefined( level._equipment_emp_destroy_fx ) )
|
||||
{
|
||||
playfx( level._equipment_emp_destroy_fx, self.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) );
|
||||
}
|
||||
wait 0,15;
|
||||
self.attract_to_origin = 0;
|
||||
self deactivate_zombie_point_of_interest();
|
||||
model clearanim( %o_monkey_bomb, 0 );
|
||||
wait 1;
|
||||
self detonate();
|
||||
wait 1;
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model delete();
|
||||
}
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self delete();
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "emp_detonate", origin, radius );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) < radius * radius )
|
||||
break;
|
||||
}
|
||||
|
||||
self.stun_fx = 1;
|
||||
|
||||
if ( isdefined( level._equipment_emp_destroy_fx ) )
|
||||
playfx( level._equipment_emp_destroy_fx, self.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), ( 0, randomfloat( 360 ), 0 ) );
|
||||
|
||||
wait 0.15;
|
||||
self.attract_to_origin = 0;
|
||||
self deactivate_zombie_point_of_interest();
|
||||
model clearanim( %o_monkey_bomb, 0 );
|
||||
wait 1;
|
||||
self detonate();
|
||||
wait 1;
|
||||
|
||||
if ( isdefined( model ) )
|
||||
model delete();
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self delete();
|
||||
}
|
||||
|
||||
player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
if ( isDefined( grenade ) )
|
||||
{
|
||||
grenade endon( "death" );
|
||||
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
grenade delete();
|
||||
return;
|
||||
}
|
||||
grenade hide();
|
||||
model = spawn( "script_model", grenade.origin );
|
||||
model setmodel( "weapon_zombie_monkey_bomb" );
|
||||
model useanimtree( -1 );
|
||||
model linkto( grenade );
|
||||
model.angles = grenade.angles;
|
||||
model thread monkey_cleanup( grenade );
|
||||
grenade thread watch_for_dud( model );
|
||||
grenade thread watch_for_emp( model );
|
||||
info = spawnstruct();
|
||||
info.sound_attractors = [];
|
||||
grenade thread monitor_zombie_groans( info );
|
||||
grenade waittill( "stationary" );
|
||||
if ( isDefined( level.grenade_planted ) )
|
||||
{
|
||||
self thread [[ level.grenade_planted ]]( grenade, model );
|
||||
}
|
||||
if ( isDefined( grenade ) )
|
||||
{
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model setanim( %o_monkey_bomb );
|
||||
if ( isDefined( grenade.backlinked ) && !grenade.backlinked )
|
||||
{
|
||||
model unlink();
|
||||
model.origin = grenade.origin;
|
||||
model.angles = grenade.angles;
|
||||
}
|
||||
}
|
||||
grenade resetmissiledetonationtime();
|
||||
playfxontag( level._effect[ "monkey_glow" ], model, "origin_animate_jnt" );
|
||||
valid_poi = check_point_in_active_zone( grenade.origin );
|
||||
if ( valid_poi )
|
||||
{
|
||||
grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 );
|
||||
grenade.attract_to_origin = 1;
|
||||
grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff );
|
||||
grenade thread wait_for_attractor_positions_complete();
|
||||
grenade thread do_monkey_sound( model, info );
|
||||
level.cymbal_monkeys[ level.cymbal_monkeys.size ] = grenade;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenade.script_noteworthy = undefined;
|
||||
level thread grenade_stolen_by_sam( grenade, model );
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenade.script_noteworthy = undefined;
|
||||
level thread grenade_stolen_by_sam( grenade, model );
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
|
||||
if ( isdefined( grenade ) )
|
||||
{
|
||||
grenade endon( "death" );
|
||||
|
||||
if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
grenade delete();
|
||||
return;
|
||||
}
|
||||
|
||||
grenade hide();
|
||||
model = spawn( "script_model", grenade.origin );
|
||||
model setmodel( "weapon_zombie_monkey_bomb" );
|
||||
model useanimtree( -1 );
|
||||
model linkto( grenade );
|
||||
model.angles = grenade.angles;
|
||||
model thread monkey_cleanup( grenade );
|
||||
grenade thread watch_for_dud( model );
|
||||
grenade thread watch_for_emp( model );
|
||||
info = spawnstruct();
|
||||
info.sound_attractors = [];
|
||||
grenade thread monitor_zombie_groans( info );
|
||||
|
||||
grenade waittill( "stationary" );
|
||||
|
||||
if ( isdefined( level.grenade_planted ) )
|
||||
self thread [[ level.grenade_planted ]]( grenade, model );
|
||||
|
||||
if ( isdefined( grenade ) )
|
||||
{
|
||||
if ( isdefined( model ) )
|
||||
{
|
||||
model setanim( %o_monkey_bomb );
|
||||
|
||||
if ( !( isdefined( grenade.backlinked ) && grenade.backlinked ) )
|
||||
{
|
||||
model unlink();
|
||||
model.origin = grenade.origin;
|
||||
model.angles = grenade.angles;
|
||||
}
|
||||
}
|
||||
|
||||
grenade resetmissiledetonationtime();
|
||||
playfxontag( level._effect["monkey_glow"], model, "origin_animate_jnt" );
|
||||
valid_poi = check_point_in_active_zone( grenade.origin );
|
||||
|
||||
if ( valid_poi )
|
||||
{
|
||||
grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 );
|
||||
grenade.attract_to_origin = 1;
|
||||
grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff );
|
||||
grenade thread wait_for_attractor_positions_complete();
|
||||
grenade thread do_monkey_sound( model, info );
|
||||
level.cymbal_monkeys[level.cymbal_monkeys.size] = grenade;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenade.script_noteworthy = undefined;
|
||||
level thread grenade_stolen_by_sam( grenade, model );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grenade.script_noteworthy = undefined;
|
||||
level thread grenade_stolen_by_sam( grenade, model );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grenade_stolen_by_sam( ent_grenade, ent_model )
|
||||
{
|
||||
if ( !isDefined( ent_model ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
direction = ent_model.origin;
|
||||
direction = ( direction[ 1 ], direction[ 0 ], 0 );
|
||||
if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 )
|
||||
{
|
||||
direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( direction[ 0 ] < 0 )
|
||||
{
|
||||
direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 );
|
||||
}
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( isalive( players[ i ] ) )
|
||||
{
|
||||
players[ i ] playlocalsound( level.zmb_laugh_alias );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
playfxontag( level._effect[ "grenade_samantha_steal" ], ent_model, "tag_origin" );
|
||||
ent_model movez( 60, 1, 0,25, 0,25 );
|
||||
ent_model vibrate( direction, 1,5, 2,5, 1 );
|
||||
ent_model waittill( "movedone" );
|
||||
ent_model delete();
|
||||
if ( isDefined( ent_grenade ) )
|
||||
{
|
||||
ent_grenade delete();
|
||||
}
|
||||
if ( !isdefined( ent_model ) )
|
||||
return;
|
||||
|
||||
direction = ent_model.origin;
|
||||
direction = ( direction[1], direction[0], 0 );
|
||||
|
||||
if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 )
|
||||
direction = ( direction[0], direction[1] * -1, 0 );
|
||||
else if ( direction[0] < 0 )
|
||||
direction = ( direction[0] * -1, direction[1], 0 );
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( isalive( players[i] ) )
|
||||
players[i] playlocalsound( level.zmb_laugh_alias );
|
||||
}
|
||||
|
||||
playfxontag( level._effect["grenade_samantha_steal"], ent_model, "tag_origin" );
|
||||
ent_model movez( 60, 1.0, 0.25, 0.25 );
|
||||
ent_model vibrate( direction, 1.5, 2.5, 1.0 );
|
||||
|
||||
ent_model waittill( "movedone" );
|
||||
|
||||
ent_model delete();
|
||||
|
||||
if ( isdefined( ent_grenade ) )
|
||||
ent_grenade delete();
|
||||
}
|
||||
|
||||
wait_for_attractor_positions_complete()
|
||||
{
|
||||
self waittill( "attractor_positions_generated" );
|
||||
self.attract_to_origin = 0;
|
||||
self waittill( "attractor_positions_generated" );
|
||||
|
||||
self.attract_to_origin = 0;
|
||||
}
|
||||
|
||||
monkey_cleanup( parent )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !isDefined( parent ) )
|
||||
{
|
||||
if ( isDefined( self ) && isDefined( self.dud ) && self.dud )
|
||||
{
|
||||
wait 6;
|
||||
}
|
||||
self_delete();
|
||||
return;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
if ( !isdefined( parent ) )
|
||||
{
|
||||
if ( isdefined( self ) && ( isdefined( self.dud ) && self.dud ) )
|
||||
wait 6;
|
||||
|
||||
self_delete();
|
||||
return;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
do_monkey_sound( model, info )
|
||||
{
|
||||
self.monk_scream_vox = 0;
|
||||
if ( isDefined( level.grenade_safe_to_bounce ) )
|
||||
{
|
||||
if ( !( [[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) )
|
||||
{
|
||||
self playsound( "zmb_vox_monkey_scream" );
|
||||
self.monk_scream_vox = 1;
|
||||
}
|
||||
}
|
||||
if ( !self.monk_scream_vox && level.music_override == 0 )
|
||||
{
|
||||
self playsound( "zmb_monkey_song" );
|
||||
}
|
||||
if ( !self.monk_scream_vox )
|
||||
{
|
||||
self thread play_delayed_explode_vox();
|
||||
}
|
||||
self waittill( "explode", position );
|
||||
level notify( "grenade_exploded" );
|
||||
monkey_index = -1;
|
||||
i = 0;
|
||||
while ( i < level.cymbal_monkeys.size )
|
||||
{
|
||||
if ( !isDefined( level.cymbal_monkeys[ i ] ) )
|
||||
{
|
||||
monkey_index = i;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( monkey_index >= 0 )
|
||||
{
|
||||
arrayremoveindex( level.cymbal_monkeys, monkey_index );
|
||||
}
|
||||
if ( isDefined( model ) )
|
||||
{
|
||||
model clearanim( %o_monkey_bomb, 0,2 );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < info.sound_attractors.size )
|
||||
{
|
||||
if ( isDefined( info.sound_attractors[ i ] ) )
|
||||
{
|
||||
info.sound_attractors[ i ] notify( "monkey_blown_up" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self.monk_scream_vox = 0;
|
||||
|
||||
if ( isdefined( level.grenade_safe_to_bounce ) )
|
||||
{
|
||||
if ( ![[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) )
|
||||
{
|
||||
self playsound( "zmb_vox_monkey_scream" );
|
||||
self.monk_scream_vox = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !self.monk_scream_vox && level.music_override == 0 )
|
||||
self playsound( "zmb_monkey_song" );
|
||||
|
||||
if ( !self.monk_scream_vox )
|
||||
self thread play_delayed_explode_vox();
|
||||
|
||||
self waittill( "explode", position );
|
||||
|
||||
level notify( "grenade_exploded", position, 100, 5000, 450 );
|
||||
monkey_index = -1;
|
||||
|
||||
for ( i = 0; i < level.cymbal_monkeys.size; i++ )
|
||||
{
|
||||
if ( !isdefined( level.cymbal_monkeys[i] ) )
|
||||
{
|
||||
monkey_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( monkey_index >= 0 )
|
||||
arrayremoveindex( level.cymbal_monkeys, monkey_index );
|
||||
|
||||
if ( isdefined( model ) )
|
||||
model clearanim( %o_monkey_bomb, 0.2 );
|
||||
|
||||
for ( i = 0; i < info.sound_attractors.size; i++ )
|
||||
{
|
||||
if ( isdefined( info.sound_attractors[i] ) )
|
||||
info.sound_attractors[i] notify( "monkey_blown_up" );
|
||||
}
|
||||
}
|
||||
|
||||
play_delayed_explode_vox()
|
||||
{
|
||||
wait 6,5;
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_monkey_explode" );
|
||||
}
|
||||
wait 6.5;
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self playsound( "zmb_vox_monkey_explode" );
|
||||
}
|
||||
|
||||
get_thrown_monkey()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_fire", grenade, weapname );
|
||||
if ( weapname == "cymbal_monkey_zm" )
|
||||
{
|
||||
grenade.use_grenade_special_long_bookmark = 1;
|
||||
grenade.grenade_multiattack_bookmark_count = 1;
|
||||
return grenade;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "grenade_fire", grenade, weapname );
|
||||
|
||||
if ( weapname == "cymbal_monkey_zm" )
|
||||
{
|
||||
grenade.use_grenade_special_long_bookmark = 1;
|
||||
grenade.grenade_multiattack_bookmark_count = 1;
|
||||
return grenade;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_zombie_groans( info )
|
||||
{
|
||||
self endon( "explode" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( !isDefined( self.attractor_array ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.attractor_array.size )
|
||||
{
|
||||
if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[ i ] ) )
|
||||
{
|
||||
if ( isDefined( self.origin ) && isDefined( self.attractor_array[ i ].origin ) )
|
||||
{
|
||||
if ( distancesquared( self.origin, self.attractor_array[ i ].origin ) < 250000 )
|
||||
{
|
||||
info.sound_attractors[ info.sound_attractors.size ] = self.attractor_array[ i ];
|
||||
self.attractor_array[ i ] thread play_zombie_groans();
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
self endon( "explode" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.attractor_array ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
for ( i = 0; i < self.attractor_array.size; i++ )
|
||||
{
|
||||
if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[i] ) )
|
||||
{
|
||||
if ( isdefined( self.origin ) && isdefined( self.attractor_array[i].origin ) )
|
||||
{
|
||||
if ( distancesquared( self.origin, self.attractor_array[i].origin ) < 250000 )
|
||||
{
|
||||
info.sound_attractors[info.sound_attractors.size] = self.attractor_array[i];
|
||||
self.attractor_array[i] thread play_zombie_groans();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
play_zombie_groans()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "monkey_blown_up" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_zombie_groan" );
|
||||
wait randomfloatrange( 2, 3 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "monkey_blown_up" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_zombie_groan" );
|
||||
wait( randomfloatrange( 2, 3 ) );
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
cymbal_monkey_exists()
|
||||
{
|
||||
return isDefined( level.zombie_weapons[ "cymbal_monkey_zm" ] );
|
||||
return isdefined( level.zombie_weapons["cymbal_monkey_zm"] );
|
||||
}
|
||||
|
@ -1,396 +1,379 @@
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/animscripts/zm_death;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_net;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\zombies\_zm_utility;
|
||||
#include maps\mp\zombies\_zm_net;
|
||||
#include maps\mp\zombies\_zm_weapons;
|
||||
#include maps\mp\zombies\_zm_score;
|
||||
#include maps\mp\animscripts\zm_death;
|
||||
#include maps\mp\zombies\_zm_audio;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "thundergun_zm" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level._effect[ "thundergun_viewmodel_power_cell1" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" );
|
||||
level._effect[ "thundergun_viewmodel_power_cell2" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" );
|
||||
level._effect[ "thundergun_viewmodel_power_cell3" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" );
|
||||
level._effect[ "thundergun_viewmodel_steam" ] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" );
|
||||
level._effect[ "thundergun_viewmodel_power_cell1_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" );
|
||||
level._effect[ "thundergun_viewmodel_power_cell2_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" );
|
||||
level._effect[ "thundergun_viewmodel_power_cell3_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" );
|
||||
level._effect[ "thundergun_viewmodel_steam_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" );
|
||||
level._effect[ "thundergun_knockdown_ground" ] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" );
|
||||
level._effect[ "thundergun_smoke_cloud" ] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" );
|
||||
set_zombie_var( "thundergun_cylinder_radius", 180 );
|
||||
set_zombie_var( "thundergun_fling_range", 480 );
|
||||
set_zombie_var( "thundergun_gib_range", 900 );
|
||||
set_zombie_var( "thundergun_gib_damage", 75 );
|
||||
set_zombie_var( "thundergun_knockdown_range", 1200 );
|
||||
set_zombie_var( "thundergun_knockdown_damage", 15 );
|
||||
level.thundergun_gib_refs = [];
|
||||
level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "guts";
|
||||
level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "right_arm";
|
||||
level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "left_arm";
|
||||
level.basic_zombie_thundergun_knockdown = ::zombie_knockdown;
|
||||
if ( !maps\mp\zombies\_zm_weapons::is_weapon_included( "thundergun_zm" ) )
|
||||
return;
|
||||
|
||||
level._effect["thundergun_viewmodel_power_cell1"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" );
|
||||
level._effect["thundergun_viewmodel_power_cell2"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" );
|
||||
level._effect["thundergun_viewmodel_power_cell3"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" );
|
||||
level._effect["thundergun_viewmodel_steam"] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" );
|
||||
level._effect["thundergun_viewmodel_power_cell1_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" );
|
||||
level._effect["thundergun_viewmodel_power_cell2_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" );
|
||||
level._effect["thundergun_viewmodel_power_cell3_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" );
|
||||
level._effect["thundergun_viewmodel_steam_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" );
|
||||
level._effect["thundergun_knockdown_ground"] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" );
|
||||
level._effect["thundergun_smoke_cloud"] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" );
|
||||
set_zombie_var( "thundergun_cylinder_radius", 180 );
|
||||
set_zombie_var( "thundergun_fling_range", 480 );
|
||||
set_zombie_var( "thundergun_gib_range", 900 );
|
||||
set_zombie_var( "thundergun_gib_damage", 75 );
|
||||
set_zombie_var( "thundergun_knockdown_range", 1200 );
|
||||
set_zombie_var( "thundergun_knockdown_damage", 15 );
|
||||
level.thundergun_gib_refs = [];
|
||||
level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "guts";
|
||||
level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "right_arm";
|
||||
level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "left_arm";
|
||||
level.basic_zombie_thundergun_knockdown = ::zombie_knockdown;
|
||||
/#
|
||||
level thread thundergun_devgui_dvar_think();
|
||||
level thread thundergun_devgui_dvar_think();
|
||||
#/
|
||||
onplayerconnect_callback( ::thundergun_on_player_connect );
|
||||
onplayerconnect_callback( ::thundergun_on_player_connect );
|
||||
}
|
||||
|
||||
thundergun_devgui_dvar_think()
|
||||
{
|
||||
/#
|
||||
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "thundergun_zm" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
setdvar( "scr_thundergun_cylinder_radius", level.zombie_vars[ "thundergun_cylinder_radius" ] );
|
||||
setdvar( "scr_thundergun_fling_range", level.zombie_vars[ "thundergun_fling_range" ] );
|
||||
setdvar( "scr_thundergun_gib_range", level.zombie_vars[ "thundergun_gib_range" ] );
|
||||
setdvar( "scr_thundergun_gib_damage", level.zombie_vars[ "thundergun_gib_damage" ] );
|
||||
setdvar( "scr_thundergun_knockdown_range", level.zombie_vars[ "thundergun_knockdown_range" ] );
|
||||
setdvar( "scr_thundergun_knockdown_damage", level.zombie_vars[ "thundergun_knockdown_damage" ] );
|
||||
for ( ;; )
|
||||
{
|
||||
level.zombie_vars[ "thundergun_cylinder_radius" ] = getDvarInt( "scr_thundergun_cylinder_radius" );
|
||||
level.zombie_vars[ "thundergun_fling_range" ] = getDvarInt( "scr_thundergun_fling_range" );
|
||||
level.zombie_vars[ "thundergun_gib_range" ] = getDvarInt( "scr_thundergun_gib_range" );
|
||||
level.zombie_vars[ "thundergun_gib_damage" ] = getDvarInt( "scr_thundergun_gib_damage" );
|
||||
level.zombie_vars[ "thundergun_knockdown_range" ] = getDvarInt( "scr_thundergun_knockdown_range" );
|
||||
level.zombie_vars[ "thundergun_knockdown_damage" ] = getDvarInt( "scr_thundergun_knockdown_damage" );
|
||||
wait 0,5;
|
||||
if ( !maps\mp\zombies\_zm_weapons::is_weapon_included( "thundergun_zm" ) )
|
||||
return;
|
||||
|
||||
setdvar( "scr_thundergun_cylinder_radius", level.zombie_vars["thundergun_cylinder_radius"] );
|
||||
setdvar( "scr_thundergun_fling_range", level.zombie_vars["thundergun_fling_range"] );
|
||||
setdvar( "scr_thundergun_gib_range", level.zombie_vars["thundergun_gib_range"] );
|
||||
setdvar( "scr_thundergun_gib_damage", level.zombie_vars["thundergun_gib_damage"] );
|
||||
setdvar( "scr_thundergun_knockdown_range", level.zombie_vars["thundergun_knockdown_range"] );
|
||||
setdvar( "scr_thundergun_knockdown_damage", level.zombie_vars["thundergun_knockdown_damage"] );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level.zombie_vars["thundergun_cylinder_radius"] = getdvarint( _hash_DEA6F730 );
|
||||
level.zombie_vars["thundergun_fling_range"] = getdvarint( _hash_16044A2B );
|
||||
level.zombie_vars["thundergun_gib_range"] = getdvarint( _hash_F5270E6D );
|
||||
level.zombie_vars["thundergun_gib_damage"] = getdvarint( _hash_795FFDFF );
|
||||
level.zombie_vars["thundergun_knockdown_range"] = getdvarint( _hash_2721E469 );
|
||||
level.zombie_vars["thundergun_knockdown_damage"] = getdvarint( _hash_EAB5937B );
|
||||
wait 0.5;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
thundergun_on_player_connect()
|
||||
{
|
||||
self thread wait_for_thundergun_fired();
|
||||
self thread wait_for_thundergun_fired();
|
||||
}
|
||||
|
||||
wait_for_thundergun_fired()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self waittill( "spawned_player" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "weapon_fired" );
|
||||
currentweapon = self getcurrentweapon();
|
||||
if ( currentweapon == "thundergun_zm" || currentweapon == "thundergun_upgraded_zm" )
|
||||
{
|
||||
self thread thundergun_fired();
|
||||
view_pos = self gettagorigin( "tag_flash" ) - self getplayerviewheight();
|
||||
view_angles = self gettagangles( "tag_flash" );
|
||||
playfx( level._effect[ "thundergun_smoke_cloud" ], view_pos, anglesToForward( view_angles ), anglesToUp( view_angles ) );
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "weapon_fired" );
|
||||
|
||||
currentweapon = self getcurrentweapon();
|
||||
|
||||
if ( currentweapon == "thundergun_zm" || currentweapon == "thundergun_upgraded_zm" )
|
||||
{
|
||||
self thread thundergun_fired();
|
||||
view_pos = self gettagorigin( "tag_flash" ) - self getplayerviewheight();
|
||||
view_angles = self gettagangles( "tag_flash" );
|
||||
playfx( level._effect["thundergun_smoke_cloud"], view_pos, anglestoforward( view_angles ), anglestoup( view_angles ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
thundergun_network_choke()
|
||||
{
|
||||
level.thundergun_network_choke_count++;
|
||||
if ( level.thundergun_network_choke_count % 10 )
|
||||
{
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
}
|
||||
level.thundergun_network_choke_count++;
|
||||
|
||||
if ( !( level.thundergun_network_choke_count % 10 ) )
|
||||
{
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
}
|
||||
}
|
||||
|
||||
thundergun_fired()
|
||||
{
|
||||
physicsexplosioncylinder( self.origin, 600, 240, 1 );
|
||||
if ( !isDefined( level.thundergun_knockdown_enemies ) )
|
||||
{
|
||||
level.thundergun_knockdown_enemies = [];
|
||||
level.thundergun_knockdown_gib = [];
|
||||
level.thundergun_fling_enemies = [];
|
||||
level.thundergun_fling_vecs = [];
|
||||
}
|
||||
self thundergun_get_enemies_in_range();
|
||||
level.thundergun_network_choke_count = 0;
|
||||
i = 0;
|
||||
while ( i < level.thundergun_fling_enemies.size )
|
||||
{
|
||||
thundergun_network_choke();
|
||||
level.thundergun_fling_enemies[ i ] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[ i ], i );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.thundergun_knockdown_enemies.size )
|
||||
{
|
||||
thundergun_network_choke();
|
||||
level.thundergun_knockdown_enemies[ i ] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[ i ] );
|
||||
i++;
|
||||
}
|
||||
level.thundergun_knockdown_enemies = [];
|
||||
level.thundergun_knockdown_gib = [];
|
||||
level.thundergun_fling_enemies = [];
|
||||
level.thundergun_fling_vecs = [];
|
||||
physicsexplosioncylinder( self.origin, 600, 240, 1 );
|
||||
|
||||
if ( !isdefined( level.thundergun_knockdown_enemies ) )
|
||||
{
|
||||
level.thundergun_knockdown_enemies = [];
|
||||
level.thundergun_knockdown_gib = [];
|
||||
level.thundergun_fling_enemies = [];
|
||||
level.thundergun_fling_vecs = [];
|
||||
}
|
||||
|
||||
self thundergun_get_enemies_in_range();
|
||||
level.thundergun_network_choke_count = 0;
|
||||
|
||||
for ( i = 0; i < level.thundergun_fling_enemies.size; i++ )
|
||||
{
|
||||
thundergun_network_choke();
|
||||
level.thundergun_fling_enemies[i] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[i], i );
|
||||
}
|
||||
|
||||
for ( i = 0; i < level.thundergun_knockdown_enemies.size; i++ )
|
||||
{
|
||||
thundergun_network_choke();
|
||||
level.thundergun_knockdown_enemies[i] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[i] );
|
||||
}
|
||||
|
||||
level.thundergun_knockdown_enemies = [];
|
||||
level.thundergun_knockdown_gib = [];
|
||||
level.thundergun_fling_enemies = [];
|
||||
level.thundergun_fling_vecs = [];
|
||||
}
|
||||
|
||||
thundergun_get_enemies_in_range()
|
||||
{
|
||||
view_pos = self getweaponmuzzlepoint();
|
||||
zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, level.zombie_vars[ "thundergun_knockdown_range" ] );
|
||||
if ( !isDefined( zombies ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
knockdown_range_squared = level.zombie_vars[ "thundergun_knockdown_range" ] * level.zombie_vars[ "thundergun_knockdown_range" ];
|
||||
gib_range_squared = level.zombie_vars[ "thundergun_gib_range" ] * level.zombie_vars[ "thundergun_gib_range" ];
|
||||
fling_range_squared = level.zombie_vars[ "thundergun_fling_range" ] * level.zombie_vars[ "thundergun_fling_range" ];
|
||||
cylinder_radius_squared = level.zombie_vars[ "thundergun_cylinder_radius" ] * level.zombie_vars[ "thundergun_cylinder_radius" ];
|
||||
forward_view_angles = self getweaponforwarddir();
|
||||
end_pos = view_pos + vectorScale( forward_view_angles, level.zombie_vars[ "thundergun_knockdown_range" ] );
|
||||
view_pos = self getweaponmuzzlepoint();
|
||||
zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, level.zombie_vars["thundergun_knockdown_range"] );
|
||||
|
||||
if ( !isdefined( zombies ) )
|
||||
return;
|
||||
|
||||
knockdown_range_squared = level.zombie_vars["thundergun_knockdown_range"] * level.zombie_vars["thundergun_knockdown_range"];
|
||||
gib_range_squared = level.zombie_vars["thundergun_gib_range"] * level.zombie_vars["thundergun_gib_range"];
|
||||
fling_range_squared = level.zombie_vars["thundergun_fling_range"] * level.zombie_vars["thundergun_fling_range"];
|
||||
cylinder_radius_squared = level.zombie_vars["thundergun_cylinder_radius"] * level.zombie_vars["thundergun_cylinder_radius"];
|
||||
forward_view_angles = self getweaponforwarddir();
|
||||
end_pos = view_pos + vectorscale( forward_view_angles, level.zombie_vars["thundergun_knockdown_range"] );
|
||||
/#
|
||||
if ( getDvarInt( #"AAC84AD6" ) == 2 )
|
||||
{
|
||||
near_circle_pos = view_pos + vectorScale( forward_view_angles, 2 );
|
||||
circle( near_circle_pos, level.zombie_vars[ "thundergun_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 );
|
||||
line( near_circle_pos, end_pos, ( 0, 0, 1 ), 1, 0, 100 );
|
||||
circle( end_pos, level.zombie_vars[ "thundergun_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 );
|
||||
if ( 2 == getdvarint( _hash_AAC84AD6 ) )
|
||||
{
|
||||
near_circle_pos = view_pos + vectorscale( forward_view_angles, 2 );
|
||||
circle( near_circle_pos, level.zombie_vars["thundergun_cylinder_radius"], ( 1, 0, 0 ), 0, 0, 100 );
|
||||
line( near_circle_pos, end_pos, ( 0, 0, 1 ), 1, 0, 100 );
|
||||
circle( end_pos, level.zombie_vars["thundergun_cylinder_radius"], ( 1, 0, 0 ), 0, 0, 100 );
|
||||
}
|
||||
#/
|
||||
}
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( !isDefined( zombies[ i ] ) || !isalive( zombies[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
test_origin = zombies[ i ] getcentroid();
|
||||
test_range_squared = distancesquared( view_pos, test_origin );
|
||||
if ( test_range_squared > knockdown_range_squared )
|
||||
{
|
||||
zombies[ i ] thundergun_debug_print( "range", ( 0, 0, 1 ) );
|
||||
return;
|
||||
}
|
||||
normal = vectornormalize( test_origin - view_pos );
|
||||
dot = vectordot( forward_view_angles, normal );
|
||||
if ( dot <= 0 )
|
||||
{
|
||||
zombies[ i ] thundergun_debug_print( "dot", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
|
||||
if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
|
||||
{
|
||||
zombies[ i ] thundergun_debug_print( "cylinder", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( zombies[ i ] damageconetrace( view_pos, self ) == 0 )
|
||||
{
|
||||
zombies[ i ] thundergun_debug_print( "cone", ( 0, 0, 1 ) );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( test_range_squared < fling_range_squared )
|
||||
{
|
||||
level.thundergun_fling_enemies[ level.thundergun_fling_enemies.size ] = zombies[ i ];
|
||||
dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared;
|
||||
fling_vec = vectornormalize( test_origin - view_pos );
|
||||
if ( test_range_squared >= 5000 )
|
||||
{
|
||||
fling_vec += vectornormalize( test_origin - radial_origin );
|
||||
}
|
||||
fling_vec = ( fling_vec[ 0 ], fling_vec[ 1 ], abs( fling_vec[ 2 ] ) );
|
||||
fling_vec = vectorScale( fling_vec, 100 + ( 100 * dist_mult ) );
|
||||
level.thundergun_fling_vecs[ level.thundergun_fling_vecs.size ] = fling_vec;
|
||||
zombies[ i ] thread setup_thundergun_vox( self, 1, 0, 0 );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( test_range_squared < gib_range_squared )
|
||||
{
|
||||
level.thundergun_knockdown_enemies[ level.thundergun_knockdown_enemies.size ] = zombies[ i ];
|
||||
level.thundergun_knockdown_gib[ level.thundergun_knockdown_gib.size ] = 1;
|
||||
zombies[ i ] thread setup_thundergun_vox( self, 0, 1, 0 );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.thundergun_knockdown_enemies[ level.thundergun_knockdown_enemies.size ] = zombies[ i ];
|
||||
level.thundergun_knockdown_gib[ level.thundergun_knockdown_gib.size ] = 0;
|
||||
zombies[ i ] thread setup_thundergun_vox( self, 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
for ( i = 0; i < zombies.size; i++ )
|
||||
{
|
||||
if ( !isdefined( zombies[i] ) || !isalive( zombies[i] ) )
|
||||
continue;
|
||||
|
||||
test_origin = zombies[i] getcentroid();
|
||||
test_range_squared = distancesquared( view_pos, test_origin );
|
||||
|
||||
if ( test_range_squared > knockdown_range_squared )
|
||||
{
|
||||
zombies[i] thundergun_debug_print( "range", ( 1, 0, 0 ) );
|
||||
return;
|
||||
}
|
||||
|
||||
normal = vectornormalize( test_origin - view_pos );
|
||||
dot = vectordot( forward_view_angles, normal );
|
||||
|
||||
if ( 0 > dot )
|
||||
{
|
||||
zombies[i] thundergun_debug_print( "dot", ( 1, 0, 0 ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
|
||||
|
||||
if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
|
||||
{
|
||||
zombies[i] thundergun_debug_print( "cylinder", ( 1, 0, 0 ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( 0 == zombies[i] damageconetrace( view_pos, self ) )
|
||||
{
|
||||
zombies[i] thundergun_debug_print( "cone", ( 1, 0, 0 ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( test_range_squared < fling_range_squared )
|
||||
{
|
||||
level.thundergun_fling_enemies[level.thundergun_fling_enemies.size] = zombies[i];
|
||||
dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared;
|
||||
fling_vec = vectornormalize( test_origin - view_pos );
|
||||
|
||||
if ( 5000 < test_range_squared )
|
||||
fling_vec += vectornormalize( test_origin - radial_origin );
|
||||
|
||||
fling_vec = ( fling_vec[0], fling_vec[1], abs( fling_vec[2] ) );
|
||||
fling_vec = vectorscale( fling_vec, 100 + 100 * dist_mult );
|
||||
level.thundergun_fling_vecs[level.thundergun_fling_vecs.size] = fling_vec;
|
||||
zombies[i] thread setup_thundergun_vox( self, 1, 0, 0 );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( test_range_squared < gib_range_squared )
|
||||
{
|
||||
level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
|
||||
level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = 1;
|
||||
zombies[i] thread setup_thundergun_vox( self, 0, 1, 0 );
|
||||
continue;
|
||||
}
|
||||
|
||||
level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
|
||||
level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = 0;
|
||||
zombies[i] thread setup_thundergun_vox( self, 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
thundergun_debug_print( msg, color )
|
||||
{
|
||||
/#
|
||||
if ( !getDvarInt( #"AAC84AD6" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( color ) )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
|
||||
if ( !getdvarint( _hash_AAC84AD6 ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( color ) )
|
||||
color = ( 1, 1, 1 );
|
||||
|
||||
print3d( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), msg, color, 1, 1, 40 );
|
||||
#/
|
||||
}
|
||||
|
||||
thundergun_fling_zombie( player, fling_vec, index )
|
||||
{
|
||||
if ( !isDefined( self ) || !isalive( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.thundergun_fling_func ) )
|
||||
{
|
||||
self [[ self.thundergun_fling_func ]]( player );
|
||||
return;
|
||||
}
|
||||
self dodamage( self.health + 666, player.origin, player );
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
points = 10;
|
||||
if ( !index )
|
||||
{
|
||||
points = maps/mp/zombies/_zm_score::get_zombie_death_player_points();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( index == 1 )
|
||||
{
|
||||
points = 30;
|
||||
}
|
||||
}
|
||||
player maps/mp/zombies/_zm_score::player_add_points( "thundergun_fling", points );
|
||||
self startragdoll();
|
||||
self launchragdoll( fling_vec );
|
||||
self.thundergun_death = 1;
|
||||
}
|
||||
if ( !isdefined( self ) || !isalive( self ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.thundergun_fling_func ) )
|
||||
{
|
||||
self [[ self.thundergun_fling_func ]]( player );
|
||||
return;
|
||||
}
|
||||
|
||||
self dodamage( self.health + 666, player.origin, player );
|
||||
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
points = 10;
|
||||
|
||||
if ( !index )
|
||||
points = maps\mp\zombies\_zm_score::get_zombie_death_player_points();
|
||||
else if ( 1 == index )
|
||||
points = 30;
|
||||
|
||||
player maps\mp\zombies\_zm_score::player_add_points( "thundergun_fling", points );
|
||||
self startragdoll();
|
||||
self launchragdoll( fling_vec );
|
||||
self.thundergun_death = 1;
|
||||
}
|
||||
}
|
||||
|
||||
zombie_knockdown( player, gib )
|
||||
{
|
||||
if ( gib && !self.gibbed )
|
||||
{
|
||||
self.a.gib_ref = random( level.thundergun_gib_refs );
|
||||
self thread maps/mp/animscripts/zm_death::do_gib();
|
||||
}
|
||||
damage = level.zombie_vars[ "thundergun_knockdown_damage" ];
|
||||
if ( isDefined( level.override_thundergun_damage_func ) )
|
||||
{
|
||||
self [[ level.override_thundergun_damage_func ]]( player, gib );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
|
||||
self dodamage( damage, player.origin, player );
|
||||
}
|
||||
if ( gib && !self.gibbed )
|
||||
{
|
||||
self.a.gib_ref = random( level.thundergun_gib_refs );
|
||||
self thread maps\mp\animscripts\zm_death::do_gib();
|
||||
}
|
||||
|
||||
damage = level.zombie_vars["thundergun_knockdown_damage"];
|
||||
|
||||
if ( isdefined( level.override_thundergun_damage_func ) )
|
||||
self [[ level.override_thundergun_damage_func ]]( player, gib );
|
||||
else
|
||||
{
|
||||
self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
|
||||
self dodamage( damage, player.origin, player );
|
||||
}
|
||||
}
|
||||
|
||||
thundergun_knockdown_zombie( player, gib )
|
||||
{
|
||||
self endon( "death" );
|
||||
playsoundatposition( "vox_thundergun_forcehit", self.origin );
|
||||
playsoundatposition( "wpn_thundergun_proj_impact", self.origin );
|
||||
if ( !isDefined( self ) || !isalive( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.thundergun_knockdown_func ) )
|
||||
{
|
||||
self [[ self.thundergun_knockdown_func ]]( player, gib );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( level.zombie_vars[ "thundergun_knockdown_damage" ], player.origin, player );
|
||||
}
|
||||
if ( gib )
|
||||
{
|
||||
self.a.gib_ref = random( level.thundergun_gib_refs );
|
||||
self thread maps/mp/animscripts/zm_death::do_gib();
|
||||
}
|
||||
self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
|
||||
self dodamage( level.zombie_vars[ "thundergun_knockdown_damage" ], player.origin, player );
|
||||
self playsound( "fly_thundergun_forcehit" );
|
||||
self endon( "death" );
|
||||
playsoundatposition( "vox_thundergun_forcehit", self.origin );
|
||||
playsoundatposition( "wpn_thundergun_proj_impact", self.origin );
|
||||
|
||||
if ( !isdefined( self ) || !isalive( self ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.thundergun_knockdown_func ) )
|
||||
self [[ self.thundergun_knockdown_func ]]( player, gib );
|
||||
else
|
||||
self dodamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player );
|
||||
|
||||
if ( gib )
|
||||
{
|
||||
self.a.gib_ref = random( level.thundergun_gib_refs );
|
||||
self thread maps\mp\animscripts\zm_death::do_gib();
|
||||
}
|
||||
|
||||
self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
|
||||
self dodamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player );
|
||||
self playsound( "fly_thundergun_forcehit" );
|
||||
}
|
||||
|
||||
handle_thundergun_pain_notetracks( note )
|
||||
{
|
||||
if ( note == "zombie_knockdown_ground_impact" )
|
||||
{
|
||||
playfx( level._effect[ "thundergun_knockdown_ground" ], self.origin, anglesToForward( self.angles ), anglesToUp( self.angles ) );
|
||||
self playsound( "fly_thundergun_forcehit" );
|
||||
}
|
||||
if ( note == "zombie_knockdown_ground_impact" )
|
||||
{
|
||||
playfx( level._effect["thundergun_knockdown_ground"], self.origin, anglestoforward( self.angles ), anglestoup( self.angles ) );
|
||||
self playsound( "fly_thundergun_forcehit" );
|
||||
}
|
||||
}
|
||||
|
||||
is_thundergun_damage()
|
||||
{
|
||||
if ( isDefined( self.damageweapon ) && self.damageweapon != "thundergun_zm" && self.damageweapon == "thundergun_upgraded_zm" )
|
||||
{
|
||||
if ( self.damagemod != "MOD_GRENADE" )
|
||||
{
|
||||
return self.damagemod != "MOD_GRENADE_SPLASH";
|
||||
}
|
||||
}
|
||||
return isdefined( self.damageweapon ) && ( self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm" ) && ( self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH" );
|
||||
}
|
||||
|
||||
enemy_killed_by_thundergun()
|
||||
{
|
||||
if ( isDefined( self.thundergun_death ) )
|
||||
{
|
||||
return self.thundergun_death == 1;
|
||||
}
|
||||
return isdefined( self.thundergun_death ) && self.thundergun_death == 1;
|
||||
}
|
||||
|
||||
thundergun_sound_thread()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self waittill( "spawned_player" );
|
||||
for ( ;; )
|
||||
{
|
||||
result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" );
|
||||
if ( !isDefined( result ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( result != "weapon_change" && result == "grenade_fire" && self getcurrentweapon() == "thundergun_zm" )
|
||||
{
|
||||
self playloopsound( "tesla_idle", 0,25 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self notify( "weap_away" );
|
||||
self stoploopsound( 0,25 );
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" );
|
||||
|
||||
if ( !isdefined( result ) )
|
||||
continue;
|
||||
|
||||
if ( ( result == "weapon_change" || result == "grenade_fire" ) && self getcurrentweapon() == "thundergun_zm" )
|
||||
{
|
||||
self playloopsound( "tesla_idle", 0.25 );
|
||||
continue;
|
||||
}
|
||||
|
||||
self notify( "weap_away" );
|
||||
self stoploopsound( 0.25 );
|
||||
}
|
||||
}
|
||||
|
||||
setup_thundergun_vox( player, fling, gib, knockdown )
|
||||
{
|
||||
if ( !isDefined( self ) || !isalive( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !fling || gib && knockdown )
|
||||
{
|
||||
if ( randomintrange( 1, 100 ) <= 25 )
|
||||
{
|
||||
}
|
||||
}
|
||||
if ( fling )
|
||||
{
|
||||
if ( randomintrange( 1, 100 ) <= 30 )
|
||||
{
|
||||
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "thundergun" );
|
||||
}
|
||||
}
|
||||
if ( !isdefined( self ) || !isalive( self ) )
|
||||
return;
|
||||
|
||||
if ( !fling && ( gib || knockdown ) )
|
||||
{
|
||||
if ( 25 > randomintrange( 1, 100 ) )
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ( fling )
|
||||
{
|
||||
if ( 30 > randomintrange( 1, 100 ) )
|
||||
player maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "thundergun" );
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user