mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-07 17:37:50 -05:00
Revert "[Zombie Core] Replaced all scripts with scripts decompiled by..."
This reverts commit 0d2c068adb59b2b7bce6ab744a74b10fb59df130.
This commit is contained in:
parent
f97389d9da
commit
d85d35ba1a
@ -1,201 +1,216 @@
|
||||
// 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 )
|
||||
{
|
||||
for ( i = 0; i < a.size; i++ )
|
||||
precachemodel( a[i] );
|
||||
i = 0;
|
||||
while ( i < a.size )
|
||||
{
|
||||
precachemodel( a[ i ] );
|
||||
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();
|
||||
|
||||
for ( i = 0; i < attachsize; i++ )
|
||||
{
|
||||
info["attach"][i]["model"] = self getattachmodelname( i );
|
||||
info["attach"][i]["tag"] = self getattachtagname( i );
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
for ( i = 0; i < attachsize; i++ )
|
||||
self attach( attachinfo[i]["model"], attachinfo[i]["tag"] );
|
||||
}
|
||||
attachinfo = info[ "attach" ];
|
||||
attachsize = attachinfo.size;
|
||||
i = 0;
|
||||
while ( i < attachsize )
|
||||
{
|
||||
self attach( attachinfo[ i ][ "model" ], attachinfo[ i ][ "tag" ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
for ( i = 0; i < attachsize; i++ )
|
||||
precachemodel( attachinfo[i]["model"] );
|
||||
}
|
||||
precachemodel( info[ "model" ] );
|
||||
attachinfo = info[ "attach" ];
|
||||
attachsize = attachinfo.size;
|
||||
i = 0;
|
||||
while ( i < attachsize )
|
||||
{
|
||||
precachemodel( attachinfo[ i ][ "model" ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
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++;
|
||||
}
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
for ( i = 0; i < amount; i++ )
|
||||
level.character_index_cache[prefix][group][i] = 0;
|
||||
i = 0;
|
||||
while ( i < amount )
|
||||
{
|
||||
level.character_index_cache[ prefix ][ group ][ i ] = 0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
random( array )
|
||||
{
|
||||
return array[randomint( array.size )];
|
||||
return array[ randomint( array.size ) ];
|
||||
}
|
||||
|
@ -1,26 +1,23 @@
|
||||
// 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,29 +1,41 @@
|
||||
// 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 )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
_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 );
|
||||
}
|
||||
}
|
||||
|
@ -1,61 +1,56 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_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 ( 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] );
|
||||
}
|
||||
}
|
||||
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 ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,367 +1,378 @@
|
||||
// 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;
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
#using_animtree( "zombie_cymbal_monkey" );
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !cymbal_monkey_exists() )
|
||||
return;
|
||||
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 ( true )
|
||||
{
|
||||
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 ( 1 )
|
||||
{
|
||||
grenade = get_thrown_monkey();
|
||||
self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
watch_for_dud( model )
|
||||
{
|
||||
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 ( 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();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
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 );
|
||||
}
|
||||
return;
|
||||
}
|
||||
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();
|
||||
|
||||
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();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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 ( true )
|
||||
{
|
||||
if ( !isdefined( parent ) )
|
||||
{
|
||||
if ( isdefined( self ) && ( isdefined( self.dud ) && self.dud ) )
|
||||
wait 6;
|
||||
|
||||
self_delete();
|
||||
return;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
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", 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" );
|
||||
}
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
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 ( 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;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self endon( "starting_monkey_watch" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_fire", grenade, weapname );
|
||||
if ( weapname == "cymbal_monkey_zm" )
|
||||
{
|
||||
grenade.use_grenade_special_long_bookmark = 1;
|
||||
grenade.grenade_multiattack_bookmark_count = 1;
|
||||
return grenade;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_zombie_groans( info )
|
||||
{
|
||||
self endon( "explode" );
|
||||
|
||||
while ( 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;
|
||||
}
|
||||
self endon( "explode" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
while ( !isDefined( self.attractor_array ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.attractor_array.size )
|
||||
{
|
||||
if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[ i ] ) )
|
||||
{
|
||||
if ( isDefined( self.origin ) && isDefined( self.attractor_array[ i ].origin ) )
|
||||
{
|
||||
if ( distancesquared( self.origin, self.attractor_array[ i ].origin ) < 250000 )
|
||||
{
|
||||
info.sound_attractors[ info.sound_attractors.size ] = self.attractor_array[ i ];
|
||||
self.attractor_array[ i ] thread play_zombie_groans();
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
play_zombie_groans()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "monkey_blown_up" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_zombie_groan" );
|
||||
wait( randomfloatrange( 2, 3 ) );
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "monkey_blown_up" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self playsound( "zmb_vox_zombie_groan" );
|
||||
wait randomfloatrange( 2, 3 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cymbal_monkey_exists()
|
||||
{
|
||||
return isdefined( level.zombie_weapons["cymbal_monkey_zm"] );
|
||||
return isDefined( level.zombie_weapons[ "cymbal_monkey_zm" ] );
|
||||
}
|
||||
|
@ -1,379 +1,396 @@
|
||||
// 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;
|
||||
#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;
|
||||
|
||||
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( _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;
|
||||
}
|
||||
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;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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 = [];
|
||||
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 = [];
|
||||
}
|
||||
|
||||
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 ( 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 );
|
||||
}
|
||||
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 );
|
||||
#/
|
||||
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 );
|
||||
}
|
||||
}
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
thundergun_debug_print( msg, color )
|
||||
{
|
||||
/#
|
||||
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 );
|
||||
if ( !getDvarInt( #"AAC84AD6" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( color ) )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), 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 ( 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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
return isdefined( self.damageweapon ) && ( self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm" ) && ( self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH" );
|
||||
if ( isDefined( self.damageweapon ) && self.damageweapon != "thundergun_zm" && self.damageweapon == "thundergun_upgraded_zm" )
|
||||
{
|
||||
if ( self.damagemod != "MOD_GRENADE" )
|
||||
{
|
||||
return self.damagemod != "MOD_GRENADE_SPLASH";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enemy_killed_by_thundergun()
|
||||
{
|
||||
return isdefined( self.thundergun_death ) && self.thundergun_death == 1;
|
||||
if ( isDefined( self.thundergun_death ) )
|
||||
{
|
||||
return 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;
|
||||
|
||||
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 );
|
||||
}
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setup_thundergun_vox( player, fling, gib, knockdown )
|
||||
{
|
||||
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" );
|
||||
}
|
||||
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" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,19 +1,21 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include codescripts\character;
|
||||
#include codescripts/character;
|
||||
|
||||
setmodelfromarray( a )
|
||||
{
|
||||
self setmodel( a[randomint( a.size )] );
|
||||
self setmodel( a[ randomint( a.size ) ] );
|
||||
}
|
||||
|
||||
precachemodelarray( a )
|
||||
{
|
||||
for ( i = 0; i < a.size; i++ )
|
||||
precachemodel( a[i] );
|
||||
i = 0;
|
||||
while ( i < a.size )
|
||||
{
|
||||
precachemodel( a[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
attachfromarray( a )
|
||||
{
|
||||
self attach( codescripts\character::randomelement( a ), "", 1 );
|
||||
self attach( codescripts/character::randomelement( a ), "", 1 );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,447 +1,497 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
/#
|
||||
if ( getdvar( "scr_art_tweak" ) == "" || getdvar( "scr_art_tweak" ) == "0" )
|
||||
setdvar( "scr_art_tweak", 0 );
|
||||
|
||||
if ( getdvar( "scr_dof_enable" ) == "" )
|
||||
setdvar( "scr_dof_enable", "1" );
|
||||
|
||||
if ( getdvar( "scr_cinematic_autofocus" ) == "" )
|
||||
setdvar( "scr_cinematic_autofocus", "1" );
|
||||
|
||||
if ( getdvar( "scr_art_visionfile" ) == "" && isdefined( level.script ) )
|
||||
setdvar( "scr_art_visionfile", level.script );
|
||||
|
||||
if ( getdvar( "debug_reflection" ) == "" )
|
||||
setdvar( "debug_reflection", "0" );
|
||||
|
||||
if ( getdvar( "debug_reflection_matte" ) == "" )
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
|
||||
if ( getdvar( "debug_color_pallete" ) == "" )
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
|
||||
precachemodel( "test_sphere_lambert" );
|
||||
precachemodel( "test_macbeth_chart" );
|
||||
precachemodel( "test_macbeth_chart_unlit" );
|
||||
precachemodel( "test_sphere_silver" );
|
||||
level thread debug_reflection();
|
||||
level thread debug_reflection_matte();
|
||||
level thread debug_color_pallete();
|
||||
if ( getDvar( "scr_art_tweak" ) == "" || getDvar( "scr_art_tweak" ) == "0" )
|
||||
{
|
||||
setdvar( "scr_art_tweak", 0 );
|
||||
}
|
||||
if ( getDvar( "scr_dof_enable" ) == "" )
|
||||
{
|
||||
setdvar( "scr_dof_enable", "1" );
|
||||
}
|
||||
if ( getDvar( "scr_cinematic_autofocus" ) == "" )
|
||||
{
|
||||
setdvar( "scr_cinematic_autofocus", "1" );
|
||||
}
|
||||
if ( getDvar( "scr_art_visionfile" ) == "" && isDefined( level.script ) )
|
||||
{
|
||||
setdvar( "scr_art_visionfile", level.script );
|
||||
}
|
||||
if ( getDvar( "debug_reflection" ) == "" )
|
||||
{
|
||||
setdvar( "debug_reflection", "0" );
|
||||
}
|
||||
if ( getDvar( "debug_reflection_matte" ) == "" )
|
||||
{
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
}
|
||||
if ( getDvar( "debug_color_pallete" ) == "" )
|
||||
{
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
}
|
||||
precachemodel( "test_sphere_lambert" );
|
||||
precachemodel( "test_macbeth_chart" );
|
||||
precachemodel( "test_macbeth_chart_unlit" );
|
||||
precachemodel( "test_sphere_silver" );
|
||||
level thread debug_reflection();
|
||||
level thread debug_reflection_matte();
|
||||
level thread debug_color_pallete();
|
||||
#/
|
||||
if ( !isdefined( level.dofdefault ) )
|
||||
{
|
||||
level.dofdefault["nearStart"] = 0;
|
||||
level.dofdefault["nearEnd"] = 1;
|
||||
level.dofdefault["farStart"] = 8000;
|
||||
level.dofdefault["farEnd"] = 10000;
|
||||
level.dofdefault["nearBlur"] = 6;
|
||||
level.dofdefault["farBlur"] = 0;
|
||||
}
|
||||
|
||||
level.curdof = ( level.dofdefault["farStart"] - level.dofdefault["nearEnd"] ) / 2;
|
||||
if ( !isDefined( level.dofdefault ) )
|
||||
{
|
||||
level.dofdefault[ "nearStart" ] = 0;
|
||||
level.dofdefault[ "nearEnd" ] = 1;
|
||||
level.dofdefault[ "farStart" ] = 8000;
|
||||
level.dofdefault[ "farEnd" ] = 10000;
|
||||
level.dofdefault[ "nearBlur" ] = 6;
|
||||
level.dofdefault[ "farBlur" ] = 0;
|
||||
}
|
||||
level.curdof = ( level.dofdefault[ "farStart" ] - level.dofdefault[ "nearEnd" ] ) / 2;
|
||||
/#
|
||||
thread tweakart();
|
||||
thread tweakart();
|
||||
#/
|
||||
if ( !isdefined( level.script ) )
|
||||
level.script = tolower( getdvar( "mapname" ) );
|
||||
if ( !isDefined( level.script ) )
|
||||
{
|
||||
level.script = tolower( getDvar( "mapname" ) );
|
||||
}
|
||||
}
|
||||
|
||||
artfxprintln( file, string )
|
||||
{
|
||||
/#
|
||||
if ( file == -1 )
|
||||
return;
|
||||
|
||||
fprintln( file, string );
|
||||
if ( file == -1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
|
||||
strtok_loc( string, par1 )
|
||||
{
|
||||
stringlist = [];
|
||||
indexstring = "";
|
||||
|
||||
for ( i = 0; i < string.size; i++ )
|
||||
{
|
||||
if ( string[i] == " " )
|
||||
{
|
||||
stringlist[stringlist.size] = indexstring;
|
||||
indexstring = "";
|
||||
continue;
|
||||
}
|
||||
|
||||
indexstring += string[i];
|
||||
}
|
||||
|
||||
if ( indexstring.size )
|
||||
stringlist[stringlist.size] = indexstring;
|
||||
|
||||
return stringlist;
|
||||
stringlist = [];
|
||||
indexstring = "";
|
||||
i = 0;
|
||||
while ( i < string.size )
|
||||
{
|
||||
if ( string[ i ] == " " )
|
||||
{
|
||||
stringlist[ stringlist.size ] = indexstring;
|
||||
indexstring = "";
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
indexstring += string[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( indexstring.size )
|
||||
{
|
||||
stringlist[ stringlist.size ] = indexstring;
|
||||
}
|
||||
return stringlist;
|
||||
}
|
||||
|
||||
setfogsliders()
|
||||
{
|
||||
fogall = strtok_loc( getdvar( "g_fogColorReadOnly" ), " " );
|
||||
red = fogall[0];
|
||||
green = fogall[1];
|
||||
blue = fogall[2];
|
||||
halfplane = getdvar( "g_fogHalfDistReadOnly" );
|
||||
nearplane = getdvar( "g_fogStartDistReadOnly" );
|
||||
|
||||
if ( !isdefined( red ) || !isdefined( green ) || !isdefined( blue ) || !isdefined( halfplane ) )
|
||||
{
|
||||
red = 1;
|
||||
green = 1;
|
||||
blue = 1;
|
||||
halfplane = 10000001;
|
||||
nearplane = 10000000;
|
||||
}
|
||||
|
||||
setdvar( "scr_fog_exp_halfplane", halfplane );
|
||||
setdvar( "scr_fog_nearplane", nearplane );
|
||||
setdvar( "scr_fog_color", red + " " + green + " " + blue );
|
||||
fogall = strtok_loc( getDvar( "g_fogColorReadOnly" ), " " );
|
||||
red = fogall[ 0 ];
|
||||
green = fogall[ 1 ];
|
||||
blue = fogall[ 2 ];
|
||||
halfplane = getDvar( "g_fogHalfDistReadOnly" );
|
||||
nearplane = getDvar( "g_fogStartDistReadOnly" );
|
||||
if ( isDefined( red ) && isDefined( green ) || !isDefined( blue ) && !isDefined( halfplane ) )
|
||||
{
|
||||
red = 1;
|
||||
green = 1;
|
||||
blue = 1;
|
||||
halfplane = 10000001;
|
||||
nearplane = 10000000;
|
||||
}
|
||||
setdvar( "scr_fog_exp_halfplane", halfplane );
|
||||
setdvar( "scr_fog_nearplane", nearplane );
|
||||
setdvar( "scr_fog_color", ( red + " " ) + green + " " + blue );
|
||||
}
|
||||
|
||||
tweakart()
|
||||
{
|
||||
/#
|
||||
if ( !isdefined( level.tweakfile ) )
|
||||
level.tweakfile = 0;
|
||||
|
||||
if ( getdvar( "scr_fog_baseheight" ) == "" )
|
||||
{
|
||||
setdvar( "scr_fog_exp_halfplane", "500" );
|
||||
setdvar( "scr_fog_exp_halfheight", "500" );
|
||||
setdvar( "scr_fog_nearplane", "0" );
|
||||
setdvar( "scr_fog_baseheight", "0" );
|
||||
}
|
||||
|
||||
setdvar( "scr_fog_fraction", "1.0" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault["nearStart"] );
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault["nearEnd"] );
|
||||
setdvar( "scr_dof_farStart", level.dofdefault["farStart"] );
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault["farEnd"] );
|
||||
setdvar( "scr_dof_nearBlur", level.dofdefault["nearBlur"] );
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault["farBlur"] );
|
||||
file = undefined;
|
||||
filename = undefined;
|
||||
tweak_toggle = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while ( getdvarint( "scr_art_tweak" ) == 0 )
|
||||
{
|
||||
tweak_toggle = 1;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
if ( tweak_toggle )
|
||||
{
|
||||
tweak_toggle = 0;
|
||||
fogsettings = getfogsettings();
|
||||
setdvar( "scr_fog_nearplane", fogsettings[0] );
|
||||
setdvar( "scr_fog_exp_halfplane", fogsettings[1] );
|
||||
setdvar( "scr_fog_exp_halfheight", fogsettings[3] );
|
||||
setdvar( "scr_fog_baseheight", fogsettings[2] );
|
||||
setdvar( "scr_fog_color", fogsettings[4] + " " + fogsettings[5] + " " + fogsettings[6] );
|
||||
setdvar( "scr_fog_color_scale", fogsettings[7] );
|
||||
setdvar( "scr_sun_fog_color", fogsettings[8] + " " + fogsettings[9] + " " + fogsettings[10] );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[0] = fogsettings[11];
|
||||
level.fogsundir[1] = fogsettings[12];
|
||||
level.fogsundir[2] = fogsettings[13];
|
||||
setdvar( "scr_sun_fog_start_angle", fogsettings[14] );
|
||||
setdvar( "scr_sun_fog_end_angle", fogsettings[15] );
|
||||
setdvar( "scr_fog_max_opacity", fogsettings[16] );
|
||||
}
|
||||
|
||||
level.fogexphalfplane = getdvarfloat( "scr_fog_exp_halfplane" );
|
||||
level.fogexphalfheight = getdvarfloat( "scr_fog_exp_halfheight" );
|
||||
level.fognearplane = getdvarfloat( "scr_fog_nearplane" );
|
||||
level.fogbaseheight = getdvarfloat( "scr_fog_baseheight" );
|
||||
level.fogcolorred = getdvarcolorred( "scr_fog_color" );
|
||||
level.fogcolorgreen = getdvarcolorgreen( "scr_fog_color" );
|
||||
level.fogcolorblue = getdvarcolorblue( "scr_fog_color" );
|
||||
level.fogcolorscale = getdvarfloat( "scr_fog_color_scale" );
|
||||
level.sunfogcolorred = getdvarcolorred( "scr_sun_fog_color" );
|
||||
level.sunfogcolorgreen = getdvarcolorgreen( "scr_sun_fog_color" );
|
||||
level.sunfogcolorblue = getdvarcolorblue( "scr_sun_fog_color" );
|
||||
level.sunstartangle = getdvarfloat( "scr_sun_fog_start_angle" );
|
||||
level.sunendangle = getdvarfloat( "scr_sun_fog_end_angle" );
|
||||
level.fogmaxopacity = getdvarfloat( "scr_fog_max_opacity" );
|
||||
|
||||
if ( getdvarint( "scr_art_sun_fog_dir_set" ) )
|
||||
{
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
println( "Setting sun fog direction to facing of player" );
|
||||
players = get_players();
|
||||
dir = vectornormalize( anglestoforward( players[0] getplayerangles() ) );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[0] = dir[0];
|
||||
level.fogsundir[1] = dir[1];
|
||||
level.fogsundir[2] = dir[2];
|
||||
}
|
||||
|
||||
fovslidercheck();
|
||||
dumpsettings();
|
||||
|
||||
if ( !getdvarint( _hash_DBBD8F3B ) )
|
||||
{
|
||||
if ( !isdefined( level.fogsundir ) )
|
||||
{
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[0] = 1;
|
||||
level.fogsundir[1] = 0;
|
||||
level.fogsundir[2] = 0;
|
||||
}
|
||||
|
||||
setvolfog( level.fognearplane, level.fogexphalfplane, level.fogexphalfheight, level.fogbaseheight, level.fogcolorred, level.fogcolorgreen, level.fogcolorblue, level.fogcolorscale, level.sunfogcolorred, level.sunfogcolorgreen, level.sunfogcolorblue, level.fogsundir[0], level.fogsundir[1], level.fogsundir[2], level.sunstartangle, level.sunendangle, 0, level.fogmaxopacity );
|
||||
}
|
||||
else
|
||||
setexpfog( 100000000, 100000001, 0, 0, 0, 0 );
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
if ( !isDefined( level.tweakfile ) )
|
||||
{
|
||||
level.tweakfile = 0;
|
||||
}
|
||||
if ( getDvar( "scr_fog_baseheight" ) == "" )
|
||||
{
|
||||
setdvar( "scr_fog_exp_halfplane", "500" );
|
||||
setdvar( "scr_fog_exp_halfheight", "500" );
|
||||
setdvar( "scr_fog_nearplane", "0" );
|
||||
setdvar( "scr_fog_baseheight", "0" );
|
||||
}
|
||||
setdvar( "scr_fog_fraction", "1.0" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault[ "nearStart" ] );
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault[ "nearEnd" ] );
|
||||
setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] );
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault[ "farEnd" ] );
|
||||
setdvar( "scr_dof_nearBlur", level.dofdefault[ "nearBlur" ] );
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault[ "farBlur" ] );
|
||||
file = undefined;
|
||||
filename = undefined;
|
||||
tweak_toggle = 1;
|
||||
for ( ;; )
|
||||
{
|
||||
while ( getDvarInt( "scr_art_tweak" ) == 0 )
|
||||
{
|
||||
tweak_toggle = 1;
|
||||
wait 0,05;
|
||||
}
|
||||
if ( tweak_toggle )
|
||||
{
|
||||
tweak_toggle = 0;
|
||||
fogsettings = getfogsettings();
|
||||
setdvar( "scr_fog_nearplane", fogsettings[ 0 ] );
|
||||
setdvar( "scr_fog_exp_halfplane", fogsettings[ 1 ] );
|
||||
setdvar( "scr_fog_exp_halfheight", fogsettings[ 3 ] );
|
||||
setdvar( "scr_fog_baseheight", fogsettings[ 2 ] );
|
||||
setdvar( "scr_fog_color", fogsettings[ 4 ] + " " + fogsettings[ 5 ] + " " + fogsettings[ 6 ] );
|
||||
setdvar( "scr_fog_color_scale", fogsettings[ 7 ] );
|
||||
setdvar( "scr_sun_fog_color", fogsettings[ 8 ] + " " + fogsettings[ 9 ] + " " + fogsettings[ 10 ] );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[ 0 ] = fogsettings[ 11 ];
|
||||
level.fogsundir[ 1 ] = fogsettings[ 12 ];
|
||||
level.fogsundir[ 2 ] = fogsettings[ 13 ];
|
||||
setdvar( "scr_sun_fog_start_angle", fogsettings[ 14 ] );
|
||||
setdvar( "scr_sun_fog_end_angle", fogsettings[ 15 ] );
|
||||
setdvar( "scr_fog_max_opacity", fogsettings[ 16 ] );
|
||||
}
|
||||
level.fogexphalfplane = getDvarFloat( "scr_fog_exp_halfplane" );
|
||||
level.fogexphalfheight = getDvarFloat( "scr_fog_exp_halfheight" );
|
||||
level.fognearplane = getDvarFloat( "scr_fog_nearplane" );
|
||||
level.fogbaseheight = getDvarFloat( "scr_fog_baseheight" );
|
||||
level.fogcolorred = getDvarColorRed( "scr_fog_color" );
|
||||
level.fogcolorgreen = getDvarColorGreen( "scr_fog_color" );
|
||||
level.fogcolorblue = getDvarColorBlue( "scr_fog_color" );
|
||||
level.fogcolorscale = getDvarFloat( "scr_fog_color_scale" );
|
||||
level.sunfogcolorred = getDvarColorRed( "scr_sun_fog_color" );
|
||||
level.sunfogcolorgreen = getDvarColorGreen( "scr_sun_fog_color" );
|
||||
level.sunfogcolorblue = getDvarColorBlue( "scr_sun_fog_color" );
|
||||
level.sunstartangle = getDvarFloat( "scr_sun_fog_start_angle" );
|
||||
level.sunendangle = getDvarFloat( "scr_sun_fog_end_angle" );
|
||||
level.fogmaxopacity = getDvarFloat( "scr_fog_max_opacity" );
|
||||
if ( getDvarInt( "scr_art_sun_fog_dir_set" ) )
|
||||
{
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
println( "Setting sun fog direction to facing of player" );
|
||||
players = get_players();
|
||||
dir = vectornormalize( anglesToForward( players[ 0 ] getplayerangles() ) );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[ 0 ] = dir[ 0 ];
|
||||
level.fogsundir[ 1 ] = dir[ 1 ];
|
||||
level.fogsundir[ 2 ] = dir[ 2 ];
|
||||
}
|
||||
fovslidercheck();
|
||||
dumpsettings();
|
||||
if ( !getDvarInt( "scr_fog_disable" ) )
|
||||
{
|
||||
if ( !isDefined( level.fogsundir ) )
|
||||
{
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[ 0 ] = 1;
|
||||
level.fogsundir[ 1 ] = 0;
|
||||
level.fogsundir[ 2 ] = 0;
|
||||
}
|
||||
setvolfog( level.fognearplane, level.fogexphalfplane, level.fogexphalfheight, level.fogbaseheight, level.fogcolorred, level.fogcolorgreen, level.fogcolorblue, level.fogcolorscale, level.sunfogcolorred, level.sunfogcolorgreen, level.sunfogcolorblue, level.fogsundir[ 0 ], level.fogsundir[ 1 ], level.fogsundir[ 2 ], level.sunstartangle, level.sunendangle, 0, level.fogmaxopacity );
|
||||
}
|
||||
else
|
||||
{
|
||||
setexpfog( 100000000, 100000001, 0, 0, 0, 0 );
|
||||
}
|
||||
wait 0,1;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
fovslidercheck()
|
||||
{
|
||||
if ( level.dofdefault["nearStart"] >= level.dofdefault["nearEnd"] )
|
||||
{
|
||||
level.dofdefault["nearStart"] = level.dofdefault["nearEnd"] - 1;
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault["nearStart"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["nearEnd"] <= level.dofdefault["nearStart"] )
|
||||
{
|
||||
level.dofdefault["nearEnd"] = level.dofdefault["nearStart"] + 1;
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault["nearEnd"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farStart"] >= level.dofdefault["farEnd"] )
|
||||
{
|
||||
level.dofdefault["farStart"] = level.dofdefault["farEnd"] - 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault["farStart"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farEnd"] <= level.dofdefault["farStart"] )
|
||||
{
|
||||
level.dofdefault["farEnd"] = level.dofdefault["farStart"] + 1;
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault["farEnd"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farBlur"] >= level.dofdefault["nearBlur"] )
|
||||
{
|
||||
level.dofdefault["farBlur"] = level.dofdefault["nearBlur"] - 0.1;
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault["farBlur"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farStart"] <= level.dofdefault["nearEnd"] )
|
||||
{
|
||||
level.dofdefault["farStart"] = level.dofdefault["nearEnd"] + 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault["farStart"] );
|
||||
}
|
||||
if ( level.dofdefault[ "nearStart" ] >= level.dofdefault[ "nearEnd" ] )
|
||||
{
|
||||
level.dofdefault[ "nearStart" ] = level.dofdefault[ "nearEnd" ] - 1;
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault[ "nearStart" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "nearEnd" ] <= level.dofdefault[ "nearStart" ] )
|
||||
{
|
||||
level.dofdefault[ "nearEnd" ] = level.dofdefault[ "nearStart" ] + 1;
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault[ "nearEnd" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farStart" ] >= level.dofdefault[ "farEnd" ] )
|
||||
{
|
||||
level.dofdefault[ "farStart" ] = level.dofdefault[ "farEnd" ] - 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farEnd" ] <= level.dofdefault[ "farStart" ] )
|
||||
{
|
||||
level.dofdefault[ "farEnd" ] = level.dofdefault[ "farStart" ] + 1;
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault[ "farEnd" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farBlur" ] >= level.dofdefault[ "nearBlur" ] )
|
||||
{
|
||||
level.dofdefault[ "farBlur" ] = level.dofdefault[ "nearBlur" ] - 0,1;
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault[ "farBlur" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farStart" ] <= level.dofdefault[ "nearEnd" ] )
|
||||
{
|
||||
level.dofdefault[ "farStart" ] = level.dofdefault[ "nearEnd" ] + 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] );
|
||||
}
|
||||
}
|
||||
|
||||
dumpsettings()
|
||||
{
|
||||
/#
|
||||
if ( getdvar( "scr_art_dump" ) != "0" )
|
||||
{
|
||||
println( "\tstart_dist = " + level.fognearplane + ";" );
|
||||
println( "\thalf_dist = " + level.fogexphalfplane + ";" );
|
||||
println( "\thalf_height = " + level.fogexphalfheight + ";" );
|
||||
println( "\tbase_height = " + level.fogbaseheight + ";" );
|
||||
println( "\tfog_r = " + level.fogcolorred + ";" );
|
||||
println( "\tfog_g = " + level.fogcolorgreen + ";" );
|
||||
println( "\tfog_b = " + level.fogcolorblue + ";" );
|
||||
println( "\tfog_scale = " + level.fogcolorscale + ";" );
|
||||
println( "\tsun_col_r = " + level.sunfogcolorred + ";" );
|
||||
println( "\tsun_col_g = " + level.sunfogcolorgreen + ";" );
|
||||
println( "\tsun_col_b = " + level.sunfogcolorblue + ";" );
|
||||
println( "\tsun_dir_x = " + level.fogsundir[0] + ";" );
|
||||
println( "\tsun_dir_y = " + level.fogsundir[1] + ";" );
|
||||
println( "\tsun_dir_z = " + level.fogsundir[2] + ";" );
|
||||
println( "\tsun_start_ang = " + level.sunstartangle + ";" );
|
||||
println( "\tsun_stop_ang = " + level.sunendangle + ";" );
|
||||
println( "\ttime = 0;" );
|
||||
println( "\tmax_fog_opacity = " + level.fogmaxopacity + ";" );
|
||||
println( "" );
|
||||
println( "\tsetVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale," );
|
||||
println( "\t\tsun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, " );
|
||||
println( "\t\tsun_stop_ang, time, max_fog_opacity);" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
}
|
||||
if ( getDvar( "scr_art_dump" ) != "0" )
|
||||
{
|
||||
println( "\tstart_dist = " + level.fognearplane + ";" );
|
||||
println( "\thalf_dist = " + level.fogexphalfplane + ";" );
|
||||
println( "\thalf_height = " + level.fogexphalfheight + ";" );
|
||||
println( "\tbase_height = " + level.fogbaseheight + ";" );
|
||||
println( "\tfog_r = " + level.fogcolorred + ";" );
|
||||
println( "\tfog_g = " + level.fogcolorgreen + ";" );
|
||||
println( "\tfog_b = " + level.fogcolorblue + ";" );
|
||||
println( "\tfog_scale = " + level.fogcolorscale + ";" );
|
||||
println( "\tsun_col_r = " + level.sunfogcolorred + ";" );
|
||||
println( "\tsun_col_g = " + level.sunfogcolorgreen + ";" );
|
||||
println( "\tsun_col_b = " + level.sunfogcolorblue + ";" );
|
||||
println( "\tsun_dir_x = " + level.fogsundir[ 0 ] + ";" );
|
||||
println( "\tsun_dir_y = " + level.fogsundir[ 1 ] + ";" );
|
||||
println( "\tsun_dir_z = " + level.fogsundir[ 2 ] + ";" );
|
||||
println( "\tsun_start_ang = " + level.sunstartangle + ";" );
|
||||
println( "\tsun_stop_ang = " + level.sunendangle + ";" );
|
||||
println( "\ttime = 0;" );
|
||||
println( "\tmax_fog_opacity = " + level.fogmaxopacity + ";" );
|
||||
println( "" );
|
||||
println( "\tsetVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale," );
|
||||
println( "\t\tsun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, " );
|
||||
println( "\t\tsun_stop_ang, time, max_fog_opacity);" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_reflection()
|
||||
{
|
||||
/#
|
||||
for ( level.debug_reflection = 0; 1; level.debug_reflection = 0 )
|
||||
{
|
||||
wait 0.1;
|
||||
asm_cond( getdvar( "debug_reflection" ) == "2" && level.debug_reflection != 2 || getdvar( "debug_reflection" ) == "3" && level.debug_reflection != 3, loc_1498 );
|
||||
remove_reflection_objects();
|
||||
asm_cond( getdvar( "debug_reflection" ) == "2", loc_147C );
|
||||
create_reflection_objects();
|
||||
level.debug_reflection = 2;
|
||||
asm_jump( loc_1495 );
|
||||
create_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 3;
|
||||
asm_jump( loc_1517 );
|
||||
asm_cond( getdvar( "debug_reflection" ) == "1" && level.debug_reflection != 1, loc_14EC );
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 1;
|
||||
asm_jump( loc_1517 );
|
||||
asm_cond( getdvar( "debug_reflection" ) == "0" && level.debug_reflection != 0, loc_1517 );
|
||||
remove_reflection_objects();
|
||||
}
|
||||
level.debug_reflection = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
if ( getDvar( "debug_reflection" ) == "2" || level.debug_reflection != 2 && getDvar( "debug_reflection" ) == "3" && level.debug_reflection != 3 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
if ( getDvar( "debug_reflection" ) == "2" )
|
||||
{
|
||||
create_reflection_objects();
|
||||
level.debug_reflection = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
create_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 3;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_reflection" ) == "1" && level.debug_reflection != 1 )
|
||||
{
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_reflection" ) == "0" && level.debug_reflection != 0 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
level.debug_reflection = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
remove_reflection_objects()
|
||||
{
|
||||
/#
|
||||
if ( ( level.debug_reflection == 2 || level.debug_reflection == 3 ) && isdefined( level.debug_reflection_objects ) )
|
||||
{
|
||||
for ( i = 0; i < level.debug_reflection_objects.size; i++ )
|
||||
level.debug_reflection_objects[i] delete();
|
||||
|
||||
level.debug_reflection_objects = undefined;
|
||||
}
|
||||
|
||||
if ( level.debug_reflection == 1 || level.debug_reflection == 3 || level.debug_reflection_matte == 1 || level.debug_color_pallete == 1 || level.debug_color_pallete == 2 )
|
||||
{
|
||||
if ( isdefined( level.debug_reflectionobject ) )
|
||||
level.debug_reflectionobject delete();
|
||||
}
|
||||
if ( level.debug_reflection != 2 && level.debug_reflection == 3 && isDefined( level.debug_reflection_objects ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level.debug_reflection_objects.size )
|
||||
{
|
||||
level.debug_reflection_objects[ i ] delete();
|
||||
i++;
|
||||
}
|
||||
level.debug_reflection_objects = undefined;
|
||||
}
|
||||
if ( level.debug_reflection != 1 && level.debug_reflection != 3 && level.debug_reflection_matte != 1 || level.debug_color_pallete == 1 && level.debug_color_pallete == 2 )
|
||||
{
|
||||
if ( isDefined( level.debug_reflectionobject ) )
|
||||
{
|
||||
level.debug_reflectionobject delete();
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
create_reflection_objects()
|
||||
{
|
||||
/#
|
||||
reflection_locs = getreflectionlocs();
|
||||
|
||||
for ( i = 0; i < reflection_locs.size; i++ )
|
||||
{
|
||||
level.debug_reflection_objects[i] = spawn( "script_model", reflection_locs[i] );
|
||||
level.debug_reflection_objects[i] setmodel( "test_sphere_silver" );
|
||||
}
|
||||
reflection_locs = getreflectionlocs();
|
||||
i = 0;
|
||||
while ( i < reflection_locs.size )
|
||||
{
|
||||
level.debug_reflection_objects[ i ] = spawn( "script_model", reflection_locs[ i ] );
|
||||
level.debug_reflection_objects[ i ] setmodel( "test_sphere_silver" );
|
||||
i++;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
create_reflection_object( model )
|
||||
{
|
||||
if ( !isdefined( model ) )
|
||||
model = "test_sphere_silver";
|
||||
if ( !isDefined( model ) )
|
||||
{
|
||||
model = "test_sphere_silver";
|
||||
}
|
||||
/#
|
||||
if ( isdefined( level.debug_reflectionobject ) )
|
||||
level.debug_reflectionobject delete();
|
||||
|
||||
players = get_players();
|
||||
player = players[0];
|
||||
level.debug_reflectionobject = spawn( "script_model", player geteye() + vectorscale( anglestoforward( player.angles ), 100 ) );
|
||||
level.debug_reflectionobject setmodel( model );
|
||||
level.debug_reflectionobject.origin = player geteye() + vectorscale( anglestoforward( player getplayerangles() ), 100 );
|
||||
level.debug_reflectionobject linkto( player );
|
||||
thread debug_reflection_buttons();
|
||||
if ( isDefined( level.debug_reflectionobject ) )
|
||||
{
|
||||
level.debug_reflectionobject delete();
|
||||
}
|
||||
players = get_players();
|
||||
player = players[ 0 ];
|
||||
level.debug_reflectionobject = spawn( "script_model", player geteye() + vectorScale( anglesToForward( player.angles ), 100 ) );
|
||||
level.debug_reflectionobject setmodel( model );
|
||||
level.debug_reflectionobject.origin = player geteye() + vectorScale( anglesToForward( player getplayerangles() ), 100 );
|
||||
level.debug_reflectionobject linkto( player );
|
||||
thread debug_reflection_buttons();
|
||||
#/
|
||||
}
|
||||
|
||||
debug_reflection_buttons()
|
||||
{
|
||||
/#
|
||||
level notify( "new_reflection_button_running" );
|
||||
level endon( "new_reflection_button_running" );
|
||||
level.debug_reflectionobject endon( "death" );
|
||||
offset = 100;
|
||||
lastoffset = offset;
|
||||
|
||||
while ( getdvar( "debug_reflection" ) == "1" || getdvar( "debug_reflection" ) == "3" || getdvar( "debug_reflection_matte" ) == "1" || getdvar( "debug_color_pallete" ) == "1" || getdvar( "debug_color_pallete" ) == "2" )
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
if ( players[0] buttonpressed( "BUTTON_X" ) )
|
||||
offset += 50;
|
||||
|
||||
if ( players[0] buttonpressed( "BUTTON_Y" ) )
|
||||
offset -= 50;
|
||||
|
||||
if ( offset > 1000 )
|
||||
offset = 1000;
|
||||
|
||||
if ( offset < 64 )
|
||||
offset = 64;
|
||||
|
||||
level.debug_reflectionobject unlink();
|
||||
level.debug_reflectionobject.origin = players[0] geteye() + vectorscale( anglestoforward( players[0] getplayerangles() ), offset );
|
||||
temp_angles = vectortoangles( players[0].origin - level.debug_reflectionobject.origin );
|
||||
level.debug_reflectionobject.angles = ( 0, temp_angles[1], 0 );
|
||||
lastoffset = offset;
|
||||
line( level.debug_reflectionobject.origin, getreflectionorigin( level.debug_reflectionobject.origin ), ( 1, 0, 0 ), 1, 1 );
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( level.debug_reflectionobject ) )
|
||||
level.debug_reflectionobject linkto( players[0] );
|
||||
}
|
||||
level notify( "new_reflection_button_running" );
|
||||
level endon( "new_reflection_button_running" );
|
||||
level.debug_reflectionobject endon( "death" );
|
||||
offset = 100;
|
||||
lastoffset = offset;
|
||||
while ( getDvar( "debug_reflection" ) != "1" && getDvar( "debug_reflection" ) != "3" && getDvar( "debug_reflection_matte" ) != "1" || getDvar( "debug_color_pallete" ) == "1" && getDvar( "debug_color_pallete" ) == "2" )
|
||||
{
|
||||
players = get_players();
|
||||
if ( players[ 0 ] buttonpressed( "BUTTON_X" ) )
|
||||
{
|
||||
offset += 50;
|
||||
}
|
||||
if ( players[ 0 ] buttonpressed( "BUTTON_Y" ) )
|
||||
{
|
||||
offset -= 50;
|
||||
}
|
||||
if ( offset > 1000 )
|
||||
{
|
||||
offset = 1000;
|
||||
}
|
||||
if ( offset < 64 )
|
||||
{
|
||||
offset = 64;
|
||||
}
|
||||
level.debug_reflectionobject unlink();
|
||||
level.debug_reflectionobject.origin = players[ 0 ] geteye() + vectorScale( anglesToForward( players[ 0 ] getplayerangles() ), offset );
|
||||
temp_angles = vectorToAngle( players[ 0 ].origin - level.debug_reflectionobject.origin );
|
||||
level.debug_reflectionobject.angles = ( 0, temp_angles[ 1 ], 0 );
|
||||
lastoffset = offset;
|
||||
line( level.debug_reflectionobject.origin, getreflectionorigin( level.debug_reflectionobject.origin ), ( 1, 0, 0 ), 1, 1 );
|
||||
wait 0,05;
|
||||
if ( isDefined( level.debug_reflectionobject ) )
|
||||
{
|
||||
level.debug_reflectionobject linkto( players[ 0 ] );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_reflection_matte()
|
||||
{
|
||||
/#
|
||||
for ( level.debug_reflection_matte = 0; 1; level.debug_reflection_matte = 0 )
|
||||
{
|
||||
wait 0.1;
|
||||
asm_cond( getdvar( "debug_reflection_matte" ) == "1" && level.debug_reflection_matte != 1, loc_18DC );
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_sphere_lambert" );
|
||||
level.debug_reflection_matte = 1;
|
||||
asm_jump( loc_1907 );
|
||||
asm_cond( getdvar( "debug_reflection_matte" ) == "0" && level.debug_reflection_matte != 0, loc_1907 );
|
||||
remove_reflection_objects();
|
||||
}
|
||||
level.debug_reflection_matte = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
if ( getDvar( "debug_reflection_matte" ) == "1" && level.debug_reflection_matte != 1 )
|
||||
{
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_sphere_lambert" );
|
||||
level.debug_reflection_matte = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_reflection_matte" ) == "0" && level.debug_reflection_matte != 0 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
level.debug_reflection_matte = 0;
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_color_pallete()
|
||||
{
|
||||
/#
|
||||
for ( level.debug_color_pallete = 0; 1; level.debug_color_pallete = 0 )
|
||||
{
|
||||
wait 0.1;
|
||||
asm_cond( getdvar( "debug_color_pallete" ) == "1" && level.debug_color_pallete != 1, loc_1980 );
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart" );
|
||||
level.debug_color_pallete = 1;
|
||||
asm_jump( loc_19E7 );
|
||||
asm_cond( getdvar( "debug_color_pallete" ) == "2" && level.debug_color_pallete != 2, loc_19BC );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart_unlit" );
|
||||
level.debug_color_pallete = 2;
|
||||
asm_jump( loc_19E7 );
|
||||
asm_cond( getdvar( "debug_color_pallete" ) == "0" && level.debug_color_pallete != 0, loc_19E7 );
|
||||
remove_reflection_objects();
|
||||
}
|
||||
level.debug_color_pallete = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
if ( getDvar( "debug_color_pallete" ) == "1" && level.debug_color_pallete != 1 )
|
||||
{
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart" );
|
||||
level.debug_color_pallete = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_color_pallete" ) == "2" && level.debug_color_pallete != 2 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart_unlit" );
|
||||
level.debug_color_pallete = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_color_pallete" ) == "0" && level.debug_color_pallete != 0 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
level.debug_color_pallete = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,139 +1,150 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
wait_until_first_player()
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
if ( !isdefined( players[0] ) )
|
||||
level waittill( "first_player_ready" );
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
players[i] thread monitor_player_sprint();
|
||||
players = get_players();
|
||||
if ( !isDefined( players[ 0 ] ) )
|
||||
{
|
||||
level waittill( "first_player_ready" );
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
players[ i ] thread monitor_player_sprint();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
stand_think( trig )
|
||||
{
|
||||
killtext = "kill_stand_think" + trig getentitynumber();
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( killtext );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( self.player_is_moving )
|
||||
trig playsound( trig.script_label );
|
||||
|
||||
wait 1;
|
||||
}
|
||||
killtext = "kill_stand_think" + trig getentitynumber();
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( killtext );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self.player_is_moving )
|
||||
{
|
||||
trig playsound( trig.script_label );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_player_sprint()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread monitor_player_movement();
|
||||
|
||||
for ( self._is_sprinting = 0; 1; self._is_sprinting = 0 )
|
||||
{
|
||||
self waittill( "sprint_begin" );
|
||||
|
||||
self._is_sprinting = 1;
|
||||
|
||||
self waittill( "sprint_end" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self thread monitor_player_movement();
|
||||
self._is_sprinting = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "sprint_begin" );
|
||||
self._is_sprinting = 1;
|
||||
self waittill( "sprint_end" );
|
||||
self._is_sprinting = 0;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_player_movement()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
org_1 = self.origin;
|
||||
wait 1.0;
|
||||
org_2 = self.origin;
|
||||
distancemoved = distancesquared( org_1, org_2 );
|
||||
|
||||
if ( distancemoved > 4096 )
|
||||
self.player_is_moving = 1;
|
||||
else
|
||||
self.player_is_moving = 0;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
org_1 = self.origin;
|
||||
wait 1;
|
||||
org_2 = self.origin;
|
||||
distancemoved = distancesquared( org_1, org_2 );
|
||||
if ( distancemoved > 4096 )
|
||||
{
|
||||
self.player_is_moving = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.player_is_moving = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
thread_enter_exit_sound( trig )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
trig.touchingplayers[self getentitynumber()] = 1;
|
||||
|
||||
if ( isdefined( trig.script_sound ) && trig.script_activated && self._is_sprinting )
|
||||
self playsound( trig.script_sound );
|
||||
|
||||
self thread stand_think( trig );
|
||||
|
||||
while ( self istouching( trig ) )
|
||||
wait 0.1;
|
||||
|
||||
self notify( "kill_stand_think" + trig getentitynumber() );
|
||||
self playsound( trig.script_noteworthy );
|
||||
trig.touchingplayers[self getentitynumber()] = 0;
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
trig.touchingplayers[ self getentitynumber() ] = 1;
|
||||
if ( isDefined( trig.script_sound ) && trig.script_activated && self._is_sprinting )
|
||||
{
|
||||
self playsound( trig.script_sound );
|
||||
}
|
||||
self thread stand_think( trig );
|
||||
while ( self istouching( trig ) )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
self notify( "kill_stand_think" + trig getentitynumber() );
|
||||
self playsound( trig.script_noteworthy );
|
||||
trig.touchingplayers[ self getentitynumber() ] = 0;
|
||||
}
|
||||
|
||||
thread_step_trigger()
|
||||
{
|
||||
if ( !isdefined( self.script_activated ) )
|
||||
self.script_activated = 1;
|
||||
|
||||
if ( !isdefined( self.touchingplayers ) )
|
||||
{
|
||||
self.touchingplayers = [];
|
||||
|
||||
for ( i = 0; i < 4; i++ )
|
||||
self.touchingplayers[i] = 0;
|
||||
}
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
|
||||
if ( self.touchingplayers[who getentitynumber()] == 0 )
|
||||
who thread thread_enter_exit_sound( self );
|
||||
}
|
||||
if ( !isDefined( self.script_activated ) )
|
||||
{
|
||||
self.script_activated = 1;
|
||||
}
|
||||
while ( !isDefined( self.touchingplayers ) )
|
||||
{
|
||||
self.touchingplayers = [];
|
||||
i = 0;
|
||||
while ( i < 4 )
|
||||
{
|
||||
self.touchingplayers[ i ] = 0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
if ( self.touchingplayers[ who getentitynumber() ] == 0 )
|
||||
{
|
||||
who thread thread_enter_exit_sound( self );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
disable_bump_trigger( triggername )
|
||||
{
|
||||
triggers = getentarray( "audio_bump_trigger", "targetname" );
|
||||
|
||||
if ( isdefined( triggers ) )
|
||||
{
|
||||
for ( i = 0; i < triggers.size; i++ )
|
||||
{
|
||||
if ( isdefined( triggers[i].script_label ) && triggers[i].script_label == triggername )
|
||||
triggers[i].script_activated = 0;
|
||||
}
|
||||
}
|
||||
triggers = getentarray( "audio_bump_trigger", "targetname" );
|
||||
while ( isDefined( triggers ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < triggers.size )
|
||||
{
|
||||
if ( isDefined( triggers[ i ].script_label ) && triggers[ i ].script_label == triggername )
|
||||
{
|
||||
triggers[ i ].script_activated = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get_player_index_number( player )
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i] == player )
|
||||
return i;
|
||||
}
|
||||
|
||||
return 1;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ] == player )
|
||||
{
|
||||
return i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,262 +1,273 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps/mp/_challenges;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
precachemodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
precachemodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
precachemodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
precachemodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
|
||||
onspawn( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
|
||||
|
||||
isfriendly = 0;
|
||||
|
||||
if ( isdefined( endpos ) )
|
||||
{
|
||||
retrievable_model = spawn( "script_model", endpos );
|
||||
retrievable_model setmodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
retrievable_model setteam( player.team );
|
||||
retrievable_model setowner( player );
|
||||
retrievable_model.owner = player;
|
||||
retrievable_model.angles = angles;
|
||||
retrievable_model.name = watcher.weapon;
|
||||
retrievable_model.targetname = "sticky_weapon";
|
||||
|
||||
if ( isdefined( prey ) )
|
||||
{
|
||||
if ( level.teambased && isplayer( prey ) && player.team == prey.team )
|
||||
isfriendly = 1;
|
||||
else if ( level.teambased && isai( prey ) && player.team == prey.aiteam )
|
||||
isfriendly = 1;
|
||||
|
||||
if ( !isfriendly )
|
||||
{
|
||||
if ( isalive( prey ) )
|
||||
retrievable_model droptoground( retrievable_model.origin, 80 );
|
||||
else
|
||||
retrievable_model linkto( prey, bone );
|
||||
}
|
||||
else if ( isfriendly )
|
||||
{
|
||||
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
|
||||
normal = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
watcher.objectarray[watcher.objectarray.size] = retrievable_model;
|
||||
|
||||
if ( isfriendly )
|
||||
retrievable_model waittill( "stationary" );
|
||||
|
||||
retrievable_model thread dropknivestoground();
|
||||
|
||||
if ( isfriendly )
|
||||
player notify( "ballistic_knife_stationary", retrievable_model, normal );
|
||||
else
|
||||
player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
|
||||
retrievable_model thread wait_to_show_glowing_model( prey );
|
||||
}
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
|
||||
isfriendly = 0;
|
||||
if ( isDefined( endpos ) )
|
||||
{
|
||||
retrievable_model = spawn( "script_model", endpos );
|
||||
retrievable_model setmodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
retrievable_model setteam( player.team );
|
||||
retrievable_model setowner( player );
|
||||
retrievable_model.owner = player;
|
||||
retrievable_model.angles = angles;
|
||||
retrievable_model.name = watcher.weapon;
|
||||
retrievable_model.targetname = "sticky_weapon";
|
||||
if ( isDefined( prey ) )
|
||||
{
|
||||
if ( level.teambased && isplayer( prey ) && player.team == prey.team )
|
||||
{
|
||||
isfriendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.teambased && isai( prey ) && player.team == prey.aiteam )
|
||||
{
|
||||
isfriendly = 1;
|
||||
}
|
||||
}
|
||||
if ( !isfriendly )
|
||||
{
|
||||
if ( isalive( prey ) )
|
||||
{
|
||||
retrievable_model droptoground( retrievable_model.origin, 80 );
|
||||
}
|
||||
else
|
||||
{
|
||||
retrievable_model linkto( prey, bone );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isfriendly )
|
||||
{
|
||||
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
|
||||
normal = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
watcher.objectarray[ watcher.objectarray.size ] = retrievable_model;
|
||||
if ( isfriendly )
|
||||
{
|
||||
retrievable_model waittill( "stationary" );
|
||||
}
|
||||
retrievable_model thread dropknivestoground();
|
||||
if ( isfriendly )
|
||||
{
|
||||
player notify( "ballistic_knife_stationary" );
|
||||
}
|
||||
else
|
||||
{
|
||||
player notify( "ballistic_knife_stationary" );
|
||||
}
|
||||
retrievable_model thread wait_to_show_glowing_model( prey );
|
||||
}
|
||||
}
|
||||
|
||||
wait_to_show_glowing_model( prey )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
glowing_retrievable_model = spawn( "script_model", self.origin );
|
||||
self.glowing_model = glowing_retrievable_model;
|
||||
glowing_retrievable_model.angles = self.angles;
|
||||
glowing_retrievable_model linkto( self );
|
||||
|
||||
if ( isdefined( prey ) && !isalive( prey ) )
|
||||
wait 2;
|
||||
|
||||
glowing_retrievable_model setmodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
glowing_retrievable_model = spawn( "script_model", self.origin );
|
||||
self.glowing_model = glowing_retrievable_model;
|
||||
glowing_retrievable_model.angles = self.angles;
|
||||
glowing_retrievable_model linkto( self );
|
||||
if ( isDefined( prey ) && !isalive( prey ) )
|
||||
{
|
||||
wait 2;
|
||||
}
|
||||
glowing_retrievable_model setmodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
|
||||
watch_shutdown()
|
||||
{
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
glowing_model = self.glowing_model;
|
||||
|
||||
self waittill( "death" );
|
||||
|
||||
if ( isdefined( pickuptrigger ) )
|
||||
pickuptrigger delete();
|
||||
|
||||
if ( isdefined( glowing_model ) )
|
||||
glowing_model delete();
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
glowing_model = self.glowing_model;
|
||||
self waittill( "death" );
|
||||
if ( isDefined( pickuptrigger ) )
|
||||
{
|
||||
pickuptrigger delete();
|
||||
}
|
||||
if ( isDefined( glowing_model ) )
|
||||
{
|
||||
glowing_model delete();
|
||||
}
|
||||
}
|
||||
|
||||
onspawnretrievetrigger( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
|
||||
if ( !isdefined( retrievable_model ) )
|
||||
return;
|
||||
|
||||
vec_scale = 10;
|
||||
trigger_pos = [];
|
||||
|
||||
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
|
||||
{
|
||||
trigger_pos[0] = prey.origin[0];
|
||||
trigger_pos[1] = prey.origin[1];
|
||||
trigger_pos[2] = prey.origin[2] + vec_scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_pos[0] = retrievable_model.origin[0] + vec_scale * normal[0];
|
||||
trigger_pos[1] = retrievable_model.origin[1] + vec_scale * normal[1];
|
||||
trigger_pos[2] = retrievable_model.origin[2] + vec_scale * normal[2];
|
||||
}
|
||||
|
||||
trigger_pos[2] -= 50.0;
|
||||
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ), 0, 50, 100 );
|
||||
pickup_trigger.owner = player;
|
||||
retrievable_model.pickuptrigger = pickup_trigger;
|
||||
pickup_trigger enablelinkto();
|
||||
|
||||
if ( isdefined( prey ) )
|
||||
pickup_trigger linkto( prey );
|
||||
else
|
||||
pickup_trigger linkto( retrievable_model );
|
||||
|
||||
retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
retrievable_model thread watch_shutdown();
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
if ( !isDefined( retrievable_model ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
vec_scale = 10;
|
||||
trigger_pos = [];
|
||||
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
|
||||
{
|
||||
trigger_pos[ 0 ] = prey.origin[ 0 ];
|
||||
trigger_pos[ 1 ] = prey.origin[ 1 ];
|
||||
trigger_pos[ 2 ] = prey.origin[ 2 ] + vec_scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( vec_scale * normal[ 0 ] );
|
||||
trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( vec_scale * normal[ 1 ] );
|
||||
trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( vec_scale * normal[ 2 ] );
|
||||
}
|
||||
trigger_pos[ 2 ] -= 50;
|
||||
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ), 0, 50, 100 );
|
||||
pickup_trigger.owner = player;
|
||||
retrievable_model.pickuptrigger = pickup_trigger;
|
||||
pickup_trigger enablelinkto();
|
||||
if ( isDefined( prey ) )
|
||||
{
|
||||
pickup_trigger linkto( prey );
|
||||
}
|
||||
else
|
||||
{
|
||||
pickup_trigger linkto( retrievable_model );
|
||||
}
|
||||
retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
retrievable_model thread watch_shutdown();
|
||||
}
|
||||
|
||||
watch_use_trigger( trigger, model, callback, playersoundonuse, npcsoundonuse )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
level endon( "game_ended" );
|
||||
max_ammo = weaponmaxammo( "knife_ballistic_mp" ) + 1;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
|
||||
if ( !isalive( player ) )
|
||||
continue;
|
||||
|
||||
if ( !player isonground() )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
continue;
|
||||
|
||||
if ( !player hasweapon( "knife_ballistic_mp" ) )
|
||||
continue;
|
||||
|
||||
ammo_stock = player getweaponammostock( "knife_ballistic_mp" );
|
||||
ammo_clip = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
current_weapon = player getcurrentweapon();
|
||||
total_ammo = ammo_stock + ammo_clip;
|
||||
hasreloaded = 1;
|
||||
|
||||
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == "knife_ballistic_mp" )
|
||||
hasreloaded = 0;
|
||||
|
||||
if ( total_ammo >= max_ammo || !hasreloaded )
|
||||
continue;
|
||||
|
||||
if ( isdefined( playersoundonuse ) )
|
||||
player playlocalsound( playersoundonuse );
|
||||
|
||||
if ( isdefined( npcsoundonuse ) )
|
||||
player playsound( npcsoundonuse );
|
||||
|
||||
self thread [[ callback ]]( player );
|
||||
break;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
level endon( "game_ended" );
|
||||
max_ammo = weaponmaxammo( "knife_ballistic_mp" ) + 1;
|
||||
while ( 1 )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
while ( !isalive( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( !player isonground() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( !player hasweapon( "knife_ballistic_mp" ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
ammo_stock = player getweaponammostock( "knife_ballistic_mp" );
|
||||
ammo_clip = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
current_weapon = player getcurrentweapon();
|
||||
total_ammo = ammo_stock + ammo_clip;
|
||||
hasreloaded = 1;
|
||||
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == "knife_ballistic_mp" )
|
||||
{
|
||||
hasreloaded = 0;
|
||||
}
|
||||
if ( total_ammo >= max_ammo || !hasreloaded )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( playersoundonuse ) )
|
||||
{
|
||||
player playlocalsound( playersoundonuse );
|
||||
}
|
||||
if ( isDefined( npcsoundonuse ) )
|
||||
{
|
||||
player playsound( npcsoundonuse );
|
||||
}
|
||||
self thread [[ callback ]]( player );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pick_up( player )
|
||||
{
|
||||
self destroy_ent();
|
||||
current_weapon = player getcurrentweapon();
|
||||
player maps\mp\_challenges::pickedupballisticknife();
|
||||
|
||||
if ( current_weapon != "knife_ballistic_mp" )
|
||||
{
|
||||
clip_ammo = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
|
||||
if ( !clip_ammo )
|
||||
player setweaponammoclip( "knife_ballistic_mp", 1 );
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
self destroy_ent();
|
||||
current_weapon = player getcurrentweapon();
|
||||
player maps/mp/_challenges::pickedupballisticknife();
|
||||
if ( current_weapon != "knife_ballistic_mp" )
|
||||
{
|
||||
clip_ammo = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
if ( !clip_ammo )
|
||||
{
|
||||
player setweaponammoclip( "knife_ballistic_mp", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
}
|
||||
|
||||
destroy_ent()
|
||||
{
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
|
||||
if ( isdefined( pickuptrigger ) )
|
||||
pickuptrigger delete();
|
||||
|
||||
if ( isdefined( self.glowing_model ) )
|
||||
self.glowing_model delete();
|
||||
|
||||
self delete();
|
||||
}
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
if ( isDefined( pickuptrigger ) )
|
||||
{
|
||||
pickuptrigger delete();
|
||||
}
|
||||
if ( isDefined( self.glowing_model ) )
|
||||
{
|
||||
self.glowing_model delete();
|
||||
}
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
|
||||
dropknivestoground()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "drop_objects_to_ground", origin, radius );
|
||||
|
||||
self droptoground( origin, radius );
|
||||
}
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "drop_objects_to_ground", origin, radius );
|
||||
self droptoground( origin, radius );
|
||||
}
|
||||
}
|
||||
|
||||
droptoground( origin, radius )
|
||||
{
|
||||
if ( distancesquared( origin, self.origin ) < radius * radius )
|
||||
{
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
|
||||
self thread updateretrievetrigger();
|
||||
}
|
||||
if ( distancesquared( origin, self.origin ) < ( radius * radius ) )
|
||||
{
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) );
|
||||
self thread updateretrievetrigger();
|
||||
}
|
||||
}
|
||||
|
||||
updateretrievetrigger()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "stationary" );
|
||||
|
||||
trigger = self.pickuptrigger;
|
||||
trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
|
||||
trigger linkto( self );
|
||||
self endon( "death" );
|
||||
self waittill( "stationary" );
|
||||
trigger = self.pickuptrigger;
|
||||
trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 );
|
||||
trigger linkto( self );
|
||||
}
|
||||
|
@ -1,91 +1,87 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level thread onplayerconnect();
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerdeath();
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerdeath();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self._bbdata = [];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self._bbdata["score"] = 0;
|
||||
self._bbdata["momentum"] = 0;
|
||||
self._bbdata["spawntime"] = gettime();
|
||||
self._bbdata["shots"] = 0;
|
||||
self._bbdata["hits"] = 0;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self._bbdata = [];
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self._bbdata[ "score" ] = 0;
|
||||
self._bbdata[ "momentum" ] = 0;
|
||||
self._bbdata[ "spawntime" ] = getTime();
|
||||
self._bbdata[ "shots" ] = 0;
|
||||
self._bbdata[ "hits" ] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect()
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
|
||||
self commitspawndata();
|
||||
break;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
self commitspawndata();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdeath()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "death" );
|
||||
|
||||
self commitspawndata();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "death" );
|
||||
self commitspawndata();
|
||||
}
|
||||
}
|
||||
|
||||
commitspawndata()
|
||||
{
|
||||
/#
|
||||
assert( isdefined( self._bbdata ) );
|
||||
assert( isDefined( self._bbdata ) );
|
||||
#/
|
||||
if ( !isdefined( self._bbdata ) )
|
||||
return;
|
||||
|
||||
bbprint( "mpplayerlives", "gametime %d spawnid %d lifescore %d lifemomentum %d lifetime %d name %s", gettime(), getplayerspawnid( self ), self._bbdata["score"], self._bbdata["momentum"], gettime() - self._bbdata["spawntime"], self.name );
|
||||
if ( !isDefined( self._bbdata ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
bbprint( "mpplayerlives", "gametime %d spawnid %d lifescore %d lifemomentum %d lifetime %d name %s", getTime(), getplayerspawnid( self ), self._bbdata[ "score" ], self._bbdata[ "momentum" ], getTime() - self._bbdata[ "spawntime" ], self.name );
|
||||
}
|
||||
|
||||
commitweapondata( spawnid, currentweapon, time0 )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( self._bbdata ) );
|
||||
assert( isDefined( self._bbdata ) );
|
||||
#/
|
||||
if ( !isdefined( self._bbdata ) )
|
||||
return;
|
||||
|
||||
time1 = gettime();
|
||||
bbprint( "mpweapons", "spawnid %d name %s duration %d shots %d hits %d", spawnid, currentweapon, time1 - time0, self._bbdata["shots"], self._bbdata["hits"] );
|
||||
self._bbdata["shots"] = 0;
|
||||
self._bbdata["hits"] = 0;
|
||||
if ( !isDefined( self._bbdata ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
time1 = getTime();
|
||||
bbprint( "mpweapons", "spawnid %d name %s duration %d shots %d hits %d", spawnid, currentweapon, time1 - time0, self._bbdata[ "shots" ], self._bbdata[ "hits" ] );
|
||||
self._bbdata[ "shots" ] = 0;
|
||||
self._bbdata[ "hits" ] = 0;
|
||||
}
|
||||
|
||||
bbaddtostat( statname, delta )
|
||||
{
|
||||
if ( isdefined( self._bbdata ) && isdefined( self._bbdata[statname] ) )
|
||||
self._bbdata[statname] += delta;
|
||||
if ( isDefined( self._bbdata ) && isDefined( self._bbdata[ statname ] ) )
|
||||
{
|
||||
self._bbdata[ statname ] += delta;
|
||||
}
|
||||
}
|
||||
|
@ -1,20 +1,19 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
businit()
|
||||
{
|
||||
/#
|
||||
assert( level.clientscripts );
|
||||
assert( level.clientscripts );
|
||||
#/
|
||||
level.busstate = "";
|
||||
registerclientsys( "busCmd" );
|
||||
level.busstate = "";
|
||||
registerclientsys( "busCmd" );
|
||||
}
|
||||
|
||||
setbusstate( state )
|
||||
{
|
||||
if ( level.busstate != state )
|
||||
setclientsysstate( "busCmd", state );
|
||||
|
||||
level.busstate = state;
|
||||
if ( level.busstate != state )
|
||||
{
|
||||
setclientsysstate( "busCmd", state );
|
||||
}
|
||||
level.busstate = state;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,76 +1,67 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
setupminimap( material )
|
||||
{
|
||||
requiredmapaspectratio = getdvarfloat( "scr_RequiredMapAspectratio" );
|
||||
corners = getentarray( "minimap_corner", "targetname" );
|
||||
|
||||
if ( corners.size != 2 )
|
||||
{
|
||||
requiredmapaspectratio = getDvarFloat( "scr_RequiredMapAspectratio" );
|
||||
corners = getentarray( "minimap_corner", "targetname" );
|
||||
if ( corners.size != 2 )
|
||||
{
|
||||
/#
|
||||
println( "^1Error: There are not exactly two \"minimap_corner\" entities in the map. Could not set up minimap." );
|
||||
println( "^1Error: There are not exactly two "minimap_corner" entities in the map. Could not set up minimap." );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
|
||||
corner0 = ( corners[0].origin[0], corners[0].origin[1], 0 );
|
||||
corner1 = ( corners[1].origin[0], corners[1].origin[1], 0 );
|
||||
cornerdiff = corner1 - corner0;
|
||||
north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
|
||||
west = ( 0 - north[1], north[0], 0 );
|
||||
|
||||
if ( vectordot( cornerdiff, west ) > 0 )
|
||||
{
|
||||
if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
northwest = corner1;
|
||||
southeast = corner0;
|
||||
}
|
||||
else
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner1 - side;
|
||||
southeast = corner0 + side;
|
||||
}
|
||||
}
|
||||
else if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner0 + side;
|
||||
southeast = corner1 - side;
|
||||
}
|
||||
else
|
||||
{
|
||||
northwest = corner0;
|
||||
southeast = corner1;
|
||||
}
|
||||
|
||||
if ( requiredmapaspectratio > 0 )
|
||||
{
|
||||
northportion = vectordot( northwest - southeast, north );
|
||||
westportion = vectordot( northwest - southeast, west );
|
||||
mapaspectratio = westportion / northportion;
|
||||
|
||||
if ( mapaspectratio < requiredmapaspectratio )
|
||||
{
|
||||
incr = requiredmapaspectratio / mapaspectratio;
|
||||
addvec = vecscale( west, westportion * ( incr - 1 ) * 0.5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
incr = mapaspectratio / requiredmapaspectratio;
|
||||
addvec = vecscale( north, northportion * ( incr - 1 ) * 0.5 );
|
||||
}
|
||||
|
||||
northwest += addvec;
|
||||
southeast -= addvec;
|
||||
}
|
||||
|
||||
setminimap( material, northwest[0], northwest[1], southeast[0], southeast[1] );
|
||||
return;
|
||||
}
|
||||
corner0 = ( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], 0 );
|
||||
corner1 = ( corners[ 1 ].origin[ 0 ], corners[ 1 ].origin[ 1 ], 0 );
|
||||
cornerdiff = corner1 - corner0;
|
||||
north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
|
||||
west = ( 0 - north[ 1 ], north[ 0 ], 0 );
|
||||
if ( vectordot( cornerdiff, west ) > 0 )
|
||||
{
|
||||
if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
northwest = corner1;
|
||||
southeast = corner0;
|
||||
}
|
||||
else
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner1 - side;
|
||||
southeast = corner0 + side;
|
||||
}
|
||||
}
|
||||
else if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner0 + side;
|
||||
southeast = corner1 - side;
|
||||
}
|
||||
else
|
||||
{
|
||||
northwest = corner0;
|
||||
southeast = corner1;
|
||||
}
|
||||
if ( requiredmapaspectratio > 0 )
|
||||
{
|
||||
northportion = vectordot( northwest - southeast, north );
|
||||
westportion = vectordot( northwest - southeast, west );
|
||||
mapaspectratio = westportion / northportion;
|
||||
if ( mapaspectratio < requiredmapaspectratio )
|
||||
{
|
||||
incr = requiredmapaspectratio / mapaspectratio;
|
||||
addvec = vecscale( west, westportion * ( incr - 1 ) * 0,5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
incr = mapaspectratio / requiredmapaspectratio;
|
||||
addvec = vecscale( north, northportion * ( incr - 1 ) * 0,5 );
|
||||
}
|
||||
northwest += addvec;
|
||||
southeast -= addvec;
|
||||
}
|
||||
setminimap( material, northwest[ 0 ], northwest[ 1 ], southeast[ 0 ], southeast[ 1 ] );
|
||||
}
|
||||
|
||||
vecscale( vec, scalar )
|
||||
{
|
||||
return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar );
|
||||
return ( vec[ 0 ] * scalar, vec[ 1 ] * scalar, vec[ 2 ] * scalar );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,508 +1,545 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_createfx;
|
||||
#include maps\mp\_createfxmenu;
|
||||
#include maps/mp/_createfxmenu;
|
||||
#include maps/mp/_createfx;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
store_undo_state( change_type, ents )
|
||||
{
|
||||
if ( !isdefined( level.cfx_undo_states ) )
|
||||
{
|
||||
level.cfx_undo_states = [];
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = spawnstruct();
|
||||
level.cfx_max_states = 10;
|
||||
}
|
||||
|
||||
if ( !isarray( ents ) )
|
||||
ents = array( ents );
|
||||
|
||||
temp_array = [];
|
||||
|
||||
for ( i = 0; i < ents.size; i++ )
|
||||
temp_array[i] = copy_fx_ent( ents[i] );
|
||||
|
||||
state = spawnstruct();
|
||||
state.operation = change_type;
|
||||
state.last_action = level.cfx_last_action;
|
||||
state.ent_array = temp_array;
|
||||
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
|
||||
level.cfx_undo_states[level.cfx_undo_states.size] = state;
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
if ( !isDefined( level.cfx_undo_states ) )
|
||||
{
|
||||
level.cfx_undo_states = [];
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = spawnstruct();
|
||||
level.cfx_max_states = 10;
|
||||
}
|
||||
if ( !isarray( ents ) )
|
||||
{
|
||||
ents = array( ents );
|
||||
}
|
||||
temp_array = [];
|
||||
i = 0;
|
||||
while ( i < ents.size )
|
||||
{
|
||||
temp_array[ i ] = copy_fx_ent( ents[ i ] );
|
||||
i++;
|
||||
}
|
||||
state = spawnstruct();
|
||||
state.operation = change_type;
|
||||
state.last_action = level.cfx_last_action;
|
||||
state.ent_array = temp_array;
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
}
|
||||
level.cfx_undo_states[ level.cfx_undo_states.size ] = state;
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
}
|
||||
|
||||
undo()
|
||||
{
|
||||
if ( !isdefined( level.createfxent ) || !isdefined( level.cfx_undo_states ) || level.cfx_undo_states.size < 1 )
|
||||
return;
|
||||
|
||||
revert_state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
|
||||
if ( level.cfx_last_action != "none" )
|
||||
{
|
||||
store_undo_state( "edit", level.selected_fx_ents );
|
||||
move_undo_state_to_redo();
|
||||
clear_entity_selection( "skip_undo" );
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_entity_selection( "skip_undo" );
|
||||
|
||||
if ( revert_state.operation != "edit" )
|
||||
{
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_redo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else if ( isdefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_redo();
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.cfx_undo_states.size > 1 )
|
||||
{
|
||||
move_undo_state_to_redo();
|
||||
revert_state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
}
|
||||
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.createfxent ) || !isDefined( level.cfx_undo_states ) && level.cfx_undo_states.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
revert_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
if ( level.cfx_last_action != "none" )
|
||||
{
|
||||
store_undo_state( "edit", level.selected_fx_ents );
|
||||
move_undo_state_to_redo();
|
||||
clear_entity_selection( "skip_undo" );
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else clear_entity_selection( "skip_undo" );
|
||||
if ( revert_state.operation != "edit" )
|
||||
{
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_redo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else if ( isDefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_redo();
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.cfx_undo_states.size > 1 )
|
||||
{
|
||||
move_undo_state_to_redo();
|
||||
revert_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
}
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
}
|
||||
}
|
||||
|
||||
apply_state_change( type, revert_state )
|
||||
{
|
||||
if ( type == "undo" )
|
||||
{
|
||||
if ( type == "undo" )
|
||||
{
|
||||
/#
|
||||
println( "^2CreateFX: Undo operation" );
|
||||
println( "^2CreateFX: Undo operation" );
|
||||
#/
|
||||
if ( revert_state.operation == "edit" )
|
||||
undo_edit( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "add" )
|
||||
undo_add( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "delete" )
|
||||
undo_delete( revert_state.ent_array );
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "^2CreateFX: Redo operation" );
|
||||
if ( revert_state.operation == "edit" )
|
||||
{
|
||||
undo_edit( revert_state.ent_array );
|
||||
}
|
||||
else if ( revert_state.operation == "add" )
|
||||
{
|
||||
undo_add( revert_state.ent_array );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( revert_state.operation == "delete" )
|
||||
{
|
||||
undo_delete( revert_state.ent_array );
|
||||
}
|
||||
}
|
||||
}
|
||||
else /#
|
||||
println( "^2CreateFX: Redo operation" );
|
||||
#/
|
||||
if ( revert_state.operation == "edit" )
|
||||
undo_edit( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "add" )
|
||||
undo_delete( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "delete" )
|
||||
undo_add( revert_state.ent_array );
|
||||
}
|
||||
if ( revert_state.operation == "edit" )
|
||||
{
|
||||
undo_edit( revert_state.ent_array );
|
||||
}
|
||||
else if ( revert_state.operation == "add" )
|
||||
{
|
||||
undo_delete( revert_state.ent_array );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( revert_state.operation == "delete" )
|
||||
{
|
||||
undo_add( revert_state.ent_array );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
move_undo_state_to_redo()
|
||||
{
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
|
||||
level.cfx_redo_states[level.cfx_redo_states.size] = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
}
|
||||
level.cfx_redo_states[ level.cfx_redo_states.size ] = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
}
|
||||
|
||||
move_redo_state_to_undo()
|
||||
{
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
|
||||
level.cfx_undo_states[level.cfx_undo_states.size] = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
}
|
||||
level.cfx_undo_states[ level.cfx_undo_states.size ] = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
}
|
||||
|
||||
move_undo_state_to_limbo()
|
||||
{
|
||||
level.cfx_limbo_state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
level.cfx_limbo_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
}
|
||||
|
||||
move_redo_state_to_limbo()
|
||||
{
|
||||
level.cfx_limbo_state = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "redo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
level.cfx_limbo_state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "redo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
}
|
||||
|
||||
move_limbo_state_to_undo()
|
||||
{
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
|
||||
level.cfx_undo_states[level.cfx_undo_states.size] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
}
|
||||
level.cfx_undo_states[ level.cfx_undo_states.size ] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
}
|
||||
|
||||
move_limbo_state_to_redo()
|
||||
{
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
|
||||
level.cfx_redo_states[level.cfx_redo_states.size] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "redo" );
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
}
|
||||
level.cfx_redo_states[ level.cfx_redo_states.size ] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "redo" );
|
||||
}
|
||||
|
||||
undo_edit( ent_array )
|
||||
{
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
/#
|
||||
println( "^3CreateFX: Undoing edit" );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^3CreateFX: Undoing edit" );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
last_id = ent_array[ent_array.size - 1].uniqueid;
|
||||
last_id = ent_array[ ent_array.size - 1 ].uniqueid;
|
||||
if ( last_id > ( level.createfxent.size - 1 ) )
|
||||
{
|
||||
last_id = level.createfxent.size - 1;
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[ j ];
|
||||
i = last_id;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
target_ent = level.createfxent[ i ];
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
copy_values_between_fx_ents( source_ent, target_ent );
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
|
||||
if ( last_id > level.createfxent.size - 1 )
|
||||
last_id = level.createfxent.size - 1;
|
||||
if ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[j];
|
||||
|
||||
for ( i = last_id; i >= 0; i-- )
|
||||
{
|
||||
target_ent = level.createfxent[i];
|
||||
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
copy_values_between_fx_ents( source_ent, target_ent );
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
|
||||
if ( j < 0 )
|
||||
break;
|
||||
|
||||
source_ent = ent_array[j];
|
||||
}
|
||||
}
|
||||
|
||||
update_selected_entities();
|
||||
}
|
||||
}
|
||||
update_selected_entities();
|
||||
/#
|
||||
println( "^1CreateFX: Finished edit" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^1CreateFX: Finished edit" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
}
|
||||
|
||||
undo_add( ent_array )
|
||||
{
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
/#
|
||||
println( "^3createfx: Undoing add." );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^3createfx: Undoing add." );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
last_id = ent_array[ent_array.size - 1].uniqueid;
|
||||
last_id = ent_array[ ent_array.size - 1 ].uniqueid;
|
||||
if ( last_id > ( level.createfxent.size - 1 ) )
|
||||
{
|
||||
last_id = level.createfxent.size - 1;
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[ j ];
|
||||
i = last_id;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
target_ent = level.createfxent[ i ];
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
if ( isDefined( target_ent.looper ) )
|
||||
{
|
||||
target_ent.looper delete();
|
||||
}
|
||||
target_ent notify( "stop_loop" );
|
||||
j--;
|
||||
|
||||
if ( last_id > level.createfxent.size - 1 )
|
||||
last_id = level.createfxent.size - 1;
|
||||
if ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[j];
|
||||
|
||||
for ( i = last_id; i >= 0; i-- )
|
||||
{
|
||||
target_ent = level.createfxent[i];
|
||||
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
if ( isdefined( target_ent.looper ) )
|
||||
target_ent.looper delete();
|
||||
|
||||
target_ent notify( "stop_loop" );
|
||||
level.createfxent[i] = undefined;
|
||||
j--;
|
||||
|
||||
if ( j < 0 )
|
||||
break;
|
||||
|
||||
source_ent = ent_array[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/#
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "createfx: Starting array_remove_undefined()" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "createfx: Starting array_remove_undefined()" );
|
||||
#/
|
||||
arrayremovevalue( level.createfxent, undefined );
|
||||
arrayremovevalue( level.createfxent, undefined );
|
||||
/#
|
||||
println( "^1CreateFX: Finished undo add." );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^1CreateFX: Finished undo add." );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
clear_fx_hudelements();
|
||||
clear_fx_hudelements();
|
||||
}
|
||||
|
||||
undo_delete( ent_array )
|
||||
{
|
||||
/#
|
||||
println( "^3CreateFX: Undoing delete" );
|
||||
debug_print_ent_array( ent_array, "ent_array in undo_delete()" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^3CreateFX: Undoing delete" );
|
||||
debug_print_ent_array( ent_array, "ent_array in undo_delete()" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
if ( level.createfxent.size == 0 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < ent_array.size )
|
||||
{
|
||||
level.createfxent[ i ] = copy_fx_ent( ent_array[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else temp_array = [];
|
||||
i = 0;
|
||||
j = 0;
|
||||
while ( j < level.createfxent.size )
|
||||
{
|
||||
target_ent = level.createfxent[ j ];
|
||||
if ( i >= ent_array.size )
|
||||
{
|
||||
temp_array[ temp_array.size ] = target_ent;
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
else source_ent = ent_array[ i ];
|
||||
if ( target_ent.uniqueid < source_ent.uniqueid )
|
||||
{
|
||||
temp_array[ temp_array.size ] = target_ent;
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_array[ temp_array.size ] = copy_fx_ent( source_ent );
|
||||
j--;
|
||||
|
||||
if ( level.createfxent.size == 0 )
|
||||
{
|
||||
for ( i = 0; i < ent_array.size; i++ )
|
||||
level.createfxent[i] = copy_fx_ent( ent_array[i] );
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_array = [];
|
||||
i = 0;
|
||||
|
||||
for ( j = 0; j < level.createfxent.size; j++ )
|
||||
{
|
||||
target_ent = level.createfxent[j];
|
||||
|
||||
if ( i >= ent_array.size )
|
||||
{
|
||||
temp_array[temp_array.size] = target_ent;
|
||||
continue;
|
||||
}
|
||||
|
||||
source_ent = ent_array[i];
|
||||
|
||||
if ( target_ent.uniqueid < source_ent.uniqueid )
|
||||
{
|
||||
temp_array[temp_array.size] = target_ent;
|
||||
continue;
|
||||
}
|
||||
|
||||
temp_array[temp_array.size] = copy_fx_ent( source_ent );
|
||||
j--;
|
||||
i++;
|
||||
}
|
||||
|
||||
while ( i < ent_array.size )
|
||||
{
|
||||
temp_array[temp_array.size] = ent_array[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
level.createfxent = temp_array;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
while ( i < ent_array.size )
|
||||
{
|
||||
temp_array[ temp_array.size ] = ent_array[ i ];
|
||||
i++;
|
||||
}
|
||||
level.createfxent = temp_array;
|
||||
/#
|
||||
println( "^1Createfx: Finished undoing delete, pre-selection" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^1Createfx: Finished undoing delete, pre-selection" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
last_id = ent_array[ent_array.size - 1].uniqueid;
|
||||
last_id = ent_array[ ent_array.size - 1 ].uniqueid;
|
||||
if ( last_id > ( level.createfxent.size - 1 ) )
|
||||
{
|
||||
last_id = level.createfxent.size - 1;
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[ j ];
|
||||
i = last_id;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
target_ent = level.createfxent[ i ];
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
target_ent post_entity_creation_function();
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
|
||||
if ( last_id > level.createfxent.size - 1 )
|
||||
last_id = level.createfxent.size - 1;
|
||||
if ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[j];
|
||||
|
||||
for ( i = last_id; i >= 0; i-- )
|
||||
{
|
||||
target_ent = level.createfxent[i];
|
||||
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
target_ent post_entity_creation_function();
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
|
||||
if ( j < 0 )
|
||||
break;
|
||||
|
||||
source_ent = ent_array[j];
|
||||
}
|
||||
}
|
||||
|
||||
update_selected_entities();
|
||||
}
|
||||
}
|
||||
update_selected_entities();
|
||||
}
|
||||
|
||||
redo()
|
||||
{
|
||||
if ( !isdefined( level.createfxent ) || !isdefined( level.cfx_redo_states ) || level.cfx_redo_states.size < 1 )
|
||||
return;
|
||||
|
||||
clear_entity_selection( "skip_undo" );
|
||||
|
||||
if ( isdefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_undo();
|
||||
move_redo_state_to_limbo();
|
||||
apply_state_change( "redo", level.cfx_limbo_state );
|
||||
}
|
||||
else
|
||||
{
|
||||
revert_state = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
apply_state_change( "redo", revert_state );
|
||||
|
||||
if ( revert_state.operation == "edit" )
|
||||
move_redo_state_to_limbo();
|
||||
else
|
||||
move_redo_state_to_undo();
|
||||
}
|
||||
|
||||
level.cfx_last_action = "none";
|
||||
if ( isDefined( level.createfxent ) || !isDefined( level.cfx_redo_states ) && level.cfx_redo_states.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
clear_entity_selection( "skip_undo" );
|
||||
if ( isDefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_undo();
|
||||
move_redo_state_to_limbo();
|
||||
apply_state_change( "redo", level.cfx_limbo_state );
|
||||
}
|
||||
else revert_state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
apply_state_change( "redo", revert_state );
|
||||
if ( revert_state.operation == "edit" )
|
||||
{
|
||||
move_redo_state_to_limbo();
|
||||
}
|
||||
else
|
||||
{
|
||||
move_redo_state_to_undo();
|
||||
}
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
|
||||
reorder_ent_array_by_uniqueid( ent_array )
|
||||
{
|
||||
if ( ent_array.size <= 1 )
|
||||
return ent_array;
|
||||
|
||||
array_size = ent_array.size;
|
||||
|
||||
for ( i = 0; i < array_size - 1; i++ )
|
||||
{
|
||||
for ( j = i + 1; j < array_size; j++ )
|
||||
{
|
||||
if ( ent_array[i].uniqueid > ent_array[j].uniqueid )
|
||||
{
|
||||
temp_ent = ent_array[i];
|
||||
ent_array[i] = ent_array[j];
|
||||
ent_array[j] = temp_ent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ent_array;
|
||||
if ( ent_array.size <= 1 )
|
||||
{
|
||||
return ent_array;
|
||||
}
|
||||
array_size = ent_array.size;
|
||||
i = 0;
|
||||
while ( i < ( array_size - 1 ) )
|
||||
{
|
||||
j = i + 1;
|
||||
while ( j < array_size )
|
||||
{
|
||||
if ( ent_array[ i ].uniqueid > ent_array[ j ].uniqueid )
|
||||
{
|
||||
temp_ent = ent_array[ i ];
|
||||
ent_array[ i ] = ent_array[ j ];
|
||||
ent_array[ j ] = temp_ent;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return ent_array;
|
||||
}
|
||||
|
||||
copy_fx_ent( ent )
|
||||
{
|
||||
temp_ent = spawnstruct();
|
||||
temp_ent.drawn = ent.drawn;
|
||||
temp_ent.drawn_axis_model = ent.drawn_axis_model;
|
||||
temp_ent.last_fx_index = ent.last_fx_index;
|
||||
temp_ent.textalpha = ent.textalpha;
|
||||
temp_ent.uniqueid = ent.uniqueid;
|
||||
temp_ent.v = ent.v;
|
||||
return temp_ent;
|
||||
temp_ent = spawnstruct();
|
||||
temp_ent.drawn = ent.drawn;
|
||||
temp_ent.drawn_axis_model = ent.drawn_axis_model;
|
||||
temp_ent.last_fx_index = ent.last_fx_index;
|
||||
temp_ent.textalpha = ent.textalpha;
|
||||
temp_ent.uniqueid = ent.uniqueid;
|
||||
temp_ent.v = ent.v;
|
||||
return temp_ent;
|
||||
}
|
||||
|
||||
copy_values_between_fx_ents( source, dest )
|
||||
{
|
||||
dest.drawn = source.drawn;
|
||||
dest.drawn_axis_model = source.drawn_axis_model;
|
||||
dest.last_fx_index = source.last_fx_index;
|
||||
dest.textalpha = source.textalpha;
|
||||
dest.v = source.v;
|
||||
return dest;
|
||||
dest.drawn = source.drawn;
|
||||
dest.drawn_axis_model = source.drawn_axis_model;
|
||||
dest.last_fx_index = source.last_fx_index;
|
||||
dest.textalpha = source.textalpha;
|
||||
dest.v = source.v;
|
||||
return dest;
|
||||
}
|
||||
|
||||
array_pop( array )
|
||||
{
|
||||
array_size = array.size - 1;
|
||||
temp_array = [];
|
||||
|
||||
if ( array_size <= 0 )
|
||||
return temp_array;
|
||||
|
||||
for ( i = 0; i < array_size; i++ )
|
||||
temp_array[i] = array[i];
|
||||
|
||||
array = temp_array;
|
||||
return array;
|
||||
array_size = array.size - 1;
|
||||
temp_array = [];
|
||||
if ( array_size <= 0 )
|
||||
{
|
||||
return temp_array;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < array_size )
|
||||
{
|
||||
temp_array[ i ] = array[ i ];
|
||||
i++;
|
||||
}
|
||||
array = temp_array;
|
||||
return array;
|
||||
}
|
||||
|
||||
array_drop( array )
|
||||
{
|
||||
if ( array.size > 0 )
|
||||
{
|
||||
temp_array = [];
|
||||
|
||||
for ( i = 1; i < array.size; i++ )
|
||||
temp_array[i - 1] = array[i];
|
||||
|
||||
array = temp_array;
|
||||
}
|
||||
|
||||
return array;
|
||||
if ( array.size > 0 )
|
||||
{
|
||||
temp_array = [];
|
||||
i = 1;
|
||||
while ( i < array.size )
|
||||
{
|
||||
temp_array[ i - 1 ] = array[ i ];
|
||||
i++;
|
||||
}
|
||||
array = temp_array;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
debug_print_ent_array( array, name )
|
||||
{
|
||||
/#
|
||||
if ( isdefined( name ) )
|
||||
println( "Printing out " + name );
|
||||
else
|
||||
println( "Printing out some array" );
|
||||
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
if ( !isdefined( array[i] ) )
|
||||
{
|
||||
println( "" + i + ": deleted effect" );
|
||||
continue;
|
||||
}
|
||||
|
||||
println( "" + i + ": uniqueid: " + array[i].uniqueid + " fxid: " + array[i].v["fxid"] );
|
||||
}
|
||||
if ( isDefined( name ) )
|
||||
{
|
||||
println( "Printing out " + name );
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "Printing out some array" );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
if ( !isDefined( array[ i ] ) )
|
||||
{
|
||||
println( "" + i + ": deleted effect" );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "" + i + ": uniqueid: " + array[ i ].uniqueid + " fxid: " + array[ i ].v[ "fxid" ] );
|
||||
}
|
||||
i++;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_print_latest_state( type )
|
||||
{
|
||||
/#
|
||||
println( "^3Saving " + type + " state" );
|
||||
|
||||
if ( type == "undo" )
|
||||
{
|
||||
if ( !isdefined( level.cfx_undo_states[level.cfx_undo_states.size - 1] ) )
|
||||
{
|
||||
println( "There are no undo states." );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
size = level.cfx_undo_states.size - 1;
|
||||
}
|
||||
else if ( type == "redo" )
|
||||
{
|
||||
if ( !isdefined( level.cfx_redo_states[level.cfx_redo_states.size - 1] ) )
|
||||
{
|
||||
println( "There are no redo states." );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
size = level.cfx_redo_states.size - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isdefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
println( "There is no limbo state." );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.cfx_limbo_state;
|
||||
size = 0;
|
||||
}
|
||||
|
||||
println( "State " + size + " - " + state.operation + ": " + state.last_action );
|
||||
debug_print_ent_array( state.ent_array, "save state ent_array" );
|
||||
println( "^3Saving " + type + " state" );
|
||||
if ( type == "undo" )
|
||||
{
|
||||
if ( !isDefined( level.cfx_undo_states[ level.cfx_undo_states.size - 1 ] ) )
|
||||
{
|
||||
println( "There are no undo states." );
|
||||
return;
|
||||
}
|
||||
state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
size = level.cfx_undo_states.size - 1;
|
||||
}
|
||||
else if ( type == "redo" )
|
||||
{
|
||||
if ( !isDefined( level.cfx_redo_states[ level.cfx_redo_states.size - 1 ] ) )
|
||||
{
|
||||
println( "There are no redo states." );
|
||||
return;
|
||||
}
|
||||
state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
size = level.cfx_redo_states.size - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
println( "There is no limbo state." );
|
||||
return;
|
||||
}
|
||||
state = level.cfx_limbo_state;
|
||||
size = 0;
|
||||
}
|
||||
println( "State " + size + " - " + state.operation + ": " + state.last_action );
|
||||
debug_print_ent_array( state.ent_array, "save state ent_array" );
|
||||
#/
|
||||
}
|
||||
|
@ -1,94 +1,97 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
level.bookmark["kill"] = 0;
|
||||
level.bookmark["event"] = 1;
|
||||
level.bookmark["zm_round_end"] = 2;
|
||||
level.bookmark["zm_player_downed"] = 3;
|
||||
level.bookmark["zm_player_revived"] = 4;
|
||||
level.bookmark["zm_player_bledout"] = 5;
|
||||
level.bookmark["zm_player_use_magicbox"] = 6;
|
||||
level.bookmark["score_event"] = 7;
|
||||
level.bookmark["medal"] = 8;
|
||||
level.bookmark["round_result"] = 9;
|
||||
level.bookmark["game_result"] = 10;
|
||||
level.bookmark["zm_powerup_dropped"] = 11;
|
||||
level.bookmark["zm_player_powerup_grabbed"] = 12;
|
||||
level.bookmark["zm_player_perk"] = 13;
|
||||
level.bookmark["zm_power"] = 14;
|
||||
level.bookmark["zm_player_door"] = 15;
|
||||
level.bookmark["zm_player_buildable_placed"] = 16;
|
||||
level.bookmark["zm_player_use_packapunch"] = 17;
|
||||
level.bookmark["zm_player_rampage"] = 18;
|
||||
level.bookmark["zm_player_grenade_special"] = 19;
|
||||
level.bookmark["zm_player_grenade_multiattack"] = 20;
|
||||
level.bookmark["zm_player_meat_stink"] = 21;
|
||||
level.bookmark["zm_player_grabbed_magicbox"] = 22;
|
||||
level.bookmark["zm_player_grabbed_packapunch"] = 23;
|
||||
level.bookmark["zm_player_grenade_special_long"] = 24;
|
||||
level.bookmark[ "kill" ] = 0;
|
||||
level.bookmark[ "event" ] = 1;
|
||||
level.bookmark[ "zm_round_end" ] = 2;
|
||||
level.bookmark[ "zm_player_downed" ] = 3;
|
||||
level.bookmark[ "zm_player_revived" ] = 4;
|
||||
level.bookmark[ "zm_player_bledout" ] = 5;
|
||||
level.bookmark[ "zm_player_use_magicbox" ] = 6;
|
||||
level.bookmark[ "score_event" ] = 7;
|
||||
level.bookmark[ "medal" ] = 8;
|
||||
level.bookmark[ "round_result" ] = 9;
|
||||
level.bookmark[ "game_result" ] = 10;
|
||||
level.bookmark[ "zm_powerup_dropped" ] = 11;
|
||||
level.bookmark[ "zm_player_powerup_grabbed" ] = 12;
|
||||
level.bookmark[ "zm_player_perk" ] = 13;
|
||||
level.bookmark[ "zm_power" ] = 14;
|
||||
level.bookmark[ "zm_player_door" ] = 15;
|
||||
level.bookmark[ "zm_player_buildable_placed" ] = 16;
|
||||
level.bookmark[ "zm_player_use_packapunch" ] = 17;
|
||||
level.bookmark[ "zm_player_rampage" ] = 18;
|
||||
level.bookmark[ "zm_player_grenade_special" ] = 19;
|
||||
level.bookmark[ "zm_player_grenade_multiattack" ] = 20;
|
||||
level.bookmark[ "zm_player_meat_stink" ] = 21;
|
||||
level.bookmark[ "zm_player_grabbed_magicbox" ] = 22;
|
||||
level.bookmark[ "zm_player_grabbed_packapunch" ] = 23;
|
||||
level.bookmark[ "zm_player_grenade_special_long" ] = 24;
|
||||
}
|
||||
|
||||
bookmark( type, time, clientent1, clientent2, eventpriority, inflictorent, overrideentitycamera, actorent )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( level.bookmark[type] ), "Unable to find a bookmark type for type - " + type );
|
||||
assert( isDefined( level.bookmark[ type ] ), "Unable to find a bookmark type for type - " + type );
|
||||
#/
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
actorentnum = undefined;
|
||||
scoreeventpriority = 0;
|
||||
|
||||
if ( isdefined( clientent1 ) )
|
||||
client1 = clientent1 getentitynumber();
|
||||
|
||||
if ( isdefined( clientent2 ) )
|
||||
client2 = clientent2 getentitynumber();
|
||||
|
||||
if ( isdefined( eventpriority ) )
|
||||
scoreeventpriority = eventpriority;
|
||||
|
||||
if ( isdefined( inflictorent ) )
|
||||
{
|
||||
inflictorentnum = inflictorent getentitynumber();
|
||||
inflictorenttype = inflictorent getentitytype();
|
||||
|
||||
if ( isdefined( inflictorent.birthtime ) )
|
||||
inflictorbirthtime = inflictorent.birthtime;
|
||||
}
|
||||
|
||||
if ( !isdefined( overrideentitycamera ) )
|
||||
overrideentitycamera = 0;
|
||||
|
||||
if ( isdefined( actorent ) )
|
||||
actorentnum = actorent getentitynumber();
|
||||
|
||||
adddemobookmark( level.bookmark[type], time, client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
actorentnum = undefined;
|
||||
scoreeventpriority = 0;
|
||||
if ( isDefined( clientent1 ) )
|
||||
{
|
||||
client1 = clientent1 getentitynumber();
|
||||
}
|
||||
if ( isDefined( clientent2 ) )
|
||||
{
|
||||
client2 = clientent2 getentitynumber();
|
||||
}
|
||||
if ( isDefined( eventpriority ) )
|
||||
{
|
||||
scoreeventpriority = eventpriority;
|
||||
}
|
||||
if ( isDefined( inflictorent ) )
|
||||
{
|
||||
inflictorentnum = inflictorent getentitynumber();
|
||||
inflictorenttype = inflictorent getentitytype();
|
||||
if ( isDefined( inflictorent.birthtime ) )
|
||||
{
|
||||
inflictorbirthtime = inflictorent.birthtime;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( overrideentitycamera ) )
|
||||
{
|
||||
overrideentitycamera = 0;
|
||||
}
|
||||
if ( isDefined( actorent ) )
|
||||
{
|
||||
actorentnum = actorent getentitynumber();
|
||||
}
|
||||
adddemobookmark( level.bookmark[ type ], time, client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
}
|
||||
|
||||
gameresultbookmark( type, winningteamindex, losingteamindex )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( level.bookmark[type] ), "Unable to find a bookmark type for type - " + type );
|
||||
assert( isDefined( level.bookmark[ type ] ), "Unable to find a bookmark type for type - " + type );
|
||||
#/
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
scoreeventpriority = 0;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
overrideentitycamera = 0;
|
||||
actorentnum = undefined;
|
||||
|
||||
if ( isdefined( winningteamindex ) )
|
||||
client1 = winningteamindex;
|
||||
|
||||
if ( isdefined( losingteamindex ) )
|
||||
client2 = losingteamindex;
|
||||
|
||||
adddemobookmark( level.bookmark[type], gettime(), client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
scoreeventpriority = 0;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
overrideentitycamera = 0;
|
||||
actorentnum = undefined;
|
||||
if ( isDefined( winningteamindex ) )
|
||||
{
|
||||
client1 = winningteamindex;
|
||||
}
|
||||
if ( isDefined( losingteamindex ) )
|
||||
{
|
||||
client2 = losingteamindex;
|
||||
}
|
||||
adddemobookmark( level.bookmark[ type ], getTime(), client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
}
|
||||
|
@ -1,455 +1,458 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_createfx;
|
||||
#include maps/mp/_createfx;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
print_org( fxcommand, fxid, fxpos, waittime )
|
||||
{
|
||||
/#
|
||||
if ( getdvar( _hash_F49A52C ) == "1" )
|
||||
{
|
||||
println( "{" );
|
||||
println( "\"origin\" \"" + fxpos[0] + " " + fxpos[1] + " " + fxpos[2] + "\"" );
|
||||
println( "\"classname\" \"script_model\"" );
|
||||
println( "\"model\" \"fx\"" );
|
||||
println( "\"script_fxcommand\" \"" + fxcommand + "\"" );
|
||||
println( "\"script_fxid\" \"" + fxid + "\"" );
|
||||
println( "\"script_delay\" \"" + waittime + "\"" );
|
||||
println( "}" );
|
||||
}
|
||||
if ( getDvar( "debug" ) == "1" )
|
||||
{
|
||||
println( "{" );
|
||||
println( ""origin" "" + fxpos[ 0 ] + " " + fxpos[ 1 ] + " " + fxpos[ 2 ] + """ );
|
||||
println( ""classname" "script_model"" );
|
||||
println( ""model" "fx"" );
|
||||
println( ""script_fxcommand" "" + fxcommand + """ );
|
||||
println( ""script_fxid" "" + fxid + """ );
|
||||
println( ""script_delay" "" + waittime + """ );
|
||||
println( "}" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
oneshotfx( fxid, fxpos, waittime, fxpos2 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
oneshotfxthread()
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( self.v["delay"] > 0 )
|
||||
wait( self.v["delay"] );
|
||||
|
||||
create_triggerfx();
|
||||
wait 0,05;
|
||||
if ( self.v[ "delay" ] > 0 )
|
||||
{
|
||||
wait self.v[ "delay" ];
|
||||
}
|
||||
create_triggerfx();
|
||||
}
|
||||
|
||||
create_triggerfx()
|
||||
{
|
||||
self.looper = spawnfx_wrapper( self.v["fxid"], self.v["origin"], self.v["forward"], self.v["up"] );
|
||||
triggerfx( self.looper, self.v["delay"] );
|
||||
create_loopsound();
|
||||
self.looper = spawnfx_wrapper( self.v[ "fxid" ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] );
|
||||
triggerfx( self.looper, self.v[ "delay" ] );
|
||||
create_loopsound();
|
||||
}
|
||||
|
||||
exploderfx( num, fxid, fxpos, waittime, fxpos2, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout, exploder_group )
|
||||
{
|
||||
if ( 1 )
|
||||
{
|
||||
ent = createexploder( fxid );
|
||||
ent.v["origin"] = fxpos;
|
||||
ent.v["angles"] = ( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( fxpos2 ) )
|
||||
ent.v["angles"] = vectortoangles( fxpos2 - fxpos );
|
||||
|
||||
ent.v["delay"] = waittime;
|
||||
ent.v["exploder"] = num;
|
||||
return;
|
||||
}
|
||||
|
||||
fx = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
fx.origin = fxpos;
|
||||
fx.angles = vectortoangles( fxpos2 - fxpos );
|
||||
fx.script_exploder = num;
|
||||
fx.script_fxid = fxid;
|
||||
fx.script_delay = waittime;
|
||||
fx.script_firefx = firefx;
|
||||
fx.script_firefxdelay = firefxdelay;
|
||||
fx.script_firefxsound = firefxsound;
|
||||
fx.script_sound = fxsound;
|
||||
fx.script_earthquake = fxquake;
|
||||
fx.script_damage = fxdamage;
|
||||
fx.script_radius = damage_radius;
|
||||
fx.script_soundalias = soundalias;
|
||||
fx.script_firefxtimeout = firefxtimeout;
|
||||
fx.script_repeat = repeat;
|
||||
fx.script_delay_min = delay_min;
|
||||
fx.script_delay_max = delay_max;
|
||||
fx.script_exploder_group = exploder_group;
|
||||
forward = anglestoforward( fx.angles );
|
||||
forward = vectorscale( forward, 150 );
|
||||
fx.targetpos = fxpos + forward;
|
||||
|
||||
if ( !isdefined( level._script_exploders ) )
|
||||
level._script_exploders = [];
|
||||
|
||||
level._script_exploders[level._script_exploders.size] = fx;
|
||||
maps\mp\_createfx::createfx_showorigin( fxid, fxpos, waittime, fxpos2, "exploderfx", fx, undefined, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout );
|
||||
if ( 1 )
|
||||
{
|
||||
ent = createexploder( fxid );
|
||||
ent.v[ "origin" ] = fxpos;
|
||||
ent.v[ "angles" ] = ( 0, 0, 0 );
|
||||
if ( isDefined( fxpos2 ) )
|
||||
{
|
||||
ent.v[ "angles" ] = vectorToAngle( fxpos2 - fxpos );
|
||||
}
|
||||
ent.v[ "delay" ] = waittime;
|
||||
ent.v[ "exploder" ] = num;
|
||||
return;
|
||||
}
|
||||
fx = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
fx.origin = fxpos;
|
||||
fx.angles = vectorToAngle( fxpos2 - fxpos );
|
||||
fx.script_exploder = num;
|
||||
fx.script_fxid = fxid;
|
||||
fx.script_delay = waittime;
|
||||
fx.script_firefx = firefx;
|
||||
fx.script_firefxdelay = firefxdelay;
|
||||
fx.script_firefxsound = firefxsound;
|
||||
fx.script_sound = fxsound;
|
||||
fx.script_earthquake = fxquake;
|
||||
fx.script_damage = fxdamage;
|
||||
fx.script_radius = damage_radius;
|
||||
fx.script_soundalias = soundalias;
|
||||
fx.script_firefxtimeout = firefxtimeout;
|
||||
fx.script_repeat = repeat;
|
||||
fx.script_delay_min = delay_min;
|
||||
fx.script_delay_max = delay_max;
|
||||
fx.script_exploder_group = exploder_group;
|
||||
forward = anglesToForward( fx.angles );
|
||||
forward = vectorScale( forward, 150 );
|
||||
fx.targetpos = fxpos + forward;
|
||||
if ( !isDefined( level._script_exploders ) )
|
||||
{
|
||||
level._script_exploders = [];
|
||||
}
|
||||
level._script_exploders[ level._script_exploders.size ] = fx;
|
||||
maps/mp/_createfx::createfx_showorigin( fxid, fxpos, waittime, fxpos2, "exploderfx", fx, undefined, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout );
|
||||
}
|
||||
|
||||
loopfx( fxid, fxpos, waittime, fxpos2, fxstart, fxstop, timeout )
|
||||
{
|
||||
/#
|
||||
println( "Loopfx is deprecated!" );
|
||||
println( "Loopfx is deprecated!" );
|
||||
#/
|
||||
ent = createloopeffect( fxid );
|
||||
ent.v["origin"] = fxpos;
|
||||
ent.v["angles"] = ( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( fxpos2 ) )
|
||||
ent.v["angles"] = vectortoangles( fxpos2 - fxpos );
|
||||
|
||||
ent.v["delay"] = waittime;
|
||||
ent = createloopeffect( fxid );
|
||||
ent.v[ "origin" ] = fxpos;
|
||||
ent.v[ "angles" ] = ( 0, 0, 0 );
|
||||
if ( isDefined( fxpos2 ) )
|
||||
{
|
||||
ent.v[ "angles" ] = vectorToAngle( fxpos2 - fxpos );
|
||||
}
|
||||
ent.v[ "delay" ] = waittime;
|
||||
}
|
||||
|
||||
create_looper()
|
||||
{
|
||||
self.looper = playloopedfx( level._effect[self.v["fxid"]], self.v["delay"], self.v["origin"], 0, self.v["forward"], self.v["up"] );
|
||||
create_loopsound();
|
||||
self.looper = playloopedfx( level._effect[ self.v[ "fxid" ] ], self.v[ "delay" ], self.v[ "origin" ], 0, self.v[ "forward" ], self.v[ "up" ] );
|
||||
create_loopsound();
|
||||
}
|
||||
|
||||
create_loopsound()
|
||||
{
|
||||
self notify( "stop_loop" );
|
||||
|
||||
if ( isdefined( self.v["soundalias"] ) && self.v["soundalias"] != "nil" )
|
||||
{
|
||||
if ( isdefined( self.looper ) )
|
||||
self.looper thread maps\mp\_utility::loop_fx_sound( self.v["soundalias"], self.v["origin"], "death" );
|
||||
else
|
||||
thread maps\mp\_utility::loop_fx_sound( self.v["soundalias"], self.v["origin"], "stop_loop" );
|
||||
}
|
||||
self notify( "stop_loop" );
|
||||
if ( isDefined( self.v[ "soundalias" ] ) && self.v[ "soundalias" ] != "nil" )
|
||||
{
|
||||
if ( isDefined( self.looper ) )
|
||||
{
|
||||
self.looper thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "death" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "stop_loop" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stop_loopsound()
|
||||
{
|
||||
self notify( "stop_loop" );
|
||||
self notify( "stop_loop" );
|
||||
}
|
||||
|
||||
loopfxthread()
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( self.fxstart ) )
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
create_looper();
|
||||
|
||||
if ( isdefined( self.timeout ) )
|
||||
thread loopfxstop( self.timeout );
|
||||
|
||||
if ( isdefined( self.fxstop ) )
|
||||
level waittill( "stop fx" + self.fxstop );
|
||||
else
|
||||
return;
|
||||
|
||||
if ( isdefined( self.looper ) )
|
||||
self.looper delete();
|
||||
|
||||
if ( isdefined( self.fxstart ) )
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
else
|
||||
return;
|
||||
}
|
||||
wait 0,05;
|
||||
if ( isDefined( self.fxstart ) )
|
||||
{
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
create_looper();
|
||||
if ( isDefined( self.timeout ) )
|
||||
{
|
||||
thread loopfxstop( self.timeout );
|
||||
}
|
||||
if ( isDefined( self.fxstop ) )
|
||||
{
|
||||
level waittill( "stop fx" + self.fxstop );
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.looper ) )
|
||||
{
|
||||
self.looper delete();
|
||||
}
|
||||
if ( isDefined( self.fxstart ) )
|
||||
{
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loopfxchangeid( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
ent waittill( "effect id changed", change );
|
||||
self endon( "death" );
|
||||
ent waittill( "effect id changed", change );
|
||||
}
|
||||
|
||||
loopfxchangeorg( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ent waittill( "effect org changed", change );
|
||||
|
||||
self.origin = change;
|
||||
}
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
ent waittill( "effect org changed", change );
|
||||
self.origin = change;
|
||||
}
|
||||
}
|
||||
|
||||
loopfxchangedelay( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
ent waittill( "effect delay changed", change );
|
||||
self endon( "death" );
|
||||
ent waittill( "effect delay changed", change );
|
||||
}
|
||||
|
||||
loopfxdeletion( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
ent waittill( "effect deleted" );
|
||||
|
||||
self delete();
|
||||
self endon( "death" );
|
||||
ent waittill( "effect deleted" );
|
||||
self delete();
|
||||
}
|
||||
|
||||
loopfxstop( timeout )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait( timeout );
|
||||
self.looper delete();
|
||||
self endon( "death" );
|
||||
wait timeout;
|
||||
self.looper delete();
|
||||
}
|
||||
|
||||
loopsound( sound, pos, waittime )
|
||||
{
|
||||
level thread loopsoundthread( sound, pos, waittime );
|
||||
level thread loopsoundthread( sound, pos, waittime );
|
||||
}
|
||||
|
||||
loopsoundthread( sound, pos, waittime )
|
||||
{
|
||||
org = spawn( "script_origin", pos );
|
||||
org.origin = pos;
|
||||
org playloopsound( sound );
|
||||
org = spawn( "script_origin", pos );
|
||||
org.origin = pos;
|
||||
org playloopsound( sound );
|
||||
}
|
||||
|
||||
gunfireloopfx( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
thread gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
thread gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
}
|
||||
|
||||
gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0.05;
|
||||
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxent = spawnfx( level._effect[fxid], fxpos );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
|
||||
for ( i = 0; i < shotnum; i++ )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
wait( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
}
|
||||
|
||||
wait( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0,05;
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxent = spawnfx( level._effect[ fxid ], fxpos );
|
||||
for ( ;; )
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
i = 0;
|
||||
while ( i < shotnum )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
wait ( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
i++;
|
||||
}
|
||||
wait ( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
}
|
||||
|
||||
gunfireloopfxvec( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
thread gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
thread gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
}
|
||||
|
||||
gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0.05;
|
||||
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxpos2 = vectornormalize( fxpos2 - fxpos );
|
||||
fxent = spawnfx( level._effect[fxid], fxpos, fxpos2 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
|
||||
for ( i = 0; i < int( shotnum / level.fxfireloopmod ); i++ )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
delay = ( shotdelaybase + randomfloat( shotdelayrange ) ) * level.fxfireloopmod;
|
||||
|
||||
if ( delay < 0.05 )
|
||||
delay = 0.05;
|
||||
|
||||
wait( delay );
|
||||
}
|
||||
|
||||
wait( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
wait( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0,05;
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxpos2 = vectornormalize( fxpos2 - fxpos );
|
||||
fxent = spawnfx( level._effect[ fxid ], fxpos, fxpos2 );
|
||||
for ( ;; )
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
i = 0;
|
||||
while ( i < int( shotnum / level.fxfireloopmod ) )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
delay = ( shotdelaybase + randomfloat( shotdelayrange ) ) * level.fxfireloopmod;
|
||||
if ( delay < 0,05 )
|
||||
{
|
||||
delay = 0,05;
|
||||
}
|
||||
wait delay;
|
||||
i++;
|
||||
}
|
||||
wait ( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
wait ( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
}
|
||||
|
||||
setfireloopmod( value )
|
||||
{
|
||||
level.fxfireloopmod = 1 / value;
|
||||
level.fxfireloopmod = 1 / value;
|
||||
}
|
||||
|
||||
setup_fx()
|
||||
{
|
||||
if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) )
|
||||
return;
|
||||
|
||||
org = undefined;
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
ent = getent( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( ent ) )
|
||||
org = ent.origin;
|
||||
}
|
||||
|
||||
fxstart = undefined;
|
||||
|
||||
if ( isdefined( self.script_fxstart ) )
|
||||
fxstart = self.script_fxstart;
|
||||
|
||||
fxstop = undefined;
|
||||
|
||||
if ( isdefined( self.script_fxstop ) )
|
||||
fxstop = self.script_fxstop;
|
||||
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
oneshotfx( self.script_fxid, self.origin, self.script_delay, org );
|
||||
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
loopfx( self.script_fxid, self.origin, self.script_delay, org, fxstart, fxstop );
|
||||
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
loopsound( self.script_fxid, self.origin, self.script_delay );
|
||||
|
||||
self delete();
|
||||
if ( isDefined( self.script_fxid ) || !isDefined( self.script_fxcommand ) && !isDefined( self.script_delay ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
org = undefined;
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
ent = getent( self.target, "targetname" );
|
||||
if ( isDefined( ent ) )
|
||||
{
|
||||
org = ent.origin;
|
||||
}
|
||||
}
|
||||
fxstart = undefined;
|
||||
if ( isDefined( self.script_fxstart ) )
|
||||
{
|
||||
fxstart = self.script_fxstart;
|
||||
}
|
||||
fxstop = undefined;
|
||||
if ( isDefined( self.script_fxstop ) )
|
||||
{
|
||||
fxstop = self.script_fxstop;
|
||||
}
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
{
|
||||
oneshotfx( self.script_fxid, self.origin, self.script_delay, org );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
{
|
||||
loopfx( self.script_fxid, self.origin, self.script_delay, org, fxstart, fxstop );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
{
|
||||
loopsound( self.script_fxid, self.origin, self.script_delay );
|
||||
}
|
||||
self delete();
|
||||
}
|
||||
|
||||
script_print_fx()
|
||||
{
|
||||
/#
|
||||
if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) )
|
||||
{
|
||||
println( "Effect at origin ", self.origin, " doesn't have script_fxid/script_fxcommand/script_delay" );
|
||||
self delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
org = getent( self.target, "targetname" ).origin;
|
||||
else
|
||||
org = "undefined";
|
||||
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
println( "mapsmp_fx::OneShotfx(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
println( "mapsmp_fx::LoopFx(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
println( "mapsmp_fx::LoopSound(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
if ( isDefined( self.script_fxid ) || !isDefined( self.script_fxcommand ) && !isDefined( self.script_delay ) )
|
||||
{
|
||||
println( "Effect at origin ", self.origin, " doesn't have script_fxid/script_fxcommand/script_delay" );
|
||||
self delete();
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
org = getent( self.target, "targetname" ).origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
org = "undefined";
|
||||
}
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
{
|
||||
println( "mapsmp_fx::OneShotfx("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
{
|
||||
println( "mapsmp_fx::LoopFx("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
{
|
||||
println( "mapsmp_fx::LoopSound("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
script_playfx( id, pos, pos2 )
|
||||
{
|
||||
if ( !id )
|
||||
return;
|
||||
|
||||
if ( isdefined( pos2 ) )
|
||||
playfx( id, pos, pos2 );
|
||||
else
|
||||
playfx( id, pos );
|
||||
if ( !id )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( pos2 ) )
|
||||
{
|
||||
playfx( id, pos, pos2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
playfx( id, pos );
|
||||
}
|
||||
}
|
||||
|
||||
script_playfxontag( id, ent, tag )
|
||||
{
|
||||
if ( !id )
|
||||
return;
|
||||
|
||||
playfxontag( id, ent, tag );
|
||||
if ( !id )
|
||||
{
|
||||
return;
|
||||
}
|
||||
playfxontag( id, ent, tag );
|
||||
}
|
||||
|
||||
grenadeexplosionfx( pos )
|
||||
{
|
||||
playfx( level._effect["mechanical explosion"], pos );
|
||||
earthquake( 0.15, 0.5, pos, 250 );
|
||||
playfx( level._effect[ "mechanical explosion" ], pos );
|
||||
earthquake( 0,15, 0,5, pos, 250 );
|
||||
}
|
||||
|
||||
soundfx( fxid, fxpos, endonnotify )
|
||||
{
|
||||
org = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
org.origin = fxpos;
|
||||
org playloopsound( fxid );
|
||||
|
||||
if ( isdefined( endonnotify ) )
|
||||
org thread soundfxdelete( endonnotify );
|
||||
org = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
org.origin = fxpos;
|
||||
org playloopsound( fxid );
|
||||
if ( isDefined( endonnotify ) )
|
||||
{
|
||||
org thread soundfxdelete( endonnotify );
|
||||
}
|
||||
}
|
||||
|
||||
soundfxdelete( endonnotify )
|
||||
{
|
||||
level waittill( endonnotify );
|
||||
|
||||
self delete();
|
||||
level waittill( endonnotify );
|
||||
self delete();
|
||||
}
|
||||
|
||||
blenddelete( blend )
|
||||
{
|
||||
self waittill( "death" );
|
||||
|
||||
blend delete();
|
||||
self waittill( "death" );
|
||||
blend delete();
|
||||
}
|
||||
|
||||
spawnfx_wrapper( fx_id, origin, forward, up )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( level._effect[fx_id] ), "Missing level._effect[\"" + fx_id + "\"]. You did not setup the fx before calling it in createFx." );
|
||||
assert( isDefined( level._effect[ fx_id ] ), "Missing level._effect["" + fx_id + ""]. You did not setup the fx before calling it in createFx." );
|
||||
#/
|
||||
fx_object = spawnfx( level._effect[fx_id], origin, forward, up );
|
||||
return fx_object;
|
||||
fx_object = spawnfx( level._effect[ fx_id ], origin, forward, up );
|
||||
return fx_object;
|
||||
}
|
||||
|
@ -1,8 +1,6 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
{
|
||||
level.scr_anim = [];
|
||||
level.scr_anim["fxanim_props"] = [];
|
||||
level.scr_anim = [];
|
||||
level.scr_anim[ "fxanim_props" ] = [];
|
||||
}
|
||||
|
@ -1,53 +1,60 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
randomstartdelay = randomfloatrange( -20, -15 );
|
||||
global_fx( "barrel_fireFX_origin", "global_barrel_fire", "fire/firelp_barrel_pm", randomstartdelay, "fire_barrel_small" );
|
||||
global_fx( "ch_streetlight_02_FX_origin", "ch_streetlight_02_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_streetlight_01_FX_origin", "me_streetlight_01_FX", "misc/lighthaze_bog_a", randomstartdelay );
|
||||
global_fx( "ch_street_light_01_on", "lamp_glow_FX", "misc/light_glow_white", randomstartdelay );
|
||||
global_fx( "highway_lamp_post", "ch_streetlight_02_FX", "misc/lighthaze_villassault", randomstartdelay );
|
||||
global_fx( "cs_cargoship_spotlight_on_FX_origin", "cs_cargoship_spotlight_on_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_dumpster_fire_FX_origin", "me_dumpster_fire_FX", "fire/firelp_med_pm_nodistort", randomstartdelay, "fire_dumpster_medium" );
|
||||
global_fx( "com_tires_burning01_FX_origin", "com_tires_burning01_FX", "fire/tire_fire_med", randomstartdelay );
|
||||
global_fx( "icbm_powerlinetower_FX_origin", "icbm_powerlinetower_FX", "misc/power_tower_light_red_blink", randomstartdelay );
|
||||
randomstartdelay = randomfloatrange( -20, -15 );
|
||||
global_fx( "barrel_fireFX_origin", "global_barrel_fire", "fire/firelp_barrel_pm", randomstartdelay, "fire_barrel_small" );
|
||||
global_fx( "ch_streetlight_02_FX_origin", "ch_streetlight_02_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_streetlight_01_FX_origin", "me_streetlight_01_FX", "misc/lighthaze_bog_a", randomstartdelay );
|
||||
global_fx( "ch_street_light_01_on", "lamp_glow_FX", "misc/light_glow_white", randomstartdelay );
|
||||
global_fx( "highway_lamp_post", "ch_streetlight_02_FX", "misc/lighthaze_villassault", randomstartdelay );
|
||||
global_fx( "cs_cargoship_spotlight_on_FX_origin", "cs_cargoship_spotlight_on_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_dumpster_fire_FX_origin", "me_dumpster_fire_FX", "fire/firelp_med_pm_nodistort", randomstartdelay, "fire_dumpster_medium" );
|
||||
global_fx( "com_tires_burning01_FX_origin", "com_tires_burning01_FX", "fire/tire_fire_med", randomstartdelay );
|
||||
global_fx( "icbm_powerlinetower_FX_origin", "icbm_powerlinetower_FX", "misc/power_tower_light_red_blink", randomstartdelay );
|
||||
}
|
||||
|
||||
global_fx( targetname, fxname, fxfile, delay, soundalias )
|
||||
{
|
||||
ents = getstructarray( targetname, "targetname" );
|
||||
|
||||
if ( !isdefined( ents ) )
|
||||
return;
|
||||
|
||||
if ( ents.size <= 0 )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < ents.size; i++ )
|
||||
ents[i] global_fx_create( fxname, fxfile, delay, soundalias );
|
||||
ents = getstructarray( targetname, "targetname" );
|
||||
if ( !isDefined( ents ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( ents.size <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < ents.size )
|
||||
{
|
||||
ents[ i ] global_fx_create( fxname, fxfile, delay, soundalias );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
global_fx_create( fxname, fxfile, delay, soundalias )
|
||||
{
|
||||
if ( !isdefined( level._effect ) )
|
||||
level._effect = [];
|
||||
|
||||
if ( !isdefined( level._effect[fxname] ) )
|
||||
level._effect[fxname] = loadfx( fxfile );
|
||||
|
||||
if ( !isdefined( self.angles ) )
|
||||
self.angles = ( 0, 0, 0 );
|
||||
|
||||
ent = createoneshoteffect( fxname );
|
||||
ent.v["origin"] = self.origin;
|
||||
ent.v["angles"] = self.angles;
|
||||
ent.v["fxid"] = fxname;
|
||||
ent.v["delay"] = delay;
|
||||
|
||||
if ( isdefined( soundalias ) )
|
||||
ent.v["soundalias"] = soundalias;
|
||||
if ( !isDefined( level._effect ) )
|
||||
{
|
||||
level._effect = [];
|
||||
}
|
||||
if ( !isDefined( level._effect[ fxname ] ) )
|
||||
{
|
||||
level._effect[ fxname ] = loadfx( fxfile );
|
||||
}
|
||||
if ( !isDefined( self.angles ) )
|
||||
{
|
||||
self.angles = ( 0, 0, 0 );
|
||||
}
|
||||
ent = createoneshoteffect( fxname );
|
||||
ent.v[ "origin" ] = self.origin;
|
||||
ent.v[ "angles" ] = self.angles;
|
||||
ent.v[ "fxid" ] = fxname;
|
||||
ent.v[ "delay" ] = delay;
|
||||
if ( isDefined( soundalias ) )
|
||||
{
|
||||
ent.v[ "soundalias" ] = soundalias;
|
||||
}
|
||||
}
|
||||
|
@ -1,387 +1,407 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level.barrelexplodingthisframe = 0;
|
||||
qbarrels = 0;
|
||||
all_barrels = [];
|
||||
barrels = getentarray( "explodable_barrel", "targetname" );
|
||||
|
||||
if ( isdefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
|
||||
for ( i = 0; i < barrels.size; i++ )
|
||||
all_barrels[all_barrels.size] = barrels[i];
|
||||
}
|
||||
|
||||
barrels = getentarray( "explodable_barrel", "script_noteworthy" );
|
||||
|
||||
if ( isdefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
|
||||
for ( i = 0; i < barrels.size; i++ )
|
||||
all_barrels[all_barrels.size] = barrels[i];
|
||||
}
|
||||
|
||||
if ( qbarrels )
|
||||
{
|
||||
precachemodel( "global_explosive_barrel" );
|
||||
level.barrelburn = 100;
|
||||
level.barrelhealth = 250;
|
||||
level.barrelingsound = "exp_redbarrel_ignition";
|
||||
level.barrelexpsound = "exp_redbarrel";
|
||||
level.breakables_fx["barrel"]["burn_start"] = loadfx( "destructibles/fx_barrel_ignite" );
|
||||
level.breakables_fx["barrel"]["burn"] = loadfx( "destructibles/fx_barrel_fire_top" );
|
||||
level.breakables_fx["barrel"]["explode"] = loadfx( "destructibles/fx_dest_barrelexp" );
|
||||
array_thread( all_barrels, ::explodable_barrel_think );
|
||||
}
|
||||
|
||||
qcrates = 0;
|
||||
all_crates = [];
|
||||
crates = getentarray( "flammable_crate", "targetname" );
|
||||
|
||||
if ( isdefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
|
||||
for ( i = 0; i < crates.size; i++ )
|
||||
all_crates[all_crates.size] = crates[i];
|
||||
}
|
||||
|
||||
crates = getentarray( "flammable_crate", "script_noteworthy" );
|
||||
|
||||
if ( isdefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
|
||||
for ( i = 0; i < crates.size; i++ )
|
||||
all_crates[all_crates.size] = crates[i];
|
||||
}
|
||||
|
||||
if ( qcrates )
|
||||
{
|
||||
precachemodel( "global_flammable_crate_jap_piece01_d" );
|
||||
level.crateburn = 100;
|
||||
level.cratehealth = 200;
|
||||
level.breakables_fx["ammo_crate"]["burn_start"] = loadfx( "destructibles/fx_ammobox_ignite" );
|
||||
level.breakables_fx["ammo_crate"]["burn"] = loadfx( "destructibles/fx_ammobox_fire_top" );
|
||||
level.breakables_fx["ammo_crate"]["explode"] = loadfx( "destructibles/fx_ammoboxExp" );
|
||||
level.crateignsound = "Ignition_ammocrate";
|
||||
level.crateexpsound = "Explo_ammocrate";
|
||||
array_thread( all_crates, ::flammable_crate_think );
|
||||
}
|
||||
|
||||
if ( !qbarrels && !qcrates )
|
||||
return;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
qbarrels = 0;
|
||||
all_barrels = [];
|
||||
barrels = getentarray( "explodable_barrel", "targetname" );
|
||||
while ( isDefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
i = 0;
|
||||
while ( i < barrels.size )
|
||||
{
|
||||
all_barrels[ all_barrels.size ] = barrels[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
barrels = getentarray( "explodable_barrel", "script_noteworthy" );
|
||||
while ( isDefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
i = 0;
|
||||
while ( i < barrels.size )
|
||||
{
|
||||
all_barrels[ all_barrels.size ] = barrels[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( qbarrels )
|
||||
{
|
||||
precachemodel( "global_explosive_barrel" );
|
||||
level.barrelburn = 100;
|
||||
level.barrelhealth = 250;
|
||||
level.barrelingsound = "exp_redbarrel_ignition";
|
||||
level.barrelexpsound = "exp_redbarrel";
|
||||
level.breakables_fx[ "barrel" ][ "burn_start" ] = loadfx( "destructibles/fx_barrel_ignite" );
|
||||
level.breakables_fx[ "barrel" ][ "burn" ] = loadfx( "destructibles/fx_barrel_fire_top" );
|
||||
level.breakables_fx[ "barrel" ][ "explode" ] = loadfx( "destructibles/fx_dest_barrelexp" );
|
||||
array_thread( all_barrels, ::explodable_barrel_think );
|
||||
}
|
||||
qcrates = 0;
|
||||
all_crates = [];
|
||||
crates = getentarray( "flammable_crate", "targetname" );
|
||||
while ( isDefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
i = 0;
|
||||
while ( i < crates.size )
|
||||
{
|
||||
all_crates[ all_crates.size ] = crates[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
crates = getentarray( "flammable_crate", "script_noteworthy" );
|
||||
while ( isDefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
i = 0;
|
||||
while ( i < crates.size )
|
||||
{
|
||||
all_crates[ all_crates.size ] = crates[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( qcrates )
|
||||
{
|
||||
precachemodel( "global_flammable_crate_jap_piece01_d" );
|
||||
level.crateburn = 100;
|
||||
level.cratehealth = 200;
|
||||
level.breakables_fx[ "ammo_crate" ][ "burn_start" ] = loadfx( "destructibles/fx_ammobox_ignite" );
|
||||
level.breakables_fx[ "ammo_crate" ][ "burn" ] = loadfx( "destructibles/fx_ammobox_fire_top" );
|
||||
level.breakables_fx[ "ammo_crate" ][ "explode" ] = loadfx( "destructibles/fx_ammoboxExp" );
|
||||
level.crateignsound = "Ignition_ammocrate";
|
||||
level.crateexpsound = "Explo_ammocrate";
|
||||
array_thread( all_crates, ::flammable_crate_think );
|
||||
}
|
||||
if ( !qbarrels && !qcrates )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
explodable_barrel_think()
|
||||
{
|
||||
if ( self.classname != "script_model" )
|
||||
return;
|
||||
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.barrelhealth;
|
||||
self setcandamage( 1 );
|
||||
self.targetname = "explodable_barrel";
|
||||
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
self.removeexplodable = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
if ( self.classname != "script_model" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.barrelhealth;
|
||||
self setcandamage( 1 );
|
||||
self.targetname = "explodable_barrel";
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
self.removeexplodable = 1;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
/#
|
||||
println( "BARRELDAMAGE: " + type );
|
||||
println( "BARRELDAMAGE: " + type );
|
||||
#/
|
||||
if ( type == "MOD_MELEE" || type == "MOD_IMPACT" )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
self.damageowner = self;
|
||||
else
|
||||
self.damageowner = attacker;
|
||||
|
||||
self.health -= amount;
|
||||
|
||||
if ( self.health <= level.barrelburn )
|
||||
self thread explodable_barrel_burn();
|
||||
}
|
||||
if ( type == "MOD_MELEE" || type == "MOD_IMPACT" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
{
|
||||
self.damageowner = self;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damageowner = attacker;
|
||||
}
|
||||
self.health -= amount;
|
||||
if ( self.health <= level.barrelburn )
|
||||
{
|
||||
self thread explodable_barrel_burn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
explodable_barrel_burn()
|
||||
{
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 44.0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
offset1 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) - vectorscale( ( 0, 0, 1 ), 30.0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) + vectorscale( ( 0, 0, 1 ), 14.0 );
|
||||
}
|
||||
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx["barrel"]["burn_start"], self.origin + offset1 );
|
||||
level thread play_sound_in_space( level.barrelingsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
|
||||
if ( count > 20 )
|
||||
count = 0;
|
||||
|
||||
playfx( level.breakables_fx["barrel"]["burn"], self.origin + offset2 );
|
||||
self playloopsound( "barrel_fuse" );
|
||||
|
||||
if ( count == 0 )
|
||||
self.health -= 10 + randomint( 10 );
|
||||
|
||||
count++;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
level notify( "explosion_started" );
|
||||
self thread explodable_barrel_explode();
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 1 );
|
||||
offset2 = up * vectorScale( ( 0, 0, 1 ), 44 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
offset1 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) - vectorScale( ( 0, 0, 1 ), 30 );
|
||||
offset2 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) + vectorScale( ( 0, 0, 1 ), 14 );
|
||||
}
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx[ "barrel" ][ "burn_start" ], self.origin + offset1 );
|
||||
level thread play_sound_in_space( level.barrelingsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
if ( count > 20 )
|
||||
{
|
||||
count = 0;
|
||||
}
|
||||
playfx( level.breakables_fx[ "barrel" ][ "burn" ], self.origin + offset2 );
|
||||
self playloopsound( "barrel_fuse" );
|
||||
if ( count == 0 )
|
||||
{
|
||||
self.health -= 10 + randomint( 10 );
|
||||
}
|
||||
count++;
|
||||
wait 0,05;
|
||||
}
|
||||
level notify( "explosion_started" );
|
||||
self thread explodable_barrel_explode();
|
||||
}
|
||||
|
||||
explodable_barrel_explode()
|
||||
{
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
end = trace["position"];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
|
||||
offset += vectorscale( ( 0, 0, 1 ), 4.0 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.barrelexpsound, self.origin );
|
||||
playfx( level.breakables_fx["barrel"]["explode"], self.origin + offset );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
|
||||
if ( isdefined( self.remove ) )
|
||||
self.remove delete();
|
||||
|
||||
if ( isdefined( self.radius ) )
|
||||
blastradius = self.radius;
|
||||
|
||||
self radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 56.0 ), blastradius, maxdamage, mindamage, self.damageowner );
|
||||
attacker = undefined;
|
||||
|
||||
if ( isdefined( self.damageowner ) )
|
||||
attacker = self.damageowner;
|
||||
|
||||
level.lastexplodingbarrel["time"] = gettime();
|
||||
level.lastexplodingbarrel["origin"] = self.origin + vectorscale( ( 0, 0, 1 ), 30.0 );
|
||||
|
||||
if ( isdefined( self.removeexplodable ) )
|
||||
self hide();
|
||||
else
|
||||
self setmodel( "global_explosive_barrel" );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
pos = trace["position"];
|
||||
self.origin = pos;
|
||||
self.angles += vectorscale( ( 0, 0, 1 ), 90.0 );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 1 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
end = trace[ "position" ];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
offset += vectorScale( ( 0, 0, 1 ), 4 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.barrelexpsound, self.origin );
|
||||
playfx( level.breakables_fx[ "barrel" ][ "explode" ], self.origin + offset );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
if ( isDefined( self.remove ) )
|
||||
{
|
||||
self.remove delete();
|
||||
}
|
||||
if ( isDefined( self.radius ) )
|
||||
{
|
||||
blastradius = self.radius;
|
||||
}
|
||||
self radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 56 ), blastradius, maxdamage, mindamage, self.damageowner );
|
||||
attacker = undefined;
|
||||
if ( isDefined( self.damageowner ) )
|
||||
{
|
||||
attacker = self.damageowner;
|
||||
}
|
||||
level.lastexplodingbarrel[ "time" ] = getTime();
|
||||
level.lastexplodingbarrel[ "origin" ] = self.origin + vectorScale( ( 0, 0, 1 ), 30 );
|
||||
if ( isDefined( self.removeexplodable ) )
|
||||
{
|
||||
self hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
self setmodel( "global_explosive_barrel" );
|
||||
}
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
pos = trace[ "position" ];
|
||||
self.origin = pos;
|
||||
self.angles += vectorScale( ( 0, 0, 1 ), 90 );
|
||||
}
|
||||
wait 0,05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
}
|
||||
|
||||
flammable_crate_think()
|
||||
{
|
||||
if ( self.classname != "script_model" )
|
||||
return;
|
||||
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.cratehealth;
|
||||
self setcandamage( 1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
|
||||
if ( isdefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
self.damageowner = self;
|
||||
else
|
||||
self.damageowner = attacker;
|
||||
|
||||
if ( level.barrelexplodingthisframe )
|
||||
wait( randomfloat( 1 ) );
|
||||
|
||||
self.health -= amount;
|
||||
|
||||
if ( self.health <= level.crateburn )
|
||||
self thread flammable_crate_burn();
|
||||
}
|
||||
if ( self.classname != "script_model" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.cratehealth;
|
||||
self setcandamage( 1 );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
if ( isDefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
{
|
||||
self.damageowner = self;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damageowner = attacker;
|
||||
}
|
||||
if ( level.barrelexplodingthisframe )
|
||||
{
|
||||
wait randomfloat( 1 );
|
||||
}
|
||||
self.health -= amount;
|
||||
if ( self.health <= level.crateburn )
|
||||
{
|
||||
self thread flammable_crate_burn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flammable_crate_burn()
|
||||
{
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 44.0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
offset1 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) - vectorscale( ( 0, 0, 1 ), 30.0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) + vectorscale( ( 0, 0, 1 ), 14.0 );
|
||||
}
|
||||
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx["ammo_crate"]["burn_start"], self.origin );
|
||||
level thread play_sound_in_space( level.crateignsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
|
||||
if ( count > 20 )
|
||||
count = 0;
|
||||
|
||||
playfx( level.breakables_fx["ammo_crate"]["burn"], self.origin );
|
||||
|
||||
if ( count == 0 )
|
||||
self.health -= 10 + randomint( 10 );
|
||||
|
||||
count++;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self thread flammable_crate_explode();
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 1 );
|
||||
offset2 = up * vectorScale( ( 0, 0, 1 ), 44 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
offset1 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) - vectorScale( ( 0, 0, 1 ), 30 );
|
||||
offset2 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) + vectorScale( ( 0, 0, 1 ), 14 );
|
||||
}
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx[ "ammo_crate" ][ "burn_start" ], self.origin );
|
||||
level thread play_sound_in_space( level.crateignsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
if ( count > 20 )
|
||||
{
|
||||
count = 0;
|
||||
}
|
||||
playfx( level.breakables_fx[ "ammo_crate" ][ "burn" ], self.origin );
|
||||
if ( count == 0 )
|
||||
{
|
||||
self.health -= 10 + randomint( 10 );
|
||||
}
|
||||
count++;
|
||||
wait 0,05;
|
||||
}
|
||||
self thread flammable_crate_explode();
|
||||
}
|
||||
|
||||
flammable_crate_explode()
|
||||
{
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
end = trace["position"];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
|
||||
offset += vectorscale( ( 0, 0, 1 ), 4.0 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.crateexpsound, self.origin );
|
||||
playfx( level.breakables_fx["ammo_crate"]["explode"], self.origin );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
|
||||
if ( isdefined( self.remove ) )
|
||||
self.remove delete();
|
||||
|
||||
if ( isdefined( self.radius ) )
|
||||
blastradius = self.radius;
|
||||
|
||||
attacker = undefined;
|
||||
|
||||
if ( isdefined( self.damageowner ) )
|
||||
attacker = self.damageowner;
|
||||
|
||||
self radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), blastradius, maxdamage, mindamage, attacker );
|
||||
self setmodel( "global_flammable_crate_jap_piece01_d" );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
pos = trace["position"];
|
||||
self.origin = pos;
|
||||
self.angles += vectorscale( ( 0, 0, 1 ), 90.0 );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 1 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
end = trace[ "position" ];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
offset += vectorScale( ( 0, 0, 1 ), 4 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.crateexpsound, self.origin );
|
||||
playfx( level.breakables_fx[ "ammo_crate" ][ "explode" ], self.origin );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
if ( isDefined( self.remove ) )
|
||||
{
|
||||
self.remove delete();
|
||||
}
|
||||
if ( isDefined( self.radius ) )
|
||||
{
|
||||
blastradius = self.radius;
|
||||
}
|
||||
attacker = undefined;
|
||||
if ( isDefined( self.damageowner ) )
|
||||
{
|
||||
attacker = self.damageowner;
|
||||
}
|
||||
self radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 30 ), blastradius, maxdamage, mindamage, attacker );
|
||||
self setmodel( "global_flammable_crate_jap_piece01_d" );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
pos = trace[ "position" ];
|
||||
self.origin = pos;
|
||||
self.angles += vectorScale( ( 0, 0, 1 ), 90 );
|
||||
}
|
||||
wait 0,05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
}
|
||||
|
||||
breakable_clip()
|
||||
{
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
targ = getent( self.target, "targetname" );
|
||||
|
||||
if ( targ.classname == "script_brushmodel" )
|
||||
{
|
||||
self.remove = targ;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( level.breakables_clip ) && level.breakables_clip.size > 0 )
|
||||
self.remove = getclosestent( self.origin, level.breakables_clip );
|
||||
|
||||
if ( isdefined( self.remove ) )
|
||||
arrayremovevalue( level.breakables_clip, self.remove );
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
targ = getent( self.target, "targetname" );
|
||||
if ( targ.classname == "script_brushmodel" )
|
||||
{
|
||||
self.remove = targ;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.breakables_clip ) && level.breakables_clip.size > 0 )
|
||||
{
|
||||
self.remove = getclosestent( self.origin, level.breakables_clip );
|
||||
}
|
||||
if ( isDefined( self.remove ) )
|
||||
{
|
||||
arrayremovevalue( level.breakables_clip, self.remove );
|
||||
}
|
||||
}
|
||||
|
||||
getclosestent( org, array )
|
||||
{
|
||||
if ( array.size < 1 )
|
||||
return;
|
||||
|
||||
dist = 256;
|
||||
ent = undefined;
|
||||
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
newdist = distance( array[i] getorigin(), org );
|
||||
|
||||
if ( newdist >= dist )
|
||||
continue;
|
||||
|
||||
dist = newdist;
|
||||
ent = array[i];
|
||||
}
|
||||
|
||||
return ent;
|
||||
if ( array.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
dist = 256;
|
||||
ent = undefined;
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
newdist = distance( array[ i ] getorigin(), org );
|
||||
if ( newdist >= dist )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
dist = newdist;
|
||||
ent = array[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return ent;
|
||||
}
|
||||
|
@ -1,28 +1,30 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
music_init()
|
||||
{
|
||||
/#
|
||||
assert( level.clientscripts );
|
||||
assert( level.clientscripts );
|
||||
#/
|
||||
level.musicstate = "";
|
||||
registerclientsys( "musicCmd" );
|
||||
level.musicstate = "";
|
||||
registerclientsys( "musicCmd" );
|
||||
}
|
||||
|
||||
setmusicstate( state, player )
|
||||
{
|
||||
if ( isdefined( level.musicstate ) )
|
||||
{
|
||||
if ( isdefined( player ) )
|
||||
{
|
||||
setclientsysstate( "musicCmd", state, player );
|
||||
return;
|
||||
}
|
||||
else if ( level.musicstate != state )
|
||||
setclientsysstate( "musicCmd", state );
|
||||
}
|
||||
|
||||
level.musicstate = state;
|
||||
if ( isDefined( level.musicstate ) )
|
||||
{
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
setclientsysstate( "musicCmd", state, player );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.musicstate != state )
|
||||
{
|
||||
setclientsysstate( "musicCmd", state );
|
||||
}
|
||||
}
|
||||
}
|
||||
level.musicstate = state;
|
||||
}
|
||||
|
@ -1,291 +1,342 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_script_gen;
|
||||
#include maps/mp/_script_gen;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
script_gen_dump_checksaved()
|
||||
{
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
{
|
||||
if ( !isdefined( level.script_gen_dump2[signatures[i]] ) )
|
||||
{
|
||||
level.script_gen_dump[signatures[i]] = undefined;
|
||||
level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "Signature unmatched( removed feature ): " + signatures[i];
|
||||
}
|
||||
}
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
if ( !isDefined( level.script_gen_dump2[ signatures[ i ] ] ) )
|
||||
{
|
||||
level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Signature unmatched( removed feature ): " + signatures[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
script_gen_dump()
|
||||
{
|
||||
/#
|
||||
script_gen_dump_checksaved();
|
||||
|
||||
if ( !level.script_gen_dump_reasons.size )
|
||||
{
|
||||
flag_set( "scriptgen_done" );
|
||||
return;
|
||||
}
|
||||
|
||||
firstrun = 0;
|
||||
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( "^3Dumping scriptgen dump for these reasons" );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
|
||||
for ( i = 0; i < level.script_gen_dump_reasons.size; i++ )
|
||||
{
|
||||
if ( issubstr( level.script_gen_dump_reasons[i], "nowrite" ) )
|
||||
{
|
||||
substr = getsubstr( level.script_gen_dump_reasons[i], 15 );
|
||||
println( i + ". ) " + substr );
|
||||
}
|
||||
else
|
||||
println( i + ". ) " + level.script_gen_dump_reasons[i] );
|
||||
|
||||
if ( level.script_gen_dump_reasons[i] == "First run" )
|
||||
firstrun = 1;
|
||||
}
|
||||
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
|
||||
if ( firstrun )
|
||||
{
|
||||
println( "for First Run make sure you delete all of the vehicle precache script calls, createart calls, createfx calls( most commonly placed in maps\" + level.script + "_fx.gsc ) " );
|
||||
println( " " );
|
||||
println( "replace:" );
|
||||
println( "maps\_load::main( 1 );" );
|
||||
println( " " );
|
||||
println( "with( don't forget to add this file to P4 ):" );
|
||||
println( "maps\scriptgen\" + level.script + "_scriptgen::main();" );
|
||||
println( " " );
|
||||
}
|
||||
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
println( "^2 / \ / \ / \" );
|
||||
println( "^2scroll up" );
|
||||
println( "^2 / \ / \ / \" );
|
||||
println( " " );
|
||||
}
|
||||
else
|
||||
return;
|
||||
|
||||
filename = "scriptgen/" + level.script + "_scriptgen.gsc";
|
||||
csvfilename = "zone_source/" + level.script + ".csv";
|
||||
|
||||
if ( level.bscriptgened )
|
||||
file = openfile( filename, "write" );
|
||||
else
|
||||
file = 0;
|
||||
|
||||
assert( file != -1, "File not writeable( check it and and restart the map ): " + filename );
|
||||
script_gen_dumpprintln( file, "// script generated script do not write your own script here it will go away if you do." );
|
||||
script_gen_dumpprintln( file, "main()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump = [];" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[signatures[i]], "nowrite" ) )
|
||||
script_gen_dumpprintln( file, "\t" + level.script_gen_dump[signatures[i]] );
|
||||
}
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[signatures[i]], "nowrite" ) )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + "\"" + signatures[i] + "\"" + " ] = " + "\"" + signatures[i] + "\"" + ";" );
|
||||
continue;
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + "\"" + signatures[i] + "\"" + " ] = " + "\"nowrite\"" + ";" );
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "" );
|
||||
keys1 = undefined;
|
||||
keys2 = undefined;
|
||||
|
||||
if ( isdefined( level.sg_precacheanims ) )
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
|
||||
if ( isdefined( keys1 ) )
|
||||
{
|
||||
for ( i = 0; i < keys1.size; i++ )
|
||||
script_gen_dumpprintln( file, "\tanim_precach_" + keys1[i] + "();" );
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "\tmaps\_load::main( 1, " + level.bcsvgened + ", 1 );" );
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
|
||||
if ( isdefined( level.sg_precacheanims ) )
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
|
||||
if ( isdefined( keys1 ) )
|
||||
{
|
||||
for ( i = 0; i < keys1.size; i++ )
|
||||
{
|
||||
script_gen_dumpprintln( file, "#using_animtree( \"" + keys1[i] + "\" );" );
|
||||
script_gen_dumpprintln( file, "anim_precach_" + keys1[i] + "()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_animtree[ \"" + keys1[i] + "\" ] = #animtree;" );
|
||||
keys2 = getarraykeys( level.sg_precacheanims[keys1[i]] );
|
||||
|
||||
if ( isdefined( keys2 ) )
|
||||
{
|
||||
for ( j = 0; j < keys2.size; j++ )
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_anim[ \"" + keys2[j] + "\" ] = %" + keys2[j] + ";" );
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( level.bscriptgened )
|
||||
saved = closefile( file );
|
||||
else
|
||||
saved = 1;
|
||||
|
||||
if ( level.bcsvgened )
|
||||
csvfile = openfile( csvfilename, "write" );
|
||||
else
|
||||
csvfile = 0;
|
||||
|
||||
assert( csvfile != -1, "File not writeable( check it and and restart the map ): " + csvfilename );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
script_gen_csvdumpprintln( csvfile, signatures[i] );
|
||||
|
||||
if ( level.bcsvgened )
|
||||
csvfilesaved = closefile( csvfile );
|
||||
else
|
||||
csvfilesaved = 1;
|
||||
|
||||
assert( csvfilesaved == 1, "csv not saved( see above message? ): " + csvfilename );
|
||||
assert( saved == 1, "map not saved( see above message? ): " + filename );
|
||||
script_gen_dump_checksaved();
|
||||
if ( !level.script_gen_dump_reasons.size )
|
||||
{
|
||||
flag_set( "scriptgen_done" );
|
||||
return;
|
||||
}
|
||||
firstrun = 0;
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( "^3Dumping scriptgen dump for these reasons" );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
i = 0;
|
||||
while ( i < level.script_gen_dump_reasons.size )
|
||||
{
|
||||
if ( issubstr( level.script_gen_dump_reasons[ i ], "nowrite" ) )
|
||||
{
|
||||
substr = getsubstr( level.script_gen_dump_reasons[ i ], 15 );
|
||||
println( ( i + ". ) " ) + substr );
|
||||
}
|
||||
else
|
||||
{
|
||||
println( ( i + ". ) " ) + level.script_gen_dump_reasons[ i ] );
|
||||
}
|
||||
if ( level.script_gen_dump_reasons[ i ] == "First run" )
|
||||
{
|
||||
firstrun = 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
if ( firstrun )
|
||||
{
|
||||
println( "for First Run make sure you delete all of the vehicle precache script calls, createart calls, createfx calls( most commonly placed in maps\\" + level.script + "_fx.gsc ) " );
|
||||
println( " " );
|
||||
println( "replace:" );
|
||||
println( "maps\\_load::main( 1 );" );
|
||||
println( " " );
|
||||
println( "with( don't forget to add this file to P4 ):" );
|
||||
println( "maps\\scriptgen\\" + level.script + "_scriptgen::main();" );
|
||||
println( " " );
|
||||
}
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
println( "^2 / \\ / \\ / \\" );
|
||||
println( "^2scroll up" );
|
||||
println( "^2 / \\ / \\ / \\" );
|
||||
println( " " );
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
filename = "scriptgen/" + level.script + "_scriptgen.gsc";
|
||||
csvfilename = "zone_source/" + level.script + ".csv";
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
file = openfile( filename, "write" );
|
||||
}
|
||||
else
|
||||
{
|
||||
file = 0;
|
||||
}
|
||||
assert( file != -1, "File not writeable( check it and and restart the map ): " + filename );
|
||||
script_gen_dumpprintln( file, "// script generated script do not write your own script here it will go away if you do." );
|
||||
script_gen_dumpprintln( file, "main()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump = [];" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[ signatures[ i ] ], "nowrite" ) )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\t" + level.script_gen_dump[ signatures[ i ] ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[ signatures[ i ] ], "nowrite" ) )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + """ + signatures[ i ] + """ + " ] = " + """ + signatures[ i ] + """ + ";" );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + """ + signatures[ i ] + """ + " ] = " + ""nowrite"" + ";" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
script_gen_dumpprintln( file, "" );
|
||||
keys1 = undefined;
|
||||
keys2 = undefined;
|
||||
if ( isDefined( level.sg_precacheanims ) )
|
||||
{
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
}
|
||||
while ( isDefined( keys1 ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < keys1.size )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tanim_precach_" + keys1[ i ] + "();" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
script_gen_dumpprintln( file, "\tmaps\\_load::main( 1, " + level.bcsvgened + ", 1 );" );
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
if ( isDefined( level.sg_precacheanims ) )
|
||||
{
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
}
|
||||
while ( isDefined( keys1 ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < keys1.size )
|
||||
{
|
||||
script_gen_dumpprintln( file, "#using_animtree( "" + keys1[ i ] + "" );" );
|
||||
script_gen_dumpprintln( file, "anim_precach_" + keys1[ i ] + "()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_animtree[ "" + keys1[ i ] + "" ] = #animtree;" );
|
||||
keys2 = getarraykeys( level.sg_precacheanims[ keys1[ i ] ] );
|
||||
while ( isDefined( keys2 ) )
|
||||
{
|
||||
j = 0;
|
||||
while ( j < keys2.size )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_anim[ "" + keys2[ j ] + "" ] = %" + keys2[ j ] + ";" );
|
||||
j++;
|
||||
}
|
||||
}
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
saved = closefile( file );
|
||||
}
|
||||
else
|
||||
{
|
||||
saved = 1;
|
||||
}
|
||||
if ( level.bcsvgened )
|
||||
{
|
||||
csvfile = openfile( csvfilename, "write" );
|
||||
}
|
||||
else
|
||||
{
|
||||
csvfile = 0;
|
||||
}
|
||||
assert( csvfile != -1, "File not writeable( check it and and restart the map ): " + csvfilename );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
script_gen_csvdumpprintln( csvfile, signatures[ i ] );
|
||||
i++;
|
||||
}
|
||||
if ( level.bcsvgened )
|
||||
{
|
||||
csvfilesaved = closefile( csvfile );
|
||||
}
|
||||
else
|
||||
{
|
||||
csvfilesaved = 1;
|
||||
}
|
||||
assert( csvfilesaved == 1, "csv not saved( see above message? ): " + csvfilename );
|
||||
assert( saved == 1, "map not saved( see above message? ): " + filename );
|
||||
#/
|
||||
/#
|
||||
assert( !level.bscriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" );
|
||||
assert( !level.bscriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" );
|
||||
#/
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
/#
|
||||
assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" );
|
||||
assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" );
|
||||
#/
|
||||
}
|
||||
|
||||
flag_set( "scriptgen_done" );
|
||||
}
|
||||
flag_set( "scriptgen_done" );
|
||||
}
|
||||
|
||||
script_gen_csvdumpprintln( file, signature )
|
||||
{
|
||||
prefix = undefined;
|
||||
writtenprefix = undefined;
|
||||
path = "";
|
||||
extension = "";
|
||||
|
||||
if ( issubstr( signature, "ignore" ) )
|
||||
prefix = "ignore";
|
||||
else if ( issubstr( signature, "col_map_sp" ) )
|
||||
prefix = "col_map_sp";
|
||||
else if ( issubstr( signature, "gfx_map" ) )
|
||||
prefix = "gfx_map";
|
||||
else if ( issubstr( signature, "rawfile" ) )
|
||||
prefix = "rawfile";
|
||||
else if ( issubstr( signature, "sound" ) )
|
||||
prefix = "sound";
|
||||
else if ( issubstr( signature, "xmodel" ) )
|
||||
prefix = "xmodel";
|
||||
else if ( issubstr( signature, "xanim" ) )
|
||||
prefix = "xanim";
|
||||
else if ( issubstr( signature, "item" ) )
|
||||
{
|
||||
prefix = "item";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else if ( issubstr( signature, "fx" ) )
|
||||
prefix = "fx";
|
||||
else if ( issubstr( signature, "menu" ) )
|
||||
{
|
||||
prefix = "menu";
|
||||
writtenprefix = "menufile";
|
||||
path = "ui / scriptmenus/";
|
||||
extension = ".menu";
|
||||
}
|
||||
else if ( issubstr( signature, "rumble" ) )
|
||||
{
|
||||
prefix = "rumble";
|
||||
writtenprefix = "rawfile";
|
||||
path = "rumble/";
|
||||
}
|
||||
else if ( issubstr( signature, "shader" ) )
|
||||
{
|
||||
prefix = "shader";
|
||||
writtenprefix = "material";
|
||||
}
|
||||
else if ( issubstr( signature, "shock" ) )
|
||||
{
|
||||
prefix = "shock";
|
||||
writtenprefix = "rawfile";
|
||||
extension = ".shock";
|
||||
path = "shock/";
|
||||
}
|
||||
else if ( issubstr( signature, "string" ) )
|
||||
{
|
||||
prefix = "string";
|
||||
prefix = undefined;
|
||||
writtenprefix = undefined;
|
||||
path = "";
|
||||
extension = "";
|
||||
if ( issubstr( signature, "ignore" ) )
|
||||
{
|
||||
prefix = "ignore";
|
||||
}
|
||||
else if ( issubstr( signature, "col_map_sp" ) )
|
||||
{
|
||||
prefix = "col_map_sp";
|
||||
}
|
||||
else if ( issubstr( signature, "gfx_map" ) )
|
||||
{
|
||||
prefix = "gfx_map";
|
||||
}
|
||||
else if ( issubstr( signature, "rawfile" ) )
|
||||
{
|
||||
prefix = "rawfile";
|
||||
}
|
||||
else if ( issubstr( signature, "sound" ) )
|
||||
{
|
||||
prefix = "sound";
|
||||
}
|
||||
else if ( issubstr( signature, "xmodel" ) )
|
||||
{
|
||||
prefix = "xmodel";
|
||||
}
|
||||
else if ( issubstr( signature, "xanim" ) )
|
||||
{
|
||||
prefix = "xanim";
|
||||
}
|
||||
else if ( issubstr( signature, "item" ) )
|
||||
{
|
||||
prefix = "item";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else if ( issubstr( signature, "fx" ) )
|
||||
{
|
||||
prefix = "fx";
|
||||
}
|
||||
else if ( issubstr( signature, "menu" ) )
|
||||
{
|
||||
prefix = "menu";
|
||||
writtenprefix = "menufile";
|
||||
path = "ui / scriptmenus/";
|
||||
extension = ".menu";
|
||||
}
|
||||
else if ( issubstr( signature, "rumble" ) )
|
||||
{
|
||||
prefix = "rumble";
|
||||
writtenprefix = "rawfile";
|
||||
path = "rumble/";
|
||||
}
|
||||
else if ( issubstr( signature, "shader" ) )
|
||||
{
|
||||
prefix = "shader";
|
||||
writtenprefix = "material";
|
||||
}
|
||||
else if ( issubstr( signature, "shock" ) )
|
||||
{
|
||||
prefix = "shock";
|
||||
writtenprefix = "rawfile";
|
||||
extension = ".shock";
|
||||
path = "shock/";
|
||||
}
|
||||
else if ( issubstr( signature, "string" ) )
|
||||
{
|
||||
prefix = "string";
|
||||
/#
|
||||
assertmsg( "string not yet supported by scriptgen" );
|
||||
assertmsg( "string not yet supported by scriptgen" );
|
||||
#/
|
||||
}
|
||||
else if ( issubstr( signature, "turret" ) )
|
||||
{
|
||||
prefix = "turret";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else if ( issubstr( signature, "vehicle" ) )
|
||||
{
|
||||
prefix = "vehicle";
|
||||
writtenprefix = "rawfile";
|
||||
path = "vehicles/";
|
||||
}
|
||||
|
||||
if ( !isdefined( prefix ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( writtenprefix ) )
|
||||
string = prefix + ", " + getsubstr( signature, prefix.size + 1, signature.size );
|
||||
else
|
||||
string = writtenprefix + ", " + path + getsubstr( signature, prefix.size + 1, signature.size ) + extension;
|
||||
}
|
||||
else if ( issubstr( signature, "turret" ) )
|
||||
{
|
||||
prefix = "turret";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( signature, "vehicle" ) )
|
||||
{
|
||||
prefix = "vehicle";
|
||||
writtenprefix = "rawfile";
|
||||
path = "vehicles/";
|
||||
}
|
||||
}
|
||||
if ( !isDefined( prefix ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( writtenprefix ) )
|
||||
{
|
||||
string = ( prefix + ", " ) + getsubstr( signature, prefix.size + 1, signature.size );
|
||||
}
|
||||
else
|
||||
{
|
||||
string = ( writtenprefix + ", " ) + path + getsubstr( signature, prefix.size + 1, signature.size ) + extension;
|
||||
}
|
||||
/#
|
||||
if ( file == -1 || !level.bcsvgened )
|
||||
println( string );
|
||||
else
|
||||
fprintln( file, string );
|
||||
if ( file == -1 || !level.bcsvgened )
|
||||
{
|
||||
println( string );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, string )
|
||||
{
|
||||
/#
|
||||
if ( file == -1 || !level.bscriptgened )
|
||||
println( string );
|
||||
else
|
||||
fprintln( file, string );
|
||||
if ( file == -1 || !level.bscriptgened )
|
||||
{
|
||||
println( string );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,61 +1,56 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_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 ( 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] );
|
||||
}
|
||||
}
|
||||
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 ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,12 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
|
||||
}
|
||||
|
||||
watch_bolt_detonation( owner )
|
||||
{
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,451 +1,474 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
//checked includes matches beta dump
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
init() //checked matches beta dump
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
|
||||
level.vsmgr_initializing = 1;
|
||||
level.vsmgr_default_info_name = "none";
|
||||
level.vsmgr = [];
|
||||
level thread register_type( "visionset" );
|
||||
level thread register_type( "overlay" );
|
||||
onfinalizeinitialization_callback( ::finalize_clientfields );
|
||||
level thread monitor();
|
||||
level thread onplayerconnect();
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.vsmgr_initializing = 1;
|
||||
level.vsmgr_default_info_name = "none";
|
||||
level.vsmgr = [];
|
||||
level thread register_type( "visionset" );
|
||||
level thread register_type( "overlay" );
|
||||
onfinalizeinitialization_callback( ::finalize_clientfields );
|
||||
level thread monitor();
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
vsmgr_register_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread )
|
||||
vsmgr_register_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( level.vsmgr_initializing, "All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" );
|
||||
assert( level.vsmgr_initializing, "All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" );
|
||||
#/
|
||||
lower_name = tolower( name );
|
||||
validate_info( type, lower_name, priority );
|
||||
add_sorted_name_key( type, lower_name );
|
||||
add_sorted_priority_key( type, lower_name, priority );
|
||||
level.vsmgr[type].info[lower_name] = spawnstruct();
|
||||
level.vsmgr[type].info[lower_name] add_info( type, lower_name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread );
|
||||
|
||||
if ( level.vsmgr[type].highest_version < version )
|
||||
level.vsmgr[type].highest_version = version;
|
||||
*/
|
||||
lower_name = tolower( name );
|
||||
validate_info( type, lower_name, priority );
|
||||
add_sorted_name_key( type, lower_name );
|
||||
add_sorted_priority_key( type, lower_name, priority );
|
||||
level.vsmgr[ type ].info[ lower_name ] = spawnstruct();
|
||||
level.vsmgr[ type ].info[ lower_name ] add_info( type, lower_name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread );
|
||||
if ( level.vsmgr[ type ].highest_version < version )
|
||||
{
|
||||
level.vsmgr[ type ].highest_version = version;
|
||||
}
|
||||
}
|
||||
|
||||
vsmgr_activate( type, name, player, opt_param_1, opt_param_2 )
|
||||
vsmgr_activate( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump
|
||||
{
|
||||
if ( level.vsmgr[type].info[name].state.activate_per_player )
|
||||
{
|
||||
activate_per_player( type, name, player, opt_param_1, opt_param_2 );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.vsmgr[type].info[name].state;
|
||||
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.ref_count++;
|
||||
|
||||
if ( 1 < state.ref_count )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( state.lerp_thread ) )
|
||||
state thread lerp_thread_wrapper( state.lerp_thread, opt_param_1, opt_param_2 );
|
||||
else
|
||||
{
|
||||
players = getplayers();
|
||||
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
state vsmgr_set_state_active( players[player_index], 1 );
|
||||
}
|
||||
if ( level.vsmgr[ type ].info[ name ].state.activate_per_player )
|
||||
{
|
||||
activate_per_player( type, name, player, opt_param_1, opt_param_2 );
|
||||
return;
|
||||
}
|
||||
state = level.vsmgr[ type ].info[ name ].state;
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.ref_count++;
|
||||
if ( state.ref_count > 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( state.lerp_thread ) )
|
||||
{
|
||||
state thread lerp_thread_wrapper( state.lerp_thread, opt_param_1, opt_param_2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
players = getplayers();
|
||||
for( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
state vsmgr_set_state_active( players[ player_index ], 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vsmgr_deactivate( type, name, player )
|
||||
vsmgr_deactivate( type, name, player ) //checked changed to match beta dump
|
||||
{
|
||||
if ( level.vsmgr[type].info[name].state.activate_per_player )
|
||||
{
|
||||
deactivate_per_player( type, name, player );
|
||||
return;
|
||||
}
|
||||
if ( level.vsmgr[ type ].info[ name ].state.activate_per_player )
|
||||
{
|
||||
deactivate_per_player( type, name, player );
|
||||
return;
|
||||
}
|
||||
state = level.vsmgr[ type ].info[ name ].state;
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.ref_count--;
|
||||
|
||||
state = level.vsmgr[type].info[name].state;
|
||||
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.ref_count--;
|
||||
|
||||
if ( 0 < state.ref_count )
|
||||
return;
|
||||
}
|
||||
|
||||
state notify( "deactivate" );
|
||||
players = getplayers();
|
||||
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
state vsmgr_set_state_inactive( players[player_index] );
|
||||
if ( state.ref_count > 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
state notify( "deactivate" );
|
||||
players = getplayers();
|
||||
for( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
state vsmgr_set_state_inactive( players[ player_index ] );
|
||||
}
|
||||
}
|
||||
|
||||
vsmgr_set_state_active( player, lerp )
|
||||
vsmgr_set_state_active( player, lerp ) //checked matches cerberus output
|
||||
{
|
||||
player_entnum = player getentitynumber();
|
||||
|
||||
if ( !isdefined( self.players[player_entnum] ) )
|
||||
return;
|
||||
|
||||
self.players[player_entnum].active = 1;
|
||||
self.players[player_entnum].lerp = lerp;
|
||||
player_entnum = player getentitynumber();
|
||||
if ( !isDefined( self.players[ player_entnum ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.players[ player_entnum ].active = 1;
|
||||
self.players[ player_entnum ].lerp = lerp;
|
||||
}
|
||||
|
||||
vsmgr_set_state_inactive( player )
|
||||
vsmgr_set_state_inactive( player ) //checked matches cerberus output
|
||||
{
|
||||
player_entnum = player getentitynumber();
|
||||
|
||||
if ( !isdefined( self.players[player_entnum] ) )
|
||||
return;
|
||||
|
||||
self.players[player_entnum].active = 0;
|
||||
self.players[player_entnum].lerp = 0;
|
||||
player_entnum = player getentitynumber();
|
||||
if ( !isDefined( self.players[ player_entnum ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.players[ player_entnum ].active = 0;
|
||||
self.players[ player_entnum ].lerp = 0;
|
||||
}
|
||||
|
||||
vsmgr_timeout_lerp_thread( timeout, opt_param_2 )
|
||||
vsmgr_timeout_lerp_thread( timeout, opt_param_2 ) //checked changed to match beta dump
|
||||
{
|
||||
players = getplayers();
|
||||
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
self vsmgr_set_state_active( players[player_index], 1 );
|
||||
|
||||
wait( timeout );
|
||||
vsmgr_deactivate( self.type, self.name );
|
||||
players = getplayers();
|
||||
for( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
self vsmgr_set_state_active( players[ player_index ], 1 );
|
||||
}
|
||||
wait timeout;
|
||||
vsmgr_deactivate( self.type, self.name );
|
||||
}
|
||||
|
||||
vsmgr_timeout_lerp_thread_per_player( player, timeout, opt_param_2 )
|
||||
vsmgr_timeout_lerp_thread_per_player( player, timeout, opt_param_2 ) //checked matches beta dump
|
||||
{
|
||||
self vsmgr_set_state_active( player, 1 );
|
||||
wait( timeout );
|
||||
deactivate_per_player( self.type, self.name, player );
|
||||
self vsmgr_set_state_active( player, 1 );
|
||||
wait timeout;
|
||||
deactivate_per_player( self.type, self.name, player );
|
||||
}
|
||||
|
||||
vsmgr_duration_lerp_thread( duration, max_duration )
|
||||
vsmgr_duration_lerp_thread( duration, max_duration ) //checked changed to match beta dump
|
||||
{
|
||||
start_time = gettime();
|
||||
end_time = start_time + int( duration * 1000 );
|
||||
|
||||
if ( isdefined( max_duration ) )
|
||||
start_time = end_time - int( max_duration * 1000 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
lerp = calc_remaining_duration_lerp( start_time, end_time );
|
||||
|
||||
if ( 0 >= lerp )
|
||||
break;
|
||||
|
||||
players = getplayers();
|
||||
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
self vsmgr_set_state_active( players[player_index], lerp );
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
vsmgr_deactivate( self.type, self.name );
|
||||
start_time = getTime();
|
||||
end_time = start_time + int( duration * 1000 );
|
||||
if ( isDefined( max_duration ) )
|
||||
{
|
||||
start_time = end_time - int( max_duration * 1000 );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
lerp = calc_remaining_duration_lerp( start_time, end_time );
|
||||
if ( lerp <= 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
players = getplayers();
|
||||
for( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
self vsmgr_set_state_active( players[ player_index ], lerp );
|
||||
}
|
||||
wait 0.05;
|
||||
}
|
||||
vsmgr_deactivate( self.type, self.name );
|
||||
}
|
||||
|
||||
vsmgr_duration_lerp_thread_per_player( player, duration, max_duration )
|
||||
vsmgr_duration_lerp_thread_per_player( player, duration, max_duration ) //checked changed to match beta dump
|
||||
{
|
||||
start_time = gettime();
|
||||
end_time = start_time + int( duration * 1000 );
|
||||
|
||||
if ( isdefined( max_duration ) )
|
||||
start_time = end_time - int( max_duration * 1000 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
lerp = calc_remaining_duration_lerp( start_time, end_time );
|
||||
|
||||
if ( 0 >= lerp )
|
||||
break;
|
||||
|
||||
self vsmgr_set_state_active( player, lerp );
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
deactivate_per_player( self.type, self.name, player );
|
||||
start_time = getTime();
|
||||
end_time = start_time + int( duration * 1000 );
|
||||
if ( isDefined( max_duration ) )
|
||||
{
|
||||
start_time = end_time - int( max_duration * 1000 );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
lerp = calc_remaining_duration_lerp( start_time, end_time );
|
||||
if ( lerp <= 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
self vsmgr_set_state_active( player, lerp );
|
||||
wait 0.05;
|
||||
}
|
||||
deactivate_per_player( self.type, self.name, player );
|
||||
}
|
||||
|
||||
register_type( type )
|
||||
register_type( type ) //checked matches beta dump
|
||||
{
|
||||
level.vsmgr[type] = spawnstruct();
|
||||
level.vsmgr[type].type = type;
|
||||
level.vsmgr[type].in_use = 0;
|
||||
level.vsmgr[type].highest_version = 0;
|
||||
level.vsmgr[type].cf_slot_name = type + "_slot";
|
||||
level.vsmgr[type].cf_lerp_name = type + "_lerp";
|
||||
level.vsmgr[type].info = [];
|
||||
level.vsmgr[type].sorted_name_keys = [];
|
||||
level.vsmgr[type].sorted_prio_keys = [];
|
||||
vsmgr_register_info( type, level.vsmgr_default_info_name, 1, 0, 1, 0, undefined );
|
||||
level.vsmgr[ type ] = spawnstruct();
|
||||
level.vsmgr[ type ].type = type;
|
||||
level.vsmgr[ type ].in_use = 0;
|
||||
level.vsmgr[ type ].highest_version = 0;
|
||||
level.vsmgr[ type ].cf_slot_name = type + "_slot";
|
||||
level.vsmgr[ type ].cf_lerp_name = type + "_lerp";
|
||||
level.vsmgr[ type ].info = [];
|
||||
level.vsmgr[ type ].sorted_name_keys = [];
|
||||
level.vsmgr[ type ].sorted_prio_keys = [];
|
||||
vsmgr_register_info( type, level.vsmgr_default_info_name, 1, 0, 1, 0, undefined );
|
||||
}
|
||||
|
||||
finalize_clientfields()
|
||||
finalize_clientfields() //checked changed to match beta dump
|
||||
{
|
||||
typekeys = getarraykeys( level.vsmgr );
|
||||
|
||||
for ( type_index = 0; type_index < typekeys.size; type_index++ )
|
||||
level.vsmgr[typekeys[type_index]] thread finalize_type_clientfields();
|
||||
|
||||
level.vsmgr_initializing = 0;
|
||||
typekeys = getarraykeys( level.vsmgr );
|
||||
for ( type_index = 0; type_index < typeKeys.size; type_index++ )
|
||||
{
|
||||
level.vsmgr[ typekeys[ type_index ] ] thread finalize_type_clientfields();
|
||||
}
|
||||
level.vsmgr_initializing = 0;
|
||||
}
|
||||
|
||||
finalize_type_clientfields()
|
||||
finalize_type_clientfields() //checked changed to match beta dump
|
||||
{
|
||||
if ( 1 >= self.info.size )
|
||||
return;
|
||||
|
||||
self.in_use = 1;
|
||||
self.cf_slot_bit_count = getminbitcountfornum( self.info.size - 1 );
|
||||
self.cf_lerp_bit_count = self.info[self.sorted_name_keys[0]].lerp_bit_count;
|
||||
|
||||
for ( i = 0; i < self.sorted_name_keys.size; i++ )
|
||||
{
|
||||
self.info[self.sorted_name_keys[i]].slot_index = i;
|
||||
|
||||
if ( self.info[self.sorted_name_keys[i]].lerp_bit_count > self.cf_lerp_bit_count )
|
||||
self.cf_lerp_bit_count = self.info[self.sorted_name_keys[i]].lerp_bit_count;
|
||||
}
|
||||
|
||||
registerclientfield( "toplayer", self.cf_slot_name, self.highest_version, self.cf_slot_bit_count, "int" );
|
||||
|
||||
if ( 1 < self.cf_lerp_bit_count )
|
||||
registerclientfield( "toplayer", self.cf_lerp_name, self.highest_version, self.cf_lerp_bit_count, "float" );
|
||||
if ( self.info.size <= 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.in_use = 1;
|
||||
self.cf_slot_bit_count = getminbitcountfornum( self.info.size - 1 );
|
||||
self.cf_lerp_bit_count = self.info[ self.sorted_name_keys[ 0 ] ].lerp_bit_count;
|
||||
for ( i = 0; i < self.sorted_name_keys.size; i++ )
|
||||
{
|
||||
self.info[ self.sorted_name_keys[ i ] ].slot_index = i;
|
||||
if ( self.info[ self.sorted_name_keys[ i ] ].lerp_bit_count > self.cf_lerp_bit_count )
|
||||
{
|
||||
self.cf_lerp_bit_count = self.info[ self.sorted_name_keys[ i ] ].lerp_bit_count;
|
||||
}
|
||||
}
|
||||
registerclientfield( "toplayer", self.cf_slot_name, self.highest_version, self.cf_slot_bit_count, "int" );
|
||||
if ( self.cf_lerp_bit_count > 1 )
|
||||
{
|
||||
registerclientfield( "toplayer", self.cf_lerp_name, self.highest_version, self.cf_lerp_bit_count, "float" );
|
||||
}
|
||||
}
|
||||
|
||||
validate_info( type, name, priority )
|
||||
validate_info( type, name, priority ) //checked changed to match beta dump
|
||||
{
|
||||
keys = getarraykeys( level.vsmgr );
|
||||
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
if ( type == keys[i] )
|
||||
break;
|
||||
}
|
||||
keys = getarraykeys( level.vsmgr );
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
if ( type == keys[ i ] )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( i < keys.size, "In visionset_mgr, type '" + type + "'is unknown" );
|
||||
assert( i < keys.size, "In visionset_mgr, type '" + type + "'is unknown" );
|
||||
#/
|
||||
keys = getarraykeys( level.vsmgr[type].info );
|
||||
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
*/
|
||||
keys = getarraykeys( level.vsmgr[ type ].info );
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( level.vsmgr[type].info[keys[i]].name != name, "In visionset_mgr of type '" + type + "': name '" + name + "' has previously been registered" );
|
||||
assert( level.vsmgr[ type ].info[ keys[ i ] ].name != name, "In visionset_mgr of type '" + type + "': name '" + name + "' has previously been registered" );
|
||||
#/
|
||||
/#
|
||||
assert( level.vsmgr[type].info[keys[i]].priority != priority, "In visionset_mgr of type '" + type + "': priority '" + priority + "' requested for name '" + name + "' has previously been registered under name '" + level.vsmgr[type].info[keys[i]].name + "'" );
|
||||
assert( level.vsmgr[ type ].info[ keys[ i ] ].priority != priority, "In visionset_mgr of type '" + type + "': priority '" + priority + "' requested for name '" + name + "' has previously been registered under name '" + level.vsmgr[ type ].info[ keys[ i ] ].name + "'" );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
add_sorted_name_key( type, name )
|
||||
add_sorted_name_key( type, name ) //checked changed to match beta dump
|
||||
{
|
||||
for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ )
|
||||
{
|
||||
if ( name < level.vsmgr[type].sorted_name_keys[i] )
|
||||
break;
|
||||
}
|
||||
|
||||
arrayinsert( level.vsmgr[type].sorted_name_keys, name, i );
|
||||
for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ )
|
||||
{
|
||||
if ( name < level.vsmgr[ type ].sorted_name_keys[ i ] )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
arrayinsert( level.vsmgr[ type ].sorted_name_keys, name, i );
|
||||
}
|
||||
|
||||
add_sorted_priority_key( type, name, priority )
|
||||
add_sorted_priority_key( type, name, priority ) //checked changed to match beta dump
|
||||
{
|
||||
for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ )
|
||||
{
|
||||
if ( priority > level.vsmgr[type].info[level.vsmgr[type].sorted_prio_keys[i]].priority )
|
||||
break;
|
||||
}
|
||||
|
||||
arrayinsert( level.vsmgr[type].sorted_prio_keys, name, i );
|
||||
for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ )
|
||||
{
|
||||
if ( priority > level.vsmgr[ type ].info[ level.vsmgr[ type ].sorted_prio_keys[ i ] ].priority )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
arrayinsert( level.vsmgr[ type ].sorted_prio_keys, name, i );
|
||||
}
|
||||
|
||||
add_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread )
|
||||
add_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump
|
||||
{
|
||||
self.type = type;
|
||||
self.name = name;
|
||||
self.version = version;
|
||||
self.priority = priority;
|
||||
self.lerp_step_count = lerp_step_count;
|
||||
self.lerp_bit_count = getminbitcountfornum( lerp_step_count );
|
||||
|
||||
if ( !isdefined( ref_count_lerp_thread ) )
|
||||
ref_count_lerp_thread = 0;
|
||||
|
||||
self.state = spawnstruct();
|
||||
self.state.type = type;
|
||||
self.state.name = name;
|
||||
self.state.activate_per_player = activate_per_player;
|
||||
self.state.lerp_thread = lerp_thread;
|
||||
self.state.ref_count_lerp_thread = ref_count_lerp_thread;
|
||||
self.state.players = [];
|
||||
|
||||
if ( ref_count_lerp_thread && !activate_per_player )
|
||||
self.state.ref_count = 0;
|
||||
self.type = type;
|
||||
self.name = name;
|
||||
self.version = version;
|
||||
self.priority = priority;
|
||||
self.lerp_step_count = lerp_step_count;
|
||||
self.lerp_bit_count = getminbitcountfornum( lerp_step_count );
|
||||
if ( !isDefined( ref_count_lerp_thread ) )
|
||||
{
|
||||
ref_count_lerp_thread = 0;
|
||||
}
|
||||
self.state = spawnstruct();
|
||||
self.state.type = type;
|
||||
self.state.name = name;
|
||||
self.state.activate_per_player = activate_per_player;
|
||||
self.state.lerp_thread = lerp_thread;
|
||||
self.state.ref_count_lerp_thread = ref_count_lerp_thread;
|
||||
self.state.players = [];
|
||||
if ( ref_count_lerp_thread && !activate_per_player )
|
||||
{
|
||||
self.state.ref_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches beta dump
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
|
||||
player thread on_player_connect();
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player thread on_player_connect();
|
||||
}
|
||||
}
|
||||
|
||||
on_player_connect()
|
||||
on_player_connect() //checked partially changed to match beta dump
|
||||
{
|
||||
self._player_entnum = self getentitynumber();
|
||||
typekeys = getarraykeys( level.vsmgr );
|
||||
|
||||
for ( type_index = 0; type_index < typekeys.size; type_index++ )
|
||||
{
|
||||
type = typekeys[type_index];
|
||||
|
||||
if ( !level.vsmgr[type].in_use )
|
||||
continue;
|
||||
|
||||
for ( name_index = 0; name_index < level.vsmgr[type].sorted_name_keys.size; name_index++ )
|
||||
{
|
||||
name_key = level.vsmgr[type].sorted_name_keys[name_index];
|
||||
level.vsmgr[type].info[name_key].state.players[self._player_entnum] = spawnstruct();
|
||||
level.vsmgr[type].info[name_key].state.players[self._player_entnum].active = 0;
|
||||
level.vsmgr[type].info[name_key].state.players[self._player_entnum].lerp = 0;
|
||||
|
||||
if ( level.vsmgr[type].info[name_key].state.ref_count_lerp_thread && level.vsmgr[type].info[name_key].state.activate_per_player )
|
||||
level.vsmgr[type].info[name_key].state.players[self._player_entnum].ref_count = 0;
|
||||
}
|
||||
|
||||
level.vsmgr[type].info[level.vsmgr_default_info_name].state vsmgr_set_state_active( self, 1 );
|
||||
}
|
||||
self._player_entnum = self getentitynumber();
|
||||
typekeys = getarraykeys( level.vsmgr );
|
||||
for ( type_index = 0; type_index < typeKeys.size; type_index++ )
|
||||
{
|
||||
type = typekeys[ type_index ];
|
||||
if ( !level.vsmgr[ type ].in_use )
|
||||
{
|
||||
type_index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( name_index = 0; name_index < level.vsmgr[type].sorted_name_keys.size; name_index++ )
|
||||
{
|
||||
name_key = level.vsmgr[ type ].sorted_name_keys[ name_index ];
|
||||
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ] = spawnstruct();
|
||||
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].active = 0;
|
||||
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].lerp = 0;
|
||||
if ( level.vsmgr[ type ].info[ name_key ].state.ref_count_lerp_thread && level.vsmgr[ type ].info[ name_key ].state.activate_per_player )
|
||||
{
|
||||
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].ref_count = 0;
|
||||
}
|
||||
}
|
||||
level.vsmgr[ type ].info[ level.vsmgr_default_info_name ].state vsmgr_set_state_active( self, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
monitor()
|
||||
monitor() //checked partially changed to match beta dump
|
||||
{
|
||||
while ( level.vsmgr_initializing )
|
||||
wait 0.05;
|
||||
|
||||
typekeys = getarraykeys( level.vsmgr );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
wait 0.05;
|
||||
waittillframeend;
|
||||
players = get_players();
|
||||
|
||||
for ( type_index = 0; type_index < typekeys.size; type_index++ )
|
||||
{
|
||||
type = typekeys[type_index];
|
||||
|
||||
if ( !level.vsmgr[type].in_use )
|
||||
continue;
|
||||
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
while ( level.vsmgr_initializing )
|
||||
{
|
||||
wait 0.05;
|
||||
}
|
||||
typekeys = getarraykeys( level.vsmgr );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0.05;
|
||||
waittillframeend;
|
||||
players = get_players();
|
||||
for ( type_index = 0; type_index < typeKeys.size; type_index++ )
|
||||
{
|
||||
type = typekeys[ type_index ];
|
||||
if ( !level.vsmgr[ type ].in_use )
|
||||
{
|
||||
type_index++;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( player_index = 0; player_index < players.size; player_index++ )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( is_true( players[player_index].pers["isBot"] ) )
|
||||
continue;
|
||||
if ( is_true( players[ player_index ].pers[ "isBot" ] ) )
|
||||
{
|
||||
player_index++;
|
||||
continue;
|
||||
#/
|
||||
update_clientfields( players[player_index], level.vsmgr[type] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
update_clientfields( players[ player_index ], level.vsmgr[ type ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get_first_active_name( type_struct )
|
||||
get_first_active_name( type_struct ) //checked partially changed to match beta dump
|
||||
{
|
||||
size = type_struct.sorted_prio_keys.size;
|
||||
|
||||
for ( prio_index = 0; prio_index < size; prio_index++ )
|
||||
{
|
||||
prio_key = type_struct.sorted_prio_keys[prio_index];
|
||||
|
||||
if ( type_struct.info[prio_key].state.players[self._player_entnum].active )
|
||||
return prio_key;
|
||||
}
|
||||
|
||||
return level.vsmgr_default_info_name;
|
||||
size = type_struct.sorted_prio_keys.size;
|
||||
for ( prio_index = 0; prio_index < size; prio_index++ )
|
||||
{
|
||||
prio_key = type_struct.sorted_prio_keys[ prio_index ];
|
||||
if ( type_struct.info[ prio_key ].state.players[ self._player_entnum ].active )
|
||||
{
|
||||
return prio_key;
|
||||
}
|
||||
}
|
||||
return level.vsmgr_default_info_name;
|
||||
}
|
||||
|
||||
update_clientfields( player, type_struct )
|
||||
update_clientfields( player, type_struct ) //checked changed to match beta dump
|
||||
{
|
||||
name = player get_first_active_name( type_struct );
|
||||
player setclientfieldtoplayer( type_struct.cf_slot_name, type_struct.info[name].slot_index );
|
||||
|
||||
if ( 1 < type_struct.cf_lerp_bit_count )
|
||||
player setclientfieldtoplayer( type_struct.cf_lerp_name, type_struct.info[name].state.players[player._player_entnum].lerp );
|
||||
name = player get_first_active_name( type_struct );
|
||||
player setclientfieldtoplayer( type_struct.cf_slot_name, type_struct.info[ name ].slot_index );
|
||||
if ( type_struct.cf_lerp_bit_count > 1 )
|
||||
{
|
||||
player setclientfieldtoplayer( type_struct.cf_lerp_name, type_struct.info[ name ].state.players[ player._player_entnum ].lerp );
|
||||
}
|
||||
}
|
||||
|
||||
lerp_thread_wrapper( func, opt_param_1, opt_param_2 )
|
||||
lerp_thread_wrapper( func, opt_param_1, opt_param_2 ) //checked matches beta dump
|
||||
{
|
||||
self notify( "deactivate" );
|
||||
self endon( "deactivate" );
|
||||
self [[ func ]]( opt_param_1, opt_param_2 );
|
||||
self notify( "deactivate" );
|
||||
self endon( "deactivate" );
|
||||
self [[ func ]]( opt_param_1, opt_param_2 );
|
||||
}
|
||||
|
||||
lerp_thread_per_player_wrapper( func, player, opt_param_1, opt_param_2 )
|
||||
lerp_thread_per_player_wrapper( func, player, opt_param_1, opt_param_2 ) //checked matches beta dump
|
||||
{
|
||||
player_entnum = player getentitynumber();
|
||||
self notify( "deactivate" );
|
||||
self endon( "deactivate" );
|
||||
self.players[player_entnum] notify( "deactivate" );
|
||||
self.players[player_entnum] endon( "deactivate" );
|
||||
player endon( "disconnect" );
|
||||
self [[ func ]]( player, opt_param_1, opt_param_2 );
|
||||
player_entnum = player getentitynumber();
|
||||
self notify( "deactivate" );
|
||||
self endon( "deactivate" );
|
||||
self.players[ player_entnum ] notify( "deactivate" );
|
||||
self.players[ player_entnum ] endon( "deactivate" );
|
||||
player endon( "disconnect" );
|
||||
self [[ func ]]( player, opt_param_1, opt_param_2 );
|
||||
}
|
||||
|
||||
activate_per_player( type, name, player, opt_param_1, opt_param_2 )
|
||||
activate_per_player( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump
|
||||
{
|
||||
player_entnum = player getentitynumber();
|
||||
state = level.vsmgr[type].info[name].state;
|
||||
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.players[player_entnum].ref_count++;
|
||||
|
||||
if ( 1 < state.players[player_entnum].ref_count )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( state.lerp_thread ) )
|
||||
state thread lerp_thread_per_player_wrapper( state.lerp_thread, player, opt_param_1, opt_param_2 );
|
||||
else
|
||||
state vsmgr_set_state_active( player, 1 );
|
||||
player_entnum = player getentitynumber();
|
||||
state = level.vsmgr[ type ].info[ name ].state;
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.players[ player_entnum ].ref_count++;
|
||||
if ( state.players[ player_entnum ].ref_count > 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( state.lerp_thread ) )
|
||||
{
|
||||
state thread lerp_thread_per_player_wrapper( state.lerp_thread, player, opt_param_1, opt_param_2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
state vsmgr_set_state_active( player, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
deactivate_per_player( type, name, player )
|
||||
deactivate_per_player( type, name, player ) //checked changed to match beta dump
|
||||
{
|
||||
player_entnum = player getentitynumber();
|
||||
state = level.vsmgr[type].info[name].state;
|
||||
player_entnum = player getentitynumber();
|
||||
state = level.vsmgr[ type ].info[ name ].state;
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.players[ player_entnum ].ref_count--;
|
||||
|
||||
if ( state.ref_count_lerp_thread )
|
||||
{
|
||||
state.players[player_entnum].ref_count--;
|
||||
|
||||
if ( 0 < state.players[player_entnum].ref_count )
|
||||
return;
|
||||
}
|
||||
|
||||
state vsmgr_set_state_inactive( player );
|
||||
state notify( "deactivate" );
|
||||
if ( state.players[ player_entnum ].ref_count > 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
state vsmgr_set_state_inactive( player );
|
||||
state notify( "deactivate" );
|
||||
}
|
||||
|
||||
calc_remaining_duration_lerp( start_time, end_time )
|
||||
calc_remaining_duration_lerp( start_time, end_time ) //checked matches beta dump
|
||||
{
|
||||
now = gettime();
|
||||
frac = float( end_time - now ) / float( end_time - start_time );
|
||||
return clamp( frac, 0, 1 );
|
||||
now = getTime();
|
||||
frac = float( end_time - now ) / float( end_time - start_time );
|
||||
return clamp( frac, 0, 1 );
|
||||
}
|
||||
|
@ -1,105 +1,106 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
#/
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isdefined( self.enemy ) );
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isplayer( self.enemy ) )
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
}
|
||||
}
|
||||
|
||||
combatidle()
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
idleanims = [];
|
||||
idleanims[0] = "combat_attackidle";
|
||||
idleanims[1] = "combat_attackidle_bark";
|
||||
idleanims[2] = "combat_attackidle_growl";
|
||||
idleanim = random( idleanims );
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstate( idleanim );
|
||||
self maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
idleanims = [];
|
||||
idleanims[ 0 ] = "combat_attackidle";
|
||||
idleanims[ 1 ] = "combat_attackidle_bark";
|
||||
idleanims[ 2 ] = "combat_attackidle_growl";
|
||||
idleanim = random( idleanims );
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstate( idleanim );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
}
|
||||
|
||||
meleebiteattackplayer( player )
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas", 0 );
|
||||
self setanimstate( "combat_attack_player_close_range" );
|
||||
wait 0.35;
|
||||
|
||||
if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" )
|
||||
self meleewithoffset( vectorscale( ( 0, 0, -1 ), 9.0 ) );
|
||||
else
|
||||
self melee();
|
||||
|
||||
self maps\mp\animscripts\shared::donotetracksfortime( 1.2, "done" );
|
||||
self animmode( "gravity", 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1.2 + randomfloat( 0.4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstate( "combat_attack_run" );
|
||||
self maps\mp\animscripts\shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas", 0 );
|
||||
self setanimstate( "combat_attack_player_close_range" );
|
||||
wait 0,35;
|
||||
if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" )
|
||||
{
|
||||
self meleewithoffset( vectorScale( ( 0, 0, -1 ), 9 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
self melee();
|
||||
}
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( 1,2, "done" );
|
||||
self animmode( "gravity", 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstate( "combat_attack_run" );
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks( note, player )
|
||||
{
|
||||
if ( note == "dog_melee" )
|
||||
self melee( anglestoforward( self.angles ) );
|
||||
if ( note == "dog_melee" )
|
||||
{
|
||||
self melee( anglesToForward( self.angles ) );
|
||||
}
|
||||
}
|
||||
|
||||
use_low_attack()
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
if ( self.enemy getstance() == "prone" )
|
||||
{
|
||||
attack_height = self.origin[2] + 16;
|
||||
|
||||
if ( self.enemy.origin[2] < attack_height )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
if ( self.enemy getstance() == "prone" )
|
||||
{
|
||||
attack_height = self.origin[ 2 ] + 16;
|
||||
if ( self.enemy.origin[ 2 ] < attack_height )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,34 +1,30 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( isdefined( self.a.nodeath ) )
|
||||
{
|
||||
debug_anim_print( "dog_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
if ( isDefined( self.a.nodeath ) )
|
||||
{
|
||||
/#
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
#/
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
|
||||
self unlink();
|
||||
|
||||
if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
|
||||
death_anim = "death_" + getanimdirection( self.damageyaw );
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
death_anim = "death_" + getanimdirection( self.damageyaw );
|
||||
/#
|
||||
println( death_anim );
|
||||
println( death_anim );
|
||||
#/
|
||||
self animmode( "gravity", 0 );
|
||||
debug_anim_print( "dog_death::main() - Setting " + death_anim );
|
||||
self setanimstate( death_anim );
|
||||
self maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
self animmode( "gravity", 0 );
|
||||
debug_anim_print( "dog_death::main() - Setting " + death_anim );
|
||||
self setanimstate( death_anim );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
}
|
||||
|
@ -1,28 +1,29 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
wait( randomfloatrange( 0, 0.4 ) );
|
||||
duration = self startflashbanged() * 0.001;
|
||||
self setanimstate( "flashed" );
|
||||
self maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
self setflashbanged( 0 );
|
||||
self.flashed = 0;
|
||||
self notify( "stop_flashbang_effect" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
wait randomfloatrange( 0, 0,4 );
|
||||
duration = self startflashbanged() * 0,001;
|
||||
self setanimstate( "flashed" );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
self setflashbanged( 0 );
|
||||
self.flashed = 0;
|
||||
self notify( "stop_flashbang_effect" );
|
||||
}
|
||||
|
||||
startflashbanged()
|
||||
{
|
||||
if ( isdefined( self.flashduration ) )
|
||||
duration = self.flashduration;
|
||||
else
|
||||
duration = self getflashbangedstrength() * 1000;
|
||||
|
||||
self.flashendtime = gettime() + duration;
|
||||
self notify( "flashed" );
|
||||
return duration;
|
||||
if ( isDefined( self.flashduration ) )
|
||||
{
|
||||
duration = self.flashduration;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration = self getflashbangedstrength() * 1000;
|
||||
}
|
||||
self.flashendtime = getTime() + duration;
|
||||
self notify( "flashed" );
|
||||
return duration;
|
||||
}
|
||||
|
@ -1,64 +1,62 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\dog_move;
|
||||
#include maps\mp\animscripts\dog_combat;
|
||||
#include maps/mp/animscripts/dog_combat;
|
||||
#include maps/mp/animscripts/dog_move;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps\mp\animscripts\dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
anim_get_dvar_int( "dog_force_walk", 0 );
|
||||
anim_get_dvar_int( "dog_force_run", 0 );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "run";
|
||||
set_anim_playback_rate();
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416.82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "dog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
|
||||
if ( !isdefined( level.dog_hits_before_kill ) )
|
||||
level.dog_hits_before_kill = 1;
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps/mp/animscripts/dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
anim_get_dvar_int( "dog_force_walk", 0 );
|
||||
anim_get_dvar_int( "dog_force_run", 0 );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "run";
|
||||
set_anim_playback_rate();
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416,82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "dog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
if ( !isDefined( level.dog_hits_before_kill ) )
|
||||
{
|
||||
level.dog_hits_before_kill = 1;
|
||||
}
|
||||
}
|
||||
|
||||
set_anim_playback_rate()
|
||||
{
|
||||
self.animplaybackrate = 0.9 + randomfloat( 0.2 );
|
||||
self.moveplaybackrate = 1;
|
||||
self.animplaybackrate = 0,9 + randomfloat( 0,2 );
|
||||
self.moveplaybackrate = 1;
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.meleeattackdist = 0;
|
||||
|
||||
if ( self maps\mp\animscripts\dog_combat::use_low_attack() )
|
||||
self.meleeattackdist = 64;
|
||||
|
||||
wait 1;
|
||||
}
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self.meleeattackdist = 0;
|
||||
if ( self maps/mp/animscripts/dog_combat::use_low_attack() )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,13 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_jump::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
self setanimstate( "traverse_wallhop" );
|
||||
maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
self.safetochangescript = 1;
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_jump::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
self setanimstate( "traverse_wallhop" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
self.safetochangescript = 1;
|
||||
}
|
||||
|
@ -1,173 +1,185 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\dog_stop;
|
||||
#include maps/mp/animscripts/dog_stop;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
setup_sound_variables()
|
||||
{
|
||||
level.dog_sounds["far"] = spawnstruct();
|
||||
level.dog_sounds["close"] = spawnstruct();
|
||||
level.dog_sounds["close"].minrange = 0;
|
||||
level.dog_sounds["close"].maxrange = 500;
|
||||
level.dog_sounds["close"].sound = "aml_dog_bark_close";
|
||||
level.dog_sounds["close"].soundlengthplaceholder = 0.2;
|
||||
level.dog_sounds["close"].aftersoundwaitmin = 0.1;
|
||||
level.dog_sounds["close"].aftersoundwaitmax = 0.3;
|
||||
level.dog_sounds["close"].minrangesqr = level.dog_sounds["close"].minrange * level.dog_sounds["close"].minrange;
|
||||
level.dog_sounds["close"].maxrangesqr = level.dog_sounds["close"].maxrange * level.dog_sounds["close"].maxrange;
|
||||
level.dog_sounds["far"].minrange = 500;
|
||||
level.dog_sounds["far"].maxrange = 0;
|
||||
level.dog_sounds["far"].sound = "aml_dog_bark";
|
||||
level.dog_sounds["far"].soundlengthplaceholder = 0.2;
|
||||
level.dog_sounds["far"].aftersoundwaitmin = 0.1;
|
||||
level.dog_sounds["far"].aftersoundwaitmax = 0.3;
|
||||
level.dog_sounds["far"].minrangesqr = level.dog_sounds["far"].minrange * level.dog_sounds["far"].minrange;
|
||||
level.dog_sounds["far"].maxrangesqr = level.dog_sounds["far"].maxrange * level.dog_sounds["far"].maxrange;
|
||||
level.dog_sounds[ "far" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ].minrange = 0;
|
||||
level.dog_sounds[ "close" ].maxrange = 500;
|
||||
level.dog_sounds[ "close" ].sound = "aml_dog_bark_close";
|
||||
level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange;
|
||||
level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange;
|
||||
level.dog_sounds[ "far" ].minrange = 500;
|
||||
level.dog_sounds[ "far" ].maxrange = 0;
|
||||
level.dog_sounds[ "far" ].sound = "aml_dog_bark";
|
||||
level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange;
|
||||
level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
do_movement = 0;
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
do_movement = 0;
|
||||
|
||||
if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && self.a.movement == "run" && do_movement )
|
||||
{
|
||||
self startmove();
|
||||
blendtime = 0;
|
||||
}
|
||||
else
|
||||
blendtime = 0.2;
|
||||
|
||||
self.traversecomplete = undefined;
|
||||
self.skipstartmove = undefined;
|
||||
|
||||
if ( do_movement )
|
||||
{
|
||||
if ( shouldrun() )
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" );
|
||||
debug_anim_print( "dog_move::main() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_start " );
|
||||
self setanimstate( "move_walk" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" );
|
||||
}
|
||||
}
|
||||
|
||||
self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self moveloop();
|
||||
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
if ( self.disablearrivals == 0 )
|
||||
self thread stopmove();
|
||||
|
||||
self waittill( "run" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement )
|
||||
{
|
||||
self startmove();
|
||||
blendtime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
blendtime = 0,2;
|
||||
}
|
||||
self.traversecomplete = undefined;
|
||||
self.skipstartmove = undefined;
|
||||
if ( do_movement )
|
||||
{
|
||||
if ( shouldrun() )
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" );
|
||||
debug_anim_print( "dog_move::main() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_start " );
|
||||
self setanimstate( "move_walk" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" );
|
||||
}
|
||||
}
|
||||
self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" );
|
||||
while ( 1 )
|
||||
{
|
||||
self moveloop();
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
if ( self.disablearrivals == 0 )
|
||||
{
|
||||
self thread stopmove();
|
||||
}
|
||||
self waittill( "run" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
moveloop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
do_movement = 1;
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
while ( 1 )
|
||||
{
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
do_movement = 0;
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
do_movement = 0;
|
||||
|
||||
if ( !do_movement )
|
||||
{
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstate( "stop_idle" );
|
||||
maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( self.disablearrivals )
|
||||
self.stopanimdistsq = 0;
|
||||
else
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
|
||||
if ( shouldrun() )
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_walk " );
|
||||
self setanimstate( "move_walk" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
while ( !do_movement )
|
||||
{
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstate( "stop_idle" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
}
|
||||
if ( self.disablearrivals )
|
||||
{
|
||||
self.stopanimdistsq = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
}
|
||||
if ( shouldrun() )
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_walk " );
|
||||
self setanimstate( "move_walk" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
debug_anim_print( "dog_move::startMove() - Setting move_start " );
|
||||
self setanimstate( "move_start" );
|
||||
maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_move::startMove() - move_start notify done." );
|
||||
self animmode( "none", 0 );
|
||||
self set_orient_mode( "face motion" );
|
||||
debug_anim_print( "dog_move::startMove() - Setting move_start " );
|
||||
self setanimstate( "move_start" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_move::startMove() - move_start notify done." );
|
||||
self animmode( "none", 0 );
|
||||
self set_orient_mode( "face motion" );
|
||||
}
|
||||
|
||||
stopmove()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "run" );
|
||||
debug_anim_print( "dog_move::stopMove() - Setting move_stop" );
|
||||
self setanimstate( "move_stop" );
|
||||
maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_move::stopMove() - move_stop notify done." );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "run" );
|
||||
debug_anim_print( "dog_move::stopMove() - Setting move_stop" );
|
||||
self setanimstate( "move_stop" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_move::stopMove() - move_stop notify done." );
|
||||
}
|
||||
|
||||
shouldrun()
|
||||
{
|
||||
/#
|
||||
if ( getdvarint( _hash_DFB12081 ) != 0 )
|
||||
return true;
|
||||
else if ( getdvarint( _hash_D5D7999B ) != 0 )
|
||||
return false;
|
||||
if ( getDvarInt( #"DFB12081" ) != 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvarInt( #"D5D7999B" ) != 0 )
|
||||
{
|
||||
return 0;
|
||||
#/
|
||||
if ( isdefined( self.enemy ) )
|
||||
return true;
|
||||
|
||||
if ( self.lookaheaddist <= 90 )
|
||||
return false;
|
||||
|
||||
angles = vectortoangles( self.lookaheaddir );
|
||||
yaw_desired = absangleclamp180( angles[1] );
|
||||
yaw = absangleclamp180( self.angles[1] );
|
||||
|
||||
if ( abs( yaw_desired - yaw ) >= 8 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( self.lookaheaddist <= 90 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
angles = vectorToAngle( self.lookaheaddir );
|
||||
yaw_desired = absangleclamp180( angles[ 1 ] );
|
||||
yaw = absangleclamp180( self.angles[ 1 ] );
|
||||
if ( abs( yaw_desired - yaw ) >= 8 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,28 +1,26 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
|
||||
if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self unlink();
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
|
||||
speed = length( self getvelocity() );
|
||||
pain_anim = getanimdirection( self.damageyaw );
|
||||
|
||||
if ( speed > level.dogrunpainspeed )
|
||||
pain_anim = "pain_run_" + pain_anim;
|
||||
else
|
||||
pain_anim = "pain_" + pain_anim;
|
||||
|
||||
self setanimstate( pain_anim );
|
||||
self maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" );
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self unlink();
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
speed = length( self getvelocity() );
|
||||
pain_anim = getanimdirection( self.damageyaw );
|
||||
if ( speed > level.dogrunpainspeed )
|
||||
{
|
||||
pain_anim = "pain_run_" + pain_anim;
|
||||
}
|
||||
else
|
||||
{
|
||||
pain_anim = "pain_" + pain_anim;
|
||||
}
|
||||
self setanimstate( pain_anim );
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" );
|
||||
}
|
||||
|
@ -1,129 +1,132 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_stop::main()" );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
self randomattackidle();
|
||||
maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_idle" );
|
||||
self notify( "stop tracking" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstate( "stop_idle" );
|
||||
maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
}
|
||||
|
||||
debug_anim_print( "dog_stop::main() - stop idle loop notify done." );
|
||||
}
|
||||
debug_anim_print( "dog_stop::main()" );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
self randomattackidle();
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_idle" );
|
||||
self notify( "stop tracking" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstate( "stop_idle" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
}
|
||||
debug_anim_print( "dog_stop::main() - stop idle loop notify done." );
|
||||
}
|
||||
}
|
||||
|
||||
isfacingenemy( tolerancecosangle )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( self.enemy ) );
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
vectoenemy = self.enemy.origin - self.origin;
|
||||
disttoenemy = length( vectoenemy );
|
||||
|
||||
if ( disttoenemy < 1 )
|
||||
return 1;
|
||||
|
||||
forward = anglestoforward( self.angles );
|
||||
val1 = forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1];
|
||||
val2 = ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy;
|
||||
return ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy > tolerancecosangle;
|
||||
vectoenemy = self.enemy.origin - self.origin;
|
||||
disttoenemy = length( vectoenemy );
|
||||
if ( disttoenemy < 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
forward = anglesToForward( self.angles );
|
||||
val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] );
|
||||
val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy;
|
||||
return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle;
|
||||
}
|
||||
|
||||
randomattackidle()
|
||||
{
|
||||
if ( isfacingenemy( -0.5 ) )
|
||||
self set_orient_mode( "face current" );
|
||||
else
|
||||
self set_orient_mode( "face enemy" );
|
||||
|
||||
if ( should_growl() )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" );
|
||||
self setanimstate( "stop_attackidle_growl" );
|
||||
return;
|
||||
}
|
||||
|
||||
idlechance = 33;
|
||||
barkchance = 66;
|
||||
|
||||
if ( isdefined( self.mode ) )
|
||||
{
|
||||
if ( self.mode == "growl" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 30;
|
||||
}
|
||||
else if ( self.mode == "bark" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 85;
|
||||
}
|
||||
}
|
||||
|
||||
rand = randomint( 100 );
|
||||
|
||||
if ( rand < idlechance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle" );
|
||||
self setanimstate( "stop_attackidle" );
|
||||
}
|
||||
else if ( rand < barkchance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " );
|
||||
self setanimstate( "stop_attackidle_bark" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " );
|
||||
self setanimstate( "stop_attackidle_growl" );
|
||||
}
|
||||
if ( isfacingenemy( -0,5 ) )
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
}
|
||||
if ( should_growl() )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" );
|
||||
self setanimstate( "stop_attackidle_growl" );
|
||||
return;
|
||||
}
|
||||
idlechance = 33;
|
||||
barkchance = 66;
|
||||
if ( isDefined( self.mode ) )
|
||||
{
|
||||
if ( self.mode == "growl" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 30;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.mode == "bark" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 85;
|
||||
}
|
||||
}
|
||||
}
|
||||
rand = randomint( 100 );
|
||||
if ( rand < idlechance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle" );
|
||||
self setanimstate( "stop_attackidle" );
|
||||
}
|
||||
else if ( rand < barkchance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " );
|
||||
self setanimstate( "stop_attackidle_bark" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " );
|
||||
self setanimstate( "stop_attackidle_growl" );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
return isdefined( self.enemy ) && isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
if ( isDefined( self.enemy ) && isalive( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
should_growl()
|
||||
{
|
||||
if ( isdefined( self.script_growl ) )
|
||||
return 1;
|
||||
|
||||
if ( !isalive( self.enemy ) )
|
||||
return 1;
|
||||
|
||||
return !self cansee( self.enemy );
|
||||
if ( isDefined( self.script_growl ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return !self cansee( self.enemy );
|
||||
}
|
||||
|
||||
lookattarget( lookposeset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop tracking" );
|
||||
debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset );
|
||||
self.rightaimlimit = 90;
|
||||
self.leftaimlimit = -90;
|
||||
self.upaimlimit = 45;
|
||||
self.downaimlimit = -45;
|
||||
self maps\mp\animscripts\shared::setanimaimweight( 1, 0.2 );
|
||||
self maps\mp\animscripts\shared::trackloop();
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop tracking" );
|
||||
debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset );
|
||||
self.rightaimlimit = 90;
|
||||
self.leftaimlimit = -90;
|
||||
self.upaimlimit = 45;
|
||||
self.downaimlimit = -45;
|
||||
self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 );
|
||||
self maps/mp/animscripts/shared::trackloop();
|
||||
}
|
||||
|
@ -1,123 +1,117 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_turn_print( "dog_turn::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
deltayaw = self getdeltaturnyaw();
|
||||
|
||||
if ( need_to_turn_around( deltayaw ) )
|
||||
turn_180( deltayaw );
|
||||
else
|
||||
turn_90( deltayaw );
|
||||
|
||||
move_out_of_turn();
|
||||
self.skipstartmove = 1;
|
||||
self.safetochangescript = 1;
|
||||
self endon( "killanimscript" );
|
||||
debug_turn_print( "dog_turn::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
deltayaw = self getdeltaturnyaw();
|
||||
if ( need_to_turn_around( deltayaw ) )
|
||||
{
|
||||
turn_180( deltayaw );
|
||||
}
|
||||
else
|
||||
{
|
||||
turn_90( deltayaw );
|
||||
}
|
||||
move_out_of_turn();
|
||||
self.skipstartmove = 1;
|
||||
self.safetochangescript = 1;
|
||||
}
|
||||
|
||||
need_to_turn_around( deltayaw )
|
||||
{
|
||||
angle = getdvarfloat( "dog_turn180_angle" );
|
||||
|
||||
if ( deltayaw >= angle || deltayaw <= -1 * angle )
|
||||
{
|
||||
debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" );
|
||||
return true;
|
||||
}
|
||||
|
||||
debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" );
|
||||
return false;
|
||||
angle = getDvarFloat( "dog_turn180_angle" );
|
||||
if ( deltayaw >= angle || deltayaw <= ( -1 * angle ) )
|
||||
{
|
||||
debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" );
|
||||
return 1;
|
||||
}
|
||||
debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time )
|
||||
{
|
||||
speed = length( self getvelocity() );
|
||||
do_anim = stopped_anim;
|
||||
|
||||
if ( level.dogrunturnspeed < speed )
|
||||
{
|
||||
do_anim = run_anim;
|
||||
wait_time = run_wait_time;
|
||||
}
|
||||
|
||||
debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim );
|
||||
self setanimstate( do_anim );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( run_wait_time, "done" );
|
||||
debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time );
|
||||
speed = length( self getvelocity() );
|
||||
do_anim = stopped_anim;
|
||||
if ( level.dogrunturnspeed < speed )
|
||||
{
|
||||
do_anim = run_anim;
|
||||
wait_time = run_wait_time;
|
||||
}
|
||||
debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim );
|
||||
self setanimstate( do_anim );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( run_wait_time, "done" );
|
||||
debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time );
|
||||
}
|
||||
|
||||
turn_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_left", "move_run_turn_left", 0.5, 0.5 );
|
||||
self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_right", "move_run_turn_right", 0.5, 0.5 );
|
||||
self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_180_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0.5, 0.7 );
|
||||
self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
turn_180_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0.5, 0.7 );
|
||||
self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
move_out_of_turn()
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" );
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " );
|
||||
self setanimstate( "move_walk" );
|
||||
}
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" );
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " );
|
||||
self setanimstate( "move_walk" );
|
||||
}
|
||||
}
|
||||
|
||||
turn_90( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics", 0 );
|
||||
debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw );
|
||||
|
||||
if ( deltayaw > 0 )
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_90() left", 1 );
|
||||
self turn_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_90() right", 1 );
|
||||
self turn_right();
|
||||
}
|
||||
self animmode( "zonly_physics", 0 );
|
||||
debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > 0 )
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_90() left", 1 );
|
||||
self turn_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_90() right", 1 );
|
||||
self turn_right();
|
||||
}
|
||||
}
|
||||
|
||||
turn_180( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics", 0 );
|
||||
debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw );
|
||||
|
||||
if ( deltayaw > 0 )
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_180() left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_180() right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
self animmode( "zonly_physics", 0 );
|
||||
debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > 0 )
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_180() left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_180() right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
}
|
||||
|
@ -1,287 +1,306 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
handledogsoundnotetracks( note )
|
||||
{
|
||||
if ( note == "sound_dogstep_run_default" )
|
||||
return true;
|
||||
|
||||
prefix = getsubstr( note, 0, 5 );
|
||||
|
||||
if ( prefix != "sound" )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
if ( note == "sound_dogstep_run_default" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
prefix = getsubstr( note, 0, 5 );
|
||||
if ( prefix != "sound" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
growling()
|
||||
{
|
||||
return isdefined( self.script_growl );
|
||||
return isDefined( self.script_growl );
|
||||
}
|
||||
|
||||
handlenotetrack( note, flagname, customfunction, var1 )
|
||||
{
|
||||
/#
|
||||
if ( getdvarint( _hash_6EBEB982 ) )
|
||||
println( "dog notetrack: " + flagname + " " + note + " " + gettime() );
|
||||
if ( getDvarInt( #"6EBEB982" ) )
|
||||
{
|
||||
println( "dog notetrack: " + flagname + " " + note + " " + getTime() );
|
||||
#/
|
||||
if ( isai( self ) && self.type == "dog" )
|
||||
{
|
||||
if ( handledogsoundnotetracks( note ) )
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( note )
|
||||
{
|
||||
case "undefined":
|
||||
case "finish":
|
||||
case "end":
|
||||
return note;
|
||||
default:
|
||||
if ( isdefined( customfunction ) )
|
||||
{
|
||||
if ( !isdefined( var1 ) )
|
||||
return [[ customfunction ]]( note );
|
||||
else
|
||||
return [[ customfunction ]]( note, var1 );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( isai( self ) && self.type == "dog" )
|
||||
{
|
||||
if ( handledogsoundnotetracks( note ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
switch( note )
|
||||
{
|
||||
case "end":
|
||||
case "finish":
|
||||
case "undefined":
|
||||
return note;
|
||||
default:
|
||||
if ( isDefined( customfunction ) )
|
||||
{
|
||||
if ( !isDefined( var1 ) )
|
||||
{
|
||||
return [[ customfunction ]]( note );
|
||||
}
|
||||
else
|
||||
{
|
||||
return [[ customfunction ]]( note, var1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracks( flagname, customfunction, var1 )
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
self waittill( flagname, note );
|
||||
|
||||
if ( !isdefined( note ) )
|
||||
note = "undefined";
|
||||
|
||||
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
||||
|
||||
if ( isdefined( val ) )
|
||||
return val;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( flagname, note );
|
||||
if ( !isDefined( note ) )
|
||||
{
|
||||
note = "undefined";
|
||||
}
|
||||
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
||||
if ( isDefined( val ) )
|
||||
{
|
||||
return val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
if ( isdefined( killstring ) )
|
||||
self endon( killstring );
|
||||
|
||||
self endon( "killanimscript" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
time = gettime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = gettime() - time;
|
||||
|
||||
if ( timetaken < 0.05 )
|
||||
{
|
||||
time = gettime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = gettime() - time;
|
||||
|
||||
if ( timetaken < 0.05 )
|
||||
{
|
||||
if ( isDefined( killstring ) )
|
||||
{
|
||||
self endon( killstring );
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
for ( ;; )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
/#
|
||||
println( gettime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
#/
|
||||
wait( 0.05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
wait ( 0,05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforever( flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
||||
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 )
|
||||
{
|
||||
ent endon( "stop_notetracks" );
|
||||
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
||||
ent endon( "stop_notetracks" );
|
||||
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortime( time, flagname, customfunction, var1 )
|
||||
{
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeendnotify( time )
|
||||
{
|
||||
wait( time );
|
||||
self notify( "stop_notetracks" );
|
||||
wait time;
|
||||
self notify( "stop_notetracks" );
|
||||
}
|
||||
|
||||
trackloop()
|
||||
{
|
||||
players = get_players();
|
||||
deltachangeperframe = 5;
|
||||
aimblendtime = 0.05;
|
||||
prevyawdelta = 0;
|
||||
prevpitchdelta = 0;
|
||||
maxyawdeltachange = 5;
|
||||
maxpitchdeltachange = 5;
|
||||
pitchadd = 0;
|
||||
yawadd = 0;
|
||||
|
||||
if ( self.type == "dog" || self.type == "zombie" || self.type == "zombie_dog" )
|
||||
{
|
||||
domaxanglecheck = 0;
|
||||
self.shootent = self.enemy;
|
||||
}
|
||||
else
|
||||
{
|
||||
domaxanglecheck = 1;
|
||||
|
||||
if ( self.a.script == "cover_crouch" && isdefined( self.a.covermode ) && self.a.covermode == "lean" )
|
||||
pitchadd = -1 * anim.covercrouchleanpitch;
|
||||
|
||||
if ( ( self.a.script == "cover_left" || self.a.script == "cover_right" ) && isdefined( self.a.cornermode ) && self.a.cornermode == "lean" )
|
||||
yawadd = self.covernode.angles[1] - self.angles[1];
|
||||
}
|
||||
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
firstframe = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
incranimaimweight();
|
||||
selfshootatpos = ( self.origin[0], self.origin[1], self geteye()[2] );
|
||||
shootpos = undefined;
|
||||
|
||||
if ( isdefined( self.enemy ) )
|
||||
shootpos = self.enemy getshootatpos();
|
||||
|
||||
if ( !isdefined( shootpos ) )
|
||||
{
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
vectortoshootpos = shootpos - selfshootatpos;
|
||||
anglestoshootpos = vectortoangles( vectortoshootpos );
|
||||
pitchdelta = 360 - anglestoshootpos[0];
|
||||
pitchdelta = angleclamp180( pitchdelta + pitchadd );
|
||||
yawdelta = self.angles[1] - anglestoshootpos[1];
|
||||
yawdelta = angleclamp180( yawdelta + yawadd );
|
||||
}
|
||||
|
||||
if ( domaxanglecheck && ( abs( yawdelta ) > 60 || abs( pitchdelta ) > 60 ) )
|
||||
{
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta > self.rightaimlimit )
|
||||
yawdelta = self.rightaimlimit;
|
||||
else if ( yawdelta < self.leftaimlimit )
|
||||
yawdelta = self.leftaimlimit;
|
||||
|
||||
if ( pitchdelta > self.upaimlimit )
|
||||
pitchdelta = self.upaimlimit;
|
||||
else if ( pitchdelta < self.downaimlimit )
|
||||
pitchdelta = self.downaimlimit;
|
||||
}
|
||||
|
||||
if ( firstframe )
|
||||
firstframe = 0;
|
||||
else
|
||||
{
|
||||
yawdeltachange = yawdelta - prevyawdelta;
|
||||
|
||||
if ( abs( yawdeltachange ) > maxyawdeltachange )
|
||||
yawdelta = prevyawdelta + maxyawdeltachange * sign( yawdeltachange );
|
||||
|
||||
pitchdeltachange = pitchdelta - prevpitchdelta;
|
||||
|
||||
if ( abs( pitchdeltachange ) > maxpitchdeltachange )
|
||||
pitchdelta = prevpitchdelta + maxpitchdeltachange * sign( pitchdeltachange );
|
||||
}
|
||||
|
||||
prevyawdelta = yawdelta;
|
||||
prevpitchdelta = pitchdelta;
|
||||
updown = 0;
|
||||
leftright = 0;
|
||||
|
||||
if ( yawdelta > 0 )
|
||||
{
|
||||
players = get_players();
|
||||
deltachangeperframe = 5;
|
||||
aimblendtime = 0,05;
|
||||
prevyawdelta = 0;
|
||||
prevpitchdelta = 0;
|
||||
maxyawdeltachange = 5;
|
||||
maxpitchdeltachange = 5;
|
||||
pitchadd = 0;
|
||||
yawadd = 0;
|
||||
if ( self.type != "dog" || self.type == "zombie" && self.type == "zombie_dog" )
|
||||
{
|
||||
domaxanglecheck = 0;
|
||||
self.shootent = self.enemy;
|
||||
}
|
||||
else
|
||||
{
|
||||
domaxanglecheck = 1;
|
||||
if ( self.a.script == "cover_crouch" && isDefined( self.a.covermode ) && self.a.covermode == "lean" )
|
||||
{
|
||||
pitchadd = -1 * anim.covercrouchleanpitch;
|
||||
}
|
||||
if ( self.a.script != "cover_left" && self.a.script == "cover_right" && isDefined( self.a.cornermode ) && self.a.cornermode == "lean" )
|
||||
{
|
||||
yawadd = self.covernode.angles[ 1 ] - self.angles[ 1 ];
|
||||
}
|
||||
}
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
firstframe = 1;
|
||||
for ( ;; )
|
||||
{
|
||||
incranimaimweight();
|
||||
selfshootatpos = ( self.origin[ 0 ], self.origin[ 1 ], self geteye()[ 2 ] );
|
||||
shootpos = undefined;
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
shootpos = self.enemy getshootatpos();
|
||||
}
|
||||
if ( !isDefined( shootpos ) )
|
||||
{
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
vectortoshootpos = shootpos - selfshootatpos;
|
||||
anglestoshootpos = vectorToAngle( vectortoshootpos );
|
||||
pitchdelta = 360 - anglestoshootpos[ 0 ];
|
||||
pitchdelta = angleClamp180( pitchdelta + pitchadd );
|
||||
yawdelta = self.angles[ 1 ] - anglestoshootpos[ 1 ];
|
||||
yawdelta = angleClamp180( yawdelta + yawadd );
|
||||
}
|
||||
if ( domaxanglecheck || abs( yawdelta ) > 60 && abs( pitchdelta ) > 60 )
|
||||
{
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta > self.rightaimlimit )
|
||||
{
|
||||
yawdelta = self.rightaimlimit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta < self.leftaimlimit )
|
||||
{
|
||||
yawdelta = self.leftaimlimit;
|
||||
}
|
||||
}
|
||||
if ( pitchdelta > self.upaimlimit )
|
||||
{
|
||||
pitchdelta = self.upaimlimit;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( pitchdelta < self.downaimlimit )
|
||||
{
|
||||
pitchdelta = self.downaimlimit;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( firstframe )
|
||||
{
|
||||
firstframe = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
yawdeltachange = yawdelta - prevyawdelta;
|
||||
if ( abs( yawdeltachange ) > maxyawdeltachange )
|
||||
{
|
||||
yawdelta = prevyawdelta + ( maxyawdeltachange * sign( yawdeltachange ) );
|
||||
}
|
||||
pitchdeltachange = pitchdelta - prevpitchdelta;
|
||||
if ( abs( pitchdeltachange ) > maxpitchdeltachange )
|
||||
{
|
||||
pitchdelta = prevpitchdelta + ( maxpitchdeltachange * sign( pitchdeltachange ) );
|
||||
}
|
||||
}
|
||||
prevyawdelta = yawdelta;
|
||||
prevpitchdelta = pitchdelta;
|
||||
updown = 0;
|
||||
leftright = 0;
|
||||
if ( yawdelta > 0 )
|
||||
{
|
||||
/#
|
||||
assert( yawdelta <= self.rightaimlimit );
|
||||
assert( yawdelta <= self.rightaimlimit );
|
||||
#/
|
||||
weight = yawdelta / self.rightaimlimit * self.a.aimweight;
|
||||
leftright = weight;
|
||||
}
|
||||
else if ( yawdelta < 0 )
|
||||
{
|
||||
weight = ( yawdelta / self.rightaimlimit ) * self.a.aimweight;
|
||||
leftright = weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta < 0 )
|
||||
{
|
||||
/#
|
||||
assert( yawdelta >= self.leftaimlimit );
|
||||
assert( yawdelta >= self.leftaimlimit );
|
||||
#/
|
||||
weight = yawdelta / self.leftaimlimit * self.a.aimweight;
|
||||
leftright = -1 * weight;
|
||||
}
|
||||
|
||||
if ( pitchdelta > 0 )
|
||||
{
|
||||
weight = ( yawdelta / self.leftaimlimit ) * self.a.aimweight;
|
||||
leftright = -1 * weight;
|
||||
}
|
||||
}
|
||||
if ( pitchdelta > 0 )
|
||||
{
|
||||
/#
|
||||
assert( pitchdelta <= self.upaimlimit );
|
||||
assert( pitchdelta <= self.upaimlimit );
|
||||
#/
|
||||
weight = pitchdelta / self.upaimlimit * self.a.aimweight;
|
||||
updown = weight;
|
||||
}
|
||||
else if ( pitchdelta < 0 )
|
||||
{
|
||||
weight = ( pitchdelta / self.upaimlimit ) * self.a.aimweight;
|
||||
updown = weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( pitchdelta < 0 )
|
||||
{
|
||||
/#
|
||||
assert( pitchdelta >= self.downaimlimit );
|
||||
assert( pitchdelta >= self.downaimlimit );
|
||||
#/
|
||||
weight = pitchdelta / self.downaimlimit * self.a.aimweight;
|
||||
updown = -1 * weight;
|
||||
}
|
||||
|
||||
self setaimanimweights( updown, leftright );
|
||||
wait 0.05;
|
||||
}
|
||||
weight = ( pitchdelta / self.downaimlimit ) * self.a.aimweight;
|
||||
updown = -1 * weight;
|
||||
}
|
||||
}
|
||||
self setaimanimweights( updown, leftright );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
setanimaimweight( goalweight, goaltime )
|
||||
{
|
||||
if ( !isdefined( goaltime ) || goaltime <= 0 )
|
||||
{
|
||||
self.a.aimweight = goalweight;
|
||||
self.a.aimweight_start = goalweight;
|
||||
self.a.aimweight_end = goalweight;
|
||||
self.a.aimweight_transframes = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.aimweight = goalweight;
|
||||
self.a.aimweight_start = self.a.aimweight;
|
||||
self.a.aimweight_end = goalweight;
|
||||
self.a.aimweight_transframes = int( goaltime * 20 );
|
||||
}
|
||||
|
||||
self.a.aimweight_t = 0;
|
||||
if ( !isDefined( goaltime ) || goaltime <= 0 )
|
||||
{
|
||||
self.a.aimweight = goalweight;
|
||||
self.a.aimweight_start = goalweight;
|
||||
self.a.aimweight_end = goalweight;
|
||||
self.a.aimweight_transframes = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.aimweight = goalweight;
|
||||
self.a.aimweight_start = self.a.aimweight;
|
||||
self.a.aimweight_end = goalweight;
|
||||
self.a.aimweight_transframes = int( goaltime * 20 );
|
||||
}
|
||||
self.a.aimweight_t = 0;
|
||||
}
|
||||
|
||||
incranimaimweight()
|
||||
{
|
||||
if ( self.a.aimweight_t < self.a.aimweight_transframes )
|
||||
{
|
||||
self.a.aimweight_t++;
|
||||
t = 1.0 * self.a.aimweight_t / self.a.aimweight_transframes;
|
||||
self.a.aimweight = self.a.aimweight_start * ( 1 - t ) + self.a.aimweight_end * t;
|
||||
}
|
||||
if ( self.a.aimweight_t < self.a.aimweight_transframes )
|
||||
{
|
||||
self.a.aimweight_t++;
|
||||
t = ( 1 * self.a.aimweight_t ) / self.a.aimweight_transframes;
|
||||
self.a.aimweight = ( self.a.aimweight_start * ( 1 - t ) ) + ( self.a.aimweight_end * t );
|
||||
}
|
||||
}
|
||||
|
@ -1,207 +1,227 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
init_traverse()
|
||||
{
|
||||
point = getent( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[2];
|
||||
point delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
point = getstruct( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( point ) )
|
||||
self.traverse_height = point.origin[2];
|
||||
}
|
||||
point = getent( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
point delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
point = getstruct( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportthread( verticaloffset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
reps = 5;
|
||||
offset = ( 0, 0, verticaloffset / reps );
|
||||
|
||||
for ( i = 0; i < reps; i++ )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
reps = 5;
|
||||
offset = ( 0, 0, verticaloffset / reps );
|
||||
i = 0;
|
||||
while ( i < reps )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
teleportthreadex( verticaloffset, delay, frames )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
|
||||
if ( verticaloffset == 0 )
|
||||
return;
|
||||
|
||||
wait( delay );
|
||||
amount = verticaloffset / frames;
|
||||
|
||||
if ( amount > 10.0 )
|
||||
amount = 10.0;
|
||||
else if ( amount < -10.0 )
|
||||
amount = -10.0;
|
||||
|
||||
offset = ( 0, 0, amount );
|
||||
|
||||
for ( i = 0; i < frames; i++ )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
if ( verticaloffset == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait delay;
|
||||
amount = verticaloffset / frames;
|
||||
if ( amount > 10 )
|
||||
{
|
||||
amount = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( amount < -10 )
|
||||
{
|
||||
amount = -10;
|
||||
}
|
||||
}
|
||||
offset = ( 0, 0, amount );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dog_wall_and_window_hop( traversename, height )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isdefined( startnode ) );
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[1] );
|
||||
|
||||
if ( isdefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[2];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else if ( height != 36.0 )
|
||||
self thread teleportthreadex( height - 36.0, 0.2, 7 );
|
||||
|
||||
debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename );
|
||||
self setanimstate( traversename );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 1.0, "done" );
|
||||
debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename );
|
||||
self.traversecomplete = 1;
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 36 )
|
||||
{
|
||||
self thread teleportthreadex( height - 36, 0,2, 7 );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename );
|
||||
self setanimstate( traversename );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 1, "done" );
|
||||
debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_down( height, frames, time )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
|
||||
if ( !isdefined( time ) )
|
||||
time = 0.3;
|
||||
|
||||
startnode = self getnegotiationstartnode();
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
if ( !isDefined( time ) )
|
||||
{
|
||||
time = 0,3;
|
||||
}
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isdefined( startnode ) );
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[1] );
|
||||
|
||||
if ( isdefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[2];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else if ( height != 40.0 )
|
||||
self thread teleportthreadex( height - 40.0, 0.1, frames );
|
||||
|
||||
debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" );
|
||||
self setanimstate( "traverse_jump_down_40" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( time, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 40 )
|
||||
{
|
||||
self thread teleportthreadex( height - 40, 0,1, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" );
|
||||
self setanimstate( "traverse_jump_down_40" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( time, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_down_far( height, frames, time )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
|
||||
if ( !isdefined( time ) )
|
||||
time = 0.3;
|
||||
|
||||
startnode = self getnegotiationstartnode();
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
if ( !isDefined( time ) )
|
||||
{
|
||||
time = 0,3;
|
||||
}
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isdefined( startnode ) );
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[1] );
|
||||
|
||||
if ( isdefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[2];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else if ( height != 80.0 )
|
||||
self thread teleportthreadex( 80.0 - height, 0.1, frames );
|
||||
|
||||
debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" );
|
||||
self setanimstate( "traverse_jump_down_80" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( time, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 80 )
|
||||
{
|
||||
self thread teleportthreadex( 80 - height, 0,1, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" );
|
||||
self setanimstate( "traverse_jump_down_80" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( time, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_up( height, frames )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isdefined( startnode ) );
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[1] );
|
||||
|
||||
if ( isdefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[2];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else if ( height != 40.0 )
|
||||
self thread teleportthreadex( height - 40.0, 0.2, frames );
|
||||
|
||||
debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" );
|
||||
self setanimstate( "traverse_jump_up_40" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.5, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 40 )
|
||||
{
|
||||
self thread teleportthreadex( height - 40, 0,2, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" );
|
||||
self setanimstate( "traverse_jump_up_40" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,5, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_up_high( height, frames )
|
||||
{
|
||||
/#
|
||||
assert( self.type == "dog", "Only dogs can do this traverse currently." );
|
||||
assert( self.type == "dog", "Only dogs can do this traverse currently." );
|
||||
#/
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isdefined( startnode ) );
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[1] );
|
||||
|
||||
if ( isdefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[2];
|
||||
self thread teleportthreadex( height - 80, 0.2, frames );
|
||||
}
|
||||
else if ( height != 80.0 )
|
||||
self thread teleportthreadex( height - 80.0, 0.2, frames );
|
||||
|
||||
debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" );
|
||||
self setanimstate( "traverse_jump_up_80" );
|
||||
maps\mp\animscripts\shared::donotetracksfortime( 0.6, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthreadex( height - 80, 0,2, frames );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 80 )
|
||||
{
|
||||
self thread teleportthreadex( height - 80, 0,2, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" );
|
||||
self setanimstate( "traverse_jump_up_80" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,6, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
@ -1,49 +1,44 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\traverse\shared;
|
||||
#include maps\mp\animscripts\traverse\zm_shared;
|
||||
#include maps/mp/animscripts/traverse/zm_shared;
|
||||
#include maps/mp/animscripts/traverse/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
traversestate = "zm_traverse_barrier";
|
||||
traversealias = "barrier_walk";
|
||||
|
||||
if ( self.has_legs )
|
||||
{
|
||||
switch ( self.zombie_move_speed )
|
||||
{
|
||||
case "walk_slide":
|
||||
case "walk":
|
||||
case "low_gravity_walk":
|
||||
traversealias = "barrier_walk";
|
||||
break;
|
||||
case "run_slide":
|
||||
case "run":
|
||||
case "low_gravity_run":
|
||||
traversealias = "barrier_run";
|
||||
break;
|
||||
case "super_sprint":
|
||||
case "sprint_slide":
|
||||
case "sprint":
|
||||
case "low_gravity_sprint":
|
||||
traversealias = "barrier_sprint";
|
||||
break;
|
||||
default:
|
||||
if ( isdefined( level.zm_mantle_over_40_move_speed_override ) )
|
||||
traversealias = self [[ level.zm_mantle_over_40_move_speed_override ]]();
|
||||
else
|
||||
{
|
||||
/#
|
||||
assertmsg( "Zombie '" + self.classname + "' move speed of '" + self.zombie_move_speed + "' is not supported for mantle_over_40." );
|
||||
traversestate = "zm_traverse_barrier";
|
||||
traversealias = "barrier_walk";
|
||||
if ( self.has_legs )
|
||||
{
|
||||
switch( self.zombie_move_speed )
|
||||
{
|
||||
case "low_gravity_walk":
|
||||
case "walk":
|
||||
case "walk_slide":
|
||||
traversealias = "barrier_walk";
|
||||
break;
|
||||
case "low_gravity_run":
|
||||
case "run":
|
||||
case "run_slide":
|
||||
traversealias = "barrier_run";
|
||||
break;
|
||||
case "low_gravity_sprint":
|
||||
case "sprint":
|
||||
case "sprint_slide":
|
||||
case "super_sprint":
|
||||
traversealias = "barrier_sprint";
|
||||
break;
|
||||
default:
|
||||
if ( isDefined( level.zm_mantle_over_40_move_speed_override ) )
|
||||
{
|
||||
traversealias = self [[ level.zm_mantle_over_40_move_speed_override ]]();
|
||||
}
|
||||
else /#
|
||||
assertmsg( "Zombie '" + self.classname + "' move speed of '" + self.zombie_move_speed + "' is not supported for mantle_over_40." );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
traversestate = "zm_traverse_barrier_crawl";
|
||||
traversealias = "barrier_crawl";
|
||||
}
|
||||
|
||||
self dotraverse( traversestate, traversealias );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
traversestate = "zm_traverse_barrier_crawl";
|
||||
traversealias = "barrier_crawl";
|
||||
}
|
||||
self dotraverse( traversestate, traversealias );
|
||||
}
|
||||
|
@ -1,146 +1,151 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps\mp\animscripts\zm_run;
|
||||
#include maps/mp/animscripts/zm_run;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
init_traverse()
|
||||
{
|
||||
point = getent( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[2];
|
||||
point delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
point = getstruct( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( point ) )
|
||||
self.traverse_height = point.origin[2];
|
||||
}
|
||||
point = getent( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
point delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
point = getstruct( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportthread( verticaloffset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
reps = 5;
|
||||
offset = ( 0, 0, verticaloffset / reps );
|
||||
|
||||
for ( i = 0; i < reps; i++ )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
reps = 5;
|
||||
offset = ( 0, 0, verticaloffset / reps );
|
||||
i = 0;
|
||||
while ( i < reps )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
teleportthreadex( verticaloffset, delay, frames )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
|
||||
if ( verticaloffset == 0 )
|
||||
return;
|
||||
|
||||
wait( delay );
|
||||
amount = verticaloffset / frames;
|
||||
|
||||
if ( amount > 10.0 )
|
||||
amount = 10.0;
|
||||
else if ( amount < -10.0 )
|
||||
amount = -10.0;
|
||||
|
||||
offset = ( 0, 0, amount );
|
||||
|
||||
for ( i = 0; i < frames; i++ )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
if ( verticaloffset == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait delay;
|
||||
amount = verticaloffset / frames;
|
||||
if ( amount > 10 )
|
||||
{
|
||||
amount = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( amount < -10 )
|
||||
{
|
||||
amount = -10;
|
||||
}
|
||||
}
|
||||
offset = ( 0, 0, amount );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
handletraversealignment()
|
||||
{
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
|
||||
if ( isdefined( self.traverseheight ) && isdefined( self.traversestartnode.traverse_height ) )
|
||||
{
|
||||
currentheight = self.traversestartnode.traverse_height - self.traversestartz;
|
||||
self thread teleportthread( currentheight - self.traverseheight );
|
||||
}
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
if ( isDefined( self.traverseheight ) && isDefined( self.traversestartnode.traverse_height ) )
|
||||
{
|
||||
currentheight = self.traversestartnode.traverse_height - self.traversestartz;
|
||||
self thread teleportthread( currentheight - self.traverseheight );
|
||||
}
|
||||
}
|
||||
|
||||
dosimpletraverse( traversealias, no_powerups, traversestate )
|
||||
{
|
||||
if ( !isdefined( traversestate ) )
|
||||
traversestate = "zm_traverse";
|
||||
|
||||
if ( isdefined( level.ignore_traverse ) )
|
||||
{
|
||||
if ( self [[ level.ignore_traverse ]]() )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( level.zm_traversal_override ) )
|
||||
traversealias = self [[ level.zm_traversal_override ]]( traversealias );
|
||||
|
||||
if ( !self.has_legs )
|
||||
{
|
||||
traversestate += "_crawl";
|
||||
traversealias += "_crawl";
|
||||
}
|
||||
|
||||
self dotraverse( traversestate, traversealias, no_powerups );
|
||||
if ( !isDefined( traversestate ) )
|
||||
{
|
||||
traversestate = "zm_traverse";
|
||||
}
|
||||
if ( isDefined( level.ignore_traverse ) )
|
||||
{
|
||||
if ( self [[ level.ignore_traverse ]]() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.zm_traversal_override ) )
|
||||
{
|
||||
traversealias = self [[ level.zm_traversal_override ]]( traversealias );
|
||||
}
|
||||
if ( !self.has_legs )
|
||||
{
|
||||
traversestate += "_crawl";
|
||||
traversealias += "_crawl";
|
||||
}
|
||||
self dotraverse( traversestate, traversealias, no_powerups );
|
||||
}
|
||||
|
||||
dotraverse( traversestate, traversealias, no_powerups )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
old_powerups = 0;
|
||||
|
||||
if ( isdefined( no_powerups ) && no_powerups )
|
||||
{
|
||||
old_powerups = self.no_powerups;
|
||||
self.no_powerups = 1;
|
||||
}
|
||||
|
||||
self.is_traversing = 1;
|
||||
self notify( "zombie_start_traverse" );
|
||||
self.traversestartnode = self getnegotiationstartnode();
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
old_powerups = 0;
|
||||
if ( isDefined( no_powerups ) && no_powerups )
|
||||
{
|
||||
old_powerups = self.no_powerups;
|
||||
self.no_powerups = 1;
|
||||
}
|
||||
self.is_traversing = 1;
|
||||
self notify( "zombie_start_traverse" );
|
||||
self.traversestartnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isdefined( self.traversestartnode ) );
|
||||
assert( isDefined( self.traversestartnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", self.traversestartnode.angles[1] );
|
||||
self.traversestartz = self.origin[2];
|
||||
|
||||
if ( isdefined( self.pre_traverse ) )
|
||||
self [[ self.pre_traverse ]]();
|
||||
|
||||
self setanimstatefromasd( traversestate, traversealias );
|
||||
self maps\mp\animscripts\zm_shared::donotetracks( "traverse_anim" );
|
||||
self traversemode( "gravity" );
|
||||
self.a.nodeath = 0;
|
||||
|
||||
if ( isdefined( self.post_traverse ) )
|
||||
self [[ self.post_traverse ]]();
|
||||
|
||||
self maps\mp\animscripts\zm_run::needsupdate();
|
||||
|
||||
if ( !self.isdog )
|
||||
self maps\mp\animscripts\zm_run::moverun();
|
||||
|
||||
self.is_traversing = 0;
|
||||
self notify( "zombie_end_traverse" );
|
||||
|
||||
if ( isdefined( no_powerups ) && no_powerups )
|
||||
self.no_powerups = old_powerups;
|
||||
self orientmode( "face angle", self.traversestartnode.angles[ 1 ] );
|
||||
self.traversestartz = self.origin[ 2 ];
|
||||
if ( isDefined( self.pre_traverse ) )
|
||||
{
|
||||
self [[ self.pre_traverse ]]();
|
||||
}
|
||||
self setanimstatefromasd( traversestate, traversealias );
|
||||
self maps/mp/animscripts/zm_shared::donotetracks( "traverse_anim" );
|
||||
self traversemode( "gravity" );
|
||||
self.a.nodeath = 0;
|
||||
if ( isDefined( self.post_traverse ) )
|
||||
{
|
||||
self [[ self.post_traverse ]]();
|
||||
}
|
||||
self maps/mp/animscripts/zm_run::needsupdate();
|
||||
if ( !self.isdog )
|
||||
{
|
||||
self maps/mp/animscripts/zm_run::moverun();
|
||||
}
|
||||
self.is_traversing = 0;
|
||||
self notify( "zombie_end_traverse" );
|
||||
if ( isDefined( no_powerups ) && no_powerups )
|
||||
{
|
||||
self.no_powerups = old_powerups;
|
||||
}
|
||||
}
|
||||
|
@ -1,138 +1,166 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
anim_get_dvar_int( dvar, def )
|
||||
{
|
||||
return int( anim_get_dvar( dvar, def ) );
|
||||
return int( anim_get_dvar( dvar, def ) );
|
||||
}
|
||||
|
||||
anim_get_dvar( dvar, def )
|
||||
{
|
||||
if ( getdvar( dvar ) != "" )
|
||||
return getdvarfloat( dvar );
|
||||
else
|
||||
{
|
||||
setdvar( dvar, def );
|
||||
return def;
|
||||
}
|
||||
if ( getDvar( dvar ) != "" )
|
||||
{
|
||||
return getDvarFloat( dvar );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( dvar, def );
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
set_orient_mode( mode, val1 )
|
||||
{
|
||||
/#
|
||||
if ( level.dog_debug_orient == self getentnum() )
|
||||
{
|
||||
if ( isdefined( val1 ) )
|
||||
println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + gettime() );
|
||||
else
|
||||
println( "DOG: Setting orient mode: " + mode + " " + gettime() );
|
||||
}
|
||||
if ( level.dog_debug_orient == self getentnum() )
|
||||
{
|
||||
if ( isDefined( val1 ) )
|
||||
{
|
||||
println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + getTime() );
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "DOG: Setting orient mode: " + mode + " " + getTime() );
|
||||
#/
|
||||
if ( isdefined( val1 ) )
|
||||
self orientmode( mode, val1 );
|
||||
else
|
||||
self orientmode( mode );
|
||||
}
|
||||
}
|
||||
if ( isDefined( val1 ) )
|
||||
{
|
||||
self orientmode( mode, val1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self orientmode( mode );
|
||||
}
|
||||
}
|
||||
|
||||
debug_anim_print( text )
|
||||
{
|
||||
/#
|
||||
if ( level.dog_debug_anims )
|
||||
println( text + " " + gettime() );
|
||||
|
||||
if ( level.dog_debug_anims_ent == self getentnum() )
|
||||
println( text + " " + gettime() );
|
||||
if ( level.dog_debug_anims )
|
||||
{
|
||||
println( ( text + " " ) + getTime() );
|
||||
}
|
||||
if ( level.dog_debug_anims_ent == self getentnum() )
|
||||
{
|
||||
println( ( text + " " ) + getTime() );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_turn_print( text, line )
|
||||
{
|
||||
/#
|
||||
if ( level.dog_debug_turns == self getentnum() )
|
||||
{
|
||||
duration = 200;
|
||||
currentyawcolor = ( 1, 1, 1 );
|
||||
lookaheadyawcolor = ( 1, 0, 0 );
|
||||
desiredyawcolor = ( 1, 1, 0 );
|
||||
currentyaw = angleclamp180( self.angles[1] );
|
||||
desiredyaw = angleclamp180( self.desiredangle );
|
||||
lookaheaddir = self.lookaheaddir;
|
||||
lookaheadangles = vectortoangles( lookaheaddir );
|
||||
lookaheadyaw = angleclamp180( lookaheadangles[1] );
|
||||
println( text + " " + gettime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw );
|
||||
}
|
||||
if ( level.dog_debug_turns == self getentnum() )
|
||||
{
|
||||
duration = 200;
|
||||
currentyawcolor = ( 1, 0, 1 );
|
||||
lookaheadyawcolor = ( 1, 0, 1 );
|
||||
desiredyawcolor = ( 1, 0, 1 );
|
||||
currentyaw = angleClamp180( self.angles[ 1 ] );
|
||||
desiredyaw = angleClamp180( self.desiredangle );
|
||||
lookaheaddir = self.lookaheaddir;
|
||||
lookaheadangles = vectorToAngle( lookaheaddir );
|
||||
lookaheadyaw = angleClamp180( lookaheadangles[ 1 ] );
|
||||
println( ( text + " " ) + getTime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_allow_movement()
|
||||
{
|
||||
/#
|
||||
return anim_get_dvar_int( "debug_dog_allow_movement", "1" );
|
||||
return anim_get_dvar_int( "debug_dog_allow_movement", "1" );
|
||||
#/
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
debug_allow_combat()
|
||||
{
|
||||
/#
|
||||
return anim_get_dvar_int( "debug_dog_allow_combat", "1" );
|
||||
return anim_get_dvar_int( "debug_dog_allow_combat", "1" );
|
||||
#/
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
current_yaw_line_debug( duration )
|
||||
{
|
||||
/#
|
||||
currentyawcolor = [];
|
||||
currentyawcolor[0] = ( 0, 0, 1 );
|
||||
currentyawcolor[1] = ( 1, 0, 1 );
|
||||
current_color_index = 0;
|
||||
start_time = gettime();
|
||||
|
||||
if ( !isdefined( level.lastdebugheight ) )
|
||||
level.lastdebugheight = 15;
|
||||
|
||||
while ( gettime() - start_time < 1000 )
|
||||
{
|
||||
pos1 = ( self.origin[0], self.origin[1], self.origin[2] + level.lastdebugheight );
|
||||
pos2 = pos1 + vectorscale( anglestoforward( self.angles ), ( current_color_index + 1 ) * 10 );
|
||||
line( pos1, pos2, currentyawcolor[current_color_index], 0.3, 1, duration );
|
||||
current_color_index = ( current_color_index + 1 ) % currentyawcolor.size;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
if ( level.lastdebugheight == 15 )
|
||||
level.lastdebugheight = 30;
|
||||
else
|
||||
level.lastdebugheight = 15;
|
||||
currentyawcolor = [];
|
||||
currentyawcolor[ 0 ] = ( 1, 0, 1 );
|
||||
currentyawcolor[ 1 ] = ( 1, 0, 1 );
|
||||
current_color_index = 0;
|
||||
start_time = getTime();
|
||||
if ( !isDefined( level.lastdebugheight ) )
|
||||
{
|
||||
level.lastdebugheight = 15;
|
||||
}
|
||||
while ( ( getTime() - start_time ) < 1000 )
|
||||
{
|
||||
pos1 = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + level.lastdebugheight );
|
||||
pos2 = pos1 + vectorScale( anglesToForward( self.angles ), ( current_color_index + 1 ) * 10 );
|
||||
line( pos1, pos2, currentyawcolor[ current_color_index ], 0,3, 1, duration );
|
||||
current_color_index = ( current_color_index + 1 ) % currentyawcolor.size;
|
||||
wait 0,05;
|
||||
}
|
||||
if ( level.lastdebugheight == 15 )
|
||||
{
|
||||
level.lastdebugheight = 30;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.lastdebugheight = 15;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
getanimdirection( damageyaw )
|
||||
{
|
||||
if ( damageyaw > 135 || damageyaw <= -135 )
|
||||
return "front";
|
||||
else if ( damageyaw > 45 && damageyaw <= 135 )
|
||||
return "right";
|
||||
else if ( damageyaw > -45 && damageyaw <= 45 )
|
||||
return "back";
|
||||
else
|
||||
return "left";
|
||||
|
||||
return "front";
|
||||
if ( damageyaw > 135 || damageyaw <= -135 )
|
||||
{
|
||||
return "front";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( damageyaw > 45 && damageyaw <= 135 )
|
||||
{
|
||||
return "right";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( damageyaw > -45 && damageyaw <= 45 )
|
||||
{
|
||||
return "back";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "left";
|
||||
}
|
||||
}
|
||||
}
|
||||
return "front";
|
||||
}
|
||||
|
||||
setfootstepeffect( name, fx )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( name ), "Need to define the footstep surface type." );
|
||||
assert( isDefined( name ), "Need to define the footstep surface type." );
|
||||
#/
|
||||
/#
|
||||
assert( isdefined( fx ), "Need to define the mud footstep effect." );
|
||||
assert( isDefined( fx ), "Need to define the mud footstep effect." );
|
||||
#/
|
||||
if ( !isdefined( anim.optionalstepeffects ) )
|
||||
anim.optionalstepeffects = [];
|
||||
|
||||
anim.optionalstepeffects[anim.optionalstepeffects.size] = name;
|
||||
level._effect["step_" + name] = fx;
|
||||
if ( !isDefined( anim.optionalstepeffects ) )
|
||||
{
|
||||
anim.optionalstepeffects = [];
|
||||
}
|
||||
anim.optionalstepeffects[ anim.optionalstepeffects.size ] = name;
|
||||
level._effect[ "step_" + name ] = fx;
|
||||
}
|
||||
|
@ -1,64 +1,71 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\animscripts\zm_melee;
|
||||
#include maps/mp/animscripts/zm_melee;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "melee" );
|
||||
maps\mp\animscripts\zm_utility::initialize( "zombie_combat" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
|
||||
if ( isdefined( self.combat_animmode ) )
|
||||
self [[ self.combat_animmode ]]();
|
||||
|
||||
self orientmode( "face angle", self.angles[1] );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( trymelee() )
|
||||
return;
|
||||
|
||||
exposedwait();
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self endon( "melee" );
|
||||
maps/mp/animscripts/zm_utility::initialize( "zombie_combat" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
if ( isDefined( self.combat_animmode ) )
|
||||
{
|
||||
self [[ self.combat_animmode ]]();
|
||||
}
|
||||
self orientmode( "face angle", self.angles[ 1 ] );
|
||||
for ( ;; )
|
||||
{
|
||||
if ( trymelee() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
exposedwait();
|
||||
}
|
||||
}
|
||||
|
||||
exposedwait()
|
||||
{
|
||||
if ( !isdefined( self.can_always_see ) && ( !isdefined( self.enemy ) || !self cansee( self.enemy ) ) )
|
||||
{
|
||||
self endon( "enemy" );
|
||||
wait( 0.2 + randomfloat( 0.1 ) );
|
||||
}
|
||||
else if ( !isdefined( self.enemy ) )
|
||||
{
|
||||
self endon( "enemy" );
|
||||
wait( 0.2 + randomfloat( 0.1 ) );
|
||||
}
|
||||
else
|
||||
wait 0.05;
|
||||
if ( !isDefined( self.can_always_see ) || !isDefined( self.enemy ) && !self cansee( self.enemy ) )
|
||||
{
|
||||
self endon( "enemy" );
|
||||
wait ( 0,2 + randomfloat( 0,1 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
self endon( "enemy" );
|
||||
wait ( 0,2 + randomfloat( 0,1 ) );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trymelee()
|
||||
{
|
||||
if ( isdefined( self.cant_melee ) && self.cant_melee )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( self.enemy ) )
|
||||
return false;
|
||||
|
||||
if ( distancesquared( self.origin, self.enemy.origin ) > 262144 )
|
||||
return false;
|
||||
|
||||
canmelee = maps\mp\animscripts\zm_melee::canmeleedesperate();
|
||||
|
||||
if ( !canmelee )
|
||||
return false;
|
||||
|
||||
self thread maps\mp\animscripts\zm_melee::meleecombat();
|
||||
return true;
|
||||
if ( isDefined( self.cant_melee ) && self.cant_melee )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distancesquared( self.origin, self.enemy.origin ) > 262144 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
canmelee = maps/mp/animscripts/zm_melee::canmeleedesperate();
|
||||
if ( !canmelee )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self thread maps/mp/animscripts/zm_melee::meleecombat();
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,408 +1,439 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "zm_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( isdefined( self.deathfunction ) )
|
||||
{
|
||||
successful_death = self [[ self.deathfunction ]]();
|
||||
|
||||
if ( !isdefined( successful_death ) || successful_death )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( self.a.nodeath ) && self.a.nodeath == 1 )
|
||||
{
|
||||
debug_anim_print( "zm_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
if ( isDefined( self.deathfunction ) )
|
||||
{
|
||||
successful_death = self [[ self.deathfunction ]]();
|
||||
if ( !isDefined( successful_death ) || successful_death )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.a.nodeath ) && self.a.nodeath == 1 )
|
||||
{
|
||||
/#
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
#/
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
|
||||
self unlink();
|
||||
|
||||
if ( isdefined( self.anchor ) )
|
||||
self.anchor delete();
|
||||
|
||||
if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
|
||||
self thread do_gib();
|
||||
|
||||
if ( isdefined( self.a.gib_ref ) && ( self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg" ) )
|
||||
self.has_legs = 0;
|
||||
|
||||
if ( !isdefined( self.deathanim ) )
|
||||
{
|
||||
self.deathanim = "zm_death";
|
||||
self.deathanim_substate = undefined;
|
||||
}
|
||||
|
||||
self.deathanim = append_missing_legs_suffix( self.deathanim );
|
||||
self animmode( "gravity" );
|
||||
self setanimstatefromasd( self.deathanim, self.deathanim_substate );
|
||||
|
||||
if ( !self getanimhasnotetrackfromasd( "start_ragdoll" ) )
|
||||
self thread waitforragdoll( self getanimlengthfromasd() * 0.35 );
|
||||
|
||||
if ( isdefined( self.skip_death_notetracks ) && self.skip_death_notetracks )
|
||||
self waittillmatch( "death_anim", "end" );
|
||||
else
|
||||
self maps\mp\animscripts\zm_shared::donotetracks( "death_anim", self.handle_death_notetracks );
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
if ( isDefined( self.anchor ) )
|
||||
{
|
||||
self.anchor delete();
|
||||
}
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
self thread do_gib();
|
||||
if ( isDefined( self.a.gib_ref ) && self.a.gib_ref != "no_legs" || self.a.gib_ref == "right_leg" && self.a.gib_ref == "left_leg" )
|
||||
{
|
||||
self.has_legs = 0;
|
||||
}
|
||||
if ( !isDefined( self.deathanim ) )
|
||||
{
|
||||
self.deathanim = "zm_death";
|
||||
self.deathanim_substate = undefined;
|
||||
}
|
||||
self.deathanim = append_missing_legs_suffix( self.deathanim );
|
||||
self animmode( "gravity" );
|
||||
self setanimstatefromasd( self.deathanim, self.deathanim_substate );
|
||||
if ( !self getanimhasnotetrackfromasd( "start_ragdoll" ) )
|
||||
{
|
||||
self thread waitforragdoll( self getanimlengthfromasd() * 0,35 );
|
||||
}
|
||||
if ( isDefined( self.skip_death_notetracks ) && self.skip_death_notetracks )
|
||||
{
|
||||
self waittillmatch( "death_anim" );
|
||||
return "end";
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/animscripts/zm_shared::donotetracks( "death_anim", self.handle_death_notetracks );
|
||||
}
|
||||
}
|
||||
|
||||
waitforragdoll( time )
|
||||
{
|
||||
wait( time );
|
||||
do_ragdoll = 1;
|
||||
|
||||
if ( isdefined( self.nodeathragdoll ) && self.nodeathragdoll )
|
||||
do_ragdoll = 0;
|
||||
|
||||
if ( isdefined( self ) && do_ragdoll )
|
||||
self startragdoll();
|
||||
wait time;
|
||||
do_ragdoll = 1;
|
||||
if ( isDefined( self.nodeathragdoll ) && self.nodeathragdoll )
|
||||
{
|
||||
do_ragdoll = 0;
|
||||
}
|
||||
if ( isDefined( self ) && do_ragdoll )
|
||||
{
|
||||
self startragdoll();
|
||||
}
|
||||
}
|
||||
|
||||
on_fire_timeout()
|
||||
{
|
||||
self endon( "death" );
|
||||
wait 12;
|
||||
|
||||
if ( isdefined( self ) && isalive( self ) )
|
||||
{
|
||||
self.is_on_fire = 0;
|
||||
self notify( "stop_flame_damage" );
|
||||
}
|
||||
self endon( "death" );
|
||||
wait 12;
|
||||
if ( isDefined( self ) && isalive( self ) )
|
||||
{
|
||||
self.is_on_fire = 0;
|
||||
self notify( "stop_flame_damage" );
|
||||
}
|
||||
}
|
||||
|
||||
flame_death_fx()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
if ( isdefined( self.is_on_fire ) && self.is_on_fire )
|
||||
return;
|
||||
|
||||
self.is_on_fire = 1;
|
||||
self thread on_fire_timeout();
|
||||
|
||||
if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_torso"] ) )
|
||||
{
|
||||
if ( !self.isdog )
|
||||
playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.is_on_fire = 1;
|
||||
self thread on_fire_timeout();
|
||||
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_torso" ] ) )
|
||||
{
|
||||
if ( !self.isdog )
|
||||
{
|
||||
playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_torso\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_player_torso\"" );
|
||||
println( "^3ANIMSCRIPT WARNING: You are missing level._effect["character_fire_death_torso"], please set it in your levelname_fx.gsc. Use "env/fire/fx_fire_player_torso"" );
|
||||
#/
|
||||
}
|
||||
|
||||
if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_sm"] ) )
|
||||
{
|
||||
wait 1;
|
||||
tagarray = [];
|
||||
tagarray[0] = "J_Elbow_LE";
|
||||
tagarray[1] = "J_Elbow_RI";
|
||||
tagarray[2] = "J_Knee_RI";
|
||||
tagarray[3] = "J_Knee_LE";
|
||||
tagarray = randomize_array( tagarray );
|
||||
playfxontag( level._effect["character_fire_death_sm"], self, tagarray[0] );
|
||||
wait 1;
|
||||
tagarray[0] = "J_Wrist_RI";
|
||||
tagarray[1] = "J_Wrist_LE";
|
||||
|
||||
if ( !isdefined( self.a ) || !isdefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" )
|
||||
{
|
||||
tagarray[2] = "J_Ankle_RI";
|
||||
tagarray[3] = "J_Ankle_LE";
|
||||
}
|
||||
|
||||
tagarray = randomize_array( tagarray );
|
||||
playfxontag( level._effect["character_fire_death_sm"], self, tagarray[0] );
|
||||
playfxontag( level._effect["character_fire_death_sm"], self, tagarray[1] );
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) )
|
||||
{
|
||||
wait 1;
|
||||
tagarray = [];
|
||||
tagarray[ 0 ] = "J_Elbow_LE";
|
||||
tagarray[ 1 ] = "J_Elbow_RI";
|
||||
tagarray[ 2 ] = "J_Knee_RI";
|
||||
tagarray[ 3 ] = "J_Knee_LE";
|
||||
tagarray = randomize_array( tagarray );
|
||||
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
|
||||
wait 1;
|
||||
tagarray[ 0 ] = "J_Wrist_RI";
|
||||
tagarray[ 1 ] = "J_Wrist_LE";
|
||||
if ( isDefined( self.a ) || !isDefined( self.a.gib_ref ) && self.a.gib_ref != "no_legs" )
|
||||
{
|
||||
tagarray[ 2 ] = "J_Ankle_RI";
|
||||
tagarray[ 3 ] = "J_Ankle_LE";
|
||||
}
|
||||
tagarray = randomize_array( tagarray );
|
||||
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
|
||||
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 1 ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_sm\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_zombie_md\"" );
|
||||
println( "^3ANIMSCRIPT WARNING: You are missing level._effect["character_fire_death_sm"], please set it in your levelname_fx.gsc. Use "env/fire/fx_fire_zombie_md"" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
randomize_array( array )
|
||||
{
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
j = randomint( array.size );
|
||||
temp = array[i];
|
||||
array[i] = array[j];
|
||||
array[j] = temp;
|
||||
}
|
||||
|
||||
return array;
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
j = randomint( array.size );
|
||||
temp = array[ i ];
|
||||
array[ i ] = array[ j ];
|
||||
array[ j ] = temp;
|
||||
i++;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
get_tag_for_damage_location()
|
||||
{
|
||||
tag = "J_SpineLower";
|
||||
|
||||
if ( self.damagelocation == "helmet" )
|
||||
tag = "j_head";
|
||||
else if ( self.damagelocation == "head" )
|
||||
tag = "j_head";
|
||||
else if ( self.damagelocation == "neck" )
|
||||
tag = "j_neck";
|
||||
else if ( self.damagelocation == "torso_upper" )
|
||||
tag = "j_spineupper";
|
||||
else if ( self.damagelocation == "torso_lower" )
|
||||
tag = "j_spinelower";
|
||||
else if ( self.damagelocation == "right_arm_upper" )
|
||||
tag = "j_elbow_ri";
|
||||
else if ( self.damagelocation == "left_arm_upper" )
|
||||
tag = "j_elbow_le";
|
||||
else if ( self.damagelocation == "right_arm_lower" )
|
||||
tag = "j_wrist_ri";
|
||||
else if ( self.damagelocation == "left_arm_lower" )
|
||||
tag = "j_wrist_le";
|
||||
|
||||
return tag;
|
||||
tag = "J_SpineLower";
|
||||
if ( self.damagelocation == "helmet" )
|
||||
{
|
||||
tag = "j_head";
|
||||
}
|
||||
else if ( self.damagelocation == "head" )
|
||||
{
|
||||
tag = "j_head";
|
||||
}
|
||||
else if ( self.damagelocation == "neck" )
|
||||
{
|
||||
tag = "j_neck";
|
||||
}
|
||||
else if ( self.damagelocation == "torso_upper" )
|
||||
{
|
||||
tag = "j_spineupper";
|
||||
}
|
||||
else if ( self.damagelocation == "torso_lower" )
|
||||
{
|
||||
tag = "j_spinelower";
|
||||
}
|
||||
else if ( self.damagelocation == "right_arm_upper" )
|
||||
{
|
||||
tag = "j_elbow_ri";
|
||||
}
|
||||
else if ( self.damagelocation == "left_arm_upper" )
|
||||
{
|
||||
tag = "j_elbow_le";
|
||||
}
|
||||
else if ( self.damagelocation == "right_arm_lower" )
|
||||
{
|
||||
tag = "j_wrist_ri";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.damagelocation == "left_arm_lower" )
|
||||
{
|
||||
tag = "j_wrist_le";
|
||||
}
|
||||
}
|
||||
return tag;
|
||||
}
|
||||
|
||||
set_last_gib_time()
|
||||
{
|
||||
anim notify( "stop_last_gib_time" );
|
||||
anim endon( "stop_last_gib_time" );
|
||||
wait 0.05;
|
||||
anim.lastgibtime = gettime();
|
||||
anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs );
|
||||
anim notify( "stop_last_gib_time" );
|
||||
anim endon( "stop_last_gib_time" );
|
||||
wait 0,05;
|
||||
anim.lastgibtime = getTime();
|
||||
anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs );
|
||||
}
|
||||
|
||||
get_gib_ref( direction )
|
||||
{
|
||||
if ( isdefined( self.a.gib_ref ) )
|
||||
return;
|
||||
if ( isDefined( self.a.gib_ref ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.damagetaken < 165 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( getTime() > ( anim.lastgibtime + anim.gibdelay ) && anim.totalgibs > 0 )
|
||||
{
|
||||
anim.totalgibs--;
|
||||
|
||||
if ( self.damagetaken < 165 )
|
||||
return;
|
||||
|
||||
if ( gettime() > anim.lastgibtime + anim.gibdelay && anim.totalgibs > 0 )
|
||||
{
|
||||
anim.totalgibs--;
|
||||
anim thread set_last_gib_time();
|
||||
refs = [];
|
||||
|
||||
switch ( direction )
|
||||
{
|
||||
case "right":
|
||||
refs[refs.size] = "left_arm";
|
||||
refs[refs.size] = "left_leg";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
case "left":
|
||||
refs[refs.size] = "right_arm";
|
||||
refs[refs.size] = "right_leg";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
case "forward":
|
||||
refs[refs.size] = "right_arm";
|
||||
refs[refs.size] = "left_arm";
|
||||
refs[refs.size] = "right_leg";
|
||||
refs[refs.size] = "left_leg";
|
||||
refs[refs.size] = "guts";
|
||||
refs[refs.size] = "no_legs";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
case "back":
|
||||
refs[refs.size] = "right_arm";
|
||||
refs[refs.size] = "left_arm";
|
||||
refs[refs.size] = "right_leg";
|
||||
refs[refs.size] = "left_leg";
|
||||
refs[refs.size] = "no_legs";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
default:
|
||||
refs[refs.size] = "right_arm";
|
||||
refs[refs.size] = "left_arm";
|
||||
refs[refs.size] = "right_leg";
|
||||
refs[refs.size] = "left_leg";
|
||||
refs[refs.size] = "no_legs";
|
||||
refs[refs.size] = "guts";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
}
|
||||
|
||||
self.a.gib_ref = gib_ref;
|
||||
}
|
||||
else
|
||||
self.a.gib_ref = undefined;
|
||||
anim thread set_last_gib_time();
|
||||
refs = [];
|
||||
switch( direction )
|
||||
{
|
||||
case "right":
|
||||
refs[ refs.size ] = "left_arm";
|
||||
refs[ refs.size ] = "left_leg";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
case "left":
|
||||
refs[ refs.size ] = "right_arm";
|
||||
refs[ refs.size ] = "right_leg";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
case "forward":
|
||||
refs[ refs.size ] = "right_arm";
|
||||
refs[ refs.size ] = "left_arm";
|
||||
refs[ refs.size ] = "right_leg";
|
||||
refs[ refs.size ] = "left_leg";
|
||||
refs[ refs.size ] = "guts";
|
||||
refs[ refs.size ] = "no_legs";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
case "back":
|
||||
refs[ refs.size ] = "right_arm";
|
||||
refs[ refs.size ] = "left_arm";
|
||||
refs[ refs.size ] = "right_leg";
|
||||
refs[ refs.size ] = "left_leg";
|
||||
refs[ refs.size ] = "no_legs";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
default:
|
||||
refs[ refs.size ] = "right_arm";
|
||||
refs[ refs.size ] = "left_arm";
|
||||
refs[ refs.size ] = "right_leg";
|
||||
refs[ refs.size ] = "left_leg";
|
||||
refs[ refs.size ] = "no_legs";
|
||||
refs[ refs.size ] = "guts";
|
||||
gib_ref = get_random( refs );
|
||||
break;
|
||||
}
|
||||
self.a.gib_ref = gib_ref;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.gib_ref = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
get_random( array )
|
||||
{
|
||||
return array[randomint( array.size )];
|
||||
return array[ randomint( array.size ) ];
|
||||
}
|
||||
|
||||
do_gib()
|
||||
{
|
||||
if ( !is_mature() )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.a.gib_ref ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.is_on_fire ) && self.is_on_fire )
|
||||
return;
|
||||
|
||||
if ( self is_zombie_gibbed() )
|
||||
return;
|
||||
|
||||
self set_zombie_gibbed();
|
||||
gib_ref = self.a.gib_ref;
|
||||
limb_data = get_limb_data( gib_ref );
|
||||
|
||||
if ( !isdefined( limb_data ) )
|
||||
{
|
||||
if ( !is_mature() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.a.gib_ref ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self is_zombie_gibbed() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self set_zombie_gibbed();
|
||||
gib_ref = self.a.gib_ref;
|
||||
limb_data = get_limb_data( gib_ref );
|
||||
if ( !isDefined( limb_data ) )
|
||||
{
|
||||
/#
|
||||
println( "^3animscriptszm_death.gsc - limb_data is not setup for gib_ref on model: " + self.model + " and gib_ref of: " + self.a.gib_ref );
|
||||
println( "^3animscriptszm_death.gsc - limb_data is not setup for gib_ref on model: " + self.model + " and gib_ref of: " + self.a.gib_ref );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !( isdefined( self.dont_throw_gib ) && self.dont_throw_gib ) )
|
||||
self thread throw_gib( limb_data["spawn_tags_array"] );
|
||||
|
||||
if ( gib_ref == "head" )
|
||||
{
|
||||
self.hat_gibbed = 1;
|
||||
self.head_gibbed = 1;
|
||||
size = self getattachsize();
|
||||
|
||||
for ( i = 0; i < size; i++ )
|
||||
{
|
||||
model = self getattachmodelname( i );
|
||||
|
||||
if ( issubstr( model, "head" ) )
|
||||
{
|
||||
if ( isdefined( self.hatmodel ) )
|
||||
self detach( self.hatmodel, "" );
|
||||
|
||||
self detach( model, "" );
|
||||
|
||||
if ( isdefined( self.torsodmg5 ) )
|
||||
self attach( self.torsodmg5, "", 1 );
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self setmodel( limb_data["body_model"] );
|
||||
self attach( limb_data["legs_model"] );
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.dont_throw_gib ) && !self.dont_throw_gib )
|
||||
{
|
||||
self thread throw_gib( limb_data[ "spawn_tags_array" ] );
|
||||
}
|
||||
if ( gib_ref == "head" )
|
||||
{
|
||||
self.hat_gibbed = 1;
|
||||
self.head_gibbed = 1;
|
||||
size = self getattachsize();
|
||||
i = 0;
|
||||
while ( i < size )
|
||||
{
|
||||
model = self getattachmodelname( i );
|
||||
if ( issubstr( model, "head" ) )
|
||||
{
|
||||
if ( isDefined( self.hatmodel ) )
|
||||
{
|
||||
self detach( self.hatmodel, "" );
|
||||
}
|
||||
self detach( model, "" );
|
||||
if ( isDefined( self.torsodmg5 ) )
|
||||
{
|
||||
self attach( self.torsodmg5, "", 1 );
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else self setmodel( limb_data[ "body_model" ] );
|
||||
self attach( limb_data[ "legs_model" ] );
|
||||
}
|
||||
|
||||
precache_gib_fx()
|
||||
{
|
||||
anim._effect["animscript_gib_fx"] = loadfx( "weapon/bullet/fx_flesh_gib_fatal_01" );
|
||||
anim._effect["animscript_gibtrail_fx"] = loadfx( "trail/fx_trail_blood_streak" );
|
||||
anim._effect["death_neckgrab_spurt"] = loadfx( "impacts/fx_flesh_hit_neck_fatal" );
|
||||
anim._effect[ "animscript_gib_fx" ] = loadfx( "weapon/bullet/fx_flesh_gib_fatal_01" );
|
||||
anim._effect[ "animscript_gibtrail_fx" ] = loadfx( "trail/fx_trail_blood_streak" );
|
||||
anim._effect[ "death_neckgrab_spurt" ] = loadfx( "impacts/fx_flesh_hit_neck_fatal" );
|
||||
}
|
||||
|
||||
get_limb_data( gib_ref )
|
||||
{
|
||||
temp_array = [];
|
||||
|
||||
if ( "right_arm" == gib_ref && isdefined( self.torsodmg2 ) && isdefined( self.legdmg1 ) && isdefined( self.gibspawn1 ) && isdefined( self.gibspawntag1 ) )
|
||||
{
|
||||
temp_array["right_arm"]["body_model"] = self.torsodmg2;
|
||||
temp_array["right_arm"]["legs_model"] = self.legdmg1;
|
||||
temp_array["right_arm"]["spawn_tags_array"] = [];
|
||||
temp_array["right_arm"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_right_arm;
|
||||
}
|
||||
|
||||
if ( "left_arm" == gib_ref && isdefined( self.torsodmg3 ) && isdefined( self.legdmg1 ) && isdefined( self.gibspawn2 ) && isdefined( self.gibspawntag2 ) )
|
||||
{
|
||||
temp_array["left_arm"]["body_model"] = self.torsodmg3;
|
||||
temp_array["left_arm"]["legs_model"] = self.legdmg1;
|
||||
temp_array["left_arm"]["spawn_tags_array"] = [];
|
||||
temp_array["left_arm"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_left_arm;
|
||||
}
|
||||
|
||||
if ( "right_leg" == gib_ref && isdefined( self.torsodmg1 ) && isdefined( self.legdmg2 ) && isdefined( self.gibspawn3 ) && isdefined( self.gibspawntag3 ) )
|
||||
{
|
||||
temp_array["right_leg"]["body_model"] = self.torsodmg1;
|
||||
temp_array["right_leg"]["legs_model"] = self.legdmg2;
|
||||
temp_array["right_leg"]["spawn_tags_array"] = [];
|
||||
temp_array["right_leg"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_right_leg;
|
||||
}
|
||||
|
||||
if ( "left_leg" == gib_ref && isdefined( self.torsodmg1 ) && isdefined( self.legdmg3 ) && isdefined( self.gibspawn4 ) && isdefined( self.gibspawntag4 ) )
|
||||
{
|
||||
temp_array["left_leg"]["body_model"] = self.torsodmg1;
|
||||
temp_array["left_leg"]["legs_model"] = self.legdmg3;
|
||||
temp_array["left_leg"]["spawn_tags_array"] = [];
|
||||
temp_array["left_leg"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_left_leg;
|
||||
}
|
||||
|
||||
if ( "no_legs" == gib_ref && isdefined( self.torsodmg1 ) && isdefined( self.legdmg4 ) && isdefined( self.gibspawn4 ) && isdefined( self.gibspawn3 ) && isdefined( self.gibspawntag3 ) && isdefined( self.gibspawntag4 ) )
|
||||
{
|
||||
temp_array["no_legs"]["body_model"] = self.torsodmg1;
|
||||
temp_array["no_legs"]["legs_model"] = self.legdmg4;
|
||||
temp_array["no_legs"]["spawn_tags_array"] = [];
|
||||
temp_array["no_legs"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_right_leg;
|
||||
temp_array["no_legs"]["spawn_tags_array"][1] = level._zombie_gib_piece_index_left_leg;
|
||||
}
|
||||
|
||||
if ( "guts" == gib_ref && isdefined( self.torsodmg4 ) && isdefined( self.legdmg1 ) )
|
||||
{
|
||||
temp_array["guts"]["body_model"] = self.torsodmg4;
|
||||
temp_array["guts"]["legs_model"] = self.legdmg1;
|
||||
temp_array["guts"]["spawn_tags_array"] = [];
|
||||
temp_array["guts"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_guts;
|
||||
|
||||
if ( isdefined( self.gibspawn2 ) && isdefined( self.gibspawntag2 ) )
|
||||
temp_array["guts"]["spawn_tags_array"][1] = level._zombie_gib_piece_index_left_arm;
|
||||
}
|
||||
|
||||
if ( "head" == gib_ref && isdefined( self.torsodmg5 ) && isdefined( self.legdmg1 ) )
|
||||
{
|
||||
temp_array["head"]["body_model"] = self.torsodmg5;
|
||||
temp_array["head"]["legs_model"] = self.legdmg1;
|
||||
temp_array["head"]["spawn_tags_array"] = [];
|
||||
temp_array["head"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_head;
|
||||
|
||||
if ( !( isdefined( self.hat_gibbed ) && self.hat_gibbed ) && isdefined( self.gibspawn5 ) && isdefined( self.gibspawntag5 ) )
|
||||
temp_array["head"]["spawn_tags_array"][1] = level._zombie_gib_piece_index_hat;
|
||||
}
|
||||
|
||||
if ( isdefined( temp_array[gib_ref] ) )
|
||||
return temp_array[gib_ref];
|
||||
else
|
||||
return undefined;
|
||||
temp_array = [];
|
||||
if ( gib_ref == "right_arm" && isDefined( self.torsodmg2 ) && isDefined( self.legdmg1 ) && isDefined( self.gibspawn1 ) && isDefined( self.gibspawntag1 ) )
|
||||
{
|
||||
temp_array[ "right_arm" ][ "body_model" ] = self.torsodmg2;
|
||||
temp_array[ "right_arm" ][ "legs_model" ] = self.legdmg1;
|
||||
temp_array[ "right_arm" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "right_arm" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_arm;
|
||||
}
|
||||
if ( gib_ref == "left_arm" && isDefined( self.torsodmg3 ) && isDefined( self.legdmg1 ) && isDefined( self.gibspawn2 ) && isDefined( self.gibspawntag2 ) )
|
||||
{
|
||||
temp_array[ "left_arm" ][ "body_model" ] = self.torsodmg3;
|
||||
temp_array[ "left_arm" ][ "legs_model" ] = self.legdmg1;
|
||||
temp_array[ "left_arm" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "left_arm" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_left_arm;
|
||||
}
|
||||
if ( gib_ref == "right_leg" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg2 ) && isDefined( self.gibspawn3 ) && isDefined( self.gibspawntag3 ) )
|
||||
{
|
||||
temp_array[ "right_leg" ][ "body_model" ] = self.torsodmg1;
|
||||
temp_array[ "right_leg" ][ "legs_model" ] = self.legdmg2;
|
||||
temp_array[ "right_leg" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "right_leg" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_leg;
|
||||
}
|
||||
if ( gib_ref == "left_leg" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg3 ) && isDefined( self.gibspawn4 ) && isDefined( self.gibspawntag4 ) )
|
||||
{
|
||||
temp_array[ "left_leg" ][ "body_model" ] = self.torsodmg1;
|
||||
temp_array[ "left_leg" ][ "legs_model" ] = self.legdmg3;
|
||||
temp_array[ "left_leg" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "left_leg" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_left_leg;
|
||||
}
|
||||
if ( gib_ref == "no_legs" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg4 ) && isDefined( self.gibspawn4 ) && isDefined( self.gibspawn3 ) && isDefined( self.gibspawntag3 ) && isDefined( self.gibspawntag4 ) )
|
||||
{
|
||||
temp_array[ "no_legs" ][ "body_model" ] = self.torsodmg1;
|
||||
temp_array[ "no_legs" ][ "legs_model" ] = self.legdmg4;
|
||||
temp_array[ "no_legs" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "no_legs" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_leg;
|
||||
temp_array[ "no_legs" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_left_leg;
|
||||
}
|
||||
if ( gib_ref == "guts" && isDefined( self.torsodmg4 ) && isDefined( self.legdmg1 ) )
|
||||
{
|
||||
temp_array[ "guts" ][ "body_model" ] = self.torsodmg4;
|
||||
temp_array[ "guts" ][ "legs_model" ] = self.legdmg1;
|
||||
temp_array[ "guts" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "guts" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_guts;
|
||||
if ( isDefined( self.gibspawn2 ) && isDefined( self.gibspawntag2 ) )
|
||||
{
|
||||
temp_array[ "guts" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_left_arm;
|
||||
}
|
||||
}
|
||||
if ( gib_ref == "head" && isDefined( self.torsodmg5 ) && isDefined( self.legdmg1 ) )
|
||||
{
|
||||
temp_array[ "head" ][ "body_model" ] = self.torsodmg5;
|
||||
temp_array[ "head" ][ "legs_model" ] = self.legdmg1;
|
||||
temp_array[ "head" ][ "spawn_tags_array" ] = [];
|
||||
temp_array[ "head" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_head;
|
||||
if ( isDefined( self.hat_gibbed ) && !self.hat_gibbed && isDefined( self.gibspawn5 ) && isDefined( self.gibspawntag5 ) )
|
||||
{
|
||||
temp_array[ "head" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_hat;
|
||||
}
|
||||
}
|
||||
if ( isDefined( temp_array[ gib_ref ] ) )
|
||||
{
|
||||
return temp_array[ gib_ref ];
|
||||
}
|
||||
else
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
throw_gib( limb_tags_array )
|
||||
{
|
||||
if ( isdefined( limb_tags_array ) )
|
||||
{
|
||||
if ( isdefined( level.track_gibs ) )
|
||||
level [[ level.track_gibs ]]( self, limb_tags_array );
|
||||
|
||||
if ( isdefined( self.launch_gib_up ) )
|
||||
self gib( "up", limb_tags_array );
|
||||
else
|
||||
self gib( "normal", limb_tags_array );
|
||||
}
|
||||
if ( isDefined( limb_tags_array ) )
|
||||
{
|
||||
if ( isDefined( level.track_gibs ) )
|
||||
{
|
||||
level [[ level.track_gibs ]]( self, limb_tags_array );
|
||||
}
|
||||
if ( isDefined( self.launch_gib_up ) )
|
||||
{
|
||||
self gib( "up", limb_tags_array );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self gib( "normal", limb_tags_array );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,495 +1,510 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps\mp\animscripts\dog_stop;
|
||||
#include maps/mp/animscripts/dog_stop;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
#/
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isdefined( self.enemy ) );
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isplayer( self.enemy ) )
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
}
|
||||
}
|
||||
|
||||
combatidle()
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics" );
|
||||
idleanim = "zm_combat_attackidle";
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstatefromasd( idleanim );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "attack_combat" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics" );
|
||||
idleanim = "zm_combat_attackidle";
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstatefromasd( idleanim );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "attack_combat" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
}
|
||||
|
||||
shouldwaitincombatidle()
|
||||
{
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
return 1;
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
/#
|
||||
assert( isdefined( self.enemy ) && isalive( self.enemy ) );
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
assert( isalive( self.enemy ) );
|
||||
}
|
||||
#/
|
||||
return isdefined( self.enemy.dogattackallowtime ) && gettime() < self.enemy.dogattackallowtime;
|
||||
if ( isDefined( self.enemy.dogattackallowtime ) )
|
||||
{
|
||||
return getTime() < self.enemy.dogattackallowtime;
|
||||
}
|
||||
}
|
||||
|
||||
setnextdogattackallowtime( time )
|
||||
{
|
||||
self.dogattackallowtime = gettime() + time;
|
||||
self.dogattackallowtime = getTime() + time;
|
||||
}
|
||||
|
||||
meleebiteattackplayer( player )
|
||||
{
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
prepareattackplayer( player );
|
||||
attack_time = 1.2 + randomfloat( 0.4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstatefromasd( "zm_combat_attackidle" );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
prepareattackplayer( player );
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstatefromasd( "zm_combat_attackidle" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
}
|
||||
|
||||
meleebiteattackplayer2( player )
|
||||
{
|
||||
attackrangebuffer = 30;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !isalive( self.enemy ) )
|
||||
break;
|
||||
|
||||
meleerange = self.meleeattackdist + attackrangebuffer;
|
||||
|
||||
if ( isdefined( player.syncedmeleetarget ) && player.syncedmeleetarget != self )
|
||||
{
|
||||
if ( checkendcombat( meleerange ) )
|
||||
break;
|
||||
else
|
||||
{
|
||||
combatidle();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( self shouldwaitincombatidle() )
|
||||
{
|
||||
combatidle();
|
||||
continue;
|
||||
}
|
||||
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity" );
|
||||
self.safetochangescript = 0;
|
||||
attackrangebuffer = 30;
|
||||
for ( ;; )
|
||||
{
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else meleerange = self.meleeattackdist + attackrangebuffer;
|
||||
if ( isDefined( player.syncedmeleetarget ) && player.syncedmeleetarget != self )
|
||||
{
|
||||
if ( checkendcombat( meleerange ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else combatidle();
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self shouldwaitincombatidle() )
|
||||
{
|
||||
combatidle();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity" );
|
||||
self.safetochangescript = 0;
|
||||
/#
|
||||
if ( getdvarint( _hash_7B06BF0D ) )
|
||||
iprintln( "dog " + self getentnum() + " attack player " + gettime() );
|
||||
if ( getDvarInt( "debug_dog_sound" ) )
|
||||
{
|
||||
iprintln( "dog " + self getentnum() + " attack player " + getTime() );
|
||||
#/
|
||||
player setnextdogattackallowtime( 200 );
|
||||
|
||||
if ( dog_cant_kill_in_one_hit( player ) )
|
||||
{
|
||||
level.lastdogmeleeplayertime = gettime();
|
||||
level.dogmeleeplayercounter++;
|
||||
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas" );
|
||||
self setanimstatefromasd( "zm_combat_attack_player_close_range" );
|
||||
domeleeafterwait( 0.1 );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 1.4, "attack_combat" );
|
||||
self animmode( "gravity" );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1.2 + randomfloat( 0.4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstatefromasd( "zm_combat_attackidle" );
|
||||
domeleeafterwait( 0.1 );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread dog_melee_death( player );
|
||||
player.attacked_by_dog = 1;
|
||||
self thread clear_player_attacked_by_dog_on_death( player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_attack_player" );
|
||||
self setanimstate( "combat_attack_player" );
|
||||
self maps\mp\animscripts\shared::donotetracks( "done", ::handlemeleefinishattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_player notify done." );
|
||||
self notify( "dog_no_longer_melee_able" );
|
||||
self setcandamage( 1 );
|
||||
self unlink();
|
||||
}
|
||||
|
||||
self.safetochangescript = 1;
|
||||
|
||||
if ( checkendcombat( meleerange ) )
|
||||
break;
|
||||
}
|
||||
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none" );
|
||||
}
|
||||
player setnextdogattackallowtime( 200 );
|
||||
if ( dog_cant_kill_in_one_hit( player ) )
|
||||
{
|
||||
level.lastdogmeleeplayertime = getTime();
|
||||
level.dogmeleeplayercounter++;
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas" );
|
||||
self setanimstatefromasd( "zm_combat_attack_player_close_range" );
|
||||
domeleeafterwait( 0,1 );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 1,4, "attack_combat" );
|
||||
self animmode( "gravity" );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstatefromasd( "zm_combat_attackidle" );
|
||||
domeleeafterwait( 0,1 );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread dog_melee_death( player );
|
||||
player.attacked_by_dog = 1;
|
||||
self thread clear_player_attacked_by_dog_on_death( player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_attack_player" );
|
||||
self setanimstate( "combat_attack_player" );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done", ::handlemeleefinishattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_player notify done." );
|
||||
self notify( "dog_no_longer_melee_able" );
|
||||
self setcandamage( 1 );
|
||||
self unlink();
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
if ( checkendcombat( meleerange ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none" );
|
||||
}
|
||||
|
||||
domeleeafterwait( time )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait( time );
|
||||
hitent = self melee();
|
||||
|
||||
if ( isdefined( hitent ) )
|
||||
{
|
||||
if ( isplayer( hitent ) )
|
||||
hitent shellshock( "dog_bite", 1 );
|
||||
}
|
||||
self endon( "death" );
|
||||
wait time;
|
||||
hitent = self melee();
|
||||
if ( isDefined( hitent ) )
|
||||
{
|
||||
if ( isplayer( hitent ) )
|
||||
{
|
||||
hitent shellshock( "dog_bite", 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks2( note, player )
|
||||
{
|
||||
if ( note == "dog_melee" )
|
||||
self melee( anglestoforward( self.angles ) );
|
||||
if ( note == "dog_melee" )
|
||||
{
|
||||
self melee( anglesToForward( self.angles ) );
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks( note, player )
|
||||
{
|
||||
switch ( note )
|
||||
{
|
||||
case "dog_melee":
|
||||
if ( !isdefined( level.dogmeleebiteattacktime ) )
|
||||
{
|
||||
level.dogmeleebiteattacktime = gettime() - level.dogmeleebiteattacktimestart;
|
||||
level.dogmeleebiteattacktime += 50;
|
||||
}
|
||||
|
||||
hitent = self melee( anglestoforward( self.angles ) );
|
||||
|
||||
if ( isdefined( hitent ) )
|
||||
{
|
||||
if ( isplayer( hitent ) )
|
||||
hitent shellshock( "dog_bite", 1 );
|
||||
}
|
||||
else if ( isdefined( level.dog_melee_miss ) )
|
||||
self [[ level.dog_melee_miss ]]( player );
|
||||
|
||||
break;
|
||||
case "stop_tracking":
|
||||
melee_time = 200;
|
||||
|
||||
if ( !isdefined( level.dogmeleebiteattacktime ) )
|
||||
level.dogmeleebiteattacktimestart = gettime();
|
||||
else
|
||||
melee_time = level.dogmeleebiteattacktime;
|
||||
|
||||
self thread orienttoplayerdeadreckoning( player, melee_time );
|
||||
break;
|
||||
}
|
||||
switch( note )
|
||||
{
|
||||
case "dog_melee":
|
||||
if ( !isDefined( level.dogmeleebiteattacktime ) )
|
||||
{
|
||||
level.dogmeleebiteattacktime = getTime() - level.dogmeleebiteattacktimestart;
|
||||
level.dogmeleebiteattacktime += 50;
|
||||
}
|
||||
hitent = self melee( anglesToForward( self.angles ) );
|
||||
if ( isDefined( hitent ) )
|
||||
{
|
||||
if ( isplayer( hitent ) )
|
||||
{
|
||||
hitent shellshock( "dog_bite", 1 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.dog_melee_miss ) )
|
||||
{
|
||||
self [[ level.dog_melee_miss ]]( player );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "stop_tracking":
|
||||
melee_time = 200;
|
||||
if ( !isDefined( level.dogmeleebiteattacktime ) )
|
||||
{
|
||||
level.dogmeleebiteattacktimestart = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
melee_time = level.dogmeleebiteattacktime;
|
||||
}
|
||||
self thread orienttoplayerdeadreckoning( player, melee_time );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleefinishattacknotetracks( note, player )
|
||||
{
|
||||
switch ( note )
|
||||
{
|
||||
case "dog_melee":
|
||||
if ( !isdefined( level.dogmeleefinishattacktime ) )
|
||||
{
|
||||
level.dogmeleefinishattacktime = gettime() - level.dogmeleefinishattacktimestart;
|
||||
level.dogmeleefinishattacktime += 50;
|
||||
}
|
||||
|
||||
hitent = self melee( anglestoforward( self.angles ) );
|
||||
|
||||
if ( isdefined( hitent ) && isalive( player ) )
|
||||
{
|
||||
if ( hitent == player )
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
attackmiss();
|
||||
return 1;
|
||||
}
|
||||
|
||||
break;
|
||||
case "dog_early":
|
||||
self notify( "dog_early_notetrack" );
|
||||
debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_early" );
|
||||
self setanimstate( "combat_attack_player_early" );
|
||||
break;
|
||||
case "dog_lunge":
|
||||
thread set_melee_timer( player );
|
||||
debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_lunge" );
|
||||
self setanimstate( "combat_attack_player_lunge" );
|
||||
break;
|
||||
case "dogbite_damage":
|
||||
self thread killplayer( player );
|
||||
break;
|
||||
case "stop_tracking":
|
||||
melee_time = 200;
|
||||
|
||||
if ( !isdefined( level.dogmeleefinishattacktime ) )
|
||||
level.dogmeleefinishattacktimestart = gettime();
|
||||
else
|
||||
melee_time = level.dogmeleefinishattacktime;
|
||||
|
||||
self thread orienttoplayerdeadreckoning( player, melee_time );
|
||||
break;
|
||||
}
|
||||
switch( note )
|
||||
{
|
||||
case "dog_melee":
|
||||
if ( !isDefined( level.dogmeleefinishattacktime ) )
|
||||
{
|
||||
level.dogmeleefinishattacktime = getTime() - level.dogmeleefinishattacktimestart;
|
||||
level.dogmeleefinishattacktime += 50;
|
||||
}
|
||||
hitent = self melee( anglesToForward( self.angles ) );
|
||||
if ( isDefined( hitent ) && isalive( player ) )
|
||||
{
|
||||
if ( hitent == player )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else }
|
||||
else attackmiss();
|
||||
return 1;
|
||||
case "dog_early":
|
||||
self notify( "dog_early_notetrack" );
|
||||
debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_early" );
|
||||
self setanimstate( "combat_attack_player_early" );
|
||||
break;
|
||||
case "dog_lunge":
|
||||
thread set_melee_timer( player );
|
||||
debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_lunge" );
|
||||
self setanimstate( "combat_attack_player_lunge" );
|
||||
break;
|
||||
case "dogbite_damage":
|
||||
self thread killplayer( player );
|
||||
break;
|
||||
case "stop_tracking":
|
||||
melee_time = 200;
|
||||
if ( !isDefined( level.dogmeleefinishattacktime ) )
|
||||
{
|
||||
level.dogmeleefinishattacktimestart = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
melee_time = level.dogmeleefinishattacktime;
|
||||
}
|
||||
self thread orienttoplayerdeadreckoning( player, melee_time );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
orienttoplayerdeadreckoning( player, time_till_bite )
|
||||
{
|
||||
enemy_attack_current_origin = player.origin;
|
||||
enemy_attack_current_time = gettime();
|
||||
enemy_motion_time_delta = enemy_attack_current_time - self.enemy_attack_start_time;
|
||||
enemy_motion_direction = enemy_attack_current_origin - self.enemy_attack_start_origin;
|
||||
|
||||
if ( enemy_motion_time_delta == 0 )
|
||||
enemy_predicted_position = player.origin;
|
||||
else
|
||||
{
|
||||
enemy_velocity = enemy_motion_direction / enemy_motion_time_delta;
|
||||
enemy_predicted_position = player.origin + enemy_velocity * time_till_bite;
|
||||
}
|
||||
|
||||
self set_orient_mode( "face point", enemy_predicted_position );
|
||||
enemy_attack_current_origin = player.origin;
|
||||
enemy_attack_current_time = getTime();
|
||||
enemy_motion_time_delta = enemy_attack_current_time - self.enemy_attack_start_time;
|
||||
enemy_motion_direction = enemy_attack_current_origin - self.enemy_attack_start_origin;
|
||||
if ( enemy_motion_time_delta == 0 )
|
||||
{
|
||||
enemy_predicted_position = player.origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
enemy_velocity = enemy_motion_direction / enemy_motion_time_delta;
|
||||
enemy_predicted_position = player.origin + ( enemy_velocity * time_till_bite );
|
||||
}
|
||||
self set_orient_mode( "face point", enemy_predicted_position );
|
||||
}
|
||||
|
||||
checkendcombat( meleerange )
|
||||
{
|
||||
if ( !isdefined( self.enemy ) )
|
||||
return 0;
|
||||
|
||||
disttotargetsq = distancesquared( self.origin, self.enemy.origin );
|
||||
return disttotargetsq > meleerange * meleerange;
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
disttotargetsq = distancesquared( self.origin, self.enemy.origin );
|
||||
return disttotargetsq > ( meleerange * meleerange );
|
||||
}
|
||||
|
||||
use_low_attack( player )
|
||||
{
|
||||
height_diff = self.enemy_attack_start_origin[2] - self.origin[2];
|
||||
low_enough = 30.0;
|
||||
|
||||
if ( height_diff < low_enough && self.enemy_attack_start_stance == "prone" )
|
||||
return true;
|
||||
|
||||
melee_origin = ( self.origin[0], self.origin[1], self.origin[2] + 65 );
|
||||
enemy_origin = ( self.enemy.origin[0], self.enemy.origin[1], self.enemy.origin[2] + 32 );
|
||||
|
||||
if ( !bullettracepassed( melee_origin, enemy_origin, 0, self ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
height_diff = self.enemy_attack_start_origin[ 2 ] - self.origin[ 2 ];
|
||||
low_enough = 30;
|
||||
if ( height_diff < low_enough && self.enemy_attack_start_stance == "prone" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
melee_origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 65 );
|
||||
enemy_origin = ( self.enemy.origin[ 0 ], self.enemy.origin[ 1 ], self.enemy.origin[ 2 ] + 32 );
|
||||
if ( !bullettracepassed( melee_origin, enemy_origin, 0, self ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
prepareattackplayer( player )
|
||||
{
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING";
|
||||
distancetotarget = distance( self.origin, self.enemy.origin );
|
||||
targetheight = abs( self.enemy.origin[2] - self.origin[2] );
|
||||
self.enemy_attack_start_distance = distancetotarget;
|
||||
self.enemy_attack_start_origin = player.origin;
|
||||
self.enemy_attack_start_time = gettime();
|
||||
self.enemy_attack_start_stance = player getstance();
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING";
|
||||
distancetotarget = distance( self.origin, self.enemy.origin );
|
||||
targetheight = abs( self.enemy.origin[ 2 ] - self.origin[ 2 ] );
|
||||
self.enemy_attack_start_distance = distancetotarget;
|
||||
self.enemy_attack_start_origin = player.origin;
|
||||
self.enemy_attack_start_time = getTime();
|
||||
self.enemy_attack_start_stance = player getstance();
|
||||
}
|
||||
|
||||
attackteleportthread( offset )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
reps = 5;
|
||||
increment = ( offset[0] / reps, offset[1] / reps, offset[2] / reps );
|
||||
|
||||
for ( i = 0; i < reps; i++ )
|
||||
{
|
||||
self teleport( self.origin + increment );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
reps = 5;
|
||||
increment = ( offset[ 0 ] / reps, offset[ 1 ] / reps, offset[ 2 ] / reps );
|
||||
i = 0;
|
||||
while ( i < reps )
|
||||
{
|
||||
self teleport( self.origin + increment );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
player_attacked()
|
||||
{
|
||||
return isalive( self ) && self meleebuttonpressed();
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
return self meleebuttonpressed();
|
||||
}
|
||||
}
|
||||
|
||||
set_melee_timer( player )
|
||||
{
|
||||
wait 0.15;
|
||||
self.melee_able_timer = gettime();
|
||||
wait 0,15;
|
||||
self.melee_able_timer = getTime();
|
||||
}
|
||||
|
||||
clear_player_attacked_by_dog_on_death( player )
|
||||
{
|
||||
self waittill( "death" );
|
||||
|
||||
player.attacked_by_dog = undefined;
|
||||
self waittill( "death" );
|
||||
player.attacked_by_dog = undefined;
|
||||
}
|
||||
|
||||
dog_cant_kill_in_one_hit( player )
|
||||
{
|
||||
return 1;
|
||||
|
||||
if ( isdefined( player.dogs_dont_instant_kill ) )
|
||||
{
|
||||
return 1;
|
||||
if ( isDefined( player.dogs_dont_instant_kill ) )
|
||||
{
|
||||
/#
|
||||
assert( player.dogs_dont_instant_kill, "Dont set player.dogs_dont_instant_kill to false, set to undefined" );
|
||||
assert( player.dogs_dont_instant_kill, "Dont set player.dogs_dont_instant_kill to false, set to undefined" );
|
||||
#/
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( gettime() - level.lastdogmeleeplayertime > 8000 )
|
||||
level.dogmeleeplayercounter = 0;
|
||||
|
||||
return level.dogmeleeplayercounter < level.dog_hits_before_kill && player.health > 25;
|
||||
return 1;
|
||||
}
|
||||
if ( ( getTime() - level.lastdogmeleeplayertime ) > 8000 )
|
||||
{
|
||||
level.dogmeleeplayercounter = 0;
|
||||
}
|
||||
if ( level.dogmeleeplayercounter < level.dog_hits_before_kill )
|
||||
{
|
||||
return player.health > 25;
|
||||
}
|
||||
}
|
||||
|
||||
dog_melee_death( player )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dog_no_longer_melee_able" );
|
||||
pressed = 0;
|
||||
press_time = anim.dog_presstime;
|
||||
|
||||
self waittill( "dog_early_notetrack" );
|
||||
|
||||
while ( player player_attacked() )
|
||||
wait 0.05;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( !pressed )
|
||||
{
|
||||
if ( player player_attacked() )
|
||||
{
|
||||
pressed = 1;
|
||||
|
||||
if ( isdefined( self.melee_able_timer ) && isalive( player ) )
|
||||
{
|
||||
if ( gettime() - self.melee_able_timer <= press_time )
|
||||
{
|
||||
player.player_view.custom_dog_save = "neck_snap";
|
||||
self notify( "melee_stop" );
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" );
|
||||
self setanimstate( "combat_player_neck_snap" );
|
||||
|
||||
self waittillmatch( "done", "dog_death" );
|
||||
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - combat_player_neck_snap notify done." );
|
||||
self playsound( "aml_dog_neckbreak" );
|
||||
self setcandamage( 1 );
|
||||
self.a.nodeath = 1;
|
||||
dif = player.origin - self.origin;
|
||||
dif = ( dif[0], dif[1], 0 );
|
||||
self dodamage( self.health + 503, self geteye() - dif, player );
|
||||
self notify( "killanimscript" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" );
|
||||
self setanimstate( "combat_attack_player" );
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE";
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON";
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_miss" );
|
||||
self setanimstate( "combat_player_neck_miss" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( !player player_attacked() )
|
||||
pressed = 0;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dog_no_longer_melee_able" );
|
||||
pressed = 0;
|
||||
press_time = anim.dog_presstime;
|
||||
self waittill( "dog_early_notetrack" );
|
||||
while ( player player_attacked() )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
if ( !pressed )
|
||||
{
|
||||
if ( player player_attacked() )
|
||||
{
|
||||
pressed = 1;
|
||||
if ( isDefined( self.melee_able_timer ) && isalive( player ) )
|
||||
{
|
||||
if ( ( getTime() - self.melee_able_timer ) <= press_time )
|
||||
{
|
||||
player.player_view.custom_dog_save = "neck_snap";
|
||||
self notify( "melee_stop" );
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" );
|
||||
self setanimstate( "combat_player_neck_snap" );
|
||||
self waittillmatch( "done" );
|
||||
return "dog_death";
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - combat_player_neck_snap notify done." );
|
||||
self playsound( "aml_dog_neckbreak" );
|
||||
self setcandamage( 1 );
|
||||
self.a.nodeath = 1;
|
||||
dif = player.origin - self.origin;
|
||||
dif = ( dif[ 0 ], dif[ 1 ], 0 );
|
||||
self dodamage( self.health + 503, self geteye() - dif, player );
|
||||
self notify( "killanimscript" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" );
|
||||
self setanimstate( "combat_attack_player" );
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE";
|
||||
}
|
||||
return;
|
||||
}
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON";
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_miss" );
|
||||
self setanimstate( "combat_player_neck_miss" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !player player_attacked() )
|
||||
{
|
||||
pressed = 0;
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
attackmiss()
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
{
|
||||
forward = anglestoforward( self.angles );
|
||||
dirtoenemy = self.enemy.origin - self.origin + vectorscale( forward, 50 );
|
||||
|
||||
if ( vectordot( dirtoenemy, forward ) > 0 )
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" );
|
||||
self setanimstate( "combat_attack_miss" );
|
||||
self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.skipstartmove = 1;
|
||||
self thread attackmisstracktargetthread();
|
||||
|
||||
if ( dirtoenemy[0] * forward[1] - dirtoenemy[1] * forward[0] > 0 )
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_right" );
|
||||
self setanimstate( "combat_attack_miss_right" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_left" );
|
||||
self setanimstate( "combat_attack_miss_left" );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" );
|
||||
self setanimstate( "combat_attack_miss" );
|
||||
}
|
||||
|
||||
self maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::attackMiss() - attackMiss notify done." );
|
||||
self notify( "stop tracking" );
|
||||
debug_anim_print( "dog_combat::attackMiss() - Stopped tracking" );
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
forward = anglesToForward( self.angles );
|
||||
dirtoenemy = self.enemy.origin - ( self.origin + vectorScale( forward, 50 ) );
|
||||
if ( vectordot( dirtoenemy, forward ) > 0 )
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" );
|
||||
self setanimstate( "combat_attack_miss" );
|
||||
self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" );
|
||||
}
|
||||
else self.skipstartmove = 1;
|
||||
self thread attackmisstracktargetthread();
|
||||
if ( ( ( dirtoenemy[ 0 ] * forward[ 1 ] ) - ( dirtoenemy[ 1 ] * forward[ 0 ] ) ) > 0 )
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_right" );
|
||||
self setanimstate( "combat_attack_miss_right" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_left" );
|
||||
self setanimstate( "combat_attack_miss_left" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" );
|
||||
self setanimstate( "combat_attack_miss" );
|
||||
}
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::attackMiss() - attackMiss notify done." );
|
||||
self notify( "stop tracking" );
|
||||
debug_anim_print( "dog_combat::attackMiss() - Stopped tracking" );
|
||||
}
|
||||
|
||||
attackmisstracktargetthread()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
wait 0.6;
|
||||
self set_orient_mode( "face enemy" );
|
||||
self endon( "killanimscript" );
|
||||
wait 0,6;
|
||||
self set_orient_mode( "face enemy" );
|
||||
}
|
||||
|
||||
killplayer( player )
|
||||
{
|
||||
self endon( "pvd_melee_interrupted" );
|
||||
player.specialdeath = 1;
|
||||
player setcandamage( 1 );
|
||||
wait 1;
|
||||
damage = player.health + 1;
|
||||
|
||||
if ( !isalive( player ) )
|
||||
return;
|
||||
self endon( "pvd_melee_interrupted" );
|
||||
player.specialdeath = 1;
|
||||
player setcandamage( 1 );
|
||||
wait 1;
|
||||
damage = player.health + 1;
|
||||
if ( !isalive( player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1,34 +1,30 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( isdefined( self.a.nodeath ) )
|
||||
{
|
||||
debug_anim_print( "dog_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
if ( isDefined( self.a.nodeath ) )
|
||||
{
|
||||
/#
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
#/
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
|
||||
self unlink();
|
||||
|
||||
if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
|
||||
death_anim = "death_" + getanimdirection( self.damageyaw );
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
death_anim = "death_" + getanimdirection( self.damageyaw );
|
||||
/#
|
||||
println( death_anim );
|
||||
println( death_anim );
|
||||
#/
|
||||
self animmode( "gravity" );
|
||||
debug_anim_print( "dog_death::main() - Setting " + death_anim );
|
||||
self setanimstatefromasd( death_anim );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "dead_dog" );
|
||||
self animmode( "gravity" );
|
||||
debug_anim_print( "dog_death::main() - Setting " + death_anim );
|
||||
self setanimstatefromasd( death_anim );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "dead_dog" );
|
||||
}
|
||||
|
@ -1,8 +1,6 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
}
|
||||
|
@ -1,59 +1,61 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\dog_move;
|
||||
#include maps/mp/animscripts/dog_move;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps\mp\animscripts\dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogattackplayerdist = 102;
|
||||
level.dogattackplayercloserangedist = 102;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "walk";
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416.82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "zombiedog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
|
||||
if ( !isdefined( level.dog_hits_before_kill ) )
|
||||
level.dog_hits_before_kill = 1;
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps/mp/animscripts/dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogattackplayerdist = 102;
|
||||
level.dogattackplayercloserangedist = 102;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "walk";
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416,82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "zombiedog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
if ( !isDefined( level.dog_hits_before_kill ) )
|
||||
{
|
||||
level.dog_hits_before_kill = 1;
|
||||
}
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
self.meleeattackdist = 64;
|
||||
else
|
||||
self.meleeattackdist = 102;
|
||||
}
|
||||
|
||||
wait 1;
|
||||
}
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.meleeattackdist = 102;
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,14 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_jump::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
self setanimstatefromasd( "zm_traverse_wallhop" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "traverse_wallhop" );
|
||||
self.safetochangescript = 1;
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_jump::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
self setanimstatefromasd( "zm_traverse_wallhop" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "traverse_wallhop" );
|
||||
self.safetochangescript = 1;
|
||||
}
|
||||
|
@ -1,249 +1,259 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps\mp\animscripts\dog_stop;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/dog_stop;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
setup_sound_variables()
|
||||
{
|
||||
level.dog_sounds["far"] = spawnstruct();
|
||||
level.dog_sounds["close"] = spawnstruct();
|
||||
level.dog_sounds["close"].minrange = 0;
|
||||
level.dog_sounds["close"].maxrange = 500;
|
||||
level.dog_sounds["close"].sound = "aml_dog_bark_close";
|
||||
level.dog_sounds["close"].soundlengthplaceholder = 0.2;
|
||||
level.dog_sounds["close"].aftersoundwaitmin = 0.1;
|
||||
level.dog_sounds["close"].aftersoundwaitmax = 0.3;
|
||||
level.dog_sounds["close"].minrangesqr = level.dog_sounds["close"].minrange * level.dog_sounds["close"].minrange;
|
||||
level.dog_sounds["close"].maxrangesqr = level.dog_sounds["close"].maxrange * level.dog_sounds["close"].maxrange;
|
||||
level.dog_sounds["far"].minrange = 500;
|
||||
level.dog_sounds["far"].maxrange = 0;
|
||||
level.dog_sounds["far"].sound = "aml_dog_bark";
|
||||
level.dog_sounds["far"].soundlengthplaceholder = 0.2;
|
||||
level.dog_sounds["far"].aftersoundwaitmin = 0.1;
|
||||
level.dog_sounds["far"].aftersoundwaitmax = 0.3;
|
||||
level.dog_sounds["far"].minrangesqr = level.dog_sounds["far"].minrange * level.dog_sounds["far"].minrange;
|
||||
level.dog_sounds["far"].maxrangesqr = level.dog_sounds["far"].maxrange * level.dog_sounds["far"].maxrange;
|
||||
level.dog_sounds[ "far" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ].minrange = 0;
|
||||
level.dog_sounds[ "close" ].maxrange = 500;
|
||||
level.dog_sounds[ "close" ].sound = "aml_dog_bark_close";
|
||||
level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange;
|
||||
level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange;
|
||||
level.dog_sounds[ "far" ].minrange = 500;
|
||||
level.dog_sounds[ "far" ].maxrange = 0;
|
||||
level.dog_sounds[ "far" ].sound = "aml_dog_bark";
|
||||
level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange;
|
||||
level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
do_movement = 0;
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
do_movement = 0;
|
||||
|
||||
if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && self.a.movement == "run" && do_movement )
|
||||
{
|
||||
self startmove();
|
||||
blendtime = 0;
|
||||
}
|
||||
else
|
||||
blendtime = 0.2;
|
||||
|
||||
self.traversecomplete = undefined;
|
||||
self.skipstartmove = undefined;
|
||||
|
||||
if ( do_movement )
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 0.1, "move_run" );
|
||||
debug_anim_print( "dog_move::main() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "move_walk" );
|
||||
}
|
||||
}
|
||||
|
||||
self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self moveloop();
|
||||
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
if ( self.disablearrivals == 0 )
|
||||
self thread stopmove();
|
||||
|
||||
self waittill( "run" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement )
|
||||
{
|
||||
self startmove();
|
||||
blendtime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
blendtime = 0,2;
|
||||
}
|
||||
self.traversecomplete = undefined;
|
||||
self.skipstartmove = undefined;
|
||||
if ( do_movement )
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_run" );
|
||||
debug_anim_print( "dog_move::main() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_walk" );
|
||||
}
|
||||
}
|
||||
self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" );
|
||||
while ( 1 )
|
||||
{
|
||||
self moveloop();
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
if ( self.disablearrivals == 0 )
|
||||
{
|
||||
self thread stopmove();
|
||||
}
|
||||
self waittill( "run" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
moveloop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
do_movement = 1;
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
while ( 1 )
|
||||
{
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
do_movement = 0;
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
do_movement = 0;
|
||||
|
||||
if ( !do_movement )
|
||||
{
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromasd( "zm_stop_idle" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "stop_idle" );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( self.disablearrivals )
|
||||
self.stopanimdistsq = 0;
|
||||
else
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 0.2, "move_run" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
while ( !do_movement )
|
||||
{
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromasd( "zm_stop_idle" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "stop_idle" );
|
||||
}
|
||||
if ( self.disablearrivals )
|
||||
{
|
||||
self.stopanimdistsq = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
}
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,2, "move_run" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
assert( self.a.movement == "walk" );
|
||||
assert( self.a.movement == "walk" );
|
||||
#/
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_walk " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 0.1, "move_walk" );
|
||||
|
||||
if ( self need_to_run() )
|
||||
{
|
||||
self.a.movement = "run";
|
||||
self notify( "dog_running" );
|
||||
}
|
||||
|
||||
debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_walk " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_walk" );
|
||||
if ( self need_to_run() )
|
||||
{
|
||||
self.a.movement = "run";
|
||||
self notify( "dog_running" );
|
||||
}
|
||||
debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startmovetracklookahead()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
for ( i = 0; i < 2; i++ )
|
||||
{
|
||||
lookaheadangle = vectortoangles( self.lookaheaddir );
|
||||
self set_orient_mode( "face angle", lookaheadangle );
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
i = 0;
|
||||
while ( i < 2 )
|
||||
{
|
||||
lookaheadangle = vectorToAngle( self.lookaheaddir );
|
||||
self set_orient_mode( "face angle", lookaheadangle );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
debug_anim_print( "dog_move::startMove() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_start" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "move_start" );
|
||||
debug_anim_print( "dog_move::startMove() - move_start notify done." );
|
||||
self animmode( "none" );
|
||||
self set_orient_mode( "face motion" );
|
||||
debug_anim_print( "dog_move::startMove() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_start" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_start" );
|
||||
debug_anim_print( "dog_move::startMove() - move_start notify done." );
|
||||
self animmode( "none" );
|
||||
self set_orient_mode( "face motion" );
|
||||
}
|
||||
|
||||
stopmove()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "run" );
|
||||
debug_anim_print( "dog_move::stopMove() - Setting move_stop" );
|
||||
self setanimstatefromasd( "zm_move_stop" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "move_stop" );
|
||||
debug_anim_print( "dog_move::stopMove() - move_stop notify done." );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "run" );
|
||||
debug_anim_print( "dog_move::stopMove() - Setting move_stop" );
|
||||
self setanimstatefromasd( "zm_move_stop" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_stop" );
|
||||
debug_anim_print( "dog_move::stopMove() - move_stop notify done." );
|
||||
}
|
||||
|
||||
getenemydistancesqr()
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
return distancesquared( self.origin, self.enemy.origin );
|
||||
|
||||
return 100000000;
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin );
|
||||
}
|
||||
return 100000000;
|
||||
}
|
||||
|
||||
getsoundkey( distancesqr )
|
||||
{
|
||||
keys = getarraykeys( level.dog_sounds );
|
||||
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
sound_set = level.dog_sounds[keys[i]];
|
||||
|
||||
if ( sound_set.minrangesqr > distancesqr )
|
||||
continue;
|
||||
|
||||
if ( sound_set.maxrangesqr && sound_set.maxrangesqr < distancesqr )
|
||||
continue;
|
||||
|
||||
return keys[i];
|
||||
}
|
||||
|
||||
return keys[keys.size - 1];
|
||||
keys = getarraykeys( level.dog_sounds );
|
||||
i = 0;
|
||||
while ( i < keys.size )
|
||||
{
|
||||
sound_set = level.dog_sounds[ keys[ i ] ];
|
||||
if ( sound_set.minrangesqr > distancesqr )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( sound_set.maxrangesqr && sound_set.maxrangesqr < distancesqr )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return keys[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return keys[ keys.size - 1 ];
|
||||
}
|
||||
|
||||
need_to_run()
|
||||
{
|
||||
run_dist_squared = 147456;
|
||||
|
||||
if ( getdvar( _hash_C7E63BA4 ) != "" )
|
||||
{
|
||||
dist = getdvarint( _hash_C7E63BA4 );
|
||||
run_dist_squared = dist * dist;
|
||||
}
|
||||
|
||||
run_yaw = 20;
|
||||
run_pitch = 30;
|
||||
run_height = 64;
|
||||
|
||||
if ( self.a.movement != "walk" )
|
||||
return false;
|
||||
|
||||
if ( self.health < self.maxhealth )
|
||||
return true;
|
||||
|
||||
if ( !isdefined( self.enemy ) || !isalive( self.enemy ) )
|
||||
return false;
|
||||
|
||||
if ( !self cansee( self.enemy ) )
|
||||
return false;
|
||||
|
||||
dist = distancesquared( self.origin, self.enemy.origin );
|
||||
|
||||
if ( dist > run_dist_squared )
|
||||
return false;
|
||||
|
||||
height = self.origin[2] - self.enemy.origin[2];
|
||||
|
||||
if ( abs( height ) > run_height )
|
||||
return false;
|
||||
|
||||
yaw = self maps\mp\animscripts\zm_utility::absyawtoenemy();
|
||||
|
||||
if ( yaw > run_yaw )
|
||||
return false;
|
||||
|
||||
pitch = angleclamp180( vectortoangles( self.origin - self.enemy.origin )[0] );
|
||||
|
||||
if ( abs( pitch ) > run_pitch )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
run_dist_squared = 147456;
|
||||
if ( getDvar( "scr_dog_run_distance" ) != "" )
|
||||
{
|
||||
dist = getDvarInt( "scr_dog_run_distance" );
|
||||
run_dist_squared = dist * dist;
|
||||
}
|
||||
run_yaw = 20;
|
||||
run_pitch = 30;
|
||||
run_height = 64;
|
||||
if ( self.a.movement != "walk" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self.health < self.maxhealth )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) || !isalive( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !self cansee( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
dist = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( dist > run_dist_squared )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
height = self.origin[ 2 ] - self.enemy.origin[ 2 ];
|
||||
if ( abs( height ) > run_height )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
yaw = self maps/mp/animscripts/zm_utility::absyawtoenemy();
|
||||
if ( yaw > run_yaw )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
pitch = angleClamp180( vectorToAngle( self.origin - self.enemy.origin )[ 0 ] );
|
||||
if ( abs( pitch ) > run_pitch )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,10 +1,8 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
}
|
||||
|
@ -1,145 +1,148 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_stop::main()" );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
self randomattackidle();
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "attack_idle", ::dogidlenotetracks );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_idle" );
|
||||
self notify( "stop tracking" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromasd( "zm_stop_idle" );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 0.2, "stop_idle", ::dogidlenotetracks );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
}
|
||||
|
||||
debug_anim_print( "dog_stop::main() - stop idle loop notify done." );
|
||||
}
|
||||
debug_anim_print( "dog_stop::main()" );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
self randomattackidle();
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "attack_idle", ::dogidlenotetracks );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_idle" );
|
||||
self notify( "stop tracking" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromasd( "zm_stop_idle" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,2, "stop_idle", ::dogidlenotetracks );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
}
|
||||
debug_anim_print( "dog_stop::main() - stop idle loop notify done." );
|
||||
}
|
||||
}
|
||||
|
||||
dogidlenotetracks( note )
|
||||
{
|
||||
if ( note == "breathe_fire" )
|
||||
{
|
||||
if ( isdefined( level._effect["dog_breath"] ) )
|
||||
{
|
||||
self.breath_fx = spawn( "script_model", self gettagorigin( "TAG_MOUTH_FX" ) );
|
||||
self.breath_fx.angles = self gettagangles( "TAG_MOUTH_FX" );
|
||||
self.breath_fx setmodel( "tag_origin" );
|
||||
self.breath_fx linkto( self, "TAG_MOUTH_FX" );
|
||||
playfxontag( level._effect["dog_breath"], self.breath_fx, "tag_origin" );
|
||||
}
|
||||
}
|
||||
if ( note == "breathe_fire" )
|
||||
{
|
||||
if ( isDefined( level._effect[ "dog_breath" ] ) )
|
||||
{
|
||||
self.breath_fx = spawn( "script_model", self gettagorigin( "TAG_MOUTH_FX" ) );
|
||||
self.breath_fx.angles = self gettagangles( "TAG_MOUTH_FX" );
|
||||
self.breath_fx setmodel( "tag_origin" );
|
||||
self.breath_fx linkto( self, "TAG_MOUTH_FX" );
|
||||
playfxontag( level._effect[ "dog_breath" ], self.breath_fx, "tag_origin" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isfacingenemy( tolerancecosangle )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( self.enemy ) );
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
vectoenemy = self.enemy.origin - self.origin;
|
||||
disttoenemy = length( vectoenemy );
|
||||
|
||||
if ( disttoenemy < 1 )
|
||||
return 1;
|
||||
|
||||
forward = anglestoforward( self.angles );
|
||||
val1 = forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1];
|
||||
val2 = ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy;
|
||||
return ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy > tolerancecosangle;
|
||||
vectoenemy = self.enemy.origin - self.origin;
|
||||
disttoenemy = length( vectoenemy );
|
||||
if ( disttoenemy < 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
forward = anglesToForward( self.angles );
|
||||
val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] );
|
||||
val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy;
|
||||
return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle;
|
||||
}
|
||||
|
||||
randomattackidle()
|
||||
{
|
||||
if ( isfacingenemy( -0.5 ) )
|
||||
self set_orient_mode( "face current" );
|
||||
else
|
||||
self set_orient_mode( "face enemy" );
|
||||
|
||||
if ( should_growl() )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_growl" );
|
||||
return;
|
||||
}
|
||||
|
||||
idlechance = 33;
|
||||
barkchance = 66;
|
||||
|
||||
if ( isdefined( self.mode ) )
|
||||
{
|
||||
if ( self.mode == "growl" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 30;
|
||||
}
|
||||
else if ( self.mode == "bark" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 85;
|
||||
}
|
||||
}
|
||||
|
||||
rand = randomint( 100 );
|
||||
|
||||
if ( rand < idlechance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle" );
|
||||
self setanimstatefromasd( "zm_stop_attackidle" );
|
||||
}
|
||||
else if ( rand < barkchance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_bark" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_growl" );
|
||||
}
|
||||
if ( isfacingenemy( -0,5 ) )
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
}
|
||||
if ( should_growl() )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_growl" );
|
||||
return;
|
||||
}
|
||||
idlechance = 33;
|
||||
barkchance = 66;
|
||||
if ( isDefined( self.mode ) )
|
||||
{
|
||||
if ( self.mode == "growl" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 30;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.mode == "bark" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 85;
|
||||
}
|
||||
}
|
||||
}
|
||||
rand = randomint( 100 );
|
||||
if ( rand < idlechance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle" );
|
||||
self setanimstatefromasd( "zm_stop_attackidle" );
|
||||
}
|
||||
else if ( rand < barkchance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_bark" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_growl" );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
return isdefined( self.enemy ) && isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
if ( isDefined( self.enemy ) && isalive( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
should_growl()
|
||||
{
|
||||
if ( isdefined( self.script_growl ) )
|
||||
return 1;
|
||||
|
||||
if ( !isalive( self.enemy ) )
|
||||
return 1;
|
||||
|
||||
return !self cansee( self.enemy );
|
||||
if ( isDefined( self.script_growl ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return !self cansee( self.enemy );
|
||||
}
|
||||
|
||||
lookattarget( lookposeset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop tracking" );
|
||||
debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset );
|
||||
self.rightaimlimit = 90;
|
||||
self.leftaimlimit = -90;
|
||||
self.upaimlimit = 45;
|
||||
self.downaimlimit = -45;
|
||||
self maps\mp\animscripts\shared::setanimaimweight( 1, 0.2 );
|
||||
self maps\mp\animscripts\shared::trackloop();
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop tracking" );
|
||||
debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset );
|
||||
self.rightaimlimit = 90;
|
||||
self.leftaimlimit = -90;
|
||||
self.upaimlimit = 45;
|
||||
self.downaimlimit = -45;
|
||||
self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 );
|
||||
self maps/mp/animscripts/shared::trackloop();
|
||||
}
|
||||
|
@ -1,138 +1,136 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_turn::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
deltayaw = self getdeltaturnyaw();
|
||||
|
||||
if ( need_to_turn_around( deltayaw ) )
|
||||
turn_180( deltayaw );
|
||||
else
|
||||
turn_90( deltayaw );
|
||||
|
||||
move_out_of_turn();
|
||||
self.skipstartmove = 1;
|
||||
self.safetochangescript = 1;
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_turn::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
deltayaw = self getdeltaturnyaw();
|
||||
if ( need_to_turn_around( deltayaw ) )
|
||||
{
|
||||
turn_180( deltayaw );
|
||||
}
|
||||
else
|
||||
{
|
||||
turn_90( deltayaw );
|
||||
}
|
||||
move_out_of_turn();
|
||||
self.skipstartmove = 1;
|
||||
self.safetochangescript = 1;
|
||||
}
|
||||
|
||||
need_to_turn_around( deltayaw )
|
||||
{
|
||||
angle = getdvarfloat( "dog_turn180_angle" );
|
||||
|
||||
if ( deltayaw > angle || deltayaw < -1 * angle )
|
||||
{
|
||||
debug_turn_print( "need_to_turn_around: " + deltayaw + " YES" );
|
||||
return true;
|
||||
}
|
||||
|
||||
debug_turn_print( "need_to_turn_around: " + deltayaw + " NO" );
|
||||
return false;
|
||||
angle = getDvarFloat( "dog_turn180_angle" );
|
||||
if ( deltayaw > angle || deltayaw < ( -1 * angle ) )
|
||||
{
|
||||
debug_turn_print( "need_to_turn_around: " + deltayaw + " YES" );
|
||||
return 1;
|
||||
}
|
||||
debug_turn_print( "need_to_turn_around: " + deltayaw + " NO" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time )
|
||||
{
|
||||
speed = length( self getvelocity() );
|
||||
do_anim = stopped_anim;
|
||||
|
||||
if ( level.dogrunturnspeed < speed )
|
||||
{
|
||||
do_anim = run_anim;
|
||||
wait_time = run_wait_time;
|
||||
}
|
||||
|
||||
debug_anim_print( "dog_move::do_turn_anim() - Setting " + do_anim );
|
||||
self setanimstatefromasd( do_anim );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( run_wait_time, "move_turn" );
|
||||
debug_anim_print( "dog_move::turn_around_right() - done with " + do_anim + " wait time " + run_wait_time );
|
||||
speed = length( self getvelocity() );
|
||||
do_anim = stopped_anim;
|
||||
if ( level.dogrunturnspeed < speed )
|
||||
{
|
||||
do_anim = run_anim;
|
||||
wait_time = run_wait_time;
|
||||
}
|
||||
debug_anim_print( "dog_move::do_turn_anim() - Setting " + do_anim );
|
||||
self setanimstatefromasd( do_anim );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( run_wait_time, "move_turn" );
|
||||
debug_anim_print( "dog_move::turn_around_right() - done with " + do_anim + " wait time " + run_wait_time );
|
||||
}
|
||||
|
||||
turn_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_left", "move_run_turn_left", 0.5, 0.5 );
|
||||
self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_right", "move_run_turn_right", 0.5, 0.5 );
|
||||
self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_180_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0.5, 0.7 );
|
||||
self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
turn_180_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0.5, 0.7 );
|
||||
self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
move_out_of_turn()
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 0.1, "move_run" );
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "move_walk" );
|
||||
}
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_run" );
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_walk" );
|
||||
}
|
||||
}
|
||||
|
||||
turn_90( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics" );
|
||||
debug_turn_print( "turn_90 deltaYaw: " + deltayaw );
|
||||
|
||||
if ( deltayaw > getdvarfloat( "dog_turn90_angle" ) )
|
||||
{
|
||||
debug_turn_print( "turn_90 left", 1 );
|
||||
self turn_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_90 right", 1 );
|
||||
self turn_right();
|
||||
}
|
||||
self animmode( "zonly_physics" );
|
||||
debug_turn_print( "turn_90 deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > getDvarFloat( "dog_turn90_angle" ) )
|
||||
{
|
||||
debug_turn_print( "turn_90 left", 1 );
|
||||
self turn_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_90 right", 1 );
|
||||
self turn_right();
|
||||
}
|
||||
}
|
||||
|
||||
turn_180( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics" );
|
||||
debug_turn_print( "turn_180 deltaYaw: " + deltayaw );
|
||||
|
||||
if ( deltayaw > 177 || deltayaw < -177 )
|
||||
{
|
||||
if ( randomint( 2 ) == 0 )
|
||||
{
|
||||
debug_turn_print( "turn_around random right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around random left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
}
|
||||
else if ( deltayaw > getdvarfloat( "dog_turn180_angle" ) )
|
||||
{
|
||||
debug_turn_print( "turn_around left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
self animmode( "zonly_physics" );
|
||||
debug_turn_print( "turn_180 deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > 177 || deltayaw < -177 )
|
||||
{
|
||||
if ( randomint( 2 ) == 0 )
|
||||
{
|
||||
debug_turn_print( "turn_around random right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around random left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( deltayaw > getDvarFloat( "dog_turn180_angle" ) )
|
||||
{
|
||||
debug_turn_print( "turn_around left", 1 );
|
||||
self turn_180_left();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,6 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,165 +1,158 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\animscripts\zm_init;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_init;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self.a = spawnstruct();
|
||||
self.team = level.zombie_team;
|
||||
firstinit();
|
||||
self.a.pose = "stand";
|
||||
self.a.movement = "stop";
|
||||
self.a.state = "stop";
|
||||
self.a.special = "none";
|
||||
self.a.combatendtime = gettime();
|
||||
self.a.script = "init";
|
||||
self.a.alertness = "casual";
|
||||
self.a.lastenemytime = gettime();
|
||||
self.a.forced_cover = "none";
|
||||
self.a.desired_script = "none";
|
||||
self.a.current_script = "none";
|
||||
self.a.lookangle = 0;
|
||||
self.a.paintime = 0;
|
||||
self.a.nextgrenadetrytime = 0;
|
||||
self.walk = 0;
|
||||
self.sprint = 0;
|
||||
self.a.runblendtime = 0.2;
|
||||
self.a.flamepaintime = 0;
|
||||
self.a.postscriptfunc = undefined;
|
||||
self.a.stance = "stand";
|
||||
self._animactive = 0;
|
||||
self thread deathnotify();
|
||||
self.baseaccuracy = self.accuracy;
|
||||
|
||||
if ( !isdefined( self.script_accuracy ) )
|
||||
self.script_accuracy = 1;
|
||||
|
||||
self.a.misstime = 0;
|
||||
self.a.yawtransition = "none";
|
||||
self.a.nodeath = 0;
|
||||
self.a.misstime = 0;
|
||||
self.a.misstimedebounce = 0;
|
||||
self.a.disablepain = 0;
|
||||
self.accuracystationarymod = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.sightpostime = 0;
|
||||
self.sightposleft = 1;
|
||||
self.precombatrunenabled = 1;
|
||||
self.is_zombie = 1;
|
||||
self.a.crouchpain = 0;
|
||||
self.a.nextstandinghitdying = 0;
|
||||
|
||||
if ( !isdefined( self.script_forcegrenade ) )
|
||||
self.script_forcegrenade = 0;
|
||||
self.a = spawnstruct();
|
||||
self.team = level.zombie_team;
|
||||
firstinit();
|
||||
self.a.pose = "stand";
|
||||
self.a.movement = "stop";
|
||||
self.a.state = "stop";
|
||||
self.a.special = "none";
|
||||
self.a.combatendtime = getTime();
|
||||
self.a.script = "init";
|
||||
self.a.alertness = "casual";
|
||||
self.a.lastenemytime = getTime();
|
||||
self.a.forced_cover = "none";
|
||||
self.a.desired_script = "none";
|
||||
self.a.current_script = "none";
|
||||
self.a.lookangle = 0;
|
||||
self.a.paintime = 0;
|
||||
self.a.nextgrenadetrytime = 0;
|
||||
self.walk = 0;
|
||||
self.sprint = 0;
|
||||
self.a.runblendtime = 0,2;
|
||||
self.a.flamepaintime = 0;
|
||||
self.a.postscriptfunc = undefined;
|
||||
self.a.stance = "stand";
|
||||
self._animactive = 0;
|
||||
self thread deathnotify();
|
||||
self.baseaccuracy = self.accuracy;
|
||||
if ( !isDefined( self.script_accuracy ) )
|
||||
{
|
||||
self.script_accuracy = 1;
|
||||
}
|
||||
self.a.misstime = 0;
|
||||
self.a.yawtransition = "none";
|
||||
self.a.nodeath = 0;
|
||||
self.a.misstime = 0;
|
||||
self.a.misstimedebounce = 0;
|
||||
self.a.disablepain = 0;
|
||||
self.accuracystationarymod = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.sightpostime = 0;
|
||||
self.sightposleft = 1;
|
||||
self.precombatrunenabled = 1;
|
||||
self.is_zombie = 1;
|
||||
self.a.crouchpain = 0;
|
||||
self.a.nextstandinghitdying = 0;
|
||||
if ( !isDefined( self.script_forcegrenade ) )
|
||||
{
|
||||
self.script_forcegrenade = 0;
|
||||
}
|
||||
/#
|
||||
self.a.lastdebugprint = "";
|
||||
self.a.lastdebugprint = "";
|
||||
#/
|
||||
self.lastenemysighttime = 0;
|
||||
self.combattime = 0;
|
||||
self.coveridleselecttime = -696969;
|
||||
self.old = spawnstruct();
|
||||
self.reacquire_state = 0;
|
||||
self.a.allow_shooting = 0;
|
||||
self.lastenemysighttime = 0;
|
||||
self.combattime = 0;
|
||||
self.coveridleselecttime = -696969;
|
||||
self.old = spawnstruct();
|
||||
self.reacquire_state = 0;
|
||||
self.a.allow_shooting = 0;
|
||||
}
|
||||
|
||||
donothing()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
empty( one, two, three, whatever )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
clearenemy()
|
||||
{
|
||||
self notify( "stop waiting for enemy to die" );
|
||||
self endon( "stop waiting for enemy to die" );
|
||||
|
||||
self.sightenemy waittill( "death" );
|
||||
|
||||
self.sightpos = undefined;
|
||||
self.sighttime = 0;
|
||||
self.sightenemy = undefined;
|
||||
self notify( "stop waiting for enemy to die" );
|
||||
self endon( "stop waiting for enemy to die" );
|
||||
self.sightenemy waittill( "death" );
|
||||
self.sightpos = undefined;
|
||||
self.sighttime = 0;
|
||||
self.sightenemy = undefined;
|
||||
}
|
||||
|
||||
deathnotify()
|
||||
{
|
||||
self waittill( "death", other );
|
||||
|
||||
self notify( anim.scriptchange );
|
||||
self waittill( "death", other );
|
||||
self notify( anim.scriptchange );
|
||||
}
|
||||
|
||||
firstinit()
|
||||
{
|
||||
if ( isdefined( anim.notfirsttime ) )
|
||||
return;
|
||||
|
||||
anim.notfirsttime = 1;
|
||||
anim.usefacialanims = 0;
|
||||
|
||||
if ( !isdefined( anim.dog_health ) )
|
||||
anim.dog_health = 1;
|
||||
|
||||
if ( !isdefined( anim.dog_presstime ) )
|
||||
anim.dog_presstime = 350;
|
||||
|
||||
if ( !isdefined( anim.dog_hits_before_kill ) )
|
||||
anim.dog_hits_before_kill = 1;
|
||||
|
||||
level.nextgrenadedrop = randomint( 3 );
|
||||
level.lastplayersighted = 100;
|
||||
anim.defaultexception = maps\mp\animscripts\zm_init::empty;
|
||||
setdvar( "scr_expDeathMayMoveCheck", "on" );
|
||||
anim.lastsidestepanim = 0;
|
||||
anim.meleerange = 64;
|
||||
anim.meleerangesq = anim.meleerange * anim.meleerange;
|
||||
anim.standrangesq = 262144;
|
||||
anim.chargerangesq = 40000;
|
||||
anim.chargelongrangesq = 262144;
|
||||
anim.aivsaimeleerangesq = 160000;
|
||||
anim.combatmemorytimeconst = 10000;
|
||||
anim.combatmemorytimerand = 6000;
|
||||
anim.scriptchange = "script_change";
|
||||
anim.lastgibtime = 0;
|
||||
anim.gibdelay = 3000;
|
||||
anim.mingibs = 2;
|
||||
anim.maxgibs = 4;
|
||||
anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs );
|
||||
anim.corner_straight_yaw_limit = 36;
|
||||
|
||||
if ( !isdefined( anim.optionalstepeffectfunction ) )
|
||||
{
|
||||
anim.optionalstepeffects = [];
|
||||
anim.optionalstepeffectfunction = ::empty;
|
||||
}
|
||||
|
||||
anim.notetracks = [];
|
||||
maps\mp\animscripts\zm_shared::registernotetracks();
|
||||
|
||||
if ( !isdefined( level.flag ) )
|
||||
{
|
||||
level.flag = [];
|
||||
level.flags_lock = [];
|
||||
}
|
||||
|
||||
level.painai = undefined;
|
||||
anim.maymovecheckenabled = 1;
|
||||
anim.badplaces = [];
|
||||
anim.badplaceint = 0;
|
||||
anim.covercrouchleanpitch = -55;
|
||||
anim.lastcarexplosiontime = -100000;
|
||||
if ( isDefined( anim.notfirsttime ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
anim.notfirsttime = 1;
|
||||
anim.usefacialanims = 0;
|
||||
if ( !isDefined( anim.dog_health ) )
|
||||
{
|
||||
anim.dog_health = 1;
|
||||
}
|
||||
if ( !isDefined( anim.dog_presstime ) )
|
||||
{
|
||||
anim.dog_presstime = 350;
|
||||
}
|
||||
if ( !isDefined( anim.dog_hits_before_kill ) )
|
||||
{
|
||||
anim.dog_hits_before_kill = 1;
|
||||
}
|
||||
level.nextgrenadedrop = randomint( 3 );
|
||||
level.lastplayersighted = 100;
|
||||
anim.defaultexception = ::empty;
|
||||
setdvar( "scr_expDeathMayMoveCheck", "on" );
|
||||
anim.lastsidestepanim = 0;
|
||||
anim.meleerange = 64;
|
||||
anim.meleerangesq = anim.meleerange * anim.meleerange;
|
||||
anim.standrangesq = 262144;
|
||||
anim.chargerangesq = 40000;
|
||||
anim.chargelongrangesq = 262144;
|
||||
anim.aivsaimeleerangesq = 160000;
|
||||
anim.combatmemorytimeconst = 10000;
|
||||
anim.combatmemorytimerand = 6000;
|
||||
anim.scriptchange = "script_change";
|
||||
anim.lastgibtime = 0;
|
||||
anim.gibdelay = 3000;
|
||||
anim.mingibs = 2;
|
||||
anim.maxgibs = 4;
|
||||
anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs );
|
||||
anim.corner_straight_yaw_limit = 36;
|
||||
if ( !isDefined( anim.optionalstepeffectfunction ) )
|
||||
{
|
||||
anim.optionalstepeffects = [];
|
||||
anim.optionalstepeffectfunction = ::empty;
|
||||
}
|
||||
anim.notetracks = [];
|
||||
maps/mp/animscripts/zm_shared::registernotetracks();
|
||||
if ( !isDefined( level.flag ) )
|
||||
{
|
||||
level.flag = [];
|
||||
level.flags_lock = [];
|
||||
}
|
||||
level.painai = undefined;
|
||||
anim.maymovecheckenabled = 1;
|
||||
anim.badplaces = [];
|
||||
anim.badplaceint = 0;
|
||||
anim.covercrouchleanpitch = -55;
|
||||
anim.lastcarexplosiontime = -100000;
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
player = self;
|
||||
firstinit();
|
||||
player.invul = 0;
|
||||
player = self;
|
||||
firstinit();
|
||||
player.invul = 0;
|
||||
}
|
||||
|
@ -1,9 +1,6 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,273 +1,304 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\animscripts\zm_combat;
|
||||
#include maps/mp/animscripts/zm_combat;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
meleecombat()
|
||||
{
|
||||
self endon( "end_melee" );
|
||||
self endon( "killanimscript" );
|
||||
self endon( "end_melee" );
|
||||
self endon( "killanimscript" );
|
||||
/#
|
||||
assert( canmeleeanyrange() );
|
||||
assert( canmeleeanyrange() );
|
||||
#/
|
||||
self orientmode( "face enemy" );
|
||||
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
self animmode( "slide" );
|
||||
else
|
||||
self animmode( "zonly_physics" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( self.marked_for_death ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.enemy ) )
|
||||
{
|
||||
angles = vectortoangles( self.enemy.origin - self.origin );
|
||||
self orientmode( "face angle", angles[1] );
|
||||
}
|
||||
|
||||
if ( isdefined( self.zmb_vocals_attack ) )
|
||||
self playsound( self.zmb_vocals_attack );
|
||||
|
||||
if ( isdefined( self.nochangeduringmelee ) && self.nochangeduringmelee )
|
||||
self.safetochangescript = 0;
|
||||
|
||||
if ( isdefined( self.is_inert ) && self.is_inert )
|
||||
return;
|
||||
|
||||
set_zombie_melee_anim_state( self );
|
||||
|
||||
if ( isdefined( self.melee_anim_func ) )
|
||||
self thread [[ self.melee_anim_func ]]();
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "melee_anim", note );
|
||||
|
||||
if ( note == "end" )
|
||||
break;
|
||||
else if ( note == "fire" )
|
||||
{
|
||||
if ( !isdefined( self.enemy ) )
|
||||
break;
|
||||
|
||||
if ( isdefined( self.dont_die_on_me ) && self.dont_die_on_me )
|
||||
break;
|
||||
|
||||
self.enemy notify( "melee_swipe", self );
|
||||
oldhealth = self.enemy.health;
|
||||
self melee();
|
||||
|
||||
if ( !isdefined( self.enemy ) )
|
||||
break;
|
||||
|
||||
if ( self.enemy.health >= oldhealth )
|
||||
{
|
||||
if ( isdefined( self.melee_miss_func ) )
|
||||
self [[ self.melee_miss_func ]]();
|
||||
else if ( isdefined( level.melee_miss_func ) )
|
||||
self [[ level.melee_miss_func ]]();
|
||||
}
|
||||
self orientmode( "face enemy" );
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
self animmode( "slide" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self animmode( "zonly_physics" );
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( self.marked_for_death ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
angles = vectorToAngle( self.enemy.origin - self.origin );
|
||||
self orientmode( "face angle", angles[ 1 ] );
|
||||
}
|
||||
if ( isDefined( self.zmb_vocals_attack ) )
|
||||
{
|
||||
self playsound( self.zmb_vocals_attack );
|
||||
}
|
||||
if ( isDefined( self.nochangeduringmelee ) && self.nochangeduringmelee )
|
||||
{
|
||||
self.safetochangescript = 0;
|
||||
}
|
||||
if ( isDefined( self.is_inert ) && self.is_inert )
|
||||
{
|
||||
return;
|
||||
}
|
||||
set_zombie_melee_anim_state( self );
|
||||
if ( isDefined( self.melee_anim_func ) )
|
||||
{
|
||||
self thread [[ self.melee_anim_func ]]();
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "melee_anim", note );
|
||||
if ( note == "end" )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( note == "fire" )
|
||||
{
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( isDefined( self.dont_die_on_me ) && self.dont_die_on_me )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.enemy notify( "melee_swipe" );
|
||||
oldhealth = self.enemy.health;
|
||||
self melee();
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( self.enemy.health >= oldhealth )
|
||||
{
|
||||
if ( isDefined( self.melee_miss_func ) )
|
||||
{
|
||||
self [[ self.melee_miss_func ]]();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.melee_miss_func ) )
|
||||
{
|
||||
self [[ level.melee_miss_func ]]();
|
||||
}
|
||||
}
|
||||
}
|
||||
/#
|
||||
if ( getdvarint( _hash_7F11F572 ) )
|
||||
{
|
||||
if ( self.enemy.health < oldhealth )
|
||||
{
|
||||
zombie_eye = self geteye();
|
||||
player_eye = self.enemy geteye();
|
||||
trace = bullettrace( zombie_eye, player_eye, 1, self );
|
||||
hitpos = trace["position"];
|
||||
dist = distance( zombie_eye, hitpos );
|
||||
iprintln( "melee HIT " + dist );
|
||||
}
|
||||
}
|
||||
if ( getDvarInt( #"7F11F572" ) )
|
||||
{
|
||||
if ( self.enemy.health < oldhealth )
|
||||
{
|
||||
zombie_eye = self geteye();
|
||||
player_eye = self.enemy geteye();
|
||||
trace = bullettrace( zombie_eye, player_eye, 1, self );
|
||||
hitpos = trace[ "position" ];
|
||||
dist = distance( zombie_eye, hitpos );
|
||||
iprintln( "melee HIT " + dist );
|
||||
#/
|
||||
}
|
||||
else if ( note == "stop" )
|
||||
{
|
||||
if ( !cancontinuetomelee() )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
self orientmode( "face enemy" );
|
||||
else
|
||||
self orientmode( "face default" );
|
||||
|
||||
if ( isdefined( self.nochangeduringmelee ) && self.nochangeduringmelee || is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
if ( isdefined( self.enemy ) )
|
||||
{
|
||||
dist_sq = distancesquared( self.origin, self.enemy.origin );
|
||||
|
||||
if ( dist_sq > self.meleeattackdist * self.meleeattackdist )
|
||||
{
|
||||
self.safetochangescript = 1;
|
||||
wait 0.1;
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
self.safetochangescript = 1;
|
||||
wait 0.1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
self animmode( "slide" );
|
||||
else
|
||||
self animmode( "none" );
|
||||
|
||||
self thread maps\mp\animscripts\zm_combat::main();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( note == "stop" )
|
||||
{
|
||||
if ( !cancontinuetomelee() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
self orientmode( "face enemy" );
|
||||
}
|
||||
else self orientmode( "face default" );
|
||||
if ( isDefined( self.nochangeduringmelee ) || self.nochangeduringmelee && is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
dist_sq = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( dist_sq > ( self.meleeattackdist * self.meleeattackdist ) )
|
||||
{
|
||||
self.safetochangescript = 1;
|
||||
wait 0,1;
|
||||
break;
|
||||
}
|
||||
else }
|
||||
else self.safetochangescript = 1;
|
||||
wait 0,1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
self animmode( "slide" );
|
||||
}
|
||||
else self animmode( "none" );
|
||||
self thread maps/mp/animscripts/zm_combat::main();
|
||||
}
|
||||
|
||||
cancontinuetomelee()
|
||||
{
|
||||
return canmeleeinternal( "already started" );
|
||||
return canmeleeinternal( "already started" );
|
||||
}
|
||||
|
||||
canmeleeanyrange()
|
||||
{
|
||||
return canmeleeinternal( "any range" );
|
||||
return canmeleeinternal( "any range" );
|
||||
}
|
||||
|
||||
canmeleedesperate()
|
||||
{
|
||||
return canmeleeinternal( "long range" );
|
||||
return canmeleeinternal( "long range" );
|
||||
}
|
||||
|
||||
canmelee()
|
||||
{
|
||||
return canmeleeinternal( "normal" );
|
||||
return canmeleeinternal( "normal" );
|
||||
}
|
||||
|
||||
canmeleeinternal( state )
|
||||
{
|
||||
if ( !issentient( self.enemy ) )
|
||||
return false;
|
||||
|
||||
if ( !isalive( self.enemy ) )
|
||||
return false;
|
||||
|
||||
if ( isdefined( self.disablemelee ) )
|
||||
{
|
||||
if ( !issentient( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.disablemelee ) )
|
||||
{
|
||||
/#
|
||||
assert( self.disablemelee );
|
||||
assert( self.disablemelee );
|
||||
#/
|
||||
return false;
|
||||
}
|
||||
|
||||
yaw = abs( getyawtoenemy() );
|
||||
|
||||
if ( yaw > 60 && state != "already started" || yaw > 110 )
|
||||
return false;
|
||||
|
||||
enemypoint = self.enemy getorigin();
|
||||
vectoenemy = enemypoint - self.origin;
|
||||
self.enemydistancesq = lengthsquared( vectoenemy );
|
||||
|
||||
if ( self.enemydistancesq <= anim.meleerangesq )
|
||||
{
|
||||
if ( !ismeleepathclear( vectoenemy, enemypoint ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( state != "any range" )
|
||||
{
|
||||
chargerangesq = anim.chargerangesq;
|
||||
|
||||
if ( state == "long range" )
|
||||
chargerangesq = anim.chargelongrangesq;
|
||||
|
||||
if ( self.enemydistancesq > chargerangesq )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( state == "already started" )
|
||||
return false;
|
||||
|
||||
if ( isdefined( self.check_melee_path ) && self.check_melee_path )
|
||||
{
|
||||
if ( !ismeleepathclear( vectoenemy, enemypoint ) )
|
||||
{
|
||||
self notify( "melee_path_blocked" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( level.can_melee ) )
|
||||
{
|
||||
if ( !self [[ level.can_melee ]]() )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
yaw = abs( getyawtoenemy() );
|
||||
if ( yaw > 60 || state != "already started" && yaw > 110 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
enemypoint = self.enemy getorigin();
|
||||
vectoenemy = enemypoint - self.origin;
|
||||
self.enemydistancesq = lengthsquared( vectoenemy );
|
||||
if ( self.enemydistancesq <= anim.meleerangesq )
|
||||
{
|
||||
if ( !ismeleepathclear( vectoenemy, enemypoint ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if ( state != "any range" )
|
||||
{
|
||||
chargerangesq = anim.chargerangesq;
|
||||
if ( state == "long range" )
|
||||
{
|
||||
chargerangesq = anim.chargelongrangesq;
|
||||
}
|
||||
if ( self.enemydistancesq > chargerangesq )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( state == "already started" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.check_melee_path ) && self.check_melee_path )
|
||||
{
|
||||
if ( !ismeleepathclear( vectoenemy, enemypoint ) )
|
||||
{
|
||||
self notify( "melee_path_blocked" );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.can_melee ) )
|
||||
{
|
||||
if ( !( self [[ level.can_melee ]]() ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
ismeleepathclear( vectoenemy, enemypoint )
|
||||
{
|
||||
dirtoenemy = vectornormalize( ( vectoenemy[0], vectoenemy[1], 0 ) );
|
||||
meleepoint = enemypoint - ( dirtoenemy[0] * 28, dirtoenemy[1] * 28, 0 );
|
||||
|
||||
if ( !self isingoal( meleepoint ) )
|
||||
return false;
|
||||
|
||||
if ( self maymovetopoint( meleepoint ) )
|
||||
return true;
|
||||
|
||||
trace1 = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), meleepoint + vectorscale( ( 0, 0, 1 ), 20.0 ), 1, self );
|
||||
trace2 = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 72.0 ), meleepoint + vectorscale( ( 0, 0, 1 ), 72.0 ), 1, self );
|
||||
|
||||
if ( isdefined( trace1["fraction"] ) && trace1["fraction"] == 1 && isdefined( trace2["fraction"] ) && trace2["fraction"] == 1 )
|
||||
return true;
|
||||
|
||||
if ( isdefined( trace1["entity"] ) && trace1["entity"] == self.enemy && isdefined( trace2["entity"] ) && trace2["entity"] == self.enemy )
|
||||
return true;
|
||||
|
||||
if ( isdefined( level.zombie_melee_in_water ) && level.zombie_melee_in_water )
|
||||
{
|
||||
if ( isdefined( trace1["surfacetype"] ) && trace1["surfacetype"] == "water" && isdefined( trace2["fraction"] ) && trace2["fraction"] == 1 )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
dirtoenemy = vectornormalize( ( vectoenemy[ 0 ], vectoenemy[ 1 ], 0 ) );
|
||||
meleepoint = enemypoint - ( dirtoenemy[ 0 ] * 28, dirtoenemy[ 1 ] * 28, 0 );
|
||||
if ( !self isingoal( meleepoint ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self maymovetopoint( meleepoint ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
trace1 = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 20 ), meleepoint + vectorScale( ( 0, 0, 1 ), 20 ), 1, self );
|
||||
trace2 = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 72 ), meleepoint + vectorScale( ( 0, 0, 1 ), 72 ), 1, self );
|
||||
if ( isDefined( trace1[ "fraction" ] ) && trace1[ "fraction" ] == 1 && isDefined( trace2[ "fraction" ] ) && trace2[ "fraction" ] == 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( trace1[ "entity" ] ) && trace1[ "entity" ] == self.enemy && isDefined( trace2[ "entity" ] ) && trace2[ "entity" ] == self.enemy )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( level.zombie_melee_in_water ) && level.zombie_melee_in_water )
|
||||
{
|
||||
if ( isDefined( trace1[ "surfacetype" ] ) && trace1[ "surfacetype" ] == "water" && isDefined( trace2[ "fraction" ] ) && trace2[ "fraction" ] == 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
set_zombie_melee_anim_state( zombie )
|
||||
{
|
||||
if ( isdefined( level.melee_anim_state ) )
|
||||
melee_anim_state = self [[ level.melee_anim_state ]]();
|
||||
|
||||
if ( !isdefined( melee_anim_state ) )
|
||||
{
|
||||
if ( !zombie.has_legs && zombie.a.gib_ref == "no_legs" )
|
||||
melee_anim_state = "zm_stumpy_melee";
|
||||
else
|
||||
{
|
||||
switch ( zombie.zombie_move_speed )
|
||||
{
|
||||
case "walk":
|
||||
melee_anim_state = append_missing_legs_suffix( "zm_walk_melee" );
|
||||
break;
|
||||
case "sprint":
|
||||
case "run":
|
||||
default:
|
||||
melee_anim_state = append_missing_legs_suffix( "zm_run_melee" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
zombie setanimstatefromasd( melee_anim_state );
|
||||
if ( isDefined( level.melee_anim_state ) )
|
||||
{
|
||||
melee_anim_state = self [[ level.melee_anim_state ]]();
|
||||
}
|
||||
if ( !isDefined( melee_anim_state ) )
|
||||
{
|
||||
if ( !zombie.has_legs && zombie.a.gib_ref == "no_legs" )
|
||||
{
|
||||
melee_anim_state = "zm_stumpy_melee";
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( zombie.zombie_move_speed )
|
||||
{
|
||||
case "walk":
|
||||
melee_anim_state = append_missing_legs_suffix( "zm_walk_melee" );
|
||||
break;
|
||||
case "run":
|
||||
case "sprint":
|
||||
default:
|
||||
melee_anim_state = append_missing_legs_suffix( "zm_run_melee" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
zombie setanimstatefromasd( melee_anim_state );
|
||||
}
|
||||
|
@ -1,256 +1,286 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\animscripts\zm_run;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_run;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
previousscript = self.a.script;
|
||||
maps\mp\animscripts\zm_utility::initialize( "zombie_move" );
|
||||
movemainloop();
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
previousscript = self.a.script;
|
||||
maps/mp/animscripts/zm_utility::initialize( "zombie_move" );
|
||||
movemainloop();
|
||||
}
|
||||
|
||||
movemainloop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
self sidestepinit();
|
||||
self thread trysidestepthread();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self maps\mp\animscripts\zm_run::moverun();
|
||||
|
||||
if ( isdefined( self.zombie_can_sidestep ) && self.zombie_can_sidestep )
|
||||
self trysidestep();
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
self sidestepinit();
|
||||
self thread trysidestepthread();
|
||||
for ( ;; )
|
||||
{
|
||||
self maps/mp/animscripts/zm_run::moverun();
|
||||
if ( isDefined( self.zombie_can_sidestep ) && self.zombie_can_sidestep )
|
||||
{
|
||||
self trysidestep();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sidestepinit()
|
||||
{
|
||||
self.a.steppeddir = 0;
|
||||
self.a.lastsidesteptime = gettime();
|
||||
self.a.steppeddir = 0;
|
||||
self.a.lastsidesteptime = getTime();
|
||||
}
|
||||
|
||||
trysidestepthread()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "new_trySideStepThread" );
|
||||
self endon( "new_trySideStepThread" );
|
||||
|
||||
if ( !isdefined( self.zombie_can_sidestep ) )
|
||||
return false;
|
||||
|
||||
if ( isdefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep )
|
||||
return false;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self trysidestep();
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "death" );
|
||||
self notify( "new_trySideStepThread" );
|
||||
self endon( "new_trySideStepThread" );
|
||||
if ( !isDefined( self.zombie_can_sidestep ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self trysidestep();
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
trysidestep()
|
||||
{
|
||||
if ( isdefined( self.shouldsidestepfunc ) )
|
||||
self.sidesteptype = self [[ self.shouldsidestepfunc ]]();
|
||||
else
|
||||
self.sidesteptype = shouldsidestep();
|
||||
|
||||
if ( self.sidesteptype == "none" )
|
||||
{
|
||||
if ( isdefined( self.zombie_can_forwardstep ) && self.zombie_can_forwardstep )
|
||||
self.sidesteptype = shouldforwardstep();
|
||||
}
|
||||
|
||||
if ( self.sidesteptype == "none" )
|
||||
return false;
|
||||
|
||||
self.desiredstepdir = getdesiredsidestepdir( self.sidesteptype );
|
||||
self.asd_name = "zm_" + self.sidesteptype + "_" + self.desiredstepdir;
|
||||
self.substate_index = self getanimsubstatefromasd( self.asd_name );
|
||||
self.stepanim = self getanimfromasd( self.asd_name, self.substate_index );
|
||||
|
||||
if ( !self checkroomforanim( self.stepanim ) )
|
||||
return false;
|
||||
|
||||
self.allowpain = 0;
|
||||
self animcustom( ::dosidestep );
|
||||
|
||||
self waittill( "sidestep_done" );
|
||||
|
||||
self.allowpain = 1;
|
||||
if ( isDefined( self.shouldsidestepfunc ) )
|
||||
{
|
||||
self.sidesteptype = self [[ self.shouldsidestepfunc ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.sidesteptype = shouldsidestep();
|
||||
}
|
||||
if ( self.sidesteptype == "none" )
|
||||
{
|
||||
if ( isDefined( self.zombie_can_forwardstep ) && self.zombie_can_forwardstep )
|
||||
{
|
||||
self.sidesteptype = shouldforwardstep();
|
||||
}
|
||||
}
|
||||
if ( self.sidesteptype == "none" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.desiredstepdir = getdesiredsidestepdir( self.sidesteptype );
|
||||
self.asd_name = "zm_" + self.sidesteptype + "_" + self.desiredstepdir;
|
||||
self.substate_index = self getanimsubstatefromasd( self.asd_name );
|
||||
self.stepanim = self getanimfromasd( self.asd_name, self.substate_index );
|
||||
if ( !self checkroomforanim( self.stepanim ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.allowpain = 0;
|
||||
self animcustom( ::dosidestep );
|
||||
self waittill( "sidestep_done" );
|
||||
self.allowpain = 1;
|
||||
}
|
||||
|
||||
getdesiredsidestepdir( sidesteptype )
|
||||
{
|
||||
if ( sidesteptype == "roll" || sidesteptype == "phase" )
|
||||
{
|
||||
self.desiredstepdir = "forward";
|
||||
return self.desiredstepdir;
|
||||
}
|
||||
if ( sidesteptype == "roll" || sidesteptype == "phase" )
|
||||
{
|
||||
self.desiredstepdir = "forward";
|
||||
return self.desiredstepdir;
|
||||
}
|
||||
/#
|
||||
assert( sidesteptype == "step", "Unsupported SideStepType" );
|
||||
assert( sidesteptype == "step", "Unsupported SideStepType" );
|
||||
#/
|
||||
randomroll = randomfloat( 1 );
|
||||
|
||||
if ( self.a.steppeddir < 0 )
|
||||
self.desiredstepdir = "right";
|
||||
else if ( self.a.steppeddir > 0 )
|
||||
self.desiredstepdir = "left";
|
||||
else if ( randomroll < 0.5 )
|
||||
self.desiredstepdir = "right";
|
||||
else
|
||||
self.desiredstepdir = "left";
|
||||
|
||||
return self.desiredstepdir;
|
||||
randomroll = randomfloat( 1 );
|
||||
if ( self.a.steppeddir < 0 )
|
||||
{
|
||||
self.desiredstepdir = "right";
|
||||
}
|
||||
else if ( self.a.steppeddir > 0 )
|
||||
{
|
||||
self.desiredstepdir = "left";
|
||||
}
|
||||
else if ( randomroll < 0,5 )
|
||||
{
|
||||
self.desiredstepdir = "right";
|
||||
}
|
||||
else
|
||||
{
|
||||
self.desiredstepdir = "left";
|
||||
}
|
||||
return self.desiredstepdir;
|
||||
}
|
||||
|
||||
checkroomforanim( stepanim )
|
||||
{
|
||||
if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
shouldsidestep()
|
||||
{
|
||||
if ( cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) )
|
||||
{
|
||||
if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0.7 )
|
||||
return "step";
|
||||
else
|
||||
return "roll";
|
||||
}
|
||||
|
||||
return "none";
|
||||
if ( cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) )
|
||||
{
|
||||
if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0,7 )
|
||||
{
|
||||
return "step";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "roll";
|
||||
}
|
||||
}
|
||||
return "none";
|
||||
}
|
||||
|
||||
cansidestep()
|
||||
{
|
||||
if ( !isdefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep )
|
||||
return false;
|
||||
|
||||
if ( gettime() - self.a.lastsidesteptime < 2000 )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( self.enemy ) )
|
||||
return false;
|
||||
|
||||
if ( self.a.pose != "stand" )
|
||||
return false;
|
||||
|
||||
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
|
||||
|
||||
if ( distsqfromenemy < 4096 )
|
||||
return false;
|
||||
|
||||
if ( distsqfromenemy > 1000000 )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
|
||||
return false;
|
||||
|
||||
if ( abs( self getmotionangle() ) > 15 )
|
||||
return false;
|
||||
|
||||
yaw = getyawtoorigin( self.enemy.origin );
|
||||
|
||||
if ( abs( yaw ) > 45 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
if ( !isDefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( ( getTime() - self.a.lastsidesteptime ) < 2000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self.a.pose != "stand" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( distsqfromenemy < 4096 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distsqfromenemy > 1000000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( abs( self getmotionangle() ) > 15 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
yaw = getyawtoorigin( self.enemy.origin );
|
||||
if ( abs( yaw ) > 45 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
shouldforwardstep()
|
||||
{
|
||||
if ( canforwardstep() && isplayer( self.enemy ) )
|
||||
return "phase";
|
||||
|
||||
return "none";
|
||||
if ( canforwardstep() && isplayer( self.enemy ) )
|
||||
{
|
||||
return "phase";
|
||||
}
|
||||
return "none";
|
||||
}
|
||||
|
||||
canforwardstep()
|
||||
{
|
||||
if ( isdefined( self.a.lastsidesteptime ) && gettime() - self.a.lastsidesteptime < 2000 )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( self.enemy ) )
|
||||
return false;
|
||||
|
||||
if ( self.a.pose != "stand" )
|
||||
return false;
|
||||
|
||||
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
|
||||
|
||||
if ( distsqfromenemy < 14400 )
|
||||
return false;
|
||||
|
||||
if ( distsqfromenemy > 5760000 )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
|
||||
return false;
|
||||
|
||||
if ( abs( self getmotionangle() ) > 15 )
|
||||
return false;
|
||||
|
||||
yaw = getyawtoorigin( self.enemy.origin );
|
||||
|
||||
if ( abs( yaw ) > 45 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
if ( isDefined( self.a.lastsidesteptime ) && ( getTime() - self.a.lastsidesteptime ) < 2000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self.a.pose != "stand" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( distsqfromenemy < 14400 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distsqfromenemy > 5760000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( abs( self getmotionangle() ) > 15 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
yaw = getyawtoorigin( self.enemy.origin );
|
||||
if ( abs( yaw ) > 45 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
dosidestep()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self playsidestepanim( self.stepanim, self.sidesteptype );
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self playsidestepanim( self.stepanim, self.sidesteptype );
|
||||
if ( self.desiredstepdir == "left" )
|
||||
{
|
||||
self.a.steppeddir--;
|
||||
|
||||
if ( self.desiredstepdir == "left" )
|
||||
self.a.steppeddir--;
|
||||
else
|
||||
self.a.steppeddir++;
|
||||
|
||||
self.a.lastsidesteptime = gettime();
|
||||
self notify( "sidestep_done" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.steppeddir++;
|
||||
}
|
||||
self.a.lastsidesteptime = getTime();
|
||||
self notify( "sidestep_done" );
|
||||
}
|
||||
|
||||
playsidestepanim( stepanim, sidesteptype )
|
||||
{
|
||||
self animmode( "gravity", 0 );
|
||||
self orientmode( "face angle", self.angles[1] );
|
||||
runblendouttime = 0.2;
|
||||
|
||||
if ( isdefined( self.sidestepfunc ) )
|
||||
self thread [[ self.sidestepfunc ]]( "step_anim", stepanim );
|
||||
|
||||
self setanimstatefromasd( self.asd_name, self.substate_index );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "step_anim" );
|
||||
|
||||
if ( isalive( self ) )
|
||||
self thread facelookaheadforabit();
|
||||
self animmode( "gravity", 0 );
|
||||
self orientmode( "face angle", self.angles[ 1 ] );
|
||||
runblendouttime = 0,2;
|
||||
if ( isDefined( self.sidestepfunc ) )
|
||||
{
|
||||
self thread [[ self.sidestepfunc ]]( "step_anim", stepanim );
|
||||
}
|
||||
self setanimstatefromasd( self.asd_name, self.substate_index );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "step_anim" );
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
self thread facelookaheadforabit();
|
||||
}
|
||||
}
|
||||
|
||||
facelookaheadforabit()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
lookaheadangles = vectortoangles( self.lookaheaddir );
|
||||
self orientmode( "face angle", lookaheadangles[1] );
|
||||
wait 0.2;
|
||||
self animmode( "normal", 0 );
|
||||
self orientmode( "face default" );
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
lookaheadangles = vectorToAngle( self.lookaheaddir );
|
||||
self orientmode( "face angle", lookaheadangles[ 1 ] );
|
||||
wait 0,2;
|
||||
self animmode( "normal", 0 );
|
||||
self orientmode( "face default" );
|
||||
}
|
||||
|
@ -1,21 +1,18 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self setflashbanged( 0 );
|
||||
|
||||
if ( isdefined( self.longdeathstarting ) )
|
||||
{
|
||||
self waittill( "killanimscript" );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self.a.disablepain )
|
||||
return;
|
||||
self setflashbanged( 0 );
|
||||
if ( isDefined( self.longdeathstarting ) )
|
||||
{
|
||||
self waittill( "killanimscript" );
|
||||
return;
|
||||
}
|
||||
if ( self.a.disablepain )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1,61 +1,61 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
moverun()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
if ( isdefined( self.needs_run_update ) && !self.needs_run_update )
|
||||
self waittill( "needs_run_update" );
|
||||
|
||||
if ( isdefined( self.is_inert ) && self.is_inert )
|
||||
{
|
||||
wait 0.1;
|
||||
return;
|
||||
}
|
||||
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromspeed();
|
||||
maps\mp\animscripts\zm_shared::donotetracksfortime( 0.05, "move_anim" );
|
||||
self.needs_run_update = 0;
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.needs_run_update ) && !self.needs_run_update )
|
||||
{
|
||||
self waittill( "needs_run_update" );
|
||||
}
|
||||
if ( isDefined( self.is_inert ) && self.is_inert )
|
||||
{
|
||||
wait 0,1;
|
||||
return;
|
||||
}
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromspeed();
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,05, "move_anim" );
|
||||
self.needs_run_update = 0;
|
||||
}
|
||||
|
||||
setanimstatefromspeed()
|
||||
{
|
||||
animstate = self append_missing_legs_suffix( "zm_move_" + self.zombie_move_speed );
|
||||
|
||||
if ( isdefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" )
|
||||
animstate = "zm_move_stumpy";
|
||||
|
||||
if ( isdefined( self.preserve_asd_substates ) && self.preserve_asd_substates && animstate == self getanimstatefromasd() )
|
||||
{
|
||||
substate = self getanimsubstatefromasd();
|
||||
self setanimstatefromasd( animstate, substate );
|
||||
}
|
||||
else
|
||||
self setanimstatefromasd( animstate );
|
||||
|
||||
if ( isdefined( self.setanimstatefromspeed ) )
|
||||
self [[ self.setanimstatefromspeed ]]( animstate, substate );
|
||||
animstate = self append_missing_legs_suffix( "zm_move_" + self.zombie_move_speed );
|
||||
if ( isDefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" )
|
||||
{
|
||||
animstate = "zm_move_stumpy";
|
||||
}
|
||||
if ( isDefined( self.preserve_asd_substates ) && self.preserve_asd_substates && animstate == self getanimstatefromasd() )
|
||||
{
|
||||
substate = self getanimsubstatefromasd();
|
||||
self setanimstatefromasd( animstate, substate );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setanimstatefromasd( animstate );
|
||||
}
|
||||
if ( isDefined( self.setanimstatefromspeed ) )
|
||||
{
|
||||
self [[ self.setanimstatefromspeed ]]( animstate, substate );
|
||||
}
|
||||
}
|
||||
|
||||
needsupdate()
|
||||
{
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
}
|
||||
|
||||
needsdelayedupdate()
|
||||
{
|
||||
self endon( "death" );
|
||||
|
||||
while ( isdefined( self.needs_run_update ) && self.needs_run_update )
|
||||
wait 0.1;
|
||||
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
self endon( "death" );
|
||||
while ( isDefined( self.needs_run_update ) && self.needs_run_update )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
}
|
||||
|
@ -1,39 +1,39 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "killanimscript" );
|
||||
self endon( "end_sequence" );
|
||||
|
||||
if ( !isdefined( self.codescripted["animState"] ) )
|
||||
return;
|
||||
|
||||
self startscriptedanim( self.codescripted["origin"], self.codescripted["angles"], self.codescripted["animState"], self.codescripted["animSubState"], self.codescripted["AnimMode"] );
|
||||
self.a.script = "scripted";
|
||||
self.codescripted = undefined;
|
||||
|
||||
if ( isdefined( self.deathstring_passed ) )
|
||||
self.deathstring = self.deathstring_passed;
|
||||
|
||||
self waittill( "killanimscript" );
|
||||
self endon( "death" );
|
||||
self notify( "killanimscript" );
|
||||
self endon( "end_sequence" );
|
||||
if ( !isDefined( self.codescripted[ "animState" ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self startscriptedanim( self.codescripted[ "origin" ], self.codescripted[ "angles" ], self.codescripted[ "animState" ], self.codescripted[ "animSubState" ], self.codescripted[ "AnimMode" ] );
|
||||
self.a.script = "scripted";
|
||||
self.codescripted = undefined;
|
||||
if ( isDefined( self.deathstring_passed ) )
|
||||
{
|
||||
self.deathstring = self.deathstring_passed;
|
||||
}
|
||||
self waittill( "killanimscript" );
|
||||
}
|
||||
|
||||
init( origin, angles, animstate, animsubstate, animmode )
|
||||
{
|
||||
self.codescripted["origin"] = origin;
|
||||
self.codescripted["angles"] = angles;
|
||||
self.codescripted["animState"] = animstate;
|
||||
self.codescripted["animSubState"] = animsubstate;
|
||||
|
||||
if ( isdefined( animmode ) )
|
||||
self.codescripted["AnimMode"] = animmode;
|
||||
else
|
||||
self.codescripted["AnimMode"] = "normal";
|
||||
self.codescripted[ "origin" ] = origin;
|
||||
self.codescripted[ "angles" ] = angles;
|
||||
self.codescripted[ "animState" ] = animstate;
|
||||
self.codescripted[ "animSubState" ] = animsubstate;
|
||||
if ( isDefined( animmode ) )
|
||||
{
|
||||
self.codescripted[ "AnimMode" ] = animmode;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.codescripted[ "AnimMode" ] = "normal";
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,460 +1,509 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
deleteatlimit()
|
||||
{
|
||||
wait 30.0;
|
||||
self delete();
|
||||
wait 30;
|
||||
self delete();
|
||||
}
|
||||
|
||||
lookatentity( looktargetentity, lookduration, lookspeed, eyesonly, interruptothers )
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
lookatposition( looktargetpos, lookduration, lookspeed, eyesonly, interruptothers )
|
||||
{
|
||||
/#
|
||||
assert( isai( self ), "Can only call this function on an AI character" );
|
||||
assert( isai( self ), "Can only call this function on an AI character" );
|
||||
#/
|
||||
/#
|
||||
assert( self.a.targetlookinitilized == 1, "LookAtPosition called on AI that lookThread was not called on" );
|
||||
assert( self.a.targetlookinitilized == 1, "LookAtPosition called on AI that lookThread was not called on" );
|
||||
#/
|
||||
/#
|
||||
assert( lookspeed == "casual" || lookspeed == "alert", "lookSpeed must be casual or alert" );
|
||||
if ( lookspeed != "casual" )
|
||||
{
|
||||
assert( lookspeed == "alert", "lookSpeed must be casual or alert" );
|
||||
}
|
||||
#/
|
||||
if ( !isdefined( interruptothers ) || interruptothers == "interrupt others" || gettime() > self.a.lookendtime )
|
||||
{
|
||||
self.a.looktargetpos = looktargetpos;
|
||||
self.a.lookendtime = gettime() + lookduration * 1000;
|
||||
|
||||
if ( lookspeed == "casual" )
|
||||
self.a.looktargetspeed = 800;
|
||||
else
|
||||
self.a.looktargetspeed = 1600;
|
||||
|
||||
if ( isdefined( eyesonly ) && eyesonly == "eyes only" )
|
||||
self notify( "eyes look now" );
|
||||
else
|
||||
self notify( "look now" );
|
||||
}
|
||||
if ( isDefined( interruptothers ) || interruptothers == "interrupt others" && getTime() > self.a.lookendtime )
|
||||
{
|
||||
self.a.looktargetpos = looktargetpos;
|
||||
self.a.lookendtime = getTime() + ( lookduration * 1000 );
|
||||
if ( lookspeed == "casual" )
|
||||
{
|
||||
self.a.looktargetspeed = 800;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.looktargetspeed = 1600;
|
||||
}
|
||||
if ( isDefined( eyesonly ) && eyesonly == "eyes only" )
|
||||
{
|
||||
self notify( "eyes look now" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self notify( "look now" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lookatanimations( leftanim, rightanim )
|
||||
{
|
||||
self.a.lookanimationleft = leftanim;
|
||||
self.a.lookanimationright = rightanim;
|
||||
self.a.lookanimationleft = leftanim;
|
||||
self.a.lookanimationright = rightanim;
|
||||
}
|
||||
|
||||
handledogsoundnotetracks( note )
|
||||
{
|
||||
if ( note == "sound_dogstep_run_default" || note == "dogstep_rf" || note == "dogstep_lf" )
|
||||
{
|
||||
self playsound( "fly_dog_step_run_default" );
|
||||
return true;
|
||||
}
|
||||
|
||||
prefix = getsubstr( note, 0, 5 );
|
||||
|
||||
if ( prefix != "sound" )
|
||||
return false;
|
||||
|
||||
alias = "aml" + getsubstr( note, 5 );
|
||||
|
||||
if ( isalive( self ) )
|
||||
self thread play_sound_on_tag_endon_death( alias, "tag_eye" );
|
||||
else
|
||||
self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) );
|
||||
|
||||
return true;
|
||||
if ( note != "sound_dogstep_run_default" || note == "dogstep_rf" && note == "dogstep_lf" )
|
||||
{
|
||||
self playsound( "fly_dog_step_run_default" );
|
||||
return 1;
|
||||
}
|
||||
prefix = getsubstr( note, 0, 5 );
|
||||
if ( prefix != "sound" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
alias = "aml" + getsubstr( note, 5 );
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
self thread play_sound_on_tag_endon_death( alias, "tag_eye" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
growling()
|
||||
{
|
||||
return isdefined( self.script_growl );
|
||||
return isDefined( self.script_growl );
|
||||
}
|
||||
|
||||
registernotetracks()
|
||||
{
|
||||
anim.notetracks["anim_pose = \"stand\""] = ::notetrackposestand;
|
||||
anim.notetracks["anim_pose = \"crouch\""] = ::notetrackposecrouch;
|
||||
anim.notetracks["anim_movement = \"stop\""] = ::notetrackmovementstop;
|
||||
anim.notetracks["anim_movement = \"walk\""] = ::notetrackmovementwalk;
|
||||
anim.notetracks["anim_movement = \"run\""] = ::notetrackmovementrun;
|
||||
anim.notetracks["anim_alertness = causal"] = ::notetrackalertnesscasual;
|
||||
anim.notetracks["anim_alertness = alert"] = ::notetrackalertnessalert;
|
||||
anim.notetracks["gravity on"] = ::notetrackgravity;
|
||||
anim.notetracks["gravity off"] = ::notetrackgravity;
|
||||
anim.notetracks["gravity code"] = ::notetrackgravity;
|
||||
anim.notetracks["bodyfall large"] = ::notetrackbodyfall;
|
||||
anim.notetracks["bodyfall small"] = ::notetrackbodyfall;
|
||||
anim.notetracks["footstep"] = ::notetrackfootstep;
|
||||
anim.notetracks["step"] = ::notetrackfootstep;
|
||||
anim.notetracks["footstep_right_large"] = ::notetrackfootstep;
|
||||
anim.notetracks["footstep_right_small"] = ::notetrackfootstep;
|
||||
anim.notetracks["footstep_left_large"] = ::notetrackfootstep;
|
||||
anim.notetracks["footstep_left_small"] = ::notetrackfootstep;
|
||||
anim.notetracks["footscrape"] = ::notetrackfootscrape;
|
||||
anim.notetracks["land"] = ::notetrackland;
|
||||
anim.notetracks["start_ragdoll"] = ::notetrackstartragdoll;
|
||||
anim.notetracks[ "anim_pose = "stand"" ] = ::notetrackposestand;
|
||||
anim.notetracks[ "anim_pose = "crouch"" ] = ::notetrackposecrouch;
|
||||
anim.notetracks[ "anim_movement = "stop"" ] = ::notetrackmovementstop;
|
||||
anim.notetracks[ "anim_movement = "walk"" ] = ::notetrackmovementwalk;
|
||||
anim.notetracks[ "anim_movement = "run"" ] = ::notetrackmovementrun;
|
||||
anim.notetracks[ "anim_alertness = causal" ] = ::notetrackalertnesscasual;
|
||||
anim.notetracks[ "anim_alertness = alert" ] = ::notetrackalertnessalert;
|
||||
anim.notetracks[ "gravity on" ] = ::notetrackgravity;
|
||||
anim.notetracks[ "gravity off" ] = ::notetrackgravity;
|
||||
anim.notetracks[ "gravity code" ] = ::notetrackgravity;
|
||||
anim.notetracks[ "bodyfall large" ] = ::notetrackbodyfall;
|
||||
anim.notetracks[ "bodyfall small" ] = ::notetrackbodyfall;
|
||||
anim.notetracks[ "footstep" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "step" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_right_large" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_right_small" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_left_large" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_left_small" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footscrape" ] = ::notetrackfootscrape;
|
||||
anim.notetracks[ "land" ] = ::notetrackland;
|
||||
anim.notetracks[ "start_ragdoll" ] = ::notetrackstartragdoll;
|
||||
}
|
||||
|
||||
notetrackstopanim( note, flagname )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
notetrackstartragdoll( note, flagname )
|
||||
{
|
||||
if ( isdefined( self.noragdoll ) )
|
||||
return;
|
||||
|
||||
self unlink();
|
||||
self startragdoll();
|
||||
if ( isDefined( self.noragdoll ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
self startragdoll();
|
||||
}
|
||||
|
||||
notetrackmovementstop( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
self.a.movement = "stop";
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackmovementwalk( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
self.a.movement = "walk";
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "walk";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackmovementrun( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
self.a.movement = "run";
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "run";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackalertnesscasual( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
self.a.alertness = "casual";
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.alertness = "casual";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackalertnessalert( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
self.a.alertness = "alert";
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.alertness = "alert";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackposestand( note, flagname )
|
||||
{
|
||||
self.a.pose = "stand";
|
||||
self notify( "entered_pose" + "stand" );
|
||||
self.a.pose = "stand";
|
||||
self notify( "entered_pose" + "stand" );
|
||||
}
|
||||
|
||||
notetrackposecrouch( note, flagname )
|
||||
{
|
||||
self.a.pose = "crouch";
|
||||
self notify( "entered_pose" + "crouch" );
|
||||
|
||||
if ( self.a.crouchpain )
|
||||
{
|
||||
self.a.crouchpain = 0;
|
||||
self.health = 150;
|
||||
}
|
||||
self.a.pose = "crouch";
|
||||
self notify( "entered_pose" + "crouch" );
|
||||
if ( self.a.crouchpain )
|
||||
{
|
||||
self.a.crouchpain = 0;
|
||||
self.health = 150;
|
||||
}
|
||||
}
|
||||
|
||||
notetrackgravity( note, flagname )
|
||||
{
|
||||
if ( issubstr( note, "on" ) )
|
||||
self animmode( "gravity" );
|
||||
else if ( issubstr( note, "off" ) )
|
||||
{
|
||||
self animmode( "nogravity" );
|
||||
self.nogravity = 1;
|
||||
}
|
||||
else if ( issubstr( note, "code" ) )
|
||||
{
|
||||
self animmode( "none" );
|
||||
self.nogravity = undefined;
|
||||
}
|
||||
if ( issubstr( note, "on" ) )
|
||||
{
|
||||
self animmode( "gravity" );
|
||||
}
|
||||
else if ( issubstr( note, "off" ) )
|
||||
{
|
||||
self animmode( "nogravity" );
|
||||
self.nogravity = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( note, "code" ) )
|
||||
{
|
||||
self animmode( "none" );
|
||||
self.nogravity = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notetrackbodyfall( note, flagname )
|
||||
{
|
||||
if ( isdefined( self.groundtype ) )
|
||||
groundtype = self.groundtype;
|
||||
else
|
||||
groundtype = "dirt";
|
||||
|
||||
if ( issubstr( note, "large" ) )
|
||||
self playsound( "fly_bodyfall_large_" + groundtype );
|
||||
else if ( issubstr( note, "small" ) )
|
||||
self playsound( "fly_bodyfall_small_" + groundtype );
|
||||
if ( isDefined( self.groundtype ) )
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = "dirt";
|
||||
}
|
||||
if ( issubstr( note, "large" ) )
|
||||
{
|
||||
self playsound( "fly_bodyfall_large_" + groundtype );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( note, "small" ) )
|
||||
{
|
||||
self playsound( "fly_bodyfall_small_" + groundtype );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notetrackfootstep( note, flagname )
|
||||
{
|
||||
if ( issubstr( note, "left" ) )
|
||||
playfootstep( "J_Ball_LE" );
|
||||
else
|
||||
playfootstep( "J_BALL_RI" );
|
||||
|
||||
if ( !level.clientscripts )
|
||||
self playsound( "fly_gear_run" );
|
||||
if ( issubstr( note, "left" ) )
|
||||
{
|
||||
playfootstep( "J_Ball_LE" );
|
||||
}
|
||||
else
|
||||
{
|
||||
playfootstep( "J_BALL_RI" );
|
||||
}
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
self playsound( "fly_gear_run" );
|
||||
}
|
||||
}
|
||||
|
||||
notetrackfootscrape( note, flagname )
|
||||
{
|
||||
if ( isdefined( self.groundtype ) )
|
||||
groundtype = self.groundtype;
|
||||
else
|
||||
groundtype = "dirt";
|
||||
|
||||
self playsound( "fly_step_scrape_" + groundtype );
|
||||
if ( isDefined( self.groundtype ) )
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = "dirt";
|
||||
}
|
||||
self playsound( "fly_step_scrape_" + groundtype );
|
||||
}
|
||||
|
||||
notetrackland( note, flagname )
|
||||
{
|
||||
if ( isdefined( self.groundtype ) )
|
||||
groundtype = self.groundtype;
|
||||
else
|
||||
groundtype = "dirt";
|
||||
|
||||
self playsound( "fly_land_npc_" + groundtype );
|
||||
if ( isDefined( self.groundtype ) )
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = "dirt";
|
||||
}
|
||||
self playsound( "fly_land_npc_" + groundtype );
|
||||
}
|
||||
|
||||
handlenotetrack( note, flagname, customfunction, var1 )
|
||||
{
|
||||
if ( isai( self ) && self.isdog )
|
||||
{
|
||||
if ( handledogsoundnotetracks( note ) )
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
notetrackfunc = anim.notetracks[note];
|
||||
|
||||
if ( isdefined( notetrackfunc ) )
|
||||
return [[ notetrackfunc ]]( note, flagname );
|
||||
}
|
||||
|
||||
switch ( note )
|
||||
{
|
||||
case "undefined":
|
||||
case "finish":
|
||||
case "end":
|
||||
if ( isai( self ) && self.a.pose == "back" )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return note;
|
||||
case "swish small":
|
||||
self thread play_sound_in_space( "fly_gear_enemy", self gettagorigin( "TAG_WEAPON_RIGHT" ) );
|
||||
break;
|
||||
case "swish large":
|
||||
self thread play_sound_in_space( "fly_gear_enemy_large", self gettagorigin( "TAG_WEAPON_RIGHT" ) );
|
||||
break;
|
||||
case "no death":
|
||||
self.a.nodeath = 1;
|
||||
break;
|
||||
case "no pain":
|
||||
self.allowpain = 0;
|
||||
break;
|
||||
case "allow pain":
|
||||
self.allowpain = 1;
|
||||
break;
|
||||
case "anim_melee = right":
|
||||
case "anim_melee = \"right\"":
|
||||
self.a.meleestate = "right";
|
||||
break;
|
||||
case "anim_melee = left":
|
||||
case "anim_melee = \"left\"":
|
||||
self.a.meleestate = "left";
|
||||
break;
|
||||
case "swap taghelmet to tagleft":
|
||||
if ( isdefined( self.hatmodel ) )
|
||||
{
|
||||
if ( isdefined( self.helmetsidemodel ) )
|
||||
{
|
||||
self detach( self.helmetsidemodel, "TAG_HELMETSIDE" );
|
||||
self.helmetsidemodel = undefined;
|
||||
}
|
||||
|
||||
self detach( self.hatmodel, "" );
|
||||
self attach( self.hatmodel, "TAG_WEAPON_LEFT" );
|
||||
self.hatmodel = undefined;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
if ( isdefined( customfunction ) )
|
||||
{
|
||||
if ( !isdefined( var1 ) )
|
||||
return [[ customfunction ]]( note );
|
||||
else
|
||||
return [[ customfunction ]]( note, var1 );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
if ( isai( self ) && self.isdog )
|
||||
{
|
||||
if ( handledogsoundnotetracks( note ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
notetrackfunc = anim.notetracks[ note ];
|
||||
if ( isDefined( notetrackfunc ) )
|
||||
{
|
||||
return [[ notetrackfunc ]]( note, flagname );
|
||||
}
|
||||
}
|
||||
switch( note )
|
||||
{
|
||||
case "end":
|
||||
case "finish":
|
||||
case "undefined":
|
||||
if ( isai( self ) && self.a.pose == "back" )
|
||||
{
|
||||
}
|
||||
return note;
|
||||
case "swish small":
|
||||
self thread play_sound_in_space( "fly_gear_enemy", self gettagorigin( "TAG_WEAPON_RIGHT" ) );
|
||||
break;
|
||||
case "swish large":
|
||||
self thread play_sound_in_space( "fly_gear_enemy_large", self gettagorigin( "TAG_WEAPON_RIGHT" ) );
|
||||
break;
|
||||
case "no death":
|
||||
self.a.nodeath = 1;
|
||||
break;
|
||||
case "no pain":
|
||||
self.allowpain = 0;
|
||||
break;
|
||||
case "allow pain":
|
||||
self.allowpain = 1;
|
||||
break;
|
||||
case "anim_melee = "right"":
|
||||
case "anim_melee = right":
|
||||
self.a.meleestate = "right";
|
||||
break;
|
||||
case "anim_melee = "left"":
|
||||
case "anim_melee = left":
|
||||
self.a.meleestate = "left";
|
||||
break;
|
||||
case "swap taghelmet to tagleft":
|
||||
if ( isDefined( self.hatmodel ) )
|
||||
{
|
||||
if ( isDefined( self.helmetsidemodel ) )
|
||||
{
|
||||
self detach( self.helmetsidemodel, "TAG_HELMETSIDE" );
|
||||
self.helmetsidemodel = undefined;
|
||||
}
|
||||
self detach( self.hatmodel, "" );
|
||||
self attach( self.hatmodel, "TAG_WEAPON_LEFT" );
|
||||
self.hatmodel = undefined;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if ( isDefined( customfunction ) )
|
||||
{
|
||||
if ( !isDefined( var1 ) )
|
||||
{
|
||||
return [[ customfunction ]]( note );
|
||||
}
|
||||
else
|
||||
{
|
||||
return [[ customfunction ]]( note, var1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracks( flagname, customfunction, var1 )
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
self waittill( flagname, note );
|
||||
|
||||
if ( !isdefined( note ) )
|
||||
note = "undefined";
|
||||
|
||||
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
||||
|
||||
if ( isdefined( val ) )
|
||||
return val;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( flagname, note );
|
||||
if ( !isDefined( note ) )
|
||||
{
|
||||
note = "undefined";
|
||||
}
|
||||
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
||||
if ( isDefined( val ) )
|
||||
{
|
||||
return val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
if ( isdefined( killstring ) )
|
||||
self endon( killstring );
|
||||
|
||||
self endon( "killanimscript" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
time = gettime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = gettime() - time;
|
||||
|
||||
if ( timetaken < 0.05 )
|
||||
{
|
||||
time = gettime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = gettime() - time;
|
||||
|
||||
if ( timetaken < 0.05 )
|
||||
{
|
||||
if ( isDefined( killstring ) )
|
||||
{
|
||||
self endon( killstring );
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
for ( ;; )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
/#
|
||||
println( gettime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
#/
|
||||
wait( 0.05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
wait ( 0,05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforever( flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
||||
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 )
|
||||
{
|
||||
ent endon( "stop_notetracks" );
|
||||
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
||||
ent endon( "stop_notetracks" );
|
||||
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortime( time, flagname, customfunction, var1 )
|
||||
{
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeendnotify( time )
|
||||
{
|
||||
wait( time );
|
||||
self notify( "stop_notetracks" );
|
||||
wait time;
|
||||
self notify( "stop_notetracks" );
|
||||
}
|
||||
|
||||
playfootstep( foot )
|
||||
{
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
if ( !isai( self ) )
|
||||
{
|
||||
self playsound( "fly_step_run_dirt" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
groundtype = undefined;
|
||||
|
||||
if ( !isdefined( self.groundtype ) )
|
||||
{
|
||||
if ( !isdefined( self.lastgroundtype ) )
|
||||
{
|
||||
if ( !level.clientscripts )
|
||||
self playsound( "fly_step_run_dirt" );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
groundtype = self.lastgroundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
self.lastgroundtype = self.groundtype;
|
||||
}
|
||||
|
||||
if ( !level.clientscripts )
|
||||
self playsound( "fly_step_run_" + groundtype );
|
||||
|
||||
[[ anim.optionalstepeffectfunction ]]( foot, groundtype );
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
if ( !isai( self ) )
|
||||
{
|
||||
self playsound( "fly_step_run_dirt" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
groundtype = undefined;
|
||||
if ( !isDefined( self.groundtype ) )
|
||||
{
|
||||
if ( !isDefined( self.lastgroundtype ) )
|
||||
{
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
self playsound( "fly_step_run_dirt" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
groundtype = self.lastgroundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
self.lastgroundtype = self.groundtype;
|
||||
}
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
self playsound( "fly_step_run_" + groundtype );
|
||||
}
|
||||
[[ anim.optionalstepeffectfunction ]]( foot, groundtype );
|
||||
}
|
||||
|
||||
playfootstepeffect( foot, groundtype )
|
||||
{
|
||||
if ( level.clientscripts )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < anim.optionalstepeffects.size; i++ )
|
||||
{
|
||||
if ( isdefined( self.fire_footsteps ) && self.fire_footsteps )
|
||||
groundtype = "fire";
|
||||
|
||||
if ( groundtype != anim.optionalstepeffects[i] )
|
||||
continue;
|
||||
|
||||
org = self gettagorigin( foot );
|
||||
playfx( level._effect["step_" + anim.optionalstepeffects[i]], org, org + vectorscale( ( 0, 0, 1 ), 100.0 ) );
|
||||
return;
|
||||
}
|
||||
if ( level.clientscripts )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < anim.optionalstepeffects.size )
|
||||
{
|
||||
if ( isDefined( self.fire_footsteps ) && self.fire_footsteps )
|
||||
{
|
||||
groundtype = "fire";
|
||||
}
|
||||
if ( groundtype != anim.optionalstepeffects[ i ] )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
org = self gettagorigin( foot );
|
||||
playfx( level._effect[ "step_" + anim.optionalstepeffects[ i ] ], org, org + vectorScale( ( 0, 0, 1 ), 100 ) );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
movetooriginovertime( origin, time )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
if ( distancesquared( self.origin, origin ) > 256 && !self maymovetopoint( origin ) )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
if ( distancesquared( self.origin, origin ) > 256 && !self maymovetopoint( origin ) )
|
||||
{
|
||||
/#
|
||||
println( "^1Warning: AI starting behavior for node at " + origin + " but could not move to that point." );
|
||||
println( "^1Warning: AI starting behavior for node at " + origin + " but could not move to that point." );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
|
||||
self.keepclaimednodeingoal = 1;
|
||||
offset = self.origin - origin;
|
||||
frames = int( time * 20 );
|
||||
offsetreduction = vectorscale( offset, 1.0 / frames );
|
||||
|
||||
for ( i = 0; i < frames; i++ )
|
||||
{
|
||||
offset -= offsetreduction;
|
||||
self teleport( origin + offset );
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self.keepclaimednodeingoal = 0;
|
||||
return;
|
||||
}
|
||||
self.keepclaimednodeingoal = 1;
|
||||
offset = self.origin - origin;
|
||||
frames = int( time * 20 );
|
||||
offsetreduction = vectorScale( offset, 1 / frames );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
offset -= offsetreduction;
|
||||
self teleport( origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
self.keepclaimednodeingoal = 0;
|
||||
}
|
||||
|
||||
returntrue()
|
||||
{
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,27 +1,26 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\zm_utility;
|
||||
#include maps\mp\animscripts\zm_shared;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( level.ignore_stop_func ) )
|
||||
{
|
||||
if ( self [[ level.ignore_stop_func ]]() )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !self hasanimstatefromasd( "zm_idle" ) )
|
||||
return;
|
||||
|
||||
animstate = maps\mp\animscripts\zm_utility::append_missing_legs_suffix( "zm_idle" );
|
||||
self setanimstatefromasd( animstate );
|
||||
maps\mp\animscripts\zm_shared::donotetracks( "idle_anim" );
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( level.ignore_stop_func ) )
|
||||
{
|
||||
if ( self [[ level.ignore_stop_func ]]() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( !self hasanimstatefromasd( "zm_idle" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
animstate = maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_idle" );
|
||||
self setanimstatefromasd( animstate );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "idle_anim" );
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,6 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,215 +1,209 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_audio;
|
||||
#include maps\mp\gametypes_zm\_globallogic;
|
||||
#include maps\mp\gametypes_zm\_globallogic_player;
|
||||
#include maps\mp\gametypes_zm\_globallogic_actor;
|
||||
#include maps\mp\gametypes_zm\_hostmigration;
|
||||
#include maps/mp/gametypes_zm/_hostmigration;
|
||||
#include maps/mp/gametypes_zm/_globallogic_actor;
|
||||
#include maps/mp/gametypes_zm/_globallogic_player;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/_audio;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
codecallback_startgametype()
|
||||
codecallback_startgametype() //checked matches cerberus output
|
||||
{
|
||||
if ( !isdefined( level.gametypestarted ) || !level.gametypestarted )
|
||||
{
|
||||
[[ level.callbackstartgametype ]]();
|
||||
level.gametypestarted = 1;
|
||||
}
|
||||
if ( !isDefined( level.gametypestarted ) || !level.gametypestarted )
|
||||
{
|
||||
[[ level.callbackstartgametype ]]();
|
||||
level.gametypestarted = 1;
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_finalizeinitialization()
|
||||
codecallback_finalizeinitialization() //checked matches cerberus output
|
||||
{
|
||||
maps\mp\_utility::callback( "on_finalize_initialization" );
|
||||
maps/mp/_utility::callback( "on_finalize_initialization" );
|
||||
}
|
||||
|
||||
codecallback_playerconnect()
|
||||
codecallback_playerconnect() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread maps\mp\_audio::monitor_player_sprint();
|
||||
[[ level.callbackplayerconnect ]]();
|
||||
self endon( "disconnect" );
|
||||
self thread maps/mp/_audio::monitor_player_sprint();
|
||||
[[ level.callbackplayerconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_playerdisconnect()
|
||||
codecallback_playerdisconnect() //checked matches cerberus output
|
||||
{
|
||||
self notify( "disconnect" );
|
||||
client_num = self getentitynumber();
|
||||
[[ level.callbackplayerdisconnect ]]();
|
||||
self notify( "disconnect" );
|
||||
level notify( "disconnect" );
|
||||
client_num = self getentitynumber();
|
||||
[[ level.callbackplayerdisconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigration()
|
||||
codecallback_hostmigration() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_HostMigration****" );
|
||||
println( "****CodeCallback_HostMigration****" );
|
||||
#/
|
||||
[[ level.callbackhostmigration ]]();
|
||||
*/
|
||||
[[ level.callbackhostmigration ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigrationsave()
|
||||
codecallback_hostmigrationsave() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_HostMigrationSave****" );
|
||||
println( "****CodeCallback_HostMigrationSave****" );
|
||||
#/
|
||||
[[ level.callbackhostmigrationsave ]]();
|
||||
*/
|
||||
[[ level.callbackhostmigrationsave ]]();
|
||||
}
|
||||
|
||||
codecallback_prehostmigrationsave()
|
||||
codecallback_playermigrated() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_PreHostMigrationSave****" );
|
||||
println( "****CodeCallback_PlayerMigrated****" );
|
||||
#/
|
||||
[[ level.callbackprehostmigrationsave ]]();
|
||||
*/
|
||||
[[ level.callbackplayermigrated ]]();
|
||||
}
|
||||
|
||||
codecallback_playermigrated()
|
||||
codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
}
|
||||
|
||||
codecallback_playerkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayermelee ]]( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit );
|
||||
}
|
||||
|
||||
codecallback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //checked matches cerberus output
|
||||
{
|
||||
[[ level.callbackactordamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
}
|
||||
|
||||
codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset ) //checked matches cerberus output
|
||||
{
|
||||
[[ level.callbackactorkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset );
|
||||
}
|
||||
|
||||
codecallback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname ) //checked matches cerberus output
|
||||
{
|
||||
[[ level.callbackvehicledamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname );
|
||||
}
|
||||
|
||||
codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset ) //checked matches cerberus output
|
||||
{
|
||||
}
|
||||
|
||||
codecallback_faceeventnotify( notify_msg, ent ) //checked matches cerberus output
|
||||
{
|
||||
if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isDefined( level.face_event_handler ) && isDefined( level.face_event_handler.events[ notify_msg ] ) )
|
||||
{
|
||||
ent sendfaceevent( level.face_event_handler.events[ notify_msg ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_menuresponse( action, arg ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( level.menuresponsequeue ) )
|
||||
{
|
||||
level.menuresponsequeue = [];
|
||||
level thread menuresponsequeuepump();
|
||||
}
|
||||
index = level.menuresponsequeue.size;
|
||||
level.menuresponsequeue[ index ] = spawnstruct();
|
||||
level.menuresponsequeue[ index ].action = action;
|
||||
level.menuresponsequeue[ index ].arg = arg;
|
||||
level.menuresponsequeue[ index ].ent = self;
|
||||
level notify( "menuresponse_queue" );
|
||||
}
|
||||
|
||||
menuresponsequeuepump() //checked changed to match cerberus output
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "menuresponse_queue" );
|
||||
level.menuresponsequeue[ 0 ].ent notify( "menuresponse", level.menuresponsequeue[0].action, level.menuresponsequeue[0].arg );
|
||||
arrayremoveindex( level.menuresponsequeue, 0, 0 );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
setupcallbacks() //checked matches cerberus output
|
||||
{
|
||||
setdefaultcallbacks();
|
||||
level.idflags_radius = 1;
|
||||
level.idflags_no_armor = 2;
|
||||
level.idflags_no_knockback = 4;
|
||||
level.idflags_penetration = 8;
|
||||
level.idflags_destructible_entity = 16;
|
||||
level.idflags_shield_explosive_impact = 32;
|
||||
level.idflags_shield_explosive_impact_huge = 64;
|
||||
level.idflags_shield_explosive_splash = 128;
|
||||
level.idflags_no_team_protection = 256;
|
||||
level.idflags_no_protection = 512;
|
||||
level.idflags_passthru = 1024;
|
||||
}
|
||||
|
||||
setdefaultcallbacks() //checked matches cerberus output
|
||||
{
|
||||
level.callbackstartgametype = maps/mp/gametypes_zm/_globallogic::callback_startgametype;
|
||||
level.callbackplayerconnect = maps/mp/gametypes_zm/_globallogic_player::callback_playerconnect;
|
||||
level.callbackplayerdisconnect = maps/mp/gametypes_zm/_globallogic_player::callback_playerdisconnect;
|
||||
level.callbackplayerdamage = maps/mp/gametypes_zm/_globallogic_player::callback_playerdamage;
|
||||
level.callbackplayerkilled = maps/mp/gametypes_zm/_globallogic_player::callback_playerkilled;
|
||||
level.callbackplayermelee = maps/mp/gametypes_zm/_globallogic_player::callback_playermelee;
|
||||
level.callbackplayerlaststand = maps/mp/gametypes_zm/_globallogic_player::callback_playerlaststand;
|
||||
level.callbackactordamage = maps/mp/gametypes_zm/_globallogic_actor::callback_actordamage;
|
||||
level.callbackactorkilled = maps/mp/gametypes_zm/_globallogic_actor::callback_actorkilled;
|
||||
level.callbackplayermigrated = maps/mp/gametypes_zm/_globallogic_player::callback_playermigrated;
|
||||
level.callbackhostmigration = maps/mp/gametypes_zm/_hostmigration::callback_hostmigration;
|
||||
level.callbackhostmigrationsave = maps/mp/gametypes_zm/_hostmigration::callback_hostmigrationsave;
|
||||
}
|
||||
|
||||
abortlevel() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_PlayerMigrated****" );
|
||||
println( "ERROR: Aborting level - gametype is not supported" );
|
||||
#/
|
||||
[[ level.callbackplayermigrated ]]();
|
||||
*/
|
||||
level.callbackstartgametype = ::callbackvoid;
|
||||
level.callbackplayerconnect = ::callbackvoid;
|
||||
level.callbackplayerdisconnect = ::callbackvoid;
|
||||
level.callbackplayerdamage = ::callbackvoid;
|
||||
level.callbackplayerkilled = ::callbackvoid;
|
||||
level.callbackplayerlaststand = ::callbackvoid;
|
||||
level.callbackplayermelee = ::callbackvoid;
|
||||
level.callbackactordamage = ::callbackvoid;
|
||||
level.callbackactorkilled = ::callbackvoid;
|
||||
level.callbackvehicledamage = ::callbackvoid;
|
||||
setdvar( "g_gametype", "dm" );
|
||||
exitlevel( 0 );
|
||||
}
|
||||
|
||||
codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex )
|
||||
codecallback_glasssmash( pos, dir ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
level notify( "glass_smash" );
|
||||
}
|
||||
|
||||
codecallback_playerkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration )
|
||||
callbackvoid() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayermelee ]]( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit );
|
||||
}
|
||||
|
||||
codecallback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex )
|
||||
{
|
||||
[[ level.callbackactordamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
}
|
||||
|
||||
codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset )
|
||||
{
|
||||
[[ level.callbackactorkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset );
|
||||
}
|
||||
|
||||
codecallback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname )
|
||||
{
|
||||
[[ level.callbackvehicledamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname );
|
||||
}
|
||||
|
||||
codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
codecallback_faceeventnotify( notify_msg, ent )
|
||||
{
|
||||
if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isdefined( level.face_event_handler ) && isdefined( level.face_event_handler.events[notify_msg] ) )
|
||||
ent sendfaceevent( level.face_event_handler.events[notify_msg] );
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_menuresponse( action, arg )
|
||||
{
|
||||
if ( !isdefined( level.menuresponsequeue ) )
|
||||
{
|
||||
level.menuresponsequeue = [];
|
||||
level thread menuresponsequeuepump();
|
||||
}
|
||||
|
||||
index = level.menuresponsequeue.size;
|
||||
level.menuresponsequeue[index] = spawnstruct();
|
||||
level.menuresponsequeue[index].action = action;
|
||||
level.menuresponsequeue[index].arg = arg;
|
||||
level.menuresponsequeue[index].ent = self;
|
||||
level notify( "menuresponse_queue" );
|
||||
}
|
||||
|
||||
menuresponsequeuepump()
|
||||
{
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "menuresponse_queue" );
|
||||
|
||||
do
|
||||
{
|
||||
level.menuresponsequeue[0].ent notify( "menuresponse", level.menuresponsequeue[0].action, level.menuresponsequeue[0].arg );
|
||||
arrayremoveindex( level.menuresponsequeue, 0, 0 );
|
||||
wait 0.05;
|
||||
}
|
||||
while ( level.menuresponsequeue.size > 0 );
|
||||
}
|
||||
}
|
||||
|
||||
setupcallbacks()
|
||||
{
|
||||
setdefaultcallbacks();
|
||||
level.idflags_radius = 1;
|
||||
level.idflags_no_armor = 2;
|
||||
level.idflags_no_knockback = 4;
|
||||
level.idflags_penetration = 8;
|
||||
level.idflags_destructible_entity = 16;
|
||||
level.idflags_shield_explosive_impact = 32;
|
||||
level.idflags_shield_explosive_impact_huge = 64;
|
||||
level.idflags_shield_explosive_splash = 128;
|
||||
level.idflags_no_team_protection = 256;
|
||||
level.idflags_no_protection = 512;
|
||||
level.idflags_passthru = 1024;
|
||||
}
|
||||
|
||||
setdefaultcallbacks()
|
||||
{
|
||||
level.callbackstartgametype = maps\mp\gametypes_zm\_globallogic::callback_startgametype;
|
||||
level.callbackplayerconnect = maps\mp\gametypes_zm\_globallogic_player::callback_playerconnect;
|
||||
level.callbackplayerdisconnect = maps\mp\gametypes_zm\_globallogic_player::callback_playerdisconnect;
|
||||
level.callbackplayerdamage = maps\mp\gametypes_zm\_globallogic_player::callback_playerdamage;
|
||||
level.callbackplayerkilled = maps\mp\gametypes_zm\_globallogic_player::callback_playerkilled;
|
||||
level.callbackplayermelee = maps\mp\gametypes_zm\_globallogic_player::callback_playermelee;
|
||||
level.callbackplayerlaststand = maps\mp\gametypes_zm\_globallogic_player::callback_playerlaststand;
|
||||
level.callbackactordamage = maps\mp\gametypes_zm\_globallogic_actor::callback_actordamage;
|
||||
level.callbackactorkilled = maps\mp\gametypes_zm\_globallogic_actor::callback_actorkilled;
|
||||
level.callbackplayermigrated = maps\mp\gametypes_zm\_globallogic_player::callback_playermigrated;
|
||||
level.callbackhostmigration = maps\mp\gametypes_zm\_hostmigration::callback_hostmigration;
|
||||
level.callbackhostmigrationsave = maps\mp\gametypes_zm\_hostmigration::callback_hostmigrationsave;
|
||||
level.callbackprehostmigrationsave = maps\mp\gametypes_zm\_hostmigration::callback_prehostmigrationsave;
|
||||
}
|
||||
|
||||
abortlevel()
|
||||
{
|
||||
/#
|
||||
println( "ERROR: Aborting level - gametype is not supported" );
|
||||
#/
|
||||
level.callbackstartgametype = ::callbackvoid;
|
||||
level.callbackplayerconnect = ::callbackvoid;
|
||||
level.callbackplayerdisconnect = ::callbackvoid;
|
||||
level.callbackplayerdamage = ::callbackvoid;
|
||||
level.callbackplayerkilled = ::callbackvoid;
|
||||
level.callbackplayermelee = ::callbackvoid;
|
||||
level.callbackplayerlaststand = ::callbackvoid;
|
||||
level.callbackactordamage = ::callbackvoid;
|
||||
level.callbackactorkilled = ::callbackvoid;
|
||||
level.callbackvehicledamage = ::callbackvoid;
|
||||
setdvar( "g_gametype", "dm" );
|
||||
exitlevel( 0 );
|
||||
}
|
||||
|
||||
codecallback_glasssmash( pos, dir )
|
||||
{
|
||||
level notify( "glass_smash", pos, dir );
|
||||
}
|
||||
|
||||
callbackvoid()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,19 +1,16 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
level.clientid = 0;
|
||||
level thread onplayerconnect();
|
||||
level.clientid = 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player.clientid = level.clientid;
|
||||
level.clientid++;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player.clientid = level.clientid;
|
||||
level.clientid++;
|
||||
}
|
||||
}
|
||||
|
@ -1,166 +1,160 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
precacheshader( "damage_feedback" );
|
||||
precacheshader( "damage_feedback_flak" );
|
||||
precacheshader( "damage_feedback_tac" );
|
||||
level thread onplayerconnect();
|
||||
precacheshader( "damage_feedback" );
|
||||
precacheshader( "damage_feedback_flak" );
|
||||
precacheshader( "damage_feedback_tac" );
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player.hud_damagefeedback = newdamageindicatorhudelem( player );
|
||||
player.hud_damagefeedback.horzalign = "center";
|
||||
player.hud_damagefeedback.vertalign = "middle";
|
||||
player.hud_damagefeedback.x = -12;
|
||||
player.hud_damagefeedback.y = -12;
|
||||
player.hud_damagefeedback.alpha = 0;
|
||||
player.hud_damagefeedback.archived = 1;
|
||||
player.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
player.hitsoundtracker = 1;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player.hud_damagefeedback = newdamageindicatorhudelem( player );
|
||||
player.hud_damagefeedback.horzalign = "center";
|
||||
player.hud_damagefeedback.vertalign = "middle";
|
||||
player.hud_damagefeedback.x = -12;
|
||||
player.hud_damagefeedback.y = -12;
|
||||
player.hud_damagefeedback.alpha = 0;
|
||||
player.hud_damagefeedback.archived = 1;
|
||||
player.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
player.hitsoundtracker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
updatedamagefeedback( mod, inflictor, perkfeedback )
|
||||
updatedamagefeedback( mod, inflictor, perkfeedback ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isplayer( self ) || sessionmodeiszombiesgame() )
|
||||
return;
|
||||
|
||||
if ( isdefined( mod ) && mod != "MOD_CRUSH" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_HIT_BY_OBJECT" )
|
||||
{
|
||||
if ( isdefined( inflictor ) && isdefined( inflictor.soundmod ) )
|
||||
{
|
||||
switch ( inflictor.soundmod )
|
||||
{
|
||||
case "player":
|
||||
self thread playhitsound( mod, "mpl_hit_alert" );
|
||||
break;
|
||||
case "heli":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_air" );
|
||||
break;
|
||||
case "hpm":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_hpm" );
|
||||
break;
|
||||
case "taser_spike":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_taser_spike" );
|
||||
break;
|
||||
case "straferun":
|
||||
case "dog":
|
||||
break;
|
||||
case "default_loud":
|
||||
self thread playhitsound( mod, "mpl_hit_heli_gunner" );
|
||||
break;
|
||||
default:
|
||||
self thread playhitsound( mod, "mpl_hit_alert_low" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
self thread playhitsound( mod, "mpl_hit_alert_low" );
|
||||
}
|
||||
|
||||
if ( isdefined( perkfeedback ) )
|
||||
{
|
||||
switch ( perkfeedback )
|
||||
{
|
||||
case "flakjacket":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 );
|
||||
break;
|
||||
case "tacticalMask":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
self.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
|
||||
self.hud_damagefeedback.alpha = 1;
|
||||
self.hud_damagefeedback fadeovertime( 1 );
|
||||
self.hud_damagefeedback.alpha = 0;
|
||||
if ( !isplayer( self ) || sessionmodeiszombiesgame() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( mod ) && mod != "MOD_CRUSH" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_HIT_BY_OBJECT" )
|
||||
{
|
||||
if ( isDefined( inflictor ) && isDefined( inflictor.soundmod ) )
|
||||
{
|
||||
switch( inflictor.soundmod )
|
||||
{
|
||||
case "player":
|
||||
self playlocalsound( "mpl_hit_alert" );
|
||||
break;
|
||||
case "heli":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_air" );
|
||||
break;
|
||||
case "hpm":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_hpm" );
|
||||
break;
|
||||
case "taser_spike":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_taser_spike" );
|
||||
break;
|
||||
case "dog":
|
||||
case "straferun":
|
||||
case "default_loud":
|
||||
self thread playhitsound( mod, "mpl_hit_heli_gunner" );
|
||||
break;
|
||||
default:
|
||||
self thread playhitsound( mod, "mpl_hit_alert_low" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self playlocalsound( "mpl_hit_alert_low" );
|
||||
}
|
||||
}
|
||||
if ( isDefined( perkfeedback ) )
|
||||
{
|
||||
switch( perkfeedback )
|
||||
{
|
||||
case "flakjacket":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 );
|
||||
break;
|
||||
case "tacticalMask":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else self.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
self.hud_damagefeedback.alpha = 1;
|
||||
self.hud_damagefeedback fadeovertime( 1 );
|
||||
self.hud_damagefeedback.alpha = 0;
|
||||
}
|
||||
}
|
||||
|
||||
playhitsound( mod, alert )
|
||||
playhitsound( mod, alert ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
if ( self.hitsoundtracker )
|
||||
{
|
||||
self.hitsoundtracker = 0;
|
||||
self playlocalsound( alert );
|
||||
wait 0.05;
|
||||
self.hitsoundtracker = 1;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
if ( self.hitsoundtracker )
|
||||
{
|
||||
self.hitsoundtracker = 0;
|
||||
self playlocalsound( alert );
|
||||
wait 0.05;
|
||||
self.hitsoundtracker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
updatespecialdamagefeedback( hitent )
|
||||
updatespecialdamagefeedback( hitent ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isplayer( self ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( hitent ) )
|
||||
return;
|
||||
|
||||
if ( !isplayer( hitent ) )
|
||||
return;
|
||||
|
||||
wait 0.05;
|
||||
|
||||
if ( !isdefined( self.directionalhitarray ) )
|
||||
{
|
||||
self.directionalhitarray = [];
|
||||
hitentnum = hitent getentitynumber();
|
||||
self.directionalhitarray[hitentnum] = 1;
|
||||
self thread sendhitspecialeventatframeend( hitent );
|
||||
}
|
||||
else
|
||||
{
|
||||
hitentnum = hitent getentitynumber();
|
||||
self.directionalhitarray[hitentnum] = 1;
|
||||
}
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( hitent ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isplayer( hitent ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait 0.05;
|
||||
if ( !isDefined( self.directionalhitarray ) )
|
||||
{
|
||||
self.directionalhitarray = [];
|
||||
hitentnum = hitent getentitynumber();
|
||||
self.directionalhitarray[ hitentnum ] = 1;
|
||||
self thread sendhitspecialeventatframeend( hitent );
|
||||
}
|
||||
else
|
||||
{
|
||||
hitentnum = hitent getentitynumber();
|
||||
self.directionalhitarray[ hitentnum ] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
sendhitspecialeventatframeend( hitent )
|
||||
sendhitspecialeventatframeend( hitent ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
enemyshit = 0;
|
||||
value = 1;
|
||||
entbitarray0 = 0;
|
||||
|
||||
for ( i = 0; i < 32; i++ )
|
||||
{
|
||||
if ( isdefined( self.directionalhitarray[i] ) && self.directionalhitarray[i] != 0 )
|
||||
{
|
||||
entbitarray0 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
|
||||
value *= 2;
|
||||
}
|
||||
|
||||
entbitarray1 = 0;
|
||||
|
||||
for ( i = 33; i < 64; i++ )
|
||||
{
|
||||
if ( isdefined( self.directionalhitarray[i] ) && self.directionalhitarray[i] != 0 )
|
||||
{
|
||||
entbitarray1 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
|
||||
value *= 2;
|
||||
}
|
||||
|
||||
if ( enemyshit )
|
||||
self directionalhitindicator( entbitarray0, entbitarray1 );
|
||||
|
||||
self.directionalhitarray = undefined;
|
||||
entbitarray0 = 0;
|
||||
entbitarray1 = 0;
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
enemyshit = 0;
|
||||
value = 1;
|
||||
entbitarray0 = 0;
|
||||
for ( i = 0; i < 32; i++ )
|
||||
{
|
||||
if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 )
|
||||
{
|
||||
entbitarray0 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
value *= 2;
|
||||
}
|
||||
entbitarray1 = 0;
|
||||
for ( i = 33; i < 64; i++ )
|
||||
{
|
||||
if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 )
|
||||
{
|
||||
entbitarray1 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
value *= 2;
|
||||
}
|
||||
if ( enemyshit )
|
||||
{
|
||||
self directionalhitindicator( entbitarray0, entbitarray1 );
|
||||
}
|
||||
self.directionalhitarray = undefined;
|
||||
entbitarray0 = 0;
|
||||
entbitarray1 = 0;
|
||||
}
|
||||
|
||||
|
@ -1,90 +1,102 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
/#
|
||||
for (;;)
|
||||
{
|
||||
updatedevsettingszm();
|
||||
wait 0.5;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
updatedevsettingszm();
|
||||
wait 0,5;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
updatedevsettingszm()
|
||||
{
|
||||
/#
|
||||
if ( level.players.size > 0 )
|
||||
{
|
||||
if ( getdvar( "r_streamDumpDistance" ) == "3" )
|
||||
{
|
||||
if ( !isdefined( level.streamdumpteamindex ) )
|
||||
level.streamdumpteamindex = 0;
|
||||
else
|
||||
level.streamdumpteamindex++;
|
||||
|
||||
numpoints = 0;
|
||||
spawnpoints = [];
|
||||
location = level.scr_zm_map_start_location;
|
||||
|
||||
if ( ( location == "default" || location == "" ) && isdefined( level.default_start_location ) )
|
||||
location = level.default_start_location;
|
||||
|
||||
match_string = level.scr_zm_ui_gametype + "_" + location;
|
||||
|
||||
if ( level.streamdumpteamindex < level.teams.size )
|
||||
{
|
||||
structs = getstructarray( "initial_spawn", "script_noteworthy" );
|
||||
|
||||
if ( isdefined( structs ) )
|
||||
{
|
||||
foreach ( struct in structs )
|
||||
{
|
||||
if ( isdefined( struct.script_string ) )
|
||||
{
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
|
||||
foreach ( token in tokens )
|
||||
{
|
||||
if ( token == match_string )
|
||||
spawnpoints[spawnpoints.size] = struct;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isdefined( spawnpoints ) || spawnpoints.size == 0 )
|
||||
spawnpoints = getstructarray( "initial_spawn_points", "targetname" );
|
||||
|
||||
if ( isdefined( spawnpoints ) )
|
||||
numpoints = spawnpoints.size;
|
||||
}
|
||||
|
||||
if ( numpoints == 0 )
|
||||
{
|
||||
setdvar( "r_streamDumpDistance", "0" );
|
||||
level.streamdumpteamindex = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
averageorigin = ( 0, 0, 0 );
|
||||
averageangles = ( 0, 0, 0 );
|
||||
|
||||
foreach ( spawnpoint in spawnpoints )
|
||||
{
|
||||
averageorigin += spawnpoint.origin / numpoints;
|
||||
averageangles += spawnpoint.angles / numpoints;
|
||||
}
|
||||
|
||||
level.players[0] setplayerangles( averageangles );
|
||||
level.players[0] setorigin( averageorigin );
|
||||
wait 0.05;
|
||||
setdvar( "r_streamDumpDistance", "2" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( level.players.size > 0 )
|
||||
{
|
||||
if ( getDvar( "r_streamDumpDistance" ) == "3" )
|
||||
{
|
||||
if ( !isDefined( level.streamdumpteamindex ) )
|
||||
{
|
||||
level.streamdumpteamindex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.streamdumpteamindex++;
|
||||
}
|
||||
numpoints = 0;
|
||||
spawnpoints = [];
|
||||
location = level.scr_zm_map_start_location;
|
||||
if ( location != "default" && location == "" && isDefined( level.default_start_location ) )
|
||||
{
|
||||
location = level.default_start_location;
|
||||
}
|
||||
match_string = ( level.scr_zm_ui_gametype + "_" ) + location;
|
||||
if ( level.streamdumpteamindex < level.teams.size )
|
||||
{
|
||||
structs = getstructarray( "initial_spawn", "script_noteworthy" );
|
||||
while ( isDefined( structs ) )
|
||||
{
|
||||
_a46 = structs;
|
||||
_k46 = getFirstArrayKey( _a46 );
|
||||
while ( isDefined( _k46 ) )
|
||||
{
|
||||
struct = _a46[ _k46 ];
|
||||
while ( isDefined( struct.script_string ) )
|
||||
{
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
_a51 = tokens;
|
||||
_k51 = getFirstArrayKey( _a51 );
|
||||
while ( isDefined( _k51 ) )
|
||||
{
|
||||
token = _a51[ _k51 ];
|
||||
if ( token == match_string )
|
||||
{
|
||||
spawnpoints[ spawnpoints.size ] = struct;
|
||||
}
|
||||
_k51 = getNextArrayKey( _a51, _k51 );
|
||||
}
|
||||
}
|
||||
_k46 = getNextArrayKey( _a46, _k46 );
|
||||
}
|
||||
}
|
||||
if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 )
|
||||
{
|
||||
spawnpoints = getstructarray( "initial_spawn_points", "targetname" );
|
||||
}
|
||||
if ( isDefined( spawnpoints ) )
|
||||
{
|
||||
numpoints = spawnpoints.size;
|
||||
}
|
||||
}
|
||||
if ( numpoints == 0 )
|
||||
{
|
||||
setdvar( "r_streamDumpDistance", "0" );
|
||||
level.streamdumpteamindex = -1;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
averageorigin = ( 0, 0, 0 );
|
||||
averageangles = ( 0, 0, 0 );
|
||||
_a80 = spawnpoints;
|
||||
_k80 = getFirstArrayKey( _a80 );
|
||||
while ( isDefined( _k80 ) )
|
||||
{
|
||||
spawnpoint = _a80[ _k80 ];
|
||||
averageorigin += spawnpoint.origin / numpoints;
|
||||
averageangles += spawnpoint.angles / numpoints;
|
||||
_k80 = getNextArrayKey( _a80, _k80 );
|
||||
}
|
||||
level.players[ 0 ] setplayerangles( averageangles );
|
||||
level.players[ 0 ] setorigin( averageorigin );
|
||||
wait 0,05;
|
||||
setdvar( "r_streamDumpDistance", "2" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +0,0 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,174 +1,204 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_globallogic_player;
|
||||
#include maps\mp\gametypes_zm\_globallogic_utils;
|
||||
#include maps\mp\gametypes_zm\_weapons;
|
||||
#include maps\mp\gametypes_zm\_damagefeedback;
|
||||
#include maps\mp\_challenges;
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes_zm/_damagefeedback;
|
||||
#include maps/mp/gametypes_zm/_weapons;
|
||||
#include maps/mp/gametypes_zm/_globallogic_utils;
|
||||
#include maps/mp/gametypes_zm/_globallogic_player;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex )
|
||||
callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output
|
||||
{
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( self.aiteam == "spectator" )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
return;
|
||||
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = gettime();
|
||||
eattacker = maps\mp\gametypes_zm\_globallogic_player::figureoutattacker( eattacker );
|
||||
|
||||
if ( !isdefined( vdir ) )
|
||||
idflags |= level.idflags_no_knockback;
|
||||
|
||||
friendly = 0;
|
||||
|
||||
if ( self.health == self.maxhealth || !isdefined( self.attackers ) )
|
||||
{
|
||||
self.attackers = [];
|
||||
self.attackerdata = [];
|
||||
self.attackerdamage = [];
|
||||
}
|
||||
|
||||
if ( maps\mp\gametypes_zm\_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) )
|
||||
smeansofdeath = "MOD_HEAD_SHOT";
|
||||
|
||||
if ( level.onlyheadshots )
|
||||
{
|
||||
if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" )
|
||||
return;
|
||||
else if ( smeansofdeath == "MOD_HEAD_SHOT" )
|
||||
idamage = 150;
|
||||
}
|
||||
|
||||
if ( sweapon == "none" && isdefined( einflictor ) )
|
||||
{
|
||||
if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
sweapon = "explodable_barrel_mp";
|
||||
else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
|
||||
if ( !( idflags & level.idflags_no_protection ) )
|
||||
{
|
||||
if ( isplayer( eattacker ) )
|
||||
eattacker.pers["participation"]++;
|
||||
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
|
||||
if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers["team"] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
return;
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
return;
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0.5 );
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isdefined( eattacker ) && isdefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isdefined( self.script_owner ) && isdefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) )
|
||||
eattacker thread maps\mp\gametypes_zm\_weapons::checkhit( sweapon );
|
||||
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isdefined( einflictor ) && isdefined( einflictor.iscooked ) )
|
||||
self.wascooked = gettime();
|
||||
else
|
||||
self.wascooked = undefined;
|
||||
|
||||
self.lastdamagewasfromenemy = isdefined( eattacker ) && eattacker != self;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
|
||||
if ( isdefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( sweapon != "artillery_mp" && ( !isdefined( einflictor ) || !isai( einflictor ) ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
eattacker thread maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.aiteam == "spectator" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = getTime();
|
||||
eattacker = maps/mp/gametypes_zm/_globallogic_player::figureoutattacker( eattacker );
|
||||
if ( !isDefined( vdir ) )
|
||||
{
|
||||
idflags |= level.idflags_no_knockback;
|
||||
}
|
||||
friendly = 0;
|
||||
if ( self.health == self.maxhealth || !isDefined( self.attackers ) )
|
||||
{
|
||||
self.attackers = [];
|
||||
self.attackerdata = [];
|
||||
self.attackerdamage = [];
|
||||
}
|
||||
if ( maps/mp/gametypes_zm/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) )
|
||||
{
|
||||
smeansofdeath = "MOD_HEAD_SHOT";
|
||||
}
|
||||
if ( level.onlyheadshots )
|
||||
{
|
||||
if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( smeansofdeath == "MOD_HEAD_SHOT" )
|
||||
{
|
||||
idamage = 150;
|
||||
}
|
||||
}
|
||||
if ( sweapon == "none" && isDefined( einflictor ) )
|
||||
{
|
||||
if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
{
|
||||
sweapon = "explodable_barrel_mp";
|
||||
}
|
||||
else if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
{
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
}
|
||||
if ( idflags & level.idflags_no_protection )
|
||||
{
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
eattacker.pers[ "participation" ]++;
|
||||
}
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers[ "team" ] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0,5 );
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
friendly = 1;
|
||||
}
|
||||
else if ( isDefined( eattacker ) && isDefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isDefined( self.script_owner ) && isDefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes/_weapons::checkhit( sweapon );
|
||||
}
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isDefined( einflictor ) && isDefined( einflictor.iscooked ) )
|
||||
{
|
||||
self.wascooked = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.wascooked = undefined;
|
||||
}
|
||||
if ( isDefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
self.lastdamagewasfromenemy = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
}
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
if ( isDefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( sweapon != "artillery_mp" && !isDefined( einflictor ) || !isai( einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
/#
|
||||
if ( getdvarint( "g_debugDamage" ) )
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + shitloc + ";" + boneindex + "\n" );
|
||||
if ( getDvarInt( "g_debugDamage" ) )
|
||||
{
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + shitloc + ";" + boneindex + "\n" );
|
||||
#/
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = self.aiteam;
|
||||
lpattackerteam = "";
|
||||
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
lpattacknum = eattacker getentitynumber();
|
||||
lpattackguid = eattacker getguid();
|
||||
lpattackname = eattacker.name;
|
||||
lpattackerteam = eattacker.pers["team"];
|
||||
}
|
||||
else
|
||||
{
|
||||
lpattacknum = -1;
|
||||
lpattackguid = "";
|
||||
lpattackname = "";
|
||||
lpattackerteam = "world";
|
||||
}
|
||||
|
||||
logprint( "AD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" );
|
||||
}
|
||||
}
|
||||
*/
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = self.aiteam;
|
||||
lpattackerteam = "";
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
lpattacknum = eattacker getentitynumber();
|
||||
lpattackguid = eattacker getguid();
|
||||
lpattackname = eattacker.name;
|
||||
lpattackerteam = eattacker.pers[ "team" ];
|
||||
}
|
||||
else
|
||||
{
|
||||
lpattacknum = -1;
|
||||
lpattackguid = "";
|
||||
lpattackname = "";
|
||||
lpattackerteam = "world";
|
||||
}
|
||||
logprint( "AD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" );
|
||||
}
|
||||
}
|
||||
|
||||
callback_actorkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime )
|
||||
callback_actorkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) //checked matches cerberus output
|
||||
{
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( isai( attacker ) && isdefined( attacker.script_owner ) )
|
||||
{
|
||||
if ( attacker.script_owner.team != self.aiteam )
|
||||
attacker = attacker.script_owner;
|
||||
}
|
||||
|
||||
if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) )
|
||||
attacker = attacker.owner;
|
||||
|
||||
if ( isdefined( attacker ) && isplayer( attacker ) )
|
||||
{
|
||||
if ( !level.teambased || self.aiteam != attacker.pers["team"] )
|
||||
{
|
||||
level.globalkillstreaksdestroyed++;
|
||||
attacker addweaponstat( "dogs_mp", "destroyed", 1 );
|
||||
attacker maps\mp\_challenges::killeddog();
|
||||
}
|
||||
}
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isai( attacker ) && isDefined( attacker.script_owner ) )
|
||||
{
|
||||
if ( attacker.script_owner.team != self.aiteam )
|
||||
{
|
||||
attacker = attacker.script_owner;
|
||||
}
|
||||
}
|
||||
if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) )
|
||||
{
|
||||
attacker = attacker.owner;
|
||||
}
|
||||
if ( isDefined( attacker ) && isplayer( attacker ) )
|
||||
{
|
||||
if ( !level.teambased || self.aiteam != attacker.pers[ "team" ] )
|
||||
{
|
||||
level.globalkillstreaksdestroyed++;
|
||||
attacker addweaponstat( "dogs_mp", "destroyed", 1 );
|
||||
attacker maps/mp/_challenges::killeddog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,220 +1,230 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_globallogic_utils;
|
||||
#include maps\mp\gametypes_zm\_globallogic;
|
||||
#include maps\mp\gametypes_zm\_globallogic_score;
|
||||
#include maps\mp\gametypes_zm\_globallogic_audio;
|
||||
#include maps\mp\gametypes_zm\_spawnlogic;
|
||||
#include maps/mp/gametypes_zm/_spawnlogic;
|
||||
#include maps/mp/gametypes_zm/_globallogic_audio;
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/gametypes_zm/_globallogic_utils;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
getwinningteamfromloser( losing_team )
|
||||
{
|
||||
if ( level.multiteam )
|
||||
return "tie";
|
||||
else if ( losing_team == "axis" )
|
||||
return "allies";
|
||||
|
||||
return "axis";
|
||||
if ( level.multiteam )
|
||||
{
|
||||
return "tie";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( losing_team == "axis" )
|
||||
{
|
||||
return "allies";
|
||||
}
|
||||
}
|
||||
return "axis";
|
||||
}
|
||||
|
||||
default_onforfeit( team )
|
||||
{
|
||||
level.gameforfeited = 1;
|
||||
level notify( "forfeit in progress" );
|
||||
level endon( "forfeit in progress" );
|
||||
level endon( "abort forfeit" );
|
||||
forfeit_delay = 20.0;
|
||||
announcement( game["strings"]["opponent_forfeiting_in"], forfeit_delay, 0 );
|
||||
wait 10.0;
|
||||
announcement( game["strings"]["opponent_forfeiting_in"], 10.0, 0 );
|
||||
wait 10.0;
|
||||
endreason = &"";
|
||||
|
||||
if ( !isdefined( team ) )
|
||||
{
|
||||
setdvar( "ui_text_endreason", game["strings"]["players_forfeited"] );
|
||||
endreason = game["strings"]["players_forfeited"];
|
||||
winner = level.players[0];
|
||||
}
|
||||
else if ( isdefined( level.teams[team] ) )
|
||||
{
|
||||
endreason = game["strings"][team + "_forfeited"];
|
||||
setdvar( "ui_text_endreason", endreason );
|
||||
winner = getwinningteamfromloser( team );
|
||||
}
|
||||
else
|
||||
{
|
||||
level.gameforfeited = 1;
|
||||
level notify( "forfeit in progress" );
|
||||
level endon( "forfeit in progress" );
|
||||
level endon( "abort forfeit" );
|
||||
forfeit_delay = 20;
|
||||
announcement( game[ "strings" ][ "opponent_forfeiting_in" ], forfeit_delay, 0 );
|
||||
wait 10;
|
||||
announcement( game[ "strings" ][ "opponent_forfeiting_in" ], 10, 0 );
|
||||
wait 10;
|
||||
endreason = &"";
|
||||
if ( !isDefined( team ) )
|
||||
{
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "players_forfeited" ] );
|
||||
endreason = game[ "strings" ][ "players_forfeited" ];
|
||||
winner = level.players[ 0 ];
|
||||
}
|
||||
else if ( isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
endreason = game[ "strings" ][ team + "_forfeited" ];
|
||||
setdvar( "ui_text_endreason", endreason );
|
||||
winner = getwinningteamfromloser( team );
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
assert( isdefined( team ), "Forfeited team is not defined" );
|
||||
assert( isDefined( team ), "Forfeited team is not defined" );
|
||||
#/
|
||||
/#
|
||||
assert( 0, "Forfeited team " + team + " is not allies or axis" );
|
||||
assert( 0, "Forfeited team " + team + " is not allies or axis" );
|
||||
#/
|
||||
winner = "tie";
|
||||
}
|
||||
|
||||
level.forcedend = 1;
|
||||
|
||||
if ( isplayer( winner ) )
|
||||
logstring( "forfeit, win: " + winner getxuid() + "(" + winner.name + ")" );
|
||||
else
|
||||
maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "forfeit", winner );
|
||||
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( winner, endreason );
|
||||
winner = "tie";
|
||||
}
|
||||
level.forcedend = 1;
|
||||
if ( isplayer( winner ) )
|
||||
{
|
||||
logstring( "forfeit, win: " + winner getxuid() + "(" + winner.name + ")" );
|
||||
}
|
||||
else
|
||||
{
|
||||
maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "forfeit", winner );
|
||||
}
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( winner, endreason );
|
||||
}
|
||||
|
||||
default_ondeadevent( team )
|
||||
{
|
||||
if ( isdefined( level.teams[team] ) )
|
||||
{
|
||||
eliminatedstring = game["strings"][team + "_eliminated"];
|
||||
iprintln( eliminatedstring );
|
||||
makedvarserverinfo( "ui_text_endreason", eliminatedstring );
|
||||
setdvar( "ui_text_endreason", eliminatedstring );
|
||||
winner = getwinningteamfromloser( team );
|
||||
maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "team eliminated", winner );
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( winner, eliminatedstring );
|
||||
}
|
||||
else
|
||||
{
|
||||
makedvarserverinfo( "ui_text_endreason", game["strings"]["tie"] );
|
||||
setdvar( "ui_text_endreason", game["strings"]["tie"] );
|
||||
maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "tie" );
|
||||
|
||||
if ( level.teambased )
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( "tie", game["strings"]["tie"] );
|
||||
else
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( undefined, game["strings"]["tie"] );
|
||||
}
|
||||
if ( isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
eliminatedstring = game[ "strings" ][ team + "_eliminated" ];
|
||||
iprintln( eliminatedstring );
|
||||
makedvarserverinfo( "ui_text_endreason", eliminatedstring );
|
||||
setdvar( "ui_text_endreason", eliminatedstring );
|
||||
winner = getwinningteamfromloser( team );
|
||||
maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "team eliminated", winner );
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( winner, eliminatedstring );
|
||||
}
|
||||
else makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "tie" ] );
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "tie" ] );
|
||||
maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "tie" );
|
||||
if ( level.teambased )
|
||||
{
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( "tie", game[ "strings" ][ "tie" ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( undefined, game[ "strings" ][ "tie" ] );
|
||||
}
|
||||
}
|
||||
|
||||
default_onalivecountchange( team )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
default_onroundendgame( winner )
|
||||
{
|
||||
return winner;
|
||||
return winner;
|
||||
}
|
||||
|
||||
default_ononeleftevent( team )
|
||||
{
|
||||
if ( !level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer();
|
||||
|
||||
if ( isdefined( winner ) )
|
||||
logstring( "last one alive, win: " + winner.name );
|
||||
else
|
||||
logstring( "last one alive, win: unknown" );
|
||||
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( winner, &"MP_ENEMIES_ELIMINATED" );
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
player = level.players[index];
|
||||
|
||||
if ( !isalive( player ) )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( player.pers["team"] ) || player.pers["team"] != team )
|
||||
continue;
|
||||
|
||||
player maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "sudden_death" );
|
||||
}
|
||||
}
|
||||
if ( !level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes_zm/_globallogic_score::gethighestscoringplayer();
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
logstring( "last one alive, win: " + winner.name );
|
||||
}
|
||||
else
|
||||
{
|
||||
logstring( "last one alive, win: unknown" );
|
||||
}
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( winner, &"MP_ENEMIES_ELIMINATED" );
|
||||
}
|
||||
else
|
||||
{
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
player = level.players[ index ];
|
||||
if ( !isalive( player ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( player.pers[ "team" ] ) || player.pers[ "team" ] != team )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
player maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "sudden_death" );
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
default_ontimelimit()
|
||||
{
|
||||
winner = undefined;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes_zm\_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "time limit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer();
|
||||
|
||||
if ( isdefined( winner ) )
|
||||
logstring( "time limit, win: " + winner.name );
|
||||
else
|
||||
logstring( "time limit, tie" );
|
||||
}
|
||||
|
||||
makedvarserverinfo( "ui_text_endreason", game["strings"]["time_limit_reached"] );
|
||||
setdvar( "ui_text_endreason", game["strings"]["time_limit_reached"] );
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( winner, game["strings"]["time_limit_reached"] );
|
||||
winner = undefined;
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes_zm/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "time limit", winner );
|
||||
}
|
||||
else winner = maps/mp/gametypes_zm/_globallogic_score::gethighestscoringplayer();
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
logstring( "time limit, win: " + winner.name );
|
||||
}
|
||||
else
|
||||
{
|
||||
logstring( "time limit, tie" );
|
||||
}
|
||||
makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "time_limit_reached" ] );
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "time_limit_reached" ] );
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( winner, game[ "strings" ][ "time_limit_reached" ] );
|
||||
}
|
||||
|
||||
default_onscorelimit()
|
||||
{
|
||||
if ( !level.endgameonscorelimit )
|
||||
return false;
|
||||
|
||||
winner = undefined;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes_zm\_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "scorelimit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer();
|
||||
|
||||
if ( isdefined( winner ) )
|
||||
logstring( "scorelimit, win: " + winner.name );
|
||||
else
|
||||
logstring( "scorelimit, tie" );
|
||||
}
|
||||
|
||||
makedvarserverinfo( "ui_text_endreason", game["strings"]["score_limit_reached"] );
|
||||
setdvar( "ui_text_endreason", game["strings"]["score_limit_reached"] );
|
||||
thread maps\mp\gametypes_zm\_globallogic::endgame( winner, game["strings"]["score_limit_reached"] );
|
||||
return true;
|
||||
if ( !level.endgameonscorelimit )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
winner = undefined;
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes_zm/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "scorelimit", winner );
|
||||
}
|
||||
else winner = maps/mp/gametypes_zm/_globallogic_score::gethighestscoringplayer();
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
logstring( "scorelimit, win: " + winner.name );
|
||||
}
|
||||
else
|
||||
{
|
||||
logstring( "scorelimit, tie" );
|
||||
}
|
||||
makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "score_limit_reached" ] );
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "score_limit_reached" ] );
|
||||
thread maps/mp/gametypes_zm/_globallogic::endgame( winner, game[ "strings" ][ "score_limit_reached" ] );
|
||||
return 1;
|
||||
}
|
||||
|
||||
default_onspawnspectator( origin, angles )
|
||||
{
|
||||
if ( isdefined( origin ) && isdefined( angles ) )
|
||||
{
|
||||
self spawn( origin, angles );
|
||||
return;
|
||||
}
|
||||
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
if ( isDefined( origin ) && isDefined( angles ) )
|
||||
{
|
||||
self spawn( origin, angles );
|
||||
return;
|
||||
}
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
/#
|
||||
assert( spawnpoints.size, "There are no mp_global_intermission spawn points in the map. There must be at least one." );
|
||||
assert( spawnpoints.size, "There are no mp_global_intermission spawn points in the map. There must be at least one." );
|
||||
#/
|
||||
spawnpoint = maps\mp\gametypes_zm\_spawnlogic::getspawnpoint_random( spawnpoints );
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
spawnpoint = maps/mp/gametypes_zm/_spawnlogic::getspawnpoint_random( spawnpoints );
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
}
|
||||
|
||||
default_onspawnintermission()
|
||||
{
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
spawnpoint = spawnpoints[0];
|
||||
|
||||
if ( isdefined( spawnpoint ) )
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
else
|
||||
{
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
spawnpoint = spawnpoints[ 0 ];
|
||||
if ( isDefined( spawnpoint ) )
|
||||
{
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
maps\mp\_utility::error( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" );
|
||||
maps/mp/_utility::error( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
default_gettimelimit()
|
||||
{
|
||||
return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax );
|
||||
return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,494 +1,544 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_util;
|
||||
#include maps\mp\gametypes_zm\_globallogic;
|
||||
#include maps\mp\gametypes_zm\_spectating;
|
||||
#include maps\mp\gametypes_zm\_globallogic_player;
|
||||
#include maps/mp/gametypes_zm/_globallogic_player;
|
||||
#include maps/mp/gametypes_zm/_spectating;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
precachestring( &"MP_HALFTIME" );
|
||||
precachestring( &"MP_OVERTIME" );
|
||||
precachestring( &"MP_ROUNDEND" );
|
||||
precachestring( &"MP_INTERMISSION" );
|
||||
precachestring( &"MP_SWITCHING_SIDES_CAPS" );
|
||||
precachestring( &"MP_FRIENDLY_FIRE_WILL_NOT" );
|
||||
precachestring( &"MP_RAMPAGE" );
|
||||
precachestring( &"medal_received" );
|
||||
precachestring( &"killstreak_received" );
|
||||
precachestring( &"prox_grenade_notify" );
|
||||
precachestring( &"player_callout" );
|
||||
precachestring( &"score_event" );
|
||||
precachestring( &"rank_up" );
|
||||
precachestring( &"gun_level_complete" );
|
||||
precachestring( &"challenge_complete" );
|
||||
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
precachestring( &"hud_update_survival_team" );
|
||||
|
||||
if ( level.splitscreen )
|
||||
precachestring( &"MP_ENDED_GAME" );
|
||||
else
|
||||
precachestring( &"MP_HOST_ENDED_GAME" );
|
||||
precachestring( &"MP_HALFTIME" );
|
||||
precachestring( &"MP_OVERTIME" );
|
||||
precachestring( &"MP_ROUNDEND" );
|
||||
precachestring( &"MP_INTERMISSION" );
|
||||
precachestring( &"MP_SWITCHING_SIDES_CAPS" );
|
||||
precachestring( &"MP_FRIENDLY_FIRE_WILL_NOT" );
|
||||
precachestring( &"MP_RAMPAGE" );
|
||||
precachestring( &"medal_received" );
|
||||
precachestring( &"killstreak_received" );
|
||||
precachestring( &"prox_grenade_notify" );
|
||||
precachestring( &"player_callout" );
|
||||
precachestring( &"score_event" );
|
||||
precachestring( &"rank_up" );
|
||||
precachestring( &"gun_level_complete" );
|
||||
precachestring( &"challenge_complete" );
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
precachestring( &"hud_update_survival_team" );
|
||||
}
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
precachestring( &"MP_ENDED_GAME" );
|
||||
}
|
||||
else
|
||||
{
|
||||
precachestring( &"MP_HOST_ENDED_GAME" );
|
||||
}
|
||||
}
|
||||
|
||||
setupcallbacks()
|
||||
{
|
||||
level.autoassign = ::menuautoassign;
|
||||
level.spectator = ::menuspectator;
|
||||
level.class = ::menuclass;
|
||||
level.teammenu = ::menuteam;
|
||||
level.autoassign = ::menuautoassign;
|
||||
level.spectator = ::menuspectator;
|
||||
level.class = ::menuclass;
|
||||
level.teammenu = ::menuteam;
|
||||
}
|
||||
|
||||
hideloadoutaftertime( delay )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "perks_hidden" );
|
||||
wait( delay );
|
||||
self thread hideallperks( 0.4 );
|
||||
self notify( "perks_hidden" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "perks_hidden" );
|
||||
wait delay;
|
||||
self thread hideallperks( 0,4 );
|
||||
self notify( "perks_hidden" );
|
||||
}
|
||||
|
||||
hideloadoutondeath()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "perks_hidden" );
|
||||
|
||||
self waittill( "death" );
|
||||
|
||||
self hideallperks();
|
||||
self notify( "perks_hidden" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "perks_hidden" );
|
||||
self waittill( "death" );
|
||||
self hideallperks();
|
||||
self notify( "perks_hidden" );
|
||||
}
|
||||
|
||||
hideloadoutonkill()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "perks_hidden" );
|
||||
|
||||
self waittill( "killed_player" );
|
||||
|
||||
self hideallperks();
|
||||
self notify( "perks_hidden" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "perks_hidden" );
|
||||
self waittill( "killed_player" );
|
||||
self hideallperks();
|
||||
self notify( "perks_hidden" );
|
||||
}
|
||||
|
||||
freegameplayhudelems()
|
||||
{
|
||||
if ( isdefined( self.perkicon ) )
|
||||
{
|
||||
for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ )
|
||||
{
|
||||
if ( isdefined( self.perkicon[numspecialties] ) )
|
||||
{
|
||||
self.perkicon[numspecialties] destroyelem();
|
||||
self.perkname[numspecialties] destroyelem();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( self.perkhudelem ) )
|
||||
self.perkhudelem destroyelem();
|
||||
|
||||
if ( isdefined( self.killstreakicon ) )
|
||||
{
|
||||
if ( isdefined( self.killstreakicon[0] ) )
|
||||
self.killstreakicon[0] destroyelem();
|
||||
|
||||
if ( isdefined( self.killstreakicon[1] ) )
|
||||
self.killstreakicon[1] destroyelem();
|
||||
|
||||
if ( isdefined( self.killstreakicon[2] ) )
|
||||
self.killstreakicon[2] destroyelem();
|
||||
|
||||
if ( isdefined( self.killstreakicon[3] ) )
|
||||
self.killstreakicon[3] destroyelem();
|
||||
|
||||
if ( isdefined( self.killstreakicon[4] ) )
|
||||
self.killstreakicon[4] destroyelem();
|
||||
}
|
||||
|
||||
self notify( "perks_hidden" );
|
||||
|
||||
if ( isdefined( self.lowermessage ) )
|
||||
self.lowermessage destroyelem();
|
||||
|
||||
if ( isdefined( self.lowertimer ) )
|
||||
self.lowertimer destroyelem();
|
||||
|
||||
if ( isdefined( self.proxbar ) )
|
||||
self.proxbar destroyelem();
|
||||
|
||||
if ( isdefined( self.proxbartext ) )
|
||||
self.proxbartext destroyelem();
|
||||
|
||||
if ( isdefined( self.carryicon ) )
|
||||
self.carryicon destroyelem();
|
||||
while ( isDefined( self.perkicon ) )
|
||||
{
|
||||
numspecialties = 0;
|
||||
while ( numspecialties < level.maxspecialties )
|
||||
{
|
||||
if ( isDefined( self.perkicon[ numspecialties ] ) )
|
||||
{
|
||||
self.perkicon[ numspecialties ] destroyelem();
|
||||
self.perkname[ numspecialties ] destroyelem();
|
||||
}
|
||||
numspecialties++;
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.perkhudelem ) )
|
||||
{
|
||||
self.perkhudelem destroyelem();
|
||||
}
|
||||
if ( isDefined( self.killstreakicon ) )
|
||||
{
|
||||
if ( isDefined( self.killstreakicon[ 0 ] ) )
|
||||
{
|
||||
self.killstreakicon[ 0 ] destroyelem();
|
||||
}
|
||||
if ( isDefined( self.killstreakicon[ 1 ] ) )
|
||||
{
|
||||
self.killstreakicon[ 1 ] destroyelem();
|
||||
}
|
||||
if ( isDefined( self.killstreakicon[ 2 ] ) )
|
||||
{
|
||||
self.killstreakicon[ 2 ] destroyelem();
|
||||
}
|
||||
if ( isDefined( self.killstreakicon[ 3 ] ) )
|
||||
{
|
||||
self.killstreakicon[ 3 ] destroyelem();
|
||||
}
|
||||
if ( isDefined( self.killstreakicon[ 4 ] ) )
|
||||
{
|
||||
self.killstreakicon[ 4 ] destroyelem();
|
||||
}
|
||||
}
|
||||
self notify( "perks_hidden" );
|
||||
if ( isDefined( self.lowermessage ) )
|
||||
{
|
||||
self.lowermessage destroyelem();
|
||||
}
|
||||
if ( isDefined( self.lowertimer ) )
|
||||
{
|
||||
self.lowertimer destroyelem();
|
||||
}
|
||||
if ( isDefined( self.proxbar ) )
|
||||
{
|
||||
self.proxbar destroyelem();
|
||||
}
|
||||
if ( isDefined( self.proxbartext ) )
|
||||
{
|
||||
self.proxbartext destroyelem();
|
||||
}
|
||||
if ( isDefined( self.carryicon ) )
|
||||
{
|
||||
self.carryicon destroyelem();
|
||||
}
|
||||
}
|
||||
|
||||
teamplayercountsequal( playercounts )
|
||||
{
|
||||
count = undefined;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( !isdefined( count ) )
|
||||
{
|
||||
count = playercounts[team];
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( count != playercounts[team] )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
count = undefined;
|
||||
_a150 = level.teams;
|
||||
_k150 = getFirstArrayKey( _a150 );
|
||||
while ( isDefined( _k150 ) )
|
||||
{
|
||||
team = _a150[ _k150 ];
|
||||
if ( !isDefined( count ) )
|
||||
{
|
||||
count = playercounts[ team ];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( count != playercounts[ team ] )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
_k150 = getNextArrayKey( _a150, _k150 );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
teamwithlowestplayercount( playercounts, ignore_team )
|
||||
{
|
||||
count = 9999;
|
||||
lowest_team = undefined;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( count > playercounts[team] )
|
||||
{
|
||||
count = playercounts[team];
|
||||
lowest_team = team;
|
||||
}
|
||||
}
|
||||
|
||||
return lowest_team;
|
||||
count = 9999;
|
||||
lowest_team = undefined;
|
||||
_a169 = level.teams;
|
||||
_k169 = getFirstArrayKey( _a169 );
|
||||
while ( isDefined( _k169 ) )
|
||||
{
|
||||
team = _a169[ _k169 ];
|
||||
if ( count > playercounts[ team ] )
|
||||
{
|
||||
count = playercounts[ team ];
|
||||
lowest_team = team;
|
||||
}
|
||||
_k169 = getNextArrayKey( _a169, _k169 );
|
||||
}
|
||||
return lowest_team;
|
||||
}
|
||||
|
||||
menuautoassign( comingfrommenu )
|
||||
{
|
||||
teamkeys = getarraykeys( level.teams );
|
||||
assignment = teamkeys[randomint( teamkeys.size )];
|
||||
self closemenus();
|
||||
|
||||
if ( isdefined( level.forceallallies ) && level.forceallallies )
|
||||
assignment = "allies";
|
||||
else if ( level.teambased )
|
||||
{
|
||||
if ( getdvarint( "party_autoteams" ) == 1 )
|
||||
{
|
||||
if ( level.allow_teamchange == "1" && ( self.hasspawned || comingfrommenu ) )
|
||||
assignment = "";
|
||||
else
|
||||
{
|
||||
team = getassignedteam( self );
|
||||
|
||||
switch ( team )
|
||||
{
|
||||
case "1":
|
||||
assignment = teamkeys[1];
|
||||
break;
|
||||
case "2":
|
||||
assignment = teamkeys[0];
|
||||
break;
|
||||
case "3":
|
||||
assignment = teamkeys[2];
|
||||
break;
|
||||
case "4":
|
||||
if ( !isdefined( level.forceautoassign ) || !level.forceautoassign )
|
||||
{
|
||||
self setclientscriptmainmenu( game["menu_class"] );
|
||||
return;
|
||||
}
|
||||
default:
|
||||
assignment = "";
|
||||
|
||||
if ( isdefined( level.teams[team] ) )
|
||||
assignment = team;
|
||||
else if ( team == "spectator" && !level.forceautoassign )
|
||||
{
|
||||
self setclientscriptmainmenu( game["menu_class"] );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( assignment == "" || getdvarint( "party_autoteams" ) == 0 )
|
||||
{
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
assignment = "allies";
|
||||
}
|
||||
|
||||
if ( assignment == self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) )
|
||||
{
|
||||
self beginclasschoice();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( getdvarint( "party_autoteams" ) == 1 )
|
||||
{
|
||||
if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu )
|
||||
{
|
||||
team = getassignedteam( self );
|
||||
|
||||
if ( isdefined( level.teams[team] ) )
|
||||
assignment = team;
|
||||
else if ( team == "spectator" && !level.forceautoassign )
|
||||
{
|
||||
self setclientscriptmainmenu( game["menu_class"] );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( assignment != self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) )
|
||||
{
|
||||
self.switching_teams = 1;
|
||||
self.joining_team = assignment;
|
||||
self.leaving_team = self.pers["team"];
|
||||
self suicide();
|
||||
}
|
||||
|
||||
self.pers["team"] = assignment;
|
||||
self.team = assignment;
|
||||
self.pers["class"] = undefined;
|
||||
self.class = undefined;
|
||||
self.pers["weapon"] = undefined;
|
||||
self.pers["savedmodel"] = undefined;
|
||||
self updateobjectivetext();
|
||||
|
||||
if ( level.teambased )
|
||||
self.sessionteam = assignment;
|
||||
else
|
||||
{
|
||||
self.sessionteam = "none";
|
||||
self.ffateam = assignment;
|
||||
}
|
||||
|
||||
if ( !isalive( self ) )
|
||||
self.statusicon = "hud_status_dead";
|
||||
|
||||
self notify( "joined_team" );
|
||||
level notify( "joined_team" );
|
||||
self notify( "end_respawn" );
|
||||
self beginclasschoice();
|
||||
self setclientscriptmainmenu( game["menu_class"] );
|
||||
teamkeys = getarraykeys( level.teams );
|
||||
assignment = teamkeys[ randomint( teamkeys.size ) ];
|
||||
self closemenus();
|
||||
if ( isDefined( level.forceallallies ) && level.forceallallies )
|
||||
{
|
||||
assignment = "allies";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( getDvarInt( "party_autoteams" ) == 1 )
|
||||
{
|
||||
if ( level.allow_teamchange == "1" || self.hasspawned && comingfrommenu )
|
||||
{
|
||||
assignment = "";
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
team = getassignedteam( self );
|
||||
switch( team )
|
||||
{
|
||||
case 1:
|
||||
assignment = teamkeys[ 1 ];
|
||||
break;
|
||||
case 2:
|
||||
assignment = teamkeys[ 0 ];
|
||||
break;
|
||||
case 3:
|
||||
assignment = teamkeys[ 2 ];
|
||||
break;
|
||||
case 4:
|
||||
if ( !isDefined( level.forceautoassign ) || !level.forceautoassign )
|
||||
{
|
||||
self setclientscriptmainmenu( game[ "menu_class" ] );
|
||||
return;
|
||||
}
|
||||
default:
|
||||
assignment = "";
|
||||
if ( isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
assignment = team;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( team == "spectator" && !level.forceautoassign )
|
||||
{
|
||||
self setclientscriptmainmenu( game[ "menu_class" ] );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( assignment == "" || getDvarInt( "party_autoteams" ) == 0 )
|
||||
{
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
assignment = "allies";
|
||||
}
|
||||
}
|
||||
if ( assignment == self.pers[ "team" ] || self.sessionstate == "playing" && self.sessionstate == "dead" )
|
||||
{
|
||||
self beginclasschoice();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if ( getDvarInt( "party_autoteams" ) == 1 )
|
||||
{
|
||||
if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu )
|
||||
{
|
||||
team = getassignedteam( self );
|
||||
if ( isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
assignment = team;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( team == "spectator" && !level.forceautoassign )
|
||||
{
|
||||
self setclientscriptmainmenu( game[ "menu_class" ] );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( assignment != self.pers[ "team" ] || self.sessionstate == "playing" && self.sessionstate == "dead" )
|
||||
{
|
||||
self.switching_teams = 1;
|
||||
self.joining_team = assignment;
|
||||
self.leaving_team = self.pers[ "team" ];
|
||||
self suicide();
|
||||
}
|
||||
self.pers[ "team" ] = assignment;
|
||||
self.team = assignment;
|
||||
self.class = undefined;
|
||||
self updateobjectivetext();
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.sessionteam = assignment;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.sessionteam = "none";
|
||||
self.ffateam = assignment;
|
||||
}
|
||||
if ( !isalive( self ) )
|
||||
{
|
||||
self.statusicon = "hud_status_dead";
|
||||
}
|
||||
self notify( "joined_team" );
|
||||
level notify( "joined_team" );
|
||||
self notify( "end_respawn" );
|
||||
self beginclasschoice();
|
||||
self setclientscriptmainmenu( game[ "menu_class" ] );
|
||||
}
|
||||
|
||||
teamscoresequal()
|
||||
{
|
||||
score = undefined;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( !isdefined( score ) )
|
||||
{
|
||||
score = getteamscore( team );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( score != getteamscore( team ) )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
score = undefined;
|
||||
_a413 = level.teams;
|
||||
_k413 = getFirstArrayKey( _a413 );
|
||||
while ( isDefined( _k413 ) )
|
||||
{
|
||||
team = _a413[ _k413 ];
|
||||
if ( !isDefined( score ) )
|
||||
{
|
||||
score = getteamscore( team );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( score != getteamscore( team ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
_k413 = getNextArrayKey( _a413, _k413 );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
teamwithlowestscore()
|
||||
{
|
||||
score = 99999999;
|
||||
lowest_team = undefined;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( score > getteamscore( team ) )
|
||||
lowest_team = team;
|
||||
}
|
||||
|
||||
return lowest_team;
|
||||
score = 99999999;
|
||||
lowest_team = undefined;
|
||||
_a432 = level.teams;
|
||||
_k432 = getFirstArrayKey( _a432 );
|
||||
while ( isDefined( _k432 ) )
|
||||
{
|
||||
team = _a432[ _k432 ];
|
||||
if ( score > getteamscore( team ) )
|
||||
{
|
||||
lowest_team = team;
|
||||
}
|
||||
_k432 = getNextArrayKey( _a432, _k432 );
|
||||
}
|
||||
return lowest_team;
|
||||
}
|
||||
|
||||
pickteamfromscores( teams )
|
||||
{
|
||||
assignment = "allies";
|
||||
|
||||
if ( teamscoresequal() )
|
||||
assignment = teams[randomint( teams.size )];
|
||||
else
|
||||
assignment = teamwithlowestscore();
|
||||
|
||||
return assignment;
|
||||
assignment = "allies";
|
||||
if ( teamscoresequal() )
|
||||
{
|
||||
assignment = teams[ randomint( teams.size ) ];
|
||||
}
|
||||
else
|
||||
{
|
||||
assignment = teamwithlowestscore();
|
||||
}
|
||||
return assignment;
|
||||
}
|
||||
|
||||
getsplitscreenteam()
|
||||
{
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
if ( !isdefined( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
if ( level.players[index] == self )
|
||||
continue;
|
||||
|
||||
if ( !self isplayeronsamemachine( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
team = level.players[index].sessionteam;
|
||||
|
||||
if ( team != "spectator" )
|
||||
return team;
|
||||
}
|
||||
|
||||
return "";
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
if ( !isDefined( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( level.players[ index ] == self )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( !self isplayeronsamemachine( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
team = level.players[ index ].sessionteam;
|
||||
if ( team != "spectator" )
|
||||
{
|
||||
return team;
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
updateobjectivetext()
|
||||
{
|
||||
if ( sessionmodeiszombiesgame() || self.pers["team"] == "spectator" )
|
||||
{
|
||||
self setclientcgobjectivetext( "" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( level.scorelimit > 0 )
|
||||
self setclientcgobjectivetext( getobjectivescoretext( self.pers["team"] ) );
|
||||
else
|
||||
self setclientcgobjectivetext( getobjectivetext( self.pers["team"] ) );
|
||||
if ( sessionmodeiszombiesgame() || self.pers[ "team" ] == "spectator" )
|
||||
{
|
||||
self setclientcgobjectivetext( "" );
|
||||
return;
|
||||
}
|
||||
if ( level.scorelimit > 0 )
|
||||
{
|
||||
self setclientcgobjectivetext( getobjectivescoretext( self.pers[ "team" ] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setclientcgobjectivetext( getobjectivetext( self.pers[ "team" ] ) );
|
||||
}
|
||||
}
|
||||
|
||||
closemenus()
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
}
|
||||
|
||||
beginclasschoice( forcenewchoice )
|
||||
{
|
||||
/#
|
||||
assert( isdefined( level.teams[self.pers["team"]] ) );
|
||||
assert( isDefined( level.teams[ self.pers[ "team" ] ] ) );
|
||||
#/
|
||||
team = self.pers["team"];
|
||||
|
||||
if ( level.disablecac == 1 )
|
||||
{
|
||||
self.pers["class"] = level.defaultclass;
|
||||
self.class = level.defaultclass;
|
||||
|
||||
if ( self.sessionstate != "playing" && game["state"] == "playing" )
|
||||
self thread [[ level.spawnclient ]]();
|
||||
|
||||
level thread maps\mp\gametypes_zm\_globallogic::updateteamstatus();
|
||||
self thread maps\mp\gametypes_zm\_spectating::setspectatepermissionsformachine();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( level.wagermatch )
|
||||
self openmenu( game["menu_changeclass_wager"] );
|
||||
else if ( getdvarint( "barebones_class_mode" ) )
|
||||
self openmenu( game["menu_changeclass_barebones"] );
|
||||
else
|
||||
self openmenu( game["menu_changeclass_" + team] );
|
||||
team = self.pers[ "team" ];
|
||||
if ( level.disablecac == 1 )
|
||||
{
|
||||
self.pers[ "class" ] = level.defaultclass;
|
||||
self.class = level.defaultclass;
|
||||
if ( self.sessionstate != "playing" && game[ "state" ] == "playing" )
|
||||
{
|
||||
self thread [[ level.spawnclient ]]();
|
||||
}
|
||||
level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus();
|
||||
self thread maps/mp/gametypes_zm/_spectating::setspectatepermissionsformachine();
|
||||
return;
|
||||
}
|
||||
if ( level.wagermatch )
|
||||
{
|
||||
self openmenu( game[ "menu_changeclass_wager" ] );
|
||||
}
|
||||
else if ( getDvarInt( "barebones_class_mode" ) )
|
||||
{
|
||||
self openmenu( game[ "menu_changeclass_barebones" ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
self openmenu( game[ "menu_changeclass_" + team ] );
|
||||
}
|
||||
}
|
||||
|
||||
showmainmenuforteam()
|
||||
{
|
||||
/#
|
||||
assert( isdefined( level.teams[self.pers["team"]] ) );
|
||||
assert( isDefined( level.teams[ self.pers[ "team" ] ] ) );
|
||||
#/
|
||||
team = self.pers["team"];
|
||||
|
||||
if ( level.wagermatch )
|
||||
self openmenu( game["menu_changeclass_wager"] );
|
||||
else
|
||||
self openmenu( game["menu_changeclass_" + team] );
|
||||
team = self.pers[ "team" ];
|
||||
if ( level.wagermatch )
|
||||
{
|
||||
self openmenu( game[ "menu_changeclass_wager" ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
self openmenu( game[ "menu_changeclass_" + team ] );
|
||||
}
|
||||
}
|
||||
|
||||
menuteam( team )
|
||||
{
|
||||
self closemenus();
|
||||
|
||||
if ( !level.console && level.allow_teamchange == "0" && ( isdefined( self.hasdonecombat ) && self.hasdonecombat ) )
|
||||
return;
|
||||
|
||||
if ( self.pers["team"] != team )
|
||||
{
|
||||
if ( level.ingraceperiod && ( !isdefined( self.hasdonecombat ) || !self.hasdonecombat ) )
|
||||
self.hasspawned = 0;
|
||||
|
||||
if ( self.sessionstate == "playing" )
|
||||
{
|
||||
self.switching_teams = 1;
|
||||
self.joining_team = team;
|
||||
self.leaving_team = self.pers["team"];
|
||||
self suicide();
|
||||
}
|
||||
|
||||
self.pers["team"] = team;
|
||||
self.team = team;
|
||||
self.pers["class"] = undefined;
|
||||
self.class = undefined;
|
||||
self.pers["weapon"] = undefined;
|
||||
self.pers["savedmodel"] = undefined;
|
||||
self updateobjectivetext();
|
||||
|
||||
if ( level.teambased )
|
||||
self.sessionteam = team;
|
||||
else
|
||||
{
|
||||
self.sessionteam = "none";
|
||||
self.ffateam = team;
|
||||
}
|
||||
|
||||
self setclientscriptmainmenu( game["menu_class"] );
|
||||
self notify( "joined_team" );
|
||||
level notify( "joined_team" );
|
||||
self notify( "end_respawn" );
|
||||
}
|
||||
|
||||
self beginclasschoice();
|
||||
self closemenus();
|
||||
if ( !level.console && level.allow_teamchange == "0" && isDefined( self.hasdonecombat ) && self.hasdonecombat )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.pers[ "team" ] != team )
|
||||
{
|
||||
if ( level.ingraceperiod || !isDefined( self.hasdonecombat ) && !self.hasdonecombat )
|
||||
{
|
||||
self.hasspawned = 0;
|
||||
}
|
||||
if ( self.sessionstate == "playing" )
|
||||
{
|
||||
self.switching_teams = 1;
|
||||
self.joining_team = team;
|
||||
self.leaving_team = self.pers[ "team" ];
|
||||
self suicide();
|
||||
}
|
||||
self.pers[ "team" ] = team;
|
||||
self.team = team;
|
||||
self.class = undefined;
|
||||
self updateobjectivetext();
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.sessionteam = team;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.sessionteam = "none";
|
||||
self.ffateam = team;
|
||||
}
|
||||
self setclientscriptmainmenu( game[ "menu_class" ] );
|
||||
self notify( "joined_team" );
|
||||
level notify( "joined_team" );
|
||||
self notify( "end_respawn" );
|
||||
}
|
||||
self beginclasschoice();
|
||||
}
|
||||
|
||||
menuspectator()
|
||||
{
|
||||
self closemenus();
|
||||
|
||||
if ( self.pers["team"] != "spectator" )
|
||||
{
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
self.switching_teams = 1;
|
||||
self.joining_team = "spectator";
|
||||
self.leaving_team = self.pers["team"];
|
||||
self suicide();
|
||||
}
|
||||
|
||||
self.pers["team"] = "spectator";
|
||||
self.team = "spectator";
|
||||
self.pers["class"] = undefined;
|
||||
self.class = undefined;
|
||||
self.pers["weapon"] = undefined;
|
||||
self.pers["savedmodel"] = undefined;
|
||||
self updateobjectivetext();
|
||||
self.sessionteam = "spectator";
|
||||
|
||||
if ( !level.teambased )
|
||||
self.ffateam = "spectator";
|
||||
|
||||
[[ level.spawnspectator ]]();
|
||||
self thread maps\mp\gametypes_zm\_globallogic_player::spectate_player_watcher();
|
||||
self setclientscriptmainmenu( game["menu_class"] );
|
||||
self notify( "joined_spectators" );
|
||||
}
|
||||
self closemenus();
|
||||
if ( self.pers[ "team" ] != "spectator" )
|
||||
{
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
self.switching_teams = 1;
|
||||
self.joining_team = "spectator";
|
||||
self.leaving_team = self.pers[ "team" ];
|
||||
self suicide();
|
||||
}
|
||||
self.pers[ "team" ] = "spectator";
|
||||
self.team = "spectator";
|
||||
self.class = undefined;
|
||||
self updateobjectivetext();
|
||||
self.sessionteam = "spectator";
|
||||
if ( !level.teambased )
|
||||
{
|
||||
self.ffateam = "spectator";
|
||||
}
|
||||
[[ level.spawnspectator ]]();
|
||||
self thread maps/mp/gametypes_zm/_globallogic_player::spectate_player_watcher();
|
||||
self setclientscriptmainmenu( game[ "menu_class" ] );
|
||||
self notify( "joined_spectators" );
|
||||
}
|
||||
}
|
||||
|
||||
menuclass( response )
|
||||
{
|
||||
self closemenus();
|
||||
self closemenus();
|
||||
}
|
||||
|
||||
removespawnmessageshortly( delay )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
self endon( "end_respawn" );
|
||||
wait( delay );
|
||||
self clearlowermessage( 2.0 );
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
self endon( "end_respawn" );
|
||||
wait delay;
|
||||
self clearlowermessage( 2 );
|
||||
}
|
||||
|
@ -1,435 +1,478 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_hud_message;
|
||||
#include maps\mp\gametypes_zm\_hostmigration;
|
||||
#include maps\mp\gametypes_zm\_globallogic_score;
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/gametypes_zm/_hostmigration;
|
||||
#include maps/mp/gametypes_zm/_hud_message;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
waittillslowprocessallowed()
|
||||
{
|
||||
while ( level.lastslowprocessframe == gettime() )
|
||||
wait 0.05;
|
||||
|
||||
level.lastslowprocessframe = gettime();
|
||||
while ( level.lastslowprocessframe == getTime() )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
level.lastslowprocessframe = getTime();
|
||||
}
|
||||
|
||||
testmenu()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 10.0;
|
||||
notifydata = spawnstruct();
|
||||
notifydata.titletext = &"MP_CHALLENGE_COMPLETED";
|
||||
notifydata.notifytext = "wheee";
|
||||
notifydata.sound = "mp_challenge_complete";
|
||||
self thread maps\mp\gametypes_zm\_hud_message::notifymessage( notifydata );
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
wait 10;
|
||||
notifydata = spawnstruct();
|
||||
notifydata.titletext = &"MP_CHALLENGE_COMPLETED";
|
||||
notifydata.notifytext = "wheee";
|
||||
notifydata.sound = "mp_challenge_complete";
|
||||
self thread maps/mp/gametypes_zm/_hud_message::notifymessage( notifydata );
|
||||
}
|
||||
}
|
||||
|
||||
testshock()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 3.0;
|
||||
numshots = randomint( 6 );
|
||||
|
||||
for ( i = 0; i < numshots; i++ )
|
||||
{
|
||||
iprintlnbold( numshots );
|
||||
self shellshock( "frag_grenade_mp", 0.2 );
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
wait 3;
|
||||
numshots = randomint( 6 );
|
||||
i = 0;
|
||||
while ( i < numshots )
|
||||
{
|
||||
iprintlnbold( numshots );
|
||||
self shellshock( "frag_grenade_mp", 0,2 );
|
||||
wait 0,1;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
testhps()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
hps = [];
|
||||
hps[hps.size] = "radar_mp";
|
||||
hps[hps.size] = "artillery_mp";
|
||||
hps[hps.size] = "dogs_mp";
|
||||
|
||||
for (;;)
|
||||
{
|
||||
hp = "radar_mp";
|
||||
wait 20.0;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
hps = [];
|
||||
hps[ hps.size ] = "radar_mp";
|
||||
hps[ hps.size ] = "artillery_mp";
|
||||
hps[ hps.size ] = "dogs_mp";
|
||||
for ( ;; )
|
||||
{
|
||||
hp = "radar_mp";
|
||||
wait 20;
|
||||
}
|
||||
}
|
||||
|
||||
timeuntilroundend()
|
||||
{
|
||||
if ( level.gameended )
|
||||
{
|
||||
timepassed = ( gettime() - level.gameendtime ) / 1000;
|
||||
timeremaining = level.postroundtime - timepassed;
|
||||
|
||||
if ( timeremaining < 0 )
|
||||
return 0;
|
||||
|
||||
return timeremaining;
|
||||
}
|
||||
|
||||
if ( level.inovertime )
|
||||
return undefined;
|
||||
|
||||
if ( level.timelimit <= 0 )
|
||||
return undefined;
|
||||
|
||||
if ( !isdefined( level.starttime ) )
|
||||
return undefined;
|
||||
|
||||
timepassed = ( gettimepassed() - level.starttime ) / 1000;
|
||||
timeremaining = level.timelimit * 60 - timepassed;
|
||||
return timeremaining + level.postroundtime;
|
||||
if ( level.gameended )
|
||||
{
|
||||
timepassed = ( getTime() - level.gameendtime ) / 1000;
|
||||
timeremaining = level.postroundtime - timepassed;
|
||||
if ( timeremaining < 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return timeremaining;
|
||||
}
|
||||
if ( level.inovertime )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( level.timelimit <= 0 )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( !isDefined( level.starttime ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
timepassed = ( gettimepassed() - level.starttime ) / 1000;
|
||||
timeremaining = ( level.timelimit * 60 ) - timepassed;
|
||||
return timeremaining + level.postroundtime;
|
||||
}
|
||||
|
||||
gettimeremaining()
|
||||
{
|
||||
return level.timelimit * 60 * 1000 - gettimepassed();
|
||||
return ( ( level.timelimit * 60 ) * 1000 ) - gettimepassed();
|
||||
}
|
||||
|
||||
registerpostroundevent( eventfunc )
|
||||
{
|
||||
if ( !isdefined( level.postroundevents ) )
|
||||
level.postroundevents = [];
|
||||
|
||||
level.postroundevents[level.postroundevents.size] = eventfunc;
|
||||
if ( !isDefined( level.postroundevents ) )
|
||||
{
|
||||
level.postroundevents = [];
|
||||
}
|
||||
level.postroundevents[ level.postroundevents.size ] = eventfunc;
|
||||
}
|
||||
|
||||
executepostroundevents()
|
||||
{
|
||||
if ( !isdefined( level.postroundevents ) )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < level.postroundevents.size; i++ )
|
||||
[[ level.postroundevents[i] ]]();
|
||||
if ( !isDefined( level.postroundevents ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.postroundevents.size )
|
||||
{
|
||||
[[ level.postroundevents[ i ] ]]();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
getvalueinrange( value, minvalue, maxvalue )
|
||||
{
|
||||
if ( value > maxvalue )
|
||||
return maxvalue;
|
||||
else if ( value < minvalue )
|
||||
return minvalue;
|
||||
else
|
||||
return value;
|
||||
if ( value > maxvalue )
|
||||
{
|
||||
return maxvalue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( value < minvalue )
|
||||
{
|
||||
return minvalue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assertproperplacement()
|
||||
{
|
||||
/#
|
||||
numplayers = level.placement["all"].size;
|
||||
|
||||
for ( i = 0; i < numplayers - 1; i++ )
|
||||
{
|
||||
if ( isdefined( level.placement["all"][i] ) && isdefined( level.placement["all"][i + 1] ) )
|
||||
{
|
||||
if ( level.placement["all"][i].score < level.placement["all"][i + 1].score )
|
||||
{
|
||||
println( "^1Placement array:" );
|
||||
|
||||
for ( i = 0; i < numplayers; i++ )
|
||||
{
|
||||
player = level.placement["all"][i];
|
||||
println( "^1" + i + ". " + player.name + ": " + player.score );
|
||||
}
|
||||
/#
|
||||
assertmsg( "Placement array was not properly sorted" );
|
||||
#/
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
numplayers = level.placement[ "all" ].size;
|
||||
i = 0;
|
||||
while ( i < ( numplayers - 1 ) )
|
||||
{
|
||||
if ( isDefined( level.placement[ "all" ][ i ] ) && isDefined( level.placement[ "all" ][ i + 1 ] ) )
|
||||
{
|
||||
if ( level.placement[ "all" ][ i ].score < level.placement[ "all" ][ i + 1 ].score )
|
||||
{
|
||||
println( "^1Placement array:" );
|
||||
i = 0;
|
||||
while ( i < numplayers )
|
||||
{
|
||||
player = level.placement[ "all" ][ i ];
|
||||
println( "^1" + i + ". " + player.name + ": " + player.score );
|
||||
i++;
|
||||
}
|
||||
assertmsg( "Placement array was not properly sorted" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isvalidclass( class )
|
||||
{
|
||||
if ( level.oldschool || sessionmodeiszombiesgame() )
|
||||
{
|
||||
if ( level.oldschool || sessionmodeiszombiesgame() )
|
||||
{
|
||||
/#
|
||||
assert( !isdefined( class ) );
|
||||
assert( !isDefined( class ) );
|
||||
#/
|
||||
return 1;
|
||||
}
|
||||
|
||||
return isdefined( class ) && class != "";
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( class ) )
|
||||
{
|
||||
return class != "";
|
||||
}
|
||||
}
|
||||
|
||||
playtickingsound( gametype_tick_sound )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_ticking" );
|
||||
level endon( "game_ended" );
|
||||
time = level.bombtimer;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self playsound( gametype_tick_sound );
|
||||
|
||||
if ( time > 10 )
|
||||
{
|
||||
time -= 1;
|
||||
wait 1;
|
||||
}
|
||||
else if ( time > 4 )
|
||||
{
|
||||
time -= 0.5;
|
||||
wait 0.5;
|
||||
}
|
||||
else if ( time > 1 )
|
||||
{
|
||||
time -= 0.4;
|
||||
wait 0.4;
|
||||
}
|
||||
else
|
||||
{
|
||||
time -= 0.3;
|
||||
wait 0.3;
|
||||
}
|
||||
|
||||
maps\mp\gametypes_zm\_hostmigration::waittillhostmigrationdone();
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "stop_ticking" );
|
||||
level endon( "game_ended" );
|
||||
time = level.bombtimer;
|
||||
while ( 1 )
|
||||
{
|
||||
self playsound( gametype_tick_sound );
|
||||
if ( time > 10 )
|
||||
{
|
||||
time -= 1;
|
||||
wait 1;
|
||||
}
|
||||
else if ( time > 4 )
|
||||
{
|
||||
time -= 0,5;
|
||||
wait 0,5;
|
||||
}
|
||||
else if ( time > 1 )
|
||||
{
|
||||
time -= 0,4;
|
||||
wait 0,4;
|
||||
}
|
||||
else
|
||||
{
|
||||
time -= 0,3;
|
||||
wait 0,3;
|
||||
}
|
||||
maps/mp/gametypes_zm/_hostmigration::waittillhostmigrationdone();
|
||||
}
|
||||
}
|
||||
|
||||
stoptickingsound()
|
||||
{
|
||||
self notify( "stop_ticking" );
|
||||
self notify( "stop_ticking" );
|
||||
}
|
||||
|
||||
gametimer()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
level waittill( "prematch_over" );
|
||||
|
||||
level.starttime = gettime();
|
||||
level.discardtime = 0;
|
||||
|
||||
if ( isdefined( game["roundMillisecondsAlreadyPassed"] ) )
|
||||
{
|
||||
level.starttime -= game["roundMillisecondsAlreadyPassed"];
|
||||
game["roundMillisecondsAlreadyPassed"] = undefined;
|
||||
}
|
||||
|
||||
prevtime = gettime();
|
||||
|
||||
while ( game["state"] == "playing" )
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
game["timepassed"] += gettime() - prevtime;
|
||||
|
||||
prevtime = gettime();
|
||||
wait 1.0;
|
||||
}
|
||||
level endon( "game_ended" );
|
||||
level waittill( "prematch_over" );
|
||||
level.starttime = getTime();
|
||||
level.discardtime = 0;
|
||||
if ( isDefined( game[ "roundMillisecondsAlreadyPassed" ] ) )
|
||||
{
|
||||
level.starttime -= game[ "roundMillisecondsAlreadyPassed" ];
|
||||
}
|
||||
prevtime = getTime();
|
||||
while ( game[ "state" ] == "playing" )
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
{
|
||||
game[ "timepassed" ] += getTime() - prevtime;
|
||||
}
|
||||
prevtime = getTime();
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
gettimepassed()
|
||||
{
|
||||
if ( !isdefined( level.starttime ) )
|
||||
return 0;
|
||||
|
||||
if ( level.timerstopped )
|
||||
return level.timerpausetime - level.starttime - level.discardtime;
|
||||
else
|
||||
return gettime() - level.starttime - level.discardtime;
|
||||
if ( !isDefined( level.starttime ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.timerstopped )
|
||||
{
|
||||
return level.timerpausetime - level.starttime - level.discardtime;
|
||||
}
|
||||
else
|
||||
{
|
||||
return getTime() - level.starttime - level.discardtime;
|
||||
}
|
||||
}
|
||||
|
||||
pausetimer()
|
||||
{
|
||||
if ( level.timerstopped )
|
||||
return;
|
||||
|
||||
level.timerstopped = 1;
|
||||
level.timerpausetime = gettime();
|
||||
if ( level.timerstopped )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.timerstopped = 1;
|
||||
level.timerpausetime = getTime();
|
||||
}
|
||||
|
||||
resumetimer()
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
return;
|
||||
|
||||
level.timerstopped = 0;
|
||||
level.discardtime += gettime() - level.timerpausetime;
|
||||
if ( !level.timerstopped )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.timerstopped = 0;
|
||||
level.discardtime += getTime() - level.timerpausetime;
|
||||
}
|
||||
|
||||
getscoreremaining( team )
|
||||
{
|
||||
/#
|
||||
assert( isplayer( self ) || isdefined( team ) );
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
assert( isDefined( team ) );
|
||||
}
|
||||
#/
|
||||
scorelimit = level.scorelimit;
|
||||
|
||||
if ( isplayer( self ) )
|
||||
return scorelimit - maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( self );
|
||||
else
|
||||
return scorelimit - getteamscore( team );
|
||||
scorelimit = level.scorelimit;
|
||||
if ( isplayer( self ) )
|
||||
{
|
||||
return scorelimit - maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( self );
|
||||
}
|
||||
else
|
||||
{
|
||||
return scorelimit - getteamscore( team );
|
||||
}
|
||||
}
|
||||
|
||||
getscoreperminute( team )
|
||||
{
|
||||
/#
|
||||
assert( isplayer( self ) || isdefined( team ) );
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
assert( isDefined( team ) );
|
||||
}
|
||||
#/
|
||||
scorelimit = level.scorelimit;
|
||||
timelimit = level.timelimit;
|
||||
minutespassed = gettimepassed() / 60000 + 0.0001;
|
||||
|
||||
if ( isplayer( self ) )
|
||||
return maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( self ) / minutespassed;
|
||||
else
|
||||
return getteamscore( team ) / minutespassed;
|
||||
scorelimit = level.scorelimit;
|
||||
timelimit = level.timelimit;
|
||||
minutespassed = ( gettimepassed() / 60000 ) + 0,0001;
|
||||
if ( isplayer( self ) )
|
||||
{
|
||||
return maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( self ) / minutespassed;
|
||||
}
|
||||
else
|
||||
{
|
||||
return getteamscore( team ) / minutespassed;
|
||||
}
|
||||
}
|
||||
|
||||
getestimatedtimeuntilscorelimit( team )
|
||||
{
|
||||
/#
|
||||
assert( isplayer( self ) || isdefined( team ) );
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
assert( isDefined( team ) );
|
||||
}
|
||||
#/
|
||||
scoreperminute = self getscoreperminute( team );
|
||||
scoreremaining = self getscoreremaining( team );
|
||||
|
||||
if ( !scoreperminute )
|
||||
return 999999;
|
||||
|
||||
return scoreremaining / scoreperminute;
|
||||
scoreperminute = self getscoreperminute( team );
|
||||
scoreremaining = self getscoreremaining( team );
|
||||
if ( !scoreperminute )
|
||||
{
|
||||
return 999999;
|
||||
}
|
||||
return scoreremaining / scoreperminute;
|
||||
}
|
||||
|
||||
rumbler()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
wait 0.1;
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
}
|
||||
}
|
||||
|
||||
waitfortimeornotify( time, notifyname )
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait( time );
|
||||
self endon( notifyname );
|
||||
wait time;
|
||||
}
|
||||
|
||||
waitfortimeornotifynoartillery( time, notifyname )
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait( time );
|
||||
|
||||
while ( isdefined( level.artilleryinprogress ) )
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait time;
|
||||
while ( isDefined( level.artilleryinprogress ) )
|
||||
{
|
||||
/#
|
||||
assert( level.artilleryinprogress );
|
||||
assert( level.artilleryinprogress );
|
||||
#/
|
||||
wait 0.25;
|
||||
}
|
||||
wait 0,25;
|
||||
}
|
||||
}
|
||||
|
||||
isheadshot( sweapon, shitloc, smeansofdeath, einflictor )
|
||||
{
|
||||
if ( shitloc != "head" && shitloc != "helmet" )
|
||||
return false;
|
||||
|
||||
switch ( smeansofdeath )
|
||||
{
|
||||
case "MOD_MELEE":
|
||||
case "MOD_BAYONET":
|
||||
return false;
|
||||
case "MOD_IMPACT":
|
||||
if ( sweapon != "knife_ballistic_mp" )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
if ( shitloc != "head" && shitloc != "helmet" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
switch( smeansofdeath )
|
||||
{
|
||||
case "MOD_BAYONET":
|
||||
case "MOD_MELEE":
|
||||
return 0;
|
||||
case "MOD_IMPACT":
|
||||
if ( sweapon != "knife_ballistic_mp" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
gethitlocheight( shitloc )
|
||||
{
|
||||
switch ( shitloc )
|
||||
{
|
||||
case "neck":
|
||||
case "helmet":
|
||||
case "head":
|
||||
return 60;
|
||||
case "torso_upper":
|
||||
case "right_hand":
|
||||
case "right_arm_upper":
|
||||
case "right_arm_lower":
|
||||
case "left_hand":
|
||||
case "left_arm_upper":
|
||||
case "left_arm_lower":
|
||||
case "gun":
|
||||
return 48;
|
||||
case "torso_lower":
|
||||
return 40;
|
||||
case "right_leg_upper":
|
||||
case "left_leg_upper":
|
||||
return 32;
|
||||
case "right_leg_lower":
|
||||
case "left_leg_lower":
|
||||
return 10;
|
||||
case "right_foot":
|
||||
case "left_foot":
|
||||
return 5;
|
||||
}
|
||||
|
||||
return 48;
|
||||
switch( shitloc )
|
||||
{
|
||||
case "head":
|
||||
case "helmet":
|
||||
case "neck":
|
||||
return 60;
|
||||
case "gun":
|
||||
case "left_arm_lower":
|
||||
case "left_arm_upper":
|
||||
case "left_hand":
|
||||
case "right_arm_lower":
|
||||
case "right_arm_upper":
|
||||
case "right_hand":
|
||||
case "torso_upper":
|
||||
return 48;
|
||||
case "torso_lower":
|
||||
return 40;
|
||||
case "left_leg_upper":
|
||||
case "right_leg_upper":
|
||||
return 32;
|
||||
case "left_leg_lower":
|
||||
case "right_leg_lower":
|
||||
return 10;
|
||||
case "left_foot":
|
||||
case "right_foot":
|
||||
return 5;
|
||||
}
|
||||
return 48;
|
||||
}
|
||||
|
||||
debugline( start, end )
|
||||
{
|
||||
/#
|
||||
for ( i = 0; i < 50; i++ )
|
||||
{
|
||||
line( start, end );
|
||||
wait 0.05;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < 50 )
|
||||
{
|
||||
line( start, end );
|
||||
wait 0,05;
|
||||
i++;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
isexcluded( entity, entitylist )
|
||||
{
|
||||
for ( index = 0; index < entitylist.size; index++ )
|
||||
{
|
||||
if ( entity == entitylist[index] )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
index = 0;
|
||||
while ( index < entitylist.size )
|
||||
{
|
||||
if ( entity == entitylist[ index ] )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
waitfortimeornotifies( desireddelay )
|
||||
{
|
||||
startedwaiting = gettime();
|
||||
waitedtime = ( gettime() - startedwaiting ) / 1000;
|
||||
|
||||
if ( waitedtime < desireddelay )
|
||||
{
|
||||
wait( desireddelay - waitedtime );
|
||||
return desireddelay;
|
||||
}
|
||||
else
|
||||
return waitedtime;
|
||||
startedwaiting = getTime();
|
||||
waitedtime = ( getTime() - startedwaiting ) / 1000;
|
||||
if ( waitedtime < desireddelay )
|
||||
{
|
||||
wait ( desireddelay - waitedtime );
|
||||
return desireddelay;
|
||||
}
|
||||
else
|
||||
{
|
||||
return waitedtime;
|
||||
}
|
||||
}
|
||||
|
||||
logteamwinstring( wintype, winner )
|
||||
{
|
||||
log_string = wintype;
|
||||
|
||||
if ( isdefined( winner ) )
|
||||
log_string = log_string + ", win: " + winner;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
log_string = log_string + ", " + team + ": " + game["teamScores"][team];
|
||||
|
||||
logstring( log_string );
|
||||
log_string = wintype;
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
log_string = ( log_string + ", win: " ) + winner;
|
||||
}
|
||||
_a469 = level.teams;
|
||||
_k469 = getFirstArrayKey( _a469 );
|
||||
while ( isDefined( _k469 ) )
|
||||
{
|
||||
team = _a469[ _k469 ];
|
||||
log_string = ( log_string + ", " ) + team + ": " + game[ "teamScores" ][ team ];
|
||||
_k469 = getNextArrayKey( _a469, _k469 );
|
||||
}
|
||||
logstring( log_string );
|
||||
}
|
||||
|
@ -1,381 +1,471 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_weapons;
|
||||
#include maps\mp\gametypes_zm\_globallogic_player;
|
||||
#include maps\mp\gametypes_zm\_damagefeedback;
|
||||
#include maps/mp/gametypes_zm/_damagefeedback;
|
||||
#include maps/mp/gametypes_zm/_globallogic_player;
|
||||
#include maps/mp/gametypes_zm/_weapons;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
callback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname )
|
||||
{
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = gettime();
|
||||
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
return;
|
||||
|
||||
if ( !isdefined( vdir ) )
|
||||
idflags |= level.idflags_no_knockback;
|
||||
|
||||
friendly = 0;
|
||||
|
||||
if ( isdefined( self.maxhealth ) && self.health == self.maxhealth || !isdefined( self.attackers ) )
|
||||
{
|
||||
self.attackers = [];
|
||||
self.attackerdata = [];
|
||||
self.attackerdamage = [];
|
||||
}
|
||||
|
||||
if ( sweapon == "none" && isdefined( einflictor ) )
|
||||
{
|
||||
if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
sweapon = "explodable_barrel_mp";
|
||||
else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
|
||||
if ( !( idflags & level.idflags_no_protection ) )
|
||||
{
|
||||
if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
|
||||
}
|
||||
else if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_GRENADE" )
|
||||
{
|
||||
idamage *= getvehicleprojectilescalar( sweapon );
|
||||
idamage = int( idamage );
|
||||
|
||||
if ( idamage == 0 )
|
||||
return;
|
||||
}
|
||||
else if ( smeansofdeath == "MOD_GRENADE_SPLASH" )
|
||||
{
|
||||
idamage *= getvehicleunderneathsplashscalar( sweapon );
|
||||
idamage = int( idamage );
|
||||
|
||||
if ( idamage == 0 )
|
||||
return;
|
||||
}
|
||||
|
||||
idamage *= level.vehicledamagescalar;
|
||||
idamage = int( idamage );
|
||||
|
||||
if ( isplayer( eattacker ) )
|
||||
eattacker.pers["participation"]++;
|
||||
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
|
||||
if ( isdefined( self.owner ) && isplayer( self.owner ) )
|
||||
team = self.owner.pers["team"];
|
||||
|
||||
if ( level.teambased && isplayer( eattacker ) && team == eattacker.pers["team"] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 );
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 );
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0.5 );
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
}
|
||||
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.teambased && isdefined( self.targetname ) && self.targetname == "rcbomb" )
|
||||
{
|
||||
|
||||
}
|
||||
else if ( isdefined( self.owner ) && isdefined( eattacker ) && self.owner == eattacker )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( sweapon ) )
|
||||
eattacker thread maps\mp\gametypes_zm\_weapons::checkhit( sweapon );
|
||||
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isdefined( einflictor.iscooked ) )
|
||||
self.wascooked = gettime();
|
||||
else
|
||||
self.wascooked = undefined;
|
||||
|
||||
attacker_seat = undefined;
|
||||
|
||||
if ( isdefined( eattacker ) )
|
||||
attacker_seat = self getoccupantseat( eattacker );
|
||||
|
||||
self.lastdamagewasfromenemy = isdefined( eattacker ) && !isdefined( attacker_seat );
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
|
||||
if ( level.gametype == "hack" && sweapon != "emp_grenade_mp" )
|
||||
idamage = 0;
|
||||
}
|
||||
|
||||
if ( isdefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( sweapon, einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
eattacker thread maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = getTime();
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( vdir ) )
|
||||
{
|
||||
idflags |= level.idflags_no_knockback;
|
||||
}
|
||||
friendly = 0;
|
||||
if ( isDefined( self.maxhealth ) || self.health == self.maxhealth && !isDefined( self.attackers ) )
|
||||
{
|
||||
self.attackers = [];
|
||||
self.attackerdata = [];
|
||||
self.attackerdamage = [];
|
||||
}
|
||||
if ( sweapon == "none" && isDefined( einflictor ) )
|
||||
{
|
||||
if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
{
|
||||
sweapon = "explodable_barrel_mp";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
{
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( idflags & level.idflags_no_protection )
|
||||
{
|
||||
if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_GRENADE" )
|
||||
{
|
||||
idamage *= getvehicleprojectilescalar( sweapon );
|
||||
idamage = int( idamage );
|
||||
if ( idamage == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( smeansofdeath == "MOD_GRENADE_SPLASH" )
|
||||
{
|
||||
idamage *= getvehicleunderneathsplashscalar( sweapon );
|
||||
idamage = int( idamage );
|
||||
if ( idamage == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
idamage *= level.vehicledamagescalar;
|
||||
idamage = int( idamage );
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
eattacker.pers[ "participation" ]++;
|
||||
}
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
if ( isDefined( self.owner ) && isplayer( self.owner ) )
|
||||
{
|
||||
team = self.owner.pers[ "team" ];
|
||||
}
|
||||
if ( level.teambased && isplayer( eattacker ) && team == eattacker.pers[ "team" ] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 );
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0,5 );
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
}
|
||||
}
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.teambased && isDefined( self.targetname ) && self.targetname == "rcbomb" )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.owner ) && isDefined( eattacker ) && self.owner == eattacker )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes_zm/_weapons::checkhit( sweapon );
|
||||
}
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isDefined( einflictor.iscooked ) )
|
||||
{
|
||||
self.wascooked = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.wascooked = undefined;
|
||||
}
|
||||
attacker_seat = undefined;
|
||||
if ( isDefined( eattacker ) )
|
||||
{
|
||||
attacker_seat = self getoccupantseat( eattacker );
|
||||
}
|
||||
if ( isDefined( eattacker ) )
|
||||
{
|
||||
self.lastdamagewasfromenemy = !isDefined( attacker_seat );
|
||||
}
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
if ( level.gametype == "hack" && sweapon != "emp_grenade_mp" )
|
||||
{
|
||||
idamage = 0;
|
||||
}
|
||||
}
|
||||
if ( isDefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( sweapon, einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/#
|
||||
if ( getdvarint( "g_debugDamage" ) )
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc );
|
||||
if ( getDvarInt( "g_debugDamage" ) )
|
||||
{
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc );
|
||||
#/
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = "";
|
||||
lpattackerteam = "";
|
||||
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
lpattacknum = eattacker getentitynumber();
|
||||
lpattackguid = eattacker getguid();
|
||||
lpattackname = eattacker.name;
|
||||
lpattackerteam = eattacker.pers["team"];
|
||||
}
|
||||
else
|
||||
{
|
||||
lpattacknum = -1;
|
||||
lpattackguid = "";
|
||||
lpattackname = "";
|
||||
lpattackerteam = "world";
|
||||
}
|
||||
|
||||
logprint( "VD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" );
|
||||
}
|
||||
}
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = "";
|
||||
lpattackerteam = "";
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
lpattacknum = eattacker getentitynumber();
|
||||
lpattackguid = eattacker getguid();
|
||||
lpattackname = eattacker.name;
|
||||
lpattackerteam = eattacker.pers[ "team" ];
|
||||
}
|
||||
else
|
||||
{
|
||||
lpattacknum = -1;
|
||||
lpattackguid = "";
|
||||
lpattackname = "";
|
||||
lpattackerteam = "world";
|
||||
}
|
||||
logprint( "VD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" );
|
||||
}
|
||||
}
|
||||
|
||||
callback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime )
|
||||
{
|
||||
idamage = 0;
|
||||
finnerdamage = 0;
|
||||
fouterdamage = 0;
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = gettime();
|
||||
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
return;
|
||||
|
||||
friendly = 0;
|
||||
|
||||
if ( !( idflags & level.idflags_no_protection ) )
|
||||
{
|
||||
if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE_SPLASH" || smeansofdeath == "MOD_EXPLOSIVE" )
|
||||
{
|
||||
scalar = getvehicleprojectilesplashscalar( sweapon );
|
||||
idamage = int( idamage * scalar );
|
||||
finnerdamage *= scalar;
|
||||
fouterdamage *= scalar;
|
||||
|
||||
if ( finnerdamage == 0 )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
}
|
||||
|
||||
occupant_team = undefined;
|
||||
|
||||
if ( level.teambased && isplayer( eattacker ) && occupant_team == eattacker.pers["team"] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0.5 );
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
}
|
||||
idamage = 0;
|
||||
finnerdamage = 0;
|
||||
fouterdamage = 0;
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = getTime();
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
{
|
||||
return;
|
||||
}
|
||||
friendly = 0;
|
||||
if ( idflags & level.idflags_no_protection )
|
||||
{
|
||||
if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( smeansofdeath != "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE_SPLASH" && smeansofdeath == "MOD_EXPLOSIVE" )
|
||||
{
|
||||
scalar = getvehicleprojectilesplashscalar( sweapon );
|
||||
idamage = int( idamage * scalar );
|
||||
finnerdamage *= scalar;
|
||||
fouterdamage *= scalar;
|
||||
if ( finnerdamage == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
}
|
||||
occupant_team = undefined;
|
||||
if ( level.teambased && isplayer( eattacker ) && occupant_team == eattacker.pers[ "team" ] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0,5 );
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
}
|
||||
friendly = 1;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vehiclecrush()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
if ( isdefined( level._effect ) && isdefined( level._effect["tanksquish"] ) )
|
||||
playfx( level._effect["tanksquish"], self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ) );
|
||||
|
||||
self playsound( "chr_crunch" );
|
||||
self endon( "disconnect" );
|
||||
if ( isDefined( level._effect ) && isDefined( level._effect[ "tanksquish" ] ) )
|
||||
{
|
||||
playfx( level._effect[ "tanksquish" ], self.origin + vectorScale( ( 0, 0, 1 ), 30 ) );
|
||||
}
|
||||
self playsound( "chr_crunch" );
|
||||
}
|
||||
|
||||
getvehicleprojectilescalar( sweapon )
|
||||
{
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
scale = 1;
|
||||
else if ( sweapon == "sticky_grenade_mp" )
|
||||
scale = 1;
|
||||
else if ( sweapon == "claymore_mp" )
|
||||
scale = 1;
|
||||
else if ( sweapon == "remote_missile_missile_mp" )
|
||||
scale = 10.0;
|
||||
else if ( sweapon == "remote_mortar_missile_mp" )
|
||||
scale = 10.0;
|
||||
else if ( sweapon == "smaw_mp" )
|
||||
scale = 0.2;
|
||||
else if ( sweapon == "fhj18_mp" )
|
||||
scale = 0.2;
|
||||
else if ( issubstr( sweapon, "gl_" ) )
|
||||
scale = 1;
|
||||
else if ( issubstr( sweapon, "turret_mp" ) )
|
||||
scale = 1;
|
||||
else if ( issubstr( sweapon, "grenade" ) )
|
||||
scale = 1;
|
||||
else
|
||||
scale = 1;
|
||||
|
||||
return scale;
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( sweapon == "sticky_grenade_mp" )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( sweapon == "claymore_mp" )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( sweapon == "remote_missile_missile_mp" )
|
||||
{
|
||||
scale = 10;
|
||||
}
|
||||
else if ( sweapon == "remote_mortar_missile_mp" )
|
||||
{
|
||||
scale = 10;
|
||||
}
|
||||
else if ( sweapon == "smaw_mp" )
|
||||
{
|
||||
scale = 0,2;
|
||||
}
|
||||
else if ( sweapon == "fhj18_mp" )
|
||||
{
|
||||
scale = 0,2;
|
||||
}
|
||||
else if ( issubstr( sweapon, "gl_" ) )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( issubstr( sweapon, "turret_mp" ) )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( issubstr( sweapon, "grenade" ) )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
return scale;
|
||||
}
|
||||
|
||||
getvehicleprojectilesplashscalar( sweapon )
|
||||
{
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
scale = 1;
|
||||
else if ( sweapon == "sticky_grenade_mp" )
|
||||
scale = 1;
|
||||
else if ( sweapon == "claymore_mp" )
|
||||
scale = 1;
|
||||
else if ( sweapon == "remote_missile_missile_mp" )
|
||||
scale = 10.0;
|
||||
else if ( sweapon == "remote_mortar_missile_mp" )
|
||||
scale = 4.0;
|
||||
else if ( sweapon == "chopper_minigun_mp" )
|
||||
scale = 0.5;
|
||||
else if ( issubstr( sweapon, "gl_" ) )
|
||||
scale = 0.5;
|
||||
else if ( issubstr( sweapon, "turrent_mp" ) )
|
||||
scale = 0.1;
|
||||
else if ( issubstr( sweapon, "grenade" ) )
|
||||
scale = 1;
|
||||
else
|
||||
scale = 1;
|
||||
|
||||
return scale;
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( sweapon == "sticky_grenade_mp" )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( sweapon == "claymore_mp" )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else if ( sweapon == "remote_missile_missile_mp" )
|
||||
{
|
||||
scale = 10;
|
||||
}
|
||||
else if ( sweapon == "remote_mortar_missile_mp" )
|
||||
{
|
||||
scale = 4;
|
||||
}
|
||||
else if ( sweapon == "chopper_minigun_mp" )
|
||||
{
|
||||
scale = 0,5;
|
||||
}
|
||||
else if ( issubstr( sweapon, "gl_" ) )
|
||||
{
|
||||
scale = 0,5;
|
||||
}
|
||||
else if ( issubstr( sweapon, "turrent_mp" ) )
|
||||
{
|
||||
scale = 0,1;
|
||||
}
|
||||
else if ( issubstr( sweapon, "grenade" ) )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
return scale;
|
||||
}
|
||||
|
||||
getvehicleunderneathsplashscalar( sweapon )
|
||||
{
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
{
|
||||
scale = 10.0;
|
||||
scale *= 3.0;
|
||||
}
|
||||
else
|
||||
scale = 1.0;
|
||||
|
||||
return scale;
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
{
|
||||
scale = 10;
|
||||
scale *= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
return scale;
|
||||
}
|
||||
|
||||
getvehiclebulletdamage( sweapon )
|
||||
{
|
||||
if ( issubstr( sweapon, "ptrs41_" ) )
|
||||
idamage = 25;
|
||||
else if ( issubstr( sweapon, "gunner" ) )
|
||||
idamage = 5;
|
||||
else if ( issubstr( sweapon, "mg42_bipod" ) || issubstr( sweapon, "30cal_bipod" ) )
|
||||
idamage = 5;
|
||||
else
|
||||
idamage = 1;
|
||||
|
||||
return idamage;
|
||||
if ( issubstr( sweapon, "ptrs41_" ) )
|
||||
{
|
||||
idamage = 25;
|
||||
}
|
||||
else if ( issubstr( sweapon, "gunner" ) )
|
||||
{
|
||||
idamage = 5;
|
||||
}
|
||||
else if ( issubstr( sweapon, "mg42_bipod" ) || issubstr( sweapon, "30cal_bipod" ) )
|
||||
{
|
||||
idamage = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
return idamage;
|
||||
}
|
||||
|
||||
allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon )
|
||||
{
|
||||
if ( isdefined( self.allowfriendlyfiredamageoverride ) )
|
||||
return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon );
|
||||
|
||||
vehicle = eattacker getvehicleoccupied();
|
||||
return 0;
|
||||
if ( isDefined( self.allowfriendlyfiredamageoverride ) )
|
||||
{
|
||||
return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon );
|
||||
}
|
||||
vehicle = eattacker getvehicleoccupied();
|
||||
return 0;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,280 +1,276 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes_zm\_globallogic_player;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
precacheshader( "overlay_low_health" );
|
||||
level.healthoverlaycutoff = 0.55;
|
||||
regentime = level.playerhealthregentime;
|
||||
level.playerhealth_regularregendelay = regentime * 1000;
|
||||
level.healthregendisabled = level.playerhealth_regularregendelay <= 0;
|
||||
level thread onplayerconnect();
|
||||
precacheshader( "overlay_low_health" );
|
||||
level.healthoverlaycutoff = 0.55;
|
||||
regentime = level.playerhealthregentime;
|
||||
level.playerhealth_regularregendelay = regentime * 1000;
|
||||
level.healthregendisabled = level.playerhealth_regularregendelay <= 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerdisconnect();
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerdisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam()
|
||||
onjoinedteam() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators()
|
||||
onjoinedspectators() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled()
|
||||
onplayerkilled() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect()
|
||||
onplayerdisconnect() //checked matches cerberus output
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
self waittill( "disconnect" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
|
||||
playerhealthregen()
|
||||
playerhealthregen() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "end_healthregen" );
|
||||
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
self endon( "end_healthregen" );
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( !isalive( self ) );
|
||||
assert( !isalive( self ) );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
|
||||
maxhealth = self.health;
|
||||
oldhealth = maxhealth;
|
||||
player = self;
|
||||
health_add = 0;
|
||||
regenrate = 0.1;
|
||||
usetrueregen = 0;
|
||||
veryhurt = 0;
|
||||
player.breathingstoptime = -10000;
|
||||
thread playerbreathingsound( maxhealth * 0.35 );
|
||||
thread playerheartbeatsound( maxhealth * 0.35 );
|
||||
lastsoundtime_recover = 0;
|
||||
hurttime = 0;
|
||||
newhealth = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( player.regenrate ) )
|
||||
{
|
||||
regenrate = player.regenrate;
|
||||
usetrueregen = 1;
|
||||
}
|
||||
|
||||
if ( player.health == maxhealth )
|
||||
{
|
||||
veryhurt = 0;
|
||||
self.atbrinkofdeath = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( player.health <= 0 )
|
||||
return;
|
||||
|
||||
if ( isdefined( player.laststand ) && player.laststand )
|
||||
continue;
|
||||
|
||||
wasveryhurt = veryhurt;
|
||||
ratio = player.health / maxhealth;
|
||||
|
||||
if ( ratio <= level.healthoverlaycutoff )
|
||||
{
|
||||
veryhurt = 1;
|
||||
self.atbrinkofdeath = 1;
|
||||
|
||||
if ( !wasveryhurt )
|
||||
hurttime = gettime();
|
||||
}
|
||||
|
||||
if ( player.health >= oldhealth )
|
||||
{
|
||||
regentime = level.playerhealth_regularregendelay;
|
||||
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
regentime = int( regentime / getdvarfloat( "perk_healthRegenMultiplier" ) );
|
||||
|
||||
if ( gettime() - hurttime < regentime )
|
||||
continue;
|
||||
|
||||
if ( level.healthregendisabled )
|
||||
continue;
|
||||
|
||||
if ( gettime() - lastsoundtime_recover > regentime )
|
||||
{
|
||||
lastsoundtime_recover = gettime();
|
||||
self notify( "snd_breathing_better" );
|
||||
}
|
||||
|
||||
if ( veryhurt )
|
||||
{
|
||||
newhealth = ratio;
|
||||
veryhurttime = 3000;
|
||||
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
veryhurttime = int( veryhurttime / getdvarfloat( "perk_healthRegenMultiplier" ) );
|
||||
|
||||
if ( gettime() > hurttime + veryhurttime )
|
||||
newhealth += regenrate;
|
||||
}
|
||||
else if ( usetrueregen )
|
||||
newhealth = ratio + regenrate;
|
||||
else
|
||||
newhealth = 1;
|
||||
|
||||
if ( newhealth >= 1.0 )
|
||||
{
|
||||
self maps\mp\gametypes_zm\_globallogic_player::resetattackerlist();
|
||||
newhealth = 1.0;
|
||||
}
|
||||
|
||||
if ( newhealth <= 0 )
|
||||
return;
|
||||
|
||||
player setnormalhealth( newhealth );
|
||||
change = player.health - oldhealth;
|
||||
|
||||
if ( change > 0 )
|
||||
player decayplayerdamages( change );
|
||||
|
||||
oldhealth = player.health;
|
||||
continue;
|
||||
}
|
||||
|
||||
oldhealth = player.health;
|
||||
health_add = 0;
|
||||
hurttime = gettime();
|
||||
player.breathingstoptime = hurttime + 6000;
|
||||
}
|
||||
*/
|
||||
return;
|
||||
}
|
||||
maxhealth = self.health;
|
||||
oldhealth = maxhealth;
|
||||
player = self;
|
||||
health_add = 0;
|
||||
regenrate = 0.1;
|
||||
usetrueregen = 0;
|
||||
veryhurt = 0;
|
||||
player.breathingstoptime = -10000;
|
||||
thread playerbreathingsound( maxhealth * 0.35 );
|
||||
thread playerheartbeatsound( maxhealth * 0.35 );
|
||||
lastsoundtime_recover = 0;
|
||||
hurttime = 0;
|
||||
newhealth = 0;
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0.05;
|
||||
if ( isDefined( player.regenrate ) )
|
||||
{
|
||||
regenrate = player.regenrate;
|
||||
usetrueregen = 1;
|
||||
}
|
||||
if ( player.health == maxhealth )
|
||||
{
|
||||
veryhurt = 0;
|
||||
self.atbrinkofdeath = 0;
|
||||
continue;
|
||||
}
|
||||
if ( player.health <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( player.laststand ) && player.laststand )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
wasveryhurt = veryhurt;
|
||||
ratio = player.health / maxhealth;
|
||||
if ( ratio <= level.healthoverlaycutoff )
|
||||
{
|
||||
veryhurt = 1;
|
||||
self.atbrinkofdeath = 1;
|
||||
if ( !wasveryhurt )
|
||||
{
|
||||
hurttime = getTime();
|
||||
}
|
||||
}
|
||||
if ( player.health >= oldhealth )
|
||||
{
|
||||
regentime = level.playerhealth_regularregendelay;
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
{
|
||||
regentime = int( regentime / getDvarFloat( "perk_healthRegenMultiplier" ) );
|
||||
}
|
||||
if ( ( getTime() - hurttime ) < regentime )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( level.healthregendisabled )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( ( getTime() - lastsoundtime_recover ) > regentime )
|
||||
{
|
||||
lastsoundtime_recover = getTime();
|
||||
self notify( "snd_breathing_better" );
|
||||
}
|
||||
if ( veryhurt )
|
||||
{
|
||||
newhealth = ratio;
|
||||
veryhurttime = 3000;
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
{
|
||||
veryhurttime = int( veryhurttime / getDvarFloat( "perk_healthRegenMultiplier" ) );
|
||||
}
|
||||
if ( getTime() > ( hurttime + veryhurttime ) )
|
||||
{
|
||||
newhealth += regenrate;
|
||||
}
|
||||
}
|
||||
else if ( usetrueregen )
|
||||
{
|
||||
newhealth = ratio + regenrate;
|
||||
}
|
||||
else
|
||||
{
|
||||
newhealth = 1;
|
||||
}
|
||||
if ( newhealth >= 1 )
|
||||
{
|
||||
self maps/mp/gametypes/_globallogic_player::resetattackerlist();
|
||||
newhealth = 1;
|
||||
}
|
||||
if ( newhealth <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player setnormalhealth( newhealth );
|
||||
change = player.health - oldhealth;
|
||||
if ( change > 0 )
|
||||
{
|
||||
player decayplayerdamages( change );
|
||||
}
|
||||
oldhealth = player.health;
|
||||
continue;
|
||||
}
|
||||
oldhealth = player.health;
|
||||
health_add = 0;
|
||||
hurttime = getTime();
|
||||
player.breathingstoptime = hurttime + 6000;
|
||||
}
|
||||
}
|
||||
|
||||
decayplayerdamages( decay )
|
||||
decayplayerdamages( decay ) //checked partially changed to match cerberus output //continues in for loops bad see github for more info
|
||||
{
|
||||
if ( !isdefined( self.attackerdamage ) )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < self.attackerdamage.size; i++ )
|
||||
{
|
||||
if ( !isdefined( self.attackerdamage[i] ) || !isdefined( self.attackerdamage[i].damage ) )
|
||||
continue;
|
||||
|
||||
self.attackerdamage[i].damage -= decay;
|
||||
|
||||
if ( self.attackerdamage[i].damage < 0 )
|
||||
self.attackerdamage[i].damage = 0;
|
||||
}
|
||||
if ( !isDefined( self.attackerdamage ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.attackerdamage.size )
|
||||
{
|
||||
if ( !isDefined( self.attackerdamage[ i ] ) || !isDefined( self.attackerdamage[ i ].damage ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
self.attackerdamage[ i ].damage -= decay;
|
||||
if ( self.attackerdamage[ i ].damage < 0 )
|
||||
{
|
||||
self.attackerdamage[ i ].damage = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
playerbreathingsound( healthcap )
|
||||
playerbreathingsound( healthcap ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "end_healthregen" );
|
||||
wait 2;
|
||||
player = self;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.2;
|
||||
|
||||
if ( player.health <= 0 )
|
||||
return;
|
||||
|
||||
if ( player.health >= healthcap )
|
||||
continue;
|
||||
|
||||
if ( level.healthregendisabled && gettime() > player.breathingstoptime )
|
||||
continue;
|
||||
|
||||
player notify( "snd_breathing_hurt" );
|
||||
wait 0.784;
|
||||
wait( 0.1 + randomfloat( 0.8 ) );
|
||||
}
|
||||
self endon( "end_healthregen" );
|
||||
wait 2;
|
||||
player = self;
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0.2;
|
||||
if ( player.health <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( player.health >= healthcap )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( level.healthregendisabled && getTime() > player.breathingstoptime )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
player notify( "snd_breathing_hurt" );
|
||||
wait 0.784;
|
||||
wait ( 0.1 + randomfloat( 0.8 ) );
|
||||
}
|
||||
}
|
||||
|
||||
playerheartbeatsound( healthcap )
|
||||
playerheartbeatsound( healthcap ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "end_healthregen" );
|
||||
self.hearbeatwait = 0.2;
|
||||
wait 2;
|
||||
player = self;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.2;
|
||||
|
||||
if ( player.health <= 0 )
|
||||
return;
|
||||
|
||||
if ( player.health >= healthcap )
|
||||
{
|
||||
self.hearbeatwait = 0.3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( level.healthregendisabled && gettime() > player.breathingstoptime )
|
||||
{
|
||||
self.hearbeatwait = 0.3;
|
||||
continue;
|
||||
}
|
||||
|
||||
player playlocalsound( "mpl_player_heartbeat" );
|
||||
wait( self.hearbeatwait );
|
||||
|
||||
if ( self.hearbeatwait <= 0.6 )
|
||||
self.hearbeatwait += 0.1;
|
||||
}
|
||||
self endon( "end_healthregen" );
|
||||
self.hearbeatwait = 0.2;
|
||||
wait 2;
|
||||
player = self;
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0.2;
|
||||
if ( player.health <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( player.health >= healthcap )
|
||||
{
|
||||
self.hearbeatwait = 0.3;
|
||||
continue;
|
||||
}
|
||||
else if ( level.healthregendisabled && getTime() > player.breathingstoptime )
|
||||
{
|
||||
self.hearbeatwait = 0.3;
|
||||
continue;
|
||||
}
|
||||
player playlocalsound( "mpl_player_heartbeat" );
|
||||
wait self.hearbeatwait;
|
||||
if ( self.hearbeatwait <= 0.6 )
|
||||
{
|
||||
self.hearbeatwait += 0.1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,160 +1,161 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
init() //checked changed to match cerberus output
|
||||
{
|
||||
precacheshader( "progress_bar_bg" );
|
||||
precacheshader( "progress_bar_fg" );
|
||||
precacheshader( "progress_bar_fill" );
|
||||
precacheshader( "score_bar_bg" );
|
||||
level.uiparent = spawnstruct();
|
||||
level.uiparent.horzalign = "left";
|
||||
level.uiparent.vertalign = "top";
|
||||
level.uiparent.alignx = "left";
|
||||
level.uiparent.aligny = "top";
|
||||
level.uiparent.x = 0;
|
||||
level.uiparent.y = 0;
|
||||
level.uiparent.width = 0;
|
||||
level.uiparent.height = 0;
|
||||
level.uiparent.children = [];
|
||||
level.fontheight = 12;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
level.hud[team] = spawnstruct();
|
||||
|
||||
level.primaryprogressbary = -61;
|
||||
level.primaryprogressbarx = 0;
|
||||
level.primaryprogressbarheight = 9;
|
||||
level.primaryprogressbarwidth = 120;
|
||||
level.primaryprogressbartexty = -75;
|
||||
level.primaryprogressbartextx = 0;
|
||||
level.primaryprogressbarfontsize = 1.4;
|
||||
level.primaryprogressbarx_ss = 20;
|
||||
level.primaryprogressbartextx_ss = 20;
|
||||
level.primaryprogressbary_ss = 30;
|
||||
level.primaryprogressbartexty_ss = 33;
|
||||
level.primaryprogressbarheight_ss = 2;
|
||||
level.secondaryprogressbary = -85;
|
||||
level.secondaryprogressbarx = 0;
|
||||
level.secondaryprogressbarheight = 9;
|
||||
level.secondaryprogressbarwidth = 120;
|
||||
level.secondaryprogressbartexty = -100;
|
||||
level.secondaryprogressbartextx = 0;
|
||||
level.secondaryprogressbarfontsize = 1.4;
|
||||
level.secondaryprogressbarx_ss = 20;
|
||||
level.secondaryprogressbartextx_ss = 20;
|
||||
level.secondaryprogressbary_ss = 15;
|
||||
level.secondaryprogressbartexty_ss = 0;
|
||||
level.secondaryprogressbarheight_ss = 2;
|
||||
level.teamprogressbary = 32;
|
||||
level.teamprogressbarheight = 14;
|
||||
level.teamprogressbarwidth = 192;
|
||||
level.teamprogressbartexty = 8;
|
||||
level.teamprogressbarfontsize = 1.65;
|
||||
setdvar( "ui_generic_status_bar", 0 );
|
||||
level.lowertextyalign = "BOTTOM";
|
||||
level.lowertexty = -42;
|
||||
level.lowertextfontsize = 1.4;
|
||||
level.lowertextyalign_ss = "CENTER";
|
||||
level.lowertexty_ss = 40;
|
||||
level.lowertextfontsize_ss = 1.4;
|
||||
precacheshader( "progress_bar_bg" );
|
||||
precacheshader( "progress_bar_fg" );
|
||||
precacheshader( "progress_bar_fill" );
|
||||
precacheshader( "score_bar_bg" );
|
||||
level.uiparent = spawnstruct();
|
||||
level.uiparent.horzalign = "left";
|
||||
level.uiparent.vertalign = "top";
|
||||
level.uiparent.alignx = "left";
|
||||
level.uiparent.aligny = "top";
|
||||
level.uiparent.x = 0;
|
||||
level.uiparent.y = 0;
|
||||
level.uiparent.width = 0;
|
||||
level.uiparent.height = 0;
|
||||
level.uiparent.children = [];
|
||||
level.fontheight = 12;
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
level.hud[ team ] = spawnstruct();
|
||||
}
|
||||
level.primaryprogressbary = -61;
|
||||
level.primaryprogressbarx = 0;
|
||||
level.primaryprogressbarheight = 9;
|
||||
level.primaryprogressbarwidth = 120;
|
||||
level.primaryprogressbartexty = -75;
|
||||
level.primaryprogressbartextx = 0;
|
||||
level.primaryprogressbarfontsize = 1.4;
|
||||
level.primaryprogressbarx_ss = 20;
|
||||
level.primaryprogressbartextx_ss = 20;
|
||||
level.primaryprogressbary_ss = 30;
|
||||
level.primaryprogressbartexty_ss = 33;
|
||||
level.primaryprogressbarheight_ss = 2;
|
||||
level.secondaryprogressbary = -85;
|
||||
level.secondaryprogressbarx = 0;
|
||||
level.secondaryprogressbarheight = 9;
|
||||
level.secondaryprogressbarwidth = 120;
|
||||
level.secondaryprogressbartexty = -100;
|
||||
level.secondaryprogressbartextx = 0;
|
||||
level.secondaryprogressbarfontsize = 1.4;
|
||||
level.secondaryprogressbarx_ss = 20;
|
||||
level.secondaryprogressbartextx_ss = 20;
|
||||
level.secondaryprogressbary_ss = 15;
|
||||
level.secondaryprogressbartexty_ss = 0;
|
||||
level.secondaryprogressbarheight_ss = 2;
|
||||
level.teamprogressbary = 32;
|
||||
level.teamprogressbarheight = 14;
|
||||
level.teamprogressbarwidth = 192;
|
||||
level.teamprogressbartexty = 8;
|
||||
level.teamprogressbarfontsize = 1.65;
|
||||
setdvar("ui_generic_status_bar", 0);
|
||||
level.lowertextyalign = "BOTTOM";
|
||||
level.lowertexty = -42;
|
||||
level.lowertextfontsize = 1.4;
|
||||
level.lowertextyalign_ss = "CENTER";
|
||||
level.lowertexty_ss = 40;
|
||||
level.lowertextfontsize_ss = 1.4;
|
||||
}
|
||||
|
||||
fontpulseinit()
|
||||
fontpulseinit() //checked matches cerberus output
|
||||
{
|
||||
self.basefontscale = self.fontscale;
|
||||
self.maxfontscale = self.fontscale * 2;
|
||||
self.inframes = 1.5;
|
||||
self.outframes = 3;
|
||||
self.basefontscale = self.fontscale;
|
||||
self.maxfontscale = self.fontscale * 2;
|
||||
self.inframes = 1.5;
|
||||
self.outframes = 3;
|
||||
}
|
||||
|
||||
fontpulse( player )
|
||||
fontpulse( player ) //checked matches cerberus output
|
||||
{
|
||||
self notify( "fontPulse" );
|
||||
self endon( "fontPulse" );
|
||||
self endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "joined_team" );
|
||||
player endon( "joined_spectators" );
|
||||
|
||||
if ( self.outframes == 0 )
|
||||
self.fontscale = 0.01;
|
||||
else
|
||||
self.fontscale = self.fontscale;
|
||||
|
||||
if ( self.inframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.inframes * 0.05 );
|
||||
self.fontscale = self.maxfontscale;
|
||||
wait( self.inframes * 0.05 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.fontscale = self.maxfontscale;
|
||||
self.alpha = 0;
|
||||
self fadeovertime( self.outframes * 0.05 );
|
||||
self.alpha = 1;
|
||||
}
|
||||
|
||||
if ( self.outframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.outframes * 0.05 );
|
||||
self.fontscale = self.basefontscale;
|
||||
}
|
||||
self notify( "fontPulse" );
|
||||
self endon( "fontPulse" );
|
||||
self endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "joined_team" );
|
||||
player endon( "joined_spectators" );
|
||||
if ( self.outframes == 0 )
|
||||
{
|
||||
self.fontscale = 0.01;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.fontscale = self.fontscale;
|
||||
}
|
||||
if ( self.inframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.inframes * 0.05 );
|
||||
self.fontscale = self.maxfontscale;
|
||||
wait ( self.inframes * 0.05 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.fontscale = self.maxfontscale;
|
||||
self.alpha = 0;
|
||||
self fadeovertime( self.outframes * 0.05 );
|
||||
self.alpha = 1;
|
||||
}
|
||||
if ( self.outframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.outframes * 0.05 );
|
||||
self.fontscale = self.basefontscale;
|
||||
}
|
||||
}
|
||||
|
||||
fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername, n_sort )
|
||||
fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername ) //checked matches cerberus output
|
||||
{
|
||||
if ( !isdefined( n_sort ) )
|
||||
n_sort = 50;
|
||||
|
||||
wait( startwait );
|
||||
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.blackscreen ) )
|
||||
self.blackscreen = newclienthudelem( self );
|
||||
|
||||
self.blackscreen.x = 0;
|
||||
self.blackscreen.y = 0;
|
||||
self.blackscreen.horzalign = "fullscreen";
|
||||
self.blackscreen.vertalign = "fullscreen";
|
||||
self.blackscreen.foreground = 0;
|
||||
self.blackscreen.hidewhendead = 0;
|
||||
self.blackscreen.hidewheninmenu = 1;
|
||||
self.blackscreen.sort = n_sort;
|
||||
|
||||
if ( isdefined( shadername ) )
|
||||
self.blackscreen setshader( shadername, 640, 480 );
|
||||
else
|
||||
self.blackscreen setshader( "black", 640, 480 );
|
||||
|
||||
self.blackscreen.alpha = 0;
|
||||
|
||||
if ( fadeintime > 0 )
|
||||
self.blackscreen fadeovertime( fadeintime );
|
||||
|
||||
self.blackscreen.alpha = 1;
|
||||
wait( fadeintime );
|
||||
|
||||
if ( !isdefined( self.blackscreen ) )
|
||||
return;
|
||||
|
||||
wait( blackscreenwait );
|
||||
|
||||
if ( !isdefined( self.blackscreen ) )
|
||||
return;
|
||||
|
||||
if ( fadeouttime > 0 )
|
||||
self.blackscreen fadeovertime( fadeouttime );
|
||||
|
||||
self.blackscreen.alpha = 0;
|
||||
wait( fadeouttime );
|
||||
|
||||
if ( isdefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen destroy();
|
||||
self.blackscreen = undefined;
|
||||
}
|
||||
wait startwait;
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen = newclienthudelem( self );
|
||||
}
|
||||
self.blackscreen.x = 0;
|
||||
self.blackscreen.y = 0;
|
||||
self.blackscreen.horzalign = "fullscreen";
|
||||
self.blackscreen.vertalign = "fullscreen";
|
||||
self.blackscreen.foreground = 0;
|
||||
self.blackscreen.hidewhendead = 0;
|
||||
self.blackscreen.hidewheninmenu = 1;
|
||||
self.blackscreen.immunetodemogamehudsettings = 1;
|
||||
self.blackscreen.sort = 50;
|
||||
if ( isDefined( shadername ) )
|
||||
{
|
||||
self.blackscreen setshader( shadername, 640, 480 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.blackscreen setshader( "black", 640, 480 );
|
||||
}
|
||||
self.blackscreen.alpha = 0;
|
||||
if ( fadeintime > 0 )
|
||||
{
|
||||
self.blackscreen fadeovertime( fadeintime );
|
||||
}
|
||||
self.blackscreen.alpha = 1;
|
||||
wait fadeintime;
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait blackscreenwait;
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( fadeouttime > 0 )
|
||||
{
|
||||
self.blackscreen fadeovertime( fadeouttime );
|
||||
}
|
||||
self.blackscreen.alpha = 0;
|
||||
wait fadeouttime;
|
||||
if ( isDefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen destroy();
|
||||
self.blackscreen = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,174 +1,167 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes_zm\_globallogic;
|
||||
#include maps\mp\gametypes_zm\_rank;
|
||||
#include maps/mp/gametypes_zm/_rank;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
init() //checked changed to match cerberus output
|
||||
{
|
||||
precachestring( &"open_ingame_menu" );
|
||||
game["menu_team"] = "team_marinesopfor";
|
||||
game["menu_initteam_allies"] = "initteam_marines";
|
||||
game["menu_initteam_axis"] = "initteam_opfor";
|
||||
game["menu_class"] = "class";
|
||||
game["menu_changeclass"] = "changeclass";
|
||||
game["menu_changeclass_offline"] = "changeclass";
|
||||
game["menu_wager_side_bet"] = "sidebet";
|
||||
game["menu_wager_side_bet_player"] = "sidebet_player";
|
||||
game["menu_changeclass_wager"] = "changeclass_wager";
|
||||
game["menu_changeclass_custom"] = "changeclass_custom";
|
||||
game["menu_changeclass_barebones"] = "changeclass_barebones";
|
||||
|
||||
foreach ( team in level.teams )
|
||||
game["menu_changeclass_" + team] = "changeclass";
|
||||
|
||||
game["menu_controls"] = "ingame_controls";
|
||||
game["menu_options"] = "ingame_options";
|
||||
game["menu_leavegame"] = "popup_leavegame";
|
||||
precachemenu( game["menu_controls"] );
|
||||
precachemenu( game["menu_options"] );
|
||||
precachemenu( game["menu_leavegame"] );
|
||||
precachemenu( "scoreboard" );
|
||||
precachemenu( "spectate" );
|
||||
precachemenu( game["menu_team"] );
|
||||
precachemenu( game["menu_changeclass_allies"] );
|
||||
precachemenu( game["menu_initteam_allies"] );
|
||||
precachemenu( game["menu_changeclass_axis"] );
|
||||
precachemenu( game["menu_class"] );
|
||||
precachemenu( game["menu_changeclass"] );
|
||||
precachemenu( game["menu_initteam_axis"] );
|
||||
precachemenu( game["menu_changeclass_offline"] );
|
||||
precachemenu( game["menu_changeclass_wager"] );
|
||||
precachemenu( game["menu_changeclass_custom"] );
|
||||
precachemenu( game["menu_changeclass_barebones"] );
|
||||
precachemenu( game["menu_wager_side_bet"] );
|
||||
precachemenu( game["menu_wager_side_bet_player"] );
|
||||
precachestring( &"MP_HOST_ENDED_GAME" );
|
||||
precachestring( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
level thread onplayerconnect();
|
||||
precachestring( &"open_ingame_menu" );
|
||||
game[ "menu_team" ] = "team_marinesopfor";
|
||||
game[ "menu_initteam_allies" ] = "initteam_marines";
|
||||
game[ "menu_initteam_axis" ] = "initteam_opfor";
|
||||
game[ "menu_class" ] = "class";
|
||||
game[ "menu_changeclass" ] = "changeclass";
|
||||
game[ "menu_changeclass_offline" ] = "changeclass";
|
||||
game[ "menu_wager_side_bet" ] = "sidebet";
|
||||
game[ "menu_wager_side_bet_player" ] = "sidebet_player";
|
||||
game[ "menu_changeclass_wager" ] = "changeclass_wager";
|
||||
game[ "menu_changeclass_custom" ] = "changeclass_custom";
|
||||
game[ "menu_changeclass_barebones" ] = "changeclass_barebones";
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
game[ "menu_changeclass_" + team ] = "changeclass";
|
||||
}
|
||||
game[ "menu_controls" ] = "ingame_controls";
|
||||
game[ "menu_options" ] = "ingame_options";
|
||||
game[ "menu_leavegame" ] = "popup_leavegame";
|
||||
precachemenu( game[ "menu_controls" ] );
|
||||
precachemenu( game[ "menu_options" ] );
|
||||
precachemenu( game[ "menu_leavegame" ] );
|
||||
precachemenu( "scoreboard" );
|
||||
precachemenu( "spectate" );
|
||||
precachemenu( game[ "menu_team" ] );
|
||||
precachemenu( game[ "menu_changeclass_allies" ] );
|
||||
precachemenu( game[ "menu_initteam_allies" ] );
|
||||
precachemenu( game[ "menu_changeclass_axis" ] );
|
||||
precachemenu( game[ "menu_class" ] );
|
||||
precachemenu( game[ "menu_changeclass" ] );
|
||||
precachemenu( game[ "menu_initteam_axis" ] );
|
||||
precachemenu( game[ "menu_changeclass_offline" ] );
|
||||
precachemenu( game[ "menu_changeclass_wager" ] );
|
||||
precachemenu( game[ "menu_changeclass_custom" ] );
|
||||
precachemenu( game[ "menu_changeclass_barebones" ] );
|
||||
precachemenu( game[ "menu_wager_side_bet" ] );
|
||||
precachemenu( game[ "menu_wager_side_bet_player" ] );
|
||||
precachestring( &"MP_HOST_ENDED_GAME" );
|
||||
precachestring( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onmenuresponse();
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onmenuresponse();
|
||||
}
|
||||
}
|
||||
|
||||
onmenuresponse()
|
||||
onmenuresponse() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "menuresponse", menu, response );
|
||||
|
||||
if ( response == "back" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
|
||||
if ( level.console )
|
||||
{
|
||||
if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_team"] || menu == game["menu_controls"] )
|
||||
{
|
||||
if ( isdefined( level.teams[self.pers["team"]] ) )
|
||||
self openmenu( game["menu_class"] );
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( response == "changeteam" && level.allow_teamchange == "1" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self openmenu( game["menu_team"] );
|
||||
}
|
||||
|
||||
if ( response == "changeclass_marines_splitscreen" )
|
||||
self openmenu( "changeclass_marines_splitscreen" );
|
||||
|
||||
if ( response == "changeclass_opfor_splitscreen" )
|
||||
self openmenu( "changeclass_opfor_splitscreen" );
|
||||
|
||||
if ( response == "endgame" )
|
||||
{
|
||||
if ( self issplitscreen() )
|
||||
{
|
||||
level.skipvote = 1;
|
||||
|
||||
if ( !level.gameended )
|
||||
level thread maps\mp\gametypes_zm\_globallogic::forceend();
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( response == "killserverpc" )
|
||||
{
|
||||
level thread maps\mp\gametypes_zm\_globallogic::killserverpc();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( response == "endround" )
|
||||
{
|
||||
if ( !level.gameended )
|
||||
level thread maps\mp\gametypes_zm\_globallogic::forceend();
|
||||
else
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self iprintln( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( menu == game["menu_team"] && level.allow_teamchange == "1" )
|
||||
{
|
||||
switch ( response )
|
||||
{
|
||||
case "autoassign":
|
||||
self [[ level.autoassign ]]( 1 );
|
||||
break;
|
||||
case "spectator":
|
||||
self [[ level.spectator ]]();
|
||||
break;
|
||||
default:
|
||||
self [[ level.teammenu ]]( response );
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_changeclass_wager"] || menu == game["menu_changeclass_custom"] || menu == game["menu_changeclass_barebones"] )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
|
||||
if ( level.rankedmatch && issubstr( response, "custom" ) )
|
||||
{
|
||||
if ( self isitemlocked( maps\mp\gametypes_zm\_rank::getitemindex( "feature_cac" ) ) )
|
||||
kick( self getentitynumber() );
|
||||
}
|
||||
|
||||
self.selectedclass = 1;
|
||||
self [[ level.class ]]( response );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( menu == "spectate" )
|
||||
{
|
||||
player = getplayerfromclientnum( int( response ) );
|
||||
|
||||
if ( isdefined( player ) )
|
||||
self setcurrentspectatorclient( player );
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "menuresponse", menu, response );
|
||||
if ( response == "back" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
if ( level.console )
|
||||
{
|
||||
if ( menu == game[ "menu_changeclass" ] || menu == game[ "menu_changeclass_offline" ] || menu == game[ "menu_team" ] || menu == game[ "menu_controls" ] )
|
||||
{
|
||||
if ( isDefined( level.teams[ self.pers[ "team" ] ] ) )
|
||||
{
|
||||
self openmenu( game[ "menu_class" ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( response == "changeteam" && level.allow_teamchange == "1" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self openmenu( game[ "menu_team" ] );
|
||||
}
|
||||
if ( response == "changeclass_marines_splitscreen" )
|
||||
{
|
||||
self openmenu( "changeclass_marines_splitscreen" );
|
||||
}
|
||||
if ( response == "changeclass_opfor_splitscreen" )
|
||||
{
|
||||
self openmenu( "changeclass_opfor_splitscreen" );
|
||||
}
|
||||
if ( response == "endgame" )
|
||||
{
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.skipvote = 1;
|
||||
if ( !level.gameended )
|
||||
{
|
||||
level thread maps/mp/gametypes_zm/_globallogic::forceend();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( response == "killserverpc" )
|
||||
{
|
||||
level thread maps/mp/gametypes_zm/_globallogic::killserverpc();
|
||||
continue;
|
||||
}
|
||||
if ( response == "endround" )
|
||||
{
|
||||
if ( !level.gameended )
|
||||
{
|
||||
self gamehistoryplayerquit();
|
||||
level thread maps/mp/gametypes_zm/_globallogic::forceend();
|
||||
}
|
||||
else
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self iprintln( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( menu == game[ "menu_team" ] && level.allow_teamchange == "1" )
|
||||
{
|
||||
switch( response )
|
||||
{
|
||||
case "autoassign":
|
||||
self [[ level.autoassign ]]( 1 );
|
||||
break;
|
||||
case "spectator":
|
||||
self [[ level.spectator ]]();
|
||||
break;
|
||||
default:
|
||||
self [[ level.teammenu ]]( response );
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( menu == game[ "menu_changeclass" ] || menu == game[ "menu_changeclass_offline" ] || menu == game[ "menu_changeclass_wager" ] || menu == game[ "menu_changeclass_custom" ] || menu == game[ "menu_changeclass_barebones" ] )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
if ( level.rankedmatch && issubstr( response, "custom" ) )
|
||||
{
|
||||
if ( self isitemlocked( maps/mp/gametypes_zm/_rank::getitemindex( "feature_cac" ) ) )
|
||||
{
|
||||
kick( self getentitynumber() );
|
||||
}
|
||||
}
|
||||
self.selectedclass = 1;
|
||||
self [[ level.class ]]( response );
|
||||
continue;
|
||||
}
|
||||
if ( menu == "spectate" )
|
||||
{
|
||||
player = getplayerfromclientnum( int( response ) );
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
self setcurrentspectatorclient( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,179 +1,185 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init( id, playerbegincallback, playerendcallback )
|
||||
init( id, playerbegincallback, playerendcallback ) //checked matches cerberus output
|
||||
{
|
||||
precacheshader( "objpoint_default" );
|
||||
handler = spawnstruct();
|
||||
handler.id = id;
|
||||
handler.playerbegincallback = playerbegincallback;
|
||||
handler.playerendcallback = playerendcallback;
|
||||
handler.enabled = 0;
|
||||
handler.players = [];
|
||||
thread onplayerconnect( handler );
|
||||
level.handlerglobalflagval = 0;
|
||||
return handler;
|
||||
precacheshader( "objpoint_default" );
|
||||
handler = spawnstruct();
|
||||
handler.id = id;
|
||||
handler.playerbegincallback = playerbegincallback;
|
||||
handler.playerendcallback = playerendcallback;
|
||||
handler.enabled = 0;
|
||||
handler.players = [];
|
||||
thread onplayerconnect( handler );
|
||||
level.handlerglobalflagval = 0;
|
||||
return handler;
|
||||
}
|
||||
|
||||
enable( handler )
|
||||
enable( handler ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug
|
||||
{
|
||||
if ( handler.enabled )
|
||||
return;
|
||||
|
||||
handler.enabled = 1;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
players[i].handlerflagval = level.handlerglobalflagval;
|
||||
|
||||
players = handler.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i].handlerflagval != level.handlerglobalflagval )
|
||||
continue;
|
||||
|
||||
if ( players[i].handlers[handler.id].ready )
|
||||
players[i] handleplayer( handler );
|
||||
}
|
||||
if ( handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
handler.enabled = 1;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ].handlerflagval = level.handlerglobalflagval;
|
||||
}
|
||||
players = handler.players;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].handlerflagval != level.handlerglobalflagval )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( players[ i ].handlers[ handler.id ].ready )
|
||||
{
|
||||
players[ i ] handleplayer( handler );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
disable( handler ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug
|
||||
{
|
||||
if ( !handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
handler.enabled = 0;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ].handlerflagval = level.handlerglobalflagval;
|
||||
}
|
||||
players = handler.players;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].handlerflagval != level.handlerglobalflagval )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( players[ i ].handlers[ handler.id ].ready )
|
||||
{
|
||||
players[ i ] unhandleplayer( handler, 0, 0 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
disable( handler )
|
||||
onplayerconnect( handler ) //checked matches cerberus output
|
||||
{
|
||||
if ( !handler.enabled )
|
||||
return;
|
||||
|
||||
handler.enabled = 0;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
players[i].handlerflagval = level.handlerglobalflagval;
|
||||
|
||||
players = handler.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i].handlerflagval != level.handlerglobalflagval )
|
||||
continue;
|
||||
|
||||
if ( players[i].handlers[handler.id].ready )
|
||||
players[i] unhandleplayer( handler, 0, 0 );
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
if ( !isDefined( player.handlers ) )
|
||||
{
|
||||
player.handlers = [];
|
||||
}
|
||||
player.handlers[ handler.id ] = spawnstruct();
|
||||
player.handlers[ handler.id ].ready = 0;
|
||||
player.handlers[ handler.id ].handled = 0;
|
||||
player.handlerflagval = -1;
|
||||
handler.players[ handler.players.size ] = player;
|
||||
player thread onplayerdisconnect( handler );
|
||||
player thread onplayerspawned( handler );
|
||||
player thread onjoinedteam( handler );
|
||||
player thread onjoinedspectators( handler );
|
||||
player thread onplayerkilled( handler );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect( handler )
|
||||
onplayerdisconnect( handler ) //checked changed to match cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
if ( !isdefined( player.handlers ) )
|
||||
player.handlers = [];
|
||||
|
||||
player.handlers[handler.id] = spawnstruct();
|
||||
player.handlers[handler.id].ready = 0;
|
||||
player.handlers[handler.id].handled = 0;
|
||||
player.handlerflagval = -1;
|
||||
handler.players[handler.players.size] = player;
|
||||
player thread onplayerdisconnect( handler );
|
||||
player thread onplayerspawned( handler );
|
||||
player thread onjoinedteam( handler );
|
||||
player thread onjoinedspectators( handler );
|
||||
player thread onplayerkilled( handler );
|
||||
}
|
||||
self waittill( "disconnect" );
|
||||
newplayers = [];
|
||||
for ( i = 0; i < handler.players.size; i++ )
|
||||
{
|
||||
if ( handler.players[ i ] != self )
|
||||
{
|
||||
newplayers[ newplayers.size ] = handler.players[ i ];
|
||||
}
|
||||
}
|
||||
handler.players = newplayers;
|
||||
self thread unhandleplayer( handler, 1, 1 );
|
||||
}
|
||||
|
||||
onplayerdisconnect( handler )
|
||||
onjoinedteam( handler ) //checked matches cerberus output
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
|
||||
newplayers = [];
|
||||
|
||||
for ( i = 0; i < handler.players.size; i++ )
|
||||
{
|
||||
if ( handler.players[i] != self )
|
||||
newplayers[newplayers.size] = handler.players[i];
|
||||
}
|
||||
|
||||
handler.players = newplayers;
|
||||
self thread unhandleplayer( handler, 1, 1 );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam( handler )
|
||||
onjoinedspectators( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators( handler )
|
||||
onplayerspawned( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread handleplayer( handler );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned( handler )
|
||||
onplayerkilled( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread handleplayer( handler );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled( handler )
|
||||
handleplayer( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
self.handlers[ handler.id ].ready = 1;
|
||||
if ( !handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.handlers[ handler.id ].handled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.handlers[ handler.id ].handled = 1;
|
||||
self thread [[ handler.playerbegincallback ]]();
|
||||
}
|
||||
|
||||
handleplayer( handler )
|
||||
unhandleplayer( handler, unsetready, disconnected ) //checked matches cerberus output
|
||||
{
|
||||
self.handlers[handler.id].ready = 1;
|
||||
|
||||
if ( !handler.enabled )
|
||||
return;
|
||||
|
||||
if ( self.handlers[handler.id].handled )
|
||||
return;
|
||||
|
||||
self.handlers[handler.id].handled = 1;
|
||||
self thread [[ handler.playerbegincallback ]]();
|
||||
if ( !disconnected && unsetready )
|
||||
{
|
||||
self.handlers[ handler.id ].ready = 0;
|
||||
}
|
||||
if ( !self.handlers[ handler.id ].handled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !disconnected )
|
||||
{
|
||||
self.handlers[ handler.id ].handled = 0;
|
||||
}
|
||||
self thread [[ handler.playerendcallback ]]( disconnected );
|
||||
}
|
||||
|
||||
unhandleplayer( handler, unsetready, disconnected )
|
||||
{
|
||||
if ( !disconnected && unsetready )
|
||||
self.handlers[handler.id].ready = 0;
|
||||
|
||||
if ( !self.handlers[handler.id].handled )
|
||||
return;
|
||||
|
||||
if ( !disconnected )
|
||||
self.handlers[handler.id].handled = 0;
|
||||
|
||||
self thread [[ handler.playerendcallback ]]( disconnected );
|
||||
}
|
||||
|
@ -1,27 +1,25 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
setdvar( "g_ScoresColor_Spectator", ".25 .25 .25" );
|
||||
setdvar( "g_ScoresColor_Free", ".76 .78 .10" );
|
||||
setdvar( "g_teamColor_MyTeam", ".4 .7 .4" );
|
||||
setdvar( "g_teamColor_EnemyTeam", "1 .315 0.35" );
|
||||
setdvar( "g_teamColor_MyTeamAlt", ".35 1 1" );
|
||||
setdvar( "g_teamColor_EnemyTeamAlt", "1 .5 0" );
|
||||
setdvar( "g_teamColor_Squad", ".315 0.35 1" );
|
||||
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
setdvar( "g_TeamIcon_Axis", "faction_cia" );
|
||||
setdvar( "g_TeamIcon_Allies", "faction_cdc" );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( "g_TeamIcon_Axis", game["icons"]["axis"] );
|
||||
setdvar( "g_TeamIcon_Allies", game["icons"]["allies"] );
|
||||
}
|
||||
setdvar( "g_ScoresColor_Spectator", ".25 .25 .25" );
|
||||
setdvar( "g_ScoresColor_Free", ".76 .78 .10" );
|
||||
setdvar( "g_teamColor_MyTeam", ".4 .7 .4" );
|
||||
setdvar( "g_teamColor_EnemyTeam", "1 .315 0.35" );
|
||||
setdvar( "g_teamColor_MyTeamAlt", ".35 1 1" );
|
||||
setdvar( "g_teamColor_EnemyTeamAlt", "1 .5 0" );
|
||||
setdvar( "g_teamColor_Squad", ".315 0.35 1" );
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
setdvar( "g_TeamIcon_Axis", "faction_cia" );
|
||||
setdvar( "g_TeamIcon_Allies", "faction_cdc" );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( "g_TeamIcon_Axis", game[ "icons" ][ "axis" ] );
|
||||
setdvar( "g_TeamIcon_Allies", game[ "icons" ][ "allies" ] );
|
||||
}
|
||||
}
|
||||
|
@ -1,191 +1,202 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
level.hostname = getdvar( "sv_hostname" );
|
||||
|
||||
if ( level.hostname == "" )
|
||||
level.hostname = "CoDHost";
|
||||
|
||||
setdvar( "sv_hostname", level.hostname );
|
||||
setdvar( "ui_hostname", level.hostname );
|
||||
makedvarserverinfo( "ui_hostname", "CoDHost" );
|
||||
level.motd = getdvar( "scr_motd" );
|
||||
|
||||
if ( level.motd == "" )
|
||||
level.motd = "";
|
||||
|
||||
setdvar( "scr_motd", level.motd );
|
||||
setdvar( "ui_motd", level.motd );
|
||||
makedvarserverinfo( "ui_motd", "" );
|
||||
level.allowvote = getdvar( "g_allowVote" );
|
||||
|
||||
if ( level.allowvote == "" )
|
||||
level.allowvote = "1";
|
||||
|
||||
setdvar( "g_allowvote", level.allowvote );
|
||||
setdvar( "ui_allowvote", level.allowvote );
|
||||
makedvarserverinfo( "ui_allowvote", "1" );
|
||||
level.allow_teamchange = "0";
|
||||
|
||||
if ( sessionmodeisprivate() || !sessionmodeisonlinegame() )
|
||||
level.allow_teamchange = "1";
|
||||
|
||||
setdvar( "ui_allow_teamchange", level.allow_teamchange );
|
||||
level.friendlyfire = getgametypesetting( "friendlyfiretype" );
|
||||
setdvar( "ui_friendlyfire", level.friendlyfire );
|
||||
makedvarserverinfo( "ui_friendlyfire", "0" );
|
||||
|
||||
if ( getdvar( "scr_mapsize" ) == "" )
|
||||
setdvar( "scr_mapsize", "64" );
|
||||
else if ( getdvarfloat( "scr_mapsize" ) >= 64 )
|
||||
setdvar( "scr_mapsize", "64" );
|
||||
else if ( getdvarfloat( "scr_mapsize" ) >= 32 )
|
||||
setdvar( "scr_mapsize", "32" );
|
||||
else if ( getdvarfloat( "scr_mapsize" ) >= 16 )
|
||||
setdvar( "scr_mapsize", "16" );
|
||||
else
|
||||
setdvar( "scr_mapsize", "8" );
|
||||
|
||||
level.mapsize = getdvarfloat( "scr_mapsize" );
|
||||
constraingametype( getdvar( "g_gametype" ) );
|
||||
constrainmapsize( level.mapsize );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
updateserversettings();
|
||||
wait 5;
|
||||
}
|
||||
level.hostname = getDvar( "sv_hostname" );
|
||||
if ( level.hostname == "" )
|
||||
{
|
||||
level.hostname = "CoDHost";
|
||||
}
|
||||
setdvar( "sv_hostname", level.hostname );
|
||||
setdvar( "ui_hostname", level.hostname );
|
||||
makedvarserverinfo( "ui_hostname", "CoDHost" );
|
||||
level.motd = getDvar( "scr_motd" );
|
||||
if ( level.motd == "" )
|
||||
{
|
||||
level.motd = "";
|
||||
}
|
||||
setdvar( "scr_motd", level.motd );
|
||||
setdvar( "ui_motd", level.motd );
|
||||
makedvarserverinfo( "ui_motd", "" );
|
||||
level.allowvote = getDvar( "g_allowVote" );
|
||||
if ( level.allowvote == "" )
|
||||
{
|
||||
level.allowvote = "1";
|
||||
}
|
||||
setdvar( "g_allowvote", level.allowvote );
|
||||
setdvar( "ui_allowvote", level.allowvote );
|
||||
makedvarserverinfo( "ui_allowvote", "1" );
|
||||
level.allow_teamchange = "0";
|
||||
if ( sessionmodeisprivate() || !sessionmodeisonlinegame() )
|
||||
{
|
||||
level.allow_teamchange = "1";
|
||||
}
|
||||
setdvar( "ui_allow_teamchange", level.allow_teamchange );
|
||||
level.friendlyfire = getgametypesetting( "friendlyfiretype" );
|
||||
setdvar( "ui_friendlyfire", level.friendlyfire );
|
||||
makedvarserverinfo( "ui_friendlyfire", "0" );
|
||||
if ( getDvar( "scr_mapsize" ) == "" )
|
||||
{
|
||||
setdvar( "scr_mapsize", "64" );
|
||||
}
|
||||
else if ( getDvarFloat( "scr_mapsize" ) >= 64 )
|
||||
{
|
||||
setdvar( "scr_mapsize", "64" );
|
||||
}
|
||||
else if ( getDvarFloat( "scr_mapsize" ) >= 32 )
|
||||
{
|
||||
setdvar( "scr_mapsize", "32" );
|
||||
}
|
||||
else if ( getDvarFloat( "scr_mapsize" ) >= 16 )
|
||||
{
|
||||
setdvar( "scr_mapsize", "16" );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( "scr_mapsize", "8" );
|
||||
}
|
||||
level.mapsize = getDvarFloat( "scr_mapsize" );
|
||||
constraingametype( getDvar( "g_gametype" ) );
|
||||
constrainmapsize( level.mapsize );
|
||||
for ( ;; )
|
||||
{
|
||||
updateserversettings();
|
||||
wait 5;
|
||||
}
|
||||
}
|
||||
|
||||
updateserversettings()
|
||||
updateserversettings() //checked matches cerberus output
|
||||
{
|
||||
sv_hostname = getdvar( "sv_hostname" );
|
||||
|
||||
if ( level.hostname != sv_hostname )
|
||||
{
|
||||
level.hostname = sv_hostname;
|
||||
setdvar( "ui_hostname", level.hostname );
|
||||
}
|
||||
|
||||
scr_motd = getdvar( "scr_motd" );
|
||||
|
||||
if ( level.motd != scr_motd )
|
||||
{
|
||||
level.motd = scr_motd;
|
||||
setdvar( "ui_motd", level.motd );
|
||||
}
|
||||
|
||||
g_allowvote = getdvar( "g_allowVote" );
|
||||
|
||||
if ( level.allowvote != g_allowvote )
|
||||
{
|
||||
level.allowvote = g_allowvote;
|
||||
setdvar( "ui_allowvote", level.allowvote );
|
||||
}
|
||||
|
||||
scr_friendlyfire = getgametypesetting( "friendlyfiretype" );
|
||||
|
||||
if ( level.friendlyfire != scr_friendlyfire )
|
||||
{
|
||||
level.friendlyfire = scr_friendlyfire;
|
||||
setdvar( "ui_friendlyfire", level.friendlyfire );
|
||||
}
|
||||
sv_hostname = getDvar( "sv_hostname" );
|
||||
if ( level.hostname != sv_hostname )
|
||||
{
|
||||
level.hostname = sv_hostname;
|
||||
setdvar( "ui_hostname", level.hostname );
|
||||
}
|
||||
scr_motd = getDvar( "scr_motd" );
|
||||
if ( level.motd != scr_motd )
|
||||
{
|
||||
level.motd = scr_motd;
|
||||
setdvar( "ui_motd", level.motd );
|
||||
}
|
||||
g_allowvote = getDvar( "g_allowVote" );
|
||||
if ( level.allowvote != g_allowvote )
|
||||
{
|
||||
level.allowvote = g_allowvote;
|
||||
setdvar( "ui_allowvote", level.allowvote );
|
||||
}
|
||||
scr_friendlyfire = getgametypesetting( "friendlyfiretype" );
|
||||
if ( level.friendlyfire != scr_friendlyfire )
|
||||
{
|
||||
level.friendlyfire = scr_friendlyfire;
|
||||
setdvar( "ui_friendlyfire", level.friendlyfire );
|
||||
}
|
||||
}
|
||||
|
||||
constraingametype( gametype )
|
||||
constraingametype( gametype ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues
|
||||
{
|
||||
entities = getentarray();
|
||||
|
||||
for ( i = 0; i < entities.size; i++ )
|
||||
{
|
||||
entity = entities[i];
|
||||
|
||||
if ( gametype == "dm" )
|
||||
{
|
||||
if ( isdefined( entity.script_gametype_dm ) && entity.script_gametype_dm != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( gametype == "tdm" )
|
||||
{
|
||||
if ( isdefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( gametype == "ctf" )
|
||||
{
|
||||
if ( isdefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( gametype == "hq" )
|
||||
{
|
||||
if ( isdefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( gametype == "sd" )
|
||||
{
|
||||
if ( isdefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( gametype == "koth" )
|
||||
{
|
||||
if ( isdefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" )
|
||||
entity delete();
|
||||
}
|
||||
}
|
||||
entities = getentarray();
|
||||
i = 0;
|
||||
while ( i < entities.size )
|
||||
{
|
||||
entity = entities[ i ];
|
||||
if ( gametype == "dm" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_dm ) && entity.script_gametype_dm != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( gametype == "tdm" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( gametype == "ctf" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( gametype == "hq" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( gametype == "sd" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( gametype == "koth" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
constrainmapsize( mapsize )
|
||||
constrainmapsize( mapsize ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues
|
||||
{
|
||||
entities = getentarray();
|
||||
|
||||
for ( i = 0; i < entities.size; i++ )
|
||||
{
|
||||
entity = entities[i];
|
||||
|
||||
if ( int( mapsize ) == 8 )
|
||||
{
|
||||
if ( isdefined( entity.script_mapsize_08 ) && entity.script_mapsize_08 != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( int( mapsize ) == 16 )
|
||||
{
|
||||
if ( isdefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( int( mapsize ) == 32 )
|
||||
{
|
||||
if ( isdefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" )
|
||||
entity delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( int( mapsize ) == 64 )
|
||||
{
|
||||
if ( isdefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" )
|
||||
entity delete();
|
||||
}
|
||||
}
|
||||
entities = getentarray();
|
||||
i = 0;
|
||||
while ( i < entities.size )
|
||||
{
|
||||
entity = entities[ i ];
|
||||
if ( int( mapsize ) == 8 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_08 ) && entity.script_mapsize_08 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( int( mapsize ) == 16 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( int( mapsize ) == 32 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( int( mapsize ) == 64 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,56 +1,65 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
precacheshellshock( "frag_grenade_mp" );
|
||||
precacheshellshock( "damage_mp" );
|
||||
precacherumble( "artillery_rumble" );
|
||||
precacherumble( "grenade_rumble" );
|
||||
precacheshellshock( "frag_grenade_mp" );
|
||||
precacheshellshock( "damage_mp" );
|
||||
precacherumble( "artillery_rumble" );
|
||||
precacherumble( "grenade_rumble" );
|
||||
}
|
||||
|
||||
shellshockondamage( cause, damage )
|
||||
{
|
||||
if ( cause == "MOD_EXPLOSIVE" || cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" || cause == "MOD_PROJECTILE_SPLASH" )
|
||||
{
|
||||
time = 0;
|
||||
|
||||
if ( damage >= 90 )
|
||||
time = 4;
|
||||
else if ( damage >= 50 )
|
||||
time = 3;
|
||||
else if ( damage >= 25 )
|
||||
time = 2;
|
||||
else if ( damage > 10 )
|
||||
time = 2;
|
||||
|
||||
if ( time )
|
||||
{
|
||||
if ( self mayapplyscreeneffect() )
|
||||
self shellshock( "frag_grenade_mp", 0.5 );
|
||||
}
|
||||
}
|
||||
if ( cause != "MOD_EXPLOSIVE" && cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" && cause == "MOD_PROJECTILE_SPLASH" )
|
||||
{
|
||||
time = 0;
|
||||
if ( damage >= 90 )
|
||||
{
|
||||
time = 4;
|
||||
}
|
||||
else if ( damage >= 50 )
|
||||
{
|
||||
time = 3;
|
||||
}
|
||||
else if ( damage >= 25 )
|
||||
{
|
||||
time = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( damage > 10 )
|
||||
{
|
||||
time = 2;
|
||||
}
|
||||
}
|
||||
if ( time )
|
||||
{
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
self shellshock( "frag_grenade_mp", 0.5 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
endondeath()
|
||||
{
|
||||
self waittill( "death" );
|
||||
|
||||
waittillframeend;
|
||||
self notify( "end_explode" );
|
||||
self waittill( "death" );
|
||||
waittillframeend;
|
||||
self notify( "end_explode" );
|
||||
}
|
||||
|
||||
endontimer( timer )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
wait( timer );
|
||||
self notify( "end_on_timer" );
|
||||
self endon( "disconnect" );
|
||||
wait timer;
|
||||
self notify( "end_on_timer" );
|
||||
}
|
||||
|
||||
rcbomb_earthquake( position )
|
||||
{
|
||||
playrumbleonposition( "grenade_rumble", position );
|
||||
earthquake( 0.5, 0.5, self.origin, 512 );
|
||||
playrumbleonposition( "grenade_rumble", position );
|
||||
earthquake( 0.5, 0.5, self.origin, 512 );
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,228 +1,251 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init()
|
||||
init() //checked changed to match cerberus output
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
level.spectateoverride[team] = spawnstruct();
|
||||
|
||||
level thread onplayerconnect();
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
level.spectateoverride[ team ] = spawnstruct();
|
||||
}
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self setspectatepermissions();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self setspectatepermissions();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam()
|
||||
onjoinedteam() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators()
|
||||
onjoinedspectators() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
}
|
||||
|
||||
updatespectatesettings()
|
||||
updatespectatesettings() //checked changed to match cerberus output
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
level.players[index] setspectatepermissions();
|
||||
level endon( "game_ended" );
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
level.players[ index ] setspectatepermissions();
|
||||
}
|
||||
}
|
||||
|
||||
getsplitscreenteam()
|
||||
getsplitscreenteam() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info
|
||||
{
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
if ( !isdefined( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
if ( level.players[index] == self )
|
||||
continue;
|
||||
|
||||
if ( !self isplayeronsamemachine( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
team = level.players[index].sessionteam;
|
||||
|
||||
if ( team != "spectator" )
|
||||
return team;
|
||||
}
|
||||
|
||||
return self.sessionteam;
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
if ( !isDefined( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( level.players[ index ] == self )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( !self isplayeronsamemachine( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
team = level.players[ index ].sessionteam;
|
||||
if ( team != "spectator" )
|
||||
{
|
||||
return team;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return self.sessionteam;
|
||||
}
|
||||
|
||||
otherlocalplayerstillalive()
|
||||
otherlocalplayerstillalive() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info
|
||||
{
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
if ( !isdefined( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
if ( level.players[index] == self )
|
||||
continue;
|
||||
|
||||
if ( !self isplayeronsamemachine( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
if ( isalive( level.players[index] ) )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
if ( !isDefined( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( level.players[ index ] == self )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( !self isplayeronsamemachine( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( isalive( level.players[ index ] ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
allowspectateallteams( allow )
|
||||
allowspectateallteams( allow ) //checked changed to match cerberus output
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
self allowspectateteam( team, allow );
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
self allowspectateteam( team, allow );
|
||||
}
|
||||
}
|
||||
|
||||
allowspectateallteamsexceptteam( skip_team, allow )
|
||||
allowspectateallteamsexceptteam( skip_team, allow ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( team == skip_team )
|
||||
continue;
|
||||
|
||||
self allowspectateteam( team, allow );
|
||||
}
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( team == skip_team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
self allowspectateteam( team, allow );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setspectatepermissions()
|
||||
setspectatepermissions() //checked changed to match cerberus output
|
||||
{
|
||||
team = self.sessionteam;
|
||||
|
||||
if ( team == "spectator" )
|
||||
{
|
||||
if ( self issplitscreen() && !level.splitscreen )
|
||||
team = getsplitscreenteam();
|
||||
|
||||
if ( team == "spectator" )
|
||||
{
|
||||
self allowspectateallteams( 1 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
spectatetype = level.spectatetype;
|
||||
|
||||
switch ( spectatetype )
|
||||
{
|
||||
case "0":
|
||||
self allowspectateallteams( 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "localplayers", 0 );
|
||||
break;
|
||||
case "3":
|
||||
if ( self issplitscreen() && self otherlocalplayerstillalive() )
|
||||
{
|
||||
self allowspectateallteams( 0 );
|
||||
self allowspectateteam( "none", 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
break;
|
||||
}
|
||||
case "1":
|
||||
if ( !level.teambased )
|
||||
{
|
||||
self allowspectateallteams( 1 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
}
|
||||
else if ( isdefined( team ) && isdefined( level.teams[team] ) )
|
||||
{
|
||||
self allowspectateteam( team, 1 );
|
||||
self allowspectateallteamsexceptteam( team, 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self allowspectateallteams( 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
}
|
||||
|
||||
break;
|
||||
case "2":
|
||||
self allowspectateallteams( 1 );
|
||||
self allowspectateteam( "freelook", 1 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isdefined( team ) && isdefined( level.teams[team] ) )
|
||||
{
|
||||
if ( isdefined( level.spectateoverride[team].allowfreespectate ) )
|
||||
self allowspectateteam( "freelook", 1 );
|
||||
|
||||
if ( isdefined( level.spectateoverride[team].allowenemyspectate ) )
|
||||
self allowspectateallteamsexceptteam( team, 1 );
|
||||
}
|
||||
team = self.sessionteam;
|
||||
if ( team == "spectator" )
|
||||
{
|
||||
if ( self issplitscreen() && !level.splitscreen )
|
||||
{
|
||||
team = getsplitscreenteam();
|
||||
}
|
||||
if ( team == "spectator" )
|
||||
{
|
||||
self allowspectateallteams( 1 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
spectatetype = level.spectatetype;
|
||||
switch( spectatetype )
|
||||
{
|
||||
case 0:
|
||||
self allowspectateallteams( 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "localplayers", 0 );
|
||||
break;
|
||||
case 3:
|
||||
if ( self issplitscreen() && self otherlocalplayerstillalive() )
|
||||
{
|
||||
self allowspectateallteams( 0 );
|
||||
self allowspectateteam( "none", 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
if ( !level.teambased )
|
||||
{
|
||||
self allowspectateallteams( 1 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
}
|
||||
else if ( isDefined( team ) && isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
self allowspectateteam( team, 1 );
|
||||
self allowspectateallteamsexceptteam( team, 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self allowspectateallteams( 0 );
|
||||
self allowspectateteam( "freelook", 0 );
|
||||
self allowspectateteam( "none", 0 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
self allowspectateallteams( 1 );
|
||||
self allowspectateteam( "freelook", 1 );
|
||||
self allowspectateteam( "none", 1 );
|
||||
self allowspectateteam( "localplayers", 1 );
|
||||
break;
|
||||
}
|
||||
if ( isDefined( team ) && isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
if ( isDefined( level.spectateoverride[ team ].allowfreespectate ) )
|
||||
{
|
||||
self allowspectateteam( "freelook", 1 );
|
||||
}
|
||||
if ( isDefined( level.spectateoverride[ team ].allowenemyspectate ) )
|
||||
{
|
||||
self allowspectateallteamsexceptteam( team, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setspectatepermissionsformachine()
|
||||
setspectatepermissionsformachine() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info
|
||||
{
|
||||
self setspectatepermissions();
|
||||
|
||||
if ( !self issplitscreen() )
|
||||
return;
|
||||
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
if ( !isdefined( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
if ( level.players[index] == self )
|
||||
continue;
|
||||
|
||||
if ( !self isplayeronsamemachine( level.players[index] ) )
|
||||
continue;
|
||||
|
||||
level.players[index] setspectatepermissions();
|
||||
}
|
||||
self setspectatepermissions();
|
||||
if ( !self issplitscreen() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
if ( !isDefined( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( level.players[ index ] == self )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( !self isplayeronsamemachine( level.players[ index ] ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
level.players[ index ] setspectatepermissions();
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,382 +1,401 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
gettweakabledvarvalue( category, name )
|
||||
gettweakabledvarvalue( category, name ) //checked matches cerberus output
|
||||
{
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
dvar = level.rules[name].dvar;
|
||||
break;
|
||||
case "game":
|
||||
dvar = level.gametweaks[name].dvar;
|
||||
break;
|
||||
case "team":
|
||||
dvar = level.teamtweaks[name].dvar;
|
||||
break;
|
||||
case "player":
|
||||
dvar = level.playertweaks[name].dvar;
|
||||
break;
|
||||
case "class":
|
||||
dvar = level.classtweaks[name].dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
dvar = level.weapontweaks[name].dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
dvar = level.hardpointtweaks[name].dvar;
|
||||
break;
|
||||
case "hud":
|
||||
dvar = level.hudtweaks[name].dvar;
|
||||
break;
|
||||
default:
|
||||
dvar = undefined;
|
||||
break;
|
||||
}
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
dvar = level.rules[ name ].dvar;
|
||||
break;
|
||||
case "game":
|
||||
dvar = level.gametweaks[ name ].dvar;
|
||||
break;
|
||||
case "team":
|
||||
dvar = level.teamtweaks[ name ].dvar;
|
||||
break;
|
||||
case "player":
|
||||
dvar = level.playertweaks[ name ].dvar;
|
||||
break;
|
||||
case "class":
|
||||
dvar = level.classtweaks[ name ].dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
dvar = level.weapontweaks[ name ].dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
dvar = level.hardpointtweaks[ name ].dvar;
|
||||
break;
|
||||
case "hud":
|
||||
dvar = level.hudtweaks[ name ].dvar;
|
||||
break;
|
||||
default:
|
||||
dvar = undefined;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isdefined( dvar ) );
|
||||
assert( isDefined( dvar ) );
|
||||
#/
|
||||
value = getdvarint( dvar );
|
||||
return value;
|
||||
*/
|
||||
value = getDvarInt( dvar );
|
||||
return value;
|
||||
}
|
||||
|
||||
gettweakabledvar( category, name )
|
||||
gettweakabledvar( category, name ) //checked matches cerberus output
|
||||
{
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
value = level.rules[name].dvar;
|
||||
break;
|
||||
case "game":
|
||||
value = level.gametweaks[name].dvar;
|
||||
break;
|
||||
case "team":
|
||||
value = level.teamtweaks[name].dvar;
|
||||
break;
|
||||
case "player":
|
||||
value = level.playertweaks[name].dvar;
|
||||
break;
|
||||
case "class":
|
||||
value = level.classtweaks[name].dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
value = level.weapontweaks[name].dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
value = level.hardpointtweaks[name].dvar;
|
||||
break;
|
||||
case "hud":
|
||||
value = level.hudtweaks[name].dvar;
|
||||
break;
|
||||
default:
|
||||
value = undefined;
|
||||
break;
|
||||
}
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
value = level.rules[ name ].dvar;
|
||||
break;
|
||||
case "game":
|
||||
value = level.gametweaks[ name ].dvar;
|
||||
break;
|
||||
case "team":
|
||||
value = level.teamtweaks[ name ].dvar;
|
||||
break;
|
||||
case "player":
|
||||
value = level.playertweaks[ name ].dvar;
|
||||
break;
|
||||
case "class":
|
||||
value = level.classtweaks[ name ].dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
value = level.weapontweaks[ name ].dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
value = level.hardpointtweaks[ name ].dvar;
|
||||
break;
|
||||
case "hud":
|
||||
value = level.hudtweaks[ name ].dvar;
|
||||
break;
|
||||
default:
|
||||
value = undefined;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isdefined( value ) );
|
||||
assert( isDefined( value ) );
|
||||
#/
|
||||
return value;
|
||||
*/
|
||||
return value;
|
||||
}
|
||||
|
||||
gettweakablevalue( category, name )
|
||||
gettweakablevalue( category, name ) //checked matches cerberus output
|
||||
{
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
value = level.rules[name].value;
|
||||
break;
|
||||
case "game":
|
||||
value = level.gametweaks[name].value;
|
||||
break;
|
||||
case "team":
|
||||
value = level.teamtweaks[name].value;
|
||||
break;
|
||||
case "player":
|
||||
value = level.playertweaks[name].value;
|
||||
break;
|
||||
case "class":
|
||||
value = level.classtweaks[name].value;
|
||||
break;
|
||||
case "weapon":
|
||||
value = level.weapontweaks[name].value;
|
||||
break;
|
||||
case "killstreak":
|
||||
value = level.hardpointtweaks[name].value;
|
||||
break;
|
||||
case "hud":
|
||||
value = level.hudtweaks[name].value;
|
||||
break;
|
||||
default:
|
||||
value = undefined;
|
||||
break;
|
||||
}
|
||||
|
||||
overridedvar = "scr_" + level.gametype + "_" + category + "_" + name;
|
||||
|
||||
if ( getdvar( overridedvar ) != "" )
|
||||
return getdvarint( overridedvar );
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
value = level.rules[ name ].value;
|
||||
break;
|
||||
case "game":
|
||||
value = level.gametweaks[ name ].value;
|
||||
break;
|
||||
case "team":
|
||||
value = level.teamtweaks[ name ].value;
|
||||
break;
|
||||
case "player":
|
||||
value = level.playertweaks[ name ].value;
|
||||
break;
|
||||
case "class":
|
||||
value = level.classtweaks[ name ].value;
|
||||
break;
|
||||
case "weapon":
|
||||
value = level.weapontweaks[ name ].value;
|
||||
break;
|
||||
case "killstreak":
|
||||
value = level.hardpointtweaks[ name ].value;
|
||||
break;
|
||||
case "hud":
|
||||
value = level.hudtweaks[ name ].value;
|
||||
break;
|
||||
default:
|
||||
value = undefined;
|
||||
break;
|
||||
}
|
||||
overridedvar = "scr_" + level.gametype + "_" + category + "_" + name;
|
||||
if ( getDvar( overridedvar ) != "" )
|
||||
{
|
||||
return getDvarInt( overridedvar );
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isdefined( value ) );
|
||||
assert( isDefined( value ) );
|
||||
#/
|
||||
return value;
|
||||
*/
|
||||
return value;
|
||||
}
|
||||
|
||||
gettweakablelastvalue( category, name )
|
||||
gettweakablelastvalue( category, name ) //checked matches cerberus output
|
||||
{
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
value = level.rules[name].lastvalue;
|
||||
break;
|
||||
case "game":
|
||||
value = level.gametweaks[name].lastvalue;
|
||||
break;
|
||||
case "team":
|
||||
value = level.teamtweaks[name].lastvalue;
|
||||
break;
|
||||
case "player":
|
||||
value = level.playertweaks[name].lastvalue;
|
||||
break;
|
||||
case "class":
|
||||
value = level.classtweaks[name].lastvalue;
|
||||
break;
|
||||
case "weapon":
|
||||
value = level.weapontweaks[name].lastvalue;
|
||||
break;
|
||||
case "killstreak":
|
||||
value = level.hardpointtweaks[name].lastvalue;
|
||||
break;
|
||||
case "hud":
|
||||
value = level.hudtweaks[name].lastvalue;
|
||||
break;
|
||||
default:
|
||||
value = undefined;
|
||||
break;
|
||||
}
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
value = level.rules[ name ].lastvalue;
|
||||
break;
|
||||
case "game":
|
||||
value = level.gametweaks[ name ].lastvalue;
|
||||
break;
|
||||
case "team":
|
||||
value = level.teamtweaks[ name ].lastvalue;
|
||||
break;
|
||||
case "player":
|
||||
value = level.playertweaks[ name ].lastvalue;
|
||||
break;
|
||||
case "class":
|
||||
value = level.classtweaks[ name ].lastvalue;
|
||||
break;
|
||||
case "weapon":
|
||||
value = level.weapontweaks[ name ].lastvalue;
|
||||
break;
|
||||
case "killstreak":
|
||||
value = level.hardpointtweaks[ name ].lastvalue;
|
||||
break;
|
||||
case "hud":
|
||||
value = level.hudtweaks[ name ].lastvalue;
|
||||
break;
|
||||
default:
|
||||
value = undefined;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isdefined( value ) );
|
||||
assert( isDefined( value ) );
|
||||
#/
|
||||
return value;
|
||||
*/
|
||||
return value;
|
||||
}
|
||||
|
||||
settweakablevalue( category, name, value )
|
||||
settweakablevalue( category, name, value ) //checked matches cerberus output
|
||||
{
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
dvar = level.rules[name].dvar;
|
||||
break;
|
||||
case "game":
|
||||
dvar = level.gametweaks[name].dvar;
|
||||
break;
|
||||
case "team":
|
||||
dvar = level.teamtweaks[name].dvar;
|
||||
break;
|
||||
case "player":
|
||||
dvar = level.playertweaks[name].dvar;
|
||||
break;
|
||||
case "class":
|
||||
dvar = level.classtweaks[name].dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
dvar = level.weapontweaks[name].dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
dvar = level.hardpointtweaks[name].dvar;
|
||||
break;
|
||||
case "hud":
|
||||
dvar = level.hudtweaks[name].dvar;
|
||||
break;
|
||||
default:
|
||||
dvar = undefined;
|
||||
break;
|
||||
}
|
||||
|
||||
setdvar( dvar, value );
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
dvar = level.rules[ name ].dvar;
|
||||
break;
|
||||
case "game":
|
||||
dvar = level.gametweaks[ name ].dvar;
|
||||
break;
|
||||
case "team":
|
||||
dvar = level.teamtweaks[ name ].dvar;
|
||||
break;
|
||||
case "player":
|
||||
dvar = level.playertweaks[ name ].dvar;
|
||||
break;
|
||||
case "class":
|
||||
dvar = level.classtweaks[ name ].dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
dvar = level.weapontweaks[ name ].dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
dvar = level.hardpointtweaks[ name ].dvar;
|
||||
break;
|
||||
case "hud":
|
||||
dvar = level.hudtweaks[ name ].dvar;
|
||||
break;
|
||||
default:
|
||||
dvar = undefined;
|
||||
break;
|
||||
}
|
||||
setdvar( dvar, value );
|
||||
}
|
||||
|
||||
settweakablelastvalue( category, name, value )
|
||||
settweakablelastvalue( category, name, value ) //checked changed to match cerberus output
|
||||
{
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
level.rules[name].lastvalue = value;
|
||||
break;
|
||||
case "game":
|
||||
level.gametweaks[name].lastvalue = value;
|
||||
break;
|
||||
case "team":
|
||||
level.teamtweaks[name].lastvalue = value;
|
||||
break;
|
||||
case "player":
|
||||
level.playertweaks[name].lastvalue = value;
|
||||
break;
|
||||
case "class":
|
||||
level.classtweaks[name].lastvalue = value;
|
||||
break;
|
||||
case "weapon":
|
||||
level.weapontweaks[name].lastvalue = value;
|
||||
break;
|
||||
case "killstreak":
|
||||
level.hardpointtweaks[name].lastvalue = value;
|
||||
break;
|
||||
case "hud":
|
||||
level.hudtweaks[name].lastvalue = value;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
level.rules[ name ].lastvalue = value;
|
||||
break;
|
||||
case "game":
|
||||
level.gametweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
case "team":
|
||||
level.teamtweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
case "player":
|
||||
level.playertweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
case "class":
|
||||
level.classtweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
case "weapon":
|
||||
level.weapontweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
case "killstreak":
|
||||
level.hardpointtweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
case "hud":
|
||||
level.hudtweaks[ name ].lastvalue = value;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
registertweakable( category, name, dvar, value )
|
||||
registertweakable( category, name, dvar, value ) //checked matches cerberus output
|
||||
{
|
||||
if ( isstring( value ) )
|
||||
{
|
||||
if ( getdvar( dvar ) == "" )
|
||||
setdvar( dvar, value );
|
||||
else
|
||||
value = getdvar( dvar );
|
||||
}
|
||||
else if ( getdvar( dvar ) == "" )
|
||||
setdvar( dvar, value );
|
||||
else
|
||||
value = getdvarint( dvar );
|
||||
|
||||
switch ( category )
|
||||
{
|
||||
case "rule":
|
||||
if ( !isdefined( level.rules[name] ) )
|
||||
level.rules[name] = spawnstruct();
|
||||
|
||||
level.rules[name].value = value;
|
||||
level.rules[name].lastvalue = value;
|
||||
level.rules[name].dvar = dvar;
|
||||
break;
|
||||
case "game":
|
||||
if ( !isdefined( level.gametweaks[name] ) )
|
||||
level.gametweaks[name] = spawnstruct();
|
||||
|
||||
level.gametweaks[name].value = value;
|
||||
level.gametweaks[name].lastvalue = value;
|
||||
level.gametweaks[name].dvar = dvar;
|
||||
break;
|
||||
case "team":
|
||||
if ( !isdefined( level.teamtweaks[name] ) )
|
||||
level.teamtweaks[name] = spawnstruct();
|
||||
|
||||
level.teamtweaks[name].value = value;
|
||||
level.teamtweaks[name].lastvalue = value;
|
||||
level.teamtweaks[name].dvar = dvar;
|
||||
break;
|
||||
case "player":
|
||||
if ( !isdefined( level.playertweaks[name] ) )
|
||||
level.playertweaks[name] = spawnstruct();
|
||||
|
||||
level.playertweaks[name].value = value;
|
||||
level.playertweaks[name].lastvalue = value;
|
||||
level.playertweaks[name].dvar = dvar;
|
||||
break;
|
||||
case "class":
|
||||
if ( !isdefined( level.classtweaks[name] ) )
|
||||
level.classtweaks[name] = spawnstruct();
|
||||
|
||||
level.classtweaks[name].value = value;
|
||||
level.classtweaks[name].lastvalue = value;
|
||||
level.classtweaks[name].dvar = dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
if ( !isdefined( level.weapontweaks[name] ) )
|
||||
level.weapontweaks[name] = spawnstruct();
|
||||
|
||||
level.weapontweaks[name].value = value;
|
||||
level.weapontweaks[name].lastvalue = value;
|
||||
level.weapontweaks[name].dvar = dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
if ( !isdefined( level.hardpointtweaks[name] ) )
|
||||
level.hardpointtweaks[name] = spawnstruct();
|
||||
|
||||
level.hardpointtweaks[name].value = value;
|
||||
level.hardpointtweaks[name].lastvalue = value;
|
||||
level.hardpointtweaks[name].dvar = dvar;
|
||||
break;
|
||||
case "hud":
|
||||
if ( !isdefined( level.hudtweaks[name] ) )
|
||||
level.hudtweaks[name] = spawnstruct();
|
||||
|
||||
level.hudtweaks[name].value = value;
|
||||
level.hudtweaks[name].lastvalue = value;
|
||||
level.hudtweaks[name].dvar = dvar;
|
||||
break;
|
||||
}
|
||||
if ( isstring( value ) )
|
||||
{
|
||||
if ( getDvar( dvar ) == "" )
|
||||
{
|
||||
setdvar( dvar, value );
|
||||
}
|
||||
else
|
||||
{
|
||||
value = getDvar( dvar );
|
||||
}
|
||||
}
|
||||
else if ( getDvar( dvar ) == "" )
|
||||
{
|
||||
setdvar( dvar, value );
|
||||
}
|
||||
else
|
||||
{
|
||||
value = getDvarInt( dvar );
|
||||
}
|
||||
switch( category )
|
||||
{
|
||||
case "rule":
|
||||
if ( !isDefined( level.rules[ name ] ) )
|
||||
{
|
||||
level.rules[ name ] = spawnstruct();
|
||||
}
|
||||
level.rules[ name ].value = value;
|
||||
level.rules[ name ].lastvalue = value;
|
||||
level.rules[ name ].dvar = dvar;
|
||||
break;
|
||||
case "game":
|
||||
if ( !isDefined( level.gametweaks[ name ] ) )
|
||||
{
|
||||
level.gametweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.gametweaks[ name ].value = value;
|
||||
level.gametweaks[ name ].lastvalue = value;
|
||||
level.gametweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
case "team":
|
||||
if ( !isDefined( level.teamtweaks[ name ] ) )
|
||||
{
|
||||
level.teamtweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.teamtweaks[ name ].value = value;
|
||||
level.teamtweaks[ name ].lastvalue = value;
|
||||
level.teamtweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
case "player":
|
||||
if ( !isDefined( level.playertweaks[ name ] ) )
|
||||
{
|
||||
level.playertweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.playertweaks[ name ].value = value;
|
||||
level.playertweaks[ name ].lastvalue = value;
|
||||
level.playertweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
case "class":
|
||||
if ( !isDefined( level.classtweaks[ name ] ) )
|
||||
{
|
||||
level.classtweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.classtweaks[ name ].value = value;
|
||||
level.classtweaks[ name ].lastvalue = value;
|
||||
level.classtweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
case "weapon":
|
||||
if ( !isDefined( level.weapontweaks[ name ] ) )
|
||||
{
|
||||
level.weapontweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.weapontweaks[ name ].value = value;
|
||||
level.weapontweaks[ name ].lastvalue = value;
|
||||
level.weapontweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
case "killstreak":
|
||||
if ( !isDefined( level.hardpointtweaks[ name ] ) )
|
||||
{
|
||||
level.hardpointtweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.hardpointtweaks[ name ].value = value;
|
||||
level.hardpointtweaks[ name ].lastvalue = value;
|
||||
level.hardpointtweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
case "hud":
|
||||
if ( !isDefined( level.hudtweaks[ name ] ) )
|
||||
{
|
||||
level.hudtweaks[ name ] = spawnstruct();
|
||||
}
|
||||
level.hudtweaks[ name ].value = value;
|
||||
level.hudtweaks[ name ].lastvalue = value;
|
||||
level.hudtweaks[ name ].dvar = dvar;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
init()
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
level.clienttweakables = [];
|
||||
level.tweakablesinitialized = 1;
|
||||
level.rules = [];
|
||||
level.gametweaks = [];
|
||||
level.teamtweaks = [];
|
||||
level.playertweaks = [];
|
||||
level.classtweaks = [];
|
||||
level.weapontweaks = [];
|
||||
level.hardpointtweaks = [];
|
||||
level.hudtweaks = [];
|
||||
registertweakable( "game", "arcadescoring", "scr_game_arcadescoring", 0 );
|
||||
registertweakable( "game", "difficulty", "scr_game_difficulty", 1 );
|
||||
registertweakable( "game", "pinups", "scr_game_pinups", 0 );
|
||||
registertweakable( "team", "teamkillerplaylistbanquantum", "scr_team_teamkillerplaylistbanquantum", 0 );
|
||||
registertweakable( "team", "teamkillerplaylistbanpenalty", "scr_team_teamkillerplaylistbanpenalty", 0 );
|
||||
registertweakable( "player", "allowrevive", "scr_player_allowrevive", 1 );
|
||||
registertweakable( "weapon", "allowfrag", "scr_weapon_allowfrags", 1 );
|
||||
registertweakable( "weapon", "allowsmoke", "scr_weapon_allowsmoke", 1 );
|
||||
registertweakable( "weapon", "allowflash", "scr_weapon_allowflash", 1 );
|
||||
registertweakable( "weapon", "allowc4", "scr_weapon_allowc4", 1 );
|
||||
registertweakable( "weapon", "allowsatchel", "scr_weapon_allowsatchel", 1 );
|
||||
registertweakable( "weapon", "allowbetty", "scr_weapon_allowbetty", 1 );
|
||||
registertweakable( "weapon", "allowrpgs", "scr_weapon_allowrpgs", 1 );
|
||||
registertweakable( "weapon", "allowmines", "scr_weapon_allowmines", 1 );
|
||||
registertweakable( "hud", "showobjicons", "ui_hud_showobjicons", 1 );
|
||||
setclienttweakable( "hud", "showobjicons" );
|
||||
registertweakable( "killstreak", "allowradar", "scr_hardpoint_allowradar", 1 );
|
||||
registertweakable( "killstreak", "allowradardirection", "scr_hardpoint_allowradardirection", 1 );
|
||||
registertweakable( "killstreak", "allowcounteruav", "scr_hardpoint_allowcounteruav", 1 );
|
||||
registertweakable( "killstreak", "allowdogs", "scr_hardpoint_allowdogs", 1 );
|
||||
registertweakable( "killstreak", "allowhelicopter_comlink", "scr_hardpoint_allowhelicopter_comlink", 1 );
|
||||
registertweakable( "killstreak", "allowrcbomb", "scr_hardpoint_allowrcbomb", 1 );
|
||||
registertweakable( "killstreak", "allowauto_turret", "scr_hardpoint_allowauto_turret", 1 );
|
||||
level thread updateuitweakables();
|
||||
level.clienttweakables = [];
|
||||
level.tweakablesinitialized = 1;
|
||||
level.rules = [];
|
||||
level.gametweaks = [];
|
||||
level.teamtweaks = [];
|
||||
level.playertweaks = [];
|
||||
level.classtweaks = [];
|
||||
level.weapontweaks = [];
|
||||
level.hardpointtweaks = [];
|
||||
level.hudtweaks = [];
|
||||
registertweakable( "game", "arcadescoring", "scr_game_arcadescoring", 0 );
|
||||
registertweakable( "game", "difficulty", "scr_game_difficulty", 1 );
|
||||
registertweakable( "game", "pinups", "scr_game_pinups", 0 );
|
||||
registertweakable( "team", "teamkillerplaylistbanquantum", "scr_team_teamkillerplaylistbanquantum", 0 );
|
||||
registertweakable( "team", "teamkillerplaylistbanpenalty", "scr_team_teamkillerplaylistbanpenalty", 0 );
|
||||
registertweakable( "player", "allowrevive", "scr_player_allowrevive", 1 );
|
||||
registertweakable( "weapon", "allowfrag", "scr_weapon_allowfrags", 1 );
|
||||
registertweakable( "weapon", "allowsmoke", "scr_weapon_allowsmoke", 1 );
|
||||
registertweakable( "weapon", "allowflash", "scr_weapon_allowflash", 1 );
|
||||
registertweakable( "weapon", "allowc4", "scr_weapon_allowc4", 1 );
|
||||
registertweakable( "weapon", "allowsatchel", "scr_weapon_allowsatchel", 1 );
|
||||
registertweakable( "weapon", "allowbetty", "scr_weapon_allowbetty", 1 );
|
||||
registertweakable( "weapon", "allowrpgs", "scr_weapon_allowrpgs", 1 );
|
||||
registertweakable( "weapon", "allowmines", "scr_weapon_allowmines", 1 );
|
||||
registertweakable( "hud", "showobjicons", "ui_hud_showobjicons", 1 );
|
||||
setclienttweakable( "hud", "showobjicons" );
|
||||
registertweakable( "killstreak", "allowradar", "scr_hardpoint_allowradar", 1 );
|
||||
registertweakable( "killstreak", "allowradardirection", "scr_hardpoint_allowradardirection", 1 );
|
||||
registertweakable( "killstreak", "allowcounteruav", "scr_hardpoint_allowcounteruav", 1 );
|
||||
registertweakable( "killstreak", "allowdogs", "scr_hardpoint_allowdogs", 1 );
|
||||
registertweakable( "killstreak", "allowhelicopter_comlink", "scr_hardpoint_allowhelicopter_comlink", 1 );
|
||||
registertweakable( "killstreak", "allowrcbomb", "scr_hardpoint_allowrcbomb", 1 );
|
||||
registertweakable( "killstreak", "allowauto_turret", "scr_hardpoint_allowauto_turret", 1 );
|
||||
level thread updateuitweakables();
|
||||
}
|
||||
|
||||
setclienttweakable( category, name )
|
||||
setclienttweakable( category, name ) //checked matches cerberus output
|
||||
{
|
||||
level.clienttweakables[level.clienttweakables.size] = name;
|
||||
level.clienttweakables[ level.clienttweakables.size ] = name;
|
||||
}
|
||||
|
||||
updateuitweakables()
|
||||
updateuitweakables() //checked changed to match cerberus output
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
for ( index = 0; index < level.clienttweakables.size; index++ )
|
||||
{
|
||||
clienttweakable = level.clienttweakables[index];
|
||||
curvalue = gettweakabledvarvalue( "hud", clienttweakable );
|
||||
lastvalue = gettweakablelastvalue( "hud", clienttweakable );
|
||||
|
||||
if ( curvalue != lastvalue )
|
||||
{
|
||||
updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue );
|
||||
settweakablelastvalue( "hud", clienttweakable, curvalue );
|
||||
}
|
||||
}
|
||||
|
||||
wait 1.0;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
for ( index = 0; index < level.clienttweakables.size; index++ )
|
||||
{
|
||||
clienttweakable = level.clienttweakables[ index ];
|
||||
curvalue = gettweakabledvarvalue( "hud", clienttweakable );
|
||||
lastvalue = gettweakablelastvalue( "hud", clienttweakable );
|
||||
if ( curvalue != lastvalue )
|
||||
{
|
||||
updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue );
|
||||
settweakablelastvalue( "hud", clienttweakable, curvalue );
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
updateserverdvar( dvar, value )
|
||||
updateserverdvar( dvar, value ) //checked matches cerberus output
|
||||
{
|
||||
makedvarserverinfo( dvar, value );
|
||||
makedvarserverinfo( dvar, value );
|
||||
}
|
||||
|
||||
|
@ -1,111 +1,124 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps/mp/killstreaks/_killstreaks;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
isgrenadelauncherweapon( weapon )
|
||||
isgrenadelauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
if ( getsubstr( weapon, 0, 3 ) == "gl_" )
|
||||
return true;
|
||||
|
||||
switch ( weapon )
|
||||
{
|
||||
case "xm25_mp":
|
||||
case "china_lake_mp":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
if ( getsubstr( weapon, 0, 3 ) == "gl_" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "china_lake_mp":
|
||||
case "xm25_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isdumbrocketlauncherweapon( weapon )
|
||||
isdumbrocketlauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
switch ( weapon )
|
||||
{
|
||||
case "rpg_mp":
|
||||
case "m220_tow_mp":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "m220_tow_mp":
|
||||
case "rpg_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isguidedrocketlauncherweapon( weapon )
|
||||
isguidedrocketlauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
switch ( weapon )
|
||||
{
|
||||
case "smaw_mp":
|
||||
case "m72_law_mp":
|
||||
case "m202_flash_mp":
|
||||
case "javelin_mp":
|
||||
case "fhj18_mp":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "fhj18_mp":
|
||||
case "javelin_mp":
|
||||
case "m202_flash_mp":
|
||||
case "m72_law_mp":
|
||||
case "smaw_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isrocketlauncherweapon( weapon )
|
||||
isrocketlauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
if ( isdumbrocketlauncherweapon( weapon ) )
|
||||
return true;
|
||||
|
||||
if ( isguidedrocketlauncherweapon( weapon ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
if ( isdumbrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isguidedrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
islauncherweapon( weapon )
|
||||
islauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
if ( isrocketlauncherweapon( weapon ) )
|
||||
return true;
|
||||
|
||||
if ( isgrenadelauncherweapon( weapon ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
if ( isrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isgrenadelauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isreducedteamkillweapon( weapon )
|
||||
{
|
||||
switch ( weapon )
|
||||
{
|
||||
case "planemortar_mp":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "planemortar_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ishackweapon( weapon )
|
||||
ishackweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ispistol( weapon )
|
||||
ispistol( weapon ) //checked changed at own discretion
|
||||
{
|
||||
return isdefined( level.side_arm_array[weapon] );
|
||||
if ( isDefined( level.side_arm_array[ weapon ] ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isflashorstunweapon( weapon )
|
||||
isflashorstunweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
if ( isdefined( weapon ) )
|
||||
{
|
||||
switch ( weapon )
|
||||
{
|
||||
case "proximity_grenade_mp":
|
||||
case "proximity_grenade_aoe_mp":
|
||||
case "flash_grenade_mp":
|
||||
case "concussion_grenade_mp":
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
switch( weapon )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
case "flash_grenade_mp":
|
||||
case "proximity_grenade_aoe_mp":
|
||||
case "proximity_grenade_mp":
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isflashorstundamage( weapon, meansofdeath )
|
||||
isflashorstundamage( weapon, meansofdeath ) //checked changed at own discretion
|
||||
{
|
||||
return isflashorstunweapon( weapon ) && ( meansofdeath == "MOD_GRENADE_SPLASH" || meansofdeath == "MOD_GAS" );
|
||||
if ( ( meansofdeath == "MOD_GAS" || meansofdeath == "MOD_GRENADE_SPLASH" ) && isflashorstunweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user