mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-07-03 14:07:51 -05:00
Reorganized the scripts so its easier to search thru.
This commit is contained in:
21
Zombie Core/patch_zm/codescripts/character_mp.gsc
Normal file
21
Zombie Core/patch_zm/codescripts/character_mp.gsc
Normal file
@ -0,0 +1,21 @@
|
||||
#include codescripts/character;
|
||||
|
||||
setmodelfromarray( a )
|
||||
{
|
||||
self setmodel( a[ randomint( a.size ) ] );
|
||||
}
|
||||
|
||||
precachemodelarray( a )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < a.size )
|
||||
{
|
||||
precachemodel( a[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
attachfromarray( a )
|
||||
{
|
||||
self attach( codescripts/character::randomelement( a ), "", 1 );
|
||||
}
|
2012
Zombie Core/patch_zm/common_scripts/utility.gsc
Normal file
2012
Zombie Core/patch_zm/common_scripts/utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
497
Zombie Core/patch_zm/maps/mp/_art.gsc
Normal file
497
Zombie Core/patch_zm/maps/mp/_art.gsc
Normal file
@ -0,0 +1,497 @@
|
||||
#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 ( !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();
|
||||
#/
|
||||
if ( !isDefined( level.script ) )
|
||||
{
|
||||
level.script = tolower( getDvar( "mapname" ) );
|
||||
}
|
||||
}
|
||||
|
||||
artfxprintln( file, string )
|
||||
{
|
||||
/#
|
||||
if ( file == -1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
|
||||
strtok_loc( string, par1 )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
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( "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" ] );
|
||||
}
|
||||
}
|
||||
|
||||
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" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_reflection()
|
||||
{
|
||||
/#
|
||||
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 ) )
|
||||
{
|
||||
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();
|
||||
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( 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 = 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()
|
||||
{
|
||||
/#
|
||||
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()
|
||||
{
|
||||
/#
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
150
Zombie Core/patch_zm/maps/mp/_audio.gsc
Normal file
150
Zombie Core/patch_zm/maps/mp/_audio.gsc
Normal file
@ -0,0 +1,150 @@
|
||||
#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();
|
||||
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 ( 1 )
|
||||
{
|
||||
if ( self.player_is_moving )
|
||||
{
|
||||
trig playsound( trig.script_label );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_player_sprint()
|
||||
{
|
||||
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 ( 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;
|
||||
}
|
||||
|
||||
thread_step_trigger()
|
||||
{
|
||||
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" );
|
||||
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();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ] == player )
|
||||
{
|
||||
return i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 1;
|
||||
}
|
273
Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc
Normal file
273
Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc
Normal file
@ -0,0 +1,273 @@
|
||||
#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" );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
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" );
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
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 ( 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 );
|
||||
}
|
||||
}
|
||||
|
||||
destroy_ent()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
droptoground( origin, radius )
|
||||
{
|
||||
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 );
|
||||
}
|
87
Zombie Core/patch_zm/maps/mp/_bb.gsc
Normal file
87
Zombie Core/patch_zm/maps/mp/_bb.gsc
Normal file
@ -0,0 +1,87 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
self commitspawndata();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdeath()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "death" );
|
||||
self commitspawndata();
|
||||
}
|
||||
}
|
||||
|
||||
commitspawndata()
|
||||
{
|
||||
/#
|
||||
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 );
|
||||
}
|
||||
|
||||
commitweapondata( spawnid, currentweapon, time0 )
|
||||
{
|
||||
/#
|
||||
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;
|
||||
}
|
||||
|
||||
bbaddtostat( statname, delta )
|
||||
{
|
||||
if ( isDefined( self._bbdata ) && isDefined( self._bbdata[ statname ] ) )
|
||||
{
|
||||
self._bbdata[ statname ] += delta;
|
||||
}
|
||||
}
|
19
Zombie Core/patch_zm/maps/mp/_busing.gsc
Normal file
19
Zombie Core/patch_zm/maps/mp/_busing.gsc
Normal file
@ -0,0 +1,19 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
businit()
|
||||
{
|
||||
/#
|
||||
assert( level.clientscripts );
|
||||
#/
|
||||
level.busstate = "";
|
||||
registerclientsys( "busCmd" );
|
||||
}
|
||||
|
||||
setbusstate( state )
|
||||
{
|
||||
if ( level.busstate != state )
|
||||
{
|
||||
setclientsysstate( "busCmd", state );
|
||||
}
|
||||
level.busstate = state;
|
||||
}
|
2117
Zombie Core/patch_zm/maps/mp/_challenges.gsc
Normal file
2117
Zombie Core/patch_zm/maps/mp/_challenges.gsc
Normal file
File diff suppressed because it is too large
Load Diff
67
Zombie Core/patch_zm/maps/mp/_compass.gsc
Normal file
67
Zombie Core/patch_zm/maps/mp/_compass.gsc
Normal file
@ -0,0 +1,67 @@
|
||||
|
||||
setupminimap( material )
|
||||
{
|
||||
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." );
|
||||
#/
|
||||
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 );
|
||||
}
|
3273
Zombie Core/patch_zm/maps/mp/_createfx.gsc
Normal file
3273
Zombie Core/patch_zm/maps/mp/_createfx.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1019
Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc
Normal file
1019
Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc
Normal file
File diff suppressed because it is too large
Load Diff
545
Zombie Core/patch_zm/maps/mp/_createfxundo.gsc
Normal file
545
Zombie Core/patch_zm/maps/mp/_createfxundo.gsc
Normal file
@ -0,0 +1,545 @@
|
||||
#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 = [];
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
apply_state_change( type, revert_state )
|
||||
{
|
||||
if ( type == "undo" )
|
||||
{
|
||||
/#
|
||||
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_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" );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
undo_edit( 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[]" );
|
||||
#/
|
||||
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 ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
|
||||
}
|
||||
}
|
||||
update_selected_entities();
|
||||
/#
|
||||
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 );
|
||||
/#
|
||||
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;
|
||||
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 ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
|
||||
}
|
||||
}
|
||||
/#
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "createfx: Starting array_remove_undefined()" );
|
||||
#/
|
||||
arrayremovevalue( level.createfxent, undefined );
|
||||
/#
|
||||
println( "^1CreateFX: Finished undo add." );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
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[]" );
|
||||
#/
|
||||
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--;
|
||||
|
||||
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[]" );
|
||||
#/
|
||||
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 ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
|
||||
}
|
||||
}
|
||||
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";
|
||||
}
|
||||
|
||||
reorder_ent_array_by_uniqueid( 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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
array_pop( 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 = [];
|
||||
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" );
|
||||
}
|
||||
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" );
|
||||
#/
|
||||
}
|
97
Zombie Core/patch_zm/maps/mp/_demo.gsc
Normal file
97
Zombie Core/patch_zm/maps/mp/_demo.gsc
Normal file
@ -0,0 +1,97 @@
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
bookmark( type, time, clientent1, clientent2, eventpriority, inflictorent, overrideentitycamera, actorent )
|
||||
{
|
||||
/#
|
||||
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 );
|
||||
}
|
||||
|
||||
gameresultbookmark( type, winningteamindex, losingteamindex )
|
||||
{
|
||||
/#
|
||||
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 );
|
||||
}
|
458
Zombie Core/patch_zm/maps/mp/_fx.gsc
Normal file
458
Zombie Core/patch_zm/maps/mp/_fx.gsc
Normal file
@ -0,0 +1,458 @@
|
||||
#include maps/mp/_createfx;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
print_org( fxcommand, fxid, fxpos, waittime )
|
||||
{
|
||||
/#
|
||||
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();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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" ] = 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!" );
|
||||
#/
|
||||
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();
|
||||
}
|
||||
|
||||
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" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "stop_loop" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stop_loopsound()
|
||||
{
|
||||
self notify( "stop_loop" );
|
||||
}
|
||||
|
||||
loopfxthread()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
loopfxchangeorg( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
ent waittill( "effect org changed", change );
|
||||
self.origin = change;
|
||||
}
|
||||
}
|
||||
|
||||
loopfxchangedelay( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
ent waittill( "effect delay changed", change );
|
||||
}
|
||||
|
||||
loopfxdeletion( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
ent waittill( "effect deleted" );
|
||||
self delete();
|
||||
}
|
||||
|
||||
loopfxstop( timeout )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait timeout;
|
||||
self.looper delete();
|
||||
}
|
||||
|
||||
loopsound( sound, pos, waittime )
|
||||
{
|
||||
level thread loopsoundthread( sound, pos, waittime );
|
||||
}
|
||||
|
||||
loopsoundthread( sound, pos, waittime )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
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 );
|
||||
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 );
|
||||
}
|
||||
|
||||
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 );
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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 + ");" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
script_playfx( id, pos, pos2 )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
grenadeexplosionfx( pos )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
soundfxdelete( endonnotify )
|
||||
{
|
||||
level waittill( endonnotify );
|
||||
self delete();
|
||||
}
|
||||
|
||||
blenddelete( blend )
|
||||
{
|
||||
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." );
|
||||
#/
|
||||
fx_object = spawnfx( level._effect[ fx_id ], origin, forward, up );
|
||||
return fx_object;
|
||||
}
|
6
Zombie Core/patch_zm/maps/mp/_fxanim.gsc
Normal file
6
Zombie Core/patch_zm/maps/mp/_fxanim.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
init()
|
||||
{
|
||||
level.scr_anim = [];
|
||||
level.scr_anim[ "fxanim_props" ] = [];
|
||||
}
|
60
Zombie Core/patch_zm/maps/mp/_global_fx.gsc
Normal file
60
Zombie Core/patch_zm/maps/mp/_global_fx.gsc
Normal file
@ -0,0 +1,60 @@
|
||||
#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 );
|
||||
}
|
||||
|
||||
global_fx( targetname, 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;
|
||||
}
|
||||
}
|
407
Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc
Normal file
407
Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc
Normal file
@ -0,0 +1,407 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
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 );
|
||||
/#
|
||||
println( "BARRELDAMAGE: " + type );
|
||||
#/
|
||||
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, 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, 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;
|
||||
}
|
||||
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, 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, 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 );
|
||||
}
|
||||
}
|
||||
|
||||
getclosestent( org, array )
|
||||
{
|
||||
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;
|
||||
}
|
30
Zombie Core/patch_zm/maps/mp/_music.gsc
Normal file
30
Zombie Core/patch_zm/maps/mp/_music.gsc
Normal file
@ -0,0 +1,30 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
music_init()
|
||||
{
|
||||
/#
|
||||
assert( level.clientscripts );
|
||||
#/
|
||||
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;
|
||||
}
|
342
Zombie Core/patch_zm/maps/mp/_script_gen.gsc
Normal file
342
Zombie Core/patch_zm/maps/mp/_script_gen.gsc
Normal file
@ -0,0 +1,342 @@
|
||||
#include maps/mp/_script_gen;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
script_gen_dump_checksaved()
|
||||
{
|
||||
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 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
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" );
|
||||
#/
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
/#
|
||||
assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" );
|
||||
#/
|
||||
}
|
||||
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";
|
||||
/#
|
||||
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;
|
||||
}
|
||||
/#
|
||||
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 );
|
||||
#/
|
||||
}
|
||||
}
|
56
Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc
Normal file
56
Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc
Normal file
@ -0,0 +1,56 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
wait_for_face_event()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "face", face_notify, ent );
|
||||
if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isDefined( level.face_event_handler.events[ face_notify ] ) )
|
||||
{
|
||||
ent sendfaceevent( level.face_event_handler.events[ face_notify ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
12
Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc
Normal file
12
Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc
Normal file
@ -0,0 +1,12 @@
|
||||
#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" );
|
||||
}
|
||||
|
||||
watch_bolt_detonation( owner )
|
||||
{
|
||||
}
|
3077
Zombie Core/patch_zm/maps/mp/_utility.gsc
Normal file
3077
Zombie Core/patch_zm/maps/mp/_utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
474
Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc
Normal file
474
Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc
Normal file
@ -0,0 +1,474 @@
|
||||
//checked includes matches beta dump
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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 ( 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 ) //checked changed to match beta dump
|
||||
{
|
||||
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--;
|
||||
|
||||
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 ) //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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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 ( 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 ) //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 ( 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 ) //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 );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
finalize_type_clientfields() //checked changed to match beta dump
|
||||
{
|
||||
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 ) //checked changed to match beta dump
|
||||
{
|
||||
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" );
|
||||
#/
|
||||
*/
|
||||
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 ] ].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 ) //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 );
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches beta dump
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player thread 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 )
|
||||
{
|
||||
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() //checked partially changed to match beta dump
|
||||
{
|
||||
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" ] ) )
|
||||
{
|
||||
player_index++;
|
||||
continue;
|
||||
#/
|
||||
}
|
||||
*/
|
||||
update_clientfields( players[ player_index ], level.vsmgr[ type ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 ( 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 ) //checked matches beta dump
|
||||
{
|
||||
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 ) //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 );
|
||||
}
|
||||
|
||||
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 ( 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 ) //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 ( 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 ) //checked matches beta dump
|
||||
{
|
||||
now = getTime();
|
||||
frac = float( end_time - now ) / float( end_time - start_time );
|
||||
return clamp( frac, 0, 1 );
|
||||
}
|
106
Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc
Normal file
106
Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc
Normal file
@ -0,0 +1,106 @@
|
||||
#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 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isDefined( 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." );
|
||||
}
|
||||
|
||||
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 ) );
|
||||
}
|
||||
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 ) );
|
||||
}
|
||||
}
|
||||
|
||||
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 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
30
Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc
Normal file
30
Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc
Normal file
@ -0,0 +1,30 @@
|
||||
#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 ) )
|
||||
{
|
||||
/#
|
||||
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 );
|
||||
/#
|
||||
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" );
|
||||
}
|
29
Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc
Normal file
29
Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc
Normal file
@ -0,0 +1,29 @@
|
||||
#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" );
|
||||
}
|
||||
|
||||
startflashbanged()
|
||||
{
|
||||
if ( isDefined( self.flashduration ) )
|
||||
{
|
||||
duration = self.flashduration;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration = self getflashbangedstrength() * 1000;
|
||||
}
|
||||
self.flashendtime = getTime() + duration;
|
||||
self notify( "flashed" );
|
||||
return duration;
|
||||
}
|
62
Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc
Normal file
62
Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc
Normal file
@ -0,0 +1,62 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
||||
set_anim_playback_rate()
|
||||
{
|
||||
self.animplaybackrate = 0,9 + randomfloat( 0,2 );
|
||||
self.moveplaybackrate = 1;
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self.meleeattackdist = 0;
|
||||
if ( self maps/mp/animscripts/dog_combat::use_low_attack() )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
13
Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc
Normal file
13
Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc
Normal file
@ -0,0 +1,13 @@
|
||||
#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;
|
||||
}
|
185
Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc
Normal file
185
Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc
Normal file
@ -0,0 +1,185 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
/#
|
||||
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 ( 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 ( 1 )
|
||||
{
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
}
|
||||
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" );
|
||||
}
|
||||
|
||||
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." );
|
||||
}
|
||||
|
||||
shouldrun()
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( #"DFB12081" ) != 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvarInt( #"D5D7999B" ) != 0 )
|
||||
{
|
||||
return 0;
|
||||
#/
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
26
Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc
Normal file
26
Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc
Normal file
@ -0,0 +1,26 @@
|
||||
#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" );
|
||||
}
|
132
Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc
Normal file
132
Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc
Normal file
@ -0,0 +1,132 @@
|
||||
#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 ( 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 ) );
|
||||
#/
|
||||
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" );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
117
Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc
Normal file
117
Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc
Normal file
@ -0,0 +1,117 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
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 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 );
|
||||
}
|
||||
|
||||
turn_left()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
turn_180_left()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
306
Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc
Normal file
306
Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc
Normal file
@ -0,0 +1,306 @@
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
handledogsoundnotetracks( note )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
handlenotetrack( note, flagname, customfunction, var1 )
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( #"6EBEB982" ) )
|
||||
{
|
||||
println( "dog notetrack: " + flagname + " " + note + " " + getTime() );
|
||||
#/
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
/#
|
||||
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
#/
|
||||
wait ( 0,05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforever( 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 );
|
||||
}
|
||||
|
||||
donotetracksfortime( time, flagname, customfunction, var1 )
|
||||
{
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeendnotify( time )
|
||||
{
|
||||
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 = 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 );
|
||||
#/
|
||||
weight = ( yawdelta / self.rightaimlimit ) * self.a.aimweight;
|
||||
leftright = weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta < 0 )
|
||||
{
|
||||
/#
|
||||
assert( yawdelta >= self.leftaimlimit );
|
||||
#/
|
||||
weight = ( yawdelta / self.leftaimlimit ) * self.a.aimweight;
|
||||
leftright = -1 * weight;
|
||||
}
|
||||
}
|
||||
if ( pitchdelta > 0 )
|
||||
{
|
||||
/#
|
||||
assert( pitchdelta <= self.upaimlimit );
|
||||
#/
|
||||
weight = ( pitchdelta / self.upaimlimit ) * self.a.aimweight;
|
||||
updown = weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( pitchdelta < 0 )
|
||||
{
|
||||
/#
|
||||
assert( pitchdelta >= self.downaimlimit );
|
||||
#/
|
||||
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;
|
||||
}
|
||||
|
||||
incranimaimweight()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
227
Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc
Normal file
227
Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc
Normal file
@ -0,0 +1,227 @@
|
||||
#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 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportthread( verticaloffset )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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();
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
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();
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
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();
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
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();
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
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." );
|
||||
#/
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
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;
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
#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 "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 );
|
||||
}
|
151
Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc
Normal file
151
Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc
Normal file
@ -0,0 +1,151 @@
|
||||
#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 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportthread( verticaloffset )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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();
|
||||
/#
|
||||
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;
|
||||
}
|
||||
}
|
166
Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc
Normal file
166
Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc
Normal file
@ -0,0 +1,166 @@
|
||||
|
||||
anim_get_dvar_int( 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;
|
||||
}
|
||||
}
|
||||
|
||||
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 ( 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() );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_turn_print( text, line )
|
||||
{
|
||||
/#
|
||||
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 1;
|
||||
}
|
||||
|
||||
debug_allow_combat()
|
||||
{
|
||||
/#
|
||||
return anim_get_dvar_int( "debug_dog_allow_combat", "1" );
|
||||
#/
|
||||
return 1;
|
||||
}
|
||||
|
||||
current_yaw_line_debug( duration )
|
||||
{
|
||||
/#
|
||||
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";
|
||||
}
|
||||
|
||||
setfootstepeffect( name, fx )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( name ), "Need to define the footstep surface type." );
|
||||
#/
|
||||
/#
|
||||
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;
|
||||
}
|
71
Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc
Normal file
71
Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc
Normal file
@ -0,0 +1,71 @@
|
||||
#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();
|
||||
}
|
||||
}
|
||||
|
||||
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 ) );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trymelee()
|
||||
{
|
||||
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;
|
||||
}
|
439
Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc
Normal file
439
Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc
Normal file
@ -0,0 +1,439 @@
|
||||
#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 )
|
||||
{
|
||||
/#
|
||||
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" );
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
on_fire_timeout()
|
||||
{
|
||||
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
|
||||
{
|
||||
/#
|
||||
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
|
||||
{
|
||||
/#
|
||||
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 )
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
get_gib_ref( direction )
|
||||
{
|
||||
if ( isDefined( self.a.gib_ref ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
get_random( array )
|
||||
{
|
||||
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 ) )
|
||||
{
|
||||
/#
|
||||
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();
|
||||
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" );
|
||||
}
|
||||
|
||||
get_limb_data( gib_ref )
|
||||
{
|
||||
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 );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self gib( "normal", limb_tags_array );
|
||||
}
|
||||
}
|
||||
}
|
510
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_combat.gsc
Normal file
510
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_combat.gsc
Normal file
@ -0,0 +1,510 @@
|
||||
#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 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isDefined( 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." );
|
||||
}
|
||||
|
||||
shouldwaitincombatidle()
|
||||
{
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
/#
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
assert( isalive( self.enemy ) );
|
||||
}
|
||||
#/
|
||||
if ( isDefined( self.enemy.dogattackallowtime ) )
|
||||
{
|
||||
return getTime() < self.enemy.dogattackallowtime;
|
||||
}
|
||||
}
|
||||
|
||||
setnextdogattackallowtime( 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 );
|
||||
}
|
||||
|
||||
meleebiteattackplayer2( player )
|
||||
{
|
||||
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( "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;
|
||||
}
|
||||
}
|
||||
}
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks2( note, player )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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 }
|
||||
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 );
|
||||
}
|
||||
|
||||
checkendcombat( 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;
|
||||
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();
|
||||
}
|
||||
|
||||
attackteleportthread( offset )
|
||||
{
|
||||
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()
|
||||
{
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
return self meleebuttonpressed();
|
||||
}
|
||||
}
|
||||
|
||||
set_melee_timer( player )
|
||||
{
|
||||
wait 0,15;
|
||||
self.melee_able_timer = getTime();
|
||||
}
|
||||
|
||||
clear_player_attacked_by_dog_on_death( player )
|
||||
{
|
||||
self waittill( "death" );
|
||||
player.attacked_by_dog = undefined;
|
||||
}
|
||||
|
||||
dog_cant_kill_in_one_hit( player )
|
||||
{
|
||||
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" );
|
||||
#/
|
||||
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" );
|
||||
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" );
|
||||
}
|
||||
|
||||
attackmisstracktargetthread()
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
30
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_death.gsc
Normal file
30
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_death.gsc
Normal file
@ -0,0 +1,30 @@
|
||||
#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 ) )
|
||||
{
|
||||
/#
|
||||
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 );
|
||||
/#
|
||||
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" );
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
}
|
61
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_init.gsc
Normal file
61
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_init.gsc
Normal file
@ -0,0 +1,61 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.meleeattackdist = 102;
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
14
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_jump.gsc
Normal file
14
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_jump.gsc
Normal file
@ -0,0 +1,14 @@
|
||||
#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;
|
||||
}
|
259
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_move.gsc
Normal file
259
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_move.gsc
Normal file
@ -0,0 +1,259 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
/#
|
||||
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 ( 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 ( 1 )
|
||||
{
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
}
|
||||
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" );
|
||||
#/
|
||||
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" );
|
||||
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" );
|
||||
}
|
||||
|
||||
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." );
|
||||
}
|
||||
|
||||
getenemydistancesqr()
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin );
|
||||
}
|
||||
return 100000000;
|
||||
}
|
||||
|
||||
getsoundkey( distancesqr )
|
||||
{
|
||||
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( "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;
|
||||
}
|
8
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_pain.gsc
Normal file
8
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_pain.gsc
Normal file
@ -0,0 +1,8 @@
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
}
|
148
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_stop.gsc
Normal file
148
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_stop.gsc
Normal file
@ -0,0 +1,148 @@
|
||||
#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 ( 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" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isfacingenemy( tolerancecosangle )
|
||||
{
|
||||
/#
|
||||
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;
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
136
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_turn.gsc
Normal file
136
Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_turn.gsc
Normal file
@ -0,0 +1,136 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
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 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 );
|
||||
}
|
||||
|
||||
turn_left()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
turn_180_left()
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
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" );
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
}
|
||||
}
|
6
Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc
Normal file
6
Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
}
|
158
Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc
Normal file
158
Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc
Normal file
@ -0,0 +1,158 @@
|
||||
#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.lastdebugprint = "";
|
||||
#/
|
||||
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;
|
||||
}
|
||||
|
||||
deathnotify()
|
||||
{
|
||||
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 = ::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;
|
||||
}
|
6
Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc
Normal file
6
Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
}
|
304
Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc
Normal file
304
Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc
Normal file
@ -0,0 +1,304 @@
|
||||
#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" );
|
||||
/#
|
||||
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 = 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( #"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 );
|
||||
#/
|
||||
}
|
||||
}
|
||||
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" );
|
||||
}
|
||||
|
||||
canmeleeanyrange()
|
||||
{
|
||||
return canmeleeinternal( "any range" );
|
||||
}
|
||||
|
||||
canmeleedesperate()
|
||||
{
|
||||
return canmeleeinternal( "long range" );
|
||||
}
|
||||
|
||||
canmelee()
|
||||
{
|
||||
return canmeleeinternal( "normal" );
|
||||
}
|
||||
|
||||
canmeleeinternal( state )
|
||||
{
|
||||
if ( !issentient( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.disablemelee ) )
|
||||
{
|
||||
/#
|
||||
assert( self.disablemelee );
|
||||
#/
|
||||
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 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";
|
||||
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 );
|
||||
}
|
286
Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc
Normal file
286
Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc
Normal file
@ -0,0 +1,286 @@
|
||||
#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();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sidestepinit()
|
||||
{
|
||||
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 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 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;
|
||||
}
|
||||
/#
|
||||
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;
|
||||
}
|
||||
|
||||
checkroomforanim( stepanim )
|
||||
{
|
||||
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";
|
||||
}
|
||||
|
||||
cansidestep()
|
||||
{
|
||||
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";
|
||||
}
|
||||
|
||||
canforwardstep()
|
||||
{
|
||||
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 );
|
||||
if ( self.desiredstepdir == "left" )
|
||||
{
|
||||
self.a.steppeddir--;
|
||||
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
facelookaheadforabit()
|
||||
{
|
||||
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" );
|
||||
}
|
18
Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc
Normal file
18
Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc
Normal file
@ -0,0 +1,18 @@
|
||||
#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;
|
||||
}
|
||||
}
|
61
Zombie Core/patch_zm/maps/mp/animscripts/zm_run.gsc
Normal file
61
Zombie Core/patch_zm/maps/mp/animscripts/zm_run.gsc
Normal file
@ -0,0 +1,61 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
needsupdate()
|
||||
{
|
||||
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" );
|
||||
}
|
39
Zombie Core/patch_zm/maps/mp/animscripts/zm_scripted.gsc
Normal file
39
Zombie Core/patch_zm/maps/mp/animscripts/zm_scripted.gsc
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
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" );
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
}
|
509
Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc
Normal file
509
Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc
Normal file
@ -0,0 +1,509 @@
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
deleteatlimit()
|
||||
{
|
||||
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( self.a.targetlookinitilized == 1, "LookAtPosition called on AI that lookThread was not called on" );
|
||||
#/
|
||||
/#
|
||||
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" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self notify( "look now" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lookatanimations( leftanim, 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 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 );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
notetrackstopanim( note, flagname )
|
||||
{
|
||||
}
|
||||
|
||||
notetrackstartragdoll( note, flagname )
|
||||
{
|
||||
if ( isDefined( self.noragdoll ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
self startragdoll();
|
||||
}
|
||||
|
||||
notetrackmovementstop( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackmovementwalk( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "walk";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackmovementrun( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "run";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackalertnesscasual( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.alertness = "casual";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackalertnessalert( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.alertness = "alert";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackposestand( note, flagname )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notetrackfootstep( note, flagname )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
notetrackland( note, flagname )
|
||||
{
|
||||
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 "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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
/#
|
||||
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
#/
|
||||
wait ( 0,05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforever( 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 );
|
||||
}
|
||||
|
||||
donotetracksfortime( time, flagname, customfunction, var1 )
|
||||
{
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeendnotify( time )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
playfootstepeffect( foot, groundtype )
|
||||
{
|
||||
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 ) )
|
||||
{
|
||||
/#
|
||||
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 / frames );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
offset -= offsetreduction;
|
||||
self teleport( origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
self.keepclaimednodeingoal = 0;
|
||||
}
|
||||
|
||||
returntrue()
|
||||
{
|
||||
return 1;
|
||||
}
|
26
Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc
Normal file
26
Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc
Normal file
@ -0,0 +1,26 @@
|
||||
#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" );
|
||||
}
|
||||
}
|
6
Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc
Normal file
6
Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
}
|
1243
Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc
Normal file
1243
Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
209
Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc
Normal file
209
Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc
Normal file
@ -0,0 +1,209 @@
|
||||
#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() //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( level.gametypestarted ) || !level.gametypestarted )
|
||||
{
|
||||
[[ level.callbackstartgametype ]]();
|
||||
level.gametypestarted = 1;
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_finalizeinitialization() //checked matches cerberus output
|
||||
{
|
||||
maps/mp/_utility::callback( "on_finalize_initialization" );
|
||||
}
|
||||
|
||||
codecallback_playerconnect() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread maps/mp/_audio::monitor_player_sprint();
|
||||
[[ level.callbackplayerconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_playerdisconnect() //checked matches cerberus output
|
||||
{
|
||||
self notify( "disconnect" );
|
||||
level notify( "disconnect" );
|
||||
client_num = self getentitynumber();
|
||||
[[ level.callbackplayerdisconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigration() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_HostMigration****" );
|
||||
#/
|
||||
*/
|
||||
[[ level.callbackhostmigration ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigrationsave() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_HostMigrationSave****" );
|
||||
#/
|
||||
*/
|
||||
[[ level.callbackhostmigrationsave ]]();
|
||||
}
|
||||
|
||||
codecallback_playermigrated() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_PlayerMigrated****" );
|
||||
#/
|
||||
*/
|
||||
[[ level.callbackplayermigrated ]]();
|
||||
}
|
||||
|
||||
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( "ERROR: Aborting level - gametype is not supported" );
|
||||
#/
|
||||
*/
|
||||
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_glasssmash( pos, dir ) //checked matches cerberus output
|
||||
{
|
||||
level notify( "glass_smash" );
|
||||
}
|
||||
|
||||
callbackvoid() //checked matches cerberus output
|
||||
{
|
||||
}
|
||||
|
||||
|
16
Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc
Normal file
16
Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
level.clientid = 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player.clientid = level.clientid;
|
||||
level.clientid++;
|
||||
}
|
||||
}
|
160
Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc
Normal file
160
Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc
Normal file
@ -0,0 +1,160 @@
|
||||
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
precacheshader( "damage_feedback" );
|
||||
precacheshader( "damage_feedback_flak" );
|
||||
precacheshader( "damage_feedback_tac" );
|
||||
level thread 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;
|
||||
}
|
||||
}
|
||||
|
||||
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 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 ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
if ( self.hitsoundtracker )
|
||||
{
|
||||
self.hitsoundtracker = 0;
|
||||
self playlocalsound( alert );
|
||||
wait 0.05;
|
||||
self.hitsoundtracker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
102
Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc
Normal file
102
Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc
Normal file
@ -0,0 +1,102 @@
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
/#
|
||||
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" );
|
||||
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" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
2668
Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc
Normal file
2668
Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2741
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc
Normal file
2741
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc
Normal file
File diff suppressed because it is too large
Load Diff
204
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc
Normal file
204
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc
Normal file
@ -0,0 +1,204 @@
|
||||
//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 ) //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/_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 ( 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 ) //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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
1034
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc
Normal file
1034
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,230 @@
|
||||
#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";
|
||||
}
|
||||
|
||||
default_onforfeit( team )
|
||||
{
|
||||
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( 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 );
|
||||
}
|
||||
|
||||
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" ] );
|
||||
}
|
||||
}
|
||||
|
||||
default_onalivecountchange( team )
|
||||
{
|
||||
}
|
||||
|
||||
default_onroundendgame( 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
|
||||
{
|
||||
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" ] );
|
||||
}
|
||||
|
||||
default_onscorelimit()
|
||||
{
|
||||
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" );
|
||||
/#
|
||||
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 );
|
||||
}
|
||||
|
||||
default_onspawnintermission()
|
||||
{
|
||||
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" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
default_gettimelimit()
|
||||
{
|
||||
return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax );
|
||||
}
|
2238
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc
Normal file
2238
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc
Normal file
File diff suppressed because it is too large
Load Diff
873
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc
Normal file
873
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc
Normal file
@ -0,0 +1,873 @@
|
||||
#include maps/mp/gametypes_zm/_globallogic_utils;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes_zm/_globallogic_audio;
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/_bb;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
updatematchbonusscores( winner )
|
||||
{
|
||||
}
|
||||
|
||||
givematchbonus( scoretype, score )
|
||||
{
|
||||
}
|
||||
|
||||
doskillupdate( winner )
|
||||
{
|
||||
skillupdate( winner, level.teambased );
|
||||
}
|
||||
|
||||
gethighestscoringplayer()
|
||||
{
|
||||
players = level.players;
|
||||
winner = undefined;
|
||||
tie = 0;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !isDefined( players[ i ].score ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( players[ i ].score < 1 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( !isDefined( winner ) || players[ i ].score > winner.score )
|
||||
{
|
||||
winner = players[ i ];
|
||||
tie = 0;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( players[ i ].score == winner.score )
|
||||
{
|
||||
tie = 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( tie || !isDefined( winner ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
return winner;
|
||||
}
|
||||
}
|
||||
|
||||
resetscorechain()
|
||||
{
|
||||
self notify( "reset_score_chain" );
|
||||
self.scorechain = 0;
|
||||
self.rankupdatetotal = 0;
|
||||
}
|
||||
|
||||
scorechaintimer()
|
||||
{
|
||||
self notify( "score_chain_timer" );
|
||||
self endon( "reset_score_chain" );
|
||||
self endon( "score_chain_timer" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
wait 20;
|
||||
self thread resetscorechain();
|
||||
}
|
||||
|
||||
roundtonearestfive( score )
|
||||
{
|
||||
rounding = score % 5;
|
||||
if ( rounding <= 2 )
|
||||
{
|
||||
return score - rounding;
|
||||
}
|
||||
else
|
||||
{
|
||||
return score + ( 5 - rounding );
|
||||
}
|
||||
}
|
||||
|
||||
giveplayermomentumnotification( score, label, descvalue, countstowardrampage )
|
||||
{
|
||||
rampagebonus = 0;
|
||||
if ( isDefined( level.usingrampage ) && level.usingrampage )
|
||||
{
|
||||
if ( countstowardrampage )
|
||||
{
|
||||
if ( !isDefined( self.scorechain ) )
|
||||
{
|
||||
self.scorechain = 0;
|
||||
}
|
||||
self.scorechain++;
|
||||
self thread scorechaintimer();
|
||||
}
|
||||
if ( isDefined( self.scorechain ) && self.scorechain >= 999 )
|
||||
{
|
||||
rampagebonus = roundtonearestfive( int( ( score * level.rampagebonusscale ) + 0,5 ) );
|
||||
}
|
||||
}
|
||||
if ( score != 0 )
|
||||
{
|
||||
self luinotifyevent( &"score_event", 3, label, score, rampagebonus );
|
||||
}
|
||||
score += rampagebonus;
|
||||
if ( score > 0 && self hasperk( "specialty_earnmoremomentum" ) )
|
||||
{
|
||||
score = roundtonearestfive( int( ( score * getDvarFloat( "perk_killstreakMomentumMultiplier" ) ) + 0,5 ) );
|
||||
}
|
||||
_setplayermomentum( self, self.pers[ "momentum" ] + score );
|
||||
}
|
||||
|
||||
resetplayermomentumondeath()
|
||||
{
|
||||
if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks )
|
||||
{
|
||||
_setplayermomentum( self, 0 );
|
||||
self thread resetscorechain();
|
||||
}
|
||||
}
|
||||
|
||||
giveplayermomentum( event, player, victim, weapon, descvalue )
|
||||
{
|
||||
}
|
||||
|
||||
giveplayerscore( event, player, victim, weapon, descvalue )
|
||||
{
|
||||
scorediff = 0;
|
||||
momentum = player.pers[ "momentum" ];
|
||||
giveplayermomentum( event, player, victim, weapon, descvalue );
|
||||
newmomentum = player.pers[ "momentum" ];
|
||||
if ( level.overrideplayerscore )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
pixbeginevent( "level.onPlayerScore" );
|
||||
score = player.pers[ "score" ];
|
||||
[[ level.onplayerscore ]]( event, player, victim );
|
||||
newscore = player.pers[ "score" ];
|
||||
pixendevent();
|
||||
bbprint( "mpplayerscore", "spawnid %d gametime %d type %s player %s delta %d deltamomentum %d team %s", getplayerspawnid( player ), getTime(), event, player.name, newscore - score, newmomentum - momentum, player.team );
|
||||
player maps/mp/_bb::bbaddtostat( "score", newscore - score );
|
||||
if ( score == newscore )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
pixbeginevent( "givePlayerScore" );
|
||||
recordplayerstats( player, "score", newscore );
|
||||
scorediff = newscore - score;
|
||||
player addplayerstatwithgametype( "score", scorediff );
|
||||
if ( isDefined( player.pers[ "lastHighestScore" ] ) && newscore > player.pers[ "lastHighestScore" ] )
|
||||
{
|
||||
player setdstat( "HighestStats", "highest_score", newscore );
|
||||
}
|
||||
pixendevent();
|
||||
return scorediff;
|
||||
}
|
||||
|
||||
default_onplayerscore( event, player, victim )
|
||||
{
|
||||
}
|
||||
|
||||
_setplayerscore( player, score )
|
||||
{
|
||||
}
|
||||
|
||||
_getplayerscore( player )
|
||||
{
|
||||
return player.pers[ "score" ];
|
||||
}
|
||||
|
||||
_setplayermomentum( player, momentum )
|
||||
{
|
||||
momentum = clamp( momentum, 0, 2000 );
|
||||
oldmomentum = player.pers[ "momentum" ];
|
||||
if ( momentum == oldmomentum )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player maps/mp/_bb::bbaddtostat( "momentum", momentum - oldmomentum );
|
||||
if ( momentum > oldmomentum )
|
||||
{
|
||||
highestmomentumcost = 0;
|
||||
numkillstreaks = player.killstreak.size;
|
||||
killstreaktypearray = [];
|
||||
}
|
||||
player.pers[ "momentum" ] = momentum;
|
||||
player.momentum = player.pers[ "momentum" ];
|
||||
}
|
||||
|
||||
_giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray )
|
||||
{
|
||||
}
|
||||
|
||||
setplayermomentumdebug()
|
||||
{
|
||||
/#
|
||||
setdvar( "sv_momentumPercent", 0 );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 1;
|
||||
momentumpercent = getdvarfloatdefault( "sv_momentumPercent", 0 );
|
||||
if ( momentumpercent != 0 )
|
||||
{
|
||||
player = gethostplayer();
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( player.killstreak ) )
|
||||
{
|
||||
_setplayermomentum( player, int( 2000 * ( momentumpercent / 100 ) ) );
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
giveteamscore( event, team, player, victim )
|
||||
{
|
||||
if ( level.overrideteamscore )
|
||||
{
|
||||
return;
|
||||
}
|
||||
pixbeginevent( "level.onTeamScore" );
|
||||
teamscore = game[ "teamScores" ][ team ];
|
||||
[[ level.onteamscore ]]( event, team );
|
||||
pixendevent();
|
||||
newscore = game[ "teamScores" ][ team ];
|
||||
bbprint( "mpteamscores", "gametime %d event %s team %d diff %d score %d", getTime(), event, team, newscore - teamscore, newscore );
|
||||
if ( teamscore == newscore )
|
||||
{
|
||||
return;
|
||||
}
|
||||
updateteamscores( team );
|
||||
thread maps/mp/gametypes_zm/_globallogic::checkscorelimit();
|
||||
}
|
||||
|
||||
giveteamscoreforobjective( team, score )
|
||||
{
|
||||
teamscore = game[ "teamScores" ][ team ];
|
||||
onteamscore( score, team );
|
||||
newscore = game[ "teamScores" ][ team ];
|
||||
bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", getTime(), team, newscore - teamscore, newscore );
|
||||
if ( teamscore == newscore )
|
||||
{
|
||||
return;
|
||||
}
|
||||
updateteamscores( team );
|
||||
thread maps/mp/gametypes_zm/_globallogic::checkscorelimit();
|
||||
}
|
||||
|
||||
_setteamscore( team, teamscore )
|
||||
{
|
||||
if ( teamscore == game[ "teamScores" ][ team ] )
|
||||
{
|
||||
return;
|
||||
}
|
||||
game[ "teamScores" ][ team ] = teamscore;
|
||||
updateteamscores( team );
|
||||
thread maps/mp/gametypes_zm/_globallogic::checkscorelimit();
|
||||
}
|
||||
|
||||
resetteamscores()
|
||||
{
|
||||
while ( isDefined( level.roundscorecarry ) || level.roundscorecarry == 0 && maps/mp/_utility::isfirstround() )
|
||||
{
|
||||
_a591 = level.teams;
|
||||
_k591 = getFirstArrayKey( _a591 );
|
||||
while ( isDefined( _k591 ) )
|
||||
{
|
||||
team = _a591[ _k591 ];
|
||||
game[ "teamScores" ][ team ] = 0;
|
||||
_k591 = getNextArrayKey( _a591, _k591 );
|
||||
}
|
||||
}
|
||||
maps/mp/gametypes_zm/_globallogic_score::updateallteamscores();
|
||||
}
|
||||
|
||||
resetallscores()
|
||||
{
|
||||
resetteamscores();
|
||||
resetplayerscores();
|
||||
}
|
||||
|
||||
resetplayerscores()
|
||||
{
|
||||
players = level.players;
|
||||
winner = undefined;
|
||||
tie = 0;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( isDefined( players[ i ].pers[ "score" ] ) )
|
||||
{
|
||||
_setplayerscore( players[ i ], 0 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
updateteamscores( team )
|
||||
{
|
||||
setteamscore( team, game[ "teamScores" ][ team ] );
|
||||
level thread maps/mp/gametypes_zm/_globallogic::checkteamscorelimitsoon( team );
|
||||
}
|
||||
|
||||
updateallteamscores()
|
||||
{
|
||||
_a629 = level.teams;
|
||||
_k629 = getFirstArrayKey( _a629 );
|
||||
while ( isDefined( _k629 ) )
|
||||
{
|
||||
team = _a629[ _k629 ];
|
||||
updateteamscores( team );
|
||||
_k629 = getNextArrayKey( _a629, _k629 );
|
||||
}
|
||||
}
|
||||
|
||||
_getteamscore( team )
|
||||
{
|
||||
return game[ "teamScores" ][ team ];
|
||||
}
|
||||
|
||||
gethighestteamscoreteam()
|
||||
{
|
||||
score = 0;
|
||||
winning_teams = [];
|
||||
_a645 = level.teams;
|
||||
_k645 = getFirstArrayKey( _a645 );
|
||||
while ( isDefined( _k645 ) )
|
||||
{
|
||||
team = _a645[ _k645 ];
|
||||
team_score = game[ "teamScores" ][ team ];
|
||||
if ( team_score > score )
|
||||
{
|
||||
score = team_score;
|
||||
winning_teams = [];
|
||||
}
|
||||
if ( team_score == score )
|
||||
{
|
||||
winning_teams[ team ] = team;
|
||||
}
|
||||
_k645 = getNextArrayKey( _a645, _k645 );
|
||||
}
|
||||
return winning_teams;
|
||||
}
|
||||
|
||||
areteamarraysequal( teamsa, teamsb )
|
||||
{
|
||||
if ( teamsa.size != teamsb.size )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
_a668 = teamsa;
|
||||
_k668 = getFirstArrayKey( _a668 );
|
||||
while ( isDefined( _k668 ) )
|
||||
{
|
||||
team = _a668[ _k668 ];
|
||||
if ( !isDefined( teamsb[ team ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
_k668 = getNextArrayKey( _a668, _k668 );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
onteamscore( score, team )
|
||||
{
|
||||
game[ "teamScores" ][ team ] += score;
|
||||
if ( level.scorelimit && game[ "teamScores" ][ team ] > level.scorelimit )
|
||||
{
|
||||
game[ "teamScores" ][ team ] = level.scorelimit;
|
||||
}
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( level.scorelimit == 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
iswinning = gethighestteamscoreteam();
|
||||
if ( iswinning.size == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( ( getTime() - level.laststatustime ) < 5000 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( areteamarraysequal( iswinning, level.waswinning ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.laststatustime = getTime();
|
||||
while ( iswinning.size == 1 )
|
||||
{
|
||||
_a707 = iswinning;
|
||||
_k707 = getFirstArrayKey( _a707 );
|
||||
while ( isDefined( _k707 ) )
|
||||
{
|
||||
team = _a707[ _k707 ];
|
||||
if ( isDefined( level.waswinning[ team ] ) )
|
||||
{
|
||||
if ( level.waswinning.size == 1 )
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
maps/mp/gametypes_zm/_globallogic_audio::leaderdialog( "lead_taken", team, "status" );
|
||||
}
|
||||
_k707 = getNextArrayKey( _a707, _k707 );
|
||||
}
|
||||
}
|
||||
while ( level.waswinning.size == 1 )
|
||||
{
|
||||
_a726 = level.waswinning;
|
||||
_k726 = getFirstArrayKey( _a726 );
|
||||
while ( isDefined( _k726 ) )
|
||||
{
|
||||
team = _a726[ _k726 ];
|
||||
if ( isDefined( iswinning[ team ] ) )
|
||||
{
|
||||
if ( iswinning.size == 1 )
|
||||
{
|
||||
}
|
||||
else if ( level.waswinning.size > 1 )
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
maps/mp/gametypes_zm/_globallogic_audio::leaderdialog( "lead_lost", team, "status" );
|
||||
}
|
||||
_k726 = getNextArrayKey( _a726, _k726 );
|
||||
}
|
||||
}
|
||||
level.waswinning = iswinning;
|
||||
}
|
||||
|
||||
default_onteamscore( event, team )
|
||||
{
|
||||
}
|
||||
|
||||
initpersstat( dataname, record_stats, init_to_stat_value )
|
||||
{
|
||||
if ( !isDefined( self.pers[ dataname ] ) )
|
||||
{
|
||||
self.pers[ dataname ] = 0;
|
||||
}
|
||||
if ( !isDefined( record_stats ) || record_stats == 1 )
|
||||
{
|
||||
recordplayerstats( self, dataname, int( self.pers[ dataname ] ) );
|
||||
}
|
||||
if ( isDefined( init_to_stat_value ) && init_to_stat_value == 1 )
|
||||
{
|
||||
self.pers[ dataname ] = self getdstat( "PlayerStatsList", dataname, "StatValue" );
|
||||
}
|
||||
}
|
||||
|
||||
getpersstat( dataname )
|
||||
{
|
||||
return self.pers[ dataname ];
|
||||
}
|
||||
|
||||
incpersstat( dataname, increment, record_stats, includegametype )
|
||||
{
|
||||
pixbeginevent( "incPersStat" );
|
||||
self.pers[ dataname ] += increment;
|
||||
if ( isDefined( includegametype ) && includegametype )
|
||||
{
|
||||
self addplayerstatwithgametype( dataname, increment );
|
||||
}
|
||||
else
|
||||
{
|
||||
self addplayerstat( dataname, increment );
|
||||
}
|
||||
if ( !isDefined( record_stats ) || record_stats == 1 )
|
||||
{
|
||||
self thread threadedrecordplayerstats( dataname );
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
threadedrecordplayerstats( dataname )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
recordplayerstats( self, dataname, self.pers[ dataname ] );
|
||||
}
|
||||
|
||||
updatewinstats( winner )
|
||||
{
|
||||
}
|
||||
|
||||
updatelossstats( loser )
|
||||
{
|
||||
loser addplayerstatwithgametype( "losses", 1 );
|
||||
loser updatestatratio( "wlratio", "wins", "losses" );
|
||||
loser notify( "loss" );
|
||||
}
|
||||
|
||||
updatetiestats( loser )
|
||||
{
|
||||
loser addplayerstatwithgametype( "losses", -1 );
|
||||
loser addplayerstatwithgametype( "ties", 1 );
|
||||
loser updatestatratio( "wlratio", "wins", "losses" );
|
||||
loser setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 );
|
||||
loser notify( "tie" );
|
||||
}
|
||||
|
||||
updatewinlossstats( winner )
|
||||
{
|
||||
if ( !waslastround() && !level.hostforcedend )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = level.players;
|
||||
if ( !isDefined( winner ) || isDefined( winner ) && !isplayer( winner ) && winner == "tie" )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !isDefined( players[ i ].pers[ "team" ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( level.hostforcedend && players[ i ] ishost() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
updatetiestats( players[ i ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else if ( isplayer( winner ) )
|
||||
{
|
||||
if ( level.hostforcedend && winner ishost() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
updatewinstats( winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( !isDefined( players[ i ].pers[ "team" ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( level.hostforcedend && players[ i ] ishost() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( winner == "tie" )
|
||||
{
|
||||
updatetiestats( players[ i ] );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( players[ i ].pers[ "team" ] == winner )
|
||||
{
|
||||
updatewinstats( players[ i ] );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
players[ i ] setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
backupandclearwinstreaks()
|
||||
{
|
||||
}
|
||||
|
||||
restorewinstreaks( winner )
|
||||
{
|
||||
}
|
||||
|
||||
inckillstreaktracker( sweapon )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
if ( sweapon == "artillery_mp" )
|
||||
{
|
||||
self.pers[ "artillery_kills" ]++;
|
||||
}
|
||||
if ( sweapon == "dog_bite_mp" )
|
||||
{
|
||||
self.pers[ "dog_kills" ]++;
|
||||
}
|
||||
}
|
||||
|
||||
trackattackerkill( name, rank, xp, prestige, xuid )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
attacker = self;
|
||||
waittillframeend;
|
||||
pixbeginevent( "trackAttackerKill" );
|
||||
if ( !isDefined( attacker.pers[ "killed_players" ][ name ] ) )
|
||||
{
|
||||
attacker.pers[ "killed_players" ][ name ] = 0;
|
||||
}
|
||||
if ( !isDefined( attacker.killedplayerscurrent[ name ] ) )
|
||||
{
|
||||
attacker.killedplayerscurrent[ name ] = 0;
|
||||
}
|
||||
if ( !isDefined( attacker.pers[ "nemesis_tracking" ][ name ] ) )
|
||||
{
|
||||
attacker.pers[ "nemesis_tracking" ][ name ] = 0;
|
||||
}
|
||||
attacker.pers[ "killed_players" ][ name ]++;
|
||||
attacker.killedplayerscurrent[ name ]++;
|
||||
attacker.pers[ "nemesis_tracking" ][ name ] += 1;
|
||||
if ( attacker.pers[ "nemesis_name" ] == name )
|
||||
{
|
||||
attacker maps/mp/_challenges::killednemesis();
|
||||
}
|
||||
if ( attacker.pers[ "nemesis_name" ] == "" || attacker.pers[ "nemesis_tracking" ][ name ] > attacker.pers[ "nemesis_tracking" ][ attacker.pers[ "nemesis_name" ] ] )
|
||||
{
|
||||
attacker.pers[ "nemesis_name" ] = name;
|
||||
attacker.pers[ "nemesis_rank" ] = rank;
|
||||
attacker.pers[ "nemesis_rankIcon" ] = prestige;
|
||||
attacker.pers[ "nemesis_xp" ] = xp;
|
||||
attacker.pers[ "nemesis_xuid" ] = xuid;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( attacker.pers[ "nemesis_name" ] ) && attacker.pers[ "nemesis_name" ] == name )
|
||||
{
|
||||
attacker.pers[ "nemesis_rank" ] = rank;
|
||||
attacker.pers[ "nemesis_xp" ] = xp;
|
||||
}
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
trackattackeedeath( attackername, rank, xp, prestige, xuid )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
pixbeginevent( "trackAttackeeDeath" );
|
||||
if ( !isDefined( self.pers[ "killed_by" ][ attackername ] ) )
|
||||
{
|
||||
self.pers[ "killed_by" ][ attackername ] = 0;
|
||||
}
|
||||
self.pers[ "killed_by" ][ attackername ]++;
|
||||
if ( !isDefined( self.pers[ "nemesis_tracking" ][ attackername ] ) )
|
||||
{
|
||||
self.pers[ "nemesis_tracking" ][ attackername ] = 0;
|
||||
}
|
||||
self.pers[ "nemesis_tracking" ][ attackername ] += 1,5;
|
||||
if ( self.pers[ "nemesis_name" ] == "" || self.pers[ "nemesis_tracking" ][ attackername ] > self.pers[ "nemesis_tracking" ][ self.pers[ "nemesis_name" ] ] )
|
||||
{
|
||||
self.pers[ "nemesis_name" ] = attackername;
|
||||
self.pers[ "nemesis_rank" ] = rank;
|
||||
self.pers[ "nemesis_rankIcon" ] = prestige;
|
||||
self.pers[ "nemesis_xp" ] = xp;
|
||||
self.pers[ "nemesis_xuid" ] = xuid;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.pers[ "nemesis_name" ] ) && self.pers[ "nemesis_name" ] == attackername )
|
||||
{
|
||||
self.pers[ "nemesis_rank" ] = rank;
|
||||
self.pers[ "nemesis_xp" ] = xp;
|
||||
}
|
||||
}
|
||||
if ( self.pers[ "nemesis_name" ] == attackername && self.pers[ "nemesis_tracking" ][ attackername ] >= 2 )
|
||||
{
|
||||
self setclientuivisibilityflag( "killcam_nemesis", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setclientuivisibilityflag( "killcam_nemesis", 0 );
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
default_iskillboosting()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
givekillstats( smeansofdeath, sweapon, evictim )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
if ( level.rankedmatch && self [[ level.iskillboosting ]]() )
|
||||
{
|
||||
/#
|
||||
self iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
pixbeginevent( "giveKillStats" );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "kills", 1, 1, 1 );
|
||||
self.kills = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "kills" );
|
||||
self updatestatratio( "kdratio", "kills", "deaths" );
|
||||
attacker = self;
|
||||
if ( smeansofdeath == "MOD_HEAD_SHOT" )
|
||||
{
|
||||
attacker thread incpersstat( "headshots", 1, 1, 0 );
|
||||
attacker.headshots = attacker.pers[ "headshots" ];
|
||||
evictim recordkillmodifier( "headshot" );
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
inctotalkills( team )
|
||||
{
|
||||
if ( level.teambased && isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
game[ "totalKillsTeam" ][ team ]++;
|
||||
}
|
||||
game[ "totalKills" ]++;
|
||||
}
|
||||
|
||||
setinflictorstat( einflictor, eattacker, sweapon )
|
||||
{
|
||||
if ( !isDefined( eattacker ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( einflictor ) )
|
||||
{
|
||||
eattacker addweaponstat( sweapon, "hits", 1 );
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( einflictor.playeraffectedarray ) )
|
||||
{
|
||||
einflictor.playeraffectedarray = [];
|
||||
}
|
||||
foundnewplayer = 1;
|
||||
i = 0;
|
||||
while ( i < einflictor.playeraffectedarray.size )
|
||||
{
|
||||
if ( einflictor.playeraffectedarray[ i ] == self )
|
||||
{
|
||||
foundnewplayer = 0;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( foundnewplayer )
|
||||
{
|
||||
einflictor.playeraffectedarray[ einflictor.playeraffectedarray.size ] = self;
|
||||
if ( sweapon == "concussion_grenade_mp" || sweapon == "tabun_gas_mp" )
|
||||
{
|
||||
eattacker addweaponstat( sweapon, "used", 1 );
|
||||
}
|
||||
eattacker addweaponstat( sweapon, "hits", 1 );
|
||||
}
|
||||
}
|
||||
|
||||
processshieldassist( killedplayer )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
killedplayer endon( "disconnect" );
|
||||
wait 0,05;
|
||||
maps/mp/gametypes_zm/_globallogic_utils::waittillslowprocessallowed();
|
||||
if ( !isDefined( level.teams[ self.pers[ "team" ] ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.pers[ "team" ] == killedplayer.pers[ "team" ] )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "assists", 1, 1, 1 );
|
||||
self.assists = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "assists" );
|
||||
}
|
||||
|
||||
processassist( killedplayer, damagedone, weapon )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
killedplayer endon( "disconnect" );
|
||||
wait 0,05;
|
||||
maps/mp/gametypes_zm/_globallogic_utils::waittillslowprocessallowed();
|
||||
if ( !isDefined( level.teams[ self.pers[ "team" ] ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.pers[ "team" ] == killedplayer.pers[ "team" ] )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return;
|
||||
}
|
||||
assist_level = "assist";
|
||||
assist_level_value = int( ceil( damagedone / 25 ) );
|
||||
if ( assist_level_value < 1 )
|
||||
{
|
||||
assist_level_value = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( assist_level_value > 3 )
|
||||
{
|
||||
assist_level_value = 3;
|
||||
}
|
||||
}
|
||||
assist_level = ( assist_level + "_" ) + ( assist_level_value * 25 );
|
||||
self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "assists", 1, 1, 1 );
|
||||
self.assists = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "assists" );
|
||||
switch( weapon )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
assist_level = "assist_concussion";
|
||||
break;
|
||||
case "flash_grenade_mp":
|
||||
assist_level = "assist_flash";
|
||||
break;
|
||||
case "emp_grenade_mp":
|
||||
assist_level = "assist_emp";
|
||||
break;
|
||||
case "proximity_grenade_aoe_mp":
|
||||
case "proximity_grenade_mp":
|
||||
assist_level = "assist_proximity";
|
||||
break;
|
||||
}
|
||||
self maps/mp/_challenges::assisted();
|
||||
}
|
||||
|
||||
xpratethread()
|
||||
{
|
||||
/#
|
||||
#/
|
||||
}
|
951
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc
Normal file
951
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc
Normal file
@ -0,0 +1,951 @@
|
||||
#include maps/mp/gametypes_zm/_spawnlogic;
|
||||
#include maps/mp/gametypes_zm/_globallogic_defaults;
|
||||
#include maps/mp/gametypes_zm/_hostmigration;
|
||||
#include maps/mp/gametypes_zm/_spectating;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/gametypes_zm/_globallogic_ui;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/gametypes_zm/_hud_message;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/gametypes_zm/_globallogic_utils;
|
||||
#include maps/mp/gametypes_zm/_globallogic_audio;
|
||||
#include maps/mp/gametypes_zm/_spawning;
|
||||
#include maps/mp/gametypes_zm/_globallogic_player;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
timeuntilspawn( includeteamkilldelay ) //checked matches cerberus output
|
||||
{
|
||||
if ( level.ingraceperiod && !self.hasspawned )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
respawndelay = 0;
|
||||
if ( self.hasspawned )
|
||||
{
|
||||
result = self [[ level.onrespawndelay ]]();
|
||||
if ( isDefined( result ) )
|
||||
{
|
||||
respawndelay = result;
|
||||
}
|
||||
else
|
||||
{
|
||||
respawndelay = level.playerrespawndelay;
|
||||
}
|
||||
if ( includeteamkilldelay && isDefined( self.teamkillpunish ) && self.teamkillpunish )
|
||||
{
|
||||
respawndelay += maps/mp/gametypes_zm/_globallogic_player::teamkilldelay();
|
||||
}
|
||||
}
|
||||
wavebased = level.waverespawndelay > 0;
|
||||
if ( wavebased )
|
||||
{
|
||||
return self timeuntilwavespawn( respawndelay );
|
||||
}
|
||||
return respawndelay;
|
||||
}
|
||||
|
||||
allteamshaveexisted() //checked changed to match cerberus output
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( !level.everexisted[ team ] )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
mayspawn() //checked partially changed to match cerberus output changed at own discretion
|
||||
{
|
||||
if ( isDefined( level.mayspawn ) && !( self [[ level.mayspawn ]]() ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.inovertime )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.playerqueuedrespawn && !isDefined( self.allowqueuespawn ) && !level.ingraceperiod && !level.usestartspawns )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.numlives )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
gamehasstarted = allteamshaveexisted();
|
||||
}
|
||||
else
|
||||
{
|
||||
gamehasstarted = level.maxplayercount > 1;
|
||||
if ( gamehasstarted == 0 )
|
||||
{
|
||||
if ( !isoneround() && !isfirstround() )
|
||||
{
|
||||
gamehasstarted = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gamehasstarted = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !self.pers[ "lives" ] && gamehasstarted )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if ( gamehasstarted )
|
||||
{
|
||||
if ( !level.ingraceperiod && !self.hasspawned && !level.wagermatch )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
timeuntilwavespawn( minimumwait ) //checked matches cerberus output
|
||||
{
|
||||
earliestspawntime = getTime() + ( minimumwait * 1000 );
|
||||
lastwavetime = level.lastwave[ self.pers[ "team" ] ];
|
||||
wavedelay = level.wavedelay[ self.pers[ "team" ] ] * 1000;
|
||||
if ( wavedelay == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
numwavespassedearliestspawntime = ( earliestspawntime - lastwavetime ) / wavedelay;
|
||||
numwaves = ceil( numwavespassedearliestspawntime );
|
||||
timeofspawn = lastwavetime + ( numwaves * wavedelay );
|
||||
if ( isDefined( self.wavespawnindex ) )
|
||||
{
|
||||
timeofspawn += 50 * self.wavespawnindex;
|
||||
}
|
||||
return ( timeofspawn - getTime() ) / 1000;
|
||||
}
|
||||
|
||||
stoppoisoningandflareonspawn() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.inpoisonarea = 0;
|
||||
self.inburnarea = 0;
|
||||
self.inflarevisionarea = 0;
|
||||
self.ingroundnapalm = 0;
|
||||
}
|
||||
|
||||
spawnplayerprediction() //checked changed to match cerberus output dvar taken from beta dump
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_respawn" );
|
||||
self endon( "game_ended" );
|
||||
self endon( "joined_spectators" );
|
||||
self endon( "spawned" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0.5;
|
||||
if ( isDefined( level.onspawnplayerunified ) && getDvarInt( "scr_disableunifiedspawning" ) == 0 )
|
||||
{
|
||||
maps/mp/gametypes_zm/_spawning::onspawnplayer_unified( 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self [[ level.onspawnplayer ]]( 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
giveloadoutlevelspecific( team, class ) //checked matches cerberus output
|
||||
{
|
||||
pixbeginevent( "giveLoadoutLevelSpecific" );
|
||||
if ( isDefined( level.givecustomcharacters ) )
|
||||
{
|
||||
self [[ level.givecustomcharacters ]]();
|
||||
}
|
||||
if ( isDefined( level.givecustomloadout ) )
|
||||
{
|
||||
self [[ level.givecustomloadout ]]();
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
spawnplayer() //checked matches cerberus output dvars taken from beta dump
|
||||
{
|
||||
pixbeginevent( "spawnPlayer_preUTS" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "joined_spectators" );
|
||||
self notify( "spawned" );
|
||||
level notify( "player_spawned" );
|
||||
self notify( "end_respawn" );
|
||||
self setspawnvariables();
|
||||
if ( !self.hasspawned )
|
||||
{
|
||||
self.underscorechance = 70;
|
||||
self thread maps/mp/gametypes_zm/_globallogic_audio::sndstartmusicsystem();
|
||||
}
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.sessionteam = self.team;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.sessionteam = "none";
|
||||
self.ffateam = self.team;
|
||||
}
|
||||
hadspawned = self.hasspawned;
|
||||
self.sessionstate = "playing";
|
||||
self.spectatorclient = -1;
|
||||
self.killcamentity = -1;
|
||||
self.archivetime = 0;
|
||||
self.psoffsettime = 0;
|
||||
self.statusicon = "";
|
||||
self.damagedplayers = [];
|
||||
if ( getDvarInt( "scr_csmode" ) > 0 )
|
||||
{
|
||||
self.maxhealth = getDvarInt( "scr_csmode" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.maxhealth = level.playermaxhealth;
|
||||
}
|
||||
self.health = self.maxhealth;
|
||||
self.friendlydamage = undefined;
|
||||
self.hasspawned = 1;
|
||||
self.spawntime = getTime();
|
||||
self.afk = 0;
|
||||
if ( self.pers[ "lives" ] && !isDefined( level.takelivesondeath ) || level.takelivesondeath == 0 )
|
||||
{
|
||||
self.pers[ "lives" ]--;
|
||||
if ( self.pers[ "lives" ] == 0 )
|
||||
{
|
||||
level notify( "player_eliminated" );
|
||||
self notify( "player_eliminated" );
|
||||
}
|
||||
}
|
||||
self.laststand = undefined;
|
||||
self.revivingteammate = 0;
|
||||
self.burning = undefined;
|
||||
self.nextkillstreakfree = undefined;
|
||||
self.activeuavs = 0;
|
||||
self.activecounteruavs = 0;
|
||||
self.activesatellites = 0;
|
||||
self.deathmachinekills = 0;
|
||||
self.disabledweapon = 0;
|
||||
self resetusability();
|
||||
self maps/mp/gametypes_zm/_globallogic_player::resetattackerlist();
|
||||
self.diedonvehicle = undefined;
|
||||
if ( !self.wasaliveatmatchstart )
|
||||
{
|
||||
if ( level.ingraceperiod || maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() < 20000 )
|
||||
{
|
||||
self.wasaliveatmatchstart = 1;
|
||||
}
|
||||
}
|
||||
self setdepthoffield( 0, 0, 512, 512, 4, 0 );
|
||||
self resetfov();
|
||||
pixbeginevent( "onSpawnPlayer" );
|
||||
if ( isDefined( level.onspawnplayerunified ) && getDvarInt( "scr_disableunifiedspawning" ) == 0 )
|
||||
{
|
||||
self [[ level.onspawnplayerunified ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
self [[ level.onspawnplayer ]]( 0 );
|
||||
}
|
||||
if ( isDefined( level.playerspawnedcb ) )
|
||||
{
|
||||
self [[ level.playerspawnedcb ]]();
|
||||
}
|
||||
pixendevent();
|
||||
pixendevent();
|
||||
level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus();
|
||||
pixbeginevent( "spawnPlayer_postUTS" );
|
||||
self thread stoppoisoningandflareonspawn();
|
||||
self stopburning();
|
||||
/*
|
||||
/#
|
||||
assert( maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.class ) );
|
||||
#/
|
||||
*/
|
||||
self giveloadoutlevelspecific( self.team, self.class );
|
||||
if ( level.inprematchperiod )
|
||||
{
|
||||
self freeze_player_controls( 1 );
|
||||
team = self.pers[ "team" ];
|
||||
if ( isDefined( self.pers[ "music" ].spawn ) && self.pers[ "music" ].spawn == 0 )
|
||||
{
|
||||
if ( level.wagermatch )
|
||||
{
|
||||
music = "SPAWN_WAGER";
|
||||
}
|
||||
else
|
||||
{
|
||||
music = game[ "music" ][ "spawn_" + team ];
|
||||
}
|
||||
self thread maps/mp/gametypes_zm/_globallogic_audio::set_music_on_player( music, 0, 0 );
|
||||
self.pers[ "music" ].spawn = 1;
|
||||
}
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
if ( isDefined( level.playedstartingmusic ) )
|
||||
{
|
||||
music = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.playedstartingmusic = 1;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( level.disableprematchmessages ) || level.disableprematchmessages == 0 )
|
||||
{
|
||||
thread maps/mp/gametypes_zm/_hud_message::showinitialfactionpopup( team );
|
||||
hintmessage = getobjectivehinttext( self.pers[ "team" ] );
|
||||
if ( isDefined( hintmessage ) )
|
||||
{
|
||||
self thread maps/mp/gametypes_zm/_hud_message::hintmessage( hintmessage );
|
||||
}
|
||||
if ( isDefined( game[ "dialog" ][ "gametype" ] ) && !level.splitscreen || self == level.players[ 0 ] )
|
||||
{
|
||||
if ( !isDefined( level.infinalfight ) || !level.infinalfight )
|
||||
{
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( team == game[ "attackers" ] )
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self freeze_player_controls( 0 );
|
||||
self enableweapons();
|
||||
if ( !hadspawned && game[ "state" ] == "playing" )
|
||||
{
|
||||
pixbeginevent( "sound" );
|
||||
team = self.team;
|
||||
if ( isDefined( self.pers[ "music" ].spawn ) && self.pers[ "music" ].spawn == 0 )
|
||||
{
|
||||
self thread maps/mp/gametypes_zm/_globallogic_audio::set_music_on_player( "SPAWN_SHORT", 0, 0 );
|
||||
self.pers[ "music" ].spawn = 1;
|
||||
}
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
if ( isDefined( level.playedstartingmusic ) )
|
||||
{
|
||||
music = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.playedstartingmusic = 1;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( level.disableprematchmessages ) || level.disableprematchmessages == 0 )
|
||||
{
|
||||
thread maps/mp/gametypes_zm/_hud_message::showinitialfactionpopup( team );
|
||||
hintmessage = getobjectivehinttext( self.pers[ "team" ] );
|
||||
if ( isDefined( hintmessage ) )
|
||||
{
|
||||
self thread maps/mp/gametypes_zm/_hud_message::hintmessage( hintmessage );
|
||||
}
|
||||
if ( isDefined( game[ "dialog" ][ "gametype" ] ) || !level.splitscreen && self == level.players[ 0 ] )
|
||||
{
|
||||
if ( !isDefined( level.infinalfight ) || !level.infinalfight )
|
||||
{
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype" );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( team == game[ "attackers" ] )
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" );
|
||||
}
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
}
|
||||
if ( getDvar( "scr_showperksonspawn" ) == "" )
|
||||
{
|
||||
setdvar( "scr_showperksonspawn", "0" );
|
||||
}
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
setdvar( "scr_showperksonspawn", "0" );
|
||||
}
|
||||
if ( !level.splitscreen && getDvarInt( "scr_showperksonspawn" ) == 1 && game[ "state" ] != "postgame" )
|
||||
{
|
||||
pixbeginevent( "showperksonspawn" );
|
||||
if ( level.perksenabled == 1 )
|
||||
{
|
||||
self maps/mp/gametypes_zm/_hud_util::showperks();
|
||||
}
|
||||
self thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutaftertime( 3 );
|
||||
self thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutondeath();
|
||||
pixendevent();
|
||||
}
|
||||
if ( isDefined( self.pers[ "momentum" ] ) )
|
||||
{
|
||||
self.momentum = self.pers[ "momentum" ];
|
||||
}
|
||||
pixendevent();
|
||||
waittillframeend;
|
||||
self notify( "spawned_player" );
|
||||
self logstring( "S " + self.origin[ 0 ] + " " + self.origin[ 1 ] + " " + self.origin[ 2 ] );
|
||||
setdvar( "scr_selecting_location", "" );
|
||||
/*
|
||||
/#
|
||||
if ( getDvarInt( "scr_xprate" ) > 0 )
|
||||
{
|
||||
self thread maps/mp/gametypes_zm/_globallogic_score::xpratethread();
|
||||
#/
|
||||
}
|
||||
*/
|
||||
self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 );
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( !level.intermission );
|
||||
#/
|
||||
*/
|
||||
self maps/mp/gametypes_zm/_globallogic_player::freezeplayerforroundend();
|
||||
}
|
||||
}
|
||||
|
||||
spawnspectator( origin, angles ) //checked matches cerberus output
|
||||
{
|
||||
self notify( "spawned" );
|
||||
self notify( "end_respawn" );
|
||||
in_spawnspectator( origin, angles );
|
||||
}
|
||||
|
||||
respawn_asspectator( origin, angles ) //checked matches cerberus output
|
||||
{
|
||||
in_spawnspectator( origin, angles );
|
||||
}
|
||||
|
||||
in_spawnspectator( origin, angles ) //checked matches cerberus output
|
||||
{
|
||||
pixmarker( "BEGIN: in_spawnSpectator" );
|
||||
self setspawnvariables();
|
||||
if ( self.pers[ "team" ] == "spectator" )
|
||||
{
|
||||
self clearlowermessage();
|
||||
}
|
||||
self.sessionstate = "spectator";
|
||||
self.spectatorclient = -1;
|
||||
self.killcamentity = -1;
|
||||
self.archivetime = 0;
|
||||
self.psoffsettime = 0;
|
||||
self.friendlydamage = undefined;
|
||||
if ( self.pers[ "team" ] == "spectator" )
|
||||
{
|
||||
self.statusicon = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
self.statusicon = "hud_status_dead";
|
||||
}
|
||||
maps/mp/gametypes_zm/_spectating::setspectatepermissionsformachine();
|
||||
[[ level.onspawnspectator ]]( origin, angles );
|
||||
if ( level.teambased && !level.splitscreen )
|
||||
{
|
||||
self thread spectatorthirdpersonness();
|
||||
}
|
||||
level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus();
|
||||
pixmarker( "END: in_spawnSpectator" );
|
||||
}
|
||||
|
||||
spectatorthirdpersonness() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "spawned" );
|
||||
self notify( "spectator_thirdperson_thread" );
|
||||
self endon( "spectator_thirdperson_thread" );
|
||||
self.spectatingthirdperson = 0;
|
||||
}
|
||||
|
||||
forcespawn( time ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "spawned" );
|
||||
if ( !isDefined( time ) )
|
||||
{
|
||||
time = 60;
|
||||
}
|
||||
wait time;
|
||||
if ( self.hasspawned )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.pers[ "team" ] == "spectator" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.pers[ "class" ] ) )
|
||||
{
|
||||
self.pers[ "class" ] = "CLASS_CUSTOM1";
|
||||
self.class = self.pers[ "class" ];
|
||||
}
|
||||
self maps/mp/gametypes_zm/_globallogic_ui::closemenus();
|
||||
self thread [[ level.spawnclient ]]();
|
||||
}
|
||||
|
||||
kickifdontspawn() //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( getDvarInt( "scr_hostmigrationtest" ) == 1 )
|
||||
{
|
||||
return;
|
||||
#/
|
||||
}
|
||||
*/
|
||||
if ( self ishost() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self kickifidontspawninternal();
|
||||
}
|
||||
|
||||
kickifidontspawninternal() //checked matches cerberus output dvars taken from beta dump
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "spawned" );
|
||||
waittime = 90;
|
||||
if ( getDvar( "scr_kick_time" ) != "" )
|
||||
{
|
||||
waittime = getDvarFloat( "scr_kick_time" );
|
||||
}
|
||||
mintime = 45;
|
||||
if ( getDvar( scr_kick_mintime) != "" )
|
||||
{
|
||||
mintime = getDvarFloat( scr_kick_mintime);
|
||||
}
|
||||
starttime = getTime();
|
||||
kickwait( waittime );
|
||||
timepassed = ( getTime() - starttime ) / 1000;
|
||||
if ( timepassed < ( waittime - 0.1 ) && timepassed < mintime )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.hasspawned )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( sessionmodeisprivate() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.pers[ "team" ] == "spectator" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
kick( self getentitynumber() );
|
||||
}
|
||||
|
||||
kickwait( waittime ) //checked matches cerberus output
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
maps/mp/gametypes_zm/_hostmigration::waitlongdurationwithhostmigrationpause( waittime );
|
||||
}
|
||||
|
||||
spawninterroundintermission() //checked matches cerberus output
|
||||
{
|
||||
self notify( "spawned" );
|
||||
self notify( "end_respawn" );
|
||||
self setspawnvariables();
|
||||
self clearlowermessage();
|
||||
self freeze_player_controls( 0 );
|
||||
self.sessionstate = "spectator";
|
||||
self.spectatorclient = -1;
|
||||
self.killcamentity = -1;
|
||||
self.archivetime = 0;
|
||||
self.psoffsettime = 0;
|
||||
self.friendlydamage = undefined;
|
||||
self maps/mp/gametypes_zm/_globallogic_defaults::default_onspawnintermission();
|
||||
self setorigin( self.origin );
|
||||
self setplayerangles( self.angles );
|
||||
self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 );
|
||||
}
|
||||
|
||||
spawnintermission( usedefaultcallback ) //checked changed to match cerberus output
|
||||
{
|
||||
self notify( "spawned" );
|
||||
self notify( "end_respawn" );
|
||||
self endon( "disconnect" );
|
||||
self setspawnvariables();
|
||||
self clearlowermessage();
|
||||
self freeze_player_controls( 0 );
|
||||
if ( level.rankedmatch && waslastround() )
|
||||
{
|
||||
if ( self.postgamemilestones || self.postgamecontracts || self.postgamepromotion )
|
||||
{
|
||||
if ( self.postgamepromotion )
|
||||
{
|
||||
self playlocalsound( "mus_level_up" );
|
||||
}
|
||||
else if ( self.postgamecontracts )
|
||||
{
|
||||
self playlocalsound( "mus_challenge_complete" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.postgamemilestones )
|
||||
{
|
||||
self playlocalsound( "mus_contract_complete" );
|
||||
}
|
||||
}
|
||||
self closeingamemenu();
|
||||
self openmenu( game[ "menu_endgameupdate" ] );
|
||||
waittime = 4;
|
||||
while ( waittime )
|
||||
{
|
||||
wait 0.25;
|
||||
waittime -= 0.25;
|
||||
self openmenu( game[ "menu_endgameupdate" ] );
|
||||
}
|
||||
self closemenu();
|
||||
}
|
||||
}
|
||||
self.sessionstate = "intermission";
|
||||
self.spectatorclient = -1;
|
||||
self.killcamentity = -1;
|
||||
self.archivetime = 0;
|
||||
self.psoffsettime = 0;
|
||||
self.friendlydamage = undefined;
|
||||
if ( isDefined( usedefaultcallback ) && usedefaultcallback )
|
||||
{
|
||||
maps/mp/gametypes_zm/_globallogic_defaults::default_onspawnintermission();
|
||||
}
|
||||
else
|
||||
{
|
||||
[[ level.onspawnintermission ]]();
|
||||
}
|
||||
self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 );
|
||||
}
|
||||
|
||||
spawnqueuedclientonteam( team ) //checked partially changed to match cerberus output see info.md
|
||||
{
|
||||
player_to_spawn = undefined;
|
||||
for ( i = 0; i < level.deadplayers[team].size; i++ )
|
||||
{
|
||||
player = level.deadplayers[ team ][ i ];
|
||||
if ( player.waitingtospawn )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
player_to_spawn = player;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( isDefined( player_to_spawn ) )
|
||||
{
|
||||
player_to_spawn.allowqueuespawn = 1;
|
||||
player_to_spawn maps/mp/gametypes_zm/_globallogic_ui::closemenus();
|
||||
player_to_spawn thread [[ level.spawnclient ]]();
|
||||
}
|
||||
}
|
||||
|
||||
spawnqueuedclient( dead_player_team, killer ) //checked partially changed to match cerberus output see info.md
|
||||
{
|
||||
if ( !level.playerqueuedrespawn )
|
||||
{
|
||||
return;
|
||||
}
|
||||
maps/mp/gametypes_zm/_globallogic_utils::waittillslowprocessallowed();
|
||||
spawn_team = undefined;
|
||||
if ( isDefined( killer ) && isDefined( killer.team ) && isDefined( level.teams[ killer.team ] ) )
|
||||
{
|
||||
spawn_team = killer.team;
|
||||
}
|
||||
if ( isDefined( spawn_team ) )
|
||||
{
|
||||
spawnqueuedclientonteam( spawn_team );
|
||||
return;
|
||||
}
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( team == dead_player_team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnqueuedclientonteam( team );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
allteamsnearscorelimit() //checked changed to match cerberus output
|
||||
{
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.scorelimit <= 1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( !( game[ "teamScores" ][ team ] >= ( level.scoreLimit - 1 ) ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
shouldshowrespawnmessage() //checked matches cerberus output
|
||||
{
|
||||
if ( waslastround() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isoneround() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( level.livesdonotreset ) && level.livesdonotreset )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( allteamsnearscorelimit() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
default_spawnmessage() //checked matches cerberus output
|
||||
{
|
||||
setlowermessage( game[ "strings" ][ "spawn_next_round" ] );
|
||||
self thread maps/mp/gametypes_zm/_globallogic_ui::removespawnmessageshortly( 3 );
|
||||
}
|
||||
|
||||
showspawnmessage() //checked matches cerberus output
|
||||
{
|
||||
if ( shouldshowrespawnmessage() )
|
||||
{
|
||||
self thread [[ level.spawnmessage ]]();
|
||||
}
|
||||
}
|
||||
|
||||
spawnclient( timealreadypassed ) //checked matches cerberus output
|
||||
{
|
||||
pixbeginevent( "spawnClient" );
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( self.team ) );
|
||||
#/
|
||||
/#
|
||||
assert( maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.class ) );
|
||||
#/
|
||||
*/
|
||||
if ( !self mayspawn() )
|
||||
{
|
||||
currentorigin = self.origin;
|
||||
currentangles = self.angles;
|
||||
self showspawnmessage();
|
||||
self thread [[ level.spawnspectator ]]( currentorigin + vectorScale( ( 0, 0, 1 ), 60 ), currentangles );
|
||||
pixendevent();
|
||||
return;
|
||||
}
|
||||
if ( self.waitingtospawn )
|
||||
{
|
||||
pixendevent();
|
||||
return;
|
||||
}
|
||||
self.waitingtospawn = 1;
|
||||
self.allowqueuespawn = undefined;
|
||||
self waitandspawnclient( timealreadypassed );
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self.waitingtospawn = 0;
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
waitandspawnclient( timealreadypassed ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_respawn" );
|
||||
level endon( "game_ended" );
|
||||
if ( !isDefined( timealreadypassed ) )
|
||||
{
|
||||
timealreadypassed = 0;
|
||||
}
|
||||
spawnedasspectator = 0;
|
||||
if ( isDefined( self.teamkillpunish ) && self.teamkillpunish )
|
||||
{
|
||||
teamkilldelay = maps/mp/gametypes_zm/_globallogic_player::teamkilldelay();
|
||||
if ( teamkilldelay > timealreadypassed )
|
||||
{
|
||||
teamkilldelay -= timealreadypassed;
|
||||
timealreadypassed = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
timealreadypassed -= teamkilldelay;
|
||||
teamkilldelay = 0;
|
||||
}
|
||||
if ( teamkilldelay > 0 )
|
||||
{
|
||||
setlowermessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamkilldelay );
|
||||
self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles );
|
||||
spawnedasspectator = 1;
|
||||
wait teamkilldelay;
|
||||
}
|
||||
self.teamkillpunish = 0;
|
||||
}
|
||||
if ( !isDefined( self.wavespawnindex ) && isDefined( level.waveplayerspawnindex[ self.team ] ) )
|
||||
{
|
||||
self.wavespawnindex = level.waveplayerspawnindex[ self.team ];
|
||||
level.waveplayerspawnindex[ self.team ]++;
|
||||
}
|
||||
timeuntilspawn = timeuntilspawn( 0 );
|
||||
if ( timeuntilspawn > timealreadypassed )
|
||||
{
|
||||
timeuntilspawn -= timealreadypassed;
|
||||
timealreadypassed = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
timealreadypassed -= timeuntilspawn;
|
||||
timeuntilspawn = 0;
|
||||
}
|
||||
if ( timeuntilspawn > 0 )
|
||||
{
|
||||
if ( level.playerqueuedrespawn )
|
||||
{
|
||||
setlowermessage( game[ "strings" ][ "you_will_spawn" ], timeuntilspawn );
|
||||
}
|
||||
else if ( self issplitscreen() )
|
||||
{
|
||||
setlowermessage( game[ "strings" ][ "waiting_to_spawn_ss" ], timeuntilspawn, 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
setlowermessage( game[ "strings" ][ "waiting_to_spawn" ], timeuntilspawn );
|
||||
}
|
||||
if ( !spawnedasspectator )
|
||||
{
|
||||
spawnorigin = self.origin + vectorScale( ( 0, 0, 1 ), 60 );
|
||||
spawnangles = self.angles;
|
||||
if ( isDefined( level.useintermissionpointsonwavespawn ) && [[ level.useintermissionpointsonwavespawn ]]() == 1 )
|
||||
{
|
||||
spawnpoint = maps/mp/gametypes_zm/_spawnlogic::getrandomintermissionpoint();
|
||||
if ( isDefined( spawnpoint ) )
|
||||
{
|
||||
spawnorigin = spawnpoint.origin;
|
||||
spawnangles = spawnpoint.angles;
|
||||
}
|
||||
}
|
||||
self thread respawn_asspectator( spawnorigin, spawnangles );
|
||||
}
|
||||
spawnedasspectator = 1;
|
||||
self maps/mp/gametypes_zm/_globallogic_utils::waitfortimeornotify( timeuntilspawn, "force_spawn" );
|
||||
self notify( "stop_wait_safe_spawn_button" );
|
||||
}
|
||||
wavebased = level.waverespawndelay > 0;
|
||||
if ( !level.playerforcerespawn && self.hasspawned && !wavebased && !self.wantsafespawn && !level.playerqueuedrespawn )
|
||||
{
|
||||
setlowermessage( game[ "strings" ][ "press_to_spawn" ] );
|
||||
if ( !spawnedasspectator )
|
||||
{
|
||||
self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles );
|
||||
}
|
||||
spawnedasspectator = 1;
|
||||
self waitrespawnorsafespawnbutton();
|
||||
}
|
||||
self.waitingtospawn = 0;
|
||||
self clearlowermessage();
|
||||
self.wavespawnindex = undefined;
|
||||
self.respawntimerstarttime = undefined;
|
||||
self thread [[ level.spawnplayer ]]();
|
||||
}
|
||||
|
||||
waitrespawnorsafespawnbutton() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_respawn" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self usebuttonpressed() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
waitinspawnqueue() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_respawn" );
|
||||
if ( !level.ingraceperiod && !level.usestartspawns )
|
||||
{
|
||||
currentorigin = self.origin;
|
||||
currentangles = self.angles;
|
||||
self thread [[ level.spawnspectator ]]( currentorigin + vectorScale( ( 0, 0, 1 ), 60 ), currentangles );
|
||||
self waittill( "queue_respawn" );
|
||||
}
|
||||
}
|
||||
|
||||
setthirdperson( value ) //checked matches cerberus output
|
||||
{
|
||||
if ( !level.console )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.spectatingthirdperson ) || value != self.spectatingthirdperson )
|
||||
{
|
||||
self.spectatingthirdperson = value;
|
||||
if ( value )
|
||||
{
|
||||
self setclientthirdperson( 1 );
|
||||
self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setclientthirdperson( 0 );
|
||||
self setdepthoffield( 0, 0, 512, 4000, 4, 0 );
|
||||
}
|
||||
self resetfov();
|
||||
}
|
||||
}
|
||||
|
||||
setspawnvariables() //checked matches cerberus output
|
||||
{
|
||||
resettimeout();
|
||||
self stopshellshock();
|
||||
self stoprumble( "damage_heavy" );
|
||||
}
|
||||
|
544
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc
Normal file
544
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc
Normal file
@ -0,0 +1,544 @@
|
||||
#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" );
|
||||
}
|
||||
}
|
||||
|
||||
setupcallbacks()
|
||||
{
|
||||
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" );
|
||||
}
|
||||
|
||||
hideloadoutondeath()
|
||||
{
|
||||
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" );
|
||||
}
|
||||
|
||||
freegameplayhudelems()
|
||||
{
|
||||
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;
|
||||
_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;
|
||||
_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 = "";
|
||||
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;
|
||||
_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;
|
||||
_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;
|
||||
}
|
||||
|
||||
getsplitscreenteam()
|
||||
{
|
||||
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" ] ) );
|
||||
}
|
||||
}
|
||||
|
||||
closemenus()
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
}
|
||||
|
||||
beginclasschoice( forcenewchoice )
|
||||
{
|
||||
/#
|
||||
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 ] );
|
||||
}
|
||||
}
|
||||
|
||||
showmainmenuforteam()
|
||||
{
|
||||
/#
|
||||
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 ] );
|
||||
}
|
||||
}
|
||||
|
||||
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.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.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();
|
||||
}
|
||||
|
||||
removespawnmessageshortly( delay )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
self endon( "end_respawn" );
|
||||
wait delay;
|
||||
self clearlowermessage( 2 );
|
||||
}
|
478
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc
Normal file
478
Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc
Normal file
@ -0,0 +1,478 @@
|
||||
#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();
|
||||
}
|
||||
|
||||
testmenu()
|
||||
{
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
gettimeremaining()
|
||||
{
|
||||
return ( ( level.timelimit * 60 ) * 1000 ) - gettimepassed();
|
||||
}
|
||||
|
||||
registerpostroundevent( eventfunc )
|
||||
{
|
||||
if ( !isDefined( level.postroundevents ) )
|
||||
{
|
||||
level.postroundevents = [];
|
||||
}
|
||||
level.postroundevents[ level.postroundevents.size ] = eventfunc;
|
||||
}
|
||||
|
||||
executepostroundevents()
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assertproperplacement()
|
||||
{
|
||||
/#
|
||||
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() )
|
||||
{
|
||||
/#
|
||||
assert( !isDefined( 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 ( 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" );
|
||||
}
|
||||
|
||||
gametimer()
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
pausetimer()
|
||||
{
|
||||
if ( level.timerstopped )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.timerstopped = 1;
|
||||
level.timerpausetime = getTime();
|
||||
}
|
||||
|
||||
resumetimer()
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.timerstopped = 0;
|
||||
level.discardtime += getTime() - level.timerpausetime;
|
||||
}
|
||||
|
||||
getscoreremaining( 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 );
|
||||
}
|
||||
}
|
||||
|
||||
getscoreperminute( 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;
|
||||
}
|
||||
}
|
||||
|
||||
getestimatedtimeuntilscorelimit( team )
|
||||
{
|
||||
/#
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
assert( isDefined( team ) );
|
||||
}
|
||||
#/
|
||||
scoreperminute = self getscoreperminute( team );
|
||||
scoreremaining = self getscoreremaining( team );
|
||||
if ( !scoreperminute )
|
||||
{
|
||||
return 999999;
|
||||
}
|
||||
return scoreremaining / scoreperminute;
|
||||
}
|
||||
|
||||
rumbler()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
}
|
||||
}
|
||||
|
||||
waitfortimeornotify( time, notifyname )
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait time;
|
||||
}
|
||||
|
||||
waitfortimeornotifynoartillery( time, notifyname )
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait time;
|
||||
while ( isDefined( level.artilleryinprogress ) )
|
||||
{
|
||||
/#
|
||||
assert( level.artilleryinprogress );
|
||||
#/
|
||||
wait 0,25;
|
||||
}
|
||||
}
|
||||
|
||||
isheadshot( sweapon, shitloc, smeansofdeath, einflictor )
|
||||
{
|
||||
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 "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 )
|
||||
{
|
||||
/#
|
||||
i = 0;
|
||||
while ( i < 50 )
|
||||
{
|
||||
line( start, end );
|
||||
wait 0,05;
|
||||
i++;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
isexcluded( entity, entitylist )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
logteamwinstring( wintype, winner )
|
||||
{
|
||||
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 );
|
||||
}
|
@ -0,0 +1,471 @@
|
||||
#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 );
|
||||
}
|
||||
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 ( 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;
|
||||
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 ) );
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon )
|
||||
{
|
||||
if ( isDefined( self.allowfriendlyfiredamageoverride ) )
|
||||
{
|
||||
return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon );
|
||||
}
|
||||
vehicle = eattacker getvehicleoccupied();
|
||||
return 0;
|
||||
}
|
995
Zombie Core/patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc
Normal file
995
Zombie Core/patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc
Normal file
@ -0,0 +1,995 @@
|
||||
#include maps/mp/gametypes_zm/_globallogic_ui;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
initializeactionarray()
|
||||
{
|
||||
level.gametypeactions = [];
|
||||
level.gametypeactions[ "GiveAmmo" ] = ::dogiveammo;
|
||||
level.gametypeactions[ "RemoveAmmo" ] = ::doremoveammo;
|
||||
level.gametypeactions[ "PlaySound" ] = ::doplaysound;
|
||||
level.gametypeactions[ "EnableUAV" ] = ::doenableuav;
|
||||
level.gametypeactions[ "GiveScore" ] = ::dogivescore;
|
||||
level.gametypeactions[ "RemoveScore" ] = ::doremovescore;
|
||||
level.gametypeactions[ "SetHeader" ] = ::dosetheader;
|
||||
level.gametypeactions[ "SetSubHeader" ] = ::dosetsubheader;
|
||||
level.gametypeactions[ "DisplayMessage" ] = ::dodisplaymessage;
|
||||
level.gametypeactions[ "GiveHealth" ] = ::dogivehealth;
|
||||
level.gametypeactions[ "RemoveHealth" ] = ::doremovehealth;
|
||||
level.gametypeactions[ "SetHealthRegen" ] = ::dosethealthregen;
|
||||
level.gametypeactions[ "ChangeClass" ] = ::dochangeclass;
|
||||
level.gametypeactions[ "ChangeTeam" ] = ::dochangeteam;
|
||||
level.gametypeactions[ "GivePerk" ] = ::dogiveperk;
|
||||
level.gametypeactions[ "RemovePerk" ] = ::doremoveperk;
|
||||
level.gametypeactions[ "GiveInvuln" ] = ::dogiveinvuln;
|
||||
level.gametypeactions[ "RemoveInvuln" ] = ::doremoveinvuln;
|
||||
level.gametypeactions[ "SetDamageModifier" ] = ::dosetdamagemodifier;
|
||||
level.gametypeactions[ "GiveKillstreak" ] = ::dogivekillstreak;
|
||||
level.gametypeactions[ "RemoveKillstreak" ] = ::doremovekillstreak;
|
||||
level.gametypeactions[ "GiveLives" ] = ::dogivelives;
|
||||
level.gametypeactions[ "RemoveLives" ] = ::doremovelives;
|
||||
level.gametypeactions[ "ScaleMoveSpeed" ] = ::doscalemovespeed;
|
||||
level.gametypeactions[ "ShowOnRadar" ] = ::doshowonradar;
|
||||
level.conditionals = [];
|
||||
level.conditionals[ "Equals" ] = ::equals;
|
||||
level.conditionals[ "==" ] = ::equals;
|
||||
level.conditionals[ "!=" ] = ::notequals;
|
||||
level.conditionals[ "<" ] = ::lessthan;
|
||||
level.conditionals[ "<=" ] = ::lessthanequals;
|
||||
level.conditionals[ ">" ] = ::greaterthan;
|
||||
level.conditionals[ ">=" ] = ::greaterthanequals;
|
||||
level.conditionals[ "InPlace" ] = ::inplace;
|
||||
level.conditionallefthandside = [];
|
||||
level.conditionallefthandside[ "PlayersLeft" ] = ::playersleft;
|
||||
level.conditionallefthandside[ "RoundsPlayed" ] = ::roundsplayed;
|
||||
level.conditionallefthandside[ "HitBy" ] = ::hitby;
|
||||
level.conditionallefthandside[ "PlayersClass" ] = ::playersclass;
|
||||
level.conditionallefthandside[ "VictimsClass" ] = ::playersclass;
|
||||
level.conditionallefthandside[ "AttackersClass" ] = ::attackersclass;
|
||||
level.conditionallefthandside[ "PlayersPlace" ] = ::playersplace;
|
||||
level.conditionallefthandside[ "VictimsPlace" ] = ::playersplace;
|
||||
level.conditionallefthandside[ "AttackersPlace" ] = ::attackersplace;
|
||||
level.targets = [];
|
||||
level.targets[ "Everyone" ] = ::gettargeteveryone;
|
||||
level.targets[ "PlayersLeft" ] = ::gettargetplayersleft;
|
||||
level.targets[ "PlayersEliminated" ] = ::gettargetplayerseliminated;
|
||||
level.targets[ "PlayersTeam" ] = ::gettargetplayersteam;
|
||||
level.targets[ "VictimsTeam" ] = ::gettargetplayersteam;
|
||||
level.targets[ "OtherTeam" ] = ::gettargetotherteam;
|
||||
level.targets[ "AttackersTeam" ] = ::gettargetotherteam;
|
||||
level.targets[ "PlayersLeftOnPlayersTeam" ] = ::gettargetplayersleftonplayersteam;
|
||||
level.targets[ "PlayersLeftOnOtherTeam" ] = ::gettargetplayersleftonotherteam;
|
||||
level.targets[ "PlayersLeftOnVictimsTeam" ] = ::gettargetplayersleftonplayersteam;
|
||||
level.targets[ "PlayersLeftOnAttackersTeam" ] = ::gettargetplayersleftonotherteam;
|
||||
level.targets[ "PlayersEliminatedOnPlayersTeam" ] = ::gettargetplayerseliminatedonplayersteam;
|
||||
level.targets[ "PlayersEliminatedOnOtherTeam" ] = ::gettargetplayerseliminatedonotherteam;
|
||||
level.targets[ "PlayersEliminatedOnVictimsTeam" ] = ::gettargetplayerseliminatedonplayersteam;
|
||||
level.targets[ "PlayersEliminatedOnAttackersTeam" ] = ::gettargetplayerseliminatedonotherteam;
|
||||
level.targets[ "AssistingPlayers" ] = ::getassistingplayers;
|
||||
}
|
||||
|
||||
equals( param1, param2 )
|
||||
{
|
||||
return param1 == param2;
|
||||
}
|
||||
|
||||
notequals( param1, param2 )
|
||||
{
|
||||
return param1 != param2;
|
||||
}
|
||||
|
||||
lessthan( param1, param2 )
|
||||
{
|
||||
return param1 < param2;
|
||||
}
|
||||
|
||||
lessthanequals( param1, param2 )
|
||||
{
|
||||
return param1 <= param2;
|
||||
}
|
||||
|
||||
greaterthan( param1, param2 )
|
||||
{
|
||||
return param1 > param2;
|
||||
}
|
||||
|
||||
greaterthanequals( param1, param2 )
|
||||
{
|
||||
return param1 >= param2;
|
||||
}
|
||||
|
||||
inplace( param1, param2 )
|
||||
{
|
||||
if ( param1 == param2 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( param2 == "top3" && param1 == "first" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
playersleft( rule )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
roundsplayed( rule )
|
||||
{
|
||||
return game[ "roundsplayed" ] + 1;
|
||||
}
|
||||
|
||||
hitby( rule )
|
||||
{
|
||||
meansofdeath = rule.target[ "MeansOfDeath" ];
|
||||
weapon = rule.target[ "Weapon" ];
|
||||
if ( !isDefined( meansofdeath ) || !isDefined( weapon ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "knife_ballistic_mp":
|
||||
return "knife";
|
||||
}
|
||||
switch( meansofdeath )
|
||||
{
|
||||
case "MOD_PISTOL_BULLET":
|
||||
case "MOD_RIFLE_BULLET":
|
||||
return "bullet";
|
||||
case "MOD_BAYONET":
|
||||
case "MOD_MELEE":
|
||||
return "knife";
|
||||
case "MOD_HEAD_SHOT":
|
||||
return "headshot";
|
||||
case "MOD_EXPLOSIVE":
|
||||
case "MOD_GRENADE":
|
||||
case "MOD_GRENADE_SPLASH":
|
||||
case "MOD_PROJECTILE":
|
||||
case "MOD_PROJECTILE_SPLASH":
|
||||
return "explosive";
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
getplayersclass( player )
|
||||
{
|
||||
return player.pers[ "class" ];
|
||||
}
|
||||
|
||||
playersclass( rule )
|
||||
{
|
||||
player = rule.target[ "Player" ];
|
||||
return getplayersclass( player );
|
||||
}
|
||||
|
||||
attackersclass( rule )
|
||||
{
|
||||
player = rule.target[ "Attacker" ];
|
||||
return getplayersclass( player );
|
||||
}
|
||||
|
||||
getplayersplace( player )
|
||||
{
|
||||
maps/mp/gametypes_zm/_globallogic::updateplacement();
|
||||
if ( !isDefined( level.placement[ "all" ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
place = 0;
|
||||
while ( place < level.placement[ "all" ].size )
|
||||
{
|
||||
if ( level.placement[ "all" ][ place ] == player )
|
||||
{
|
||||
place++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
place++;
|
||||
}
|
||||
}
|
||||
place++;
|
||||
if ( place == 1 )
|
||||
{
|
||||
return "first";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( place <= 3 )
|
||||
{
|
||||
return "top3";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( place == level.placement[ "all" ].size )
|
||||
{
|
||||
return "last";
|
||||
}
|
||||
}
|
||||
}
|
||||
return "middle";
|
||||
}
|
||||
|
||||
playersplace( rule )
|
||||
{
|
||||
player = rule.target[ "Player" ];
|
||||
return getplayersplace( player );
|
||||
}
|
||||
|
||||
attackersplace( rule )
|
||||
{
|
||||
player = rule.target[ "Attacker" ];
|
||||
return getplayersplace( player );
|
||||
}
|
||||
|
||||
gettargeteveryone( rule )
|
||||
{
|
||||
return level.players;
|
||||
}
|
||||
|
||||
gettargetplayersleft( rule )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
gettargetplayerseliminated( rule )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
gettargetplayersteam( rule )
|
||||
{
|
||||
player = rule.target[ "Player" ];
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
return [];
|
||||
}
|
||||
return getplayersonteam( level.players, player.pers[ "team" ] );
|
||||
}
|
||||
|
||||
gettargetotherteam( rule )
|
||||
{
|
||||
player = rule.target[ "Player" ];
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
return [];
|
||||
}
|
||||
return getplayersonteam( level.players, getotherteam( player.pers[ "team" ] ) );
|
||||
}
|
||||
|
||||
gettargetplayersleftonplayersteam( rule )
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
gettargetplayersleftonotherteam( rule )
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
gettargetplayerseliminatedonplayersteam( rule )
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
gettargetplayerseliminatedonotherteam( rule )
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
getassistingplayers( rule )
|
||||
{
|
||||
assisters = [];
|
||||
attacker = rule.target[ "Attacker" ];
|
||||
if ( !isDefined( rule.target[ "Assisters" ] ) || !isDefined( attacker ) )
|
||||
{
|
||||
return assisters;
|
||||
}
|
||||
j = 0;
|
||||
while ( j < rule.target[ "Assisters" ].size )
|
||||
{
|
||||
player = rule.target[ "Assisters" ][ j ];
|
||||
if ( !isDefined( player ) )
|
||||
{
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
else if ( player == attacker )
|
||||
{
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
assisters[ assisters.size ] = player;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
return assisters;
|
||||
}
|
||||
|
||||
executegametypeeventrule( rule )
|
||||
{
|
||||
if ( !aregametypeeventruleconditionalsmet( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( level.gametypeactions[ rule.action ] ) )
|
||||
{
|
||||
/#
|
||||
error( "GAMETYPE VARIANTS - unknown action: " + rule.action + "!" );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
thread internalexecuterule( rule );
|
||||
}
|
||||
|
||||
internalexecuterule( rule )
|
||||
{
|
||||
}
|
||||
|
||||
aregametypeeventruleconditionalsmet( rule )
|
||||
{
|
||||
if ( !isDefined( rule.conditionals ) || rule.conditionals.size == 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
combinedresult = 1;
|
||||
if ( rule.conditionaleval == "OR" )
|
||||
{
|
||||
combinedresult = 0;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < rule.conditionals.size )
|
||||
{
|
||||
conditionalresult = evaluategametypeeventruleconditional( rule, rule.conditionals[ i ] );
|
||||
switch( rule.conditionaleval )
|
||||
{
|
||||
case "AND":
|
||||
if ( combinedresult )
|
||||
{
|
||||
combinedresult = conditionalresult;
|
||||
}
|
||||
break;
|
||||
case "OR":
|
||||
if ( !combinedresult )
|
||||
{
|
||||
combinedresult = conditionalresult;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ( rule.conditionaleval == "AND" && !combinedresult )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( rule.conditionaleval == "OR" && combinedresult )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return combinedresult;
|
||||
}
|
||||
|
||||
evaluategametypeeventruleconditional( rule, conditional )
|
||||
{
|
||||
if ( isDefined( conditional.lhs ) || !isDefined( conditional.operand ) && !isDefined( conditional.rhs ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( level.conditionallefthandside[ conditional.lhs ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
lhsvalue = [[ level.conditionallefthandside[ conditional.lhs ] ]]( rule );
|
||||
if ( !isDefined( lhsvalue ) || !isDefined( level.conditionals[ conditional.operand ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return [[ level.conditionals[ conditional.operand ] ]]( lhsvalue, conditional.rhs );
|
||||
}
|
||||
|
||||
getplayersonteam( players, team )
|
||||
{
|
||||
playersonteam = [];
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
if ( player.pers[ "team" ] == team )
|
||||
{
|
||||
playersonteam[ playersonteam.size ] = player;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return playersonteam;
|
||||
}
|
||||
|
||||
gettargetsforgametypeeventrule( rule )
|
||||
{
|
||||
targets = [];
|
||||
if ( !isDefined( rule.targetname ) )
|
||||
{
|
||||
return targets;
|
||||
}
|
||||
if ( isDefined( rule.target[ rule.targetname ] ) )
|
||||
{
|
||||
targets[ targets.size ] = rule.target[ rule.targetname ];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.targets[ rule.targetname ] ) )
|
||||
{
|
||||
targets = [[ level.targets[ rule.targetname ] ]]( rule );
|
||||
}
|
||||
}
|
||||
return targets;
|
||||
}
|
||||
|
||||
doesrulehavevalidparam( rule )
|
||||
{
|
||||
if ( isDefined( rule.params ) && isarray( rule.params ) )
|
||||
{
|
||||
return rule.params.size > 0;
|
||||
}
|
||||
}
|
||||
|
||||
sortplayersbylivesdescending( players )
|
||||
{
|
||||
if ( !isDefined( players ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
swapped = 1;
|
||||
n = players.size;
|
||||
while ( swapped )
|
||||
{
|
||||
swapped = 0;
|
||||
i = 0;
|
||||
while ( i < ( n - 1 ) )
|
||||
{
|
||||
if ( players[ i ].pers[ "lives" ] < players[ i + 1 ].pers[ "lives" ] )
|
||||
{
|
||||
temp = players[ i ];
|
||||
players[ i ] = players[ i + 1 ];
|
||||
players[ i + 1 ] = temp;
|
||||
swapped = 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
n--;
|
||||
|
||||
}
|
||||
return players;
|
||||
}
|
||||
|
||||
giveammo( players, amount )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
wait 0,5;
|
||||
player = players[ i ];
|
||||
currentweapon = player getcurrentweapon();
|
||||
clipammo = player getweaponammoclip( currentweapon );
|
||||
player setweaponammoclip( currentweapon, clipammo + amount );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dogiveammo( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
giveammo( targets, rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
doremoveammo( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
giveammo( targets, 0 - rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
doplaysound( rule )
|
||||
{
|
||||
if ( doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
playsoundonplayers( rule.params[ 0 ] );
|
||||
}
|
||||
}
|
||||
|
||||
doenableuav( rule )
|
||||
{
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
targets[ targetindex ].pers[ "hasRadar" ] = 1;
|
||||
targets[ targetindex ].hasspyplane = 1;
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
givescore( players, amount )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
score = maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( player );
|
||||
maps/mp/gametypes_zm/_globallogic_score::_setplayerscore( player, score + amount );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dogivescore( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
givescore( targets, rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
doremovescore( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
givescore( targets, 0 - rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
dosetheader( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
target = targets[ targetindex ];
|
||||
displaytextonhudelem( target, target.customgametypeheader, rule.params[ 0 ], rule.params[ 1 ], "gv_header", rule.params[ 2 ] );
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
dosetsubheader( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
target = targets[ targetindex ];
|
||||
displaytextonhudelem( target, target.customgametypesubheader, rule.params[ 0 ], rule.params[ 1 ], "gv_subheader", rule.params[ 2 ] );
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
displaytextonhudelem( target, texthudelem, text, secondstodisplay, notifyname, valueparam )
|
||||
{
|
||||
texthudelem.alpha = 1;
|
||||
if ( isDefined( valueparam ) )
|
||||
{
|
||||
texthudelem settext( text, valueparam );
|
||||
}
|
||||
else
|
||||
{
|
||||
texthudelem settext( text );
|
||||
}
|
||||
if ( !isDefined( secondstodisplay ) || secondstodisplay <= 0 )
|
||||
{
|
||||
target.doingnotify = 0;
|
||||
target notify( notifyname );
|
||||
return;
|
||||
}
|
||||
target thread fadecustomgametypehudelem( texthudelem, secondstodisplay, notifyname );
|
||||
}
|
||||
|
||||
fadecustomgametypehudelem( hudelem, seconds, notifyname )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self notify( notifyname );
|
||||
self endon( notifyname );
|
||||
if ( seconds <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.doingnotify = 1;
|
||||
wait seconds;
|
||||
while ( hudelem.alpha > 0 )
|
||||
{
|
||||
hudelem.alpha -= 0,05;
|
||||
if ( hudelem.alpha < 0 )
|
||||
{
|
||||
hudelem.alpha = 0;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
self.doingnotify = 0;
|
||||
}
|
||||
|
||||
dodisplaymessage( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
thread announcemessage( targets[ targetindex ], rule.params[ 0 ], 2 );
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
announcemessage( target, messagetext, time )
|
||||
{
|
||||
target endon( "disconnect" );
|
||||
clientannouncement( target, messagetext, int( time * 1000 ) );
|
||||
if ( time == 0 )
|
||||
{
|
||||
time = getDvarFloat( #"E8C4FC20" );
|
||||
}
|
||||
target.doingnotify = 1;
|
||||
wait time;
|
||||
target.doingnotify = 0;
|
||||
}
|
||||
|
||||
givehealth( players, amount )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
player.health += amount;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dogivehealth( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
givehealth( gettargetsforgametypeeventrule( rule ), rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
doremovehealth( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
givehealth( gettargetsforgametypeeventrule( rule ), 0 - rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
dosethealthregen( rule )
|
||||
{
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
player = targets[ targetindex ];
|
||||
player.regenrate = rule.params[ 0 ];
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
dochangeclass( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dochangeteam( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
team = rule.params[ 0 ];
|
||||
teamkeys = getarraykeys( level.teams );
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
target = targets[ targetindex ];
|
||||
if ( target.pers[ "team" ] == team )
|
||||
{
|
||||
targetindex++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( team == "toggle" )
|
||||
{
|
||||
team = teamkeys[ randomint( teamkeys.size ) ];
|
||||
teamindex = 0;
|
||||
while ( teamindex < teamkeys.size )
|
||||
{
|
||||
if ( target.pers[ "team" ] == teamkeys[ teamindex ] )
|
||||
{
|
||||
team = teamkeys[ ( teamindex + 1 ) % teamkeys.size ];
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
teamindex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
target.pers[ "team" ] = team;
|
||||
target.team = team;
|
||||
if ( level.teambased )
|
||||
{
|
||||
target.sessionteam = team;
|
||||
}
|
||||
else
|
||||
{
|
||||
target.sessionteam = "none";
|
||||
}
|
||||
target notify( "joined_team" );
|
||||
level notify( "joined_team" );
|
||||
}
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
displayperk( player, imagename )
|
||||
{
|
||||
index = 0;
|
||||
if ( isDefined( player.perkicon ) )
|
||||
{
|
||||
index = -1;
|
||||
i = 0;
|
||||
while ( i < player.perkicon.size )
|
||||
{
|
||||
if ( player.perkicon[ i ].alpha == 0 )
|
||||
{
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( index == -1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
player maps/mp/gametypes_zm/_hud_util::showperk( index, imagename, 10 );
|
||||
player thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutaftertime( 3 );
|
||||
player thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutondeath();
|
||||
}
|
||||
|
||||
setorunsetperk( players, perks, shouldset )
|
||||
{
|
||||
if ( level.perksenabled == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( perks.size < 2 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
hasperkalready = 0;
|
||||
imagename = perks[ perks.size - 1 ];
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
perkindex = 0;
|
||||
while ( perkindex < ( perks.size - 1 ) )
|
||||
{
|
||||
perk = perks[ perkindex ];
|
||||
if ( player hasperk( perk ) )
|
||||
{
|
||||
hasperkalready = 1;
|
||||
}
|
||||
if ( shouldset )
|
||||
{
|
||||
player setperk( perk );
|
||||
perkindex++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
player unsetperk( perk );
|
||||
}
|
||||
perkindex++;
|
||||
}
|
||||
if ( shouldset && !hasperkalready && getDvarInt( "scr_showperksonspawn" ) == 1 )
|
||||
{
|
||||
displayperk( player, imagename );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dogiveperk( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
setorunsetperk( gettargetsforgametypeeventrule( rule ), rule.params, 1 );
|
||||
}
|
||||
|
||||
doremoveperk( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
setorunsetperk( gettargetsforgametypeeventrule( rule ), rule.params, 0 );
|
||||
}
|
||||
|
||||
giveorremovekillstreak( rule, shouldgive )
|
||||
{
|
||||
}
|
||||
|
||||
dogivekillstreak( rule )
|
||||
{
|
||||
giveorremovekillstreak( rule, 1 );
|
||||
}
|
||||
|
||||
doremovekillstreak( rule )
|
||||
{
|
||||
giveorremovekillstreak( rule, 0 );
|
||||
}
|
||||
|
||||
givelives( players, amount )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
player.pers[ "lives" ] += amount;
|
||||
if ( player.pers[ "lives" ] < 0 )
|
||||
{
|
||||
player.pers[ "lives" ] = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dogivelives( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
givelives( gettargetsforgametypeeventrule( rule ), rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
doremovelives( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
givelives( gettargetsforgametypeeventrule( rule ), 0 - rule.params[ 0 ] );
|
||||
}
|
||||
|
||||
giveorremoveinvuln( players, shouldgiveinvuln )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dogiveinvuln( rule )
|
||||
{
|
||||
giveorremoveinvuln( gettargetsforgametypeeventrule( rule ), 1 );
|
||||
}
|
||||
|
||||
doremoveinvuln( rule )
|
||||
{
|
||||
giveorremoveinvuln( gettargetsforgametypeeventrule( rule ), 0 );
|
||||
}
|
||||
|
||||
dosetdamagemodifier( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = gettargetsforgametypeeventrule( rule );
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
player.damagemodifier = rule.params[ 0 ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
doscalemovespeed( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
movespeedscale = rule.params[ 0 ];
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
target = targets[ targetindex ];
|
||||
target.movementspeedmodifier = movespeedscale * target getmovespeedscale();
|
||||
if ( target.movementspeedmodifier < 0,1 )
|
||||
{
|
||||
target.movementspeedmodifier = 0,1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( target.movementspeedmodifier > 4 )
|
||||
{
|
||||
target.movementspeedmodifier = 4;
|
||||
}
|
||||
}
|
||||
target setmovespeedscale( target.movementspeedmodifier );
|
||||
targetindex++;
|
||||
}
|
||||
}
|
||||
|
||||
doshowonradar( rule )
|
||||
{
|
||||
if ( !doesrulehavevalidparam( rule ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
targets = gettargetsforgametypeeventrule( rule );
|
||||
targetindex = 0;
|
||||
while ( targetindex < targets.size )
|
||||
{
|
||||
if ( rule.params[ 0 ] == "enable" )
|
||||
{
|
||||
targets[ targetindex ] setperk( "specialty_showonradar" );
|
||||
targetindex++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
targets[ targetindex ] unsetperk( "specialty_showonradar" );
|
||||
}
|
||||
targetindex++;
|
||||
}
|
||||
}
|
276
Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc
Normal file
276
Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc
Normal file
@ -0,0 +1,276 @@
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect() //checked matches cerberus output
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
|
||||
playerhealthregen() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "end_healthregen" );
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
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;
|
||||
}
|
||||
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 ) //checked partially changed to match cerberus output //continues in for loops bad see github for more info
|
||||
{
|
||||
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 ) //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;
|
||||
}
|
||||
else if ( level.healthregendisabled && getTime() > player.breathingstoptime )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
player notify( "snd_breathing_hurt" );
|
||||
wait 0.784;
|
||||
wait ( 0.1 + randomfloat( 0.8 ) );
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
571
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc
Normal file
571
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc
Normal file
@ -0,0 +1,571 @@
|
||||
#include maps/mp/gametypes_zm/_hud;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
debug_script_structs() //dev call did not check
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( isDefined( level.struct ) )
|
||||
{
|
||||
println( "*** Num structs " + level.struct.size );
|
||||
println( "" );
|
||||
i = 0;
|
||||
while ( i < level.struct.size )
|
||||
{
|
||||
struct = level.struct[ i ];
|
||||
if ( isDefined( struct.targetname ) )
|
||||
{
|
||||
println( "---" + i + " : " + struct.targetname );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "---" + i + " : " + "NONE" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else println( "*** No structs defined." );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
|
||||
updatetimerpausedness() //checked matches cerberus output
|
||||
{
|
||||
shouldbestopped = isDefined( level.hostmigrationtimer );
|
||||
if ( !level.timerstopped && shouldbestopped )
|
||||
{
|
||||
level.timerstopped = 1;
|
||||
level.timerpausetime = getTime();
|
||||
}
|
||||
else if ( level.timerstopped && !shouldbestopped )
|
||||
{
|
||||
level.timerstopped = 0;
|
||||
level.discardtime += getTime() - level.timerpausetime;
|
||||
}
|
||||
}
|
||||
|
||||
callback_hostmigrationsave() //checked matches cerberus output
|
||||
{
|
||||
}
|
||||
|
||||
callback_prehostmigrationsave() //checked matches cerberus output
|
||||
{
|
||||
undo_link_changes();
|
||||
disablezombies(1);
|
||||
if ( is_true( level._hm_should_pause_spawning ) )
|
||||
{
|
||||
flag_set( "spawn_zombies" );
|
||||
}
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
level.players[ i ] enableinvulnerability();
|
||||
}
|
||||
}
|
||||
|
||||
pausetimer() //checked matches cerberus output
|
||||
{
|
||||
level.migrationtimerpausetime = getTime();
|
||||
}
|
||||
|
||||
resumetimer() //checked matches cerberus output
|
||||
{
|
||||
level.discardtime += getTime() - level.migrationtimerpausetime;
|
||||
}
|
||||
|
||||
locktimer() //checked matches cerberus output
|
||||
{
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
for ( ;; )
|
||||
{
|
||||
currtime = getTime();
|
||||
wait 0.05;
|
||||
if ( !level.timerstopped && isDefined( level.discardtime ) )
|
||||
{
|
||||
level.discardtime += getTime() - currtime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
callback_hostmigration() //checked changed to match cerberus output
|
||||
{
|
||||
redo_link_changes();
|
||||
setslowmotion( 1, 1, 0 );
|
||||
makedvarserverinfo( "ui_guncycle", 0 );
|
||||
level.hostmigrationreturnedplayercount = 0;
|
||||
if ( level.gameended )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println("Migration starting at time " + GetTime() + ", but game has ended, so no countdown.");
|
||||
#/
|
||||
*/
|
||||
return;
|
||||
}
|
||||
sethostmigrationstatus(1);
|
||||
level notify( "host_migration_begin" );
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
if ( isdefined( level.hostmigration_link_entity_callback ) )
|
||||
{
|
||||
if ( !isdefined( level.players[ i ]._host_migration_link_entity ) )
|
||||
{
|
||||
level.players[i]._host_migration_link_entity = level.players[ i ] [[ level.hostmigration_link_entity_callback ]]();
|
||||
}
|
||||
}
|
||||
level.players[ i ] thread hostmigrationtimerthink();
|
||||
}
|
||||
if ( isdefined( level.hostmigration_ai_link_entity_callback ) )
|
||||
{
|
||||
zombies = getaiarray(level.zombie_team);
|
||||
if ( isdefined( zombies ) && zombies.size > 0 )
|
||||
{
|
||||
foreach(zombie in zombies)
|
||||
{
|
||||
if ( !isdefined( zombie._host_migration_link_entity ) )
|
||||
{
|
||||
zombie._host_migration_link_entity = zombie [[ level.hostmigration_ai_link_entity_callback ]]();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( level.inprematchperiod )
|
||||
{
|
||||
level waittill("prematch_over");
|
||||
}
|
||||
/*
|
||||
/#
|
||||
println( "Migration starting at time " + GetTime() );
|
||||
#/
|
||||
*/
|
||||
level.hostmigrationtimer = 1;
|
||||
thread locktimer();
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
if ( isdefined( zombies ) && zombies.size > 0 )
|
||||
{
|
||||
foreach ( zombie in zombies )
|
||||
{
|
||||
if ( isdefined(zombie._host_migration_link_entity ) )
|
||||
{
|
||||
ent = spawn( "script_origin", zombie.origin );
|
||||
ent.angles = zombie.angles;
|
||||
zombie linkto(ent);
|
||||
ent linkto( zombie._host_migration_link_entity, "tag_origin", zombie._host_migration_link_entity worldtolocalcoords( ent.origin ), ent.angles + zombie._host_migration_link_entity.angles );
|
||||
zombie._host_migration_link_helper = ent;
|
||||
zombie linkto( zombie._host_migration_link_helper );
|
||||
}
|
||||
}
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
level._hm_should_pause_spawning = flag( "spawn_zombies" );
|
||||
if ( level._hm_should_pause_spawning )
|
||||
{
|
||||
flag_clear( "spawn_zombies" );
|
||||
}
|
||||
hostmigrationwait();
|
||||
foreach ( player in level.players )
|
||||
{
|
||||
player thread post_migration_become_vulnerable();
|
||||
}
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
if ( isdefined( zombies ) && zombies.size > 0 )
|
||||
{
|
||||
foreach ( zombie in zombies )
|
||||
{
|
||||
if ( isdefined(zombie._host_migration_link_entity ) )
|
||||
{
|
||||
zombie unlink();
|
||||
zombie._host_migration_link_helper delete();
|
||||
zombie._host_migration_link_helper = undefined;
|
||||
zombie._host_migration_link_entity = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
enablezombies(1);
|
||||
if ( level._hm_should_pause_spawning )
|
||||
{
|
||||
flag_set( "spawn_zombies" );
|
||||
}
|
||||
level.hostmigrationtimer = undefined;
|
||||
level._hm_should_pause_spawning = undefined;
|
||||
sethostmigrationstatus( 0 );
|
||||
/*
|
||||
/#
|
||||
println("Migration finished at time " + GetTime());
|
||||
#/
|
||||
*/
|
||||
level notify( "host_migration_end" );
|
||||
}
|
||||
|
||||
post_migration_become_vulnerable() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
wait( 3 );
|
||||
self disableinvulnerability();
|
||||
}
|
||||
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer ) //checked matches cerberus output
|
||||
{
|
||||
waittillframeend;
|
||||
visionsetnaked( "mpIntro", 0 );
|
||||
level endon( "match_start_timer_beginning" );
|
||||
while ( counttime > 0 && !level.gameended )
|
||||
{
|
||||
matchstarttimer thread maps/mp/gametypes_zm/_hud::fontpulse( level );
|
||||
wait ( matchstarttimer.inframes * 0.05 );
|
||||
matchstarttimer setvalue( counttime );
|
||||
counttime--;
|
||||
wait ( 1 - ( matchstarttimer.inframes * 0.05 ) );
|
||||
}
|
||||
}
|
||||
|
||||
matchstarttimerconsole( type, duration ) //checked matches cerberus output
|
||||
{
|
||||
level notify( "match_start_timer_beginning" );
|
||||
wait 0,05;
|
||||
matchstarttext = createserverfontstring( "objective", 1.5 );
|
||||
matchstarttext setpoint( "CENTER", "CENTER", 0, -40 );
|
||||
matchstarttext.sort = 1001;
|
||||
matchstarttext settext( game[ "strings" ][ "waiting_for_teams" ] );
|
||||
matchstarttext.foreground = 0;
|
||||
matchstarttext.hidewheninmenu = 1;
|
||||
matchstarttext settext( game[ "strings" ][ type ] );
|
||||
matchstarttimer = createserverfontstring( "objective", 2.2 );
|
||||
matchstarttimer setpoint( "CENTER", "CENTER", 0, 0 );
|
||||
matchstarttimer.sort = 1001;
|
||||
matchstarttimer.color = ( 1, 1, 0 );
|
||||
matchstarttimer.foreground = 0;
|
||||
matchstarttimer.hidewheninmenu = 1;
|
||||
matchstarttimer maps/mp/gametypes_zm/_hud::fontpulseinit();
|
||||
counttime = int( duration );
|
||||
if ( counttime >= 2 )
|
||||
{
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer );
|
||||
}
|
||||
matchstarttimer destroyelem();
|
||||
matchstarttext destroyelem();
|
||||
}
|
||||
|
||||
hostmigrationwait() //checked matches cerberus output may need to check order of operations
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
if ( level.hostmigrationreturnedplayercount < ( ( level.players.size * 2 ) / 3 ) )
|
||||
{
|
||||
thread matchstarttimerconsole( "waiting_for_teams", 20 );
|
||||
hostmigrationwaitforplayers();
|
||||
}
|
||||
level notify( "host_migration_countdown_begin" );
|
||||
thread matchstarttimerconsole( "match_starting_in", 5 );
|
||||
wait 5;
|
||||
}
|
||||
|
||||
hostmigrationwaitforplayers() //checked matches cerberus output
|
||||
{
|
||||
level endon( "hostmigration_enoughplayers" );
|
||||
wait 15;
|
||||
}
|
||||
|
||||
hostmigrationtimerthink_internal() //checked matches cerberus output
|
||||
{
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
self.hostmigrationcontrolsfrozen = 0;
|
||||
while ( !isalive( self ) )
|
||||
{
|
||||
self waittill( "spawned" );
|
||||
}
|
||||
if ( isdefined( self._host_migration_link_entity ) )
|
||||
{
|
||||
ent = spawn( "script_origin", self.origin );
|
||||
ent.angles = self.angles;
|
||||
self linkto( ent );
|
||||
ent linkto( self._host_migration_link_entity, "tag_origin", self._host_migration_link_entity worldtolocalcoords( ent.origin ), ent.angles + self._host_migration_link_entity.angles );
|
||||
self._host_migration_link_helper = ent;
|
||||
/*
|
||||
/#
|
||||
println( "Linking player to ent " + self._host_migration_link_entity.targetname );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
self.hostmigrationcontrolsfrozen = 1;
|
||||
self freezecontrols( 1 );
|
||||
level waittill( "host_migration_end" );
|
||||
}
|
||||
|
||||
hostmigrationtimerthink() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
level endon( "host_migration_begin" );
|
||||
hostmigrationtimerthink_internal();
|
||||
if ( self.hostmigrationcontrolsfrozen )
|
||||
{
|
||||
self freezecontrols( 0 );
|
||||
self.hostmigrationcontrolsfrozen = 0;
|
||||
/*
|
||||
/#
|
||||
println(" Host migration unfreeze controls");
|
||||
#/
|
||||
*/
|
||||
}
|
||||
if ( isdefined( self._host_migration_link_entity ) )
|
||||
{
|
||||
self unlink();
|
||||
self._host_migration_link_helper delete();
|
||||
self._host_migration_link_helper = undefined;
|
||||
if ( isdefined( self._host_migration_link_entity._post_host_migration_thread ) )
|
||||
{
|
||||
self thread [[ self._host_migration_link_entity._post_host_migration_thread ]]( self._host_migration_link_entity );
|
||||
}
|
||||
self._host_migration_link_entity = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
waittillhostmigrationdone() //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
starttime = getTime();
|
||||
level waittill( "host_migration_end" );
|
||||
return getTime() - starttime;
|
||||
}
|
||||
|
||||
waittillhostmigrationstarts( duration ) //checked matches cerberus output
|
||||
{
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
wait duration;
|
||||
}
|
||||
|
||||
waitlongdurationwithhostmigrationpause( duration ) //checked matches cerberus output may need to check order of operations
|
||||
{
|
||||
if ( duration == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( duration > 0 );
|
||||
#/
|
||||
*/
|
||||
starttime = getTime();
|
||||
endtime = getTime() + ( duration * 1000 );
|
||||
while ( getTime() < endtime )
|
||||
{
|
||||
waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 );
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
timepassed = waittillhostmigrationdone();
|
||||
endtime += timepassed;
|
||||
}
|
||||
}
|
||||
/*
|
||||
/#
|
||||
if ( getTime() != endtime )
|
||||
{
|
||||
println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO endtime = " + endtime );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
waittillhostmigrationdone();
|
||||
return getTime() - starttime;
|
||||
}
|
||||
|
||||
waitlongdurationwithhostmigrationpauseemp( duration ) //checked matches cerberus output may need to check order of operations
|
||||
{
|
||||
if ( duration == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( duration > 0 );
|
||||
#/
|
||||
*/
|
||||
starttime = getTime();
|
||||
empendtime = getTime() + ( duration * 1000 );
|
||||
level.empendtime = empendtime;
|
||||
while ( getTime() < empendtime )
|
||||
{
|
||||
waittillhostmigrationstarts( ( empendtime - getTime() ) / 1000 );
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
timepassed = waittillhostmigrationdone();
|
||||
if ( isDefined( empendtime ) )
|
||||
{
|
||||
empendtime += timepassed;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
/#
|
||||
if ( getTime() != empendtime )
|
||||
{
|
||||
println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO empendtime = " + empendtime );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
waittillhostmigrationdone();
|
||||
level.empendtime = undefined;
|
||||
return getTime() - starttime;
|
||||
}
|
||||
|
||||
waitlongdurationwithgameendtimeupdate( duration ) //checked matches cerberus output may need to check order of operations
|
||||
{
|
||||
if ( duration == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( duration > 0 );
|
||||
#/
|
||||
*/
|
||||
starttime = getTime();
|
||||
endtime = getTime() + ( duration * 1000 );
|
||||
while ( getTime() < endtime )
|
||||
{
|
||||
waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 );
|
||||
while ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
endtime += 1000;
|
||||
setgameendtime( int( endtime ) );
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
/*
|
||||
/#
|
||||
if ( getTime() != endtime )
|
||||
{
|
||||
println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO endtime = " + endtime );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
while ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
endtime += 1000;
|
||||
setgameendtime( int( endtime ) );
|
||||
wait 1;
|
||||
}
|
||||
return getTime() - starttime;
|
||||
}
|
||||
|
||||
find_alternate_player_place( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) //checked partially changed to match cerberus output //continue in for loop bad see github for more info
|
||||
{
|
||||
found_node = undefined;
|
||||
a_nodes = getnodesinradiussorted( v_origin, max_radius, min_radius, max_height, "pathnodes" );
|
||||
if ( isdefined( a_nodes) && a_nodes.size > 0 )
|
||||
{
|
||||
a_player_volumes = getentarray( "player_volume", "script_noteworthy" );
|
||||
index = a_nodes.size - 1;
|
||||
i = index;
|
||||
while ( i >= 0; )
|
||||
{
|
||||
n_node = a_nodes[i];
|
||||
if ( ignore_targetted_nodes == 1 )
|
||||
{
|
||||
if ( isdefined( n_node.target ) )
|
||||
{
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( !positionwouldtelefrag( n_node.origin ) )
|
||||
{
|
||||
if ( maps/mp/zombies/_zm_utility::check_point_in_enabled_zone( n_node.origin, 1, a_player_volumes ) )
|
||||
{
|
||||
v_start = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] + 30 );
|
||||
v_end = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] - 30 );
|
||||
trace = bullettrace( v_start, v_end, 0, undefined );
|
||||
if ( trace["fraction"] < 1 )
|
||||
{
|
||||
override_abort = 0;
|
||||
if ( isdefined( level._chugabud_reject_node_override_func ) )
|
||||
{
|
||||
override_abort = [[ level._chugabud_reject_node_override_func ]]( v_origin, n_node );
|
||||
}
|
||||
if ( !override_abort )
|
||||
{
|
||||
found_node = n_node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i--;
|
||||
}
|
||||
}
|
||||
return found_node;
|
||||
}
|
||||
|
||||
hostmigration_put_player_in_better_place() //checked changed to match cerberus output
|
||||
{
|
||||
spawnpoint = undefined;
|
||||
spawnpoint = find_alternate_player_place( self.origin, 50, 150, 64, 1 );
|
||||
if ( !isdefined(spawnpoint ) )
|
||||
{
|
||||
spawnpoint = find_alternate_player_place( self.origin, 150, 400, 64, 1 );
|
||||
}
|
||||
if ( !isdefined(spawnpoint ) )
|
||||
{
|
||||
spawnpoint = find_alternate_player_place( self.origin, 50, 400, 256, 0 );
|
||||
}
|
||||
if ( !isdefined( spawnpoint ) )
|
||||
{
|
||||
spawnpoint = maps/mp/zombies/_zm::check_for_valid_spawn_near_team( self, 1 );
|
||||
}
|
||||
if ( !isdefined( spawnpoint ) )
|
||||
{
|
||||
match_string = "";
|
||||
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;
|
||||
spawnpoints = [];
|
||||
structs = getstructarray( "initial_spawn", "script_noteworthy" );
|
||||
if ( isdefined( structs ) )
|
||||
{
|
||||
foreach ( struct in structs )
|
||||
{
|
||||
if ( isdefined( struct.script_string ) )
|
||||
{
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
i = 0;
|
||||
while ( i < tokens.size )
|
||||
{
|
||||
if ( token == match_string )
|
||||
{
|
||||
spawnpoints[ spawnpoints.size ] = struct;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( !isdefined(spawnpoints) || spawnpoints.size == 0 )
|
||||
{
|
||||
spawnpoints = getstructarray( "initial_spawn_points", "targetname" );
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isdefined( spawnpoints ), "Could not find initial spawn points!" );
|
||||
#/
|
||||
*/
|
||||
spawnpoint = maps/mp/zombies/_zm::getfreespawnpoint( spawnpoints, self );
|
||||
}
|
||||
if ( isdefined( spawnpoint ) )
|
||||
{
|
||||
self setorigin( spawnpoint.origin );
|
||||
}
|
||||
}
|
||||
|
161
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc
Normal file
161
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc
Normal file
@ -0,0 +1,161 @@
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
fontpulseinit() //checked matches cerberus output
|
||||
{
|
||||
self.basefontscale = self.fontscale;
|
||||
self.maxfontscale = self.fontscale * 2;
|
||||
self.inframes = 1.5;
|
||||
self.outframes = 3;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername ) //checked matches cerberus output
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
1359
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_message.gsc
Normal file
1359
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_message.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1152
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_util.gsc
Normal file
1152
Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_util.gsc
Normal file
File diff suppressed because it is too large
Load Diff
167
Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc
Normal file
167
Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc
Normal file
@ -0,0 +1,167 @@
|
||||
#include maps/mp/gametypes_zm/_rank;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread 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 ( 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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
185
Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc
Normal file
185
Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc
Normal file
@ -0,0 +1,185 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect( handler ) //checked matches 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 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect( handler ) //checked changed to match 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 );
|
||||
}
|
||||
|
||||
onjoinedteam( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread handleplayer( handler );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled( handler ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
handleplayer( handler ) //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 ]]();
|
||||
}
|
||||
|
||||
unhandleplayer( handler, unsetready, disconnected ) //checked matches cerberus output
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
25
Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc
Normal file
25
Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
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" ] );
|
||||
}
|
||||
}
|
202
Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc
Normal file
202
Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
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 ) //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();
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
65
Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc
Normal file
65
Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc
Normal file
@ -0,0 +1,65 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
precacheshellshock( "frag_grenade_mp" );
|
||||
precacheshellshock( "damage_mp" );
|
||||
precacherumble( "artillery_rumble" );
|
||||
precacherumble( "grenade_rumble" );
|
||||
}
|
||||
|
||||
shellshockondamage( cause, damage )
|
||||
{
|
||||
if ( cause != "MOD_EXPLOSIVE" && cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" && cause == "MOD_PROJECTILE_SPLASH" )
|
||||
{
|
||||
time = 0;
|
||||
if ( damage >= 90 )
|
||||
{
|
||||
time = 4;
|
||||
}
|
||||
else if ( damage >= 50 )
|
||||
{
|
||||
time = 3;
|
||||
}
|
||||
else if ( damage >= 25 )
|
||||
{
|
||||
time = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( damage > 10 )
|
||||
{
|
||||
time = 2;
|
||||
}
|
||||
}
|
||||
if ( time )
|
||||
{
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
self shellshock( "frag_grenade_mp", 0.5 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
endondeath()
|
||||
{
|
||||
self waittill( "death" );
|
||||
waittillframeend;
|
||||
self notify( "end_explode" );
|
||||
}
|
||||
|
||||
endontimer( timer )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
wait timer;
|
||||
self notify( "end_on_timer" );
|
||||
}
|
||||
|
||||
rcbomb_earthquake( position )
|
||||
{
|
||||
playrumbleonposition( "grenade_rumble", position );
|
||||
earthquake( 0.5, 0.5, self.origin, 512 );
|
||||
}
|
||||
|
1073
Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc
Normal file
1073
Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2496
Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc
Normal file
2496
Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc
Normal file
File diff suppressed because it is too large
Load Diff
251
Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc
Normal file
251
Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc
Normal file
@ -0,0 +1,251 @@
|
||||
|
||||
init() //checked changed to match cerberus output
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
level.spectateoverride[ team ] = spawnstruct();
|
||||
}
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self setspectatepermissions();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators() //checked matches cerberus output
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
}
|
||||
|
||||
updatespectatesettings() //checked changed to match cerberus output
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
level.players[ index ] setspectatepermissions();
|
||||
}
|
||||
}
|
||||
|
||||
getsplitscreenteam() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info
|
||||
{
|
||||
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() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info
|
||||
{
|
||||
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 ) //checked changed to match cerberus output
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
self allowspectateteam( 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 )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
self allowspectateteam( team, allow );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
401
Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc
Normal file
401
Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc
Normal file
@ -0,0 +1,401 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
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;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( dvar ) );
|
||||
#/
|
||||
*/
|
||||
value = getDvarInt( dvar );
|
||||
return value;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( value ) );
|
||||
#/
|
||||
*/
|
||||
return value;
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( value ) );
|
||||
#/
|
||||
*/
|
||||
return value;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( value ) );
|
||||
#/
|
||||
*/
|
||||
return 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 );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
setclienttweakable( category, name ) //checked matches cerberus output
|
||||
{
|
||||
level.clienttweakables[ level.clienttweakables.size ] = name;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
updateserverdvar( dvar, value ) //checked matches cerberus output
|
||||
{
|
||||
makedvarserverinfo( dvar, value );
|
||||
}
|
||||
|
124
Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc
Normal file
124
Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc
Normal file
@ -0,0 +1,124 @@
|
||||
#include maps/mp/killstreaks/_killstreaks;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
isgrenadelauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
if ( getsubstr( weapon, 0, 3 ) == "gl_" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "china_lake_mp":
|
||||
case "xm25_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isdumbrocketlauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
switch( weapon )
|
||||
{
|
||||
case "m220_tow_mp":
|
||||
case "rpg_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isguidedrocketlauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
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 ) //checked matches cerberus output
|
||||
{
|
||||
if ( isdumbrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isguidedrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
islauncherweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
if ( isrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isgrenadelauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isreducedteamkillweapon( weapon )
|
||||
{
|
||||
switch( weapon )
|
||||
{
|
||||
case "planemortar_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ishackweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ispistol( weapon ) //checked changed at own discretion
|
||||
{
|
||||
if ( isDefined( level.side_arm_array[ weapon ] ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isflashorstunweapon( weapon ) //checked matches cerberus output
|
||||
{
|
||||
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 ) //checked changed at own discretion
|
||||
{
|
||||
if ( ( meansofdeath == "MOD_GAS" || meansofdeath == "MOD_GRENADE_SPLASH" ) && isflashorstunweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
2435
Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc
Normal file
2435
Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1950
Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc
Normal file
1950
Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1997
Zombie Core/patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc
Normal file
1997
Zombie Core/patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc
Normal file
File diff suppressed because it is too large
Load Diff
30
Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc
Normal file
30
Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc
Normal file
@ -0,0 +1,30 @@
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
|
||||
main()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::main();
|
||||
level.onprecachegametype = ::onprecachegametype;
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level._game_module_custom_spawn_init_func = ::custom_spawn_init_func;
|
||||
level._game_module_stat_update_func = ::survival_classic_custom_stat_update;
|
||||
maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zclassic" );
|
||||
}
|
||||
|
||||
onprecachegametype()
|
||||
{
|
||||
level.playersuicideallowed = 1;
|
||||
level.canplayersuicide = ::canplayersuicide;
|
||||
level.suicide_weapon = "death_self_zm";
|
||||
precacheitem( "death_self_zm" );
|
||||
maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zclassic" );
|
||||
}
|
||||
|
||||
onstartgametype()
|
||||
{
|
||||
maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zclassic", ::zclassic_main );
|
||||
}
|
510
Zombie Core/patch_zm/maps/mp/zombies/_load.gsc
Normal file
510
Zombie Core/patch_zm/maps/mp/zombies/_load.gsc
Normal file
@ -0,0 +1,510 @@
|
||||
//checked includes changed to match cerberus output
|
||||
#include maps/mp/gametypes_zm/_spawnlogic;
|
||||
#include maps/mp/animscripts/traverse/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/zombies/_load;
|
||||
#include maps/mp/_demo;
|
||||
#include maps/mp/_global_fx;
|
||||
#include maps/mp/_createfx;
|
||||
#include maps/mp/_art;
|
||||
#include maps/mp/_serverfaceanim_mp;
|
||||
#include maps/mp/_fxanim;
|
||||
#include maps/mp/_music;
|
||||
#include maps/mp/_busing;
|
||||
#include maps/mp/_audio;
|
||||
#include maps/mp/_interactive_objects;
|
||||
#include maps/mp/_script_gen;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main( bscriptgened, bcsvgened, bsgenabled ) //checked partially changed to match cerberus output
|
||||
{
|
||||
if ( !isDefined( level.script_gen_dump_reasons ) )
|
||||
{
|
||||
level.script_gen_dump_reasons = [];
|
||||
}
|
||||
if ( !isDefined( bsgenabled ) )
|
||||
{
|
||||
level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "First run";
|
||||
}
|
||||
if ( !isDefined( bcsvgened ) )
|
||||
{
|
||||
bcsvgened = 0;
|
||||
}
|
||||
level.bcsvgened = bcsvgened;
|
||||
if ( !isDefined( bscriptgened ) )
|
||||
{
|
||||
bscriptgened = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
bscriptgened = 1;
|
||||
}
|
||||
level.bscriptgened = bscriptgened;
|
||||
level._loadstarted = 1;
|
||||
struct_class_init();
|
||||
if ( getDvar( "cg_usingClientScripts" ) != "" ) //changed at own discretion
|
||||
{
|
||||
level.clientscripts = getDvar( "cg_usingClientScripts" );
|
||||
}
|
||||
|
||||
level._client_exploders = [];
|
||||
level._client_exploder_ids = [];
|
||||
if ( !isDefined( level.flag ) )
|
||||
{
|
||||
level.flag = [];
|
||||
level.flags_lock = [];
|
||||
}
|
||||
if ( !isDefined( level.timeofday ) )
|
||||
{
|
||||
level.timeofday = "day";
|
||||
}
|
||||
flag_init( "scriptgen_done" );
|
||||
level.script_gen_dump_reasons = [];
|
||||
if ( !isDefined( level.script_gen_dump ) )
|
||||
{
|
||||
level.script_gen_dump = [];
|
||||
level.script_gen_dump_reasons[ 0 ] = "First run";
|
||||
}
|
||||
if ( !isDefined( level.script_gen_dump2 ) )
|
||||
{
|
||||
level.script_gen_dump2 = [];
|
||||
}
|
||||
if ( isDefined( level.createfxent ) && isDefined( level.script ) )
|
||||
{
|
||||
script_gen_dump_addline( "maps\\mp\\createfx\\" + level.script + "_fx::main();", level.script + "_fx" );
|
||||
}
|
||||
if ( isDefined( level.script_gen_dump_preload ) )
|
||||
{
|
||||
for ( i = 0; i < level.script_gen_dump_preload.size; i++ )
|
||||
{
|
||||
script_gen_dump_addline( level.script_gen_dump_preload[ i ].string, level.script_gen_dump_preload[ i ].signature );
|
||||
}
|
||||
}
|
||||
if ( getDvar( "scr_RequiredMapAspectratio" ) == "" )
|
||||
{
|
||||
setdvar( "scr_RequiredMapAspectratio", "1" );
|
||||
}
|
||||
setdvar( "r_waterFogTest", 0 );
|
||||
precacherumble( "reload_small" );
|
||||
precacherumble( "reload_medium" );
|
||||
precacherumble( "reload_large" );
|
||||
precacherumble( "reload_clipin" );
|
||||
precacherumble( "reload_clipout" );
|
||||
precacherumble( "reload_rechamber" );
|
||||
precacherumble( "pullout_small" );
|
||||
precacherumble( "buzz_high" );
|
||||
precacherumble( "riotshield_impact" );
|
||||
registerclientsys( "levelNotify" );
|
||||
level.aitriggerspawnflags = getaitriggerflags();
|
||||
level.vehicletriggerspawnflags = getvehicletriggerflags();
|
||||
level.physicstracemaskphysics = 1;
|
||||
level.physicstracemaskvehicle = 2;
|
||||
level.physicstracemaskwater = 4;
|
||||
level.physicstracemaskclip = 8;
|
||||
level.physicstracecontentsvehicleclip = 16;
|
||||
if ( getDvar( "createfx" ) != "" )
|
||||
{
|
||||
level.createfx_enabled = getDvar( "createfx" );
|
||||
}
|
||||
level thread start_intro_screen_zm();
|
||||
thread maps/mp/_interactive_objects::init();
|
||||
maps/mp/_audio::init();
|
||||
thread maps/mp/_busing::businit();
|
||||
thread maps/mp/_music::music_init();
|
||||
thread maps/mp/_fxanim::init();
|
||||
thread maps/mp/_serverfaceanim_mp::init();
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
setinitialplayersconnected();
|
||||
}
|
||||
visionsetnight( "default_night" );
|
||||
setup_traversals();
|
||||
maps/mp/_art::main();
|
||||
setupexploders();
|
||||
parse_structs();
|
||||
thread footsteps();
|
||||
/*
|
||||
/#
|
||||
level thread level_notify_listener();
|
||||
level thread client_notify_listener();
|
||||
#/
|
||||
*/
|
||||
thread maps/mp/_createfx::fx_init();
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
calculate_map_center();
|
||||
maps/mp/_createfx::createfx();
|
||||
}
|
||||
if ( getDvar( "r_reflectionProbeGenerate" ) == "1" )
|
||||
{
|
||||
maps/mp/_global_fx::main();
|
||||
level waittill( "eternity" );
|
||||
}
|
||||
thread maps/mp/_global_fx::main();
|
||||
maps/mp/_demo::init();
|
||||
for ( p = 0; p < 6; p++ )
|
||||
{
|
||||
switch( p )
|
||||
{
|
||||
case 0:
|
||||
triggertype = "trigger_multiple";
|
||||
break;
|
||||
case 1:
|
||||
triggertype = "trigger_once";
|
||||
break;
|
||||
case 2:
|
||||
triggertype = "trigger_use";
|
||||
break;
|
||||
case 3:
|
||||
triggertype = "trigger_radius";
|
||||
break;
|
||||
case 4:
|
||||
triggertype = "trigger_lookat";
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
/#
|
||||
assert( p == 5 );
|
||||
#/
|
||||
*/
|
||||
triggertype = "trigger_damage";
|
||||
break;
|
||||
}
|
||||
triggers = getentarray( triggertype, "classname" );
|
||||
for ( i = 0; i < triggers.size; i++ )
|
||||
{
|
||||
if ( isDefined( triggers[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
triggers[ i ].script_exploder = triggers[ i ].script_prefab_exploder;
|
||||
}
|
||||
if ( isDefined( triggers[ i ].script_exploder ) )
|
||||
{
|
||||
level thread maps/mp/zombies/_load::exploder_load( triggers[ i ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
level_notify_listener() //checked matches cerberus output
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
val = getDvar( "level_notify" );
|
||||
if ( val != "" )
|
||||
{
|
||||
level notify( val );
|
||||
setdvar( "level_notify", "" );
|
||||
}
|
||||
wait 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
client_notify_listener() //checked matches cerberus output
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
val = getDvar( "client_notify" );
|
||||
if ( val != "" )
|
||||
{
|
||||
clientnotify( val );
|
||||
setdvar( "client_notify", "" );
|
||||
}
|
||||
wait 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
footsteps() //checked matches cerberus output
|
||||
{
|
||||
if ( is_true( level.fx_exclude_footsteps ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "asphalt", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "brick", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "carpet", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "cloth", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "concrete", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "dirt", loadfx( "bio/player/fx_footstep_sand" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "foliage", loadfx( "bio/player/fx_footstep_sand" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "gravel", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "grass", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "metal", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "mud", loadfx( "bio/player/fx_footstep_mud" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "paper", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "plaster", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "rock", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "sand", loadfx( "bio/player/fx_footstep_sand" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "water", loadfx( "bio/player/fx_footstep_water" ) );
|
||||
maps/mp/animscripts/utility::setfootstepeffect( "wood", loadfx( "bio/player/fx_footstep_dust" ) );
|
||||
}
|
||||
|
||||
parse_structs() //checked matches cerberus output
|
||||
{
|
||||
for ( i = 0; i < level.struct.size; i++ )
|
||||
{
|
||||
if ( isDefined( level.struct[ i ].targetname ) )
|
||||
{
|
||||
if ( level.struct[ i ].targetname == "flak_fire_fx" )
|
||||
{
|
||||
level._effect[ "flak20_fire_fx" ] = loadfx( "weapon/tracer/fx_tracer_flak_single_noExp" );
|
||||
level._effect[ "flak38_fire_fx" ] = loadfx( "weapon/tracer/fx_tracer_quad_20mm_Flak38_noExp" );
|
||||
level._effect[ "flak_cloudflash_night" ] = loadfx( "weapon/flak/fx_flak_cloudflash_night" );
|
||||
level._effect[ "flak_burst_single" ] = loadfx( "weapon/flak/fx_flak_single_day_dist" );
|
||||
}
|
||||
if ( level.struct[ i ].targetname == "fake_fire_fx" )
|
||||
{
|
||||
level._effect[ "distant_muzzleflash" ] = loadfx( "weapon/muzzleflashes/heavy" );
|
||||
}
|
||||
if ( level.struct[ i ].targetname == "spotlight_fx" )
|
||||
{
|
||||
level._effect[ "spotlight_beam" ] = loadfx( "env/light/fx_ray_spotlight_md" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exploder_load( trigger ) //checked matches cerberus output
|
||||
{
|
||||
level endon( "killexplodertridgers" + trigger.script_exploder );
|
||||
trigger waittill( "trigger" );
|
||||
if ( isDefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance )
|
||||
{
|
||||
if ( isDefined( trigger.script_delay ) )
|
||||
{
|
||||
wait trigger.script_delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 4;
|
||||
}
|
||||
level thread exploder_load( trigger );
|
||||
return;
|
||||
}
|
||||
maps/mp/_utility::exploder( trigger.script_exploder );
|
||||
level notify( "killexplodertridgers" + trigger.script_exploder );
|
||||
}
|
||||
|
||||
setupexploders() //checked partially changed to match cerberus output
|
||||
{
|
||||
ents = getentarray( "script_brushmodel", "classname" );
|
||||
smodels = getentarray( "script_model", "classname" );
|
||||
for ( i = 0; i < smodels.size; i++ )
|
||||
{
|
||||
ents[ ents.size ] = smodels[ i ];
|
||||
}
|
||||
i = 0;
|
||||
while ( i < ents.size )
|
||||
{
|
||||
if ( isDefined( ents[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
ents[ i ].script_exploder = ents[ i ].script_prefab_exploder;
|
||||
}
|
||||
if ( isDefined( ents[ i ].script_exploder ) )
|
||||
{
|
||||
if ( ents[ i ].model == "fx" || !isDefined( ents[ i ].targetname ) && ents[ i ].targetname != "exploderchunk" )
|
||||
{
|
||||
ents[ i ] hide();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploder" )
|
||||
{
|
||||
ents[ i ] hide();
|
||||
ents[ i ] notsolid();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploderchunk" )
|
||||
{
|
||||
ents[ i ] hide();
|
||||
ents[ i ] notsolid();
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
script_exploders = [];
|
||||
potentialexploders = getentarray( "script_brushmodel", "classname" );
|
||||
for ( i = 0; i < potentialexploders.size; i++ )
|
||||
{
|
||||
if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder;
|
||||
}
|
||||
if ( isDefined( potentialexploders[ i ].script_exploder ) )
|
||||
{
|
||||
script_exploders[ script_exploders.size ] = potentialexploders[ i ];
|
||||
}
|
||||
}
|
||||
potentialexploders = getentarray( "script_model", "classname" );
|
||||
for ( i = 0; i < potentialexploders.size; i++ )
|
||||
{
|
||||
if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder;
|
||||
}
|
||||
if ( isDefined( potentialexploders[ i ].script_exploder ) )
|
||||
{
|
||||
script_exploders[ script_exploders.size ] = potentialexploders[ i ];
|
||||
}
|
||||
}
|
||||
potentialexploders = getentarray( "item_health", "classname" );
|
||||
for ( i = 0; i < potentialexploders.size; i++ )
|
||||
{
|
||||
if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) )
|
||||
{
|
||||
potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder;
|
||||
}
|
||||
if ( isDefined( potentialexploders[ i ].script_exploder ) )
|
||||
{
|
||||
script_exploders[ script_exploders.size ] = potentialexploders[ i ];
|
||||
}
|
||||
}
|
||||
if ( !isDefined( level.createfxent ) )
|
||||
{
|
||||
level.createfxent = [];
|
||||
}
|
||||
acceptabletargetnames = [];
|
||||
acceptabletargetnames[ "exploderchunk visible" ] = 1;
|
||||
acceptabletargetnames[ "exploderchunk" ] = 1;
|
||||
acceptabletargetnames[ "exploder" ] = 1;
|
||||
for ( i = 0; i < script_exploders.size; i++ )
|
||||
{
|
||||
exploder = script_exploders[ i ];
|
||||
ent = createexploder( exploder.script_fxid );
|
||||
ent.v = [];
|
||||
ent.v[ "origin" ] = exploder.origin;
|
||||
ent.v[ "angles" ] = exploder.angles;
|
||||
ent.v[ "delay" ] = exploder.script_delay;
|
||||
ent.v[ "firefx" ] = exploder.script_firefx;
|
||||
ent.v[ "firefxdelay" ] = exploder.script_firefxdelay;
|
||||
ent.v[ "firefxsound" ] = exploder.script_firefxsound;
|
||||
ent.v[ "firefxtimeout" ] = exploder.script_firefxtimeout;
|
||||
ent.v[ "earthquake" ] = exploder.script_earthquake;
|
||||
ent.v[ "damage" ] = exploder.script_damage;
|
||||
ent.v[ "damage_radius" ] = exploder.script_radius;
|
||||
ent.v[ "soundalias" ] = exploder.script_soundalias;
|
||||
ent.v[ "repeat" ] = exploder.script_repeat;
|
||||
ent.v[ "delay_min" ] = exploder.script_delay_min;
|
||||
ent.v[ "delay_max" ] = exploder.script_delay_max;
|
||||
ent.v[ "target" ] = exploder.target;
|
||||
ent.v[ "ender" ] = exploder.script_ender;
|
||||
ent.v[ "type" ] = "exploder";
|
||||
if ( !isDefined( exploder.script_fxid ) )
|
||||
{
|
||||
ent.v[ "fxid" ] = "No FX";
|
||||
}
|
||||
else
|
||||
{
|
||||
ent.v[ "fxid" ] = exploder.script_fxid;
|
||||
}
|
||||
ent.v[ "exploder" ] = exploder.script_exploder;
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" );
|
||||
#/
|
||||
*/
|
||||
if ( !isDefined( ent.v[ "delay" ] ) )
|
||||
{
|
||||
ent.v[ "delay" ] = 0;
|
||||
}
|
||||
if ( isDefined( exploder.target ) )
|
||||
{
|
||||
org = getent( ent.v[ "target" ], "targetname" ).origin;
|
||||
ent.v[ "angles" ] = vectorToAngles( org - ent.v[ "origin" ] );
|
||||
}
|
||||
if ( exploder.classname == "script_brushmodel" || isDefined( exploder.model ) )
|
||||
{
|
||||
ent.model = exploder;
|
||||
ent.model.disconnect_paths = exploder.script_disconnectpaths;
|
||||
}
|
||||
if ( isDefined( exploder.targetname ) && isDefined( acceptabletargetnames[ exploder.targetname ] ) )
|
||||
{
|
||||
ent.v[ "exploder_type" ] = exploder.targetname;
|
||||
}
|
||||
else
|
||||
{
|
||||
ent.v[ "exploder_type" ] = "normal";
|
||||
}
|
||||
ent maps/mp/_createfx::post_entity_creation_function();
|
||||
}
|
||||
level.createfxexploders = [];
|
||||
i = 0;
|
||||
while ( i < level.createfxent.size )
|
||||
{
|
||||
ent = level.createfxent[ i ];
|
||||
if ( ent.v[ "type" ] != "exploder" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
ent.v[ "exploder_id" ] = getexploderid( ent );
|
||||
if ( !isDefined( level.createfxexploders[ ent.v[ "exploder" ] ] ) )
|
||||
{
|
||||
level.createfxexploders[ ent.v[ "exploder" ] ] = [];
|
||||
}
|
||||
level.createfxexploders[ ent.v[ "exploder" ] ][ level.createfxexploders[ ent.v[ "exploder" ] ].size ] = ent;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
setup_traversals() //checked changed to match cerberus output
|
||||
{
|
||||
potential_traverse_nodes = getallnodes();
|
||||
for ( i = 0; i < potential_traverse_nodes.size; i++ )
|
||||
{
|
||||
node = potential_traverse_nodes[ i ];
|
||||
if ( node.type == "Begin" )
|
||||
{
|
||||
node maps/mp/animscripts/traverse/shared::init_traverse();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
calculate_map_center() //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( level.mapcenter ) )
|
||||
{
|
||||
level.nodesmins = ( 0, 0, 0 );
|
||||
level.nodesmaxs = ( 0, 0, 0 );
|
||||
level.mapcenter = maps/mp/gametypes_zm/_spawnlogic::findboxcenter( level.nodesmins, level.nodesmaxs );
|
||||
/*
|
||||
/#
|
||||
println( "map center: ", level.mapcenter );
|
||||
#/
|
||||
*/
|
||||
setmapcenter( level.mapcenter );
|
||||
}
|
||||
}
|
||||
|
||||
start_intro_screen_zm() //checked changed to match cerberus output
|
||||
{
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( level.introscreen ) )
|
||||
{
|
||||
level.introscreen = newhudelem();
|
||||
level.introscreen.x = 0;
|
||||
level.introscreen.y = 0;
|
||||
level.introscreen.horzalign = "fullscreen";
|
||||
level.introscreen.vertalign = "fullscreen";
|
||||
level.introscreen.foreground = 0;
|
||||
level.introscreen setshader( "black", 640, 480 );
|
||||
level.introscreen.immunetodemogamehudsettings = 1;
|
||||
level.introscreen.immunetodemofreecamera = 1;
|
||||
wait 0.05;
|
||||
}
|
||||
level.introscreen.alpha = 1;
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ] freezecontrols( 1 );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
5619
Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc
Normal file
5619
Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc
Normal file
File diff suppressed because it is too large
Load Diff
546
Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_basic.gsc
Normal file
546
Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_basic.gsc
Normal file
@ -0,0 +1,546 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_run;
|
||||
#include maps/mp/zombies/_zm_ai_basic;
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
find_flesh() //checked partially changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
level endon( "intermission" );
|
||||
self endon( "stop_find_flesh" );
|
||||
if ( level.intermission )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.ai_state = "find_flesh";
|
||||
self.helitarget = 1;
|
||||
self.ignoreme = 0;
|
||||
self.nododgemove = 1;
|
||||
self.ignore_player = [];
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "find flesh -> start" );
|
||||
self.goalradius = 32;
|
||||
if ( isDefined( self.custom_goalradius_override ) )
|
||||
{
|
||||
self.goalradius = self.custom_goalradius_override;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
zombie_poi = undefined;
|
||||
if ( isDefined( level.zombietheaterteleporterseeklogicfunc ) )
|
||||
{
|
||||
self [[ level.zombietheaterteleporterseeklogicfunc ]]();
|
||||
}
|
||||
if ( isDefined( level._poi_override ) )
|
||||
{
|
||||
zombie_poi = self [[ level._poi_override ]]();
|
||||
}
|
||||
if ( !isDefined( zombie_poi ) )
|
||||
{
|
||||
zombie_poi = self get_zombie_point_of_interest( self.origin );
|
||||
}
|
||||
players = get_players();
|
||||
if ( !isDefined( self.ignore_player ) || players.size == 1 )
|
||||
{
|
||||
self.ignore_player = [];
|
||||
}
|
||||
if ( !isDefined( level._should_skip_ignore_player_logic ) || !( [[ level._should_skip_ignore_player_logic ]]() ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self.ignore_player.size )
|
||||
{
|
||||
if ( isDefined( self.ignore_player[ i ] ) && isDefined( self.ignore_player[ i ].ignore_counter ) && self.ignore_player[ i ].ignore_counter > 3 )
|
||||
{
|
||||
self.ignore_player[ i ].ignore_counter = 0;
|
||||
self.ignore_player = arrayremovevalue( self.ignore_player, self.ignore_player[ i ] );
|
||||
if ( !isDefined( self.ignore_player ) )
|
||||
{
|
||||
self.ignore_player = [];
|
||||
}
|
||||
i = 0;
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
player = get_closest_valid_player( self.origin, self.ignore_player );
|
||||
if ( !isDefined( player ) && !isDefined( zombie_poi ) )
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "find flesh -> can't find player, continue" );
|
||||
if ( isDefined( self.ignore_player ) )
|
||||
{
|
||||
if ( isDefined( level._should_skip_ignore_player_logic ) && [[ level._should_skip_ignore_player_logic ]]() )
|
||||
{
|
||||
wait 1;
|
||||
continue;
|
||||
}
|
||||
self.ignore_player = [];
|
||||
}
|
||||
wait 1;
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( level.check_for_alternate_poi ) || ![[ level.check_for_alternate_poi ]]() )
|
||||
{
|
||||
self.enemyoverride = zombie_poi;
|
||||
self.favoriteenemy = player;
|
||||
}
|
||||
self thread zombie_pathing();
|
||||
if ( players.size > 1 )
|
||||
{
|
||||
for ( i = 0; i < self.ignore_player.size; i++ )
|
||||
{
|
||||
if ( isDefined( self.ignore_player[ i ] ) )
|
||||
{
|
||||
if ( !isDefined( self.ignore_player[ i ].ignore_counter ) )
|
||||
{
|
||||
self.ignore_player[ i ].ignore_counter = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.ignore_player[ i ].ignore_counter += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self thread attractors_generated_listener();
|
||||
if ( isDefined( level._zombie_path_timer_override ) )
|
||||
{
|
||||
self.zombie_path_timer = [[ level._zombie_path_timer_override ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.zombie_path_timer = getTime() + ( randomfloatrange( 1, 3 ) * 1000 );
|
||||
}
|
||||
while ( getTime() < self.zombie_path_timer )
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
self notify( "path_timer_done" );
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "find flesh -> bottom of loop" );
|
||||
debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" );
|
||||
self notify( "zombie_acquire_enemy" );
|
||||
}
|
||||
}
|
||||
|
||||
init_inert_zombies() //checked matches cerberus output
|
||||
{
|
||||
level init_inert_substates();
|
||||
}
|
||||
|
||||
init_inert_substates() //checked matches cerberus output
|
||||
{
|
||||
level.inert_substates = [];
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert1";
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert2";
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert3";
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert4";
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert5";
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert6";
|
||||
level.inert_substates[ level.inert_substates.size ] = "inert7";
|
||||
level.inert_substates = array_randomize( level.inert_substates );
|
||||
level.inert_substate_index = 0;
|
||||
level.inert_trans_walk = [];
|
||||
level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_1";
|
||||
level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_2";
|
||||
level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_3";
|
||||
level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_4";
|
||||
level.inert_trans_run = [];
|
||||
level.inert_trans_run[ level.inert_trans_run.size ] = "inert_2_run_1";
|
||||
level.inert_trans_run[ level.inert_trans_run.size ] = "inert_2_run_2";
|
||||
level.inert_trans_sprint = [];
|
||||
level.inert_trans_sprint[ level.inert_trans_sprint.size ] = "inert_2_sprint_1";
|
||||
level.inert_trans_sprint[ level.inert_trans_sprint.size ] = "inert_2_sprint_2";
|
||||
level.inert_crawl_substates = [];
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert1";
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert2";
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert3";
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert4";
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert5";
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert6";
|
||||
level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert7";
|
||||
level.inert_crawl_trans_walk = [];
|
||||
level.inert_crawl_trans_walk[ level.inert_crawl_trans_walk.size ] = "inert_2_walk_1";
|
||||
level.inert_crawl_trans_run = [];
|
||||
level.inert_crawl_trans_run[ level.inert_crawl_trans_run.size ] = "inert_2_run_1";
|
||||
level.inert_crawl_trans_run[ level.inert_crawl_trans_run.size ] = "inert_2_run_2";
|
||||
level.inert_crawl_trans_sprint = [];
|
||||
level.inert_crawl_trans_sprint[ level.inert_crawl_trans_sprint.size ] = "inert_2_sprint_1";
|
||||
level.inert_crawl_trans_sprint[ level.inert_crawl_trans_sprint.size ] = "inert_2_sprint_2";
|
||||
level.inert_crawl_substates = array_randomize( level.inert_crawl_substates );
|
||||
level.inert_crawl_substate_index = 0;
|
||||
}
|
||||
|
||||
get_inert_substate() //checked matches cerberus output
|
||||
{
|
||||
substate = level.inert_substates[ level.inert_substate_index ];
|
||||
level.inert_substate_index++;
|
||||
if ( level.inert_substate_index >= level.inert_substates.size )
|
||||
{
|
||||
level.inert_substates = array_randomize( level.inert_substates );
|
||||
level.inert_substate_index = 0;
|
||||
}
|
||||
return substate;
|
||||
}
|
||||
|
||||
get_inert_crawl_substate() //checked matches cerberus output
|
||||
{
|
||||
substate = level.inert_crawl_substates[ level.inert_crawl_substate_index ];
|
||||
level.inert_crawl_substate_index++;
|
||||
if ( level.inert_crawl_substate_index >= level.inert_crawl_substates.size )
|
||||
{
|
||||
level.inert_crawl_substates = array_randomize( level.inert_crawl_substates );
|
||||
level.inert_crawl_substate_index = 0;
|
||||
}
|
||||
return substate;
|
||||
}
|
||||
|
||||
start_inert( in_place ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( is_true( self.is_inert ) )
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "is_inert already set " + getTime() );
|
||||
return;
|
||||
}
|
||||
self.is_inert = 1;
|
||||
self notify( "start_inert" );
|
||||
self maps/mp/zombies/_zm_spawner::zombie_eye_glow_stop();
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "is_inert set " + getTime() );
|
||||
self playsound( "zmb_zombie_go_inert" );
|
||||
if ( is_true( self.barricade_enter ) )
|
||||
{
|
||||
while ( is_true( self.barricade_enter ) )
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
else if ( isDefined( self.ai_state ) && self.ai_state == "zombie_goto_entrance" )
|
||||
{
|
||||
self notify( "stop_zombie_goto_entrance" );
|
||||
self maps/mp/zombies/_zm_spawner::reset_attack_spot();
|
||||
}
|
||||
if ( is_true( self.completed_emerging_into_playable_area ) )
|
||||
{
|
||||
self notify( "stop_find_flesh" );
|
||||
self notify( "zombie_acquire_enemy" );
|
||||
}
|
||||
else
|
||||
{
|
||||
in_place = 1;
|
||||
}
|
||||
if ( is_true( self.in_the_ground ) )
|
||||
{
|
||||
self waittill( "risen", find_flesh_struct_string );
|
||||
if ( self maps/mp/zombies/_zm_spawner::should_skip_teardown( find_flesh_struct_string ) )
|
||||
{
|
||||
if ( !is_true( self.completed_emerging_into_playable_area ) )
|
||||
{
|
||||
self waittill( "completed_emerging_into_playable_area" );
|
||||
}
|
||||
self notify( "stop_find_flesh" );
|
||||
self notify( "zombie_acquire_enemy" );
|
||||
}
|
||||
}
|
||||
if ( is_true( self.is_traversing ) )
|
||||
{
|
||||
while ( self isinscriptedstate() )
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
if ( is_true( self.doing_equipment_attack ) )
|
||||
{
|
||||
self stopanimscripted();
|
||||
}
|
||||
if ( isDefined( self.inert_delay ) )
|
||||
{
|
||||
self [[ self.inert_delay ]]();
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "inert_delay done " + getTime() );
|
||||
}
|
||||
self inert_think( in_place );
|
||||
}
|
||||
|
||||
inert_think( in_place ) //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self.ignoreall = 1;
|
||||
self animmode( "normal" );
|
||||
if ( self.has_legs )
|
||||
{
|
||||
if ( is_true( in_place ) )
|
||||
{
|
||||
self setgoalpos( self.origin );
|
||||
if ( randomint( 100 ) > 50 )
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "inert 1 " + getTime() );
|
||||
self setanimstatefromasd( "zm_inert", "inert1" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "inert 2 " + getTime() );
|
||||
self setanimstatefromasd( "zm_inert", "inert2" );
|
||||
}
|
||||
self.in_place = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
substate = get_inert_substate();
|
||||
if ( isDefined( level.inert_substate_override ) )
|
||||
{
|
||||
substate = self [[ level.inert_substate_override ]]( substate );
|
||||
}
|
||||
self setanimstatefromasd( "zm_inert", substate );
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "zm_inert ASD " + getTime() );
|
||||
if ( substate == "inert3" && substate == "inert4" || substate == "inert5" && substate == "inert6" )
|
||||
{
|
||||
self thread inert_watch_goal();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.in_place = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self setanimstatefromasd( "zm_inert_crawl", get_inert_crawl_substate() );
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "zm_inert_crawl ASD " + getTime() );
|
||||
}
|
||||
self thread inert_wakeup();
|
||||
self waittill( "stop_zombie_inert" );
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "stop_zombie_inert " + getTime() );
|
||||
self playsound( "zmb_zombie_end_inert" );
|
||||
self inert_transition();
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "inert transition done" );
|
||||
if ( isDefined( self.ai_state ) && self.ai_state == "zombie_goto_entrance" )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_spawner::zombie_goto_entrance( self.first_node );
|
||||
}
|
||||
if ( isDefined( self.inert_wakeup_override ) )
|
||||
{
|
||||
self [[ self.inert_wakeup_override ]]();
|
||||
}
|
||||
else if ( is_true( self.completed_emerging_into_playable_area ) )
|
||||
{
|
||||
self.ignoreall = 0;
|
||||
if ( isDefined( level.ignore_find_flesh ) && !self [[ level.ignore_find_flesh ]]() )
|
||||
{
|
||||
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
|
||||
}
|
||||
}
|
||||
self.becoming_inert = undefined;
|
||||
self.is_inert = undefined;
|
||||
self.in_place = undefined;
|
||||
self maps/mp/animscripts/zm_run::needsupdate();
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "is_inert cleared " + getTime() );
|
||||
}
|
||||
|
||||
inert_watch_goal() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_zombie_inert" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "goal" );
|
||||
locs = array_randomize( level.enemy_dog_locations );
|
||||
i = 0;
|
||||
while ( i < locs.size )
|
||||
{
|
||||
dist_sq = distancesquared( self.origin, locs[ i ].origin );
|
||||
if ( dist_sq > 90000 )
|
||||
{
|
||||
self setgoalpos( locs[ i ].origin );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( locs.size > 0 )
|
||||
{
|
||||
self setgoalpos( locs[ 0 ].origin );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inert_wakeup() //checked changed at own discretion parity in behavior to cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_zombie_inert" );
|
||||
wait 0.1;
|
||||
self thread inert_damage();
|
||||
self thread inert_bump();
|
||||
while ( 1 )
|
||||
{
|
||||
current_time = getTime();
|
||||
players = get_players();
|
||||
foreach ( player in players )
|
||||
{
|
||||
dist_sq = distancesquared( self.origin, player.origin );
|
||||
if ( dist_sq < 4096 )
|
||||
{
|
||||
self stop_inert();
|
||||
return;
|
||||
}
|
||||
if ( dist_sq < 360000 )
|
||||
{
|
||||
if ( player issprinting() )
|
||||
{
|
||||
self stop_inert();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( dist_sq < 5760000 )
|
||||
{
|
||||
if ( ( current_time - player.lastfiretime ) < 100 )
|
||||
{
|
||||
self stop_inert();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
inert_bump() //checked changed at own discretion parity in behavior to cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_zombie_inert" );
|
||||
while ( 1 )
|
||||
{
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
i = 0;
|
||||
while ( i < zombies.size )
|
||||
{
|
||||
if ( zombies[ i ] == self )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( is_true( zombies[ i ].is_inert ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( is_true( zombies[ i ].becoming_inert ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
dist_sq = distancesquared( self.origin, zombies[ i ].origin );
|
||||
if ( dist_sq < 1296 )
|
||||
{
|
||||
self stop_inert();
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
inert_damage() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_zombie_inert" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
if ( weaponname == "emp_grenade_zm" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( inflictor ) )
|
||||
{
|
||||
if ( isDefined( inflictor._trap_type ) && inflictor._trap_type == "fire" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
self stop_inert();
|
||||
}
|
||||
|
||||
grenade_watcher( grenade ) //checked changed to match cerberus output
|
||||
{
|
||||
grenade waittill( "explode", grenade_origin );
|
||||
zombies = get_array_of_closest( grenade_origin, get_round_enemy_array(), undefined, undefined, 2400 );
|
||||
if ( !isDefined( zombies ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
foreach ( zombie in zombies )
|
||||
{
|
||||
zombie stop_inert();
|
||||
}
|
||||
}
|
||||
|
||||
stop_inert() //checked matches cerberus output
|
||||
{
|
||||
self notify( "stop_zombie_inert" );
|
||||
}
|
||||
|
||||
inert_transition() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_zombie_inert_transition" );
|
||||
trans_num = 4;
|
||||
trans_set = level.inert_trans_walk;
|
||||
animstate = "zm_inert_trans";
|
||||
if ( !self.has_legs )
|
||||
{
|
||||
trans_num = 1;
|
||||
trans_set = level.inert_crawl_trans_walk;
|
||||
animstate = "zm_inert_crawl_trans";
|
||||
}
|
||||
if ( self.zombie_move_speed == "run" )
|
||||
{
|
||||
if ( self.has_legs )
|
||||
{
|
||||
trans_set = level.inert_trans_run;
|
||||
}
|
||||
else
|
||||
{
|
||||
trans_set = level.inert_crawl_trans_run;
|
||||
}
|
||||
trans_num = 2;
|
||||
}
|
||||
else if ( self.zombie_move_speed == "sprint" )
|
||||
{
|
||||
if ( self.has_legs )
|
||||
{
|
||||
trans_set = level.inert_trans_sprint;
|
||||
}
|
||||
else
|
||||
{
|
||||
trans_set = level.inert_crawl_trans_sprint;
|
||||
}
|
||||
trans_num = 2;
|
||||
}
|
||||
self thread inert_eye_glow();
|
||||
self setanimstatefromasd( animstate, trans_set[ randomint( trans_num ) ] );
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "inert_trans_anim " + getTime() );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "inert_trans_anim" );
|
||||
}
|
||||
|
||||
inert_eye_glow() //checked changed to match cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "inert_trans_anim", note );
|
||||
if ( note == "end" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( note == "zmb_awaken" )
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_eye_glow();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
721
Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc
Normal file
721
Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc
Normal file
@ -0,0 +1,721 @@
|
||||
#include maps/mp/zombies/_zm_net;
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_score;
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/zombies/_zm_powerups;
|
||||
#include maps/mp/zombies/_zm_audio;
|
||||
#include maps/mp/zombies/_zm_spawner;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
{
|
||||
level.dogs_enabled = 1;
|
||||
level.dog_rounds_enabled = 0;
|
||||
level.dog_round_count = 1;
|
||||
level.dog_spawners = [];
|
||||
level.enemy_dog_spawns = [];
|
||||
level.enemy_dog_locations = [];
|
||||
flag_init( "dog_clips" );
|
||||
precacherumble( "explosion_generic" );
|
||||
precacheshellshock( "dog_bite" );
|
||||
if ( getDvar( "zombie_dog_animset" ) == "" )
|
||||
{
|
||||
setdvar( "zombie_dog_animset", "zombie" );
|
||||
}
|
||||
if ( getDvar( "scr_dog_health_walk_multiplier" ) == "" )
|
||||
{
|
||||
setdvar( "scr_dog_health_walk_multiplier", "4.0" );
|
||||
}
|
||||
if ( getDvar( "scr_dog_run_distance" ) == "" )
|
||||
{
|
||||
setdvar( "scr_dog_run_distance", "500" );
|
||||
}
|
||||
level.melee_range_sav = getDvar( "ai_meleeRange" );
|
||||
level.melee_width_sav = getDvar( "ai_meleeWidth" );
|
||||
level.melee_height_sav = getDvar( "ai_meleeHeight" );
|
||||
setdvar( "dog_MeleeDamage", "100" );
|
||||
set_zombie_var( "dog_fire_trail_percent", 50 );
|
||||
level._effect[ "lightning_dog_spawn" ] = loadfx( "maps/zombie/fx_zombie_dog_lightning_buildup" );
|
||||
level._effect[ "dog_eye_glow" ] = loadfx( "maps/zombie/fx_zombie_dog_eyes" );
|
||||
level._effect[ "dog_gib" ] = loadfx( "maps/zombie/fx_zombie_dog_explosion" );
|
||||
level._effect[ "dog_trail_fire" ] = loadfx( "maps/zombie/fx_zombie_dog_fire_trail" );
|
||||
level._effect[ "dog_trail_ash" ] = loadfx( "maps/zombie/fx_zombie_dog_ash_trail" );
|
||||
dog_spawner_init();
|
||||
level thread dog_clip_monitor();
|
||||
}
|
||||
|
||||
enable_dog_rounds() //checked matches cerberus output
|
||||
{
|
||||
level.dog_rounds_enabled = 1;
|
||||
if ( !isDefined( level.dog_round_track_override ) )
|
||||
{
|
||||
level.dog_round_track_override = ::dog_round_tracker;
|
||||
}
|
||||
level thread [[ level.dog_round_track_override ]]();
|
||||
}
|
||||
|
||||
dog_spawner_init() //checked does not match cerberus output did not change
|
||||
{
|
||||
level.dog_spawners = getentarray( "zombie_dog_spawner", "script_noteworthy" );
|
||||
later_dogs = getentarray( "later_round_dog_spawners", "script_noteworthy" );
|
||||
level.dog_spawners = arraycombine( level.dog_spawners, later_dogs, 1, 0 );
|
||||
if ( level.dog_spawners.size == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.dog_spawners.size )
|
||||
{
|
||||
if ( maps/mp/zombies/_zm_spawner::is_spawner_targeted_by_blocker( level.dog_spawners[ i ] ) )
|
||||
{
|
||||
level.dog_spawners[ i ].is_enabled = 0;
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.dog_spawners[ i ].is_enabled = 1;
|
||||
level.dog_spawners[ i ].script_forcespawn = 1;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
level.dog_health = 100;
|
||||
array_thread( level.dog_spawners, ::add_spawn_function, ::dog_init );
|
||||
level.enemy_dog_spawns = getentarray( "zombie_spawner_dog_init", "targetname" );
|
||||
}
|
||||
|
||||
dog_round_spawning() //checked partially matches cerberus output
|
||||
{
|
||||
level endon( "intermission" );
|
||||
level.dog_targets = getplayers();
|
||||
for ( i = 0; i < level.dog_targets.size; i++ )
|
||||
{
|
||||
level.dog_targets[ i ].hunted_by = 0;
|
||||
}
|
||||
if ( level.intermission )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.dog_intermission = 1;
|
||||
level thread dog_round_aftermath();
|
||||
players = get_players();
|
||||
array_thread( players, ::play_dog_round );
|
||||
wait 1;
|
||||
playsoundatposition( "vox_zmba_event_dogstart_0", ( 0, 0, 0 ) );
|
||||
wait 6;
|
||||
if ( level.dog_round_count < 3 )
|
||||
{
|
||||
max = players.size * 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
max = players.size * 8;
|
||||
}
|
||||
level.zombie_total = max;
|
||||
dog_health_increase();
|
||||
count = 0;
|
||||
while ( count < max )
|
||||
{
|
||||
num_player_valid = get_number_of_valid_players();
|
||||
while ( get_current_zombie_count() >= num_player_valid * 2 )
|
||||
{
|
||||
wait 2;
|
||||
num_player_valid = get_number_of_valid_players();
|
||||
}
|
||||
players = get_players();
|
||||
favorite_enemy = get_favorite_enemy();
|
||||
if ( isDefined( level.dog_spawn_func ) )
|
||||
{
|
||||
spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy );
|
||||
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||
if ( isDefined( ai ) )
|
||||
{
|
||||
ai.favoriteenemy = favorite_enemy;
|
||||
spawn_loc thread dog_spawn_fx( ai, spawn_loc );
|
||||
level.zombie_total--;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy );
|
||||
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||
if ( isDefined( ai ) )
|
||||
{
|
||||
ai.favoriteenemy = favorite_enemy;
|
||||
spawn_point thread dog_spawn_fx( ai, spawn_point );
|
||||
level.zombie_total--;
|
||||
count++;
|
||||
flag_set( "dog_clips" );
|
||||
}
|
||||
}
|
||||
waiting_for_next_dog_spawn( count, max );
|
||||
}
|
||||
}
|
||||
|
||||
waiting_for_next_dog_spawn( count, max ) //checked matches cerberus output
|
||||
{
|
||||
default_wait = 1.5;
|
||||
if ( level.dog_round_count == 1 )
|
||||
{
|
||||
default_wait = 3;
|
||||
}
|
||||
else if ( level.dog_round_count == 2 )
|
||||
{
|
||||
default_wait = 2.5;
|
||||
}
|
||||
else if ( level.dog_round_count == 3 )
|
||||
{
|
||||
default_wait = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
default_wait = 1.5;
|
||||
}
|
||||
default_wait = default_wait - count / max;
|
||||
wait default_wait;
|
||||
}
|
||||
|
||||
dog_round_aftermath() //checked matches cerberus output
|
||||
{
|
||||
level waittill( "last_dog_down" );
|
||||
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "dog_end" );
|
||||
power_up_origin = level.last_dog_origin;
|
||||
if ( isDefined( power_up_origin ) )
|
||||
{
|
||||
level thread maps/mp/zombies/_zm_powerups::specific_powerup_drop( "full_ammo", power_up_origin );
|
||||
}
|
||||
wait 2;
|
||||
clientnotify( "dog_stop" );
|
||||
wait 6;
|
||||
level.dog_intermission = 0;
|
||||
}
|
||||
|
||||
dog_spawn_fx( ai, ent ) //checked matches cerberus output
|
||||
{
|
||||
ai endon( "death" );
|
||||
ai setfreecameralockonallowed( 0 );
|
||||
playfx( level._effect[ "lightning_dog_spawn" ], ent.origin );
|
||||
playsoundatposition( "zmb_hellhound_prespawn", ent.origin );
|
||||
wait 1.5;
|
||||
playsoundatposition( "zmb_hellhound_bolt", ent.origin );
|
||||
earthquake( 0.5, 0.75, ent.origin, 1000 );
|
||||
playrumbleonposition( "explosion_generic", ent.origin );
|
||||
playsoundatposition( "zmb_hellhound_spawn", ent.origin );
|
||||
angle = vectorToAngles( ai.favoriteenemy.origin - ent.origin );
|
||||
angles = ( ai.angles[ 0 ], angle[ 1 ], ai.angles[ 2 ] );
|
||||
ai forceteleport( ent.origin, angles );
|
||||
ai zombie_setup_attack_properties_dog();
|
||||
ai stop_magic_bullet_shield();
|
||||
wait 0.1;
|
||||
ai show();
|
||||
ai setfreecameralockonallowed( 1 );
|
||||
ai.ignoreme = 0;
|
||||
ai notify( "visible" );
|
||||
}
|
||||
//unused code
|
||||
/*
|
||||
dog_spawn_sumpf_logic( dog_array, favorite_enemy ) //checked does not match cerberus output did not change
|
||||
{
|
||||
dog_array = array_randomize( dog_array );
|
||||
i = 0;
|
||||
while ( i < dog_array.size )
|
||||
{
|
||||
if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_array[ i ] )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( distancesquared( dog_array[ i ].origin, favorite_enemy.origin ) > 160000 && distancesquared( dog_array[ i ].origin, favorite_enemy.origin ) < 640000 )
|
||||
{
|
||||
if ( distancesquared( ( 0, 0, dog_array[ i ].origin[ 2 ] ), ( 0, 0, favorite_enemy.origin[ 2 ] ) ) > 10000 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
level.old_dog_spawn = dog_array[ i ];
|
||||
return dog_array[ i ];
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return dog_array[ 0 ];
|
||||
}
|
||||
*/
|
||||
dog_spawn_factory_logic( dog_array, favorite_enemy ) //checked matches cerberus output
|
||||
{
|
||||
dog_locs = array_randomize( level.enemy_dog_locations );
|
||||
for ( i = 0; i < dog_locs.size; i++ )
|
||||
{
|
||||
if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_locs[ i ] )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
dist_squared = distancesquared( dog_locs[ i ].origin, favorite_enemy.origin );
|
||||
if ( dist_squared > 160000 && dist_squared < 1000000 )
|
||||
{
|
||||
level.old_dog_spawn = dog_locs[ i ];
|
||||
return dog_locs[ i ];
|
||||
}
|
||||
}
|
||||
return dog_locs[ 0 ];
|
||||
}
|
||||
|
||||
get_favorite_enemy() //checked changed to match cerberus output //reverted back to while loop
|
||||
{
|
||||
dog_targets = getplayers();
|
||||
least_hunted = dog_targets[ 0 ];
|
||||
i = 0;
|
||||
while ( i < dog_targets.size )
|
||||
{
|
||||
if ( !isdefined( dog_targets[ i ].hunted_by ) )
|
||||
{
|
||||
dog_targets[ i ].hunted_by = 0;
|
||||
}
|
||||
if ( !is_player_valid( dog_targets[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( !is_player_valid( least_hunted ) )
|
||||
{
|
||||
least_hunted = dog_targets[ i ];
|
||||
}
|
||||
if ( dog_targets[ i ].hunted_by < least_hunted.hunted_by )
|
||||
{
|
||||
least_hunted = dog_targets[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
least_hunted.hunted_by += 1;
|
||||
return least_hunted;
|
||||
}
|
||||
|
||||
dog_health_increase() //checked changed to match cerberus output
|
||||
{
|
||||
players = getplayers();
|
||||
if ( level.dog_round_count == 1 )
|
||||
{
|
||||
level.dog_health = 400;
|
||||
}
|
||||
else if ( level.dog_round_count == 2 )
|
||||
{
|
||||
level.dog_health = 900;
|
||||
}
|
||||
else if ( level.dog_round_count == 3 )
|
||||
{
|
||||
level.dog_health = 1300;
|
||||
}
|
||||
else if ( level.dog_round_count == 4 )
|
||||
{
|
||||
level.dog_health = 1600;
|
||||
}
|
||||
if ( level.dog_health > 1600 )
|
||||
{
|
||||
level.dog_health = 1600;
|
||||
}
|
||||
}
|
||||
|
||||
dog_round_tracker() //checked changed to match cerberus output
|
||||
{
|
||||
level.dog_round_count = 1;
|
||||
level.next_dog_round = level.round_number + randomintrange( 4, 7 );
|
||||
old_spawn_func = level.round_spawn_func;
|
||||
old_wait_func = level.round_wait_func;
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "between_round_over" );
|
||||
if ( level.round_number == level.next_dog_round )
|
||||
{
|
||||
level.music_round_override = 1;
|
||||
old_spawn_func = level.round_spawn_func;
|
||||
old_wait_func = level.round_wait_func;
|
||||
dog_round_start();
|
||||
level.round_spawn_func = ::dog_round_spawning;
|
||||
level.next_dog_round = level.round_number + randomintrange( 4, 6 );
|
||||
}
|
||||
else if ( flag( "dog_round" ) )
|
||||
{
|
||||
dog_round_stop();
|
||||
level.round_spawn_func = old_spawn_func;
|
||||
level.round_wait_func = old_wait_func;
|
||||
level.music_round_override = 0;
|
||||
level.dog_round_count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dog_round_start() //checked matches cerberus output
|
||||
{
|
||||
flag_set( "dog_round" );
|
||||
flag_set( "dog_clips" );
|
||||
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "dog_start" );
|
||||
if ( !isDefined( level.doground_nomusic ) )
|
||||
{
|
||||
level.doground_nomusic = 0;
|
||||
}
|
||||
level.doground_nomusic = 1;
|
||||
level notify( "dog_round_starting" );
|
||||
clientnotify( "dog_start" );
|
||||
if ( isDefined( level.dog_melee_range ) )
|
||||
{
|
||||
setdvar( "ai_meleeRange", level.dog_melee_range );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( "ai_meleeRange", 100 );
|
||||
}
|
||||
}
|
||||
|
||||
dog_round_stop() //checked matches cerberus output
|
||||
{
|
||||
flag_clear( "dog_round" );
|
||||
flag_clear( "dog_clips" );
|
||||
if ( !isDefined( level.doground_nomusic ) )
|
||||
{
|
||||
level.doground_nomusic = 0;
|
||||
}
|
||||
level.doground_nomusic = 0;
|
||||
level notify( "dog_round_ending" );
|
||||
clientnotify( "dog_stop" );
|
||||
setdvar( "ai_meleeRange", level.melee_range_sav );
|
||||
setdvar( "ai_meleeWidth", level.melee_width_sav );
|
||||
setdvar( "ai_meleeHeight", level.melee_height_sav );
|
||||
}
|
||||
|
||||
play_dog_round() //checked matches cerberus output
|
||||
{
|
||||
self playlocalsound( "zmb_dog_round_start" );
|
||||
variation_count = 5;
|
||||
wait 4.5;
|
||||
players = getplayers();
|
||||
num = randomintrange( 0, players.size );
|
||||
players[ num ] maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "dog_spawn" );
|
||||
}
|
||||
|
||||
dog_init() //checked matches cerberus output
|
||||
{
|
||||
self.targetname = "zombie_dog";
|
||||
self.script_noteworthy = undefined;
|
||||
self.animname = "zombie_dog";
|
||||
self.ignoreall = 1;
|
||||
self.ignoreme = 1;
|
||||
self.allowdeath = 1;
|
||||
self.allowpain = 0;
|
||||
self.force_gib = 1;
|
||||
self.is_zombie = 1;
|
||||
self.has_legs = 1;
|
||||
self.gibbed = 0;
|
||||
self.head_gibbed = 0;
|
||||
self.default_goalheight = 40;
|
||||
self.ignore_inert = 1;
|
||||
self.grenadeawareness = 0;
|
||||
self.badplaceawareness = 0;
|
||||
self.ignoresuppression = 1;
|
||||
self.suppressionthreshold = 1;
|
||||
self.nododgemove = 1;
|
||||
self.dontshootwhilemoving = 1;
|
||||
self.pathenemylookahead = 0;
|
||||
self.badplaceawareness = 0;
|
||||
self.chatinitialized = 0;
|
||||
self.team = level.zombie_team;
|
||||
health_multiplier = 1;
|
||||
if ( getDvar( "scr_dog_health_walk_multiplier" ) != "" )
|
||||
{
|
||||
health_multiplier = getDvarFloat( "scr_dog_health_walk_multiplier" );
|
||||
}
|
||||
self.maxhealth = int( level.dog_health * health_multiplier );
|
||||
self.health = int( level.dog_health * health_multiplier );
|
||||
self.freezegun_damage = 0;
|
||||
self.zombie_move_speed = "sprint";
|
||||
self thread dog_run_think();
|
||||
self thread dog_stalk_audio();
|
||||
self thread maps/mp/zombies/_zm::round_spawn_failsafe();
|
||||
self ghost();
|
||||
self thread magic_bullet_shield();
|
||||
self dog_fx_eye_glow();
|
||||
self dog_fx_trail();
|
||||
self thread dog_death();
|
||||
level thread maps/mp/zombies/_zm_spawner::zombie_death_event( self );
|
||||
self thread maps/mp/zombies/_zm_spawner::enemy_death_detection();
|
||||
self.a.disablepain = 1;
|
||||
self disable_react();
|
||||
self clearenemy();
|
||||
self cleargoalvolume();
|
||||
self.flame_damage_time = 0;
|
||||
self.meleedamage = 40;
|
||||
self.thundergun_knockdown_func = ::dog_thundergun_knockdown;
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "zombie_dog_spawn_init -> Spawned = " + self.origin );
|
||||
if ( isDefined( level.achievement_monitor_func ) )
|
||||
{
|
||||
self [[ level.achievement_monitor_func ]]();
|
||||
}
|
||||
}
|
||||
|
||||
dog_fx_eye_glow() //checked matches cerberus output
|
||||
{
|
||||
self.fx_dog_eye = spawn( "script_model", self gettagorigin( "J_EyeBall_LE" ) );
|
||||
self.fx_dog_eye.angles = self gettagangles( "J_EyeBall_LE" );
|
||||
self.fx_dog_eye setmodel( "tag_origin" );
|
||||
self.fx_dog_eye linkto( self, "J_EyeBall_LE" );
|
||||
}
|
||||
|
||||
dog_fx_trail() //checked matches cerberus output
|
||||
{
|
||||
if ( !is_mature() || randomint( 100 ) > level.zombie_vars[ "dog_fire_trail_percent" ] )
|
||||
{
|
||||
self.fx_dog_trail_type = level._effect[ "dog_trail_ash" ];
|
||||
self.fx_dog_trail_sound = "zmb_hellhound_loop_breath";
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.nodeath = 1;
|
||||
self.fx_dog_trail_type = level._effect[ "dog_trail_fire" ];
|
||||
self.fx_dog_trail_sound = "zmb_hellhound_loop_fire";
|
||||
}
|
||||
self.fx_dog_trail = spawn( "script_model", self gettagorigin( "tag_origin" ) );
|
||||
self.fx_dog_trail.angles = self gettagangles( "tag_origin" );
|
||||
self.fx_dog_trail setmodel( "tag_origin" );
|
||||
self.fx_dog_trail linkto( self, "tag_origin" );
|
||||
}
|
||||
|
||||
dog_death() //checked changed to match cerberus output
|
||||
{
|
||||
self waittill( "death" );
|
||||
if ( get_current_zombie_count() == 0 && level.zombie_total == 0 )
|
||||
{
|
||||
level.last_dog_origin = self.origin;
|
||||
level notify( "last_dog_down" );
|
||||
}
|
||||
if ( isplayer( self.attacker ) )
|
||||
{
|
||||
event = "death";
|
||||
if ( issubstr( self.damageweapon, "knife_ballistic_" ) )
|
||||
{
|
||||
event = "ballistic_knife_death";
|
||||
}
|
||||
self.attacker maps/mp/zombies/_zm_score::player_add_points( event, self.damagemod, self.damagelocation, 1 );
|
||||
if ( randomintrange( 0, 100 ) >= 80 )
|
||||
{
|
||||
self.attacker maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "hellhound" );
|
||||
}
|
||||
self.attacker maps/mp/zombies/_zm_stats::increment_client_stat( "zdogs_killed" );
|
||||
self.attacker maps/mp/zombies/_zm_stats::increment_player_stat( "zdogs_killed" );
|
||||
}
|
||||
if ( isDefined( self.attacker ) && isai( self.attacker ) )
|
||||
{
|
||||
self.attacker notify( "killed" );
|
||||
}
|
||||
self stoploopsound();
|
||||
self.fx_dog_eye delete();
|
||||
self.fx_dog_trail delete();
|
||||
if ( isDefined( self.a.nodeath ) )
|
||||
{
|
||||
level thread dog_explode_fx( self.origin );
|
||||
self delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
self playsound( "zmb_hellhound_vocals_death" );
|
||||
}
|
||||
}
|
||||
|
||||
dog_explode_fx( origin ) //checked matches cerberus output
|
||||
{
|
||||
playfx( level._effect[ "dog_gib" ], origin );
|
||||
playsoundatposition( "zmb_hellhound_explode", origin );
|
||||
}
|
||||
|
||||
zombie_setup_attack_properties_dog() //checked matches cerberus output
|
||||
{
|
||||
self maps/mp/zombies/_zm_spawner::zombie_history( "zombie_setup_attack_properties()" );
|
||||
self thread dog_behind_audio();
|
||||
self.ignoreall = 0;
|
||||
self.pathenemyfightdist = 64;
|
||||
self.meleeattackdist = 64;
|
||||
self.disablearrivals = 1;
|
||||
self.disableexits = 1;
|
||||
}
|
||||
|
||||
stop_dog_sound_on_death() //checked matches cerberus output
|
||||
{
|
||||
self waittill( "death" );
|
||||
self stopsounds();
|
||||
}
|
||||
|
||||
dog_behind_audio() //checked does not match cerberus output changed at own discretion
|
||||
{
|
||||
self thread stop_dog_sound_on_death();
|
||||
self endon( "death" );
|
||||
self waittill_any( "dog_running", "dog_combat" );
|
||||
self playsound( "zmb_hellhound_vocals_close" );
|
||||
wait 3;
|
||||
while ( 1 )
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
vectorAngle = vectorToAngles( self.origin - players[ i ].origin );
|
||||
dogangle = AbsAngleClamp180( vectorAngle[ 1 ] - players[ i ].angles[ 1 ] );
|
||||
if ( isalive( players[ i ] ) && !isDefined( players[ i ].revivetrigger ) )
|
||||
{
|
||||
if ( Abs( dogangle ) > 90 && distance2d( self.origin, players[ i ].origin ) > 100 )
|
||||
{
|
||||
self playsound( "zmb_hellhound_vocals_close" );
|
||||
wait 3;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait 0.75;
|
||||
}
|
||||
}
|
||||
|
||||
dog_clip_monitor() //checked changed to match cerberus output
|
||||
{
|
||||
clips_on = 0;
|
||||
level.dog_clips = getentarray( "dog_clips", "targetname" );
|
||||
while ( 1 )
|
||||
{
|
||||
for ( i = 0; i < level.dog_clips.size; i++ )
|
||||
{
|
||||
level.dog_clips[ i ] trigger_off();
|
||||
level.dog_clips[ i ] connectpaths();
|
||||
}
|
||||
flag_wait( "dog_clips" );
|
||||
if ( isDefined( level.no_dog_clip ) && level.no_dog_clip == 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
for ( i = 0; i < level.dog_clips.size; i++ )
|
||||
{
|
||||
level.dog_clips[ i ] trigger_on();
|
||||
level.dog_clips[ i ] disconnectpaths();
|
||||
wait_network_frame();
|
||||
}
|
||||
dog_is_alive = 1;
|
||||
while ( dog_is_alive || flag( "dog_round" ) )
|
||||
{
|
||||
dog_is_alive = 0;
|
||||
dogs = getentarray( "zombie_dog", "targetname" );
|
||||
for ( i = 0; i < dogs.size; i++ )
|
||||
{
|
||||
if ( isalive( dogs[ i ] ) )
|
||||
{
|
||||
dog_is_alive = 1;
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
flag_clear( "dog_clips" );
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
special_dog_spawn( spawners, num_to_spawn ) //checked matches cerberus output
|
||||
{
|
||||
dogs = getaispeciesarray( "all", "zombie_dog" );
|
||||
if ( isDefined( dogs ) && dogs.size >= 9 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( num_to_spawn ) )
|
||||
{
|
||||
num_to_spawn = 1;
|
||||
}
|
||||
spawn_point = undefined;
|
||||
count = 0;
|
||||
while ( count < num_to_spawn )
|
||||
{
|
||||
players = get_players();
|
||||
favorite_enemy = get_favorite_enemy();
|
||||
if ( isDefined( spawners ) )
|
||||
{
|
||||
spawn_point = spawners[ randomint( spawners.size ) ];
|
||||
ai = spawn_zombie( spawn_point );
|
||||
if ( isDefined( ai ) )
|
||||
{
|
||||
ai.favoriteenemy = favorite_enemy;
|
||||
spawn_point thread dog_spawn_fx( ai );
|
||||
count++;
|
||||
flag_set( "dog_clips" );
|
||||
}
|
||||
}
|
||||
else if ( isDefined( level.dog_spawn_func ) )
|
||||
{
|
||||
spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy );
|
||||
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||
if ( isDefined( ai ) )
|
||||
{
|
||||
ai.favoriteenemy = favorite_enemy;
|
||||
spawn_loc thread dog_spawn_fx( ai, spawn_loc );
|
||||
count++;
|
||||
flag_set( "dog_clips" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy );
|
||||
ai = spawn_zombie( level.dog_spawners[ 0 ] );
|
||||
if ( isDefined( ai ) )
|
||||
{
|
||||
ai.favoriteenemy = favorite_enemy;
|
||||
spawn_point thread dog_spawn_fx( ai, spawn_point );
|
||||
count++;
|
||||
flag_set( "dog_clips" );
|
||||
}
|
||||
}
|
||||
waiting_for_next_dog_spawn( count, num_to_spawn );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
dog_run_think() //checked matches cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "visible" );
|
||||
if ( self.health > level.dog_health )
|
||||
{
|
||||
self.maxhealth = level.dog_health;
|
||||
self.health = level.dog_health;
|
||||
}
|
||||
maps/mp/zombies/_zm_net::network_safe_play_fx_on_tag("dog_fx", 2, level._effect["dog_eye_glow"], self.fx_dog_eye, "tag_origin");
|
||||
maps/mp/zombies/_zm_net::network_safe_play_fx_on_tag( "dog_fx", 2, self.fx_dog_trail_type, self.fx_dog_trail, "tag_origin" );
|
||||
self playloopsound( self.fx_dog_trail_sound );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !is_player_valid( self.favoriteenemy ) )
|
||||
{
|
||||
self.favoriteenemy = get_favorite_enemy();
|
||||
}
|
||||
wait 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
dog_stalk_audio() //checked matches cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "dog_running" );
|
||||
self endon( "dog_combat" );
|
||||
while ( 1 )
|
||||
{
|
||||
self playsound( "zmb_hellhound_vocals_amb" );
|
||||
wait randomfloatrange( 3, 6 );
|
||||
}
|
||||
}
|
||||
|
||||
dog_thundergun_knockdown( player, gib ) //checked matches cerberus output
|
||||
{
|
||||
self endon( "death" );
|
||||
damage = int( self.maxhealth * 0.5 );
|
||||
self dodamage( damage, player.origin, player );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user