[Zombie Core] Replaced all scripts with scripts decompiled by...

Xensik's gsc-tool.
This commit is contained in:
JezuzLizard
2022-02-25 22:03:12 -08:00
parent 5467e47fa8
commit 0d2c068adb
157 changed files with 87715 additions and 94302 deletions

View File

@ -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 )];
}

View File

@ -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();
}
}

View File

@ -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;
}
}
}
}

View File

@ -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] );
}
}
}

View File

@ -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"] );
}

View File

@ -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" );
}
}