mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-07 17:37:50 -05:00
uploading all of gametypes_zm as a baseline
Starting part 2 of patch_zm checking.
This commit is contained in:
parent
043ddd2880
commit
7cfed7cdf9
207
patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc
Normal file
207
patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc
Normal file
@ -0,0 +1,207 @@
|
||||
#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()
|
||||
{
|
||||
if ( !isDefined( level.gametypestarted ) || !level.gametypestarted )
|
||||
{
|
||||
[[ level.callbackstartgametype ]]();
|
||||
level.gametypestarted = 1;
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_finalizeinitialization()
|
||||
{
|
||||
maps/mp/_utility::callback( "on_finalize_initialization" );
|
||||
}
|
||||
|
||||
codecallback_playerconnect()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread maps/mp/_audio::monitor_player_sprint();
|
||||
[[ level.callbackplayerconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_playerdisconnect()
|
||||
{
|
||||
self notify( "disconnect" );
|
||||
client_num = self getentitynumber();
|
||||
[[ level.callbackplayerdisconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigration()
|
||||
{
|
||||
/#
|
||||
println( "****CodeCallback_HostMigration****" );
|
||||
#/
|
||||
[[ level.callbackhostmigration ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigrationsave()
|
||||
{
|
||||
/#
|
||||
println( "****CodeCallback_HostMigrationSave****" );
|
||||
#/
|
||||
[[ level.callbackhostmigrationsave ]]();
|
||||
}
|
||||
|
||||
codecallback_prehostmigrationsave()
|
||||
{
|
||||
/#
|
||||
println( "****CodeCallback_PreHostMigrationSave****" );
|
||||
#/
|
||||
[[ level.callbackprehostmigrationsave ]]();
|
||||
}
|
||||
|
||||
codecallback_playermigrated()
|
||||
{
|
||||
/#
|
||||
println( "****CodeCallback_PlayerMigrated****" );
|
||||
#/
|
||||
[[ level.callbackplayermigrated ]]();
|
||||
}
|
||||
|
||||
codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayermelee ]]( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit );
|
||||
}
|
||||
|
||||
codecallback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex )
|
||||
{
|
||||
[[ level.callbackactordamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
}
|
||||
|
||||
codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset )
|
||||
{
|
||||
[[ level.callbackactorkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset );
|
||||
}
|
||||
|
||||
codecallback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname )
|
||||
{
|
||||
[[ level.callbackvehicledamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname );
|
||||
}
|
||||
|
||||
codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset )
|
||||
{
|
||||
}
|
||||
|
||||
codecallback_faceeventnotify( notify_msg, ent )
|
||||
{
|
||||
if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isDefined( level.face_event_handler ) && isDefined( level.face_event_handler.events[ notify_msg ] ) )
|
||||
{
|
||||
ent sendfaceevent( level.face_event_handler.events[ notify_msg ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_menuresponse( action, arg )
|
||||
{
|
||||
if ( !isDefined( level.menuresponsequeue ) )
|
||||
{
|
||||
level.menuresponsequeue = [];
|
||||
level thread menuresponsequeuepump();
|
||||
}
|
||||
index = level.menuresponsequeue.size;
|
||||
level.menuresponsequeue[ index ] = spawnstruct();
|
||||
level.menuresponsequeue[ index ].action = action;
|
||||
level.menuresponsequeue[ index ].arg = arg;
|
||||
level.menuresponsequeue[ index ].ent = self;
|
||||
level notify( "menuresponse_queue" );
|
||||
}
|
||||
|
||||
menuresponsequeuepump()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "menuresponse_queue" );
|
||||
level.menuresponsequeue[ 0 ].ent notify( "menuresponse" );
|
||||
arrayremoveindex( level.menuresponsequeue, 0, 0 );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
setupcallbacks()
|
||||
{
|
||||
setdefaultcallbacks();
|
||||
level.idflags_radius = 1;
|
||||
level.idflags_no_armor = 2;
|
||||
level.idflags_no_knockback = 4;
|
||||
level.idflags_penetration = 8;
|
||||
level.idflags_destructible_entity = 16;
|
||||
level.idflags_shield_explosive_impact = 32;
|
||||
level.idflags_shield_explosive_impact_huge = 64;
|
||||
level.idflags_shield_explosive_splash = 128;
|
||||
level.idflags_no_team_protection = 256;
|
||||
level.idflags_no_protection = 512;
|
||||
level.idflags_passthru = 1024;
|
||||
}
|
||||
|
||||
setdefaultcallbacks()
|
||||
{
|
||||
level.callbackstartgametype = ::maps/mp/gametypes_zm/_globallogic::callback_startgametype;
|
||||
level.callbackplayerconnect = ::maps/mp/gametypes_zm/_globallogic_player::callback_playerconnect;
|
||||
level.callbackplayerdisconnect = ::maps/mp/gametypes_zm/_globallogic_player::callback_playerdisconnect;
|
||||
level.callbackplayerdamage = ::maps/mp/gametypes_zm/_globallogic_player::callback_playerdamage;
|
||||
level.callbackplayerkilled = ::maps/mp/gametypes_zm/_globallogic_player::callback_playerkilled;
|
||||
level.callbackplayermelee = ::maps/mp/gametypes_zm/_globallogic_player::callback_playermelee;
|
||||
level.callbackplayerlaststand = ::maps/mp/gametypes_zm/_globallogic_player::callback_playerlaststand;
|
||||
level.callbackactordamage = ::maps/mp/gametypes_zm/_globallogic_actor::callback_actordamage;
|
||||
level.callbackactorkilled = ::maps/mp/gametypes_zm/_globallogic_actor::callback_actorkilled;
|
||||
level.callbackplayermigrated = ::maps/mp/gametypes_zm/_globallogic_player::callback_playermigrated;
|
||||
level.callbackhostmigration = ::maps/mp/gametypes_zm/_hostmigration::callback_hostmigration;
|
||||
level.callbackhostmigrationsave = ::maps/mp/gametypes_zm/_hostmigration::callback_hostmigrationsave;
|
||||
level.callbackprehostmigrationsave = ::maps/mp/gametypes_zm/_hostmigration::callback_prehostmigrationsave;
|
||||
}
|
||||
|
||||
abortlevel()
|
||||
{
|
||||
/#
|
||||
println( "ERROR: Aborting level - gametype is not supported" );
|
||||
#/
|
||||
level.callbackstartgametype = ::callbackvoid;
|
||||
level.callbackplayerconnect = ::callbackvoid;
|
||||
level.callbackplayerdisconnect = ::callbackvoid;
|
||||
level.callbackplayerdamage = ::callbackvoid;
|
||||
level.callbackplayerkilled = ::callbackvoid;
|
||||
level.callbackplayermelee = ::callbackvoid;
|
||||
level.callbackplayerlaststand = ::callbackvoid;
|
||||
level.callbackactordamage = ::callbackvoid;
|
||||
level.callbackactorkilled = ::callbackvoid;
|
||||
level.callbackvehicledamage = ::callbackvoid;
|
||||
setdvar( "g_gametype", "dm" );
|
||||
exitlevel( 0 );
|
||||
}
|
||||
|
||||
codecallback_glasssmash( pos, dir )
|
||||
{
|
||||
level notify( "glass_smash" );
|
||||
}
|
||||
|
||||
callbackvoid()
|
||||
{
|
||||
}
|
160
patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc
Normal file
160
patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc
Normal file
@ -0,0 +1,160 @@
|
||||
|
||||
init()
|
||||
{
|
||||
precacheshader( "damage_feedback" );
|
||||
precacheshader( "damage_feedback_flak" );
|
||||
precacheshader( "damage_feedback_tac" );
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if ( !isplayer( self ) || sessionmodeiszombiesgame() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( mod ) && mod != "MOD_CRUSH" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_HIT_BY_OBJECT" )
|
||||
{
|
||||
if ( isDefined( inflictor ) && isDefined( inflictor.soundmod ) )
|
||||
{
|
||||
switch( inflictor.soundmod )
|
||||
{
|
||||
case "player":
|
||||
self thread playhitsound( mod, "mpl_hit_alert" );
|
||||
break;
|
||||
case "heli":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_air" );
|
||||
break;
|
||||
case "hpm":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_hpm" );
|
||||
break;
|
||||
case "taser_spike":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_taser_spike" );
|
||||
break;
|
||||
case "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 thread playhitsound( mod, "mpl_hit_alert_low" );
|
||||
}
|
||||
if ( isDefined( perkfeedback ) )
|
||||
{
|
||||
switch( perkfeedback )
|
||||
{
|
||||
case "flakjacket":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 );
|
||||
break;
|
||||
case "tacticalMask":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else self.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
self.hud_damagefeedback.alpha = 1;
|
||||
self.hud_damagefeedback fadeovertime( 1 );
|
||||
self.hud_damagefeedback.alpha = 0;
|
||||
}
|
||||
}
|
||||
|
||||
playhitsound( mod, alert )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
if ( self.hitsoundtracker )
|
||||
{
|
||||
self.hitsoundtracker = 0;
|
||||
self playlocalsound( alert );
|
||||
wait 0,05;
|
||||
self.hitsoundtracker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
updatespecialdamagefeedback( hitent )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
enemyshit = 0;
|
||||
value = 1;
|
||||
entbitarray0 = 0;
|
||||
i = 0;
|
||||
while ( i < 32 )
|
||||
{
|
||||
if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 )
|
||||
{
|
||||
entbitarray0 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
value *= 2;
|
||||
i++;
|
||||
}
|
||||
entbitarray1 = 0;
|
||||
i = 33;
|
||||
while ( i < 64 )
|
||||
{
|
||||
if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 )
|
||||
{
|
||||
entbitarray1 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
value *= 2;
|
||||
i++;
|
||||
}
|
||||
if ( enemyshit )
|
||||
{
|
||||
self directionalhitindicator( entbitarray0, entbitarray1 );
|
||||
}
|
||||
self.directionalhitarray = undefined;
|
||||
entbitarray0 = 0;
|
||||
entbitarray1 = 0;
|
||||
}
|
102
patch_zm/maps/mp/gametypes_zm/_dev.gsc
Normal file
102
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
patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc
Normal file
2668
patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc
Normal file
File diff suppressed because it is too large
Load Diff
3101
patch_zm/maps/mp/gametypes_zm/_globallogic.gsc
Normal file
3101
patch_zm/maps/mp/gametypes_zm/_globallogic.gsc
Normal file
File diff suppressed because it is too large
Load Diff
207
patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc
Normal file
207
patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc
Normal file
@ -0,0 +1,207 @@
|
||||
#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 )
|
||||
{
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self.aiteam == "spectator" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = getTime();
|
||||
eattacker = maps/mp/gametypes_zm/_globallogic_player::figureoutattacker( eattacker );
|
||||
if ( !isDefined( vdir ) )
|
||||
{
|
||||
idflags |= level.idflags_no_knockback;
|
||||
}
|
||||
friendly = 0;
|
||||
if ( self.health == self.maxhealth || !isDefined( self.attackers ) )
|
||||
{
|
||||
self.attackers = [];
|
||||
self.attackerdata = [];
|
||||
self.attackerdamage = [];
|
||||
}
|
||||
if ( maps/mp/gametypes_zm/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) )
|
||||
{
|
||||
smeansofdeath = "MOD_HEAD_SHOT";
|
||||
}
|
||||
if ( level.onlyheadshots )
|
||||
{
|
||||
if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( smeansofdeath == "MOD_HEAD_SHOT" )
|
||||
{
|
||||
idamage = 150;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( sweapon == "none" && isDefined( einflictor ) )
|
||||
{
|
||||
if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
{
|
||||
sweapon = "explodable_barrel_mp";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
{
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( idflags & level.idflags_no_protection )
|
||||
{
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
eattacker.pers[ "participation" ]++;
|
||||
}
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers[ "team" ] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0,5 );
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
}
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( eattacker ) && isDefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isDefined( self.script_owner ) && isDefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes_zm/_weapons::checkhit( sweapon );
|
||||
}
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isDefined( einflictor ) && isDefined( einflictor.iscooked ) )
|
||||
{
|
||||
self.wascooked = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.wascooked = undefined;
|
||||
}
|
||||
if ( isDefined( eattacker ) )
|
||||
{
|
||||
self.lastdamagewasfromenemy = eattacker != self;
|
||||
}
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
if ( isDefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( sweapon != "artillery_mp" || !isDefined( einflictor ) && !isai( einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/#
|
||||
if ( 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 )
|
||||
{
|
||||
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
patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc
Normal file
1034
patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc
Normal file
File diff suppressed because it is too large
Load Diff
230
patch_zm/maps/mp/gametypes_zm/_globallogic_defaults.gsc
Normal file
230
patch_zm/maps/mp/gametypes_zm/_globallogic_defaults.gsc
Normal file
@ -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
patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc
Normal file
2238
patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc
Normal file
File diff suppressed because it is too large
Load Diff
873
patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc
Normal file
873
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()
|
||||
{
|
||||
/#
|
||||
#/
|
||||
}
|
959
patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc
Normal file
959
patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc
Normal file
@ -0,0 +1,959 @@
|
||||
#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 )
|
||||
{
|
||||
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()
|
||||
{
|
||||
_a34 = level.teams;
|
||||
_k34 = getFirstArrayKey( _a34 );
|
||||
while ( isDefined( _k34 ) )
|
||||
{
|
||||
team = _a34[ _k34 ];
|
||||
if ( !level.everexisted[ team ] )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
_k34 = getNextArrayKey( _a34, _k34 );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
mayspawn()
|
||||
{
|
||||
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
|
||||
{
|
||||
if ( level.maxplayercount > 1 )
|
||||
{
|
||||
if ( !isoneround() )
|
||||
{
|
||||
gamehasstarted = !isfirstround();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !self.pers[ "lives" ] && gamehasstarted )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( gamehasstarted )
|
||||
{
|
||||
if ( !level.ingraceperiod && !self.hasspawned && !level.wagermatch )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
timeuntilwavespawn( minimumwait )
|
||||
{
|
||||
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()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.inpoisonarea = 0;
|
||||
self.inburnarea = 0;
|
||||
self.inflarevisionarea = 0;
|
||||
self.ingroundnapalm = 0;
|
||||
}
|
||||
|
||||
spawnplayerprediction()
|
||||
{
|
||||
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( #"CF6EEB8B" ) == 0 )
|
||||
{
|
||||
maps/mp/gametypes_zm/_spawning::onspawnplayer_unified( 1 );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self [[ level.onspawnplayer ]]( 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
giveloadoutlevelspecific( team, class )
|
||||
{
|
||||
pixbeginevent( "giveLoadoutLevelSpecific" );
|
||||
if ( isDefined( level.givecustomcharacters ) )
|
||||
{
|
||||
self [[ level.givecustomcharacters ]]();
|
||||
}
|
||||
if ( isDefined( level.givecustomloadout ) )
|
||||
{
|
||||
self [[ level.givecustomloadout ]]();
|
||||
}
|
||||
pixendevent();
|
||||
}
|
||||
|
||||
spawnplayer()
|
||||
{
|
||||
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( #"C8077F47" ) > 0 )
|
||||
{
|
||||
self.maxhealth = getDvarInt( #"C8077F47" );
|
||||
}
|
||||
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( #"CF6EEB8B" ) == 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( #"F8D00F60" ) > 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 )
|
||||
{
|
||||
self notify( "spawned" );
|
||||
self notify( "end_respawn" );
|
||||
in_spawnspectator( origin, angles );
|
||||
}
|
||||
|
||||
respawn_asspectator( origin, angles )
|
||||
{
|
||||
in_spawnspectator( origin, angles );
|
||||
}
|
||||
|
||||
in_spawnspectator( origin, angles )
|
||||
{
|
||||
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()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "spawned" );
|
||||
self notify( "spectator_thirdperson_thread" );
|
||||
self endon( "spectator_thirdperson_thread" );
|
||||
self.spectatingthirdperson = 0;
|
||||
}
|
||||
|
||||
forcespawn( time )
|
||||
{
|
||||
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()
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( "scr_hostmigrationtest" ) == 1 )
|
||||
{
|
||||
return;
|
||||
#/
|
||||
}
|
||||
if ( self ishost() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self kickifidontspawninternal();
|
||||
}
|
||||
|
||||
kickifidontspawninternal()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "spawned" );
|
||||
waittime = 90;
|
||||
if ( getDvar( #"4257CF5C" ) != "" )
|
||||
{
|
||||
waittime = getDvarFloat( #"4257CF5C" );
|
||||
}
|
||||
mintime = 45;
|
||||
if ( getDvar( #"0DF057E0" ) != "" )
|
||||
{
|
||||
mintime = getDvarFloat( #"0DF057E0" );
|
||||
}
|
||||
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 )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
maps/mp/gametypes_zm/_hostmigration::waitlongdurationwithhostmigrationpause( waittime );
|
||||
}
|
||||
|
||||
spawninterroundintermission()
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
player_to_spawn = undefined;
|
||||
i = 0;
|
||||
while ( i < level.deadplayers[ team ].size )
|
||||
{
|
||||
player = level.deadplayers[ team ][ i ];
|
||||
if ( player.waitingtospawn )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
player_to_spawn = player;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
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 )
|
||||
{
|
||||
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;
|
||||
}
|
||||
_a746 = level.teams;
|
||||
_k746 = getFirstArrayKey( _a746 );
|
||||
while ( isDefined( _k746 ) )
|
||||
{
|
||||
team = _a746[ _k746 ];
|
||||
if ( team == dead_player_team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnqueuedclientonteam( team );
|
||||
}
|
||||
_k746 = getNextArrayKey( _a746, _k746 );
|
||||
}
|
||||
}
|
||||
|
||||
allteamsnearscorelimit()
|
||||
{
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.scorelimit <= 1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
_a763 = level.teams;
|
||||
_k763 = getFirstArrayKey( _a763 );
|
||||
while ( isDefined( _k763 ) )
|
||||
{
|
||||
team = _a763[ _k763 ];
|
||||
if ( ( level.scorelimit - 1 ) < game[ "teamScores" ][ team ] )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
_k763 = getNextArrayKey( _a763, _k763 );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
shouldshowrespawnmessage()
|
||||
{
|
||||
if ( waslastround() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isoneround() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( level.livesdonotreset ) && level.livesdonotreset )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( allteamsnearscorelimit() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
default_spawnmessage()
|
||||
{
|
||||
setlowermessage( game[ "strings" ][ "spawn_next_round" ] );
|
||||
self thread maps/mp/gametypes_zm/_globallogic_ui::removespawnmessageshortly( 3 );
|
||||
}
|
||||
|
||||
showspawnmessage()
|
||||
{
|
||||
if ( shouldshowrespawnmessage() )
|
||||
{
|
||||
self thread [[ level.spawnmessage ]]();
|
||||
}
|
||||
}
|
||||
|
||||
spawnclient( timealreadypassed )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_respawn" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self usebuttonpressed() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
waitinspawnqueue()
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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()
|
||||
{
|
||||
resettimeout();
|
||||
self stopshellshock();
|
||||
self stoprumble( "damage_heavy" );
|
||||
}
|
544
patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc
Normal file
544
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
patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc
Normal file
478
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 );
|
||||
}
|
471
patch_zm/maps/mp/gametypes_zm/_globallogic_vehicle.gsc
Normal file
471
patch_zm/maps/mp/gametypes_zm/_globallogic_vehicle.gsc
Normal file
@ -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
patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc
Normal file
995
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++;
|
||||
}
|
||||
}
|
288
patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc
Normal file
288
patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc
Normal file
@ -0,0 +1,288 @@
|
||||
#include maps/mp/gametypes_zm/_globallogic_player;
|
||||
|
||||
init()
|
||||
{
|
||||
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()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerdisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect()
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
|
||||
playerhealthregen()
|
||||
{
|
||||
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;
|
||||
}
|
||||
else if ( player.health <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( player.laststand ) && player.laststand )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
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 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( level.healthregendisabled )
|
||||
{
|
||||
break;
|
||||
}
|
||||
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_zm/_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;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
oldhealth = player.health;
|
||||
health_add = 0;
|
||||
hurttime = getTime();
|
||||
player.breathingstoptime = hurttime + 6000;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
decayplayerdamages( decay )
|
||||
{
|
||||
if ( !isDefined( self.attackerdamage ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < self.attackerdamage.size )
|
||||
{
|
||||
if ( !isDefined( self.attackerdamage[ i ] ) || !isDefined( self.attackerdamage[ i ].damage ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.attackerdamage[ i ].damage -= decay;
|
||||
if ( self.attackerdamage[ i ].damage < 0 )
|
||||
{
|
||||
self.attackerdamage[ i ].damage = 0;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
playerbreathingsound( healthcap )
|
||||
{
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
player notify( "snd_breathing_hurt" );
|
||||
wait 0,784;
|
||||
wait ( 0,1 + randomfloat( 0,8 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playerheartbeatsound( healthcap )
|
||||
{
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
player playlocalsound( "mpl_player_heartbeat" );
|
||||
wait self.hearbeatwait;
|
||||
if ( self.hearbeatwait <= 0,6 )
|
||||
{
|
||||
self.hearbeatwait += 0,1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
546
patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc
Normal file
546
patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc
Normal file
@ -0,0 +1,546 @@
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/gametypes_zm/_hud;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/gametypes_zm/_hud_util;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
debug_script_structs()
|
||||
{
|
||||
/#
|
||||
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()
|
||||
{
|
||||
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()
|
||||
{
|
||||
}
|
||||
|
||||
callback_prehostmigrationsave()
|
||||
{
|
||||
undo_link_changes();
|
||||
disablezombies( 1 );
|
||||
if ( is_true( level._hm_should_pause_spawning ) )
|
||||
{
|
||||
flag_set( "spawn_zombies" );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
level.players[ i ] enableinvulnerability();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
pausetimer()
|
||||
{
|
||||
level.migrationtimerpausetime = getTime();
|
||||
}
|
||||
|
||||
resumetimer()
|
||||
{
|
||||
level.discardtime += getTime() - level.migrationtimerpausetime;
|
||||
}
|
||||
|
||||
locktimer()
|
||||
{
|
||||
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()
|
||||
{
|
||||
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" );
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
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();
|
||||
i++;
|
||||
}
|
||||
while ( isDefined( level.hostmigration_ai_link_entity_callback ) )
|
||||
{
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
while ( isDefined( zombies ) && zombies.size > 0 )
|
||||
{
|
||||
_a133 = zombies;
|
||||
_k133 = getFirstArrayKey( _a133 );
|
||||
while ( isDefined( _k133 ) )
|
||||
{
|
||||
zombie = _a133[ _k133 ];
|
||||
if ( !isDefined( zombie._host_migration_link_entity ) )
|
||||
{
|
||||
zombie._host_migration_link_entity = zombie [[ level.hostmigration_ai_link_entity_callback ]]();
|
||||
}
|
||||
_k133 = getNextArrayKey( _a133, _k133 );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( level.inprematchperiod )
|
||||
{
|
||||
level waittill( "prematch_over" );
|
||||
}
|
||||
/#
|
||||
println( "Migration starting at time " + getTime() );
|
||||
#/
|
||||
level.hostmigrationtimer = 1;
|
||||
thread locktimer();
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
while ( isDefined( zombies ) && zombies.size > 0 )
|
||||
{
|
||||
_a156 = zombies;
|
||||
_k156 = getFirstArrayKey( _a156 );
|
||||
while ( isDefined( _k156 ) )
|
||||
{
|
||||
zombie = _a156[ _k156 ];
|
||||
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 );
|
||||
}
|
||||
_k156 = getNextArrayKey( _a156, _k156 );
|
||||
}
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
level._hm_should_pause_spawning = flag( "spawn_zombies" );
|
||||
if ( level._hm_should_pause_spawning )
|
||||
{
|
||||
flag_clear( "spawn_zombies" );
|
||||
}
|
||||
hostmigrationwait();
|
||||
_a185 = level.players;
|
||||
_k185 = getFirstArrayKey( _a185 );
|
||||
while ( isDefined( _k185 ) )
|
||||
{
|
||||
player = _a185[ _k185 ];
|
||||
player thread post_migration_become_vulnerable();
|
||||
_k185 = getNextArrayKey( _a185, _k185 );
|
||||
}
|
||||
zombies = getaiarray( level.zombie_team );
|
||||
while ( isDefined( zombies ) && zombies.size > 0 )
|
||||
{
|
||||
_a193 = zombies;
|
||||
_k193 = getFirstArrayKey( _a193 );
|
||||
while ( isDefined( _k193 ) )
|
||||
{
|
||||
zombie = _a193[ _k193 ];
|
||||
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;
|
||||
}
|
||||
_k193 = getNextArrayKey( _a193, _k193 );
|
||||
}
|
||||
}
|
||||
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()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
wait 3;
|
||||
self disableinvulnerability();
|
||||
}
|
||||
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer )
|
||||
{
|
||||
waittillframeend;
|
||||
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 )
|
||||
{
|
||||
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()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
if ( level.hostmigrationreturnedplayercount < ( ( level.players.size * 2 ) / 3 ) )
|
||||
{
|
||||
thread matchstarttimerconsole( "waiting_for_teams", 20 );
|
||||
hostmigrationwaitforplayers();
|
||||
}
|
||||
thread matchstarttimerconsole( "match_starting_in", 5 );
|
||||
wait 5;
|
||||
}
|
||||
|
||||
hostmigrationwaitforplayers()
|
||||
{
|
||||
level endon( "hostmigration_enoughplayers" );
|
||||
wait 15;
|
||||
}
|
||||
|
||||
hostmigrationtimerthink_internal()
|
||||
{
|
||||
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()
|
||||
{
|
||||
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()
|
||||
{
|
||||
if ( !isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
starttime = getTime();
|
||||
level waittill( "host_migration_end" );
|
||||
return getTime() - starttime;
|
||||
}
|
||||
|
||||
waittillhostmigrationstarts( duration )
|
||||
{
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
wait duration;
|
||||
}
|
||||
|
||||
waitlongdurationwithhostmigrationpause( duration )
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
waitlongdurationwithgameendtimeupdate( duration )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
found_node = undefined;
|
||||
a_nodes = getnodesinradiussorted( v_origin, max_radius, min_radius, max_height, "pathnodes" );
|
||||
while ( 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;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
i--;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return found_node;
|
||||
}
|
||||
|
||||
hostmigration_put_player_in_better_place()
|
||||
{
|
||||
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" );
|
||||
while ( isDefined( structs ) )
|
||||
{
|
||||
_a559 = structs;
|
||||
_k559 = getFirstArrayKey( _a559 );
|
||||
while ( isDefined( _k559 ) )
|
||||
{
|
||||
struct = _a559[ _k559 ];
|
||||
while ( isDefined( struct.script_string ) )
|
||||
{
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
_a565 = tokens;
|
||||
_k565 = getFirstArrayKey( _a565 );
|
||||
while ( isDefined( _k565 ) )
|
||||
{
|
||||
token = _a565[ _k565 ];
|
||||
if ( token == match_string )
|
||||
{
|
||||
spawnpoints[ spawnpoints.size ] = struct;
|
||||
}
|
||||
_k565 = getNextArrayKey( _a565, _k565 );
|
||||
}
|
||||
}
|
||||
_k559 = getNextArrayKey( _a559, _k559 );
|
||||
}
|
||||
}
|
||||
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 );
|
||||
}
|
||||
}
|
167
patch_zm/maps/mp/gametypes_zm/_hud.gsc
Normal file
167
patch_zm/maps/mp/gametypes_zm/_hud.gsc
Normal file
@ -0,0 +1,167 @@
|
||||
|
||||
init()
|
||||
{
|
||||
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;
|
||||
_a103 = level.teams;
|
||||
_k103 = getFirstArrayKey( _a103 );
|
||||
while ( isDefined( _k103 ) )
|
||||
{
|
||||
team = _a103[ _k103 ];
|
||||
level.hud[ team ] = spawnstruct();
|
||||
_k103 = getNextArrayKey( _a103, _k103 );
|
||||
}
|
||||
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()
|
||||
{
|
||||
self.basefontscale = self.fontscale;
|
||||
self.maxfontscale = self.fontscale * 2;
|
||||
self.inframes = 1,5;
|
||||
self.outframes = 3;
|
||||
}
|
||||
|
||||
fontpulse( player )
|
||||
{
|
||||
self notify( "fontPulse" );
|
||||
self endon( "fontPulse" );
|
||||
self endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "joined_team" );
|
||||
player endon( "joined_spectators" );
|
||||
if ( self.outframes == 0 )
|
||||
{
|
||||
self.fontscale = 0,01;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.fontscale = self.fontscale;
|
||||
}
|
||||
if ( self.inframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.inframes * 0,05 );
|
||||
self.fontscale = self.maxfontscale;
|
||||
wait ( self.inframes * 0,05 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.fontscale = self.maxfontscale;
|
||||
self.alpha = 0;
|
||||
self fadeovertime( self.outframes * 0,05 );
|
||||
self.alpha = 1;
|
||||
}
|
||||
if ( self.outframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.outframes * 0,05 );
|
||||
self.fontscale = self.basefontscale;
|
||||
}
|
||||
}
|
||||
|
||||
fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername, n_sort )
|
||||
{
|
||||
if ( !isDefined( n_sort ) )
|
||||
{
|
||||
n_sort = 50;
|
||||
}
|
||||
wait startwait;
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen = newclienthudelem( self );
|
||||
}
|
||||
self.blackscreen.x = 0;
|
||||
self.blackscreen.y = 0;
|
||||
self.blackscreen.horzalign = "fullscreen";
|
||||
self.blackscreen.vertalign = "fullscreen";
|
||||
self.blackscreen.foreground = 0;
|
||||
self.blackscreen.hidewhendead = 0;
|
||||
self.blackscreen.hidewheninmenu = 1;
|
||||
self.blackscreen.sort = n_sort;
|
||||
if ( isDefined( shadername ) )
|
||||
{
|
||||
self.blackscreen setshader( shadername, 640, 480 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.blackscreen setshader( "black", 640, 480 );
|
||||
}
|
||||
self.blackscreen.alpha = 0;
|
||||
if ( fadeintime > 0 )
|
||||
{
|
||||
self.blackscreen fadeovertime( fadeintime );
|
||||
}
|
||||
self.blackscreen.alpha = 1;
|
||||
wait fadeintime;
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait blackscreenwait;
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( fadeouttime > 0 )
|
||||
{
|
||||
self.blackscreen fadeovertime( fadeouttime );
|
||||
}
|
||||
self.blackscreen.alpha = 0;
|
||||
wait fadeouttime;
|
||||
if ( isDefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen destroy();
|
||||
self.blackscreen = undefined;
|
||||
}
|
||||
}
|
1359
patch_zm/maps/mp/gametypes_zm/_hud_message.gsc
Normal file
1359
patch_zm/maps/mp/gametypes_zm/_hud_message.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1152
patch_zm/maps/mp/gametypes_zm/_hud_util.gsc
Normal file
1152
patch_zm/maps/mp/gametypes_zm/_hud_util.gsc
Normal file
File diff suppressed because it is too large
Load Diff
175
patch_zm/maps/mp/gametypes_zm/_menus.gsc
Normal file
175
patch_zm/maps/mp/gametypes_zm/_menus.gsc
Normal file
@ -0,0 +1,175 @@
|
||||
#include maps/mp/gametypes_zm/_rank;
|
||||
#include maps/mp/gametypes_zm/_globallogic;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init()
|
||||
{
|
||||
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";
|
||||
_a18 = level.teams;
|
||||
_k18 = getFirstArrayKey( _a18 );
|
||||
while ( isDefined( _k18 ) )
|
||||
{
|
||||
team = _a18[ _k18 ];
|
||||
game[ "menu_changeclass_" + team ] = "changeclass";
|
||||
_k18 = getNextArrayKey( _a18, _k18 );
|
||||
}
|
||||
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()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onmenuresponse();
|
||||
}
|
||||
}
|
||||
|
||||
onmenuresponse()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "menuresponse", menu, response );
|
||||
if ( response == "back" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
if ( level.console )
|
||||
{
|
||||
if ( game[ "menu_changeclass" ] != menu && game[ "menu_changeclass_offline" ] != menu || menu == game[ "menu_team" ] && menu == game[ "menu_controls" ] )
|
||||
{
|
||||
if ( isDefined( level.teams[ self.pers[ "team" ] ] ) )
|
||||
{
|
||||
self openmenu( game[ "menu_class" ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if ( response == "changeteam" && level.allow_teamchange == "1" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self openmenu( game[ "menu_team" ] );
|
||||
}
|
||||
if ( response == "changeclass_marines_splitscreen" )
|
||||
{
|
||||
self openmenu( "changeclass_marines_splitscreen" );
|
||||
}
|
||||
if ( response == "changeclass_opfor_splitscreen" )
|
||||
{
|
||||
self openmenu( "changeclass_opfor_splitscreen" );
|
||||
}
|
||||
if ( response == "endgame" )
|
||||
{
|
||||
if ( self issplitscreen() )
|
||||
{
|
||||
level.skipvote = 1;
|
||||
if ( !level.gameended )
|
||||
{
|
||||
level thread maps/mp/gametypes_zm/_globallogic::forceend();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if ( response == "killserverpc" )
|
||||
{
|
||||
level thread maps/mp/gametypes_zm/_globallogic::killserverpc();
|
||||
continue;
|
||||
}
|
||||
else if ( response == "endround" )
|
||||
{
|
||||
if ( !level.gameended )
|
||||
{
|
||||
level thread maps/mp/gametypes_zm/_globallogic::forceend();
|
||||
}
|
||||
else
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self iprintln( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else 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;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( game[ "menu_changeclass" ] != menu && game[ "menu_changeclass_offline" ] != menu && game[ "menu_changeclass_wager" ] != menu || 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 );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( menu == "spectate" )
|
||||
{
|
||||
player = getplayerfromclientnum( int( response ) );
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
self setcurrentspectatorclient( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
196
patch_zm/maps/mp/gametypes_zm/_perplayer.gsc
Normal file
196
patch_zm/maps/mp/gametypes_zm/_perplayer.gsc
Normal file
@ -0,0 +1,196 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
init( id, playerbegincallback, playerendcallback )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if ( handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
handler.enabled = 1;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
players[ i ].handlerflagval = level.handlerglobalflagval;
|
||||
i++;
|
||||
}
|
||||
players = handler.players;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].handlerflagval != level.handlerglobalflagval )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( players[ i ].handlers[ handler.id ].ready )
|
||||
{
|
||||
players[ i ] handleplayer( handler );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
disable( handler )
|
||||
{
|
||||
if ( !handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
handler.enabled = 0;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
players[ i ].handlerflagval = level.handlerglobalflagval;
|
||||
i++;
|
||||
}
|
||||
players = handler.players;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].handlerflagval != level.handlerglobalflagval )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( players[ i ].handlers[ handler.id ].ready )
|
||||
{
|
||||
players[ i ] unhandleplayer( handler, 0, 0 );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect( handler )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
newplayers = [];
|
||||
i = 0;
|
||||
while ( i < handler.players.size )
|
||||
{
|
||||
if ( handler.players[ i ] != self )
|
||||
{
|
||||
newplayers[ newplayers.size ] = handler.players[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
handler.players = newplayers;
|
||||
self thread unhandleplayer( handler, 1, 1 );
|
||||
}
|
||||
|
||||
onjoinedteam( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread handleplayer( handler );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
handleplayer( handler )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 );
|
||||
}
|
207
patch_zm/maps/mp/gametypes_zm/_serversettings.gsc
Normal file
207
patch_zm/maps/mp/gametypes_zm/_serversettings.gsc
Normal file
@ -0,0 +1,207 @@
|
||||
|
||||
init()
|
||||
{
|
||||
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()
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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;
|
||||
}
|
||||
else if ( gametype == "tdm" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( gametype == "ctf" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( gametype == "hq" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( gametype == "sd" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( gametype == "koth" )
|
||||
{
|
||||
if ( isDefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
constrainmapsize( mapsize )
|
||||
{
|
||||
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;
|
||||
}
|
||||
else if ( int( mapsize ) == 16 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( int( mapsize ) == 32 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( int( mapsize ) == 64 )
|
||||
{
|
||||
if ( isDefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" )
|
||||
{
|
||||
entity delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
1073
patch_zm/maps/mp/gametypes_zm/_spawning.gsc
Normal file
1073
patch_zm/maps/mp/gametypes_zm/_spawning.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2496
patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc
Normal file
2496
patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc
Normal file
File diff suppressed because it is too large
Load Diff
276
patch_zm/maps/mp/gametypes_zm/_spectating.gsc
Normal file
276
patch_zm/maps/mp/gametypes_zm/_spectating.gsc
Normal file
@ -0,0 +1,276 @@
|
||||
|
||||
init()
|
||||
{
|
||||
_a3 = level.teams;
|
||||
_k3 = getFirstArrayKey( _a3 );
|
||||
while ( isDefined( _k3 ) )
|
||||
{
|
||||
team = _a3[ _k3 ];
|
||||
level.spectateoverride[ team ] = spawnstruct();
|
||||
_k3 = getNextArrayKey( _a3, _k3 );
|
||||
}
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self setspectatepermissions();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self setspectatepermissionsformachine();
|
||||
}
|
||||
}
|
||||
|
||||
updatespectatesettings()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
level.players[ index ] setspectatepermissions();
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
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 self.sessionteam;
|
||||
}
|
||||
|
||||
otherlocalplayerstillalive()
|
||||
{
|
||||
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
|
||||
{
|
||||
if ( isalive( level.players[ index ] ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
allowspectateallteams( allow )
|
||||
{
|
||||
_a114 = level.teams;
|
||||
_k114 = getFirstArrayKey( _a114 );
|
||||
while ( isDefined( _k114 ) )
|
||||
{
|
||||
team = _a114[ _k114 ];
|
||||
self allowspectateteam( team, allow );
|
||||
_k114 = getNextArrayKey( _a114, _k114 );
|
||||
}
|
||||
}
|
||||
|
||||
allowspectateallteamsexceptteam( skip_team, allow )
|
||||
{
|
||||
_a122 = level.teams;
|
||||
_k122 = getFirstArrayKey( _a122 );
|
||||
while ( isDefined( _k122 ) )
|
||||
{
|
||||
team = _a122[ _k122 ];
|
||||
if ( team == skip_team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
self allowspectateteam( team, allow );
|
||||
}
|
||||
_k122 = getNextArrayKey( _a122, _k122 );
|
||||
}
|
||||
}
|
||||
|
||||
setspectatepermissions()
|
||||
{
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
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()
|
||||
{
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.players[ index ] setspectatepermissions();
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
394
patch_zm/maps/mp/gametypes_zm/_tweakables.gsc
Normal file
394
patch_zm/maps/mp/gametypes_zm/_tweakables.gsc
Normal file
@ -0,0 +1,394 @@
|
||||
#include maps/mp/_utility;
|
||||
|
||||
gettweakabledvarvalue( category, name )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
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:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registertweakable( category, name, dvar, value )
|
||||
{
|
||||
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()
|
||||
{
|
||||
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 )
|
||||
{
|
||||
level.clienttweakables[ level.clienttweakables.size ] = name;
|
||||
}
|
||||
|
||||
updateuitweakables()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
index = 0;
|
||||
while ( index < level.clienttweakables.size )
|
||||
{
|
||||
clienttweakable = level.clienttweakables[ index ];
|
||||
curvalue = gettweakabledvarvalue( "hud", clienttweakable );
|
||||
lastvalue = gettweakablelastvalue( "hud", clienttweakable );
|
||||
if ( curvalue != lastvalue )
|
||||
{
|
||||
updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue );
|
||||
settweakablelastvalue( "hud", clienttweakable, curvalue );
|
||||
}
|
||||
index++;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
updateserverdvar( dvar, value )
|
||||
{
|
||||
makedvarserverinfo( dvar, value );
|
||||
}
|
119
patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc
Normal file
119
patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc
Normal file
@ -0,0 +1,119 @@
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
isgrenadelauncherweapon( weapon )
|
||||
{
|
||||
if ( getsubstr( weapon, 0, 3 ) == "gl_" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
switch( weapon )
|
||||
{
|
||||
case "china_lake_mp":
|
||||
case "xm25_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isdumbrocketlauncherweapon( weapon )
|
||||
{
|
||||
switch( weapon )
|
||||
{
|
||||
case "m220_tow_mp":
|
||||
case "rpg_mp":
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
isguidedrocketlauncherweapon( weapon )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if ( isdumbrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isguidedrocketlauncherweapon( weapon ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
islauncherweapon( weapon )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ispistol( weapon )
|
||||
{
|
||||
return isDefined( level.side_arm_array[ weapon ] );
|
||||
}
|
||||
|
||||
isflashorstunweapon( weapon )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if ( isflashorstunweapon( weapon ) )
|
||||
{
|
||||
if ( meansofdeath != "MOD_GRENADE_SPLASH" )
|
||||
{
|
||||
return meansofdeath == "MOD_GAS";
|
||||
}
|
||||
}
|
||||
}
|
2435
patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc
Normal file
2435
patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2029
patch_zm/maps/mp/gametypes_zm/_weapons.gsc
Normal file
2029
patch_zm/maps/mp/gametypes_zm/_weapons.gsc
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user