mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 18:57:58 -05:00
[MP] Added remaining MP GSCs.
This commit is contained in:
@ -1,159 +1,149 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/killstreaks/_emp;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\killstreaks\_emp;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
#include maps\mp\gametypes\_globallogic_player;
|
||||
#include maps\mp\gametypes\_damagefeedback;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level._effect[ "acousticsensor_enemy_light" ] = loadfx( "misc/fx_equip_light_red" );
|
||||
level._effect[ "acousticsensor_friendly_light" ] = loadfx( "misc/fx_equip_light_green" );
|
||||
level._effect["acousticsensor_enemy_light"] = loadfx( "misc/fx_equip_light_red" );
|
||||
level._effect["acousticsensor_friendly_light"] = loadfx( "misc/fx_equip_light_green" );
|
||||
}
|
||||
|
||||
createacousticsensorwatcher() //checked matches cerberus output
|
||||
createacousticsensorwatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "acoustic_sensor", "acoustic_sensor_mp", self.team );
|
||||
watcher.onspawn = ::onspawnacousticsensor;
|
||||
watcher.detonate = ::acousticsensordetonate;
|
||||
watcher.stun = maps/mp/gametypes/_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 5;
|
||||
watcher.reconmodel = "t5_weapon_acoustic_sensor_world_detect";
|
||||
watcher.hackable = 1;
|
||||
watcher.ondamage = ::watchacousticsensordamage;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createuseweaponobjectwatcher( "acoustic_sensor", "acoustic_sensor_mp", self.team );
|
||||
watcher.onspawn = ::onspawnacousticsensor;
|
||||
watcher.detonate = ::acousticsensordetonate;
|
||||
watcher.stun = maps\mp\gametypes\_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 5;
|
||||
watcher.reconmodel = "t5_weapon_acoustic_sensor_world_detect";
|
||||
watcher.hackable = 1;
|
||||
watcher.ondamage = ::watchacousticsensordamage;
|
||||
}
|
||||
|
||||
onspawnacousticsensor( watcher, player ) //checked matches cerberus output
|
||||
onspawnacousticsensor( watcher, player )
|
||||
{
|
||||
self endon( "death" );
|
||||
self thread maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
player.acousticsensor = self;
|
||||
self setowner( player );
|
||||
self setteam( player.team );
|
||||
self.owner = player;
|
||||
self playloopsound( "fly_acoustic_sensor_lp" );
|
||||
if ( !self maps/mp/_utility::ishacked() )
|
||||
{
|
||||
player addweaponstat( "acoustic_sensor_mp", "used", 1 );
|
||||
}
|
||||
self thread watchshutdown( player, self.origin );
|
||||
self endon( "death" );
|
||||
self thread maps\mp\gametypes\_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
player.acousticsensor = self;
|
||||
self setowner( player );
|
||||
self setteam( player.team );
|
||||
self.owner = player;
|
||||
self playloopsound( "fly_acoustic_sensor_lp" );
|
||||
|
||||
if ( !self maps\mp\_utility::ishacked() )
|
||||
player addweaponstat( "acoustic_sensor_mp", "used", 1 );
|
||||
|
||||
self thread watchshutdown( player, self.origin );
|
||||
}
|
||||
|
||||
acousticsensordetonate( attacker, weaponname ) //checked matches cerberus output
|
||||
acousticsensordetonate( attacker, weaponname )
|
||||
{
|
||||
from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname );
|
||||
if ( !from_emp )
|
||||
{
|
||||
playfx( level._equipment_explode_fx, self.origin );
|
||||
}
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment( weaponname );
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_motion_sensor", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self destroyent();
|
||||
from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname );
|
||||
|
||||
if ( !from_emp )
|
||||
playfx( level._equipment_explode_fx, self.origin );
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedequipment( weaponname );
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_motion_sensor", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self destroyent();
|
||||
}
|
||||
|
||||
destroyent() //checked matches cerberus output
|
||||
destroyent()
|
||||
{
|
||||
self delete();
|
||||
self delete();
|
||||
}
|
||||
|
||||
watchshutdown( player, origin ) //checked matches cerberus output
|
||||
watchshutdown( player, origin )
|
||||
{
|
||||
self waittill_any( "death", "hacked" );
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
player.acousticsensor = undefined;
|
||||
}
|
||||
self waittill_any( "death", "hacked" );
|
||||
|
||||
if ( isdefined( player ) )
|
||||
player.acousticsensor = undefined;
|
||||
}
|
||||
|
||||
watchacousticsensordamage( watcher ) //checked changed to match cerberus output
|
||||
watchacousticsensordamage( watcher )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 100;
|
||||
if ( !self maps/mp/_utility::ishacked() )
|
||||
{
|
||||
self.damagetaken = 0;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
if ( !isDefined( attacker ) || !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( level.teambased && attacker.team == self.owner.team && attacker != self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
switch( weaponname )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
case "flash_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
{
|
||||
self thread maps/mp/gametypes/_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
}
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
else if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weaponname = "";
|
||||
}
|
||||
if ( isplayer( attacker ) && level.teambased && isDefined( attacker.team ) && self.owner.team == attacker.team && attacker != self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( type == "MOD_MELEE" )
|
||||
{
|
||||
self.damagetaken = damagemax;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damagetaken += damage;
|
||||
}
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0, attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 100;
|
||||
|
||||
if ( !self maps\mp\_utility::ishacked() )
|
||||
self.damagetaken = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
|
||||
if ( !isdefined( attacker ) || !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( level.teambased && attacker.team == self.owner.team && attacker != self.owner )
|
||||
continue;
|
||||
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
switch ( weaponname )
|
||||
{
|
||||
case "flash_grenade_mp":
|
||||
case "concussion_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
self thread maps\mp\gametypes\_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
else if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
weaponname = "";
|
||||
|
||||
if ( isplayer( attacker ) && level.teambased && isdefined( attacker.team ) && self.owner.team == attacker.team && attacker != self.owner )
|
||||
continue;
|
||||
|
||||
if ( type == "MOD_MELEE" )
|
||||
self.damagetaken = damagemax;
|
||||
else
|
||||
self.damagetaken += damage;
|
||||
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0.0, attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,3 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
|
@ -1,497 +1,447 @@
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
|
||||
main()
|
||||
{
|
||||
/#
|
||||
if ( getDvar( "scr_art_tweak" ) == "" || getDvar( "scr_art_tweak" ) == "0" )
|
||||
{
|
||||
setdvar( "scr_art_tweak", 0 );
|
||||
}
|
||||
if ( getDvar( "scr_dof_enable" ) == "" )
|
||||
{
|
||||
setdvar( "scr_dof_enable", "1" );
|
||||
}
|
||||
if ( getDvar( "scr_cinematic_autofocus" ) == "" )
|
||||
{
|
||||
setdvar( "scr_cinematic_autofocus", "1" );
|
||||
}
|
||||
if ( getDvar( "scr_art_visionfile" ) == "" && isDefined( level.script ) )
|
||||
{
|
||||
setdvar( "scr_art_visionfile", level.script );
|
||||
}
|
||||
if ( getDvar( "debug_reflection" ) == "" )
|
||||
{
|
||||
setdvar( "debug_reflection", "0" );
|
||||
}
|
||||
if ( getDvar( "debug_reflection_matte" ) == "" )
|
||||
{
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
}
|
||||
if ( getDvar( "debug_color_pallete" ) == "" )
|
||||
{
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
}
|
||||
precachemodel( "test_sphere_lambert" );
|
||||
precachemodel( "test_macbeth_chart" );
|
||||
precachemodel( "test_macbeth_chart_unlit" );
|
||||
precachemodel( "test_sphere_silver" );
|
||||
level thread debug_reflection();
|
||||
level thread debug_reflection_matte();
|
||||
level thread debug_color_pallete();
|
||||
if ( getdvar( "scr_art_tweak" ) == "" || getdvar( "scr_art_tweak" ) == "0" )
|
||||
setdvar( "scr_art_tweak", 0 );
|
||||
|
||||
if ( getdvar( "scr_dof_enable" ) == "" )
|
||||
setdvar( "scr_dof_enable", "1" );
|
||||
|
||||
if ( getdvar( "scr_cinematic_autofocus" ) == "" )
|
||||
setdvar( "scr_cinematic_autofocus", "1" );
|
||||
|
||||
if ( getdvar( "scr_art_visionfile" ) == "" && isdefined( level.script ) )
|
||||
setdvar( "scr_art_visionfile", level.script );
|
||||
|
||||
if ( getdvar( "debug_reflection" ) == "" )
|
||||
setdvar( "debug_reflection", "0" );
|
||||
|
||||
if ( getdvar( "debug_reflection_matte" ) == "" )
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
|
||||
if ( getdvar( "debug_color_pallete" ) == "" )
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
|
||||
precachemodel( "test_sphere_lambert" );
|
||||
precachemodel( "test_macbeth_chart" );
|
||||
precachemodel( "test_macbeth_chart_unlit" );
|
||||
precachemodel( "test_sphere_silver" );
|
||||
level thread debug_reflection();
|
||||
level thread debug_reflection_matte();
|
||||
level thread debug_color_pallete();
|
||||
#/
|
||||
if ( !isDefined( level.dofdefault ) )
|
||||
{
|
||||
level.dofdefault[ "nearStart" ] = 0;
|
||||
level.dofdefault[ "nearEnd" ] = 1;
|
||||
level.dofdefault[ "farStart" ] = 8000;
|
||||
level.dofdefault[ "farEnd" ] = 10000;
|
||||
level.dofdefault[ "nearBlur" ] = 6;
|
||||
level.dofdefault[ "farBlur" ] = 0;
|
||||
}
|
||||
level.curdof = ( level.dofdefault[ "farStart" ] - level.dofdefault[ "nearEnd" ] ) / 2;
|
||||
if ( !isdefined( level.dofdefault ) )
|
||||
{
|
||||
level.dofdefault["nearStart"] = 0;
|
||||
level.dofdefault["nearEnd"] = 1;
|
||||
level.dofdefault["farStart"] = 8000;
|
||||
level.dofdefault["farEnd"] = 10000;
|
||||
level.dofdefault["nearBlur"] = 6;
|
||||
level.dofdefault["farBlur"] = 0;
|
||||
}
|
||||
|
||||
level.curdof = ( level.dofdefault["farStart"] - level.dofdefault["nearEnd"] ) / 2;
|
||||
/#
|
||||
thread tweakart();
|
||||
thread tweakart();
|
||||
#/
|
||||
if ( !isDefined( level.script ) )
|
||||
{
|
||||
level.script = tolower( getDvar( "mapname" ) );
|
||||
}
|
||||
if ( !isdefined( level.script ) )
|
||||
level.script = tolower( getdvar( "mapname" ) );
|
||||
}
|
||||
|
||||
artfxprintln( file, string )
|
||||
{
|
||||
/#
|
||||
if ( file == -1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
fprintln( file, string );
|
||||
if ( file == -1 )
|
||||
return;
|
||||
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
|
||||
strtok_loc( string, par1 )
|
||||
{
|
||||
stringlist = [];
|
||||
indexstring = "";
|
||||
i = 0;
|
||||
while ( i < string.size )
|
||||
{
|
||||
if ( string[ i ] == " " )
|
||||
{
|
||||
stringlist[ stringlist.size ] = indexstring;
|
||||
indexstring = "";
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
indexstring += string[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( indexstring.size )
|
||||
{
|
||||
stringlist[ stringlist.size ] = indexstring;
|
||||
}
|
||||
return stringlist;
|
||||
stringlist = [];
|
||||
indexstring = "";
|
||||
|
||||
for ( i = 0; i < string.size; i++ )
|
||||
{
|
||||
if ( string[i] == " " )
|
||||
{
|
||||
stringlist[stringlist.size] = indexstring;
|
||||
indexstring = "";
|
||||
continue;
|
||||
}
|
||||
|
||||
indexstring += string[i];
|
||||
}
|
||||
|
||||
if ( indexstring.size )
|
||||
stringlist[stringlist.size] = indexstring;
|
||||
|
||||
return stringlist;
|
||||
}
|
||||
|
||||
setfogsliders()
|
||||
{
|
||||
fogall = strtok_loc( getDvar( "g_fogColorReadOnly" ), " " );
|
||||
red = fogall[ 0 ];
|
||||
green = fogall[ 1 ];
|
||||
blue = fogall[ 2 ];
|
||||
halfplane = getDvar( "g_fogHalfDistReadOnly" );
|
||||
nearplane = getDvar( "g_fogStartDistReadOnly" );
|
||||
if ( isDefined( red ) && isDefined( green ) || !isDefined( blue ) && !isDefined( halfplane ) )
|
||||
{
|
||||
red = 1;
|
||||
green = 1;
|
||||
blue = 1;
|
||||
halfplane = 10000001;
|
||||
nearplane = 10000000;
|
||||
}
|
||||
setdvar( "scr_fog_exp_halfplane", halfplane );
|
||||
setdvar( "scr_fog_nearplane", nearplane );
|
||||
setdvar( "scr_fog_color", ( red + " " ) + green + " " + blue );
|
||||
fogall = strtok_loc( getdvar( "g_fogColorReadOnly" ), " " );
|
||||
red = fogall[0];
|
||||
green = fogall[1];
|
||||
blue = fogall[2];
|
||||
halfplane = getdvar( "g_fogHalfDistReadOnly" );
|
||||
nearplane = getdvar( "g_fogStartDistReadOnly" );
|
||||
|
||||
if ( !isdefined( red ) || !isdefined( green ) || !isdefined( blue ) || !isdefined( halfplane ) )
|
||||
{
|
||||
red = 1;
|
||||
green = 1;
|
||||
blue = 1;
|
||||
halfplane = 10000001;
|
||||
nearplane = 10000000;
|
||||
}
|
||||
|
||||
setdvar( "scr_fog_exp_halfplane", halfplane );
|
||||
setdvar( "scr_fog_nearplane", nearplane );
|
||||
setdvar( "scr_fog_color", red + " " + green + " " + blue );
|
||||
}
|
||||
|
||||
tweakart()
|
||||
{
|
||||
/#
|
||||
if ( !isDefined( level.tweakfile ) )
|
||||
{
|
||||
level.tweakfile = 0;
|
||||
}
|
||||
if ( getDvar( "scr_fog_baseheight" ) == "" )
|
||||
{
|
||||
setdvar( "scr_fog_exp_halfplane", "500" );
|
||||
setdvar( "scr_fog_exp_halfheight", "500" );
|
||||
setdvar( "scr_fog_nearplane", "0" );
|
||||
setdvar( "scr_fog_baseheight", "0" );
|
||||
}
|
||||
setdvar( "scr_fog_fraction", "1.0" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault[ "nearStart" ] );
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault[ "nearEnd" ] );
|
||||
setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] );
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault[ "farEnd" ] );
|
||||
setdvar( "scr_dof_nearBlur", level.dofdefault[ "nearBlur" ] );
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault[ "farBlur" ] );
|
||||
file = undefined;
|
||||
filename = undefined;
|
||||
tweak_toggle = 1;
|
||||
for ( ;; )
|
||||
{
|
||||
while ( getDvarInt( "scr_art_tweak" ) == 0 )
|
||||
{
|
||||
tweak_toggle = 1;
|
||||
wait 0,05;
|
||||
}
|
||||
if ( tweak_toggle )
|
||||
{
|
||||
tweak_toggle = 0;
|
||||
fogsettings = getfogsettings();
|
||||
setdvar( "scr_fog_nearplane", fogsettings[ 0 ] );
|
||||
setdvar( "scr_fog_exp_halfplane", fogsettings[ 1 ] );
|
||||
setdvar( "scr_fog_exp_halfheight", fogsettings[ 3 ] );
|
||||
setdvar( "scr_fog_baseheight", fogsettings[ 2 ] );
|
||||
setdvar( "scr_fog_color", fogsettings[ 4 ] + " " + fogsettings[ 5 ] + " " + fogsettings[ 6 ] );
|
||||
setdvar( "scr_fog_color_scale", fogsettings[ 7 ] );
|
||||
setdvar( "scr_sun_fog_color", fogsettings[ 8 ] + " " + fogsettings[ 9 ] + " " + fogsettings[ 10 ] );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[ 0 ] = fogsettings[ 11 ];
|
||||
level.fogsundir[ 1 ] = fogsettings[ 12 ];
|
||||
level.fogsundir[ 2 ] = fogsettings[ 13 ];
|
||||
setdvar( "scr_sun_fog_start_angle", fogsettings[ 14 ] );
|
||||
setdvar( "scr_sun_fog_end_angle", fogsettings[ 15 ] );
|
||||
setdvar( "scr_fog_max_opacity", fogsettings[ 16 ] );
|
||||
}
|
||||
level.fogexphalfplane = getDvarFloat( "scr_fog_exp_halfplane" );
|
||||
level.fogexphalfheight = getDvarFloat( "scr_fog_exp_halfheight" );
|
||||
level.fognearplane = getDvarFloat( "scr_fog_nearplane" );
|
||||
level.fogbaseheight = getDvarFloat( "scr_fog_baseheight" );
|
||||
level.fogcolorred = getDvarColorRed( "scr_fog_color" );
|
||||
level.fogcolorgreen = getDvarColorGreen( "scr_fog_color" );
|
||||
level.fogcolorblue = getDvarColorBlue( "scr_fog_color" );
|
||||
level.fogcolorscale = getDvarFloat( "scr_fog_color_scale" );
|
||||
level.sunfogcolorred = getDvarColorRed( "scr_sun_fog_color" );
|
||||
level.sunfogcolorgreen = getDvarColorGreen( "scr_sun_fog_color" );
|
||||
level.sunfogcolorblue = getDvarColorBlue( "scr_sun_fog_color" );
|
||||
level.sunstartangle = getDvarFloat( "scr_sun_fog_start_angle" );
|
||||
level.sunendangle = getDvarFloat( "scr_sun_fog_end_angle" );
|
||||
level.fogmaxopacity = getDvarFloat( "scr_fog_max_opacity" );
|
||||
if ( getDvarInt( "scr_art_sun_fog_dir_set" ) )
|
||||
{
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
println( "Setting sun fog direction to facing of player" );
|
||||
players = get_players();
|
||||
dir = vectornormalize( anglesToForward( players[ 0 ] getplayerangles() ) );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[ 0 ] = dir[ 0 ];
|
||||
level.fogsundir[ 1 ] = dir[ 1 ];
|
||||
level.fogsundir[ 2 ] = dir[ 2 ];
|
||||
}
|
||||
fovslidercheck();
|
||||
dumpsettings();
|
||||
if ( !getDvarInt( "scr_fog_disable" ) )
|
||||
{
|
||||
if ( !isDefined( level.fogsundir ) )
|
||||
{
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[ 0 ] = 1;
|
||||
level.fogsundir[ 1 ] = 0;
|
||||
level.fogsundir[ 2 ] = 0;
|
||||
}
|
||||
setvolfog( level.fognearplane, level.fogexphalfplane, level.fogexphalfheight, level.fogbaseheight, level.fogcolorred, level.fogcolorgreen, level.fogcolorblue, level.fogcolorscale, level.sunfogcolorred, level.sunfogcolorgreen, level.sunfogcolorblue, level.fogsundir[ 0 ], level.fogsundir[ 1 ], level.fogsundir[ 2 ], level.sunstartangle, level.sunendangle, 0, level.fogmaxopacity );
|
||||
}
|
||||
else
|
||||
{
|
||||
setexpfog( 100000000, 100000001, 0, 0, 0, 0 );
|
||||
}
|
||||
wait 0,1;
|
||||
if ( !isdefined( level.tweakfile ) )
|
||||
level.tweakfile = 0;
|
||||
|
||||
if ( getdvar( "scr_fog_baseheight" ) == "" )
|
||||
{
|
||||
setdvar( "scr_fog_exp_halfplane", "500" );
|
||||
setdvar( "scr_fog_exp_halfheight", "500" );
|
||||
setdvar( "scr_fog_nearplane", "0" );
|
||||
setdvar( "scr_fog_baseheight", "0" );
|
||||
}
|
||||
|
||||
setdvar( "scr_fog_fraction", "1.0" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault["nearStart"] );
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault["nearEnd"] );
|
||||
setdvar( "scr_dof_farStart", level.dofdefault["farStart"] );
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault["farEnd"] );
|
||||
setdvar( "scr_dof_nearBlur", level.dofdefault["nearBlur"] );
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault["farBlur"] );
|
||||
file = undefined;
|
||||
filename = undefined;
|
||||
tweak_toggle = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while ( getdvarint( "scr_art_tweak" ) == 0 )
|
||||
{
|
||||
tweak_toggle = 1;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
if ( tweak_toggle )
|
||||
{
|
||||
tweak_toggle = 0;
|
||||
fogsettings = getfogsettings();
|
||||
setdvar( "scr_fog_nearplane", fogsettings[0] );
|
||||
setdvar( "scr_fog_exp_halfplane", fogsettings[1] );
|
||||
setdvar( "scr_fog_exp_halfheight", fogsettings[3] );
|
||||
setdvar( "scr_fog_baseheight", fogsettings[2] );
|
||||
setdvar( "scr_fog_color", fogsettings[4] + " " + fogsettings[5] + " " + fogsettings[6] );
|
||||
setdvar( "scr_fog_color_scale", fogsettings[7] );
|
||||
setdvar( "scr_sun_fog_color", fogsettings[8] + " " + fogsettings[9] + " " + fogsettings[10] );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[0] = fogsettings[11];
|
||||
level.fogsundir[1] = fogsettings[12];
|
||||
level.fogsundir[2] = fogsettings[13];
|
||||
setdvar( "scr_sun_fog_start_angle", fogsettings[14] );
|
||||
setdvar( "scr_sun_fog_end_angle", fogsettings[15] );
|
||||
setdvar( "scr_fog_max_opacity", fogsettings[16] );
|
||||
}
|
||||
|
||||
level.fogexphalfplane = getdvarfloat( "scr_fog_exp_halfplane" );
|
||||
level.fogexphalfheight = getdvarfloat( "scr_fog_exp_halfheight" );
|
||||
level.fognearplane = getdvarfloat( "scr_fog_nearplane" );
|
||||
level.fogbaseheight = getdvarfloat( "scr_fog_baseheight" );
|
||||
level.fogcolorred = getdvarcolorred( "scr_fog_color" );
|
||||
level.fogcolorgreen = getdvarcolorgreen( "scr_fog_color" );
|
||||
level.fogcolorblue = getdvarcolorblue( "scr_fog_color" );
|
||||
level.fogcolorscale = getdvarfloat( "scr_fog_color_scale" );
|
||||
level.sunfogcolorred = getdvarcolorred( "scr_sun_fog_color" );
|
||||
level.sunfogcolorgreen = getdvarcolorgreen( "scr_sun_fog_color" );
|
||||
level.sunfogcolorblue = getdvarcolorblue( "scr_sun_fog_color" );
|
||||
level.sunstartangle = getdvarfloat( "scr_sun_fog_start_angle" );
|
||||
level.sunendangle = getdvarfloat( "scr_sun_fog_end_angle" );
|
||||
level.fogmaxopacity = getdvarfloat( "scr_fog_max_opacity" );
|
||||
|
||||
if ( getdvarint( "scr_art_sun_fog_dir_set" ) )
|
||||
{
|
||||
setdvar( "scr_art_sun_fog_dir_set", "0" );
|
||||
println( "Setting sun fog direction to facing of player" );
|
||||
players = get_players();
|
||||
dir = vectornormalize( anglestoforward( players[0] getplayerangles() ) );
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[0] = dir[0];
|
||||
level.fogsundir[1] = dir[1];
|
||||
level.fogsundir[2] = dir[2];
|
||||
}
|
||||
|
||||
fovslidercheck();
|
||||
dumpsettings();
|
||||
|
||||
if ( !getdvarint( _hash_DBBD8F3B ) )
|
||||
{
|
||||
if ( !isdefined( level.fogsundir ) )
|
||||
{
|
||||
level.fogsundir = [];
|
||||
level.fogsundir[0] = 1;
|
||||
level.fogsundir[1] = 0;
|
||||
level.fogsundir[2] = 0;
|
||||
}
|
||||
|
||||
setvolfog( level.fognearplane, level.fogexphalfplane, level.fogexphalfheight, level.fogbaseheight, level.fogcolorred, level.fogcolorgreen, level.fogcolorblue, level.fogcolorscale, level.sunfogcolorred, level.sunfogcolorgreen, level.sunfogcolorblue, level.fogsundir[0], level.fogsundir[1], level.fogsundir[2], level.sunstartangle, level.sunendangle, 0, level.fogmaxopacity );
|
||||
}
|
||||
else
|
||||
setexpfog( 100000000, 100000001, 0, 0, 0, 0 );
|
||||
|
||||
wait 0.1;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
fovslidercheck()
|
||||
{
|
||||
if ( level.dofdefault[ "nearStart" ] >= level.dofdefault[ "nearEnd" ] )
|
||||
{
|
||||
level.dofdefault[ "nearStart" ] = level.dofdefault[ "nearEnd" ] - 1;
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault[ "nearStart" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "nearEnd" ] <= level.dofdefault[ "nearStart" ] )
|
||||
{
|
||||
level.dofdefault[ "nearEnd" ] = level.dofdefault[ "nearStart" ] + 1;
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault[ "nearEnd" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farStart" ] >= level.dofdefault[ "farEnd" ] )
|
||||
{
|
||||
level.dofdefault[ "farStart" ] = level.dofdefault[ "farEnd" ] - 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farEnd" ] <= level.dofdefault[ "farStart" ] )
|
||||
{
|
||||
level.dofdefault[ "farEnd" ] = level.dofdefault[ "farStart" ] + 1;
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault[ "farEnd" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farBlur" ] >= level.dofdefault[ "nearBlur" ] )
|
||||
{
|
||||
level.dofdefault[ "farBlur" ] = level.dofdefault[ "nearBlur" ] - 0,1;
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault[ "farBlur" ] );
|
||||
}
|
||||
if ( level.dofdefault[ "farStart" ] <= level.dofdefault[ "nearEnd" ] )
|
||||
{
|
||||
level.dofdefault[ "farStart" ] = level.dofdefault[ "nearEnd" ] + 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] );
|
||||
}
|
||||
if ( level.dofdefault["nearStart"] >= level.dofdefault["nearEnd"] )
|
||||
{
|
||||
level.dofdefault["nearStart"] = level.dofdefault["nearEnd"] - 1;
|
||||
setdvar( "scr_dof_nearStart", level.dofdefault["nearStart"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["nearEnd"] <= level.dofdefault["nearStart"] )
|
||||
{
|
||||
level.dofdefault["nearEnd"] = level.dofdefault["nearStart"] + 1;
|
||||
setdvar( "scr_dof_nearEnd", level.dofdefault["nearEnd"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farStart"] >= level.dofdefault["farEnd"] )
|
||||
{
|
||||
level.dofdefault["farStart"] = level.dofdefault["farEnd"] - 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault["farStart"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farEnd"] <= level.dofdefault["farStart"] )
|
||||
{
|
||||
level.dofdefault["farEnd"] = level.dofdefault["farStart"] + 1;
|
||||
setdvar( "scr_dof_farEnd", level.dofdefault["farEnd"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farBlur"] >= level.dofdefault["nearBlur"] )
|
||||
{
|
||||
level.dofdefault["farBlur"] = level.dofdefault["nearBlur"] - 0.1;
|
||||
setdvar( "scr_dof_farBlur", level.dofdefault["farBlur"] );
|
||||
}
|
||||
|
||||
if ( level.dofdefault["farStart"] <= level.dofdefault["nearEnd"] )
|
||||
{
|
||||
level.dofdefault["farStart"] = level.dofdefault["nearEnd"] + 1;
|
||||
setdvar( "scr_dof_farStart", level.dofdefault["farStart"] );
|
||||
}
|
||||
}
|
||||
|
||||
dumpsettings()
|
||||
{
|
||||
/#
|
||||
if ( getDvar( "scr_art_dump" ) != "0" )
|
||||
{
|
||||
println( "\tstart_dist = " + level.fognearplane + ";" );
|
||||
println( "\thalf_dist = " + level.fogexphalfplane + ";" );
|
||||
println( "\thalf_height = " + level.fogexphalfheight + ";" );
|
||||
println( "\tbase_height = " + level.fogbaseheight + ";" );
|
||||
println( "\tfog_r = " + level.fogcolorred + ";" );
|
||||
println( "\tfog_g = " + level.fogcolorgreen + ";" );
|
||||
println( "\tfog_b = " + level.fogcolorblue + ";" );
|
||||
println( "\tfog_scale = " + level.fogcolorscale + ";" );
|
||||
println( "\tsun_col_r = " + level.sunfogcolorred + ";" );
|
||||
println( "\tsun_col_g = " + level.sunfogcolorgreen + ";" );
|
||||
println( "\tsun_col_b = " + level.sunfogcolorblue + ";" );
|
||||
println( "\tsun_dir_x = " + level.fogsundir[ 0 ] + ";" );
|
||||
println( "\tsun_dir_y = " + level.fogsundir[ 1 ] + ";" );
|
||||
println( "\tsun_dir_z = " + level.fogsundir[ 2 ] + ";" );
|
||||
println( "\tsun_start_ang = " + level.sunstartangle + ";" );
|
||||
println( "\tsun_stop_ang = " + level.sunendangle + ";" );
|
||||
println( "\ttime = 0;" );
|
||||
println( "\tmax_fog_opacity = " + level.fogmaxopacity + ";" );
|
||||
println( "" );
|
||||
println( "\tsetVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale," );
|
||||
println( "\t\tsun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, " );
|
||||
println( "\t\tsun_stop_ang, time, max_fog_opacity);" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
if ( getdvar( "scr_art_dump" ) != "0" )
|
||||
{
|
||||
println( "\tstart_dist = " + level.fognearplane + ";" );
|
||||
println( "\thalf_dist = " + level.fogexphalfplane + ";" );
|
||||
println( "\thalf_height = " + level.fogexphalfheight + ";" );
|
||||
println( "\tbase_height = " + level.fogbaseheight + ";" );
|
||||
println( "\tfog_r = " + level.fogcolorred + ";" );
|
||||
println( "\tfog_g = " + level.fogcolorgreen + ";" );
|
||||
println( "\tfog_b = " + level.fogcolorblue + ";" );
|
||||
println( "\tfog_scale = " + level.fogcolorscale + ";" );
|
||||
println( "\tsun_col_r = " + level.sunfogcolorred + ";" );
|
||||
println( "\tsun_col_g = " + level.sunfogcolorgreen + ";" );
|
||||
println( "\tsun_col_b = " + level.sunfogcolorblue + ";" );
|
||||
println( "\tsun_dir_x = " + level.fogsundir[0] + ";" );
|
||||
println( "\tsun_dir_y = " + level.fogsundir[1] + ";" );
|
||||
println( "\tsun_dir_z = " + level.fogsundir[2] + ";" );
|
||||
println( "\tsun_start_ang = " + level.sunstartangle + ";" );
|
||||
println( "\tsun_stop_ang = " + level.sunendangle + ";" );
|
||||
println( "\ttime = 0;" );
|
||||
println( "\tmax_fog_opacity = " + level.fogmaxopacity + ";" );
|
||||
println( "" );
|
||||
println( "\tsetVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale," );
|
||||
println( "\t\tsun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, " );
|
||||
println( "\t\tsun_stop_ang, time, max_fog_opacity);" );
|
||||
setdvar( "scr_art_dump", "0" );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_reflection()
|
||||
{
|
||||
/#
|
||||
level.debug_reflection = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
if ( getDvar( "debug_reflection" ) == "2" || level.debug_reflection != 2 && getDvar( "debug_reflection" ) == "3" && level.debug_reflection != 3 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
if ( getDvar( "debug_reflection" ) == "2" )
|
||||
{
|
||||
create_reflection_objects();
|
||||
level.debug_reflection = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
create_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 3;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_reflection" ) == "1" && level.debug_reflection != 1 )
|
||||
{
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_reflection" ) == "0" && level.debug_reflection != 0 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
level.debug_reflection = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for ( level.debug_reflection = 0; 1; level.debug_reflection = 0 )
|
||||
{
|
||||
wait 0.1;
|
||||
asm_cond( getdvar( "debug_reflection" ) == "2" && level.debug_reflection != 2 || getdvar( "debug_reflection" ) == "3" && level.debug_reflection != 3, loc_1498 );
|
||||
remove_reflection_objects();
|
||||
asm_cond( getdvar( "debug_reflection" ) == "2", loc_147C );
|
||||
create_reflection_objects();
|
||||
level.debug_reflection = 2;
|
||||
asm_jump( loc_1495 );
|
||||
create_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 3;
|
||||
asm_jump( loc_1517 );
|
||||
asm_cond( getdvar( "debug_reflection" ) == "1" && level.debug_reflection != 1, loc_14EC );
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object();
|
||||
level.debug_reflection = 1;
|
||||
asm_jump( loc_1517 );
|
||||
asm_cond( getdvar( "debug_reflection" ) == "0" && level.debug_reflection != 0, loc_1517 );
|
||||
remove_reflection_objects();
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
remove_reflection_objects()
|
||||
{
|
||||
/#
|
||||
if ( level.debug_reflection != 2 && level.debug_reflection == 3 && isDefined( level.debug_reflection_objects ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level.debug_reflection_objects.size )
|
||||
{
|
||||
level.debug_reflection_objects[ i ] delete();
|
||||
i++;
|
||||
}
|
||||
level.debug_reflection_objects = undefined;
|
||||
}
|
||||
if ( level.debug_reflection != 1 && level.debug_reflection != 3 && level.debug_reflection_matte != 1 || level.debug_color_pallete == 1 && level.debug_color_pallete == 2 )
|
||||
{
|
||||
if ( isDefined( level.debug_reflectionobject ) )
|
||||
{
|
||||
level.debug_reflectionobject delete();
|
||||
if ( ( level.debug_reflection == 2 || level.debug_reflection == 3 ) && isdefined( level.debug_reflection_objects ) )
|
||||
{
|
||||
for ( i = 0; i < level.debug_reflection_objects.size; i++ )
|
||||
level.debug_reflection_objects[i] delete();
|
||||
|
||||
level.debug_reflection_objects = undefined;
|
||||
}
|
||||
|
||||
if ( level.debug_reflection == 1 || level.debug_reflection == 3 || level.debug_reflection_matte == 1 || level.debug_color_pallete == 1 || level.debug_color_pallete == 2 )
|
||||
{
|
||||
if ( isdefined( level.debug_reflectionobject ) )
|
||||
level.debug_reflectionobject delete();
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
create_reflection_objects()
|
||||
{
|
||||
/#
|
||||
reflection_locs = getreflectionlocs();
|
||||
i = 0;
|
||||
while ( i < reflection_locs.size )
|
||||
{
|
||||
level.debug_reflection_objects[ i ] = spawn( "script_model", reflection_locs[ i ] );
|
||||
level.debug_reflection_objects[ i ] setmodel( "test_sphere_silver" );
|
||||
i++;
|
||||
reflection_locs = getreflectionlocs();
|
||||
|
||||
for ( i = 0; i < reflection_locs.size; i++ )
|
||||
{
|
||||
level.debug_reflection_objects[i] = spawn( "script_model", reflection_locs[i] );
|
||||
level.debug_reflection_objects[i] setmodel( "test_sphere_silver" );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
create_reflection_object( model )
|
||||
{
|
||||
if ( !isDefined( model ) )
|
||||
{
|
||||
model = "test_sphere_silver";
|
||||
}
|
||||
if ( !isdefined( model ) )
|
||||
model = "test_sphere_silver";
|
||||
/#
|
||||
if ( isDefined( level.debug_reflectionobject ) )
|
||||
{
|
||||
level.debug_reflectionobject delete();
|
||||
}
|
||||
players = get_players();
|
||||
player = players[ 0 ];
|
||||
level.debug_reflectionobject = spawn( "script_model", player geteye() + vectorScale( anglesToForward( player.angles ), 100 ) );
|
||||
level.debug_reflectionobject setmodel( model );
|
||||
level.debug_reflectionobject.origin = player geteye() + vectorScale( anglesToForward( player getplayerangles() ), 100 );
|
||||
level.debug_reflectionobject linkto( player );
|
||||
thread debug_reflection_buttons();
|
||||
if ( isdefined( level.debug_reflectionobject ) )
|
||||
level.debug_reflectionobject delete();
|
||||
|
||||
players = get_players();
|
||||
player = players[0];
|
||||
level.debug_reflectionobject = spawn( "script_model", player geteye() + vectorscale( anglestoforward( player.angles ), 100 ) );
|
||||
level.debug_reflectionobject setmodel( model );
|
||||
level.debug_reflectionobject.origin = player geteye() + vectorscale( anglestoforward( player getplayerangles() ), 100 );
|
||||
level.debug_reflectionobject linkto( player );
|
||||
thread debug_reflection_buttons();
|
||||
#/
|
||||
}
|
||||
|
||||
debug_reflection_buttons()
|
||||
{
|
||||
/#
|
||||
level notify( "new_reflection_button_running" );
|
||||
level endon( "new_reflection_button_running" );
|
||||
level.debug_reflectionobject endon( "death" );
|
||||
offset = 100;
|
||||
lastoffset = offset;
|
||||
while ( getDvar( "debug_reflection" ) != "1" && getDvar( "debug_reflection" ) != "3" && getDvar( "debug_reflection_matte" ) != "1" || getDvar( "debug_color_pallete" ) == "1" && getDvar( "debug_color_pallete" ) == "2" )
|
||||
{
|
||||
players = get_players();
|
||||
if ( players[ 0 ] buttonpressed( "BUTTON_X" ) )
|
||||
{
|
||||
offset += 50;
|
||||
}
|
||||
if ( players[ 0 ] buttonpressed( "BUTTON_Y" ) )
|
||||
{
|
||||
offset -= 50;
|
||||
}
|
||||
if ( offset > 1000 )
|
||||
{
|
||||
offset = 1000;
|
||||
}
|
||||
if ( offset < 64 )
|
||||
{
|
||||
offset = 64;
|
||||
}
|
||||
level.debug_reflectionobject unlink();
|
||||
level.debug_reflectionobject.origin = players[ 0 ] geteye() + vectorScale( anglesToForward( players[ 0 ] getplayerangles() ), offset );
|
||||
temp_angles = vectorToAngle( players[ 0 ].origin - level.debug_reflectionobject.origin );
|
||||
level.debug_reflectionobject.angles = ( 0, temp_angles[ 1 ], 0 );
|
||||
lastoffset = offset;
|
||||
line( level.debug_reflectionobject.origin, getreflectionorigin( level.debug_reflectionobject.origin ), ( 1, 0, 0 ), 1, 1 );
|
||||
wait 0,05;
|
||||
if ( isDefined( level.debug_reflectionobject ) )
|
||||
{
|
||||
level.debug_reflectionobject linkto( players[ 0 ] );
|
||||
}
|
||||
level notify( "new_reflection_button_running" );
|
||||
level endon( "new_reflection_button_running" );
|
||||
level.debug_reflectionobject endon( "death" );
|
||||
offset = 100;
|
||||
lastoffset = offset;
|
||||
|
||||
while ( getdvar( "debug_reflection" ) == "1" || getdvar( "debug_reflection" ) == "3" || getdvar( "debug_reflection_matte" ) == "1" || getdvar( "debug_color_pallete" ) == "1" || getdvar( "debug_color_pallete" ) == "2" )
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
if ( players[0] buttonpressed( "BUTTON_X" ) )
|
||||
offset += 50;
|
||||
|
||||
if ( players[0] buttonpressed( "BUTTON_Y" ) )
|
||||
offset -= 50;
|
||||
|
||||
if ( offset > 1000 )
|
||||
offset = 1000;
|
||||
|
||||
if ( offset < 64 )
|
||||
offset = 64;
|
||||
|
||||
level.debug_reflectionobject unlink();
|
||||
level.debug_reflectionobject.origin = players[0] geteye() + vectorscale( anglestoforward( players[0] getplayerangles() ), offset );
|
||||
temp_angles = vectortoangles( players[0].origin - level.debug_reflectionobject.origin );
|
||||
level.debug_reflectionobject.angles = ( 0, temp_angles[1], 0 );
|
||||
lastoffset = offset;
|
||||
line( level.debug_reflectionobject.origin, getreflectionorigin( level.debug_reflectionobject.origin ), ( 1, 0, 0 ), 1, 1 );
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( level.debug_reflectionobject ) )
|
||||
level.debug_reflectionobject linkto( players[0] );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_reflection_matte()
|
||||
{
|
||||
/#
|
||||
level.debug_reflection_matte = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
if ( getDvar( "debug_reflection_matte" ) == "1" && level.debug_reflection_matte != 1 )
|
||||
{
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_sphere_lambert" );
|
||||
level.debug_reflection_matte = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_reflection_matte" ) == "0" && level.debug_reflection_matte != 0 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
level.debug_reflection_matte = 0;
|
||||
}
|
||||
}
|
||||
for ( level.debug_reflection_matte = 0; 1; level.debug_reflection_matte = 0 )
|
||||
{
|
||||
wait 0.1;
|
||||
asm_cond( getdvar( "debug_reflection_matte" ) == "1" && level.debug_reflection_matte != 1, loc_18DC );
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_color_pallete", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_sphere_lambert" );
|
||||
level.debug_reflection_matte = 1;
|
||||
asm_jump( loc_1907 );
|
||||
asm_cond( getdvar( "debug_reflection_matte" ) == "0" && level.debug_reflection_matte != 0, loc_1907 );
|
||||
remove_reflection_objects();
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_color_pallete()
|
||||
{
|
||||
/#
|
||||
level.debug_color_pallete = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,1;
|
||||
if ( getDvar( "debug_color_pallete" ) == "1" && level.debug_color_pallete != 1 )
|
||||
{
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart" );
|
||||
level.debug_color_pallete = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_color_pallete" ) == "2" && level.debug_color_pallete != 2 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart_unlit" );
|
||||
level.debug_color_pallete = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvar( "debug_color_pallete" ) == "0" && level.debug_color_pallete != 0 )
|
||||
{
|
||||
remove_reflection_objects();
|
||||
level.debug_color_pallete = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for ( level.debug_color_pallete = 0; 1; level.debug_color_pallete = 0 )
|
||||
{
|
||||
wait 0.1;
|
||||
asm_cond( getdvar( "debug_color_pallete" ) == "1" && level.debug_color_pallete != 1, loc_1980 );
|
||||
setdvar( "debug_reflection", "0" );
|
||||
setdvar( "debug_reflection_matte", "0" );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart" );
|
||||
level.debug_color_pallete = 1;
|
||||
asm_jump( loc_19E7 );
|
||||
asm_cond( getdvar( "debug_color_pallete" ) == "2" && level.debug_color_pallete != 2, loc_19BC );
|
||||
remove_reflection_objects();
|
||||
create_reflection_object( "test_macbeth_chart_unlit" );
|
||||
level.debug_color_pallete = 2;
|
||||
asm_jump( loc_19E7 );
|
||||
asm_cond( getdvar( "debug_color_pallete" ) == "0" && level.debug_color_pallete != 0, loc_19E7 );
|
||||
remove_reflection_objects();
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,143 +1,139 @@
|
||||
//checked includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
wait_until_first_player() //checked changed to match cerberus output
|
||||
wait_until_first_player()
|
||||
{
|
||||
players = get_players();
|
||||
if ( !isDefined( players[ 0 ] ) )
|
||||
{
|
||||
level waittill( "first_player_ready" );
|
||||
}
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ] thread monitor_player_sprint();
|
||||
}
|
||||
players = get_players();
|
||||
|
||||
if ( !isdefined( players[0] ) )
|
||||
level waittill( "first_player_ready" );
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
players[i] thread monitor_player_sprint();
|
||||
}
|
||||
|
||||
stand_think( trig ) //checked matches cerberus output
|
||||
stand_think( trig )
|
||||
{
|
||||
killtext = "kill_stand_think" + trig getentitynumber();
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( killtext );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self.player_is_moving )
|
||||
{
|
||||
trig playsound( trig.script_label );
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
killtext = "kill_stand_think" + trig getentitynumber();
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( killtext );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( self.player_is_moving )
|
||||
trig playsound( trig.script_label );
|
||||
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
monitor_player_sprint() //checked matches cerberus output
|
||||
monitor_player_sprint()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread monitor_player_movement();
|
||||
self._is_sprinting = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "sprint_begin" );
|
||||
self._is_sprinting = 1;
|
||||
self waittill( "sprint_end" );
|
||||
self._is_sprinting = 0;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self thread monitor_player_movement();
|
||||
|
||||
for ( self._is_sprinting = 0; 1; self._is_sprinting = 0 )
|
||||
{
|
||||
self waittill( "sprint_begin" );
|
||||
|
||||
self._is_sprinting = 1;
|
||||
|
||||
self waittill( "sprint_end" );
|
||||
}
|
||||
}
|
||||
|
||||
monitor_player_movement() //checked matches cerberus output
|
||||
monitor_player_movement()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
org_1 = self.origin;
|
||||
wait 1;
|
||||
org_2 = self.origin;
|
||||
distancemoved = distancesquared( org_1, org_2 );
|
||||
if ( distancemoved > 4096 )
|
||||
{
|
||||
self.player_is_moving = 1;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.player_is_moving = 0;
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
org_1 = self.origin;
|
||||
wait 1.0;
|
||||
org_2 = self.origin;
|
||||
distancemoved = distancesquared( org_1, org_2 );
|
||||
|
||||
if ( distancemoved > 4096 )
|
||||
self.player_is_moving = 1;
|
||||
else
|
||||
self.player_is_moving = 0;
|
||||
}
|
||||
}
|
||||
|
||||
thread_enter_exit_sound( trig ) //checked matches cerberus output
|
||||
thread_enter_exit_sound( trig )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
trig.touchingplayers[ self getentitynumber() ] = 1;
|
||||
if ( isDefined( trig.script_sound ) && trig.script_activated && self._is_sprinting )
|
||||
{
|
||||
self playsound( trig.script_sound );
|
||||
}
|
||||
self thread stand_think( trig );
|
||||
while ( self istouching( trig ) )
|
||||
{
|
||||
wait 0.1;
|
||||
}
|
||||
self notify( "kill_stand_think" + trig getentitynumber() );
|
||||
self playsound( trig.script_noteworthy );
|
||||
trig.touchingplayers[ self getentitynumber() ] = 0;
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
trig.touchingplayers[self getentitynumber()] = 1;
|
||||
|
||||
if ( isdefined( trig.script_sound ) && trig.script_activated && self._is_sprinting )
|
||||
self playsound( trig.script_sound );
|
||||
|
||||
self thread stand_think( trig );
|
||||
|
||||
while ( self istouching( trig ) )
|
||||
wait 0.1;
|
||||
|
||||
self notify( "kill_stand_think" + trig getentitynumber() );
|
||||
self playsound( trig.script_noteworthy );
|
||||
trig.touchingplayers[self getentitynumber()] = 0;
|
||||
}
|
||||
|
||||
thread_step_trigger() //checked changed to match cerberus output
|
||||
thread_step_trigger()
|
||||
{
|
||||
if ( !isDefined( self.script_activated ) )
|
||||
{
|
||||
self.script_activated = 1;
|
||||
}
|
||||
if ( !isDefined( self.touchingplayers ) )
|
||||
{
|
||||
self.touchingplayers = [];
|
||||
for ( i = 0; i < 4; i++ )
|
||||
{
|
||||
self.touchingplayers[ i ] = 0;
|
||||
}
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
if ( self.touchingplayers[ who getentitynumber() ] == 0 )
|
||||
{
|
||||
who thread thread_enter_exit_sound( self );
|
||||
}
|
||||
}
|
||||
if ( !isdefined( self.script_activated ) )
|
||||
self.script_activated = 1;
|
||||
|
||||
if ( !isdefined( self.touchingplayers ) )
|
||||
{
|
||||
self.touchingplayers = [];
|
||||
|
||||
for ( i = 0; i < 4; i++ )
|
||||
self.touchingplayers[i] = 0;
|
||||
}
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "trigger", who );
|
||||
|
||||
if ( self.touchingplayers[who getentitynumber()] == 0 )
|
||||
who thread thread_enter_exit_sound( self );
|
||||
}
|
||||
}
|
||||
|
||||
disable_bump_trigger( triggername ) //checked changed to match cerberus output
|
||||
disable_bump_trigger( triggername )
|
||||
{
|
||||
triggers = getentarray( "audio_bump_trigger", "targetname" );
|
||||
if ( isDefined( triggers ) )
|
||||
{
|
||||
for ( i = 0; i < triggers.size; i++ )
|
||||
{
|
||||
if ( isDefined( triggers[ i ].script_label ) && triggers[ i ].script_label == triggername )
|
||||
{
|
||||
triggers[ i ].script_activated = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
triggers = getentarray( "audio_bump_trigger", "targetname" );
|
||||
|
||||
if ( isdefined( triggers ) )
|
||||
{
|
||||
for ( i = 0; i < triggers.size; i++ )
|
||||
{
|
||||
if ( isdefined( triggers[i].script_label ) && triggers[i].script_label == triggername )
|
||||
triggers[i].script_activated = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get_player_index_number( player ) //checked changed to match cerberus output
|
||||
get_player_index_number( player )
|
||||
{
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[ i ] == player )
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i] == player )
|
||||
return i;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,269 +1,262 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_challenges;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_challenges;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
precachemodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
precachemodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
precachemodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
precachemodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
|
||||
onspawn( watcher, player ) //checked changed to match cerberus output
|
||||
onspawn( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
|
||||
isfriendly = 0;
|
||||
if ( isDefined( endpos ) )
|
||||
{
|
||||
retrievable_model = spawn( "script_model", endpos );
|
||||
retrievable_model setmodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
retrievable_model setteam( player.team );
|
||||
retrievable_model setowner( player );
|
||||
retrievable_model.owner = player;
|
||||
retrievable_model.angles = angles;
|
||||
retrievable_model.name = watcher.weapon;
|
||||
retrievable_model.targetname = "sticky_weapon";
|
||||
if ( isDefined( prey ) )
|
||||
{
|
||||
if ( level.teambased && isplayer( prey ) && player.team == prey.team )
|
||||
{
|
||||
isfriendly = 1;
|
||||
}
|
||||
else if ( level.teambased && isai( prey ) && player.team == prey.aiteam )
|
||||
{
|
||||
isfriendly = 1;
|
||||
}
|
||||
if ( !isfriendly )
|
||||
{
|
||||
if ( isalive( prey ) )
|
||||
{
|
||||
retrievable_model droptoground( retrievable_model.origin, 80 );
|
||||
}
|
||||
else
|
||||
{
|
||||
retrievable_model linkto( prey, bone );
|
||||
}
|
||||
}
|
||||
else if ( isfriendly )
|
||||
{
|
||||
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
|
||||
normal = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
watcher.objectarray[ watcher.objectarray.size ] = retrievable_model;
|
||||
if ( isfriendly )
|
||||
{
|
||||
retrievable_model waittill( "stationary" );
|
||||
}
|
||||
retrievable_model thread dropknivestoground();
|
||||
if ( isfriendly )
|
||||
{
|
||||
player notify( "ballistic_knife_stationary" );
|
||||
}
|
||||
else
|
||||
{
|
||||
player notify( "ballistic_knife_stationary" );
|
||||
}
|
||||
retrievable_model thread wait_to_show_glowing_model( prey );
|
||||
}
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
self waittill( "stationary", endpos, normal, angles, attacker, prey, bone );
|
||||
|
||||
isfriendly = 0;
|
||||
|
||||
if ( isdefined( endpos ) )
|
||||
{
|
||||
retrievable_model = spawn( "script_model", endpos );
|
||||
retrievable_model setmodel( "t6_wpn_ballistic_knife_projectile" );
|
||||
retrievable_model setteam( player.team );
|
||||
retrievable_model setowner( player );
|
||||
retrievable_model.owner = player;
|
||||
retrievable_model.angles = angles;
|
||||
retrievable_model.name = watcher.weapon;
|
||||
retrievable_model.targetname = "sticky_weapon";
|
||||
|
||||
if ( isdefined( prey ) )
|
||||
{
|
||||
if ( level.teambased && isplayer( prey ) && player.team == prey.team )
|
||||
isfriendly = 1;
|
||||
else if ( level.teambased && isai( prey ) && player.team == prey.aiteam )
|
||||
isfriendly = 1;
|
||||
|
||||
if ( !isfriendly )
|
||||
{
|
||||
if ( isalive( prey ) )
|
||||
retrievable_model droptoground( retrievable_model.origin, 80 );
|
||||
else
|
||||
retrievable_model linkto( prey, bone );
|
||||
}
|
||||
else if ( isfriendly )
|
||||
{
|
||||
retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) );
|
||||
normal = ( 0, 0, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
watcher.objectarray[watcher.objectarray.size] = retrievable_model;
|
||||
|
||||
if ( isfriendly )
|
||||
retrievable_model waittill( "stationary" );
|
||||
|
||||
retrievable_model thread dropknivestoground();
|
||||
|
||||
if ( isfriendly )
|
||||
player notify( "ballistic_knife_stationary", retrievable_model, normal );
|
||||
else
|
||||
player notify( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
|
||||
retrievable_model thread wait_to_show_glowing_model( prey );
|
||||
}
|
||||
}
|
||||
|
||||
wait_to_show_glowing_model( prey ) //checked matches cerberus output
|
||||
wait_to_show_glowing_model( prey )
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
glowing_retrievable_model = spawn( "script_model", self.origin );
|
||||
self.glowing_model = glowing_retrievable_model;
|
||||
glowing_retrievable_model.angles = self.angles;
|
||||
glowing_retrievable_model linkto( self );
|
||||
if ( !is_true( prey ) )
|
||||
{
|
||||
wait 2;
|
||||
}
|
||||
glowing_retrievable_model setmodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
level endon( "game_ended" );
|
||||
self endon( "death" );
|
||||
glowing_retrievable_model = spawn( "script_model", self.origin );
|
||||
self.glowing_model = glowing_retrievable_model;
|
||||
glowing_retrievable_model.angles = self.angles;
|
||||
glowing_retrievable_model linkto( self );
|
||||
|
||||
if ( isdefined( prey ) && !isalive( prey ) )
|
||||
wait 2;
|
||||
|
||||
glowing_retrievable_model setmodel( "t6_wpn_ballistic_knife_blade_retrieve" );
|
||||
}
|
||||
|
||||
watch_shutdown() //checked matches cerberus output
|
||||
watch_shutdown()
|
||||
{
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
glowing_model = self.glowing_model;
|
||||
self waittill( "death" );
|
||||
if ( isDefined( pickuptrigger ) )
|
||||
{
|
||||
pickuptrigger delete();
|
||||
}
|
||||
if ( isDefined( glowing_model ) )
|
||||
{
|
||||
glowing_model delete();
|
||||
}
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
glowing_model = self.glowing_model;
|
||||
|
||||
self waittill( "death" );
|
||||
|
||||
if ( isdefined( pickuptrigger ) )
|
||||
pickuptrigger delete();
|
||||
|
||||
if ( isdefined( glowing_model ) )
|
||||
glowing_model delete();
|
||||
}
|
||||
|
||||
onspawnretrievetrigger( watcher, player ) //checked matches cerberus output
|
||||
onspawnretrievetrigger( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
if ( !isDefined( retrievable_model ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
vec_scale = 10;
|
||||
trigger_pos = [];
|
||||
if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) )
|
||||
{
|
||||
trigger_pos[ 0 ] = prey.origin[ 0 ];
|
||||
trigger_pos[ 1 ] = prey.origin[ 1 ];
|
||||
trigger_pos[ 2 ] = prey.origin[ 2 ] + vec_scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( vec_scale * normal[ 0 ] );
|
||||
trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( vec_scale * normal[ 1 ] );
|
||||
trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( vec_scale * normal[ 2 ] );
|
||||
}
|
||||
trigger_pos[ 2 ] -= 50;
|
||||
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ), 0, 50, 100 );
|
||||
pickup_trigger.owner = player;
|
||||
retrievable_model.pickuptrigger = pickup_trigger;
|
||||
pickup_trigger enablelinkto();
|
||||
if ( isDefined( prey ) )
|
||||
{
|
||||
pickup_trigger linkto( prey );
|
||||
}
|
||||
else
|
||||
{
|
||||
pickup_trigger linkto( retrievable_model );
|
||||
}
|
||||
retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
retrievable_model thread watch_shutdown();
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey );
|
||||
|
||||
if ( !isdefined( retrievable_model ) )
|
||||
return;
|
||||
|
||||
vec_scale = 10;
|
||||
trigger_pos = [];
|
||||
|
||||
if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) )
|
||||
{
|
||||
trigger_pos[0] = prey.origin[0];
|
||||
trigger_pos[1] = prey.origin[1];
|
||||
trigger_pos[2] = prey.origin[2] + vec_scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_pos[0] = retrievable_model.origin[0] + vec_scale * normal[0];
|
||||
trigger_pos[1] = retrievable_model.origin[1] + vec_scale * normal[1];
|
||||
trigger_pos[2] = retrievable_model.origin[2] + vec_scale * normal[2];
|
||||
}
|
||||
|
||||
trigger_pos[2] -= 50.0;
|
||||
pickup_trigger = spawn( "trigger_radius", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ), 0, 50, 100 );
|
||||
pickup_trigger.owner = player;
|
||||
retrievable_model.pickuptrigger = pickup_trigger;
|
||||
pickup_trigger enablelinkto();
|
||||
|
||||
if ( isdefined( prey ) )
|
||||
pickup_trigger linkto( prey );
|
||||
else
|
||||
pickup_trigger linkto( retrievable_model );
|
||||
|
||||
retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
retrievable_model thread watch_shutdown();
|
||||
}
|
||||
|
||||
watch_use_trigger( trigger, model, callback, playersoundonuse, npcsoundonuse ) //checked changed to match cerberus output
|
||||
watch_use_trigger( trigger, model, callback, playersoundonuse, npcsoundonuse )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
level endon( "game_ended" );
|
||||
max_ammo = weaponmaxammo( "knife_ballistic_mp" ) + 1;
|
||||
while ( 1 )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
if ( !isalive( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !player isonground() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( !player hasweapon( "knife_ballistic_mp" ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
ammo_stock = player getweaponammostock( "knife_ballistic_mp" );
|
||||
ammo_clip = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
current_weapon = player getcurrentweapon();
|
||||
total_ammo = ammo_stock + ammo_clip;
|
||||
hasreloaded = 1;
|
||||
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == "knife_ballistic_mp" )
|
||||
{
|
||||
hasreloaded = 0;
|
||||
}
|
||||
if ( total_ammo >= max_ammo || !hasreloaded )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( playersoundonuse ) )
|
||||
{
|
||||
player playlocalsound( playersoundonuse );
|
||||
}
|
||||
if ( isDefined( npcsoundonuse ) )
|
||||
{
|
||||
player playsound( npcsoundonuse );
|
||||
}
|
||||
self thread [[ callback ]]( player );
|
||||
break;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "delete" );
|
||||
level endon( "game_ended" );
|
||||
max_ammo = weaponmaxammo( "knife_ballistic_mp" ) + 1;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
|
||||
if ( !isalive( player ) )
|
||||
continue;
|
||||
|
||||
if ( !player isonground() )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
continue;
|
||||
|
||||
if ( !player hasweapon( "knife_ballistic_mp" ) )
|
||||
continue;
|
||||
|
||||
ammo_stock = player getweaponammostock( "knife_ballistic_mp" );
|
||||
ammo_clip = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
current_weapon = player getcurrentweapon();
|
||||
total_ammo = ammo_stock + ammo_clip;
|
||||
hasreloaded = 1;
|
||||
|
||||
if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == "knife_ballistic_mp" )
|
||||
hasreloaded = 0;
|
||||
|
||||
if ( total_ammo >= max_ammo || !hasreloaded )
|
||||
continue;
|
||||
|
||||
if ( isdefined( playersoundonuse ) )
|
||||
player playlocalsound( playersoundonuse );
|
||||
|
||||
if ( isdefined( npcsoundonuse ) )
|
||||
player playsound( npcsoundonuse );
|
||||
|
||||
self thread [[ callback ]]( player );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pick_up( player ) //checked matches cerberus output
|
||||
pick_up( player )
|
||||
{
|
||||
self destroy_ent();
|
||||
current_weapon = player getcurrentweapon();
|
||||
player maps/mp/_challenges::pickedupballisticknife();
|
||||
if ( current_weapon != "knife_ballistic_mp" )
|
||||
{
|
||||
clip_ammo = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
if ( !clip_ammo )
|
||||
{
|
||||
player setweaponammoclip( "knife_ballistic_mp", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
self destroy_ent();
|
||||
current_weapon = player getcurrentweapon();
|
||||
player maps\mp\_challenges::pickedupballisticknife();
|
||||
|
||||
if ( current_weapon != "knife_ballistic_mp" )
|
||||
{
|
||||
clip_ammo = player getweaponammoclip( "knife_ballistic_mp" );
|
||||
|
||||
if ( !clip_ammo )
|
||||
player setweaponammoclip( "knife_ballistic_mp", 1 );
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1;
|
||||
player setweaponammostock( "knife_ballistic_mp", new_ammo_stock );
|
||||
}
|
||||
}
|
||||
|
||||
destroy_ent() //checked matches cerberus output
|
||||
destroy_ent()
|
||||
{
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
if ( isDefined( pickuptrigger ) )
|
||||
{
|
||||
pickuptrigger delete();
|
||||
}
|
||||
if ( isDefined( self.glowing_model ) )
|
||||
{
|
||||
self.glowing_model delete();
|
||||
}
|
||||
self delete();
|
||||
}
|
||||
if ( isdefined( self ) )
|
||||
{
|
||||
pickuptrigger = self.pickuptrigger;
|
||||
|
||||
if ( isdefined( pickuptrigger ) )
|
||||
pickuptrigger delete();
|
||||
|
||||
if ( isdefined( self.glowing_model ) )
|
||||
self.glowing_model delete();
|
||||
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
|
||||
dropknivestoground() //checked matches cerberus output
|
||||
dropknivestoground()
|
||||
{
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "drop_objects_to_ground", origin, radius );
|
||||
self droptoground( origin, radius );
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "drop_objects_to_ground", origin, radius );
|
||||
|
||||
self droptoground( origin, radius );
|
||||
}
|
||||
}
|
||||
|
||||
droptoground( origin, radius ) //checked changed to match cerberus output
|
||||
droptoground( origin, radius )
|
||||
{
|
||||
if ( distancesquared( origin, self.origin ) < ( radius * radius ) )
|
||||
{
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 1, 1, 1 ), 5 ) );
|
||||
self thread updateretrievetrigger();
|
||||
}
|
||||
if ( distancesquared( origin, self.origin ) < radius * radius )
|
||||
{
|
||||
self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) );
|
||||
self thread updateretrievetrigger();
|
||||
}
|
||||
}
|
||||
|
||||
updateretrievetrigger() //checked matches cerberus output
|
||||
updateretrievetrigger()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "stationary" );
|
||||
trigger = self.pickuptrigger;
|
||||
trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 );
|
||||
trigger linkto( self );
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "stationary" );
|
||||
|
||||
trigger = self.pickuptrigger;
|
||||
trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 );
|
||||
trigger linkto( self );
|
||||
}
|
||||
|
@ -1,92 +1,91 @@
|
||||
//includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level thread onplayerconnect();
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerdeath();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerdeath();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self._bbdata = [];
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self._bbdata[ "score" ] = 0;
|
||||
self._bbdata[ "momentum" ] = 0;
|
||||
self._bbdata[ "spawntime" ] = getTime();
|
||||
self._bbdata[ "shots" ] = 0;
|
||||
self._bbdata[ "hits" ] = 0;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self._bbdata = [];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self._bbdata["score"] = 0;
|
||||
self._bbdata["momentum"] = 0;
|
||||
self._bbdata["spawntime"] = gettime();
|
||||
self._bbdata["shots"] = 0;
|
||||
self._bbdata["hits"] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect() //checked changed to match beta dump
|
||||
onplayerdisconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
self commitspawndata();
|
||||
break;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
|
||||
self commitspawndata();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdeath() //checked matches cerberus output
|
||||
onplayerdeath()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "death" );
|
||||
self commitspawndata();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "death" );
|
||||
|
||||
self commitspawndata();
|
||||
}
|
||||
}
|
||||
|
||||
commitspawndata() //checked matches cerberus output
|
||||
commitspawndata()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( self._bbdata ) );
|
||||
assert( isdefined( self._bbdata ) );
|
||||
#/
|
||||
*/
|
||||
if ( !isDefined( self._bbdata ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
bbprint( "mpplayerlives", "gametime %d spawnid %d lifescore %d lifemomentum %d lifetime %d name %s", getTime(), getplayerspawnid( self ), self._bbdata[ "score" ], self._bbdata[ "momentum" ], getTime() - self._bbdata[ "spawntime" ], self.name );
|
||||
if ( !isdefined( self._bbdata ) )
|
||||
return;
|
||||
|
||||
bbprint( "mpplayerlives", "gametime %d spawnid %d lifescore %d lifemomentum %d lifetime %d name %s", gettime(), getplayerspawnid( self ), self._bbdata["score"], self._bbdata["momentum"], gettime() - self._bbdata["spawntime"], self.name );
|
||||
}
|
||||
|
||||
commitweapondata( spawnid, currentweapon, time0 ) //checked matches cerberus output
|
||||
commitweapondata( spawnid, currentweapon, time0 )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( self._bbdata ) );
|
||||
assert( isdefined( self._bbdata ) );
|
||||
#/
|
||||
*/
|
||||
if ( !isDefined( self._bbdata ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
time1 = getTime();
|
||||
bbprint( "mpweapons", "spawnid %d name %s duration %d shots %d hits %d", spawnid, currentweapon, time1 - time0, self._bbdata[ "shots" ], self._bbdata[ "hits" ] );
|
||||
self._bbdata[ "shots" ] = 0;
|
||||
self._bbdata[ "hits" ] = 0;
|
||||
if ( !isdefined( self._bbdata ) )
|
||||
return;
|
||||
|
||||
time1 = gettime();
|
||||
bbprint( "mpweapons", "spawnid %d name %s duration %d shots %d hits %d", spawnid, currentweapon, time1 - time0, self._bbdata["shots"], self._bbdata["hits"] );
|
||||
self._bbdata["shots"] = 0;
|
||||
self._bbdata["hits"] = 0;
|
||||
}
|
||||
|
||||
bbaddtostat( statname, delta ) //checked matches cerberus output
|
||||
bbaddtostat( statname, delta )
|
||||
{
|
||||
if ( isDefined( self._bbdata ) && isDefined( self._bbdata[ statname ] ) )
|
||||
{
|
||||
self._bbdata[ statname ] += delta;
|
||||
}
|
||||
if ( isdefined( self._bbdata ) && isdefined( self._bbdata[statname] ) )
|
||||
self._bbdata[statname] += delta;
|
||||
}
|
||||
|
@ -1,177 +1,173 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
precachemodel( "t6_wpn_bouncing_betty_world" );
|
||||
level.bettyexplosionfx = loadfx( "weapon/bouncing_betty/fx_betty_explosion" );
|
||||
level.bettydestroyedfx = loadfx( "weapon/bouncing_betty/fx_betty_destroyed" );
|
||||
level.bettylaunchfx = loadfx( "weapon/bouncing_betty/fx_betty_launch_dust" );
|
||||
level._effect[ "fx_betty_friendly_light" ] = loadfx( "weapon/bouncing_betty/fx_betty_light_green" );
|
||||
level._effect[ "fx_betty_enemy_light" ] = loadfx( "weapon/bouncing_betty/fx_betty_light_red" );
|
||||
level.bettymindist = 20;
|
||||
level.bettygraceperiod = 0.6;
|
||||
level.bettyradius = 192;
|
||||
level.bettystuntime = 1;
|
||||
level.bettydamageradius = 256;
|
||||
level.bettydamagemax = 210;
|
||||
level.bettydamagemin = 70;
|
||||
level.bettyjumpheight = 65;
|
||||
level.bettyjumptime = 0.65;
|
||||
level.bettyrotatevelocity = ( 0, 750, 32 );
|
||||
level.bettyactivationdelay = 0.1;
|
||||
precachemodel( "t6_wpn_bouncing_betty_world" );
|
||||
level.bettyexplosionfx = loadfx( "weapon/bouncing_betty/fx_betty_explosion" );
|
||||
level.bettydestroyedfx = loadfx( "weapon/bouncing_betty/fx_betty_destroyed" );
|
||||
level.bettylaunchfx = loadfx( "weapon/bouncing_betty/fx_betty_launch_dust" );
|
||||
level._effect["fx_betty_friendly_light"] = loadfx( "weapon/bouncing_betty/fx_betty_light_green" );
|
||||
level._effect["fx_betty_enemy_light"] = loadfx( "weapon/bouncing_betty/fx_betty_light_red" );
|
||||
level.bettymindist = 20;
|
||||
level.bettygraceperiod = 0.6;
|
||||
level.bettyradius = 192;
|
||||
level.bettystuntime = 1;
|
||||
level.bettydamageradius = 256;
|
||||
level.bettydamagemax = 210;
|
||||
level.bettydamagemin = 70;
|
||||
level.bettyjumpheight = 65;
|
||||
level.bettyjumptime = 0.65;
|
||||
level.bettyrotatevelocity = ( 0, 750, 32 );
|
||||
level.bettyactivationdelay = 0.1;
|
||||
}
|
||||
|
||||
createbouncingbettywatcher() //checked matches cerberus output
|
||||
createbouncingbettywatcher()
|
||||
{
|
||||
watcher = self createproximityweaponobjectwatcher( "bouncingbetty", "bouncingbetty_mp", self.team );
|
||||
watcher.onspawn = ::onspawnbouncingbetty;
|
||||
watcher.watchforfire = 1;
|
||||
watcher.detonate = ::bouncingbettydetonate;
|
||||
watcher.activatesound = "wpn_claymore_alert";
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.reconmodel = "t6_wpn_bouncing_betty_world_detect";
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher.ignoredirection = 1;
|
||||
watcher.detectionmindist = level.bettymindist;
|
||||
watcher.detectiongraceperiod = level.bettygraceperiod;
|
||||
watcher.detonateradius = level.bettyradius;
|
||||
watcher.stun = ::weaponstun;
|
||||
watcher.stuntime = level.bettystuntime;
|
||||
watcher.activationdelay = level.bettyactivationdelay;
|
||||
watcher = self createproximityweaponobjectwatcher( "bouncingbetty", "bouncingbetty_mp", self.team );
|
||||
watcher.onspawn = ::onspawnbouncingbetty;
|
||||
watcher.watchforfire = 1;
|
||||
watcher.detonate = ::bouncingbettydetonate;
|
||||
watcher.activatesound = "wpn_claymore_alert";
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.reconmodel = "t6_wpn_bouncing_betty_world_detect";
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher.ignoredirection = 1;
|
||||
watcher.detectionmindist = level.bettymindist;
|
||||
watcher.detectiongraceperiod = level.bettygraceperiod;
|
||||
watcher.detonateradius = level.bettyradius;
|
||||
watcher.stun = ::weaponstun;
|
||||
watcher.stuntime = level.bettystuntime;
|
||||
watcher.activationdelay = level.bettyactivationdelay;
|
||||
}
|
||||
|
||||
onspawnbouncingbetty( watcher, owner ) //checked matches cerberus output
|
||||
onspawnbouncingbetty( watcher, owner )
|
||||
{
|
||||
onspawnproximityweaponobject( watcher, owner );
|
||||
self thread spawnminemover();
|
||||
onspawnproximityweaponobject( watcher, owner );
|
||||
self thread spawnminemover();
|
||||
}
|
||||
|
||||
spawnminemover()
|
||||
{
|
||||
self waittillnotmoving();
|
||||
minemover = spawn( "script_model", self.origin );
|
||||
minemover.angles = self.angles;
|
||||
minemover setmodel( "tag_origin" );
|
||||
minemover.owner = self.owner;
|
||||
minemover.killcamoffset = ( 0, 0, getdvarfloatdefault( "scr_bouncing_betty_killcam_offset", 8 ) );
|
||||
killcament = spawn( "script_model", minemover.origin + minemover.killcamoffset );
|
||||
killcament.angles = ( 0, 0, 0 );
|
||||
killcament setmodel( "tag_origin" );
|
||||
killcament setweapon( "bouncingbetty_mp" );
|
||||
minemover.killcament = killcament;
|
||||
self.minemover = minemover;
|
||||
self thread killminemoveronpickup();
|
||||
self waittillnotmoving();
|
||||
minemover = spawn( "script_model", self.origin );
|
||||
minemover.angles = self.angles;
|
||||
minemover setmodel( "tag_origin" );
|
||||
minemover.owner = self.owner;
|
||||
minemover.killcamoffset = ( 0, 0, getdvarfloatdefault( "scr_bouncing_betty_killcam_offset", 8.0 ) );
|
||||
killcament = spawn( "script_model", minemover.origin + minemover.killcamoffset );
|
||||
killcament.angles = ( 0, 0, 0 );
|
||||
killcament setmodel( "tag_origin" );
|
||||
killcament setweapon( "bouncingbetty_mp" );
|
||||
minemover.killcament = killcament;
|
||||
self.minemover = minemover;
|
||||
self thread killminemoveronpickup();
|
||||
}
|
||||
|
||||
killminemoveronpickup() //checked matches cerberus output
|
||||
killminemoveronpickup()
|
||||
{
|
||||
self.minemover endon( "death" );
|
||||
self waittill_any( "picked_up", "hacked" );
|
||||
self killminemover();
|
||||
self.minemover endon( "death" );
|
||||
self waittill_any( "picked_up", "hacked" );
|
||||
self killminemover();
|
||||
}
|
||||
|
||||
killminemover() //checked matches cerberus output
|
||||
killminemover()
|
||||
{
|
||||
if ( isDefined( self.minemover ) )
|
||||
{
|
||||
if ( isDefined( self.minemover.killcament ) )
|
||||
{
|
||||
self.minemover.killcament delete();
|
||||
}
|
||||
self.minemover delete();
|
||||
}
|
||||
if ( isdefined( self.minemover ) )
|
||||
{
|
||||
if ( isdefined( self.minemover.killcament ) )
|
||||
self.minemover.killcament delete();
|
||||
|
||||
self.minemover delete();
|
||||
}
|
||||
}
|
||||
|
||||
bouncingbettydetonate( attacker, weaponname ) //checked matches cerberus output
|
||||
bouncingbettydetonate( attacker, weaponname )
|
||||
{
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedexplosive( weaponname );
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_bouncingbetty", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
self bouncingbettydestroyed();
|
||||
}
|
||||
else if ( isDefined( self.minemover ) )
|
||||
{
|
||||
self.minemover setmodel( self.model );
|
||||
self.minemover thread bouncingbettyjumpandexplode();
|
||||
self delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
self bouncingbettydestroyed();
|
||||
}
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
if ( isdefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedexplosive( weaponname );
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_bouncingbetty", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
|
||||
self bouncingbettydestroyed();
|
||||
}
|
||||
else if ( isdefined( self.minemover ) )
|
||||
{
|
||||
self.minemover setmodel( self.model );
|
||||
self.minemover thread bouncingbettyjumpandexplode();
|
||||
self delete();
|
||||
}
|
||||
else
|
||||
self bouncingbettydestroyed();
|
||||
}
|
||||
|
||||
bouncingbettydestroyed() //checked matches cerberus output
|
||||
bouncingbettydestroyed()
|
||||
{
|
||||
playfx( level.bettydestroyedfx, self.origin );
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
if ( isDefined( self.trigger ) )
|
||||
{
|
||||
self.trigger delete();
|
||||
}
|
||||
if ( isDefined( self.minemover ) )
|
||||
{
|
||||
if ( isDefined( self.minemover.killcament ) )
|
||||
{
|
||||
self.minemover.killcament delete();
|
||||
}
|
||||
self.minemover delete();
|
||||
}
|
||||
self radiusdamage( self.origin, 128, 110, 10, self.owner, "MOD_EXPLOSIVE", "bouncingbetty_mp" );
|
||||
self delete();
|
||||
playfx( level.bettydestroyedfx, self.origin );
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
|
||||
if ( isdefined( self.trigger ) )
|
||||
self.trigger delete();
|
||||
|
||||
if ( isdefined( self.minemover ) )
|
||||
{
|
||||
if ( isdefined( self.minemover.killcament ) )
|
||||
self.minemover.killcament delete();
|
||||
|
||||
self.minemover delete();
|
||||
}
|
||||
|
||||
self radiusdamage( self.origin, 128, 110, 10, self.owner, "MOD_EXPLOSIVE", "bouncingbetty_mp" );
|
||||
self delete();
|
||||
}
|
||||
|
||||
bouncingbettyjumpandexplode() //checked matches cerberus output
|
||||
bouncingbettyjumpandexplode()
|
||||
{
|
||||
explodepos = self.origin + ( 0, 0, level.bettyjumpheight );
|
||||
self moveto( explodepos, level.bettyjumptime, level.bettyjumptime, 0 );
|
||||
self.killcament moveto( explodepos + self.killcamoffset, level.bettyjumptime, 0, level.bettyjumptime );
|
||||
playfx( level.bettylaunchfx, self.origin );
|
||||
self rotatevelocity( level.bettyrotatevelocity, level.bettyjumptime, 0, level.bettyjumptime );
|
||||
self playsound( "fly_betty_jump" );
|
||||
wait level.bettyjumptime;
|
||||
self thread mineexplode();
|
||||
explodepos = self.origin + ( 0, 0, level.bettyjumpheight );
|
||||
self moveto( explodepos, level.bettyjumptime, level.bettyjumptime, 0 );
|
||||
self.killcament moveto( explodepos + self.killcamoffset, level.bettyjumptime, 0, level.bettyjumptime );
|
||||
playfx( level.bettylaunchfx, self.origin );
|
||||
self rotatevelocity( level.bettyrotatevelocity, level.bettyjumptime, 0, level.bettyjumptime );
|
||||
self playsound( "fly_betty_jump" );
|
||||
wait( level.bettyjumptime );
|
||||
self thread mineexplode();
|
||||
}
|
||||
|
||||
mineexplode() //checked matches cerberus output
|
||||
mineexplode()
|
||||
{
|
||||
if ( !isDefined( self ) || !isDefined( self.owner ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self playsound( "fly_betty_explo" );
|
||||
wait 0.05;
|
||||
if ( !isDefined( self ) || !isDefined( self.owner ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self hide();
|
||||
self radiusdamage( self.origin, level.bettydamageradius, level.bettydamagemax, level.bettydamagemin, self.owner, "MOD_EXPLOSIVE", "bouncingbetty_mp" );
|
||||
playfx( level.bettyexplosionfx, self.origin );
|
||||
wait 0.2;
|
||||
if ( !isDefined( self ) || !isDefined( self.owner ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.trigger ) )
|
||||
{
|
||||
self.trigger delete();
|
||||
}
|
||||
self.killcament delete();
|
||||
self delete();
|
||||
}
|
||||
if ( !isdefined( self ) || !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
self playsound( "fly_betty_explo" );
|
||||
wait 0.05;
|
||||
|
||||
if ( !isdefined( self ) || !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
self hide();
|
||||
self radiusdamage( self.origin, level.bettydamageradius, level.bettydamagemax, level.bettydamagemin, self.owner, "MOD_EXPLOSIVE", "bouncingbetty_mp" );
|
||||
playfx( level.bettyexplosionfx, self.origin );
|
||||
wait 0.2;
|
||||
|
||||
if ( !isdefined( self ) || !isdefined( self.owner ) )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.trigger ) )
|
||||
self.trigger delete();
|
||||
|
||||
self.killcament delete();
|
||||
self delete();
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,22 +1,20 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
|
||||
businit() //checked matches cerberus output
|
||||
businit()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( level.clientscripts );
|
||||
assert( level.clientscripts );
|
||||
#/
|
||||
*/
|
||||
level.busstate = "";
|
||||
registerclientsys( "busCmd" );
|
||||
level.busstate = "";
|
||||
registerclientsys( "busCmd" );
|
||||
}
|
||||
|
||||
setbusstate( state ) //checked matches cerberus output
|
||||
setbusstate( state )
|
||||
{
|
||||
if ( level.busstate != state )
|
||||
{
|
||||
setclientsysstate( "busCmd", state );
|
||||
}
|
||||
level.busstate = state;
|
||||
if ( level.busstate != state )
|
||||
setclientsysstate( "busCmd", state );
|
||||
|
||||
level.busstate = state;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,69 +1,76 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
setupminimap( material ) //checked matches cerberus output
|
||||
setupminimap( material )
|
||||
{
|
||||
requiredmapaspectratio = getDvarFloat( "scr_RequiredMapAspectratio" );
|
||||
corners = getentarray( "minimap_corner", "targetname" );
|
||||
if ( corners.size != 2 )
|
||||
{
|
||||
/*
|
||||
requiredmapaspectratio = getdvarfloat( "scr_RequiredMapAspectratio" );
|
||||
corners = getentarray( "minimap_corner", "targetname" );
|
||||
|
||||
if ( corners.size != 2 )
|
||||
{
|
||||
/#
|
||||
println( "^1Error: There are not exactly two "minimap_corner" entities in the map. Could not set up minimap." );
|
||||
println( "^1Error: There are not exactly two \"minimap_corner\" entities in the map. Could not set up minimap." );
|
||||
#/
|
||||
*/
|
||||
return;
|
||||
}
|
||||
corner0 = ( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], 0 );
|
||||
corner1 = ( corners[ 1 ].origin[ 0 ], corners[ 1 ].origin[ 1 ], 0 );
|
||||
cornerdiff = corner1 - corner0;
|
||||
north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
|
||||
west = ( 0 - north[ 1 ], north[ 0 ], 0 );
|
||||
if ( vectordot( cornerdiff, west ) > 0 )
|
||||
{
|
||||
if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
northwest = corner1;
|
||||
southeast = corner0;
|
||||
}
|
||||
else
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner1 - side;
|
||||
southeast = corner0 + side;
|
||||
}
|
||||
}
|
||||
else if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner0 + side;
|
||||
southeast = corner1 - side;
|
||||
}
|
||||
else
|
||||
{
|
||||
northwest = corner0;
|
||||
southeast = corner1;
|
||||
}
|
||||
if ( requiredmapaspectratio > 0 )
|
||||
{
|
||||
northportion = vectordot( northwest - southeast, north );
|
||||
westportion = vectordot( northwest - southeast, west );
|
||||
mapaspectratio = westportion / northportion;
|
||||
if ( mapaspectratio < requiredmapaspectratio )
|
||||
{
|
||||
incr = requiredmapaspectratio / mapaspectratio;
|
||||
addvec = vecscale( west, westportion * ( incr - 1 ) * 0.5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
incr = mapaspectratio / requiredmapaspectratio;
|
||||
addvec = vecscale( north, northportion * ( incr - 1 ) * 0.5 );
|
||||
}
|
||||
northwest += addvec;
|
||||
southeast -= addvec;
|
||||
}
|
||||
setminimap( material, northwest[ 0 ], northwest[ 1 ], southeast[ 0 ], southeast[ 1 ] );
|
||||
return;
|
||||
}
|
||||
|
||||
corner0 = ( corners[0].origin[0], corners[0].origin[1], 0 );
|
||||
corner1 = ( corners[1].origin[0], corners[1].origin[1], 0 );
|
||||
cornerdiff = corner1 - corner0;
|
||||
north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
|
||||
west = ( 0 - north[1], north[0], 0 );
|
||||
|
||||
if ( vectordot( cornerdiff, west ) > 0 )
|
||||
{
|
||||
if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
northwest = corner1;
|
||||
southeast = corner0;
|
||||
}
|
||||
else
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner1 - side;
|
||||
southeast = corner0 + side;
|
||||
}
|
||||
}
|
||||
else if ( vectordot( cornerdiff, north ) > 0 )
|
||||
{
|
||||
side = vecscale( north, vectordot( cornerdiff, north ) );
|
||||
northwest = corner0 + side;
|
||||
southeast = corner1 - side;
|
||||
}
|
||||
else
|
||||
{
|
||||
northwest = corner0;
|
||||
southeast = corner1;
|
||||
}
|
||||
|
||||
if ( requiredmapaspectratio > 0 )
|
||||
{
|
||||
northportion = vectordot( northwest - southeast, north );
|
||||
westportion = vectordot( northwest - southeast, west );
|
||||
mapaspectratio = westportion / northportion;
|
||||
|
||||
if ( mapaspectratio < requiredmapaspectratio )
|
||||
{
|
||||
incr = requiredmapaspectratio / mapaspectratio;
|
||||
addvec = vecscale( west, westportion * ( incr - 1 ) * 0.5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
incr = mapaspectratio / requiredmapaspectratio;
|
||||
addvec = vecscale( north, northportion * ( incr - 1 ) * 0.5 );
|
||||
}
|
||||
|
||||
northwest += addvec;
|
||||
southeast -= addvec;
|
||||
}
|
||||
|
||||
setminimap( material, northwest[0], northwest[1], southeast[0], southeast[1] );
|
||||
}
|
||||
|
||||
vecscale( vec, scalar ) //checked matches cerberus output
|
||||
vecscale( vec, scalar )
|
||||
{
|
||||
return ( vec[ 0 ] * scalar, vec[ 1 ] * scalar, vec[ 2 ] * scalar );
|
||||
return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,545 +1,508 @@
|
||||
#include maps/mp/_createfxmenu;
|
||||
#include maps/mp/_createfx;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_createfx;
|
||||
#include maps\mp\_createfxmenu;
|
||||
|
||||
store_undo_state( change_type, ents )
|
||||
{
|
||||
if ( !isDefined( level.cfx_undo_states ) )
|
||||
{
|
||||
level.cfx_undo_states = [];
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = spawnstruct();
|
||||
level.cfx_max_states = 10;
|
||||
}
|
||||
if ( !isarray( ents ) )
|
||||
{
|
||||
ents = array( ents );
|
||||
}
|
||||
temp_array = [];
|
||||
i = 0;
|
||||
while ( i < ents.size )
|
||||
{
|
||||
temp_array[ i ] = copy_fx_ent( ents[ i ] );
|
||||
i++;
|
||||
}
|
||||
state = spawnstruct();
|
||||
state.operation = change_type;
|
||||
state.last_action = level.cfx_last_action;
|
||||
state.ent_array = temp_array;
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
}
|
||||
level.cfx_undo_states[ level.cfx_undo_states.size ] = state;
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
if ( !isdefined( level.cfx_undo_states ) )
|
||||
{
|
||||
level.cfx_undo_states = [];
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = spawnstruct();
|
||||
level.cfx_max_states = 10;
|
||||
}
|
||||
|
||||
if ( !isarray( ents ) )
|
||||
ents = array( ents );
|
||||
|
||||
temp_array = [];
|
||||
|
||||
for ( i = 0; i < ents.size; i++ )
|
||||
temp_array[i] = copy_fx_ent( ents[i] );
|
||||
|
||||
state = spawnstruct();
|
||||
state.operation = change_type;
|
||||
state.last_action = level.cfx_last_action;
|
||||
state.ent_array = temp_array;
|
||||
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
|
||||
level.cfx_undo_states[level.cfx_undo_states.size] = state;
|
||||
level.cfx_redo_states = [];
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
}
|
||||
|
||||
undo()
|
||||
{
|
||||
if ( isDefined( level.createfxent ) || !isDefined( level.cfx_undo_states ) && level.cfx_undo_states.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
revert_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
if ( level.cfx_last_action != "none" )
|
||||
{
|
||||
store_undo_state( "edit", level.selected_fx_ents );
|
||||
move_undo_state_to_redo();
|
||||
clear_entity_selection( "skip_undo" );
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else clear_entity_selection( "skip_undo" );
|
||||
if ( revert_state.operation != "edit" )
|
||||
{
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_redo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else if ( isDefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_redo();
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.cfx_undo_states.size > 1 )
|
||||
{
|
||||
move_undo_state_to_redo();
|
||||
revert_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
}
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
}
|
||||
if ( !isdefined( level.createfxent ) || !isdefined( level.cfx_undo_states ) || level.cfx_undo_states.size < 1 )
|
||||
return;
|
||||
|
||||
revert_state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
|
||||
if ( level.cfx_last_action != "none" )
|
||||
{
|
||||
store_undo_state( "edit", level.selected_fx_ents );
|
||||
move_undo_state_to_redo();
|
||||
clear_entity_selection( "skip_undo" );
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_entity_selection( "skip_undo" );
|
||||
|
||||
if ( revert_state.operation != "edit" )
|
||||
{
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_redo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else if ( isdefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_redo();
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.cfx_undo_states.size > 1 )
|
||||
{
|
||||
move_undo_state_to_redo();
|
||||
revert_state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
}
|
||||
|
||||
apply_state_change( "undo", revert_state );
|
||||
move_undo_state_to_limbo();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
apply_state_change( type, revert_state )
|
||||
{
|
||||
if ( type == "undo" )
|
||||
{
|
||||
if ( type == "undo" )
|
||||
{
|
||||
/#
|
||||
println( "^2CreateFX: Undo operation" );
|
||||
println( "^2CreateFX: Undo operation" );
|
||||
#/
|
||||
if ( revert_state.operation == "edit" )
|
||||
{
|
||||
undo_edit( revert_state.ent_array );
|
||||
}
|
||||
else if ( revert_state.operation == "add" )
|
||||
{
|
||||
undo_add( revert_state.ent_array );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( revert_state.operation == "delete" )
|
||||
{
|
||||
undo_delete( revert_state.ent_array );
|
||||
}
|
||||
}
|
||||
}
|
||||
else /#
|
||||
println( "^2CreateFX: Redo operation" );
|
||||
if ( revert_state.operation == "edit" )
|
||||
undo_edit( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "add" )
|
||||
undo_add( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "delete" )
|
||||
undo_delete( revert_state.ent_array );
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
println( "^2CreateFX: Redo operation" );
|
||||
#/
|
||||
if ( revert_state.operation == "edit" )
|
||||
{
|
||||
undo_edit( revert_state.ent_array );
|
||||
}
|
||||
else if ( revert_state.operation == "add" )
|
||||
{
|
||||
undo_delete( revert_state.ent_array );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( revert_state.operation == "delete" )
|
||||
{
|
||||
undo_add( revert_state.ent_array );
|
||||
}
|
||||
}
|
||||
if ( revert_state.operation == "edit" )
|
||||
undo_edit( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "add" )
|
||||
undo_delete( revert_state.ent_array );
|
||||
else if ( revert_state.operation == "delete" )
|
||||
undo_add( revert_state.ent_array );
|
||||
}
|
||||
}
|
||||
|
||||
move_undo_state_to_redo()
|
||||
{
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
}
|
||||
level.cfx_redo_states[ level.cfx_redo_states.size ] = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
|
||||
level.cfx_redo_states[level.cfx_redo_states.size] = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
}
|
||||
|
||||
move_redo_state_to_undo()
|
||||
{
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
}
|
||||
level.cfx_undo_states[ level.cfx_undo_states.size ] = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
|
||||
level.cfx_undo_states[level.cfx_undo_states.size] = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "redo" );
|
||||
}
|
||||
|
||||
move_undo_state_to_limbo()
|
||||
{
|
||||
level.cfx_limbo_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
level.cfx_limbo_state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
level.cfx_undo_states = array_pop( level.cfx_undo_states );
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
}
|
||||
|
||||
move_redo_state_to_limbo()
|
||||
{
|
||||
level.cfx_limbo_state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "redo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
level.cfx_limbo_state = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
level.cfx_redo_states = array_pop( level.cfx_redo_states );
|
||||
debug_print_latest_state( "redo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
}
|
||||
|
||||
move_limbo_state_to_undo()
|
||||
{
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
}
|
||||
level.cfx_undo_states[ level.cfx_undo_states.size ] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
if ( level.cfx_undo_states.size >= level.cfx_max_states )
|
||||
level.cfx_undo_states = array_drop( level.cfx_undo_states );
|
||||
|
||||
level.cfx_undo_states[level.cfx_undo_states.size] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "undo" );
|
||||
debug_print_latest_state( "limbo" );
|
||||
}
|
||||
|
||||
move_limbo_state_to_redo()
|
||||
{
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
{
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
}
|
||||
level.cfx_redo_states[ level.cfx_redo_states.size ] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "redo" );
|
||||
if ( level.cfx_redo_states.size >= level.cfx_max_states )
|
||||
level.cfx_redo_states = array_drop( level.cfx_redo_states );
|
||||
|
||||
level.cfx_redo_states[level.cfx_redo_states.size] = level.cfx_limbo_state;
|
||||
level.cfx_limbo_state = undefined;
|
||||
debug_print_latest_state( "redo" );
|
||||
}
|
||||
|
||||
undo_edit( ent_array )
|
||||
{
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
/#
|
||||
println( "^3CreateFX: Undoing edit" );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^3CreateFX: Undoing edit" );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
last_id = ent_array[ ent_array.size - 1 ].uniqueid;
|
||||
if ( last_id > ( level.createfxent.size - 1 ) )
|
||||
{
|
||||
last_id = level.createfxent.size - 1;
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[ j ];
|
||||
i = last_id;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
target_ent = level.createfxent[ i ];
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
copy_values_between_fx_ents( source_ent, target_ent );
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
last_id = ent_array[ent_array.size - 1].uniqueid;
|
||||
|
||||
if ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
if ( last_id > level.createfxent.size - 1 )
|
||||
last_id = level.createfxent.size - 1;
|
||||
|
||||
}
|
||||
}
|
||||
update_selected_entities();
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[j];
|
||||
|
||||
for ( i = last_id; i >= 0; i-- )
|
||||
{
|
||||
target_ent = level.createfxent[i];
|
||||
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
copy_values_between_fx_ents( source_ent, target_ent );
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
|
||||
if ( j < 0 )
|
||||
break;
|
||||
|
||||
source_ent = ent_array[j];
|
||||
}
|
||||
}
|
||||
|
||||
update_selected_entities();
|
||||
/#
|
||||
println( "^1CreateFX: Finished edit" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^1CreateFX: Finished edit" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
}
|
||||
|
||||
undo_add( ent_array )
|
||||
{
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
/#
|
||||
println( "^3createfx: Undoing add." );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^3createfx: Undoing add." );
|
||||
debug_print_ent_array( ent_array, "ent_array[]" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
last_id = ent_array[ ent_array.size - 1 ].uniqueid;
|
||||
if ( last_id > ( level.createfxent.size - 1 ) )
|
||||
{
|
||||
last_id = level.createfxent.size - 1;
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[ j ];
|
||||
i = last_id;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
target_ent = level.createfxent[ i ];
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
if ( isDefined( target_ent.looper ) )
|
||||
{
|
||||
target_ent.looper delete();
|
||||
}
|
||||
target_ent notify( "stop_loop" );
|
||||
j--;
|
||||
last_id = ent_array[ent_array.size - 1].uniqueid;
|
||||
|
||||
if ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
if ( last_id > level.createfxent.size - 1 )
|
||||
last_id = level.createfxent.size - 1;
|
||||
|
||||
}
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[j];
|
||||
|
||||
for ( i = last_id; i >= 0; i-- )
|
||||
{
|
||||
target_ent = level.createfxent[i];
|
||||
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
if ( isdefined( target_ent.looper ) )
|
||||
target_ent.looper delete();
|
||||
|
||||
target_ent notify( "stop_loop" );
|
||||
level.createfxent[i] = undefined;
|
||||
j--;
|
||||
|
||||
if ( j < 0 )
|
||||
break;
|
||||
|
||||
source_ent = ent_array[j];
|
||||
}
|
||||
}
|
||||
/#
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "createfx: Starting array_remove_undefined()" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "createfx: Starting array_remove_undefined()" );
|
||||
#/
|
||||
arrayremovevalue( level.createfxent, undefined );
|
||||
arrayremovevalue( level.createfxent, undefined );
|
||||
/#
|
||||
println( "^1CreateFX: Finished undo add." );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^1CreateFX: Finished undo add." );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
clear_fx_hudelements();
|
||||
clear_fx_hudelements();
|
||||
}
|
||||
|
||||
undo_delete( ent_array )
|
||||
{
|
||||
/#
|
||||
println( "^3CreateFX: Undoing delete" );
|
||||
debug_print_ent_array( ent_array, "ent_array in undo_delete()" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^3CreateFX: Undoing delete" );
|
||||
debug_print_ent_array( ent_array, "ent_array in undo_delete()" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
if ( level.createfxent.size == 0 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < ent_array.size )
|
||||
{
|
||||
level.createfxent[ i ] = copy_fx_ent( ent_array[ i ] );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else temp_array = [];
|
||||
i = 0;
|
||||
j = 0;
|
||||
while ( j < level.createfxent.size )
|
||||
{
|
||||
target_ent = level.createfxent[ j ];
|
||||
if ( i >= ent_array.size )
|
||||
{
|
||||
temp_array[ temp_array.size ] = target_ent;
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
else source_ent = ent_array[ i ];
|
||||
if ( target_ent.uniqueid < source_ent.uniqueid )
|
||||
{
|
||||
temp_array[ temp_array.size ] = target_ent;
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_array[ temp_array.size ] = copy_fx_ent( source_ent );
|
||||
j--;
|
||||
ent_array = reorder_ent_array_by_uniqueid( ent_array );
|
||||
|
||||
i++;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
while ( i < ent_array.size )
|
||||
{
|
||||
temp_array[ temp_array.size ] = ent_array[ i ];
|
||||
i++;
|
||||
}
|
||||
level.createfxent = temp_array;
|
||||
if ( level.createfxent.size == 0 )
|
||||
{
|
||||
for ( i = 0; i < ent_array.size; i++ )
|
||||
level.createfxent[i] = copy_fx_ent( ent_array[i] );
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_array = [];
|
||||
i = 0;
|
||||
|
||||
for ( j = 0; j < level.createfxent.size; j++ )
|
||||
{
|
||||
target_ent = level.createfxent[j];
|
||||
|
||||
if ( i >= ent_array.size )
|
||||
{
|
||||
temp_array[temp_array.size] = target_ent;
|
||||
continue;
|
||||
}
|
||||
|
||||
source_ent = ent_array[i];
|
||||
|
||||
if ( target_ent.uniqueid < source_ent.uniqueid )
|
||||
{
|
||||
temp_array[temp_array.size] = target_ent;
|
||||
continue;
|
||||
}
|
||||
|
||||
temp_array[temp_array.size] = copy_fx_ent( source_ent );
|
||||
j--;
|
||||
i++;
|
||||
}
|
||||
|
||||
while ( i < ent_array.size )
|
||||
{
|
||||
temp_array[temp_array.size] = ent_array[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
level.createfxent = temp_array;
|
||||
}
|
||||
/#
|
||||
println( "^1Createfx: Finished undoing delete, pre-selection" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
println( "^1Createfx: Finished undoing delete, pre-selection" );
|
||||
debug_print_ent_array( level.createfxent, "level.createFXent[]" );
|
||||
#/
|
||||
last_id = ent_array[ ent_array.size - 1 ].uniqueid;
|
||||
if ( last_id > ( level.createfxent.size - 1 ) )
|
||||
{
|
||||
last_id = level.createfxent.size - 1;
|
||||
}
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[ j ];
|
||||
i = last_id;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
target_ent = level.createfxent[ i ];
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
target_ent post_entity_creation_function();
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
last_id = ent_array[ent_array.size - 1].uniqueid;
|
||||
|
||||
if ( j < 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_ent = ent_array[ j ];
|
||||
}
|
||||
i--;
|
||||
if ( last_id > level.createfxent.size - 1 )
|
||||
last_id = level.createfxent.size - 1;
|
||||
|
||||
}
|
||||
}
|
||||
update_selected_entities();
|
||||
j = ent_array.size - 1;
|
||||
source_ent = ent_array[j];
|
||||
|
||||
for ( i = last_id; i >= 0; i-- )
|
||||
{
|
||||
target_ent = level.createfxent[i];
|
||||
|
||||
if ( source_ent.uniqueid == target_ent.uniqueid )
|
||||
{
|
||||
target_ent post_entity_creation_function();
|
||||
select_entity( i, target_ent, "skip_undo" );
|
||||
j--;
|
||||
|
||||
if ( j < 0 )
|
||||
break;
|
||||
|
||||
source_ent = ent_array[j];
|
||||
}
|
||||
}
|
||||
|
||||
update_selected_entities();
|
||||
}
|
||||
|
||||
redo()
|
||||
{
|
||||
if ( isDefined( level.createfxent ) || !isDefined( level.cfx_redo_states ) && level.cfx_redo_states.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
clear_entity_selection( "skip_undo" );
|
||||
if ( isDefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_undo();
|
||||
move_redo_state_to_limbo();
|
||||
apply_state_change( "redo", level.cfx_limbo_state );
|
||||
}
|
||||
else revert_state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
apply_state_change( "redo", revert_state );
|
||||
if ( revert_state.operation == "edit" )
|
||||
{
|
||||
move_redo_state_to_limbo();
|
||||
}
|
||||
else
|
||||
{
|
||||
move_redo_state_to_undo();
|
||||
}
|
||||
level.cfx_last_action = "none";
|
||||
if ( !isdefined( level.createfxent ) || !isdefined( level.cfx_redo_states ) || level.cfx_redo_states.size < 1 )
|
||||
return;
|
||||
|
||||
clear_entity_selection( "skip_undo" );
|
||||
|
||||
if ( isdefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
move_limbo_state_to_undo();
|
||||
move_redo_state_to_limbo();
|
||||
apply_state_change( "redo", level.cfx_limbo_state );
|
||||
}
|
||||
else
|
||||
{
|
||||
revert_state = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
apply_state_change( "redo", revert_state );
|
||||
|
||||
if ( revert_state.operation == "edit" )
|
||||
move_redo_state_to_limbo();
|
||||
else
|
||||
move_redo_state_to_undo();
|
||||
}
|
||||
|
||||
level.cfx_last_action = "none";
|
||||
}
|
||||
|
||||
reorder_ent_array_by_uniqueid( ent_array )
|
||||
{
|
||||
if ( ent_array.size <= 1 )
|
||||
{
|
||||
return ent_array;
|
||||
}
|
||||
array_size = ent_array.size;
|
||||
i = 0;
|
||||
while ( i < ( array_size - 1 ) )
|
||||
{
|
||||
j = i + 1;
|
||||
while ( j < array_size )
|
||||
{
|
||||
if ( ent_array[ i ].uniqueid > ent_array[ j ].uniqueid )
|
||||
{
|
||||
temp_ent = ent_array[ i ];
|
||||
ent_array[ i ] = ent_array[ j ];
|
||||
ent_array[ j ] = temp_ent;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return ent_array;
|
||||
if ( ent_array.size <= 1 )
|
||||
return ent_array;
|
||||
|
||||
array_size = ent_array.size;
|
||||
|
||||
for ( i = 0; i < array_size - 1; i++ )
|
||||
{
|
||||
for ( j = i + 1; j < array_size; j++ )
|
||||
{
|
||||
if ( ent_array[i].uniqueid > ent_array[j].uniqueid )
|
||||
{
|
||||
temp_ent = ent_array[i];
|
||||
ent_array[i] = ent_array[j];
|
||||
ent_array[j] = temp_ent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ent_array;
|
||||
}
|
||||
|
||||
copy_fx_ent( ent )
|
||||
{
|
||||
temp_ent = spawnstruct();
|
||||
temp_ent.drawn = ent.drawn;
|
||||
temp_ent.drawn_axis_model = ent.drawn_axis_model;
|
||||
temp_ent.last_fx_index = ent.last_fx_index;
|
||||
temp_ent.textalpha = ent.textalpha;
|
||||
temp_ent.uniqueid = ent.uniqueid;
|
||||
temp_ent.v = ent.v;
|
||||
return temp_ent;
|
||||
temp_ent = spawnstruct();
|
||||
temp_ent.drawn = ent.drawn;
|
||||
temp_ent.drawn_axis_model = ent.drawn_axis_model;
|
||||
temp_ent.last_fx_index = ent.last_fx_index;
|
||||
temp_ent.textalpha = ent.textalpha;
|
||||
temp_ent.uniqueid = ent.uniqueid;
|
||||
temp_ent.v = ent.v;
|
||||
return temp_ent;
|
||||
}
|
||||
|
||||
copy_values_between_fx_ents( source, dest )
|
||||
{
|
||||
dest.drawn = source.drawn;
|
||||
dest.drawn_axis_model = source.drawn_axis_model;
|
||||
dest.last_fx_index = source.last_fx_index;
|
||||
dest.textalpha = source.textalpha;
|
||||
dest.v = source.v;
|
||||
return dest;
|
||||
dest.drawn = source.drawn;
|
||||
dest.drawn_axis_model = source.drawn_axis_model;
|
||||
dest.last_fx_index = source.last_fx_index;
|
||||
dest.textalpha = source.textalpha;
|
||||
dest.v = source.v;
|
||||
return dest;
|
||||
}
|
||||
|
||||
array_pop( array )
|
||||
{
|
||||
array_size = array.size - 1;
|
||||
temp_array = [];
|
||||
if ( array_size <= 0 )
|
||||
{
|
||||
return temp_array;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < array_size )
|
||||
{
|
||||
temp_array[ i ] = array[ i ];
|
||||
i++;
|
||||
}
|
||||
array = temp_array;
|
||||
return array;
|
||||
array_size = array.size - 1;
|
||||
temp_array = [];
|
||||
|
||||
if ( array_size <= 0 )
|
||||
return temp_array;
|
||||
|
||||
for ( i = 0; i < array_size; i++ )
|
||||
temp_array[i] = array[i];
|
||||
|
||||
array = temp_array;
|
||||
return array;
|
||||
}
|
||||
|
||||
array_drop( array )
|
||||
{
|
||||
if ( array.size > 0 )
|
||||
{
|
||||
temp_array = [];
|
||||
i = 1;
|
||||
while ( i < array.size )
|
||||
{
|
||||
temp_array[ i - 1 ] = array[ i ];
|
||||
i++;
|
||||
}
|
||||
array = temp_array;
|
||||
}
|
||||
return array;
|
||||
if ( array.size > 0 )
|
||||
{
|
||||
temp_array = [];
|
||||
|
||||
for ( i = 1; i < array.size; i++ )
|
||||
temp_array[i - 1] = array[i];
|
||||
|
||||
array = temp_array;
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
debug_print_ent_array( array, name )
|
||||
{
|
||||
/#
|
||||
if ( isDefined( name ) )
|
||||
{
|
||||
println( "Printing out " + name );
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "Printing out some array" );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
if ( !isDefined( array[ i ] ) )
|
||||
{
|
||||
println( "" + i + ": deleted effect" );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "" + i + ": uniqueid: " + array[ i ].uniqueid + " fxid: " + array[ i ].v[ "fxid" ] );
|
||||
}
|
||||
i++;
|
||||
if ( isdefined( name ) )
|
||||
println( "Printing out " + name );
|
||||
else
|
||||
println( "Printing out some array" );
|
||||
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
if ( !isdefined( array[i] ) )
|
||||
{
|
||||
println( "" + i + ": deleted effect" );
|
||||
continue;
|
||||
}
|
||||
|
||||
println( "" + i + ": uniqueid: " + array[i].uniqueid + " fxid: " + array[i].v["fxid"] );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_print_latest_state( type )
|
||||
{
|
||||
/#
|
||||
println( "^3Saving " + type + " state" );
|
||||
if ( type == "undo" )
|
||||
{
|
||||
if ( !isDefined( level.cfx_undo_states[ level.cfx_undo_states.size - 1 ] ) )
|
||||
{
|
||||
println( "There are no undo states." );
|
||||
return;
|
||||
}
|
||||
state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ];
|
||||
size = level.cfx_undo_states.size - 1;
|
||||
}
|
||||
else if ( type == "redo" )
|
||||
{
|
||||
if ( !isDefined( level.cfx_redo_states[ level.cfx_redo_states.size - 1 ] ) )
|
||||
{
|
||||
println( "There are no redo states." );
|
||||
return;
|
||||
}
|
||||
state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ];
|
||||
size = level.cfx_redo_states.size - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
println( "There is no limbo state." );
|
||||
return;
|
||||
}
|
||||
state = level.cfx_limbo_state;
|
||||
size = 0;
|
||||
}
|
||||
println( "State " + size + " - " + state.operation + ": " + state.last_action );
|
||||
debug_print_ent_array( state.ent_array, "save state ent_array" );
|
||||
println( "^3Saving " + type + " state" );
|
||||
|
||||
if ( type == "undo" )
|
||||
{
|
||||
if ( !isdefined( level.cfx_undo_states[level.cfx_undo_states.size - 1] ) )
|
||||
{
|
||||
println( "There are no undo states." );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.cfx_undo_states[level.cfx_undo_states.size - 1];
|
||||
size = level.cfx_undo_states.size - 1;
|
||||
}
|
||||
else if ( type == "redo" )
|
||||
{
|
||||
if ( !isdefined( level.cfx_redo_states[level.cfx_redo_states.size - 1] ) )
|
||||
{
|
||||
println( "There are no redo states." );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.cfx_redo_states[level.cfx_redo_states.size - 1];
|
||||
size = level.cfx_redo_states.size - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isdefined( level.cfx_limbo_state ) )
|
||||
{
|
||||
println( "There is no limbo state." );
|
||||
return;
|
||||
}
|
||||
|
||||
state = level.cfx_limbo_state;
|
||||
size = 0;
|
||||
}
|
||||
|
||||
println( "State " + size + " - " + state.operation + ": " + state.last_action );
|
||||
debug_print_ent_array( state.ent_array, "save state ent_array" );
|
||||
#/
|
||||
}
|
||||
|
@ -1,355 +1,356 @@
|
||||
#include maps/mp/_entityheadicons;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\_entityheadicons;
|
||||
|
||||
init()
|
||||
{
|
||||
level.decoyweapons = [];
|
||||
level.decoyweapons[ "fullauto" ] = [];
|
||||
level.decoyweapons[ "semiauto" ] = [];
|
||||
level.decoyweapons[ "fullauto" ][ level.decoyweapons[ "fullauto" ].size ] = "uzi_mp";
|
||||
level.decoyweapons[ "semiauto" ][ level.decoyweapons[ "semiauto" ].size ] = "m1911_mp";
|
||||
level.decoyweapons[ "semiauto" ][ level.decoyweapons[ "semiauto" ].size ] = "python_mp";
|
||||
level.decoyweapons[ "semiauto" ][ level.decoyweapons[ "semiauto" ].size ] = "cz75_mp";
|
||||
level.decoyweapons[ "semiauto" ][ level.decoyweapons[ "semiauto" ].size ] = "fnfal_mp";
|
||||
level.decoyweapons = [];
|
||||
level.decoyweapons["fullauto"] = [];
|
||||
level.decoyweapons["semiauto"] = [];
|
||||
level.decoyweapons["fullauto"][level.decoyweapons["fullauto"].size] = "uzi_mp";
|
||||
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "m1911_mp";
|
||||
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "python_mp";
|
||||
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "cz75_mp";
|
||||
level.decoyweapons["semiauto"][level.decoyweapons["semiauto"].size] = "fnfal_mp";
|
||||
}
|
||||
|
||||
createdecoywatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "nightingale", "nightingale_mp", self.team );
|
||||
watcher.onspawn = ::onspawndecoy;
|
||||
watcher.detonate = ::decoydetonate;
|
||||
watcher.deleteondifferentobjectspawn = 0;
|
||||
watcher.headicon = 0;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createuseweaponobjectwatcher( "nightingale", "nightingale_mp", self.team );
|
||||
watcher.onspawn = ::onspawndecoy;
|
||||
watcher.detonate = ::decoydetonate;
|
||||
watcher.deleteondifferentobjectspawn = 0;
|
||||
watcher.headicon = 0;
|
||||
}
|
||||
|
||||
onspawndecoy( watcher, owner )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject( watcher, owner );
|
||||
self.initial_velocity = self getvelocity();
|
||||
delay = 1;
|
||||
wait delay;
|
||||
decoy_time = 30;
|
||||
spawn_time = getTime();
|
||||
owner addweaponstat( "nightingale_mp", "used", 1 );
|
||||
self thread simulateweaponfire( owner );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( getTime() > ( spawn_time + ( decoy_time * 1000 ) ) )
|
||||
{
|
||||
self destroydecoy( watcher, owner );
|
||||
return;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
maps\mp\gametypes\_weaponobjects::onspawnuseweaponobject( watcher, owner );
|
||||
self.initial_velocity = self getvelocity();
|
||||
delay = 1;
|
||||
wait( delay );
|
||||
decoy_time = 30;
|
||||
spawn_time = gettime();
|
||||
owner addweaponstat( "nightingale_mp", "used", 1 );
|
||||
self thread simulateweaponfire( owner );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( gettime() > spawn_time + decoy_time * 1000 )
|
||||
{
|
||||
self destroydecoy( watcher, owner );
|
||||
return;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
movedecoy( owner, count, fire_time, main_dir, max_offset_angle )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "done" );
|
||||
if ( !self isonground() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
min_speed = 100;
|
||||
max_speed = 200;
|
||||
min_up_speed = 100;
|
||||
max_up_speed = 200;
|
||||
current_main_dir = randomintrange( main_dir - max_offset_angle, main_dir + max_offset_angle );
|
||||
avel = ( randomfloatrange( 800, 1800 ) * ( ( randomintrange( 0, 2 ) * 2 ) - 1 ), 0, randomfloatrange( 580, 940 ) * ( ( randomintrange( 0, 2 ) * 2 ) - 1 ) );
|
||||
intial_up = randomfloatrange( min_up_speed, max_up_speed );
|
||||
start_time = getTime();
|
||||
gravity = getDvarInt( "bg_gravity" );
|
||||
i = 0;
|
||||
while ( i < 1 )
|
||||
{
|
||||
angles = ( 0, randomintrange( current_main_dir - max_offset_angle, current_main_dir + max_offset_angle ), 0 );
|
||||
dir = anglesToForward( angles );
|
||||
dir = vectorScale( dir, randomfloatrange( min_speed, max_speed ) );
|
||||
deltatime = ( getTime() - start_time ) * 0,001;
|
||||
up = ( 0, 0, intial_up - ( 800 * deltatime ) );
|
||||
self launch( dir + up, avel );
|
||||
wait fire_time;
|
||||
i++;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "done" );
|
||||
|
||||
if ( !self isonground() )
|
||||
return;
|
||||
|
||||
min_speed = 100;
|
||||
max_speed = 200;
|
||||
min_up_speed = 100;
|
||||
max_up_speed = 200;
|
||||
current_main_dir = randomintrange( main_dir - max_offset_angle, main_dir + max_offset_angle );
|
||||
avel = ( randomfloatrange( 800, 1800 ) * ( randomintrange( 0, 2 ) * 2 - 1 ), 0, randomfloatrange( 580, 940 ) * ( randomintrange( 0, 2 ) * 2 - 1 ) );
|
||||
intial_up = randomfloatrange( min_up_speed, max_up_speed );
|
||||
start_time = gettime();
|
||||
gravity = getdvarint( "bg_gravity" );
|
||||
|
||||
for ( i = 0; i < 1; i++ )
|
||||
{
|
||||
angles = ( 0, randomintrange( current_main_dir - max_offset_angle, current_main_dir + max_offset_angle ), 0 );
|
||||
dir = anglestoforward( angles );
|
||||
dir = vectorscale( dir, randomfloatrange( min_speed, max_speed ) );
|
||||
deltatime = ( gettime() - start_time ) * 0.001;
|
||||
up = ( 0, 0, intial_up - 800 * deltatime );
|
||||
self launch( dir + up, avel );
|
||||
wait( fire_time );
|
||||
}
|
||||
}
|
||||
|
||||
destroydecoy( watcher, owner )
|
||||
{
|
||||
self notify( "done" );
|
||||
self maps/mp/_entityheadicons::setentityheadicon( "none" );
|
||||
self notify( "done" );
|
||||
self maps\mp\_entityheadicons::setentityheadicon( "none" );
|
||||
}
|
||||
|
||||
decoydetonate( attacker )
|
||||
{
|
||||
self notify( "done" );
|
||||
self maps/mp/_entityheadicons::setentityheadicon( "none" );
|
||||
self notify( "done" );
|
||||
self maps\mp\_entityheadicons::setentityheadicon( "none" );
|
||||
}
|
||||
|
||||
getweaponfordecoy( owner )
|
||||
{
|
||||
weapon = pickrandomweapon();
|
||||
return weapon;
|
||||
weapon = pickrandomweapon();
|
||||
return weapon;
|
||||
}
|
||||
|
||||
simulateweaponfire( owner )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "done" );
|
||||
weapon = getweaponfordecoy( owner );
|
||||
if ( weapon == "none" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self thread watchforexplosion( owner, weapon );
|
||||
self thread trackmaindirection();
|
||||
self.max_offset_angle = 30;
|
||||
weapon_class = getweaponclass( weapon );
|
||||
switch( weapon_class )
|
||||
{
|
||||
case "weapon_assault":
|
||||
case "weapon_cqb":
|
||||
case "weapon_hmg":
|
||||
case "weapon_lmg":
|
||||
case "weapon_smg":
|
||||
simulateweaponfiremachinegun( owner, weapon );
|
||||
break;
|
||||
case "weapon_sniper":
|
||||
simulateweaponfiresniper( owner, weapon );
|
||||
break;
|
||||
case "weapon_pistol":
|
||||
simulateweaponfirepistol( owner, weapon );
|
||||
break;
|
||||
case "weapon_shotgun":
|
||||
simulateweaponfireshotgun( owner, weapon );
|
||||
break;
|
||||
default:
|
||||
simulateweaponfiremachinegun( owner, weapon );
|
||||
break;
|
||||
}
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "done" );
|
||||
weapon = getweaponfordecoy( owner );
|
||||
|
||||
if ( weapon == "none" )
|
||||
return;
|
||||
|
||||
self thread watchforexplosion( owner, weapon );
|
||||
self thread trackmaindirection();
|
||||
self.max_offset_angle = 30;
|
||||
weapon_class = getweaponclass( weapon );
|
||||
|
||||
switch ( weapon_class )
|
||||
{
|
||||
case "weapon_smg":
|
||||
case "weapon_lmg":
|
||||
case "weapon_hmg":
|
||||
case "weapon_cqb":
|
||||
case "weapon_assault":
|
||||
simulateweaponfiremachinegun( owner, weapon );
|
||||
break;
|
||||
case "weapon_sniper":
|
||||
simulateweaponfiresniper( owner, weapon );
|
||||
break;
|
||||
case "weapon_pistol":
|
||||
simulateweaponfirepistol( owner, weapon );
|
||||
break;
|
||||
case "weapon_shotgun":
|
||||
simulateweaponfireshotgun( owner, weapon );
|
||||
break;
|
||||
default:
|
||||
simulateweaponfiremachinegun( owner, weapon );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
simulateweaponfiremachinegun( owner, weapon )
|
||||
{
|
||||
if ( weaponissemiauto( weapon ) )
|
||||
{
|
||||
simulateweaponfiremachinegunsemiauto( owner, weapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
simulateweaponfiremachinegunfullauto( owner, weapon );
|
||||
}
|
||||
if ( weaponissemiauto( weapon ) )
|
||||
simulateweaponfiremachinegunsemiauto( owner, weapon );
|
||||
else
|
||||
simulateweaponfiremachinegunfullauto( owner, weapon );
|
||||
}
|
||||
|
||||
simulateweaponfiremachinegunsemiauto( owner, weapon )
|
||||
{
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
burst_spacing_min = 4;
|
||||
burst_spacing_max = 10;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( clipsize <= 1 )
|
||||
{
|
||||
burst_count = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
}
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 1 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
burst_spacing_min = 4;
|
||||
burst_spacing_max = 10;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( clipsize <= 1 )
|
||||
burst_count = 1;
|
||||
else
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 1 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
}
|
||||
|
||||
simulateweaponfirepistol( owner, weapon )
|
||||
{
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
burst_spacing_min = 0,5;
|
||||
burst_spacing_max = 4;
|
||||
while ( 1 )
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 0 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
burst_spacing_min = 0.5;
|
||||
burst_spacing_max = 4;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 0 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
}
|
||||
|
||||
simulateweaponfireshotgun( owner, weapon )
|
||||
{
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
if ( clipsize > 2 )
|
||||
{
|
||||
clipsize = 2;
|
||||
}
|
||||
burst_spacing_min = 0,5;
|
||||
burst_spacing_max = 4;
|
||||
while ( 1 )
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 0 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
|
||||
if ( clipsize > 2 )
|
||||
clipsize = 2;
|
||||
|
||||
burst_spacing_min = 0.5;
|
||||
burst_spacing_max = 4;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 0 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
}
|
||||
|
||||
simulateweaponfiremachinegunfullauto( owner, weapon )
|
||||
{
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
if ( clipsize > 30 )
|
||||
{
|
||||
clipsize = 30;
|
||||
}
|
||||
burst_spacing_min = 2;
|
||||
burst_spacing_max = 6;
|
||||
while ( 1 )
|
||||
{
|
||||
burst_count = randomintrange( int( clipsize * 0,6 ), clipsize );
|
||||
interrupt = 0;
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, interrupt );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
|
||||
if ( clipsize > 30 )
|
||||
clipsize = 30;
|
||||
|
||||
burst_spacing_min = 2;
|
||||
burst_spacing_max = 6;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
burst_count = randomintrange( int( clipsize * 0.6 ), clipsize );
|
||||
interrupt = 0;
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, interrupt );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
}
|
||||
|
||||
simulateweaponfiresniper( owner, weapon )
|
||||
{
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
if ( clipsize > 2 )
|
||||
{
|
||||
clipsize = 2;
|
||||
}
|
||||
burst_spacing_min = 3;
|
||||
burst_spacing_max = 5;
|
||||
while ( 1 )
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 0 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
firetime = weaponfiretime( weapon );
|
||||
clipsize = weaponclipsize( weapon );
|
||||
reloadtime = weaponreloadtime( weapon );
|
||||
|
||||
if ( clipsize > 2 )
|
||||
clipsize = 2;
|
||||
|
||||
burst_spacing_min = 3;
|
||||
burst_spacing_max = 5;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
burst_count = randomintrange( 1, clipsize );
|
||||
self thread movedecoy( owner, burst_count, firetime, self.main_dir, self.max_offset_angle );
|
||||
self fireburst( owner, weapon, firetime, burst_count, 0 );
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
}
|
||||
|
||||
fireburst( owner, weapon, firetime, count, interrupt )
|
||||
{
|
||||
interrupt_shot = count;
|
||||
if ( interrupt )
|
||||
{
|
||||
interrupt_shot = int( count * randomfloatrange( 0,6, 0,8 ) );
|
||||
}
|
||||
self fakefire( owner, self.origin, weapon, interrupt_shot );
|
||||
wait ( firetime * interrupt_shot );
|
||||
if ( interrupt )
|
||||
{
|
||||
self fakefire( owner, self.origin, weapon, count - interrupt_shot );
|
||||
wait ( firetime * ( count - interrupt_shot ) );
|
||||
}
|
||||
interrupt_shot = count;
|
||||
|
||||
if ( interrupt )
|
||||
interrupt_shot = int( count * randomfloatrange( 0.6, 0.8 ) );
|
||||
|
||||
self fakefire( owner, self.origin, weapon, interrupt_shot );
|
||||
wait( firetime * interrupt_shot );
|
||||
|
||||
if ( interrupt )
|
||||
{
|
||||
self fakefire( owner, self.origin, weapon, count - interrupt_shot );
|
||||
wait( firetime * ( count - interrupt_shot ) );
|
||||
}
|
||||
}
|
||||
|
||||
finishwhileloop( weapon, reloadtime, burst_spacing_min, burst_spacing_max )
|
||||
{
|
||||
if ( shouldplayreloadsound() )
|
||||
{
|
||||
playreloadsounds( weapon, reloadtime );
|
||||
}
|
||||
else
|
||||
{
|
||||
wait randomfloatrange( burst_spacing_min, burst_spacing_max );
|
||||
}
|
||||
if ( shouldplayreloadsound() )
|
||||
playreloadsounds( weapon, reloadtime );
|
||||
else
|
||||
wait( randomfloatrange( burst_spacing_min, burst_spacing_max ) );
|
||||
}
|
||||
|
||||
playreloadsounds( weapon, reloadtime )
|
||||
{
|
||||
divy_it_up = ( reloadtime - 0,1 ) / 2;
|
||||
wait 0,1;
|
||||
self playsound( "fly_assault_reload_npc_mag_out" );
|
||||
wait divy_it_up;
|
||||
self playsound( "fly_assault_reload_npc_mag_in" );
|
||||
wait divy_it_up;
|
||||
divy_it_up = ( reloadtime - 0.1 ) / 2;
|
||||
wait 0.1;
|
||||
self playsound( "fly_assault_reload_npc_mag_out" );
|
||||
wait( divy_it_up );
|
||||
self playsound( "fly_assault_reload_npc_mag_in" );
|
||||
wait( divy_it_up );
|
||||
}
|
||||
|
||||
watchforexplosion( owner, weapon )
|
||||
{
|
||||
self thread watchfordeathbeforeexplosion();
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death_before_explode" );
|
||||
self waittill( "explode", pos );
|
||||
level thread doexplosion( owner, pos, weapon, randomintrange( 5, 10 ) );
|
||||
self thread watchfordeathbeforeexplosion();
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death_before_explode" );
|
||||
|
||||
self waittill( "explode", pos );
|
||||
|
||||
level thread doexplosion( owner, pos, weapon, randomintrange( 5, 10 ) );
|
||||
}
|
||||
|
||||
watchfordeathbeforeexplosion()
|
||||
{
|
||||
self waittill( "death" );
|
||||
wait 0,1;
|
||||
self notify( "death_before_explode" );
|
||||
self waittill( "death" );
|
||||
|
||||
wait 0.1;
|
||||
self notify( "death_before_explode" );
|
||||
}
|
||||
|
||||
doexplosion( owner, pos, weapon, count )
|
||||
{
|
||||
min_offset = 100;
|
||||
max_offset = 500;
|
||||
i = 0;
|
||||
while ( i < count )
|
||||
{
|
||||
wait randomfloatrange( 0,1, 0,5 );
|
||||
offset = ( randomfloatrange( min_offset, max_offset ) * ( ( randomintrange( 0, 2 ) * 2 ) - 1 ), randomfloatrange( min_offset, max_offset ) * ( ( randomintrange( 0, 2 ) * 2 ) - 1 ), 0 );
|
||||
owner fakefire( owner, pos + offset, weapon, 1 );
|
||||
i++;
|
||||
}
|
||||
min_offset = 100;
|
||||
max_offset = 500;
|
||||
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
wait( randomfloatrange( 0.1, 0.5 ) );
|
||||
offset = ( randomfloatrange( min_offset, max_offset ) * ( randomintrange( 0, 2 ) * 2 - 1 ), randomfloatrange( min_offset, max_offset ) * ( randomintrange( 0, 2 ) * 2 - 1 ), 0 );
|
||||
owner fakefire( owner, pos + offset, weapon, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
pickrandomweapon()
|
||||
{
|
||||
type = "fullauto";
|
||||
if ( randomintrange( 0, 10 ) < 3 )
|
||||
{
|
||||
type = "semiauto";
|
||||
}
|
||||
randomval = randomintrange( 0, level.decoyweapons[ type ].size );
|
||||
type = "fullauto";
|
||||
|
||||
if ( randomintrange( 0, 10 ) < 3 )
|
||||
type = "semiauto";
|
||||
|
||||
randomval = randomintrange( 0, level.decoyweapons[type].size );
|
||||
/#
|
||||
println( "Decoy type: " + type + " weapon: " + level.decoyweapons[ type ][ randomval ] );
|
||||
println( "Decoy type: " + type + " weapon: " + level.decoyweapons[type][randomval] );
|
||||
#/
|
||||
return level.decoyweapons[ type ][ randomval ];
|
||||
return level.decoyweapons[type][randomval];
|
||||
}
|
||||
|
||||
shouldplayreloadsound()
|
||||
{
|
||||
if ( randomintrange( 0, 5 ) == 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( randomintrange( 0, 5 ) == 1 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
trackmaindirection()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "done" );
|
||||
self.main_dir = int( vectorToAngle( ( self.initial_velocity[ 0 ], self.initial_velocity[ 1 ], 0 ) )[ 1 ] );
|
||||
up = ( 0, 0, 1 );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_bounce", pos, normal );
|
||||
dot = vectordot( normal, up );
|
||||
if ( dot < 0,5 && dot > -0,5 )
|
||||
{
|
||||
self.main_dir = int( vectorToAngle( ( normal[ 0 ], normal[ 1 ], 0 ) )[ 1 ] );
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "done" );
|
||||
self.main_dir = int( vectortoangles( ( self.initial_velocity[0], self.initial_velocity[1], 0 ) )[1] );
|
||||
up = ( 0, 0, 1 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "grenade_bounce", pos, normal );
|
||||
|
||||
dot = vectordot( normal, up );
|
||||
|
||||
if ( dot < 0.5 && dot > -0.5 )
|
||||
self.main_dir = int( vectortoangles( ( normal[0], normal[1], 0 ) )[1] );
|
||||
}
|
||||
}
|
||||
|
@ -1,102 +1,94 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.bookmark[ "kill" ] = 0;
|
||||
level.bookmark[ "event" ] = 1;
|
||||
level.bookmark[ "zm_round_end" ] = 2;
|
||||
level.bookmark[ "zm_player_downed" ] = 3;
|
||||
level.bookmark[ "zm_player_revived" ] = 4;
|
||||
level.bookmark[ "zm_player_bledout" ] = 5;
|
||||
level.bookmark[ "zm_player_use_magicbox" ] = 6;
|
||||
level.bookmark[ "score_event" ] = 7;
|
||||
level.bookmark[ "medal" ] = 8;
|
||||
level.bookmark[ "round_result" ] = 9;
|
||||
level.bookmark[ "game_result" ] = 10;
|
||||
level.bookmark[ "zm_powerup_dropped" ] = 11;
|
||||
level.bookmark[ "zm_player_powerup_grabbed" ] = 12;
|
||||
level.bookmark[ "zm_player_perk" ] = 13;
|
||||
level.bookmark[ "zm_power" ] = 14;
|
||||
level.bookmark[ "zm_player_door" ] = 15;
|
||||
level.bookmark[ "zm_player_buildable_placed" ] = 16;
|
||||
level.bookmark[ "zm_player_use_packapunch" ] = 17;
|
||||
level.bookmark[ "zm_player_rampage" ] = 18;
|
||||
level.bookmark[ "zm_player_grenade_special" ] = 19;
|
||||
level.bookmark[ "zm_player_grenade_multiattack" ] = 20;
|
||||
level.bookmark[ "zm_player_meat_stink" ] = 21;
|
||||
level.bookmark[ "zm_player_grabbed_magicbox" ] = 22;
|
||||
level.bookmark[ "zm_player_grabbed_packapunch" ] = 23;
|
||||
level.bookmark[ "zm_player_grenade_special_long" ] = 24;
|
||||
level.bookmark["kill"] = 0;
|
||||
level.bookmark["event"] = 1;
|
||||
level.bookmark["zm_round_end"] = 2;
|
||||
level.bookmark["zm_player_downed"] = 3;
|
||||
level.bookmark["zm_player_revived"] = 4;
|
||||
level.bookmark["zm_player_bledout"] = 5;
|
||||
level.bookmark["zm_player_use_magicbox"] = 6;
|
||||
level.bookmark["score_event"] = 7;
|
||||
level.bookmark["medal"] = 8;
|
||||
level.bookmark["round_result"] = 9;
|
||||
level.bookmark["game_result"] = 10;
|
||||
level.bookmark["zm_powerup_dropped"] = 11;
|
||||
level.bookmark["zm_player_powerup_grabbed"] = 12;
|
||||
level.bookmark["zm_player_perk"] = 13;
|
||||
level.bookmark["zm_power"] = 14;
|
||||
level.bookmark["zm_player_door"] = 15;
|
||||
level.bookmark["zm_player_buildable_placed"] = 16;
|
||||
level.bookmark["zm_player_use_packapunch"] = 17;
|
||||
level.bookmark["zm_player_rampage"] = 18;
|
||||
level.bookmark["zm_player_grenade_special"] = 19;
|
||||
level.bookmark["zm_player_grenade_multiattack"] = 20;
|
||||
level.bookmark["zm_player_meat_stink"] = 21;
|
||||
level.bookmark["zm_player_grabbed_magicbox"] = 22;
|
||||
level.bookmark["zm_player_grabbed_packapunch"] = 23;
|
||||
level.bookmark["zm_player_grenade_special_long"] = 24;
|
||||
}
|
||||
|
||||
bookmark( type, time, clientent1, clientent2, eventpriority, inflictorent, overrideentitycamera, actorent ) //checked matches cerberus output
|
||||
bookmark( type, time, clientent1, clientent2, eventpriority, inflictorent, overrideentitycamera, actorent )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.bookmark[ type ] ), "Unable to find a bookmark type for type - " + type );
|
||||
assert( isdefined( level.bookmark[type] ), "Unable to find a bookmark type for type - " + type );
|
||||
#/
|
||||
*/
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
actorentnum = undefined;
|
||||
scoreeventpriority = 0;
|
||||
if ( isDefined( clientent1 ) )
|
||||
{
|
||||
client1 = clientent1 getentitynumber();
|
||||
}
|
||||
if ( isDefined( clientent2 ) )
|
||||
{
|
||||
client2 = clientent2 getentitynumber();
|
||||
}
|
||||
if ( isDefined( eventpriority ) )
|
||||
{
|
||||
scoreeventpriority = eventpriority;
|
||||
}
|
||||
if ( isDefined( inflictorent ) )
|
||||
{
|
||||
inflictorentnum = inflictorent getentitynumber();
|
||||
inflictorenttype = inflictorent getentitytype();
|
||||
if ( isDefined( inflictorent.birthtime ) )
|
||||
{
|
||||
inflictorbirthtime = inflictorent.birthtime;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( overrideentitycamera ) )
|
||||
{
|
||||
overrideentitycamera = 0;
|
||||
}
|
||||
if ( isDefined( actorent ) )
|
||||
{
|
||||
actorentnum = actorent getentitynumber();
|
||||
}
|
||||
adddemobookmark( level.bookmark[ type ], time, client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
actorentnum = undefined;
|
||||
scoreeventpriority = 0;
|
||||
|
||||
if ( isdefined( clientent1 ) )
|
||||
client1 = clientent1 getentitynumber();
|
||||
|
||||
if ( isdefined( clientent2 ) )
|
||||
client2 = clientent2 getentitynumber();
|
||||
|
||||
if ( isdefined( eventpriority ) )
|
||||
scoreeventpriority = eventpriority;
|
||||
|
||||
if ( isdefined( inflictorent ) )
|
||||
{
|
||||
inflictorentnum = inflictorent getentitynumber();
|
||||
inflictorenttype = inflictorent getentitytype();
|
||||
|
||||
if ( isdefined( inflictorent.birthtime ) )
|
||||
inflictorbirthtime = inflictorent.birthtime;
|
||||
}
|
||||
|
||||
if ( !isdefined( overrideentitycamera ) )
|
||||
overrideentitycamera = 0;
|
||||
|
||||
if ( isdefined( actorent ) )
|
||||
actorentnum = actorent getentitynumber();
|
||||
|
||||
adddemobookmark( level.bookmark[type], time, client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
}
|
||||
|
||||
gameresultbookmark( type, winningteamindex, losingteamindex ) //checked matches cerberus output
|
||||
gameresultbookmark( type, winningteamindex, losingteamindex )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.bookmark[ type ] ), "Unable to find a bookmark type for type - " + type );
|
||||
assert( isdefined( level.bookmark[type] ), "Unable to find a bookmark type for type - " + type );
|
||||
#/
|
||||
*/
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
scoreeventpriority = 0;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
overrideentitycamera = 0;
|
||||
actorentnum = undefined;
|
||||
if ( isDefined( winningteamindex ) )
|
||||
{
|
||||
client1 = winningteamindex;
|
||||
}
|
||||
if ( isDefined( losingteamindex ) )
|
||||
{
|
||||
client2 = losingteamindex;
|
||||
}
|
||||
adddemobookmark( level.bookmark[ type ], getTime(), client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
}
|
||||
client1 = 255;
|
||||
client2 = 255;
|
||||
scoreeventpriority = 0;
|
||||
inflictorentnum = -1;
|
||||
inflictorenttype = 0;
|
||||
inflictorbirthtime = 0;
|
||||
overrideentitycamera = 0;
|
||||
actorentnum = undefined;
|
||||
|
||||
if ( isdefined( winningteamindex ) )
|
||||
client1 = winningteamindex;
|
||||
|
||||
if ( isdefined( losingteamindex ) )
|
||||
client2 = losingteamindex;
|
||||
|
||||
adddemobookmark( level.bookmark[type], gettime(), client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum );
|
||||
}
|
||||
|
@ -1,480 +1,443 @@
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_globallogic_player;
|
||||
#include maps\mp\_challenges;
|
||||
|
||||
#using_animtree( "mp_vehicles" );
|
||||
#using_animtree("mp_vehicles");
|
||||
|
||||
init()
|
||||
{
|
||||
level.destructible_callbacks = [];
|
||||
destructibles = getentarray( "destructible", "targetname" );
|
||||
if ( destructibles.size <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
precacheitem( "destructible_car_mp" );
|
||||
precacheitem( "explodable_barrel_mp" );
|
||||
i = 0;
|
||||
while ( i < destructibles.size )
|
||||
{
|
||||
if ( getsubstr( destructibles[ i ].destructibledef, 0, 4 ) == "veh_" )
|
||||
{
|
||||
destructibles[ i ] thread destructible_car_death_think();
|
||||
destructibles[ i ] thread destructible_car_grenade_stuck_think();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( issubstr( destructibles[ i ].destructibledef, "barrel" ) )
|
||||
{
|
||||
destructibles[ i ] thread destructible_barrel_death_think();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( issubstr( destructibles[ i ].destructibledef, "gaspump" ) )
|
||||
{
|
||||
destructibles[ i ] thread destructible_barrel_death_think();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( destructibles[ i ].destructibledef == "fxdest_upl_metal_tank_01" )
|
||||
{
|
||||
destructibles[ i ] thread destructible_tank_grenade_stuck_think();
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
destructible_anims = [];
|
||||
destructible_anims[ "car" ] = %veh_car_destroy;
|
||||
level.destructible_callbacks = [];
|
||||
destructibles = getentarray( "destructible", "targetname" );
|
||||
|
||||
if ( destructibles.size <= 0 )
|
||||
return;
|
||||
|
||||
precacheitem( "destructible_car_mp" );
|
||||
precacheitem( "explodable_barrel_mp" );
|
||||
|
||||
for ( i = 0; i < destructibles.size; i++ )
|
||||
{
|
||||
if ( getsubstr( destructibles[i].destructibledef, 0, 4 ) == "veh_" )
|
||||
{
|
||||
destructibles[i] thread destructible_car_death_think();
|
||||
destructibles[i] thread destructible_car_grenade_stuck_think();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( issubstr( destructibles[i].destructibledef, "barrel" ) )
|
||||
{
|
||||
destructibles[i] thread destructible_barrel_death_think();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( issubstr( destructibles[i].destructibledef, "gaspump" ) )
|
||||
{
|
||||
destructibles[i] thread destructible_barrel_death_think();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( destructibles[i].destructibledef == "fxdest_upl_metal_tank_01" )
|
||||
destructibles[i] thread destructible_tank_grenade_stuck_think();
|
||||
}
|
||||
|
||||
destructible_anims = [];
|
||||
destructible_anims["car"] = %veh_car_destroy;
|
||||
}
|
||||
|
||||
destructible_event_callback( destructible_event, attacker, weapon )
|
||||
{
|
||||
explosion_radius = 0;
|
||||
if ( issubstr( destructible_event, "explode" ) && destructible_event != "explode" )
|
||||
{
|
||||
tokens = strtok( destructible_event, "_" );
|
||||
explosion_radius = tokens[ 1 ];
|
||||
if ( explosion_radius == "sm" )
|
||||
{
|
||||
explosion_radius = 150;
|
||||
}
|
||||
else if ( explosion_radius == "lg" )
|
||||
{
|
||||
explosion_radius = 450;
|
||||
}
|
||||
else
|
||||
{
|
||||
explosion_radius = int( explosion_radius );
|
||||
}
|
||||
destructible_event = "explode_complex";
|
||||
}
|
||||
if ( issubstr( destructible_event, "simple_timed_explosion" ) )
|
||||
{
|
||||
self thread simple_timed_explosion( destructible_event, attacker );
|
||||
return;
|
||||
}
|
||||
switch( destructible_event )
|
||||
{
|
||||
case "destructible_car_explosion":
|
||||
self destructible_car_explosion( attacker );
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
self.destroyingweapon = weapon;
|
||||
}
|
||||
break;
|
||||
case "destructible_car_fire":
|
||||
self thread destructible_car_fire_think( attacker );
|
||||
if ( isDefined( weapon ) )
|
||||
{
|
||||
self.destroyingweapon = weapon;
|
||||
}
|
||||
break;
|
||||
case "destructible_barrel_fire":
|
||||
self thread destructible_barrel_fire_think( attacker );
|
||||
break;
|
||||
case "destructible_barrel_explosion":
|
||||
self destructible_barrel_explosion( attacker );
|
||||
break;
|
||||
case "explode":
|
||||
self thread simple_explosion( attacker );
|
||||
break;
|
||||
case "explode_complex":
|
||||
self thread complex_explosion( attacker, explosion_radius );
|
||||
break;
|
||||
default:
|
||||
}
|
||||
if ( isDefined( level.destructible_callbacks[ destructible_event ] ) )
|
||||
{
|
||||
self thread [[ level.destructible_callbacks[ destructible_event ] ]]( destructible_event, attacker );
|
||||
}
|
||||
}
|
||||
explosion_radius = 0;
|
||||
|
||||
if ( issubstr( destructible_event, "explode" ) && destructible_event != "explode" )
|
||||
{
|
||||
tokens = strtok( destructible_event, "_" );
|
||||
explosion_radius = tokens[1];
|
||||
|
||||
if ( explosion_radius == "sm" )
|
||||
explosion_radius = 150;
|
||||
else if ( explosion_radius == "lg" )
|
||||
explosion_radius = 450;
|
||||
else
|
||||
explosion_radius = int( explosion_radius );
|
||||
|
||||
destructible_event = "explode_complex";
|
||||
}
|
||||
|
||||
if ( issubstr( destructible_event, "simple_timed_explosion" ) )
|
||||
{
|
||||
self thread simple_timed_explosion( destructible_event, attacker );
|
||||
return;
|
||||
}
|
||||
|
||||
switch ( destructible_event )
|
||||
{
|
||||
case "destructible_car_explosion":
|
||||
self destructible_car_explosion( attacker );
|
||||
|
||||
if ( isdefined( weapon ) )
|
||||
self.destroyingweapon = weapon;
|
||||
|
||||
break;
|
||||
case "destructible_car_fire":
|
||||
self thread destructible_car_fire_think( attacker );
|
||||
|
||||
if ( isdefined( weapon ) )
|
||||
self.destroyingweapon = weapon;
|
||||
|
||||
break;
|
||||
case "destructible_barrel_fire":
|
||||
self thread destructible_barrel_fire_think( attacker );
|
||||
break;
|
||||
case "destructible_barrel_explosion":
|
||||
self destructible_barrel_explosion( attacker );
|
||||
break;
|
||||
case "explode":
|
||||
self thread simple_explosion( attacker );
|
||||
break;
|
||||
case "explode_complex":
|
||||
self thread complex_explosion( attacker, explosion_radius );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isdefined( level.destructible_callbacks[destructible_event] ) )
|
||||
self thread [[ level.destructible_callbacks[destructible_event] ]]( destructible_event, attacker );
|
||||
}
|
||||
|
||||
simple_explosion( attacker )
|
||||
{
|
||||
if ( is_true( self.exploded ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.exploded = 1;
|
||||
offset = vectorScale( ( 0, 0, 1 ), 5 );
|
||||
self radiusdamage( self.origin + offset, 256, 300, 75, attacker, "MOD_EXPLOSIVE", "explodable_barrel_mp" );
|
||||
physicsexplosionsphere( self.origin, 255, 254, 0,3, 400, 25 );
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + offset, attacker );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + offset );
|
||||
}
|
||||
if ( is_true( self.exploded ) )
|
||||
return;
|
||||
|
||||
self.exploded = 1;
|
||||
offset = vectorscale( ( 0, 0, 1 ), 5.0 );
|
||||
self radiusdamage( self.origin + offset, 256, 300, 75, attacker, "MOD_EXPLOSIVE", "explodable_barrel_mp" );
|
||||
physicsexplosionsphere( self.origin, 255, 254, 0.3, 400, 25 );
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
self dodamage( self.health + 10000, self.origin + offset, attacker );
|
||||
else
|
||||
self dodamage( self.health + 10000, self.origin + offset );
|
||||
}
|
||||
|
||||
simple_timed_explosion( destructible_event, attacker )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait_times = [];
|
||||
str = getsubstr( destructible_event, 23 );
|
||||
tokens = strtok( str, "_" );
|
||||
i = 0;
|
||||
while ( i < tokens.size )
|
||||
{
|
||||
wait_times[ wait_times.size ] = int( tokens[ i ] );
|
||||
i++;
|
||||
}
|
||||
if ( wait_times.size <= 0 )
|
||||
{
|
||||
wait_times[ 0 ] = 5;
|
||||
wait_times[ 1 ] = 10;
|
||||
}
|
||||
wait randomintrange( wait_times[ 0 ], wait_times[ 1 ] );
|
||||
simple_explosion( attacker );
|
||||
self endon( "death" );
|
||||
wait_times = [];
|
||||
str = getsubstr( destructible_event, 23 );
|
||||
tokens = strtok( str, "_" );
|
||||
|
||||
for ( i = 0; i < tokens.size; i++ )
|
||||
wait_times[wait_times.size] = int( tokens[i] );
|
||||
|
||||
if ( wait_times.size <= 0 )
|
||||
{
|
||||
wait_times[0] = 5;
|
||||
wait_times[1] = 10;
|
||||
}
|
||||
|
||||
wait( randomintrange( wait_times[0], wait_times[1] ) );
|
||||
simple_explosion( attacker );
|
||||
}
|
||||
|
||||
complex_explosion( attacker, max_radius )
|
||||
{
|
||||
offset = vectorScale( ( 0, 0, 1 ), 5 );
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
self radiusdamage( self.origin + offset, max_radius, 300, 100, attacker );
|
||||
}
|
||||
else
|
||||
{
|
||||
self radiusdamage( self.origin + offset, max_radius, 300, 100 );
|
||||
}
|
||||
playrumbleonposition( "grenade_rumble", self.origin );
|
||||
earthquake( 0,5, 0,5, self.origin, max_radius );
|
||||
physicsexplosionsphere( self.origin + offset, max_radius, max_radius - 1, 0,3 );
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
self dodamage( 20000, self.origin + offset, attacker );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( 20000, self.origin + offset );
|
||||
}
|
||||
offset = vectorscale( ( 0, 0, 1 ), 5.0 );
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
self radiusdamage( self.origin + offset, max_radius, 300, 100, attacker );
|
||||
else
|
||||
self radiusdamage( self.origin + offset, max_radius, 300, 100 );
|
||||
|
||||
playrumbleonposition( "grenade_rumble", self.origin );
|
||||
earthquake( 0.5, 0.5, self.origin, max_radius );
|
||||
physicsexplosionsphere( self.origin + offset, max_radius, max_radius - 1, 0.3 );
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
self dodamage( 20000, self.origin + offset, attacker );
|
||||
else
|
||||
self dodamage( 20000, self.origin + offset );
|
||||
}
|
||||
|
||||
destructible_car_explosion( attacker, physics_explosion )
|
||||
{
|
||||
if ( self.car_dead )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( physics_explosion ) )
|
||||
{
|
||||
physics_explosion = 1;
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
body = players[ i ].body;
|
||||
if ( !isDefined( body ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( distancesquared( body.origin, self.origin ) > 9216 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ( body.origin[ 2 ] - ( self.origin[ 2 ] + 32 ) ) > 0 )
|
||||
{
|
||||
body.origin = ( body.origin[ 0 ], body.origin[ 1 ], body.origin[ 2 ] + 16 );
|
||||
}
|
||||
body maps/mp/gametypes/_globallogic_player::start_explosive_ragdoll();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self notify( "car_dead" );
|
||||
self.car_dead = 1;
|
||||
self thread destructible_car_explosion_animate();
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
self radiusdamage( self.origin, 256, 300, 75, attacker, "MOD_EXPLOSIVE", "destructible_car_mp" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self radiusdamage( self.origin, 256, 300, 75 );
|
||||
}
|
||||
playrumbleonposition( "grenade_rumble", self.origin );
|
||||
earthquake( 0,5, 0,5, self.origin, 800 );
|
||||
if ( physics_explosion )
|
||||
{
|
||||
physicsexplosionsphere( self.origin, 255, 254, 0,3, 400, 25 );
|
||||
}
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
attacker thread maps/mp/_challenges::destroyed_car();
|
||||
}
|
||||
level.globalcarsdestroyed++;
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), attacker );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
self setclientflag( 3 );
|
||||
if ( self.car_dead )
|
||||
return;
|
||||
|
||||
if ( !isdefined( physics_explosion ) )
|
||||
physics_explosion = 1;
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
body = players[i].body;
|
||||
|
||||
if ( !isdefined( body ) )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( body.origin, self.origin ) > 9216 )
|
||||
continue;
|
||||
|
||||
if ( body.origin[2] - self.origin[2] + 32 > 0 )
|
||||
body.origin = ( body.origin[0], body.origin[1], body.origin[2] + 16 );
|
||||
|
||||
body maps\mp\gametypes\_globallogic_player::start_explosive_ragdoll();
|
||||
}
|
||||
|
||||
self notify( "car_dead" );
|
||||
self.car_dead = 1;
|
||||
self thread destructible_car_explosion_animate();
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
self radiusdamage( self.origin, 256, 300, 75, attacker, "MOD_EXPLOSIVE", "destructible_car_mp" );
|
||||
else
|
||||
self radiusdamage( self.origin, 256, 300, 75 );
|
||||
|
||||
playrumbleonposition( "grenade_rumble", self.origin );
|
||||
earthquake( 0.5, 0.5, self.origin, 800 );
|
||||
|
||||
if ( physics_explosion )
|
||||
physicsexplosionsphere( self.origin, 255, 254, 0.3, 400, 25 );
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
attacker thread maps\mp\_challenges::destroyed_car();
|
||||
|
||||
level.globalcarsdestroyed++;
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), attacker );
|
||||
else
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ) );
|
||||
|
||||
self setclientflag( 3 );
|
||||
}
|
||||
|
||||
destructible_tank_grenade_stuck_think()
|
||||
{
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "grenade_stuck", missile );
|
||||
if ( !isDefined( missile ) || !isDefined( missile.model ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( missile.model != "t5_weapon_crossbow_bolt" || missile.model == "t6_wpn_grenade_semtex_projectile" && missile.model == "t6_wpn_c4_world" )
|
||||
{
|
||||
self thread destructible_tank_grenade_stuck_explode( missile );
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "grenade_stuck", missile );
|
||||
|
||||
if ( !isdefined( missile ) || !isdefined( missile.model ) )
|
||||
continue;
|
||||
|
||||
if ( missile.model == "t5_weapon_crossbow_bolt" || missile.model == "t6_wpn_grenade_semtex_projectile" || missile.model == "t6_wpn_c4_world" )
|
||||
self thread destructible_tank_grenade_stuck_explode( missile );
|
||||
}
|
||||
}
|
||||
|
||||
destructible_tank_grenade_stuck_explode( missile )
|
||||
{
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "death" );
|
||||
owner = getmissileowner( missile );
|
||||
if ( isDefined( owner ) && missile.model == "t6_wpn_c4_world" )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
owner endon( "weapon_object_destroyed" );
|
||||
missile endon( "picked_up" );
|
||||
missile thread destructible_tank_hacked_c4( self );
|
||||
}
|
||||
missile waittill( "explode" );
|
||||
if ( isDefined( owner ) )
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), owner );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "death" );
|
||||
owner = getmissileowner( missile );
|
||||
|
||||
if ( isdefined( owner ) && missile.model == "t6_wpn_c4_world" )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
owner endon( "weapon_object_destroyed" );
|
||||
missile endon( "picked_up" );
|
||||
missile thread destructible_tank_hacked_c4( self );
|
||||
}
|
||||
|
||||
missile waittill( "explode" );
|
||||
|
||||
if ( isdefined( owner ) )
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), owner );
|
||||
else
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
|
||||
destructible_tank_hacked_c4( tank )
|
||||
{
|
||||
tank endon( "destructible_base_piece_death" );
|
||||
tank endon( "death" );
|
||||
self endon( "death" );
|
||||
self waittill( "hacked" );
|
||||
self notify( "picked_up" );
|
||||
tank thread destructible_tank_grenade_stuck_explode( self );
|
||||
tank endon( "destructible_base_piece_death" );
|
||||
tank endon( "death" );
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "hacked" );
|
||||
|
||||
self notify( "picked_up" );
|
||||
tank thread destructible_tank_grenade_stuck_explode( self );
|
||||
}
|
||||
|
||||
destructible_car_death_think()
|
||||
{
|
||||
self endon( "car_dead" );
|
||||
self.car_dead = 0;
|
||||
self thread destructible_car_death_notify();
|
||||
self waittill( "destructible_base_piece_death", attacker );
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self thread destructible_car_explosion( attacker, 0 );
|
||||
}
|
||||
self endon( "car_dead" );
|
||||
self.car_dead = 0;
|
||||
self thread destructible_car_death_notify();
|
||||
|
||||
self waittill( "destructible_base_piece_death", attacker );
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self thread destructible_car_explosion( attacker, 0 );
|
||||
}
|
||||
|
||||
destructible_car_grenade_stuck_think()
|
||||
{
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "car_dead" );
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "grenade_stuck", missile );
|
||||
if ( !isDefined( missile ) || !isDefined( missile.model ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( missile.model != "t5_weapon_crossbow_bolt" || missile.model == "t6_wpn_grenade_semtex_projectile" && missile.model == "t6_wpn_c4_world" )
|
||||
{
|
||||
self thread destructible_car_grenade_stuck_explode( missile );
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "car_dead" );
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "grenade_stuck", missile );
|
||||
|
||||
if ( !isdefined( missile ) || !isdefined( missile.model ) )
|
||||
continue;
|
||||
|
||||
if ( missile.model == "t5_weapon_crossbow_bolt" || missile.model == "t6_wpn_grenade_semtex_projectile" || missile.model == "t6_wpn_c4_world" )
|
||||
self thread destructible_car_grenade_stuck_explode( missile );
|
||||
}
|
||||
}
|
||||
|
||||
destructible_car_grenade_stuck_explode( missile )
|
||||
{
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "car_dead" );
|
||||
self endon( "death" );
|
||||
owner = getmissileowner( missile );
|
||||
if ( isDefined( owner ) && missile.model == "t6_wpn_c4_world" )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
owner endon( "weapon_object_destroyed" );
|
||||
missile endon( "picked_up" );
|
||||
missile thread destructible_car_hacked_c4( self );
|
||||
}
|
||||
missile waittill( "explode" );
|
||||
if ( isDefined( owner ) )
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), owner );
|
||||
}
|
||||
else
|
||||
{
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
self endon( "destructible_base_piece_death" );
|
||||
self endon( "car_dead" );
|
||||
self endon( "death" );
|
||||
owner = getmissileowner( missile );
|
||||
|
||||
if ( isdefined( owner ) && missile.model == "t6_wpn_c4_world" )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
owner endon( "weapon_object_destroyed" );
|
||||
missile endon( "picked_up" );
|
||||
missile thread destructible_car_hacked_c4( self );
|
||||
}
|
||||
|
||||
missile waittill( "explode" );
|
||||
|
||||
if ( isdefined( owner ) )
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), owner );
|
||||
else
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
|
||||
destructible_car_hacked_c4( car )
|
||||
{
|
||||
car endon( "destructible_base_piece_death" );
|
||||
car endon( "car_dead" );
|
||||
car endon( "death" );
|
||||
self endon( "death" );
|
||||
self waittill( "hacked" );
|
||||
self notify( "picked_up" );
|
||||
car thread destructible_car_grenade_stuck_explode( self );
|
||||
car endon( "destructible_base_piece_death" );
|
||||
car endon( "car_dead" );
|
||||
car endon( "death" );
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "hacked" );
|
||||
|
||||
self notify( "picked_up" );
|
||||
car thread destructible_car_grenade_stuck_explode( self );
|
||||
}
|
||||
|
||||
destructible_car_death_notify()
|
||||
{
|
||||
self endon( "car_dead" );
|
||||
self waittill( "death", attacker );
|
||||
self notify( "destructible_base_piece_death" );
|
||||
self endon( "car_dead" );
|
||||
|
||||
self waittill( "death", attacker );
|
||||
|
||||
self notify( "destructible_base_piece_death", attacker );
|
||||
}
|
||||
|
||||
destructible_car_explosion_animate()
|
||||
{
|
||||
self setclientflag( 12 );
|
||||
end_origin = self.origin;
|
||||
self.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 16 );
|
||||
wait 0,3;
|
||||
items = getdroppedweapons();
|
||||
i = 0;
|
||||
while ( i < items.size )
|
||||
{
|
||||
if ( distancesquared( end_origin, items[ i ].origin ) < 16384 )
|
||||
{
|
||||
if ( ( items[ i ].origin[ 2 ] - ( end_origin[ 2 ] + 32 ) ) > 0 )
|
||||
{
|
||||
items[ i ] delete();
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
self moveto( end_origin, 0,3, 0,15 );
|
||||
self clearclientflag( 12 );
|
||||
self setclientflag( 12 );
|
||||
end_origin = self.origin;
|
||||
self.origin = ( self.origin[0], self.origin[1], self.origin[2] + 16 );
|
||||
wait 0.3;
|
||||
items = getdroppedweapons();
|
||||
|
||||
for ( i = 0; i < items.size; i++ )
|
||||
{
|
||||
if ( distancesquared( end_origin, items[i].origin ) < 16384 )
|
||||
{
|
||||
if ( items[i].origin[2] - end_origin[2] + 32 > 0 )
|
||||
items[i] delete();
|
||||
}
|
||||
}
|
||||
|
||||
self moveto( end_origin, 0.3, 0.15 );
|
||||
self clearclientflag( 12 );
|
||||
}
|
||||
|
||||
destructible_car_fire_think( attacker )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait randomintrange( 7, 10 );
|
||||
self thread destructible_car_explosion( attacker );
|
||||
self endon( "death" );
|
||||
wait( randomintrange( 7, 10 ) );
|
||||
self thread destructible_car_explosion( attacker );
|
||||
}
|
||||
|
||||
codecallback_destructibleevent( event, param1, param2, param3 )
|
||||
{
|
||||
if ( event == "broken" )
|
||||
{
|
||||
notify_type = param1;
|
||||
attacker = param2;
|
||||
weapon = param3;
|
||||
destructible_event_callback( notify_type, attacker, weapon );
|
||||
self notify( event );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( event == "breakafter" )
|
||||
{
|
||||
piece = param1;
|
||||
time = param2;
|
||||
damage = param3;
|
||||
self thread breakafter( time, damage, piece );
|
||||
}
|
||||
}
|
||||
if ( event == "broken" )
|
||||
{
|
||||
notify_type = param1;
|
||||
attacker = param2;
|
||||
weapon = param3;
|
||||
destructible_event_callback( notify_type, attacker, weapon );
|
||||
self notify( event, notify_type, attacker );
|
||||
}
|
||||
else if ( event == "breakafter" )
|
||||
{
|
||||
piece = param1;
|
||||
time = param2;
|
||||
damage = param3;
|
||||
self thread breakafter( time, damage, piece );
|
||||
}
|
||||
}
|
||||
|
||||
breakafter( time, damage, piece )
|
||||
{
|
||||
self notify( "breakafter" );
|
||||
self endon( "breakafter" );
|
||||
wait time;
|
||||
self dodamage( damage, self.origin, undefined, undefined );
|
||||
self notify( "breakafter" );
|
||||
self endon( "breakafter" );
|
||||
wait( time );
|
||||
self dodamage( damage, self.origin, undefined, undefined );
|
||||
}
|
||||
|
||||
destructible_barrel_death_think()
|
||||
{
|
||||
self endon( "barrel_dead" );
|
||||
self waittill( "death", attacker );
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self thread destructible_barrel_explosion( attacker, 0 );
|
||||
}
|
||||
self endon( "barrel_dead" );
|
||||
|
||||
self waittill( "death", attacker );
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self thread destructible_barrel_explosion( attacker, 0 );
|
||||
}
|
||||
|
||||
destructible_barrel_fire_think( attacker )
|
||||
{
|
||||
self endon( "barrel_dead" );
|
||||
self endon( "explode" );
|
||||
self endon( "death" );
|
||||
wait randomintrange( 7, 10 );
|
||||
self thread destructible_barrel_explosion( attacker );
|
||||
self endon( "barrel_dead" );
|
||||
self endon( "explode" );
|
||||
self endon( "death" );
|
||||
wait( randomintrange( 7, 10 ) );
|
||||
self thread destructible_barrel_explosion( attacker );
|
||||
}
|
||||
|
||||
destructible_barrel_explosion( attacker, physics_explosion )
|
||||
{
|
||||
if ( !isDefined( physics_explosion ) )
|
||||
{
|
||||
physics_explosion = 1;
|
||||
}
|
||||
self notify( "barrel_dead" );
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
dest_clip = getent( self.target, "targetname" );
|
||||
dest_clip delete();
|
||||
}
|
||||
self radiusdamage( self.origin, 256, 300, 75, attacker, "MOD_EXPLOSIVE", "explodable_barrel_mp" );
|
||||
playrumbleonposition( "grenade_rumble", self.origin );
|
||||
earthquake( 0,5, 0,5, self.origin, 800 );
|
||||
if ( physics_explosion )
|
||||
{
|
||||
physicsexplosionsphere( self.origin, 255, 254, 0,3, 400, 25 );
|
||||
}
|
||||
level.globalbarrelsdestroyed++;
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), attacker );
|
||||
self setclientflag( 3 );
|
||||
if ( !isdefined( physics_explosion ) )
|
||||
physics_explosion = 1;
|
||||
|
||||
self notify( "barrel_dead" );
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
dest_clip = getent( self.target, "targetname" );
|
||||
dest_clip delete();
|
||||
}
|
||||
|
||||
self radiusdamage( self.origin, 256, 300, 75, attacker, "MOD_EXPLOSIVE", "explodable_barrel_mp" );
|
||||
playrumbleonposition( "grenade_rumble", self.origin );
|
||||
earthquake( 0.5, 0.5, self.origin, 800 );
|
||||
|
||||
if ( physics_explosion )
|
||||
physicsexplosionsphere( self.origin, 255, 254, 0.3, 400, 25 );
|
||||
|
||||
level.globalbarrelsdestroyed++;
|
||||
self dodamage( self.health + 10000, self.origin + ( 0, 0, 1 ), attacker );
|
||||
self setclientflag( 3 );
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,180 +1,176 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/killstreaks/_emp;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\killstreaks\_emp;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
precacheshellshock( "flashbang" );
|
||||
thread onplayerconnect();
|
||||
precacheshellshock( "flashbang" );
|
||||
thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread monitorempgrenade();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread monitorempgrenade();
|
||||
}
|
||||
}
|
||||
|
||||
monitorempgrenade() //checked changed to match cerberus output
|
||||
monitorempgrenade()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self.empendtime = 0;
|
||||
for ( ;; )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "emp_grenaded", attacker );
|
||||
if ( !isalive( self ) || self hasperk( "specialty_immuneemp" ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
hurtvictim = 1;
|
||||
hurtattacker = 0;
|
||||
/*
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self.empendtime = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "emp_grenaded", attacker );
|
||||
|
||||
if ( !isalive( self ) || self hasperk( "specialty_immuneemp" ) )
|
||||
continue;
|
||||
|
||||
hurtvictim = 1;
|
||||
hurtattacker = 0;
|
||||
/#
|
||||
assert( isDefined( self.team ) );
|
||||
assert( isdefined( self.team ) );
|
||||
#/
|
||||
*/
|
||||
if ( level.teambased && isDefined( attacker ) && isDefined( attacker.team ) && attacker.team == self.team && attacker != self )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
hurtattacker = 0;
|
||||
hurtvictim = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
hurtvictim = 0;
|
||||
hurtattacker = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
hurtattacker = 1;
|
||||
hurtvictim = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( hurtvictim && isDefined( self ) )
|
||||
{
|
||||
self thread applyemp( attacker );
|
||||
}
|
||||
if ( hurtattacker && isDefined( attacker ) )
|
||||
{
|
||||
attacker thread applyemp( attacker );
|
||||
}
|
||||
}
|
||||
if ( level.teambased && isdefined( attacker ) && isdefined( attacker.team ) && attacker.team == self.team && attacker != self )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
continue;
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
hurtattacker = 0;
|
||||
hurtvictim = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
hurtvictim = 0;
|
||||
hurtattacker = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
hurtattacker = 1;
|
||||
hurtvictim = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( hurtvictim && isdefined( self ) )
|
||||
self thread applyemp( attacker );
|
||||
|
||||
if ( hurtattacker && isdefined( attacker ) )
|
||||
attacker thread applyemp( attacker );
|
||||
}
|
||||
}
|
||||
|
||||
applyemp( attacker ) //checked matches cerberus output
|
||||
applyemp( attacker )
|
||||
{
|
||||
self notify( "applyEmp" );
|
||||
self endon( "applyEmp" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
wait 0.05;
|
||||
if ( self == attacker )
|
||||
{
|
||||
if ( isDefined( self.empendtime ) )
|
||||
{
|
||||
emp_time_left_ms = self.empendtime - getTime();
|
||||
if ( emp_time_left_ms > 1000 )
|
||||
{
|
||||
self.empduration = emp_time_left_ms / 1000;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.empduration = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self.empduration = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self.empduration = 12;
|
||||
}
|
||||
self.empgrenaded = 1;
|
||||
self shellshock( "flashbang", 1 );
|
||||
self.empendtime = getTime() + ( self.empduration * 1000 );
|
||||
self thread emprumbleloop( 0.75 );
|
||||
self setempjammed( 1 );
|
||||
self thread empgrenadedeathwaiter();
|
||||
wait self.empduration;
|
||||
self notify( "empGrenadeTimedOut" );
|
||||
self checktoturnoffemp();
|
||||
self notify( "applyEmp" );
|
||||
self endon( "applyEmp" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
wait 0.05;
|
||||
|
||||
if ( self == attacker )
|
||||
{
|
||||
if ( isdefined( self.empendtime ) )
|
||||
{
|
||||
emp_time_left_ms = self.empendtime - gettime();
|
||||
|
||||
if ( emp_time_left_ms > 1000 )
|
||||
self.empduration = emp_time_left_ms / 1000;
|
||||
else
|
||||
self.empduration = 1;
|
||||
}
|
||||
else
|
||||
self.empduration = 1;
|
||||
}
|
||||
else
|
||||
self.empduration = 12;
|
||||
|
||||
self.empgrenaded = 1;
|
||||
self shellshock( "flashbang", 1 );
|
||||
self.empendtime = gettime() + self.empduration * 1000;
|
||||
self thread emprumbleloop( 0.75 );
|
||||
self setempjammed( 1 );
|
||||
self thread empgrenadedeathwaiter();
|
||||
wait( self.empduration );
|
||||
self notify( "empGrenadeTimedOut" );
|
||||
self checktoturnoffemp();
|
||||
}
|
||||
|
||||
empgrenadedeathwaiter() //checked matches cerberus output
|
||||
empgrenadedeathwaiter()
|
||||
{
|
||||
self notify( "empGrenadeDeathWaiter" );
|
||||
self endon( "empGrenadeDeathWaiter" );
|
||||
self endon( "empGrenadeTimedOut" );
|
||||
self waittill( "death" );
|
||||
self checktoturnoffemp();
|
||||
self notify( "empGrenadeDeathWaiter" );
|
||||
self endon( "empGrenadeDeathWaiter" );
|
||||
self endon( "empGrenadeTimedOut" );
|
||||
|
||||
self waittill( "death" );
|
||||
|
||||
self checktoturnoffemp();
|
||||
}
|
||||
|
||||
checktoturnoffemp() //checked changed to match cerberus output
|
||||
checktoturnoffemp()
|
||||
{
|
||||
self.empgrenaded = 0;
|
||||
if ( level.teambased && maps/mp/killstreaks/_emp::emp_isteamemped( self.team ) || !level.teambased && isDefined( level.empplayer ) && level.empplayer != self )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self setempjammed( 0 );
|
||||
self.empgrenaded = 0;
|
||||
|
||||
if ( level.teambased && maps\mp\killstreaks\_emp::emp_isteamemped( self.team ) || !level.teambased && isdefined( level.empplayer ) && level.empplayer != self )
|
||||
return;
|
||||
|
||||
self setempjammed( 0 );
|
||||
}
|
||||
|
||||
emprumbleloop( duration ) //checked matches cerberus output
|
||||
emprumbleloop( duration )
|
||||
{
|
||||
self endon( "emp_rumble_loop" );
|
||||
self notify( "emp_rumble_loop" );
|
||||
goaltime = getTime() + ( duration * 1000 );
|
||||
while ( getTime() < goaltime )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "emp_rumble_loop" );
|
||||
self notify( "emp_rumble_loop" );
|
||||
goaltime = gettime() + duration * 1000;
|
||||
|
||||
while ( gettime() < goaltime )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
watchempexplosion( owner, weaponname ) //checked changed to match cerberus output
|
||||
watchempexplosion( owner, weaponname )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
owner endon( "team_changed" );
|
||||
self endon( "shutdown_empgrenade" );
|
||||
self thread watchempgrenadeshutdown();
|
||||
owner addweaponstat( weaponname, "used", 1 );
|
||||
self waittill( "explode", origin, surface );
|
||||
ents = getdamageableentarray( origin, 512 );
|
||||
foreach ( ent in ents )
|
||||
{
|
||||
ent dodamage( 1, origin, owner, owner, "none", "MOD_GRENADE_SPLASH", 0, weaponname );
|
||||
}
|
||||
owner endon( "disconnect" );
|
||||
owner endon( "team_changed" );
|
||||
self endon( "shutdown_empgrenade" );
|
||||
self thread watchempgrenadeshutdown();
|
||||
owner addweaponstat( weaponname, "used", 1 );
|
||||
|
||||
self waittill( "explode", origin, surface );
|
||||
|
||||
ents = getdamageableentarray( origin, 512 );
|
||||
|
||||
foreach ( ent in ents )
|
||||
ent dodamage( 1, origin, owner, owner, "none", "MOD_GRENADE_SPLASH", 0, weaponname );
|
||||
}
|
||||
|
||||
watchempgrenadeshutdown() //checked matches cerberus output
|
||||
watchempgrenadeshutdown()
|
||||
{
|
||||
self endon( "explode" );
|
||||
self waittill( "death" );
|
||||
wait 0.05;
|
||||
self notify( "shutdown_empgrenade" );
|
||||
}
|
||||
self endon( "explode" );
|
||||
|
||||
self waittill( "death" );
|
||||
|
||||
wait 0.05;
|
||||
self notify( "shutdown_empgrenade" );
|
||||
}
|
||||
|
@ -1,159 +1,145 @@
|
||||
//checked includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
if ( isDefined( level.initedentityheadicons ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( level.createfx_enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.initedentityheadicons = 1;
|
||||
/*
|
||||
if ( isdefined( level.initedentityheadicons ) )
|
||||
return;
|
||||
|
||||
if ( level.createfx_enabled )
|
||||
return;
|
||||
|
||||
level.initedentityheadicons = 1;
|
||||
/#
|
||||
assert( isDefined( game[ "entity_headicon_allies" ] ), "Allied head icons are not defined. Check the team set for the level." );
|
||||
assert( isdefined( game["entity_headicon_allies"] ), "Allied head icons are not defined. Check the team set for the level." );
|
||||
#/
|
||||
/#
|
||||
assert( isDefined( game[ "entity_headicon_axis" ] ), "Axis head icons are not defined. Check the team set for the level." );
|
||||
assert( isdefined( game["entity_headicon_axis"] ), "Axis head icons are not defined. Check the team set for the level." );
|
||||
#/
|
||||
*/
|
||||
precacheshader( game[ "entity_headicon_allies" ] );
|
||||
precacheshader( game[ "entity_headicon_axis" ] );
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.entitieswithheadicons = [];
|
||||
precacheshader( game["entity_headicon_allies"] );
|
||||
precacheshader( game["entity_headicon_axis"] );
|
||||
|
||||
if ( !level.teambased )
|
||||
return;
|
||||
|
||||
level.entitieswithheadicons = [];
|
||||
}
|
||||
|
||||
setentityheadicon( team, owner, offset, icon, constant_size ) //checked changed to match cerberus output
|
||||
setentityheadicon( team, owner, offset, icon, constant_size )
|
||||
{
|
||||
if ( !level.teambased && !isDefined( owner ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( constant_size ) )
|
||||
{
|
||||
constant_size = 0;
|
||||
}
|
||||
if ( !isDefined( self.entityheadiconteam ) )
|
||||
{
|
||||
self.entityheadiconteam = "none";
|
||||
self.entityheadicons = [];
|
||||
}
|
||||
if ( level.teambased && !isDefined( owner ) )
|
||||
{
|
||||
if ( team == self.entityheadiconteam )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.entityheadiconteam = team;
|
||||
}
|
||||
if ( isDefined( offset ) )
|
||||
{
|
||||
self.entityheadiconoffset = offset;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.entityheadiconoffset = ( 0, 0, 0 );
|
||||
}
|
||||
if ( isDefined( self.entityheadicons ) )
|
||||
{
|
||||
for ( i = 0; i < self.entityheadicons.size; i++ )
|
||||
{
|
||||
if ( isDefined( self.entityheadicons[ i ] ) )
|
||||
{
|
||||
self.entityheadicons[ i ] destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
self.entityheadicons = [];
|
||||
self notify( "kill_entity_headicon_thread" );
|
||||
if ( !isDefined( icon ) )
|
||||
{
|
||||
icon = game[ "entity_headicon_" + team ];
|
||||
}
|
||||
if ( isDefined( owner ) && !level.teambased )
|
||||
{
|
||||
if ( !isplayer( owner ) )
|
||||
{
|
||||
/*
|
||||
if ( !level.teambased && !isdefined( owner ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( constant_size ) )
|
||||
constant_size = 0;
|
||||
|
||||
if ( !isdefined( self.entityheadiconteam ) )
|
||||
{
|
||||
self.entityheadiconteam = "none";
|
||||
self.entityheadicons = [];
|
||||
}
|
||||
|
||||
if ( level.teambased && !isdefined( owner ) )
|
||||
{
|
||||
if ( team == self.entityheadiconteam )
|
||||
return;
|
||||
|
||||
self.entityheadiconteam = team;
|
||||
}
|
||||
|
||||
if ( isdefined( offset ) )
|
||||
self.entityheadiconoffset = offset;
|
||||
else
|
||||
self.entityheadiconoffset = ( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( self.entityheadicons ) )
|
||||
{
|
||||
for ( i = 0; i < self.entityheadicons.size; i++ )
|
||||
{
|
||||
if ( isdefined( self.entityheadicons[i] ) )
|
||||
self.entityheadicons[i] destroy();
|
||||
}
|
||||
}
|
||||
|
||||
self.entityheadicons = [];
|
||||
self notify( "kill_entity_headicon_thread" );
|
||||
|
||||
if ( !isdefined( icon ) )
|
||||
icon = game["entity_headicon_" + team];
|
||||
|
||||
if ( isdefined( owner ) && !level.teambased )
|
||||
{
|
||||
if ( !isplayer( owner ) )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( owner.owner ), "entity has to have an owner if it's not a player" );
|
||||
assert( isdefined( owner.owner ), "entity has to have an owner if it's not a player" );
|
||||
#/
|
||||
*/
|
||||
owner = owner.owner;
|
||||
}
|
||||
owner updateentityheadclienticon( self, icon, constant_size );
|
||||
}
|
||||
else if ( isDefined( owner ) && team != "none" )
|
||||
{
|
||||
owner updateentityheadteamicon( self, team, icon, constant_size );
|
||||
}
|
||||
self thread destroyheadiconsondeath();
|
||||
owner = owner.owner;
|
||||
}
|
||||
|
||||
owner updateentityheadclienticon( self, icon, constant_size );
|
||||
}
|
||||
else if ( isdefined( owner ) && team != "none" )
|
||||
owner updateentityheadteamicon( self, team, icon, constant_size );
|
||||
|
||||
self thread destroyheadiconsondeath();
|
||||
}
|
||||
|
||||
updateentityheadteamicon( entity, team, icon, constant_size ) //checked matches cerberus output
|
||||
updateentityheadteamicon( entity, team, icon, constant_size )
|
||||
{
|
||||
headicon = newteamhudelem( team );
|
||||
headicon.archived = 1;
|
||||
headicon.x = entity.entityheadiconoffset[ 0 ];
|
||||
headicon.y = entity.entityheadiconoffset[ 1 ];
|
||||
headicon.z = entity.entityheadiconoffset[ 2 ];
|
||||
headicon.alpha = 0.8;
|
||||
headicon setshader( icon, 6, 6 );
|
||||
headicon setwaypoint( constant_size );
|
||||
headicon settargetent( entity );
|
||||
entity.entityheadicons[ entity.entityheadicons.size ] = headicon;
|
||||
headicon = newteamhudelem( team );
|
||||
headicon.archived = 1;
|
||||
headicon.x = entity.entityheadiconoffset[0];
|
||||
headicon.y = entity.entityheadiconoffset[1];
|
||||
headicon.z = entity.entityheadiconoffset[2];
|
||||
headicon.alpha = 0.8;
|
||||
headicon setshader( icon, 6, 6 );
|
||||
headicon setwaypoint( constant_size );
|
||||
headicon settargetent( entity );
|
||||
entity.entityheadicons[entity.entityheadicons.size] = headicon;
|
||||
}
|
||||
|
||||
updateentityheadclienticon( entity, icon, constant_size ) //checked matches cerberus output
|
||||
updateentityheadclienticon( entity, icon, constant_size )
|
||||
{
|
||||
headicon = newclienthudelem( self );
|
||||
headicon.archived = 1;
|
||||
headicon.x = entity.entityheadiconoffset[ 0 ];
|
||||
headicon.y = entity.entityheadiconoffset[ 1 ];
|
||||
headicon.z = entity.entityheadiconoffset[ 2 ];
|
||||
headicon.alpha = 0.8;
|
||||
headicon setshader( icon, 6, 6 );
|
||||
headicon setwaypoint( constant_size );
|
||||
headicon settargetent( entity );
|
||||
entity.entityheadicons[ entity.entityheadicons.size ] = headicon;
|
||||
headicon = newclienthudelem( self );
|
||||
headicon.archived = 1;
|
||||
headicon.x = entity.entityheadiconoffset[0];
|
||||
headicon.y = entity.entityheadiconoffset[1];
|
||||
headicon.z = entity.entityheadiconoffset[2];
|
||||
headicon.alpha = 0.8;
|
||||
headicon setshader( icon, 6, 6 );
|
||||
headicon setwaypoint( constant_size );
|
||||
headicon settargetent( entity );
|
||||
entity.entityheadicons[entity.entityheadicons.size] = headicon;
|
||||
}
|
||||
|
||||
destroyheadiconsondeath() //checked changed to match cerberus output
|
||||
destroyheadiconsondeath()
|
||||
{
|
||||
self waittill_any( "death", "hacked" );
|
||||
for ( i = 0; i < self.entityheadicons.size; i++ )
|
||||
{
|
||||
if ( isDefined( self.entityheadicons[ i ] ) )
|
||||
{
|
||||
self.entityheadicons[ i ] destroy();
|
||||
}
|
||||
}
|
||||
self waittill_any( "death", "hacked" );
|
||||
|
||||
for ( i = 0; i < self.entityheadicons.size; i++ )
|
||||
{
|
||||
if ( isdefined( self.entityheadicons[i] ) )
|
||||
self.entityheadicons[i] destroy();
|
||||
}
|
||||
}
|
||||
|
||||
destroyentityheadicons() //checked changed to match cerberus output
|
||||
destroyentityheadicons()
|
||||
{
|
||||
if ( isDefined( self.entityheadicons ) )
|
||||
{
|
||||
for ( i = 0; i < self.entityheadicons.size; i++ )
|
||||
{
|
||||
if ( isDefined( self.entityheadicons[ i ] ) )
|
||||
{
|
||||
self.entityheadicons[ i ] destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isdefined( self.entityheadicons ) )
|
||||
{
|
||||
for ( i = 0; i < self.entityheadicons.size; i++ )
|
||||
{
|
||||
if ( isdefined( self.entityheadicons[i] ) )
|
||||
self.entityheadicons[i] destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateentityheadiconpos( headicon ) //checked matches cerberus output
|
||||
updateentityheadiconpos( headicon )
|
||||
{
|
||||
headicon.x = self.origin[ 0 ] + self.entityheadiconoffset[ 0 ];
|
||||
headicon.y = self.origin[ 1 ] + self.entityheadiconoffset[ 1 ];
|
||||
headicon.z = self.origin[ 2 ] + self.entityheadiconoffset[ 2 ];
|
||||
headicon.x = self.origin[0] + self.entityheadiconoffset[0];
|
||||
headicon.y = self.origin[1] + self.entityheadiconoffset[1];
|
||||
headicon.z = self.origin[2] + self.entityheadiconoffset[2];
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,15 @@
|
||||
//checked includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
|
||||
}
|
||||
|
||||
watch_bolt_detonation( owner ) //checked matches cerberus output
|
||||
watch_bolt_detonation( owner )
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,203 +1,201 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
precacheshellshock( "flashbang" );
|
||||
level.sound_flash_start = "";
|
||||
level.sound_flash_loop = "";
|
||||
level.sound_flash_stop = "";
|
||||
precacheshellshock( "flashbang" );
|
||||
level.sound_flash_start = "";
|
||||
level.sound_flash_loop = "";
|
||||
level.sound_flash_stop = "";
|
||||
}
|
||||
|
||||
startmonitoringflash() //checked matches cerberus output
|
||||
startmonitoringflash()
|
||||
{
|
||||
self thread monitorflash();
|
||||
self thread monitorflash();
|
||||
}
|
||||
|
||||
stopmonitoringflash( disconnected ) //checked matches cerberus output
|
||||
stopmonitoringflash( disconnected )
|
||||
{
|
||||
self notify( "stop_monitoring_flash" );
|
||||
self notify( "stop_monitoring_flash" );
|
||||
}
|
||||
|
||||
flashrumbleloop( duration ) //checked matches cerberus output
|
||||
flashrumbleloop( duration )
|
||||
{
|
||||
self endon( "stop_monitoring_flash" );
|
||||
self endon( "flash_rumble_loop" );
|
||||
self notify( "flash_rumble_loop" );
|
||||
goaltime = getTime() + ( duration * 1000 );
|
||||
while ( getTime() < goaltime )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "stop_monitoring_flash" );
|
||||
self endon( "flash_rumble_loop" );
|
||||
self notify( "flash_rumble_loop" );
|
||||
goaltime = gettime() + duration * 1000;
|
||||
|
||||
while ( gettime() < goaltime )
|
||||
{
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
monitorflash_internal( amount_distance, amount_angle, attacker, direct_on_player ) //checked changed to match cerberus output
|
||||
monitorflash_internal( amount_distance, amount_angle, attacker, direct_on_player )
|
||||
{
|
||||
hurtattacker = 0;
|
||||
hurtvictim = 1;
|
||||
if ( amount_angle < 0.5 )
|
||||
{
|
||||
amount_angle = 0.5;
|
||||
}
|
||||
else if ( amount_angle > 0.8 )
|
||||
{
|
||||
amount_angle = 1;
|
||||
}
|
||||
if ( isDefined( attacker ) && attacker == self )
|
||||
{
|
||||
amount_distance *= 0.5;
|
||||
}
|
||||
duration = amount_distance * amount_angle * 6;
|
||||
if ( duration < 0.25 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
rumbleduration = undefined;
|
||||
if ( duration > 2 )
|
||||
{
|
||||
rumbleduration = 0.75;
|
||||
}
|
||||
else
|
||||
{
|
||||
rumbleduration = 0.25;
|
||||
}
|
||||
/*
|
||||
hurtattacker = 0;
|
||||
hurtvictim = 1;
|
||||
|
||||
if ( amount_angle < 0.5 )
|
||||
amount_angle = 0.5;
|
||||
else if ( amount_angle > 0.8 )
|
||||
amount_angle = 1;
|
||||
|
||||
if ( isdefined( attacker ) && attacker == self )
|
||||
amount_distance *= 0.5;
|
||||
|
||||
duration = amount_distance * amount_angle * 6;
|
||||
|
||||
if ( duration < 0.25 )
|
||||
return;
|
||||
|
||||
rumbleduration = undefined;
|
||||
|
||||
if ( duration > 2 )
|
||||
rumbleduration = 0.75;
|
||||
else
|
||||
rumbleduration = 0.25;
|
||||
/#
|
||||
assert( isDefined( self.team ) );
|
||||
assert( isdefined( self.team ) );
|
||||
#/
|
||||
*/
|
||||
if ( level.teambased && isDefined( attacker ) && isDefined( attacker.team ) && attacker.team == self.team && attacker != self )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
duration *= 0.5;
|
||||
rumbleduration *= 0.5;
|
||||
hurtvictim = 0;
|
||||
hurtattacker = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
duration *= 0.5;
|
||||
rumbleduration *= 0.5;
|
||||
hurtattacker = 1;
|
||||
}
|
||||
}
|
||||
if ( self hasperk( "specialty_flashprotection" ) )
|
||||
{
|
||||
duration *= 0.1;
|
||||
rumbleduration *= 0.1;
|
||||
}
|
||||
if ( hurtvictim )
|
||||
{
|
||||
if ( self mayapplyscreeneffect() || !direct_on_player && self isremotecontrolling() )
|
||||
{
|
||||
if ( self != attacker )
|
||||
{
|
||||
attacker addweaponstat( "flash_grenade_mp", "hits", 1 );
|
||||
attacker addweaponstat( "flash_grenade_mp", "used", 1 );
|
||||
}
|
||||
self thread applyflash( duration, rumbleduration, attacker );
|
||||
}
|
||||
}
|
||||
if ( hurtattacker )
|
||||
{
|
||||
if ( attacker mayapplyscreeneffect() )
|
||||
{
|
||||
attacker thread applyflash( duration, rumbleduration, attacker );
|
||||
}
|
||||
}
|
||||
if ( level.teambased && isdefined( attacker ) && isdefined( attacker.team ) && attacker.team == self.team && attacker != self )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
return;
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
duration *= 0.5;
|
||||
rumbleduration *= 0.5;
|
||||
hurtvictim = 0;
|
||||
hurtattacker = 1;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
duration *= 0.5;
|
||||
rumbleduration *= 0.5;
|
||||
hurtattacker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( self hasperk( "specialty_flashprotection" ) )
|
||||
{
|
||||
duration *= 0.1;
|
||||
rumbleduration *= 0.1;
|
||||
}
|
||||
|
||||
if ( hurtvictim )
|
||||
{
|
||||
if ( self mayapplyscreeneffect() || !direct_on_player && self isremotecontrolling() )
|
||||
{
|
||||
if ( self != attacker )
|
||||
{
|
||||
attacker addweaponstat( "flash_grenade_mp", "hits", 1 );
|
||||
attacker addweaponstat( "flash_grenade_mp", "used", 1 );
|
||||
}
|
||||
|
||||
self thread applyflash( duration, rumbleduration, attacker );
|
||||
}
|
||||
}
|
||||
|
||||
if ( hurtattacker )
|
||||
{
|
||||
if ( attacker mayapplyscreeneffect() )
|
||||
attacker thread applyflash( duration, rumbleduration, attacker );
|
||||
}
|
||||
}
|
||||
|
||||
monitorflash() //checked changed to match cerberus output
|
||||
monitorflash()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.flashendtime = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "flashbang", amount_distance, amount_angle, attacker );
|
||||
if ( !isalive( self ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
self monitorflash_internal( amount_distance, amount_angle, attacker, 1 );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self.flashendtime = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "flashbang", amount_distance, amount_angle, attacker );
|
||||
|
||||
if ( !isalive( self ) )
|
||||
continue;
|
||||
|
||||
self monitorflash_internal( amount_distance, amount_angle, attacker, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
monitorrcbombflash() //checked matches cerberus output
|
||||
monitorrcbombflash()
|
||||
{
|
||||
self endon( "death" );
|
||||
self.flashendtime = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "flashbang", amount_distance, amount_angle, attacker );
|
||||
driver = self getseatoccupant( 0 );
|
||||
if ( !isDefined( driver ) || !isalive( driver ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
driver monitorflash_internal( amount_distance, amount_angle, attacker, 0 );
|
||||
}
|
||||
self endon( "death" );
|
||||
self.flashendtime = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "flashbang", amount_distance, amount_angle, attacker );
|
||||
|
||||
driver = self getseatoccupant( 0 );
|
||||
|
||||
if ( !isdefined( driver ) || !isalive( driver ) )
|
||||
continue;
|
||||
|
||||
driver monitorflash_internal( amount_distance, amount_angle, attacker, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
applyflash( duration, rumbleduration, attacker ) //checked matches cerberus output
|
||||
applyflash( duration, rumbleduration, attacker )
|
||||
{
|
||||
if ( !isDefined( self.flashduration ) || duration > self.flashduration )
|
||||
{
|
||||
self.flashduration = duration;
|
||||
}
|
||||
if ( !isDefined( self.flashrumbleduration ) || rumbleduration > self.flashrumbleduration )
|
||||
{
|
||||
self.flashrumbleduration = rumbleduration;
|
||||
}
|
||||
self thread playflashsound( duration );
|
||||
wait 0.05;
|
||||
if ( isDefined( self.flashduration ) )
|
||||
{
|
||||
self shellshock( "flashbang", self.flashduration, 0 );
|
||||
self.flashendtime = getTime() + ( self.flashduration * 1000 );
|
||||
self.lastflashedby = attacker;
|
||||
}
|
||||
if ( isDefined( self.flashrumbleduration ) )
|
||||
{
|
||||
self thread flashrumbleloop( self.flashrumbleduration );
|
||||
}
|
||||
self.flashduration = undefined;
|
||||
self.flashrumbleduration = undefined;
|
||||
if ( !isdefined( self.flashduration ) || duration > self.flashduration )
|
||||
self.flashduration = duration;
|
||||
|
||||
if ( !isdefined( self.flashrumbleduration ) || rumbleduration > self.flashrumbleduration )
|
||||
self.flashrumbleduration = rumbleduration;
|
||||
|
||||
self thread playflashsound( duration );
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( self.flashduration ) )
|
||||
{
|
||||
self shellshock( "flashbang", self.flashduration, 0 );
|
||||
self.flashendtime = gettime() + self.flashduration * 1000;
|
||||
self.lastflashedby = attacker;
|
||||
}
|
||||
|
||||
if ( isdefined( self.flashrumbleduration ) )
|
||||
self thread flashrumbleloop( self.flashrumbleduration );
|
||||
|
||||
self.flashduration = undefined;
|
||||
self.flashrumbleduration = undefined;
|
||||
}
|
||||
|
||||
playflashsound( duration ) //checked matches cerberus output
|
||||
playflashsound( duration )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
flashsound = spawn( "script_origin", ( 0, 0, 1 ) );
|
||||
flashsound.origin = self.origin;
|
||||
flashsound linkto( self );
|
||||
flashsound thread deleteentonownerdeath( self );
|
||||
flashsound playsound( level.sound_flash_start );
|
||||
flashsound playloopsound( level.sound_flash_loop );
|
||||
if ( duration > 0.5 )
|
||||
{
|
||||
wait ( duration - 0.5 );
|
||||
}
|
||||
flashsound playsound( level.sound_flash_start );
|
||||
flashsound stoploopsound( 0.5 );
|
||||
wait 0.5;
|
||||
flashsound notify( "delete" );
|
||||
flashsound delete();
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
flashsound = spawn( "script_origin", ( 0, 0, 1 ) );
|
||||
flashsound.origin = self.origin;
|
||||
flashsound linkto( self );
|
||||
flashsound thread deleteentonownerdeath( self );
|
||||
flashsound playsound( level.sound_flash_start );
|
||||
flashsound playloopsound( level.sound_flash_loop );
|
||||
|
||||
if ( duration > 0.5 )
|
||||
wait( duration - 0.5 );
|
||||
|
||||
flashsound playsound( level.sound_flash_start );
|
||||
flashsound stoploopsound( 0.5 );
|
||||
wait 0.5;
|
||||
flashsound notify( "delete" );
|
||||
flashsound delete();
|
||||
}
|
||||
|
||||
deleteentonownerdeath( owner ) //checked matches cerberus output
|
||||
deleteentonownerdeath( owner )
|
||||
{
|
||||
self endon( "delete" );
|
||||
owner waittill( "death" );
|
||||
self delete();
|
||||
}
|
||||
self endon( "delete" );
|
||||
|
||||
owner waittill( "death" );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
@ -1,458 +1,455 @@
|
||||
#include maps/mp/_createfx;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_createfx;
|
||||
|
||||
print_org( fxcommand, fxid, fxpos, waittime )
|
||||
{
|
||||
/#
|
||||
if ( getDvar( "debug" ) == "1" )
|
||||
{
|
||||
println( "{" );
|
||||
println( ""origin" "" + fxpos[ 0 ] + " " + fxpos[ 1 ] + " " + fxpos[ 2 ] + """ );
|
||||
println( ""classname" "script_model"" );
|
||||
println( ""model" "fx"" );
|
||||
println( ""script_fxcommand" "" + fxcommand + """ );
|
||||
println( ""script_fxid" "" + fxid + """ );
|
||||
println( ""script_delay" "" + waittime + """ );
|
||||
println( "}" );
|
||||
if ( getdvar( _hash_F49A52C ) == "1" )
|
||||
{
|
||||
println( "{" );
|
||||
println( "\"origin\" \"" + fxpos[0] + " " + fxpos[1] + " " + fxpos[2] + "\"" );
|
||||
println( "\"classname\" \"script_model\"" );
|
||||
println( "\"model\" \"fx\"" );
|
||||
println( "\"script_fxcommand\" \"" + fxcommand + "\"" );
|
||||
println( "\"script_fxid\" \"" + fxid + "\"" );
|
||||
println( "\"script_delay\" \"" + waittime + "\"" );
|
||||
println( "}" );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
oneshotfx( fxid, fxpos, waittime, fxpos2 )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
oneshotfxthread()
|
||||
{
|
||||
wait 0,05;
|
||||
if ( self.v[ "delay" ] > 0 )
|
||||
{
|
||||
wait self.v[ "delay" ];
|
||||
}
|
||||
create_triggerfx();
|
||||
wait 0.05;
|
||||
|
||||
if ( self.v["delay"] > 0 )
|
||||
wait( self.v["delay"] );
|
||||
|
||||
create_triggerfx();
|
||||
}
|
||||
|
||||
create_triggerfx()
|
||||
{
|
||||
self.looper = spawnfx_wrapper( self.v[ "fxid" ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] );
|
||||
triggerfx( self.looper, self.v[ "delay" ] );
|
||||
create_loopsound();
|
||||
self.looper = spawnfx_wrapper( self.v["fxid"], self.v["origin"], self.v["forward"], self.v["up"] );
|
||||
triggerfx( self.looper, self.v["delay"] );
|
||||
create_loopsound();
|
||||
}
|
||||
|
||||
exploderfx( num, fxid, fxpos, waittime, fxpos2, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout, exploder_group )
|
||||
{
|
||||
if ( 1 )
|
||||
{
|
||||
ent = createexploder( fxid );
|
||||
ent.v[ "origin" ] = fxpos;
|
||||
ent.v[ "angles" ] = ( 0, 0, 0 );
|
||||
if ( isDefined( fxpos2 ) )
|
||||
{
|
||||
ent.v[ "angles" ] = vectorToAngle( fxpos2 - fxpos );
|
||||
}
|
||||
ent.v[ "delay" ] = waittime;
|
||||
ent.v[ "exploder" ] = num;
|
||||
return;
|
||||
}
|
||||
fx = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
fx.origin = fxpos;
|
||||
fx.angles = vectorToAngle( fxpos2 - fxpos );
|
||||
fx.script_exploder = num;
|
||||
fx.script_fxid = fxid;
|
||||
fx.script_delay = waittime;
|
||||
fx.script_firefx = firefx;
|
||||
fx.script_firefxdelay = firefxdelay;
|
||||
fx.script_firefxsound = firefxsound;
|
||||
fx.script_sound = fxsound;
|
||||
fx.script_earthquake = fxquake;
|
||||
fx.script_damage = fxdamage;
|
||||
fx.script_radius = damage_radius;
|
||||
fx.script_soundalias = soundalias;
|
||||
fx.script_firefxtimeout = firefxtimeout;
|
||||
fx.script_repeat = repeat;
|
||||
fx.script_delay_min = delay_min;
|
||||
fx.script_delay_max = delay_max;
|
||||
fx.script_exploder_group = exploder_group;
|
||||
forward = anglesToForward( fx.angles );
|
||||
forward = vectorScale( forward, 150 );
|
||||
fx.targetpos = fxpos + forward;
|
||||
if ( !isDefined( level._script_exploders ) )
|
||||
{
|
||||
level._script_exploders = [];
|
||||
}
|
||||
level._script_exploders[ level._script_exploders.size ] = fx;
|
||||
maps/mp/_createfx::createfx_showorigin( fxid, fxpos, waittime, fxpos2, "exploderfx", fx, undefined, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout );
|
||||
if ( 1 )
|
||||
{
|
||||
ent = createexploder( fxid );
|
||||
ent.v["origin"] = fxpos;
|
||||
ent.v["angles"] = ( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( fxpos2 ) )
|
||||
ent.v["angles"] = vectortoangles( fxpos2 - fxpos );
|
||||
|
||||
ent.v["delay"] = waittime;
|
||||
ent.v["exploder"] = num;
|
||||
return;
|
||||
}
|
||||
|
||||
fx = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
fx.origin = fxpos;
|
||||
fx.angles = vectortoangles( fxpos2 - fxpos );
|
||||
fx.script_exploder = num;
|
||||
fx.script_fxid = fxid;
|
||||
fx.script_delay = waittime;
|
||||
fx.script_firefx = firefx;
|
||||
fx.script_firefxdelay = firefxdelay;
|
||||
fx.script_firefxsound = firefxsound;
|
||||
fx.script_sound = fxsound;
|
||||
fx.script_earthquake = fxquake;
|
||||
fx.script_damage = fxdamage;
|
||||
fx.script_radius = damage_radius;
|
||||
fx.script_soundalias = soundalias;
|
||||
fx.script_firefxtimeout = firefxtimeout;
|
||||
fx.script_repeat = repeat;
|
||||
fx.script_delay_min = delay_min;
|
||||
fx.script_delay_max = delay_max;
|
||||
fx.script_exploder_group = exploder_group;
|
||||
forward = anglestoforward( fx.angles );
|
||||
forward = vectorscale( forward, 150 );
|
||||
fx.targetpos = fxpos + forward;
|
||||
|
||||
if ( !isdefined( level._script_exploders ) )
|
||||
level._script_exploders = [];
|
||||
|
||||
level._script_exploders[level._script_exploders.size] = fx;
|
||||
maps\mp\_createfx::createfx_showorigin( fxid, fxpos, waittime, fxpos2, "exploderfx", fx, undefined, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout );
|
||||
}
|
||||
|
||||
loopfx( fxid, fxpos, waittime, fxpos2, fxstart, fxstop, timeout )
|
||||
{
|
||||
/#
|
||||
println( "Loopfx is deprecated!" );
|
||||
println( "Loopfx is deprecated!" );
|
||||
#/
|
||||
ent = createloopeffect( fxid );
|
||||
ent.v[ "origin" ] = fxpos;
|
||||
ent.v[ "angles" ] = ( 0, 0, 0 );
|
||||
if ( isDefined( fxpos2 ) )
|
||||
{
|
||||
ent.v[ "angles" ] = vectorToAngle( fxpos2 - fxpos );
|
||||
}
|
||||
ent.v[ "delay" ] = waittime;
|
||||
ent = createloopeffect( fxid );
|
||||
ent.v["origin"] = fxpos;
|
||||
ent.v["angles"] = ( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( fxpos2 ) )
|
||||
ent.v["angles"] = vectortoangles( fxpos2 - fxpos );
|
||||
|
||||
ent.v["delay"] = waittime;
|
||||
}
|
||||
|
||||
create_looper()
|
||||
{
|
||||
self.looper = playloopedfx( level._effect[ self.v[ "fxid" ] ], self.v[ "delay" ], self.v[ "origin" ], 0, self.v[ "forward" ], self.v[ "up" ] );
|
||||
create_loopsound();
|
||||
self.looper = playloopedfx( level._effect[self.v["fxid"]], self.v["delay"], self.v["origin"], 0, self.v["forward"], self.v["up"] );
|
||||
create_loopsound();
|
||||
}
|
||||
|
||||
create_loopsound()
|
||||
{
|
||||
self notify( "stop_loop" );
|
||||
if ( isDefined( self.v[ "soundalias" ] ) && self.v[ "soundalias" ] != "nil" )
|
||||
{
|
||||
if ( isDefined( self.looper ) )
|
||||
{
|
||||
self.looper thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "death" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "stop_loop" );
|
||||
}
|
||||
}
|
||||
self notify( "stop_loop" );
|
||||
|
||||
if ( isdefined( self.v["soundalias"] ) && self.v["soundalias"] != "nil" )
|
||||
{
|
||||
if ( isdefined( self.looper ) )
|
||||
self.looper thread maps\mp\_utility::loop_fx_sound( self.v["soundalias"], self.v["origin"], "death" );
|
||||
else
|
||||
thread maps\mp\_utility::loop_fx_sound( self.v["soundalias"], self.v["origin"], "stop_loop" );
|
||||
}
|
||||
}
|
||||
|
||||
stop_loopsound()
|
||||
{
|
||||
self notify( "stop_loop" );
|
||||
self notify( "stop_loop" );
|
||||
}
|
||||
|
||||
loopfxthread()
|
||||
{
|
||||
wait 0,05;
|
||||
if ( isDefined( self.fxstart ) )
|
||||
{
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
create_looper();
|
||||
if ( isDefined( self.timeout ) )
|
||||
{
|
||||
thread loopfxstop( self.timeout );
|
||||
}
|
||||
if ( isDefined( self.fxstop ) )
|
||||
{
|
||||
level waittill( "stop fx" + self.fxstop );
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.looper ) )
|
||||
{
|
||||
self.looper delete();
|
||||
}
|
||||
if ( isDefined( self.fxstart ) )
|
||||
{
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( self.fxstart ) )
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
create_looper();
|
||||
|
||||
if ( isdefined( self.timeout ) )
|
||||
thread loopfxstop( self.timeout );
|
||||
|
||||
if ( isdefined( self.fxstop ) )
|
||||
level waittill( "stop fx" + self.fxstop );
|
||||
else
|
||||
return;
|
||||
|
||||
if ( isdefined( self.looper ) )
|
||||
self.looper delete();
|
||||
|
||||
if ( isdefined( self.fxstart ) )
|
||||
level waittill( "start fx" + self.fxstart );
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
loopfxchangeid( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
ent waittill( "effect id changed", change );
|
||||
self endon( "death" );
|
||||
|
||||
ent waittill( "effect id changed", change );
|
||||
}
|
||||
|
||||
loopfxchangeorg( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
ent waittill( "effect org changed", change );
|
||||
self.origin = change;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ent waittill( "effect org changed", change );
|
||||
|
||||
self.origin = change;
|
||||
}
|
||||
}
|
||||
|
||||
loopfxchangedelay( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
ent waittill( "effect delay changed", change );
|
||||
self endon( "death" );
|
||||
|
||||
ent waittill( "effect delay changed", change );
|
||||
}
|
||||
|
||||
loopfxdeletion( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
ent waittill( "effect deleted" );
|
||||
self delete();
|
||||
self endon( "death" );
|
||||
|
||||
ent waittill( "effect deleted" );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
loopfxstop( timeout )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait timeout;
|
||||
self.looper delete();
|
||||
self endon( "death" );
|
||||
wait( timeout );
|
||||
self.looper delete();
|
||||
}
|
||||
|
||||
loopsound( sound, pos, waittime )
|
||||
{
|
||||
level thread loopsoundthread( sound, pos, waittime );
|
||||
level thread loopsoundthread( sound, pos, waittime );
|
||||
}
|
||||
|
||||
loopsoundthread( sound, pos, waittime )
|
||||
{
|
||||
org = spawn( "script_origin", pos );
|
||||
org.origin = pos;
|
||||
org playloopsound( sound );
|
||||
org = spawn( "script_origin", pos );
|
||||
org.origin = pos;
|
||||
org playloopsound( sound );
|
||||
}
|
||||
|
||||
gunfireloopfx( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
thread gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
thread gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
}
|
||||
|
||||
gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0,05;
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxent = spawnfx( level._effect[ fxid ], fxpos );
|
||||
for ( ;; )
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
i = 0;
|
||||
while ( i < shotnum )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
wait ( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
i++;
|
||||
}
|
||||
wait ( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0.05;
|
||||
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxent = spawnfx( level._effect[fxid], fxpos );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
|
||||
for ( i = 0; i < shotnum; i++ )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
wait( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
}
|
||||
|
||||
wait( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
}
|
||||
|
||||
gunfireloopfxvec( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
thread gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
thread gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax );
|
||||
}
|
||||
|
||||
gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax )
|
||||
{
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0,05;
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxpos2 = vectornormalize( fxpos2 - fxpos );
|
||||
fxent = spawnfx( level._effect[ fxid ], fxpos, fxpos2 );
|
||||
for ( ;; )
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
i = 0;
|
||||
while ( i < int( shotnum / level.fxfireloopmod ) )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
delay = ( shotdelaybase + randomfloat( shotdelayrange ) ) * level.fxfireloopmod;
|
||||
if ( delay < 0,05 )
|
||||
{
|
||||
delay = 0,05;
|
||||
}
|
||||
wait delay;
|
||||
i++;
|
||||
}
|
||||
wait ( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
wait ( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
level endon( "stop all gunfireloopfx" );
|
||||
wait 0.05;
|
||||
|
||||
if ( betweensetsmax < betweensetsmin )
|
||||
{
|
||||
temp = betweensetsmax;
|
||||
betweensetsmax = betweensetsmin;
|
||||
betweensetsmin = temp;
|
||||
}
|
||||
|
||||
betweensetsbase = betweensetsmin;
|
||||
betweensetsrange = betweensetsmax - betweensetsmin;
|
||||
|
||||
if ( shotdelaymax < shotdelaymin )
|
||||
{
|
||||
temp = shotdelaymax;
|
||||
shotdelaymax = shotdelaymin;
|
||||
shotdelaymin = temp;
|
||||
}
|
||||
|
||||
shotdelaybase = shotdelaymin;
|
||||
shotdelayrange = shotdelaymax - shotdelaymin;
|
||||
|
||||
if ( shotsmax < shotsmin )
|
||||
{
|
||||
temp = shotsmax;
|
||||
shotsmax = shotsmin;
|
||||
shotsmin = temp;
|
||||
}
|
||||
|
||||
shotsbase = shotsmin;
|
||||
shotsrange = shotsmax - shotsmin;
|
||||
fxpos2 = vectornormalize( fxpos2 - fxpos );
|
||||
fxent = spawnfx( level._effect[fxid], fxpos, fxpos2 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
shotnum = shotsbase + randomint( shotsrange );
|
||||
|
||||
for ( i = 0; i < int( shotnum / level.fxfireloopmod ); i++ )
|
||||
{
|
||||
triggerfx( fxent );
|
||||
delay = ( shotdelaybase + randomfloat( shotdelayrange ) ) * level.fxfireloopmod;
|
||||
|
||||
if ( delay < 0.05 )
|
||||
delay = 0.05;
|
||||
|
||||
wait( delay );
|
||||
}
|
||||
|
||||
wait( shotdelaybase + randomfloat( shotdelayrange ) );
|
||||
wait( betweensetsbase + randomfloat( betweensetsrange ) );
|
||||
}
|
||||
}
|
||||
|
||||
setfireloopmod( value )
|
||||
{
|
||||
level.fxfireloopmod = 1 / value;
|
||||
level.fxfireloopmod = 1 / value;
|
||||
}
|
||||
|
||||
setup_fx()
|
||||
{
|
||||
if ( isDefined( self.script_fxid ) || !isDefined( self.script_fxcommand ) && !isDefined( self.script_delay ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
org = undefined;
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
ent = getent( self.target, "targetname" );
|
||||
if ( isDefined( ent ) )
|
||||
{
|
||||
org = ent.origin;
|
||||
}
|
||||
}
|
||||
fxstart = undefined;
|
||||
if ( isDefined( self.script_fxstart ) )
|
||||
{
|
||||
fxstart = self.script_fxstart;
|
||||
}
|
||||
fxstop = undefined;
|
||||
if ( isDefined( self.script_fxstop ) )
|
||||
{
|
||||
fxstop = self.script_fxstop;
|
||||
}
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
{
|
||||
oneshotfx( self.script_fxid, self.origin, self.script_delay, org );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
{
|
||||
loopfx( self.script_fxid, self.origin, self.script_delay, org, fxstart, fxstop );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
{
|
||||
loopsound( self.script_fxid, self.origin, self.script_delay );
|
||||
}
|
||||
self delete();
|
||||
if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) )
|
||||
return;
|
||||
|
||||
org = undefined;
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
ent = getent( self.target, "targetname" );
|
||||
|
||||
if ( isdefined( ent ) )
|
||||
org = ent.origin;
|
||||
}
|
||||
|
||||
fxstart = undefined;
|
||||
|
||||
if ( isdefined( self.script_fxstart ) )
|
||||
fxstart = self.script_fxstart;
|
||||
|
||||
fxstop = undefined;
|
||||
|
||||
if ( isdefined( self.script_fxstop ) )
|
||||
fxstop = self.script_fxstop;
|
||||
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
oneshotfx( self.script_fxid, self.origin, self.script_delay, org );
|
||||
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
loopfx( self.script_fxid, self.origin, self.script_delay, org, fxstart, fxstop );
|
||||
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
loopsound( self.script_fxid, self.origin, self.script_delay );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
script_print_fx()
|
||||
{
|
||||
/#
|
||||
if ( isDefined( self.script_fxid ) || !isDefined( self.script_fxcommand ) && !isDefined( self.script_delay ) )
|
||||
{
|
||||
println( "Effect at origin ", self.origin, " doesn't have script_fxid/script_fxcommand/script_delay" );
|
||||
self delete();
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
org = getent( self.target, "targetname" ).origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
org = "undefined";
|
||||
}
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
{
|
||||
println( "mapsmp_fx::OneShotfx("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
{
|
||||
println( "mapsmp_fx::LoopFx("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
}
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
{
|
||||
println( "mapsmp_fx::LoopSound("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) )
|
||||
{
|
||||
println( "Effect at origin ", self.origin, " doesn't have script_fxid/script_fxcommand/script_delay" );
|
||||
self delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
org = getent( self.target, "targetname" ).origin;
|
||||
else
|
||||
org = "undefined";
|
||||
|
||||
if ( self.script_fxcommand == "OneShotfx" )
|
||||
println( "mapsmp_fx::OneShotfx(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
|
||||
if ( self.script_fxcommand == "loopfx" )
|
||||
println( "mapsmp_fx::LoopFx(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
|
||||
if ( self.script_fxcommand == "loopsound" )
|
||||
println( "mapsmp_fx::LoopSound(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
script_playfx( id, pos, pos2 )
|
||||
{
|
||||
if ( !id )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( pos2 ) )
|
||||
{
|
||||
playfx( id, pos, pos2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
playfx( id, pos );
|
||||
}
|
||||
if ( !id )
|
||||
return;
|
||||
|
||||
if ( isdefined( pos2 ) )
|
||||
playfx( id, pos, pos2 );
|
||||
else
|
||||
playfx( id, pos );
|
||||
}
|
||||
|
||||
script_playfxontag( id, ent, tag )
|
||||
{
|
||||
if ( !id )
|
||||
{
|
||||
return;
|
||||
}
|
||||
playfxontag( id, ent, tag );
|
||||
if ( !id )
|
||||
return;
|
||||
|
||||
playfxontag( id, ent, tag );
|
||||
}
|
||||
|
||||
grenadeexplosionfx( pos )
|
||||
{
|
||||
playfx( level._effect[ "mechanical explosion" ], pos );
|
||||
earthquake( 0,15, 0,5, pos, 250 );
|
||||
playfx( level._effect["mechanical explosion"], pos );
|
||||
earthquake( 0.15, 0.5, pos, 250 );
|
||||
}
|
||||
|
||||
soundfx( fxid, fxpos, endonnotify )
|
||||
{
|
||||
org = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
org.origin = fxpos;
|
||||
org playloopsound( fxid );
|
||||
if ( isDefined( endonnotify ) )
|
||||
{
|
||||
org thread soundfxdelete( endonnotify );
|
||||
}
|
||||
org = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
org.origin = fxpos;
|
||||
org playloopsound( fxid );
|
||||
|
||||
if ( isdefined( endonnotify ) )
|
||||
org thread soundfxdelete( endonnotify );
|
||||
}
|
||||
|
||||
soundfxdelete( endonnotify )
|
||||
{
|
||||
level waittill( endonnotify );
|
||||
self delete();
|
||||
level waittill( endonnotify );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
blenddelete( blend )
|
||||
{
|
||||
self waittill( "death" );
|
||||
blend delete();
|
||||
self waittill( "death" );
|
||||
|
||||
blend delete();
|
||||
}
|
||||
|
||||
spawnfx_wrapper( fx_id, origin, forward, up )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( level._effect[ fx_id ] ), "Missing level._effect["" + fx_id + ""]. You did not setup the fx before calling it in createFx." );
|
||||
assert( isdefined( level._effect[fx_id] ), "Missing level._effect[\"" + fx_id + "\"]. You did not setup the fx before calling it in createFx." );
|
||||
#/
|
||||
fx_object = spawnfx( level._effect[ fx_id ], origin, forward, up );
|
||||
return fx_object;
|
||||
fx_object = spawnfx( level._effect[fx_id], origin, forward, up );
|
||||
return fx_object;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.scr_anim = [];
|
||||
level.scr_anim[ "fxanim_props" ] = [];
|
||||
level.scr_anim = [];
|
||||
level.scr_anim["fxanim_props"] = [];
|
||||
}
|
||||
|
@ -1,530 +1,513 @@
|
||||
#include maps/mp/gametypes/_dev;
|
||||
#include maps/mp/gametypes/_globallogic_utils;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_globallogic_utils;
|
||||
#include maps\mp\gametypes\_dev;
|
||||
|
||||
init()
|
||||
{
|
||||
/#
|
||||
level.sessionadvertstatus = 1;
|
||||
thread sessionadvertismentupdatedebughud();
|
||||
level.sessionadvertstatus = 1;
|
||||
thread sessionadvertismentupdatedebughud();
|
||||
#/
|
||||
thread sessionadvertisementcheck();
|
||||
thread sessionadvertisementcheck();
|
||||
}
|
||||
|
||||
setadvertisedstatus( onoff )
|
||||
{
|
||||
/#
|
||||
level.sessionadvertstatus = onoff;
|
||||
level.sessionadvertstatus = onoff;
|
||||
#/
|
||||
changeadvertisedstatus( onoff );
|
||||
changeadvertisedstatus( onoff );
|
||||
}
|
||||
|
||||
sessionadvertisementcheck()
|
||||
{
|
||||
if ( sessionmodeisprivate() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
setadvertisedstatus( 0 );
|
||||
return;
|
||||
}
|
||||
runrules = getgametyperules();
|
||||
if ( !isDefined( runrules ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level endon( "game_end" );
|
||||
level waittill( "prematch_over" );
|
||||
while ( 1 )
|
||||
{
|
||||
sessionadvertcheckwait = getdvarintdefault( "sessionAdvertCheckwait", 1 );
|
||||
wait sessionadvertcheckwait;
|
||||
advertise = [[ runrules ]]();
|
||||
setadvertisedstatus( advertise );
|
||||
}
|
||||
if ( sessionmodeisprivate() )
|
||||
return;
|
||||
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
setadvertisedstatus( 0 );
|
||||
return;
|
||||
}
|
||||
|
||||
runrules = getgametyperules();
|
||||
|
||||
if ( !isdefined( runrules ) )
|
||||
return;
|
||||
|
||||
level endon( "game_end" );
|
||||
|
||||
level waittill( "prematch_over" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
sessionadvertcheckwait = getdvarintdefault( "sessionAdvertCheckwait", 1 );
|
||||
wait( sessionadvertcheckwait );
|
||||
advertise = [[ runrules ]]();
|
||||
setadvertisedstatus( advertise );
|
||||
}
|
||||
}
|
||||
|
||||
getgametyperules()
|
||||
{
|
||||
gametype = level.gametype;
|
||||
switch( gametype )
|
||||
{
|
||||
case "dm":
|
||||
return ::dm_rules;
|
||||
case "tdm":
|
||||
return ::tdm_rules;
|
||||
case "dom":
|
||||
return ::dom_rules;
|
||||
case "hq":
|
||||
return ::hq_rules;
|
||||
case "sd":
|
||||
return ::sd_rules;
|
||||
case "dem":
|
||||
return ::dem_rules;
|
||||
case "ctf":
|
||||
return ::ctf_rules;
|
||||
case "koth":
|
||||
return ::koth_rules;
|
||||
case "conf":
|
||||
return ::conf_rules;
|
||||
case "oic":
|
||||
return ::oic_rules;
|
||||
case "sas":
|
||||
return ::sas_rules;
|
||||
case "gun":
|
||||
return ::gun_rules;
|
||||
case "shrp":
|
||||
return ::shrp_rules;
|
||||
}
|
||||
return;
|
||||
gametype = level.gametype;
|
||||
|
||||
switch ( gametype )
|
||||
{
|
||||
case "dm":
|
||||
return ::dm_rules;
|
||||
case "tdm":
|
||||
return ::tdm_rules;
|
||||
case "dom":
|
||||
return ::dom_rules;
|
||||
case "hq":
|
||||
return ::hq_rules;
|
||||
case "sd":
|
||||
return ::sd_rules;
|
||||
case "dem":
|
||||
return ::dem_rules;
|
||||
case "ctf":
|
||||
return ::ctf_rules;
|
||||
case "koth":
|
||||
return ::koth_rules;
|
||||
case "conf":
|
||||
return ::conf_rules;
|
||||
case "oic":
|
||||
return ::oic_rules;
|
||||
case "sas":
|
||||
return ::sas_rules;
|
||||
case "gun":
|
||||
return ::gun_rules;
|
||||
case "shrp":
|
||||
return ::shrp_rules;
|
||||
}
|
||||
}
|
||||
|
||||
teamscorelimitcheck( rulescorepercent )
|
||||
{
|
||||
if ( level.scorelimit )
|
||||
{
|
||||
minscorepercentageleft = 100;
|
||||
_a100 = level.teams;
|
||||
_k100 = getFirstArrayKey( _a100 );
|
||||
while ( isDefined( _k100 ) )
|
||||
{
|
||||
team = _a100[ _k100 ];
|
||||
scorepercentageleft = 100 - ( ( game[ "teamScores" ][ team ] / level.scorelimit ) * 100 );
|
||||
if ( minscorepercentageleft > scorepercentageleft )
|
||||
{
|
||||
minscorepercentageleft = scorepercentageleft;
|
||||
}
|
||||
if ( rulescorepercent >= scorepercentageleft )
|
||||
{
|
||||
if ( level.scorelimit )
|
||||
{
|
||||
minscorepercentageleft = 100;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
scorepercentageleft = 100 - game["teamScores"][team] / level.scorelimit * 100;
|
||||
|
||||
if ( minscorepercentageleft > scorepercentageleft )
|
||||
minscorepercentageleft = scorepercentageleft;
|
||||
|
||||
if ( rulescorepercent >= scorepercentageleft )
|
||||
{
|
||||
/#
|
||||
updatedebughud( 3, "Score Percentage Left: ", int( scorepercentageleft ) );
|
||||
updatedebughud( 3, "Score Percentage Left: ", int( scorepercentageleft ) );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
_k100 = getNextArrayKey( _a100, _k100 );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/#
|
||||
updatedebughud( 3, "Score Percentage Left: ", int( minscorepercentageleft ) );
|
||||
updatedebughud( 3, "Score Percentage Left: ", int( minscorepercentageleft ) );
|
||||
#/
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
timelimitcheck( ruletimeleft )
|
||||
{
|
||||
maxtime = level.timelimit;
|
||||
if ( maxtime != 0 )
|
||||
{
|
||||
timeleft = maps/mp/gametypes/_globallogic_utils::gettimeremaining();
|
||||
if ( ruletimeleft >= timeleft )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
maxtime = level.timelimit;
|
||||
|
||||
if ( maxtime != 0 )
|
||||
{
|
||||
timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining();
|
||||
|
||||
if ( ruletimeleft >= timeleft )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
dm_rules()
|
||||
{
|
||||
rulescorepercent = 35;
|
||||
ruletimeleft = 60000 * 1,5;
|
||||
rulescorepercent = 35;
|
||||
ruletimeleft = 60000 * 1.5;
|
||||
/#
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
#/
|
||||
if ( level.scorelimit )
|
||||
{
|
||||
highestscore = 0;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].pointstowin > highestscore )
|
||||
{
|
||||
highestscore = players[ i ].pointstowin;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
scorepercentageleft = 100 - ( ( highestscore / level.scorelimit ) * 100 );
|
||||
if ( level.scorelimit )
|
||||
{
|
||||
highestscore = 0;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i].pointstowin > highestscore )
|
||||
highestscore = players[i].pointstowin;
|
||||
}
|
||||
|
||||
scorepercentageleft = 100 - highestscore / level.scorelimit * 100;
|
||||
/#
|
||||
updatedebughud( 3, "Score Percentage Left: ", int( scorepercentageleft ) );
|
||||
updatedebughud( 3, "Score Percentage Left: ", int( scorepercentageleft ) );
|
||||
#/
|
||||
if ( rulescorepercent >= scorepercentageleft )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( rulescorepercent >= scorepercentageleft )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
tdm_rules()
|
||||
{
|
||||
rulescorepercent = 15;
|
||||
ruletimeleft = 60000 * 1,5;
|
||||
rulescorepercent = 15;
|
||||
ruletimeleft = 60000 * 1.5;
|
||||
/#
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
#/
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
return false;
|
||||
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
dom_rules()
|
||||
{
|
||||
rulescorepercent = 15;
|
||||
ruletimeleft = 60000 * 1,5;
|
||||
ruleround = 3;
|
||||
currentround = game[ "roundsplayed" ] + 1;
|
||||
rulescorepercent = 15;
|
||||
ruletimeleft = 60000 * 1.5;
|
||||
ruleround = 3;
|
||||
currentround = game["roundsplayed"] + 1;
|
||||
/#
|
||||
updatedebughud( 1, "Time limit 1.5 minutes remaining in final round. Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Is round: ", ruleround );
|
||||
updatedebughud( 4, "Current Round: ", currentround );
|
||||
updatedebughud( 1, "Time limit 1.5 minutes remaining in final round. Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Is round: ", ruleround );
|
||||
updatedebughud( 4, "Current Round: ", currentround );
|
||||
#/
|
||||
if ( currentround >= 2 )
|
||||
{
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( ruleround <= currentround )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( currentround >= 2 )
|
||||
{
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
return false;
|
||||
|
||||
if ( ruleround <= currentround )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
hq_rules()
|
||||
{
|
||||
return koth_rules();
|
||||
return koth_rules();
|
||||
}
|
||||
|
||||
sd_rules()
|
||||
{
|
||||
ruleround = 3;
|
||||
ruleround = 3;
|
||||
/#
|
||||
updatedebughud( 1, "Any team has won rounds: ", ruleround );
|
||||
updatedebughud( 1, "Any team has won rounds: ", ruleround );
|
||||
#/
|
||||
maxroundswon = 0;
|
||||
_a299 = level.teams;
|
||||
_k299 = getFirstArrayKey( _a299 );
|
||||
while ( isDefined( _k299 ) )
|
||||
{
|
||||
team = _a299[ _k299 ];
|
||||
roundswon = game[ "teamScores" ][ team ];
|
||||
if ( maxroundswon < roundswon )
|
||||
{
|
||||
maxroundswon = roundswon;
|
||||
}
|
||||
if ( ruleround <= roundswon )
|
||||
{
|
||||
maxroundswon = 0;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
roundswon = game["teamScores"][team];
|
||||
|
||||
if ( maxroundswon < roundswon )
|
||||
maxroundswon = roundswon;
|
||||
|
||||
if ( ruleround <= roundswon )
|
||||
{
|
||||
/#
|
||||
updatedebughud( 3, "Max Rounds Won: ", maxroundswon );
|
||||
updatedebughud( 3, "Max Rounds Won: ", maxroundswon );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
_k299 = getNextArrayKey( _a299, _k299 );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/#
|
||||
updatedebughud( 3, "Max Rounds Won: ", maxroundswon );
|
||||
updatedebughud( 3, "Max Rounds Won: ", maxroundswon );
|
||||
#/
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
dem_rules()
|
||||
{
|
||||
return ctf_rules();
|
||||
return ctf_rules();
|
||||
}
|
||||
|
||||
ctf_rules()
|
||||
{
|
||||
ruleround = 3;
|
||||
roundsplayed = game[ "roundsplayed" ];
|
||||
ruleround = 3;
|
||||
roundsplayed = game["roundsplayed"];
|
||||
/#
|
||||
updatedebughud( 1, "Is round or later: ", ruleround );
|
||||
updatedebughud( 3, "Rounds Played: ", roundsplayed );
|
||||
updatedebughud( 1, "Is round or later: ", ruleround );
|
||||
updatedebughud( 3, "Rounds Played: ", roundsplayed );
|
||||
#/
|
||||
if ( ruleround <= roundsplayed )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( ruleround <= roundsplayed )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
koth_rules()
|
||||
{
|
||||
rulescorepercent = 20;
|
||||
ruletimeleft = 60000 * 1,5;
|
||||
rulescorepercent = 20;
|
||||
ruletimeleft = 60000 * 1.5;
|
||||
/#
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
#/
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
return false;
|
||||
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
conf_rules()
|
||||
{
|
||||
return tdm_rules();
|
||||
return tdm_rules();
|
||||
}
|
||||
|
||||
oic_rules()
|
||||
{
|
||||
/#
|
||||
updatedebughud( 1, "No join in progress, so shouldnt advertise to matchmaking once the countdown timer ends.", 0 );
|
||||
updatedebughud( 1, "No join in progress, so shouldn<EFBFBD>t advertise to matchmaking once the countdown timer ends.", 0 );
|
||||
#/
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
sas_rules()
|
||||
{
|
||||
rulescorepercent = 35;
|
||||
ruletimeleft = 60000 * 1,5;
|
||||
rulescorepercent = 35;
|
||||
ruletimeleft = 60000 * 1.5;
|
||||
/#
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
#/
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
return false;
|
||||
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
gun_rules()
|
||||
{
|
||||
ruleweaponsleft = 3;
|
||||
ruleweaponsleft = 3;
|
||||
/#
|
||||
updatedebughud( 1, "Any player is within X weapons from winning: ", ruleweaponsleft );
|
||||
updatedebughud( 1, "Any player is within X weapons from winning: ", ruleweaponsleft );
|
||||
#/
|
||||
minweaponsleft = level.gunprogression.size;
|
||||
_a455 = level.players;
|
||||
_k455 = getFirstArrayKey( _a455 );
|
||||
while ( isDefined( _k455 ) )
|
||||
{
|
||||
player = _a455[ _k455 ];
|
||||
weaponsleft = level.gunprogression.size - player.gunprogress;
|
||||
if ( minweaponsleft > weaponsleft )
|
||||
{
|
||||
minweaponsleft = weaponsleft;
|
||||
}
|
||||
if ( ruleweaponsleft >= minweaponsleft )
|
||||
{
|
||||
minweaponsleft = level.gunprogression.size;
|
||||
|
||||
foreach ( player in level.players )
|
||||
{
|
||||
weaponsleft = level.gunprogression.size - player.gunprogress;
|
||||
|
||||
if ( minweaponsleft > weaponsleft )
|
||||
minweaponsleft = weaponsleft;
|
||||
|
||||
if ( ruleweaponsleft >= minweaponsleft )
|
||||
{
|
||||
/#
|
||||
updatedebughud( 3, "Weapons Left: ", minweaponsleft );
|
||||
updatedebughud( 3, "Weapons Left: ", minweaponsleft );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
_k455 = getNextArrayKey( _a455, _k455 );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/#
|
||||
updatedebughud( 3, "Weapons Left: ", minweaponsleft );
|
||||
updatedebughud( 3, "Weapons Left: ", minweaponsleft );
|
||||
#/
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
shrp_rules()
|
||||
{
|
||||
rulescorepercent = 35;
|
||||
ruletimeleft = 60000 * 1,5;
|
||||
rulescorepercent = 35;
|
||||
ruletimeleft = 60000 * 1.5;
|
||||
/#
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
updatedebughud( 1, "Any player is within percent of score cap: ", rulescorepercent );
|
||||
updatedebughud( 2, "Time limit has less than minutes remaining: ", ruletimeleft / 60000 );
|
||||
#/
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( teamscorelimitcheck( rulescorepercent ) == 0 )
|
||||
return false;
|
||||
|
||||
if ( timelimitcheck( ruletimeleft ) == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sessionadvertismentcreatedebughud( linenum, alignx )
|
||||
{
|
||||
/#
|
||||
debug_hud = maps/mp/gametypes/_dev::new_hud( "session_advert", "debug_hud", 0, 0, 1 );
|
||||
debug_hud.hidewheninmenu = 1;
|
||||
debug_hud.horzalign = "right";
|
||||
debug_hud.vertalign = "middle";
|
||||
debug_hud.alignx = "right";
|
||||
debug_hud.aligny = "middle";
|
||||
debug_hud.x = alignx;
|
||||
debug_hud.y = -50 + ( linenum * 15 );
|
||||
debug_hud.foreground = 1;
|
||||
debug_hud.font = "default";
|
||||
debug_hud.fontscale = 1,5;
|
||||
debug_hud.color = ( 1, 0, 0 );
|
||||
debug_hud.alpha = 1;
|
||||
debug_hud settext( "" );
|
||||
return debug_hud;
|
||||
debug_hud = maps\mp\gametypes\_dev::new_hud( "session_advert", "debug_hud", 0, 0, 1 );
|
||||
debug_hud.hidewheninmenu = 1;
|
||||
debug_hud.horzalign = "right";
|
||||
debug_hud.vertalign = "middle";
|
||||
debug_hud.alignx = "right";
|
||||
debug_hud.aligny = "middle";
|
||||
debug_hud.x = alignx;
|
||||
debug_hud.y = -50 + linenum * 15;
|
||||
debug_hud.foreground = 1;
|
||||
debug_hud.font = "default";
|
||||
debug_hud.fontscale = 1.5;
|
||||
debug_hud.color = ( 1, 1, 1 );
|
||||
debug_hud.alpha = 1;
|
||||
debug_hud settext( "" );
|
||||
return debug_hud;
|
||||
#/
|
||||
}
|
||||
|
||||
updatedebughud( hudindex, text, value )
|
||||
{
|
||||
/#
|
||||
switch( hudindex )
|
||||
{
|
||||
case 1:
|
||||
level.sessionadverthud_1a_text = text;
|
||||
level.sessionadverthud_1b_text = value;
|
||||
break;
|
||||
case 2:
|
||||
level.sessionadverthud_2a_text = text;
|
||||
level.sessionadverthud_2b_text = value;
|
||||
break;
|
||||
case 3:
|
||||
level.sessionadverthud_3a_text = text;
|
||||
level.sessionadverthud_3b_text = value;
|
||||
break;
|
||||
case 4:
|
||||
level.sessionadverthud_4a_text = text;
|
||||
level.sessionadverthud_4b_text = value;
|
||||
break;
|
||||
}
|
||||
switch ( hudindex )
|
||||
{
|
||||
case "1":
|
||||
level.sessionadverthud_1a_text = text;
|
||||
level.sessionadverthud_1b_text = value;
|
||||
break;
|
||||
case "2":
|
||||
level.sessionadverthud_2a_text = text;
|
||||
level.sessionadverthud_2b_text = value;
|
||||
break;
|
||||
case "3":
|
||||
level.sessionadverthud_3a_text = text;
|
||||
level.sessionadverthud_3b_text = value;
|
||||
break;
|
||||
case "4":
|
||||
level.sessionadverthud_4a_text = text;
|
||||
level.sessionadverthud_4b_text = value;
|
||||
break;
|
||||
}
|
||||
#/
|
||||
}
|
||||
|
||||
sessionadvertismentupdatedebughud()
|
||||
{
|
||||
/#
|
||||
level endon( "game_end" );
|
||||
sessionadverthud_0 = undefined;
|
||||
sessionadverthud_1a = undefined;
|
||||
sessionadverthud_1b = undefined;
|
||||
sessionadverthud_2a = undefined;
|
||||
sessionadverthud_2b = undefined;
|
||||
sessionadverthud_3a = undefined;
|
||||
sessionadverthud_3b = undefined;
|
||||
sessionadverthud_4a = undefined;
|
||||
sessionadverthud_4b = undefined;
|
||||
level.sessionadverthud_0_text = "";
|
||||
level.sessionadverthud_1a_text = "";
|
||||
level.sessionadverthud_1b_text = "";
|
||||
level.sessionadverthud_2a_text = "";
|
||||
level.sessionadverthud_2b_text = "";
|
||||
level.sessionadverthud_3a_text = "";
|
||||
level.sessionadverthud_3b_text = "";
|
||||
level.sessionadverthud_4a_text = "";
|
||||
level.sessionadverthud_4b_text = "";
|
||||
while ( 1 )
|
||||
{
|
||||
wait 1;
|
||||
showdebughud = getdvarintdefault( "sessionAdvertShowDebugHud", 0 );
|
||||
level.sessionadverthud_0_text = "Session is advertised";
|
||||
if ( level.sessionadvertstatus == 0 )
|
||||
{
|
||||
level.sessionadverthud_0_text = "Session is not advertised";
|
||||
}
|
||||
if ( !isDefined( sessionadverthud_0 ) && showdebughud != 0 )
|
||||
{
|
||||
host = gethostplayer();
|
||||
while ( !isDefined( host ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
sessionadverthud_0 = host sessionadvertismentcreatedebughud( 0, 0 );
|
||||
sessionadverthud_1a = host sessionadvertismentcreatedebughud( 1, -20 );
|
||||
sessionadverthud_1b = host sessionadvertismentcreatedebughud( 1, 0 );
|
||||
sessionadverthud_2a = host sessionadvertismentcreatedebughud( 2, -20 );
|
||||
sessionadverthud_2b = host sessionadvertismentcreatedebughud( 2, 0 );
|
||||
sessionadverthud_3a = host sessionadvertismentcreatedebughud( 3, -20 );
|
||||
sessionadverthud_3b = host sessionadvertismentcreatedebughud( 3, 0 );
|
||||
sessionadverthud_4a = host sessionadvertismentcreatedebughud( 4, -20 );
|
||||
sessionadverthud_4b = host sessionadvertismentcreatedebughud( 4, 0 );
|
||||
sessionadverthud_1a.color = vectorScale( ( 1, 0, 0 ), 0,5 );
|
||||
sessionadverthud_1b.color = vectorScale( ( 1, 0, 0 ), 0,5 );
|
||||
sessionadverthud_2a.color = vectorScale( ( 1, 0, 0 ), 0,5 );
|
||||
sessionadverthud_2b.color = vectorScale( ( 1, 0, 0 ), 0,5 );
|
||||
}
|
||||
if ( isDefined( sessionadverthud_0 ) )
|
||||
{
|
||||
if ( showdebughud == 0 )
|
||||
{
|
||||
sessionadverthud_0 destroy();
|
||||
sessionadverthud_1a destroy();
|
||||
sessionadverthud_1b destroy();
|
||||
sessionadverthud_2a destroy();
|
||||
sessionadverthud_2b destroy();
|
||||
sessionadverthud_3a destroy();
|
||||
sessionadverthud_3b destroy();
|
||||
sessionadverthud_4a destroy();
|
||||
sessionadverthud_4b destroy();
|
||||
sessionadverthud_0 = undefined;
|
||||
sessionadverthud_1a = undefined;
|
||||
sessionadverthud_1b = undefined;
|
||||
sessionadverthud_2a = undefined;
|
||||
sessionadverthud_2b = undefined;
|
||||
sessionadverthud_3a = undefined;
|
||||
sessionadverthud_3b = undefined;
|
||||
sessionadverthud_4a = undefined;
|
||||
sessionadverthud_4b = undefined;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.sessionadvertstatus == 1 )
|
||||
{
|
||||
sessionadverthud_0.color = ( 1, 0, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
sessionadverthud_0.color = vectorScale( ( 1, 0, 0 ), 0,9 );
|
||||
}
|
||||
sessionadverthud_0 settext( level.sessionadverthud_0_text );
|
||||
if ( level.sessionadverthud_1a_text != "" )
|
||||
{
|
||||
sessionadverthud_1a settext( level.sessionadverthud_1a_text );
|
||||
sessionadverthud_1b setvalue( level.sessionadverthud_1b_text );
|
||||
}
|
||||
if ( level.sessionadverthud_2a_text != "" )
|
||||
{
|
||||
sessionadverthud_2a settext( level.sessionadverthud_2a_text );
|
||||
sessionadverthud_2b setvalue( level.sessionadverthud_2b_text );
|
||||
}
|
||||
if ( level.sessionadverthud_3a_text != "" )
|
||||
{
|
||||
sessionadverthud_3a settext( level.sessionadverthud_3a_text );
|
||||
sessionadverthud_3b setvalue( level.sessionadverthud_3b_text );
|
||||
}
|
||||
if ( level.sessionadverthud_4a_text != "" )
|
||||
{
|
||||
sessionadverthud_4a settext( level.sessionadverthud_4a_text );
|
||||
sessionadverthud_4b setvalue( level.sessionadverthud_4b_text );
|
||||
}
|
||||
}
|
||||
}
|
||||
level endon( "game_end" );
|
||||
sessionadverthud_0 = undefined;
|
||||
sessionadverthud_1a = undefined;
|
||||
sessionadverthud_1b = undefined;
|
||||
sessionadverthud_2a = undefined;
|
||||
sessionadverthud_2b = undefined;
|
||||
sessionadverthud_3a = undefined;
|
||||
sessionadverthud_3b = undefined;
|
||||
sessionadverthud_4a = undefined;
|
||||
sessionadverthud_4b = undefined;
|
||||
level.sessionadverthud_0_text = "";
|
||||
level.sessionadverthud_1a_text = "";
|
||||
level.sessionadverthud_1b_text = "";
|
||||
level.sessionadverthud_2a_text = "";
|
||||
level.sessionadverthud_2b_text = "";
|
||||
level.sessionadverthud_3a_text = "";
|
||||
level.sessionadverthud_3b_text = "";
|
||||
level.sessionadverthud_4a_text = "";
|
||||
level.sessionadverthud_4b_text = "";
|
||||
|
||||
while ( true )
|
||||
{
|
||||
wait 1;
|
||||
showdebughud = getdvarintdefault( "sessionAdvertShowDebugHud", 0 );
|
||||
level.sessionadverthud_0_text = "Session is advertised";
|
||||
|
||||
if ( level.sessionadvertstatus == 0 )
|
||||
level.sessionadverthud_0_text = "Session is not advertised";
|
||||
|
||||
if ( !isdefined( sessionadverthud_0 ) && showdebughud != 0 )
|
||||
{
|
||||
host = gethostplayer();
|
||||
|
||||
if ( !isdefined( host ) )
|
||||
continue;
|
||||
|
||||
sessionadverthud_0 = host sessionadvertismentcreatedebughud( 0, 0 );
|
||||
sessionadverthud_1a = host sessionadvertismentcreatedebughud( 1, -20 );
|
||||
sessionadverthud_1b = host sessionadvertismentcreatedebughud( 1, 0 );
|
||||
sessionadverthud_2a = host sessionadvertismentcreatedebughud( 2, -20 );
|
||||
sessionadverthud_2b = host sessionadvertismentcreatedebughud( 2, 0 );
|
||||
sessionadverthud_3a = host sessionadvertismentcreatedebughud( 3, -20 );
|
||||
sessionadverthud_3b = host sessionadvertismentcreatedebughud( 3, 0 );
|
||||
sessionadverthud_4a = host sessionadvertismentcreatedebughud( 4, -20 );
|
||||
sessionadverthud_4b = host sessionadvertismentcreatedebughud( 4, 0 );
|
||||
sessionadverthud_1a.color = vectorscale( ( 0, 1, 0 ), 0.5 );
|
||||
sessionadverthud_1b.color = vectorscale( ( 0, 1, 0 ), 0.5 );
|
||||
sessionadverthud_2a.color = vectorscale( ( 0, 1, 0 ), 0.5 );
|
||||
sessionadverthud_2b.color = vectorscale( ( 0, 1, 0 ), 0.5 );
|
||||
}
|
||||
|
||||
if ( isdefined( sessionadverthud_0 ) )
|
||||
{
|
||||
if ( showdebughud == 0 )
|
||||
{
|
||||
sessionadverthud_0 destroy();
|
||||
sessionadverthud_1a destroy();
|
||||
sessionadverthud_1b destroy();
|
||||
sessionadverthud_2a destroy();
|
||||
sessionadverthud_2b destroy();
|
||||
sessionadverthud_3a destroy();
|
||||
sessionadverthud_3b destroy();
|
||||
sessionadverthud_4a destroy();
|
||||
sessionadverthud_4b destroy();
|
||||
sessionadverthud_0 = undefined;
|
||||
sessionadverthud_1a = undefined;
|
||||
sessionadverthud_1b = undefined;
|
||||
sessionadverthud_2a = undefined;
|
||||
sessionadverthud_2b = undefined;
|
||||
sessionadverthud_3a = undefined;
|
||||
sessionadverthud_3b = undefined;
|
||||
sessionadverthud_4a = undefined;
|
||||
sessionadverthud_4b = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.sessionadvertstatus == 1 )
|
||||
sessionadverthud_0.color = ( 1, 1, 1 );
|
||||
else
|
||||
sessionadverthud_0.color = vectorscale( ( 1, 0, 0 ), 0.9 );
|
||||
|
||||
sessionadverthud_0 settext( level.sessionadverthud_0_text );
|
||||
|
||||
if ( level.sessionadverthud_1a_text != "" )
|
||||
{
|
||||
sessionadverthud_1a settext( level.sessionadverthud_1a_text );
|
||||
sessionadverthud_1b setvalue( level.sessionadverthud_1b_text );
|
||||
}
|
||||
|
||||
if ( level.sessionadverthud_2a_text != "" )
|
||||
{
|
||||
sessionadverthud_2a settext( level.sessionadverthud_2a_text );
|
||||
sessionadverthud_2b setvalue( level.sessionadverthud_2b_text );
|
||||
}
|
||||
|
||||
if ( level.sessionadverthud_3a_text != "" )
|
||||
{
|
||||
sessionadverthud_3a settext( level.sessionadverthud_3a_text );
|
||||
sessionadverthud_3b setvalue( level.sessionadverthud_3b_text );
|
||||
}
|
||||
|
||||
if ( level.sessionadverthud_4a_text != "" )
|
||||
{
|
||||
sessionadverthud_4a settext( level.sessionadverthud_4a_text );
|
||||
sessionadverthud_4b setvalue( level.sessionadverthud_4b_text );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,401 +1,370 @@
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/gametypes/_rank;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_rank;
|
||||
#include maps\mp\bots\_bot;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isgamerepenabled() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isgamerepinitialized() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
game[ "gameRepInitialized" ] = 1;
|
||||
game[ "gameRep" ][ "players" ] = [];
|
||||
game[ "gameRep" ][ "playerNames" ] = [];
|
||||
game[ "gameRep" ][ "max" ] = [];
|
||||
game[ "gameRep" ][ "playerCount" ] = 0;
|
||||
gamerepinitializeparams();
|
||||
if ( !isgamerepenabled() )
|
||||
return;
|
||||
|
||||
if ( isgamerepinitialized() )
|
||||
return;
|
||||
|
||||
game["gameRepInitialized"] = 1;
|
||||
game["gameRep"]["players"] = [];
|
||||
game["gameRep"]["playerNames"] = [];
|
||||
game["gameRep"]["max"] = [];
|
||||
game["gameRep"]["playerCount"] = 0;
|
||||
gamerepinitializeparams();
|
||||
}
|
||||
|
||||
isgamerepinitialized()
|
||||
{
|
||||
if ( !isDefined( game[ "gameRepInitialized" ] ) || !game[ "gameRepInitialized" ] )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( !isdefined( game["gameRepInitialized"] ) || !game["gameRepInitialized"] )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
isgamerepenabled()
|
||||
{
|
||||
if ( maps/mp/bots/_bot::is_bot_ranked_match() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !level.rankedmatch )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( maps\mp\bots\_bot::is_bot_ranked_match() )
|
||||
return false;
|
||||
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
return false;
|
||||
|
||||
if ( !level.rankedmatch )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
gamerepinitializeparams()
|
||||
{
|
||||
threshold_exceeded_score = 0;
|
||||
threshold_exceeded_score_per_min = 1;
|
||||
threshold_exceeded_kills = 2;
|
||||
threshold_exceeded_deaths = 3;
|
||||
threshold_exceeded_kd_ratio = 4;
|
||||
threshold_exceeded_kills_per_min = 5;
|
||||
threshold_exceeded_plants = 6;
|
||||
threshold_exceeded_defuses = 7;
|
||||
threshold_exceeded_captures = 8;
|
||||
threshold_exceeded_defends = 9;
|
||||
threshold_exceeded_total_time_played = 10;
|
||||
threshold_exceeded_tactical_insertion_use = 11;
|
||||
threshold_exceeded_join_attempts = 12;
|
||||
threshold_exceeded_xp = 13;
|
||||
threshold_exceeded_splitscreen = 14;
|
||||
game[ "gameRep" ][ "params" ] = [];
|
||||
game[ "gameRep" ][ "params" ][ 0 ] = "score";
|
||||
game[ "gameRep" ][ "params" ][ 1 ] = "scorePerMin";
|
||||
game[ "gameRep" ][ "params" ][ 2 ] = "kills";
|
||||
game[ "gameRep" ][ "params" ][ 3 ] = "deaths";
|
||||
game[ "gameRep" ][ "params" ][ 4 ] = "killDeathRatio";
|
||||
game[ "gameRep" ][ "params" ][ 5 ] = "killsPerMin";
|
||||
game[ "gameRep" ][ "params" ][ 6 ] = "plants";
|
||||
game[ "gameRep" ][ "params" ][ 7 ] = "defuses";
|
||||
game[ "gameRep" ][ "params" ][ 8 ] = "captures";
|
||||
game[ "gameRep" ][ "params" ][ 9 ] = "defends";
|
||||
game[ "gameRep" ][ "params" ][ 10 ] = "totalTimePlayed";
|
||||
game[ "gameRep" ][ "params" ][ 11 ] = "tacticalInsertions";
|
||||
game[ "gameRep" ][ "params" ][ 12 ] = "joinAttempts";
|
||||
game[ "gameRep" ][ "params" ][ 13 ] = "xp";
|
||||
game[ "gameRep" ][ "ignoreParams" ] = [];
|
||||
game[ "gameRep" ][ "ignoreParams" ][ 0 ] = "totalTimePlayed";
|
||||
game[ "gameRep" ][ "gameLimit" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "tdm" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dm" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dom" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "hq" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "sd" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dem" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "ctf" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "koth" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "conf" ] = [];
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "score" ] = threshold_exceeded_score;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "score" ] = 20000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "scorePerMin" ] = threshold_exceeded_score_per_min;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "scorePerMin" ] = 250;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dem" ][ "scorePerMin" ] = 1000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "tdm" ][ "scorePerMin" ] = 700;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dm" ][ "scorePerMin" ] = 950;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dom" ][ "scorePerMin" ] = 1000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "sd" ][ "scorePerMin" ] = 200;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "ctf" ][ "scorePerMin" ] = 600;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "hq" ][ "scorePerMin" ] = 1000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "koth" ][ "scorePerMin" ] = 1000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "conf" ][ "scorePerMin" ] = 1000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "kills" ] = threshold_exceeded_kills;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "kills" ] = 75;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "tdm" ][ "kills" ] = 40;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "sd" ][ "kills" ] = 15;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dm" ][ "kills" ] = 31;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "deaths" ] = threshold_exceeded_deaths;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "deaths" ] = 50;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dm" ][ "deaths" ] = 15;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "tdm" ][ "deaths" ] = 40;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "killDeathRatio" ] = threshold_exceeded_kd_ratio;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "killDeathRatio" ] = 30;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "tdm" ][ "killDeathRatio" ] = 50;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "sd" ][ "killDeathRatio" ] = 20;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "killsPerMin" ] = threshold_exceeded_kills_per_min;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "killsPerMin" ] = 15;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "plants" ] = threshold_exceeded_plants;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "plants" ] = 10;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "defuses" ] = threshold_exceeded_defuses;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "defuses" ] = 10;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "captures" ] = threshold_exceeded_captures;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "captures" ] = 30;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "defends" ] = threshold_exceeded_defends;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "defends" ] = 50;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "totalTimePlayed" ] = threshold_exceeded_total_time_played;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "totalTimePlayed" ] = 600;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dom" ][ "totalTimePlayed" ] = 600;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "dem" ][ "totalTimePlayed" ] = 1140;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "tacticalInsertions" ] = threshold_exceeded_tactical_insertion_use;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "tacticalInsertions" ] = 20;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "joinAttempts" ] = threshold_exceeded_join_attempts;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "joinAttempts" ] = 3;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "xp" ] = threshold_exceeded_xp;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "xp" ] = 25000;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "id" ][ "splitscreen" ] = threshold_exceeded_splitscreen;
|
||||
game[ "gameRep" ][ "gameLimit" ][ "default" ][ "splitscreen" ] = 8;
|
||||
threshold_exceeded_score = 0;
|
||||
threshold_exceeded_score_per_min = 1;
|
||||
threshold_exceeded_kills = 2;
|
||||
threshold_exceeded_deaths = 3;
|
||||
threshold_exceeded_kd_ratio = 4;
|
||||
threshold_exceeded_kills_per_min = 5;
|
||||
threshold_exceeded_plants = 6;
|
||||
threshold_exceeded_defuses = 7;
|
||||
threshold_exceeded_captures = 8;
|
||||
threshold_exceeded_defends = 9;
|
||||
threshold_exceeded_total_time_played = 10;
|
||||
threshold_exceeded_tactical_insertion_use = 11;
|
||||
threshold_exceeded_join_attempts = 12;
|
||||
threshold_exceeded_xp = 13;
|
||||
threshold_exceeded_splitscreen = 14;
|
||||
game["gameRep"]["params"] = [];
|
||||
game["gameRep"]["params"][0] = "score";
|
||||
game["gameRep"]["params"][1] = "scorePerMin";
|
||||
game["gameRep"]["params"][2] = "kills";
|
||||
game["gameRep"]["params"][3] = "deaths";
|
||||
game["gameRep"]["params"][4] = "killDeathRatio";
|
||||
game["gameRep"]["params"][5] = "killsPerMin";
|
||||
game["gameRep"]["params"][6] = "plants";
|
||||
game["gameRep"]["params"][7] = "defuses";
|
||||
game["gameRep"]["params"][8] = "captures";
|
||||
game["gameRep"]["params"][9] = "defends";
|
||||
game["gameRep"]["params"][10] = "totalTimePlayed";
|
||||
game["gameRep"]["params"][11] = "tacticalInsertions";
|
||||
game["gameRep"]["params"][12] = "joinAttempts";
|
||||
game["gameRep"]["params"][13] = "xp";
|
||||
game["gameRep"]["ignoreParams"] = [];
|
||||
game["gameRep"]["ignoreParams"][0] = "totalTimePlayed";
|
||||
game["gameRep"]["gameLimit"] = [];
|
||||
game["gameRep"]["gameLimit"]["default"] = [];
|
||||
game["gameRep"]["gameLimit"]["tdm"] = [];
|
||||
game["gameRep"]["gameLimit"]["dm"] = [];
|
||||
game["gameRep"]["gameLimit"]["dom"] = [];
|
||||
game["gameRep"]["gameLimit"]["hq"] = [];
|
||||
game["gameRep"]["gameLimit"]["sd"] = [];
|
||||
game["gameRep"]["gameLimit"]["dem"] = [];
|
||||
game["gameRep"]["gameLimit"]["ctf"] = [];
|
||||
game["gameRep"]["gameLimit"]["koth"] = [];
|
||||
game["gameRep"]["gameLimit"]["conf"] = [];
|
||||
game["gameRep"]["gameLimit"]["id"]["score"] = threshold_exceeded_score;
|
||||
game["gameRep"]["gameLimit"]["default"]["score"] = 20000;
|
||||
game["gameRep"]["gameLimit"]["id"]["scorePerMin"] = threshold_exceeded_score_per_min;
|
||||
game["gameRep"]["gameLimit"]["default"]["scorePerMin"] = 250;
|
||||
game["gameRep"]["gameLimit"]["dem"]["scorePerMin"] = 1000;
|
||||
game["gameRep"]["gameLimit"]["tdm"]["scorePerMin"] = 700;
|
||||
game["gameRep"]["gameLimit"]["dm"]["scorePerMin"] = 950;
|
||||
game["gameRep"]["gameLimit"]["dom"]["scorePerMin"] = 1000;
|
||||
game["gameRep"]["gameLimit"]["sd"]["scorePerMin"] = 200;
|
||||
game["gameRep"]["gameLimit"]["ctf"]["scorePerMin"] = 600;
|
||||
game["gameRep"]["gameLimit"]["hq"]["scorePerMin"] = 1000;
|
||||
game["gameRep"]["gameLimit"]["koth"]["scorePerMin"] = 1000;
|
||||
game["gameRep"]["gameLimit"]["conf"]["scorePerMin"] = 1000;
|
||||
game["gameRep"]["gameLimit"]["id"]["kills"] = threshold_exceeded_kills;
|
||||
game["gameRep"]["gameLimit"]["default"]["kills"] = 75;
|
||||
game["gameRep"]["gameLimit"]["tdm"]["kills"] = 40;
|
||||
game["gameRep"]["gameLimit"]["sd"]["kills"] = 15;
|
||||
game["gameRep"]["gameLimit"]["dm"]["kills"] = 31;
|
||||
game["gameRep"]["gameLimit"]["id"]["deaths"] = threshold_exceeded_deaths;
|
||||
game["gameRep"]["gameLimit"]["default"]["deaths"] = 50;
|
||||
game["gameRep"]["gameLimit"]["dm"]["deaths"] = 15;
|
||||
game["gameRep"]["gameLimit"]["tdm"]["deaths"] = 40;
|
||||
game["gameRep"]["gameLimit"]["id"]["killDeathRatio"] = threshold_exceeded_kd_ratio;
|
||||
game["gameRep"]["gameLimit"]["default"]["killDeathRatio"] = 30;
|
||||
game["gameRep"]["gameLimit"]["tdm"]["killDeathRatio"] = 50;
|
||||
game["gameRep"]["gameLimit"]["sd"]["killDeathRatio"] = 20;
|
||||
game["gameRep"]["gameLimit"]["id"]["killsPerMin"] = threshold_exceeded_kills_per_min;
|
||||
game["gameRep"]["gameLimit"]["default"]["killsPerMin"] = 15;
|
||||
game["gameRep"]["gameLimit"]["id"]["plants"] = threshold_exceeded_plants;
|
||||
game["gameRep"]["gameLimit"]["default"]["plants"] = 10;
|
||||
game["gameRep"]["gameLimit"]["id"]["defuses"] = threshold_exceeded_defuses;
|
||||
game["gameRep"]["gameLimit"]["default"]["defuses"] = 10;
|
||||
game["gameRep"]["gameLimit"]["id"]["captures"] = threshold_exceeded_captures;
|
||||
game["gameRep"]["gameLimit"]["default"]["captures"] = 30;
|
||||
game["gameRep"]["gameLimit"]["id"]["defends"] = threshold_exceeded_defends;
|
||||
game["gameRep"]["gameLimit"]["default"]["defends"] = 50;
|
||||
game["gameRep"]["gameLimit"]["id"]["totalTimePlayed"] = threshold_exceeded_total_time_played;
|
||||
game["gameRep"]["gameLimit"]["default"]["totalTimePlayed"] = 600;
|
||||
game["gameRep"]["gameLimit"]["dom"]["totalTimePlayed"] = 600;
|
||||
game["gameRep"]["gameLimit"]["dem"]["totalTimePlayed"] = 1140;
|
||||
game["gameRep"]["gameLimit"]["id"]["tacticalInsertions"] = threshold_exceeded_tactical_insertion_use;
|
||||
game["gameRep"]["gameLimit"]["default"]["tacticalInsertions"] = 20;
|
||||
game["gameRep"]["gameLimit"]["id"]["joinAttempts"] = threshold_exceeded_join_attempts;
|
||||
game["gameRep"]["gameLimit"]["default"]["joinAttempts"] = 3;
|
||||
game["gameRep"]["gameLimit"]["id"]["xp"] = threshold_exceeded_xp;
|
||||
game["gameRep"]["gameLimit"]["default"]["xp"] = 25000;
|
||||
game["gameRep"]["gameLimit"]["id"]["splitscreen"] = threshold_exceeded_splitscreen;
|
||||
game["gameRep"]["gameLimit"]["default"]["splitscreen"] = 8;
|
||||
}
|
||||
|
||||
gamerepplayerconnected()
|
||||
{
|
||||
if ( !isgamerepenabled() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
name = self.name;
|
||||
if ( !isgamerepenabled() )
|
||||
return;
|
||||
|
||||
name = self.name;
|
||||
/#
|
||||
|
||||
#/
|
||||
if ( !isDefined( game[ "gameRep" ][ "players" ][ name ] ) )
|
||||
{
|
||||
game[ "gameRep" ][ "players" ][ name ] = [];
|
||||
j = 0;
|
||||
while ( j < game[ "gameRep" ][ "params" ].size )
|
||||
{
|
||||
paramname = game[ "gameRep" ][ "params" ][ j ];
|
||||
game[ "gameRep" ][ "players" ][ name ][ paramname ] = 0;
|
||||
j++;
|
||||
}
|
||||
game[ "gameRep" ][ "players" ][ name ][ "splitscreen" ] = self issplitscreen();
|
||||
game[ "gameRep" ][ "players" ][ name ][ "joinAttempts" ] = 1;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "connected" ] = 1;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "xpStart" ] = self getrankxpstat();
|
||||
game[ "gameRep" ][ "playerNames" ][ game[ "gameRep" ][ "playerCount" ] ] = name;
|
||||
game[ "gameRep" ][ "playerCount" ]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !game[ "gameRep" ][ "players" ][ name ][ "connected" ] )
|
||||
{
|
||||
game[ "gameRep" ][ "players" ][ name ][ "joinAttempts" ]++;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "connected" ] = 1;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "xpStart" ] = self getrankxpstat();
|
||||
}
|
||||
}
|
||||
if ( !isdefined( game["gameRep"]["players"][name] ) )
|
||||
{
|
||||
game["gameRep"]["players"][name] = [];
|
||||
|
||||
for ( j = 0; j < game["gameRep"]["params"].size; j++ )
|
||||
{
|
||||
paramname = game["gameRep"]["params"][j];
|
||||
game["gameRep"]["players"][name][paramname] = 0;
|
||||
}
|
||||
|
||||
game["gameRep"]["players"][name]["splitscreen"] = self issplitscreen();
|
||||
game["gameRep"]["players"][name]["joinAttempts"] = 1;
|
||||
game["gameRep"]["players"][name]["connected"] = 1;
|
||||
game["gameRep"]["players"][name]["xpStart"] = self getrankxpstat();
|
||||
game["gameRep"]["playerNames"][game["gameRep"]["playerCount"]] = name;
|
||||
game["gameRep"]["playerCount"]++;
|
||||
}
|
||||
else if ( !game["gameRep"]["players"][name]["connected"] )
|
||||
{
|
||||
game["gameRep"]["players"][name]["joinAttempts"]++;
|
||||
game["gameRep"]["players"][name]["connected"] = 1;
|
||||
game["gameRep"]["players"][name]["xpStart"] = self getrankxpstat();
|
||||
}
|
||||
}
|
||||
|
||||
gamerepplayerdisconnected()
|
||||
{
|
||||
if ( !isgamerepenabled() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
name = self.name;
|
||||
if ( !isDefined( game[ "gameRep" ][ "players" ][ name ] ) || !isDefined( self.pers[ "summary" ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isgamerepenabled() )
|
||||
return;
|
||||
|
||||
name = self.name;
|
||||
|
||||
if ( !isdefined( game["gameRep"]["players"][name] ) || !isdefined( self.pers["summary"] ) )
|
||||
return;
|
||||
/#
|
||||
|
||||
#/
|
||||
self gamerepupdatenonpersistentplayerinformation();
|
||||
self gamerepupdatepersistentplayerinformation();
|
||||
game[ "gameRep" ][ "players" ][ name ][ "connected" ] = 0;
|
||||
self gamerepupdatenonpersistentplayerinformation();
|
||||
self gamerepupdatepersistentplayerinformation();
|
||||
game["gameRep"]["players"][name]["connected"] = 0;
|
||||
}
|
||||
|
||||
gamerepupdatenonpersistentplayerinformation()
|
||||
{
|
||||
name = self.name;
|
||||
if ( !isDefined( game[ "gameRep" ][ "players" ][ name ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
game[ "gameRep" ][ "players" ][ name ][ "totalTimePlayed" ] += self.timeplayed[ "total" ];
|
||||
if ( isDefined( self.tacticalinsertioncount ) )
|
||||
{
|
||||
game[ "gameRep" ][ "players" ][ name ][ "tacticalInsertions" ] += self.tacticalinsertioncount;
|
||||
}
|
||||
name = self.name;
|
||||
|
||||
if ( !isdefined( game["gameRep"]["players"][name] ) )
|
||||
return;
|
||||
|
||||
game["gameRep"]["players"][name]["totalTimePlayed"] += self.timeplayed["total"];
|
||||
|
||||
if ( isdefined( self.tacticalinsertioncount ) )
|
||||
game["gameRep"]["players"][name]["tacticalInsertions"] += self.tacticalinsertioncount;
|
||||
}
|
||||
|
||||
gamerepupdatepersistentplayerinformation()
|
||||
{
|
||||
name = self.name;
|
||||
if ( !isDefined( game[ "gameRep" ][ "players" ][ name ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( game[ "gameRep" ][ "players" ][ name ][ "totalTimePlayed" ] != 0 )
|
||||
{
|
||||
timeplayed = game[ "gameRep" ][ "players" ][ name ][ "totalTimePlayed" ];
|
||||
}
|
||||
else
|
||||
{
|
||||
timeplayed = 1;
|
||||
}
|
||||
game[ "gameRep" ][ "players" ][ name ][ "score" ] = self.score;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "scorePerMin" ] = int( game[ "gameRep" ][ "players" ][ name ][ "score" ] / ( timeplayed / 60 ) );
|
||||
game[ "gameRep" ][ "players" ][ name ][ "kills" ] = self.kills;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "deaths" ] = self.deaths;
|
||||
if ( game[ "gameRep" ][ "players" ][ name ][ "deaths" ] != 0 )
|
||||
{
|
||||
game[ "gameRep" ][ "players" ][ name ][ "killDeathRatio" ] = int( ( game[ "gameRep" ][ "players" ][ name ][ "kills" ] / game[ "gameRep" ][ "players" ][ name ][ "deaths" ] ) * 100 );
|
||||
}
|
||||
else
|
||||
{
|
||||
game[ "gameRep" ][ "players" ][ name ][ "killDeathRatio" ] = game[ "gameRep" ][ "players" ][ name ][ "kills" ] * 100;
|
||||
}
|
||||
game[ "gameRep" ][ "players" ][ name ][ "killsPerMin" ] = int( game[ "gameRep" ][ "players" ][ name ][ "kills" ] / ( timeplayed / 60 ) );
|
||||
game[ "gameRep" ][ "players" ][ name ][ "plants" ] = self.plants;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "defuses" ] = self.defuses;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "captures" ] = self.captures;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "defends" ] = self.defends;
|
||||
game[ "gameRep" ][ "players" ][ name ][ "xp" ] = self getrankxpstat() - game[ "gameRep" ][ "players" ][ name ][ "xpStart" ];
|
||||
game[ "gameRep" ][ "players" ][ name ][ "xpStart" ] = self getrankxpstat();
|
||||
name = self.name;
|
||||
|
||||
if ( !isdefined( game["gameRep"]["players"][name] ) )
|
||||
return;
|
||||
|
||||
if ( game["gameRep"]["players"][name]["totalTimePlayed"] != 0 )
|
||||
timeplayed = game["gameRep"]["players"][name]["totalTimePlayed"];
|
||||
else
|
||||
timeplayed = 1;
|
||||
|
||||
game["gameRep"]["players"][name]["score"] = self.score;
|
||||
game["gameRep"]["players"][name]["scorePerMin"] = int( game["gameRep"]["players"][name]["score"] / ( timeplayed / 60 ) );
|
||||
game["gameRep"]["players"][name]["kills"] = self.kills;
|
||||
game["gameRep"]["players"][name]["deaths"] = self.deaths;
|
||||
|
||||
if ( game["gameRep"]["players"][name]["deaths"] != 0 )
|
||||
game["gameRep"]["players"][name]["killDeathRatio"] = int( game["gameRep"]["players"][name]["kills"] / game["gameRep"]["players"][name]["deaths"] * 100 );
|
||||
else
|
||||
game["gameRep"]["players"][name]["killDeathRatio"] = game["gameRep"]["players"][name]["kills"] * 100;
|
||||
|
||||
game["gameRep"]["players"][name]["killsPerMin"] = int( game["gameRep"]["players"][name]["kills"] / ( timeplayed / 60 ) );
|
||||
game["gameRep"]["players"][name]["plants"] = self.plants;
|
||||
game["gameRep"]["players"][name]["defuses"] = self.defuses;
|
||||
game["gameRep"]["players"][name]["captures"] = self.captures;
|
||||
game["gameRep"]["players"][name]["defends"] = self.defends;
|
||||
game["gameRep"]["players"][name]["xp"] = self getrankxpstat() - game["gameRep"]["players"][name]["xpStart"];
|
||||
game["gameRep"]["players"][name]["xpStart"] = self getrankxpstat();
|
||||
}
|
||||
|
||||
getparamvalueforplayer( playername, paramname )
|
||||
{
|
||||
if ( isDefined( game[ "gameRep" ][ "players" ][ playername ][ paramname ] ) )
|
||||
{
|
||||
return game[ "gameRep" ][ "players" ][ playername ][ paramname ];
|
||||
}
|
||||
if ( isdefined( game["gameRep"]["players"][playername][paramname] ) )
|
||||
return game["gameRep"]["players"][playername][paramname];
|
||||
/#
|
||||
assertmsg( "Unknown parameter " + paramname + "for individual player" );
|
||||
assertmsg( "Unknown parameter " + paramname + "for individual player" );
|
||||
#/
|
||||
}
|
||||
|
||||
isgamerepparamvalid( paramname )
|
||||
{
|
||||
gametype = level.gametype;
|
||||
if ( !isDefined( game[ "gameRep" ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( game[ "gameRep" ][ "gameLimit" ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( game[ "gameRep" ][ "gameLimit" ][ gametype ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( game[ "gameRep" ][ "gameLimit" ][ gametype ][ paramname ] ) && !isDefined( game[ "gameRep" ][ "gameLimit" ][ "default" ][ paramname ] ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
gametype = level.gametype;
|
||||
|
||||
if ( !isdefined( game["gameRep"] ) )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( game["gameRep"]["gameLimit"] ) )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( game["gameRep"]["gameLimit"][gametype] ) )
|
||||
return false;
|
||||
|
||||
if ( !isdefined( game["gameRep"]["gameLimit"][gametype][paramname] ) && !isdefined( game["gameRep"]["gameLimit"]["default"][paramname] ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
isgamerepparamignoredforreporting( paramname )
|
||||
{
|
||||
if ( isDefined( game[ "gameRep" ][ "ignoreParams" ][ paramname ] ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( isdefined( game["gameRep"]["ignoreParams"][paramname] ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
getgamerepparamlimit( paramname )
|
||||
{
|
||||
gametype = level.gametype;
|
||||
if ( isDefined( game[ "gameRep" ][ "gameLimit" ][ gametype ] ) )
|
||||
{
|
||||
if ( isDefined( game[ "gameRep" ][ "gameLimit" ][ gametype ][ paramname ] ) )
|
||||
{
|
||||
return game[ "gameRep" ][ "gameLimit" ][ gametype ][ paramname ];
|
||||
}
|
||||
}
|
||||
if ( isDefined( game[ "gameRep" ][ "gameLimit" ][ "default" ][ paramname ] ) )
|
||||
{
|
||||
return game[ "gameRep" ][ "gameLimit" ][ "default" ][ paramname ];
|
||||
}
|
||||
gametype = level.gametype;
|
||||
|
||||
if ( isdefined( game["gameRep"]["gameLimit"][gametype] ) )
|
||||
{
|
||||
if ( isdefined( game["gameRep"]["gameLimit"][gametype][paramname] ) )
|
||||
return game["gameRep"]["gameLimit"][gametype][paramname];
|
||||
}
|
||||
|
||||
if ( isdefined( game["gameRep"]["gameLimit"]["default"][paramname] ) )
|
||||
return game["gameRep"]["gameLimit"]["default"][paramname];
|
||||
/#
|
||||
assertmsg( "Default values for parameter " + paramname + " is not defined." );
|
||||
assertmsg( "Default values for parameter " + paramname + " is not defined." );
|
||||
#/
|
||||
}
|
||||
|
||||
setmaximumparamvalueforcurrentgame( paramname, value )
|
||||
{
|
||||
if ( !isDefined( game[ "gameRep" ][ "max" ][ paramname ] ) )
|
||||
{
|
||||
game[ "gameRep" ][ "max" ][ paramname ] = value;
|
||||
return;
|
||||
}
|
||||
if ( game[ "gameRep" ][ "max" ][ paramname ] < value )
|
||||
{
|
||||
game[ "gameRep" ][ "max" ][ paramname ] = value;
|
||||
}
|
||||
if ( !isdefined( game["gameRep"]["max"][paramname] ) )
|
||||
{
|
||||
game["gameRep"]["max"][paramname] = value;
|
||||
return;
|
||||
}
|
||||
|
||||
if ( game["gameRep"]["max"][paramname] < value )
|
||||
game["gameRep"]["max"][paramname] = value;
|
||||
}
|
||||
|
||||
gamerepupdateinformationforround()
|
||||
{
|
||||
if ( !isgamerepenabled() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
player gamerepupdatenonpersistentplayerinformation();
|
||||
i++;
|
||||
}
|
||||
if ( !isgamerepenabled() )
|
||||
return;
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
player gamerepupdatenonpersistentplayerinformation();
|
||||
}
|
||||
}
|
||||
|
||||
gamerepanalyzeandreport()
|
||||
{
|
||||
if ( !isgamerepenabled() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
player = players[ i ];
|
||||
player gamerepupdatepersistentplayerinformation();
|
||||
i++;
|
||||
}
|
||||
splitscreenplayercount = 0;
|
||||
i = 0;
|
||||
while ( i < game[ "gameRep" ][ "playerNames" ].size )
|
||||
{
|
||||
playername = game[ "gameRep" ][ "playerNames" ][ i ];
|
||||
j = 0;
|
||||
while ( j < game[ "gameRep" ][ "params" ].size )
|
||||
{
|
||||
paramname = game[ "gameRep" ][ "params" ][ j ];
|
||||
if ( isgamerepparamvalid( paramname ) )
|
||||
{
|
||||
setmaximumparamvalueforcurrentgame( paramname, getparamvalueforplayer( playername, paramname ) );
|
||||
}
|
||||
j++;
|
||||
}
|
||||
paramname = "splitscreen";
|
||||
splitscreenplayercount += getparamvalueforplayer( playername, paramname );
|
||||
i++;
|
||||
}
|
||||
setmaximumparamvalueforcurrentgame( paramname, splitscreenplayercount );
|
||||
j = 0;
|
||||
while ( j < game[ "gameRep" ][ "params" ].size )
|
||||
{
|
||||
paramname = game[ "gameRep" ][ "params" ][ j ];
|
||||
if ( isgamerepparamvalid( paramname ) && game[ "gameRep" ][ "max" ][ paramname ] >= getgamerepparamlimit( paramname ) )
|
||||
{
|
||||
gamerepprepareandreport( paramname );
|
||||
}
|
||||
j++;
|
||||
}
|
||||
paramname = "splitscreen";
|
||||
if ( game[ "gameRep" ][ "max" ][ paramname ] >= getgamerepparamlimit( paramname ) )
|
||||
{
|
||||
gamerepprepareandreport( paramname );
|
||||
}
|
||||
if ( !isgamerepenabled() )
|
||||
return;
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
player gamerepupdatepersistentplayerinformation();
|
||||
}
|
||||
|
||||
splitscreenplayercount = 0;
|
||||
|
||||
for ( i = 0; i < game["gameRep"]["playerNames"].size; i++ )
|
||||
{
|
||||
playername = game["gameRep"]["playerNames"][i];
|
||||
|
||||
for ( j = 0; j < game["gameRep"]["params"].size; j++ )
|
||||
{
|
||||
paramname = game["gameRep"]["params"][j];
|
||||
|
||||
if ( isgamerepparamvalid( paramname ) )
|
||||
setmaximumparamvalueforcurrentgame( paramname, getparamvalueforplayer( playername, paramname ) );
|
||||
}
|
||||
|
||||
paramname = "splitscreen";
|
||||
splitscreenplayercount += getparamvalueforplayer( playername, paramname );
|
||||
}
|
||||
|
||||
setmaximumparamvalueforcurrentgame( paramname, splitscreenplayercount );
|
||||
|
||||
for ( j = 0; j < game["gameRep"]["params"].size; j++ )
|
||||
{
|
||||
paramname = game["gameRep"]["params"][j];
|
||||
|
||||
if ( isgamerepparamvalid( paramname ) && game["gameRep"]["max"][paramname] >= getgamerepparamlimit( paramname ) )
|
||||
gamerepprepareandreport( paramname );
|
||||
}
|
||||
|
||||
paramname = "splitscreen";
|
||||
|
||||
if ( game["gameRep"]["max"][paramname] >= getgamerepparamlimit( paramname ) )
|
||||
gamerepprepareandreport( paramname );
|
||||
}
|
||||
|
||||
gamerepprepareandreport( paramname )
|
||||
{
|
||||
if ( !isDefined( game[ "gameRep" ][ "gameLimit" ][ "id" ][ paramname ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isgamerepparamignoredforreporting( paramname ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
gamerepthresholdexceeded( game[ "gameRep" ][ "gameLimit" ][ "id" ][ paramname ] );
|
||||
if ( !isdefined( game["gameRep"]["gameLimit"]["id"][paramname] ) )
|
||||
return;
|
||||
|
||||
if ( isgamerepparamignoredforreporting( paramname ) )
|
||||
return;
|
||||
|
||||
gamerepthresholdexceeded( game["gameRep"]["gameLimit"]["id"][paramname] );
|
||||
}
|
||||
|
@ -1,59 +1,53 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
randomstartdelay = randomfloatrange( -20, -15 );
|
||||
global_fx( "barrel_fireFX_origin", "global_barrel_fire", "fire/firelp_barrel_pm", randomstartdelay, "fire_barrel_small" );
|
||||
global_fx( "ch_streetlight_02_FX_origin", "ch_streetlight_02_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_streetlight_01_FX_origin", "me_streetlight_01_FX", "misc/lighthaze_bog_a", randomstartdelay );
|
||||
global_fx( "ch_street_light_01_on", "lamp_glow_FX", "misc/light_glow_white", randomstartdelay );
|
||||
global_fx( "highway_lamp_post", "ch_streetlight_02_FX", "misc/lighthaze_villassault", randomstartdelay );
|
||||
global_fx( "cs_cargoship_spotlight_on_FX_origin", "cs_cargoship_spotlight_on_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_dumpster_fire_FX_origin", "me_dumpster_fire_FX", "fire/firelp_med_pm_nodistort", randomstartdelay, "fire_dumpster_medium" );
|
||||
global_fx( "com_tires_burning01_FX_origin", "com_tires_burning01_FX", "fire/tire_fire_med", randomstartdelay );
|
||||
global_fx( "icbm_powerlinetower_FX_origin", "icbm_powerlinetower_FX", "misc/power_tower_light_red_blink", randomstartdelay );
|
||||
randomstartdelay = randomfloatrange( -20, -15 );
|
||||
global_fx( "barrel_fireFX_origin", "global_barrel_fire", "fire/firelp_barrel_pm", randomstartdelay, "fire_barrel_small" );
|
||||
global_fx( "ch_streetlight_02_FX_origin", "ch_streetlight_02_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_streetlight_01_FX_origin", "me_streetlight_01_FX", "misc/lighthaze_bog_a", randomstartdelay );
|
||||
global_fx( "ch_street_light_01_on", "lamp_glow_FX", "misc/light_glow_white", randomstartdelay );
|
||||
global_fx( "highway_lamp_post", "ch_streetlight_02_FX", "misc/lighthaze_villassault", randomstartdelay );
|
||||
global_fx( "cs_cargoship_spotlight_on_FX_origin", "cs_cargoship_spotlight_on_FX", "misc/lighthaze", randomstartdelay );
|
||||
global_fx( "me_dumpster_fire_FX_origin", "me_dumpster_fire_FX", "fire/firelp_med_pm_nodistort", randomstartdelay, "fire_dumpster_medium" );
|
||||
global_fx( "com_tires_burning01_FX_origin", "com_tires_burning01_FX", "fire/tire_fire_med", randomstartdelay );
|
||||
global_fx( "icbm_powerlinetower_FX_origin", "icbm_powerlinetower_FX", "misc/power_tower_light_red_blink", randomstartdelay );
|
||||
}
|
||||
|
||||
global_fx( targetname, fxname, fxfile, delay, soundalias ) //checked changed to match cerberus output
|
||||
global_fx( targetname, fxname, fxfile, delay, soundalias )
|
||||
{
|
||||
ents = getstructarray( targetname, "targetname" );
|
||||
if ( !isDefined( ents ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( ents.size <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
for ( i = 0; i < ents.size; i++ )
|
||||
{
|
||||
ents[ i ] global_fx_create( fxname, fxfile, delay, soundalias );
|
||||
}
|
||||
ents = getstructarray( targetname, "targetname" );
|
||||
|
||||
if ( !isdefined( ents ) )
|
||||
return;
|
||||
|
||||
if ( ents.size <= 0 )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < ents.size; i++ )
|
||||
ents[i] global_fx_create( fxname, fxfile, delay, soundalias );
|
||||
}
|
||||
|
||||
global_fx_create( fxname, fxfile, delay, soundalias ) //checked matches cerberus output
|
||||
global_fx_create( fxname, fxfile, delay, soundalias )
|
||||
{
|
||||
if ( !isDefined( level._effect ) )
|
||||
{
|
||||
level._effect = [];
|
||||
}
|
||||
if ( !isDefined( level._effect[ fxname ] ) )
|
||||
{
|
||||
level._effect[ fxname ] = loadfx( fxfile );
|
||||
}
|
||||
if ( !isDefined( self.angles ) )
|
||||
{
|
||||
self.angles = ( 0, 0, 0 );
|
||||
}
|
||||
ent = createoneshoteffect( fxname );
|
||||
ent.v[ "origin" ] = self.origin;
|
||||
ent.v[ "angles" ] = self.angles;
|
||||
ent.v[ "fxid" ] = fxname;
|
||||
ent.v[ "delay" ] = delay;
|
||||
if ( isDefined( soundalias ) )
|
||||
{
|
||||
ent.v[ "soundalias" ] = soundalias;
|
||||
}
|
||||
if ( !isdefined( level._effect ) )
|
||||
level._effect = [];
|
||||
|
||||
if ( !isdefined( level._effect[fxname] ) )
|
||||
level._effect[fxname] = loadfx( fxfile );
|
||||
|
||||
if ( !isdefined( self.angles ) )
|
||||
self.angles = ( 0, 0, 0 );
|
||||
|
||||
ent = createoneshoteffect( fxname );
|
||||
ent.v["origin"] = self.origin;
|
||||
ent.v["angles"] = self.angles;
|
||||
ent.v["fxid"] = fxname;
|
||||
ent.v["delay"] = delay;
|
||||
|
||||
if ( isdefined( soundalias ) )
|
||||
ent.v["soundalias"] = soundalias;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,407 +1,387 @@
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init()
|
||||
{
|
||||
level.barrelexplodingthisframe = 0;
|
||||
qbarrels = 0;
|
||||
all_barrels = [];
|
||||
barrels = getentarray( "explodable_barrel", "targetname" );
|
||||
while ( isDefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
i = 0;
|
||||
while ( i < barrels.size )
|
||||
{
|
||||
all_barrels[ all_barrels.size ] = barrels[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
barrels = getentarray( "explodable_barrel", "script_noteworthy" );
|
||||
while ( isDefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
i = 0;
|
||||
while ( i < barrels.size )
|
||||
{
|
||||
all_barrels[ all_barrels.size ] = barrels[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( qbarrels )
|
||||
{
|
||||
precachemodel( "global_explosive_barrel" );
|
||||
level.barrelburn = 100;
|
||||
level.barrelhealth = 250;
|
||||
level.barrelingsound = "exp_redbarrel_ignition";
|
||||
level.barrelexpsound = "exp_redbarrel";
|
||||
level.breakables_fx[ "barrel" ][ "burn_start" ] = loadfx( "destructibles/fx_barrel_ignite" );
|
||||
level.breakables_fx[ "barrel" ][ "burn" ] = loadfx( "destructibles/fx_barrel_fire_top" );
|
||||
level.breakables_fx[ "barrel" ][ "explode" ] = loadfx( "destructibles/fx_dest_barrelexp" );
|
||||
array_thread( all_barrels, ::explodable_barrel_think );
|
||||
}
|
||||
qcrates = 0;
|
||||
all_crates = [];
|
||||
crates = getentarray( "flammable_crate", "targetname" );
|
||||
while ( isDefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
i = 0;
|
||||
while ( i < crates.size )
|
||||
{
|
||||
all_crates[ all_crates.size ] = crates[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
crates = getentarray( "flammable_crate", "script_noteworthy" );
|
||||
while ( isDefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
i = 0;
|
||||
while ( i < crates.size )
|
||||
{
|
||||
all_crates[ all_crates.size ] = crates[ i ];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( qcrates )
|
||||
{
|
||||
precachemodel( "global_flammable_crate_jap_piece01_d" );
|
||||
level.crateburn = 100;
|
||||
level.cratehealth = 200;
|
||||
level.breakables_fx[ "ammo_crate" ][ "burn_start" ] = loadfx( "destructibles/fx_ammobox_ignite" );
|
||||
level.breakables_fx[ "ammo_crate" ][ "burn" ] = loadfx( "destructibles/fx_ammobox_fire_top" );
|
||||
level.breakables_fx[ "ammo_crate" ][ "explode" ] = loadfx( "destructibles/fx_ammoboxExp" );
|
||||
level.crateignsound = "Ignition_ammocrate";
|
||||
level.crateexpsound = "Explo_ammocrate";
|
||||
array_thread( all_crates, ::flammable_crate_think );
|
||||
}
|
||||
if ( !qbarrels && !qcrates )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.barrelexplodingthisframe = 0;
|
||||
qbarrels = 0;
|
||||
all_barrels = [];
|
||||
barrels = getentarray( "explodable_barrel", "targetname" );
|
||||
|
||||
if ( isdefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
|
||||
for ( i = 0; i < barrels.size; i++ )
|
||||
all_barrels[all_barrels.size] = barrels[i];
|
||||
}
|
||||
|
||||
barrels = getentarray( "explodable_barrel", "script_noteworthy" );
|
||||
|
||||
if ( isdefined( barrels ) && barrels.size > 0 )
|
||||
{
|
||||
qbarrels = 1;
|
||||
|
||||
for ( i = 0; i < barrels.size; i++ )
|
||||
all_barrels[all_barrels.size] = barrels[i];
|
||||
}
|
||||
|
||||
if ( qbarrels )
|
||||
{
|
||||
precachemodel( "global_explosive_barrel" );
|
||||
level.barrelburn = 100;
|
||||
level.barrelhealth = 250;
|
||||
level.barrelingsound = "exp_redbarrel_ignition";
|
||||
level.barrelexpsound = "exp_redbarrel";
|
||||
level.breakables_fx["barrel"]["burn_start"] = loadfx( "destructibles/fx_barrel_ignite" );
|
||||
level.breakables_fx["barrel"]["burn"] = loadfx( "destructibles/fx_barrel_fire_top" );
|
||||
level.breakables_fx["barrel"]["explode"] = loadfx( "destructibles/fx_dest_barrelexp" );
|
||||
array_thread( all_barrels, ::explodable_barrel_think );
|
||||
}
|
||||
|
||||
qcrates = 0;
|
||||
all_crates = [];
|
||||
crates = getentarray( "flammable_crate", "targetname" );
|
||||
|
||||
if ( isdefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
|
||||
for ( i = 0; i < crates.size; i++ )
|
||||
all_crates[all_crates.size] = crates[i];
|
||||
}
|
||||
|
||||
crates = getentarray( "flammable_crate", "script_noteworthy" );
|
||||
|
||||
if ( isdefined( crates ) && crates.size > 0 )
|
||||
{
|
||||
qcrates = 1;
|
||||
|
||||
for ( i = 0; i < crates.size; i++ )
|
||||
all_crates[all_crates.size] = crates[i];
|
||||
}
|
||||
|
||||
if ( qcrates )
|
||||
{
|
||||
precachemodel( "global_flammable_crate_jap_piece01_d" );
|
||||
level.crateburn = 100;
|
||||
level.cratehealth = 200;
|
||||
level.breakables_fx["ammo_crate"]["burn_start"] = loadfx( "destructibles/fx_ammobox_ignite" );
|
||||
level.breakables_fx["ammo_crate"]["burn"] = loadfx( "destructibles/fx_ammobox_fire_top" );
|
||||
level.breakables_fx["ammo_crate"]["explode"] = loadfx( "destructibles/fx_ammoboxExp" );
|
||||
level.crateignsound = "Ignition_ammocrate";
|
||||
level.crateexpsound = "Explo_ammocrate";
|
||||
array_thread( all_crates, ::flammable_crate_think );
|
||||
}
|
||||
|
||||
if ( !qbarrels && !qcrates )
|
||||
return;
|
||||
}
|
||||
|
||||
explodable_barrel_think()
|
||||
{
|
||||
if ( self.classname != "script_model" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.barrelhealth;
|
||||
self setcandamage( 1 );
|
||||
self.targetname = "explodable_barrel";
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
{
|
||||
self.removeexplodable = 1;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
if ( self.classname != "script_model" )
|
||||
return;
|
||||
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.barrelhealth;
|
||||
self setcandamage( 1 );
|
||||
self.targetname = "explodable_barrel";
|
||||
|
||||
if ( sessionmodeiszombiesgame() )
|
||||
self.removeexplodable = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
/#
|
||||
println( "BARRELDAMAGE: " + type );
|
||||
println( "BARRELDAMAGE: " + type );
|
||||
#/
|
||||
if ( type == "MOD_MELEE" || type == "MOD_IMPACT" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
{
|
||||
self.damageowner = self;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damageowner = attacker;
|
||||
}
|
||||
self.health -= amount;
|
||||
if ( self.health <= level.barrelburn )
|
||||
{
|
||||
self thread explodable_barrel_burn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( type == "MOD_MELEE" || type == "MOD_IMPACT" )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
self.damageowner = self;
|
||||
else
|
||||
self.damageowner = attacker;
|
||||
|
||||
self.health -= amount;
|
||||
|
||||
if ( self.health <= level.barrelburn )
|
||||
self thread explodable_barrel_burn();
|
||||
}
|
||||
}
|
||||
|
||||
explodable_barrel_burn()
|
||||
{
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 1 );
|
||||
offset2 = up * vectorScale( ( 0, 0, 1 ), 44 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
offset1 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) - vectorScale( ( 0, 0, 1 ), 30 );
|
||||
offset2 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) + vectorScale( ( 0, 0, 1 ), 14 );
|
||||
}
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx[ "barrel" ][ "burn_start" ], self.origin + offset1 );
|
||||
level thread play_sound_in_space( level.barrelingsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
if ( count > 20 )
|
||||
{
|
||||
count = 0;
|
||||
}
|
||||
playfx( level.breakables_fx[ "barrel" ][ "burn" ], self.origin + offset2 );
|
||||
self playloopsound( "barrel_fuse" );
|
||||
if ( count == 0 )
|
||||
{
|
||||
self.health -= 10 + randomint( 10 );
|
||||
}
|
||||
count++;
|
||||
wait 0,05;
|
||||
}
|
||||
level notify( "explosion_started" );
|
||||
self thread explodable_barrel_explode();
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 44.0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
offset1 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) - vectorscale( ( 0, 0, 1 ), 30.0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) + vectorscale( ( 0, 0, 1 ), 14.0 );
|
||||
}
|
||||
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx["barrel"]["burn_start"], self.origin + offset1 );
|
||||
level thread play_sound_in_space( level.barrelingsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
|
||||
if ( count > 20 )
|
||||
count = 0;
|
||||
|
||||
playfx( level.breakables_fx["barrel"]["burn"], self.origin + offset2 );
|
||||
self playloopsound( "barrel_fuse" );
|
||||
|
||||
if ( count == 0 )
|
||||
self.health -= 10 + randomint( 10 );
|
||||
|
||||
count++;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
level notify( "explosion_started" );
|
||||
self thread explodable_barrel_explode();
|
||||
}
|
||||
|
||||
explodable_barrel_explode()
|
||||
{
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 1 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
end = trace[ "position" ];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
offset += vectorScale( ( 0, 0, 1 ), 4 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.barrelexpsound, self.origin );
|
||||
playfx( level.breakables_fx[ "barrel" ][ "explode" ], self.origin + offset );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
if ( isDefined( self.remove ) )
|
||||
{
|
||||
self.remove delete();
|
||||
}
|
||||
if ( isDefined( self.radius ) )
|
||||
{
|
||||
blastradius = self.radius;
|
||||
}
|
||||
self radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 56 ), blastradius, maxdamage, mindamage, self.damageowner );
|
||||
attacker = undefined;
|
||||
if ( isDefined( self.damageowner ) )
|
||||
{
|
||||
attacker = self.damageowner;
|
||||
}
|
||||
level.lastexplodingbarrel[ "time" ] = getTime();
|
||||
level.lastexplodingbarrel[ "origin" ] = self.origin + vectorScale( ( 0, 0, 1 ), 30 );
|
||||
if ( isDefined( self.removeexplodable ) )
|
||||
{
|
||||
self hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
self setmodel( "global_explosive_barrel" );
|
||||
}
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
pos = trace[ "position" ];
|
||||
self.origin = pos;
|
||||
self.angles += vectorScale( ( 0, 0, 1 ), 90 );
|
||||
}
|
||||
wait 0,05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
end = trace["position"];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
|
||||
offset += vectorscale( ( 0, 0, 1 ), 4.0 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.barrelexpsound, self.origin );
|
||||
playfx( level.breakables_fx["barrel"]["explode"], self.origin + offset );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
|
||||
if ( isdefined( self.remove ) )
|
||||
self.remove delete();
|
||||
|
||||
if ( isdefined( self.radius ) )
|
||||
blastradius = self.radius;
|
||||
|
||||
self radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 56.0 ), blastradius, maxdamage, mindamage, self.damageowner );
|
||||
attacker = undefined;
|
||||
|
||||
if ( isdefined( self.damageowner ) )
|
||||
attacker = self.damageowner;
|
||||
|
||||
level.lastexplodingbarrel["time"] = gettime();
|
||||
level.lastexplodingbarrel["origin"] = self.origin + vectorscale( ( 0, 0, 1 ), 30.0 );
|
||||
|
||||
if ( isdefined( self.removeexplodable ) )
|
||||
self hide();
|
||||
else
|
||||
self setmodel( "global_explosive_barrel" );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
pos = trace["position"];
|
||||
self.origin = pos;
|
||||
self.angles += vectorscale( ( 0, 0, 1 ), 90.0 );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
}
|
||||
|
||||
flammable_crate_think()
|
||||
{
|
||||
if ( self.classname != "script_model" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.cratehealth;
|
||||
self setcandamage( 1 );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
if ( isDefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
{
|
||||
self.damageowner = self;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damageowner = attacker;
|
||||
}
|
||||
if ( level.barrelexplodingthisframe )
|
||||
{
|
||||
wait randomfloat( 1 );
|
||||
}
|
||||
self.health -= amount;
|
||||
if ( self.health <= level.crateburn )
|
||||
{
|
||||
self thread flammable_crate_burn();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( self.classname != "script_model" )
|
||||
return;
|
||||
|
||||
self endon( "exploding" );
|
||||
self breakable_clip();
|
||||
self.health = level.cratehealth;
|
||||
self setcandamage( 1 );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "damage", amount, attacker, direction_vec, p, type );
|
||||
|
||||
if ( isdefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( self.script_selfisattacker ) && self.script_selfisattacker )
|
||||
self.damageowner = self;
|
||||
else
|
||||
self.damageowner = attacker;
|
||||
|
||||
if ( level.barrelexplodingthisframe )
|
||||
wait( randomfloat( 1 ) );
|
||||
|
||||
self.health -= amount;
|
||||
|
||||
if ( self.health <= level.crateburn )
|
||||
self thread flammable_crate_burn();
|
||||
}
|
||||
}
|
||||
|
||||
flammable_crate_burn()
|
||||
{
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 1 );
|
||||
offset2 = up * vectorScale( ( 0, 0, 1 ), 44 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
offset1 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) - vectorScale( ( 0, 0, 1 ), 30 );
|
||||
offset2 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) + vectorScale( ( 0, 0, 1 ), 14 );
|
||||
}
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx[ "ammo_crate" ][ "burn_start" ], self.origin );
|
||||
level thread play_sound_in_space( level.crateignsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
if ( count > 20 )
|
||||
{
|
||||
count = 0;
|
||||
}
|
||||
playfx( level.breakables_fx[ "ammo_crate" ][ "burn" ], self.origin );
|
||||
if ( count == 0 )
|
||||
{
|
||||
self.health -= 10 + randomint( 10 );
|
||||
}
|
||||
count++;
|
||||
wait 0,05;
|
||||
}
|
||||
self thread flammable_crate_explode();
|
||||
count = 0;
|
||||
startedfx = 0;
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset1 = ( 0, 0, 0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 44.0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
offset1 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) - vectorscale( ( 0, 0, 1 ), 30.0 );
|
||||
offset2 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) + vectorscale( ( 0, 0, 1 ), 14.0 );
|
||||
}
|
||||
|
||||
while ( self.health > 0 )
|
||||
{
|
||||
if ( !startedfx )
|
||||
{
|
||||
playfx( level.breakables_fx["ammo_crate"]["burn_start"], self.origin );
|
||||
level thread play_sound_in_space( level.crateignsound, self.origin );
|
||||
startedfx = 1;
|
||||
}
|
||||
|
||||
if ( count > 20 )
|
||||
count = 0;
|
||||
|
||||
playfx( level.breakables_fx["ammo_crate"]["burn"], self.origin );
|
||||
|
||||
if ( count == 0 )
|
||||
self.health -= 10 + randomint( 10 );
|
||||
|
||||
count++;
|
||||
wait 0.05;
|
||||
}
|
||||
|
||||
self thread flammable_crate_explode();
|
||||
}
|
||||
|
||||
flammable_crate_explode()
|
||||
{
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 1 );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
end = trace[ "position" ];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
offset += vectorScale( ( 0, 0, 1 ), 4 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.crateexpsound, self.origin );
|
||||
playfx( level.breakables_fx[ "ammo_crate" ][ "explode" ], self.origin );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
if ( isDefined( self.remove ) )
|
||||
{
|
||||
self.remove delete();
|
||||
}
|
||||
if ( isDefined( self.radius ) )
|
||||
{
|
||||
blastradius = self.radius;
|
||||
}
|
||||
attacker = undefined;
|
||||
if ( isDefined( self.damageowner ) )
|
||||
{
|
||||
attacker = self.damageowner;
|
||||
}
|
||||
self radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 30 ), blastradius, maxdamage, mindamage, attacker );
|
||||
self setmodel( "global_flammable_crate_jap_piece01_d" );
|
||||
if ( dot < 0,5 )
|
||||
{
|
||||
start = self.origin + vectorScale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) );
|
||||
pos = trace[ "position" ];
|
||||
self.origin = pos;
|
||||
self.angles += vectorScale( ( 0, 0, 1 ), 90 );
|
||||
}
|
||||
wait 0,05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
self notify( "exploding" );
|
||||
self death_notify_wrapper();
|
||||
up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) );
|
||||
dot = vectordot( up, worldup );
|
||||
offset = ( 0, 0, 0 );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
end = trace["position"];
|
||||
offset = end - self.origin;
|
||||
}
|
||||
|
||||
offset += vectorscale( ( 0, 0, 1 ), 4.0 );
|
||||
mindamage = 1;
|
||||
maxdamage = 250;
|
||||
blastradius = 250;
|
||||
level thread play_sound_in_space( level.crateexpsound, self.origin );
|
||||
playfx( level.breakables_fx["ammo_crate"]["explode"], self.origin );
|
||||
physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage );
|
||||
level.barrelexplodingthisframe = 1;
|
||||
|
||||
if ( isdefined( self.remove ) )
|
||||
self.remove delete();
|
||||
|
||||
if ( isdefined( self.radius ) )
|
||||
blastradius = self.radius;
|
||||
|
||||
attacker = undefined;
|
||||
|
||||
if ( isdefined( self.damageowner ) )
|
||||
attacker = self.damageowner;
|
||||
|
||||
self radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), blastradius, maxdamage, mindamage, attacker );
|
||||
self setmodel( "global_flammable_crate_jap_piece01_d" );
|
||||
|
||||
if ( dot < 0.5 )
|
||||
{
|
||||
start = self.origin + vectorscale( up, 22 );
|
||||
trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) );
|
||||
pos = trace["position"];
|
||||
self.origin = pos;
|
||||
self.angles += vectorscale( ( 0, 0, 1 ), 90.0 );
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
level.barrelexplodingthisframe = 0;
|
||||
}
|
||||
|
||||
breakable_clip()
|
||||
{
|
||||
if ( isDefined( self.target ) )
|
||||
{
|
||||
targ = getent( self.target, "targetname" );
|
||||
if ( targ.classname == "script_brushmodel" )
|
||||
{
|
||||
self.remove = targ;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.breakables_clip ) && level.breakables_clip.size > 0 )
|
||||
{
|
||||
self.remove = getclosestent( self.origin, level.breakables_clip );
|
||||
}
|
||||
if ( isDefined( self.remove ) )
|
||||
{
|
||||
arrayremovevalue( level.breakables_clip, self.remove );
|
||||
}
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
targ = getent( self.target, "targetname" );
|
||||
|
||||
if ( targ.classname == "script_brushmodel" )
|
||||
{
|
||||
self.remove = targ;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( level.breakables_clip ) && level.breakables_clip.size > 0 )
|
||||
self.remove = getclosestent( self.origin, level.breakables_clip );
|
||||
|
||||
if ( isdefined( self.remove ) )
|
||||
arrayremovevalue( level.breakables_clip, self.remove );
|
||||
}
|
||||
|
||||
getclosestent( org, array )
|
||||
{
|
||||
if ( array.size < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
dist = 256;
|
||||
ent = undefined;
|
||||
i = 0;
|
||||
while ( i < array.size )
|
||||
{
|
||||
newdist = distance( array[ i ] getorigin(), org );
|
||||
if ( newdist >= dist )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
dist = newdist;
|
||||
ent = array[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return ent;
|
||||
if ( array.size < 1 )
|
||||
return;
|
||||
|
||||
dist = 256;
|
||||
ent = undefined;
|
||||
|
||||
for ( i = 0; i < array.size; i++ )
|
||||
{
|
||||
newdist = distance( array[i] getorigin(), org );
|
||||
|
||||
if ( newdist >= dist )
|
||||
continue;
|
||||
|
||||
dist = newdist;
|
||||
ent = array[i];
|
||||
}
|
||||
|
||||
return ent;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,42 +1,44 @@
|
||||
//checked includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_scoreevents;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.medalinfo = [];
|
||||
level.medalcallbacks = [];
|
||||
level.numkills = 0;
|
||||
level thread onplayerconnect();
|
||||
level.medalinfo = [];
|
||||
level.medalcallbacks = [];
|
||||
level.numkills = 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player.lastkilledby = undefined;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
|
||||
player.lastkilledby = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
setlastkilledby( attacker ) //checked matches cerberus output
|
||||
setlastkilledby( attacker )
|
||||
{
|
||||
self.lastkilledby = attacker;
|
||||
self.lastkilledby = attacker;
|
||||
}
|
||||
|
||||
offenseglobalcount() //checked matches cerberus output
|
||||
offenseglobalcount()
|
||||
{
|
||||
level.globalteammedals++;
|
||||
level.globalteammedals++;
|
||||
}
|
||||
|
||||
defenseglobalcount() //checked matches cerberus output
|
||||
defenseglobalcount()
|
||||
{
|
||||
level.globalteammedals++;
|
||||
level.globalteammedals++;
|
||||
}
|
||||
|
||||
codecallback_medal( medalindex ) //checked matches cerberus output
|
||||
codecallback_medal( medalindex )
|
||||
{
|
||||
self luinotifyevent( &"medal_received", 1, medalindex );
|
||||
self luinotifyeventtospectators( &"medal_received", 1, medalindex );
|
||||
self luinotifyevent( &"medal_received", 1, medalindex );
|
||||
self luinotifyeventtospectators( &"medal_received", 1, medalindex );
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,306 +1,277 @@
|
||||
//checked includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
main() //checked changed to match cerberus output dvar taken from beta dump
|
||||
main()
|
||||
{
|
||||
if ( getDvar( "mg42" ) == "" )
|
||||
{
|
||||
setdvar( "mgTurret", "off" );
|
||||
}
|
||||
level.magic_distance = 24;
|
||||
turretinfos = getentarray( "turretInfo", "targetname" );
|
||||
for ( index = 0; index < turretinfos.size; index++ )
|
||||
{
|
||||
turretinfos[ index ] delete();
|
||||
}
|
||||
if ( getdvar( _hash_7C9A91DF ) == "" )
|
||||
setdvar( "mgTurret", "off" );
|
||||
|
||||
level.magic_distance = 24;
|
||||
turretinfos = getentarray( "turretInfo", "targetname" );
|
||||
|
||||
for ( index = 0; index < turretinfos.size; index++ )
|
||||
turretinfos[index] delete();
|
||||
}
|
||||
|
||||
set_difficulty( difficulty ) //checked changed to match cerberus output
|
||||
set_difficulty( difficulty )
|
||||
{
|
||||
init_turret_difficulty_settings();
|
||||
turrets = getentarray( "misc_turret", "classname" );
|
||||
for ( index = 0; index < turrets.size; index++ )
|
||||
{
|
||||
if ( isDefined( turrets[ index ].script_skilloverride ) )
|
||||
{
|
||||
switch( turrets[ index ].script_skilloverride )
|
||||
{
|
||||
case "easy":
|
||||
difficulty = "easy";
|
||||
break;
|
||||
break;
|
||||
case "medium":
|
||||
difficulty = "medium";
|
||||
break;
|
||||
break;
|
||||
case "hard":
|
||||
difficulty = "hard";
|
||||
break;
|
||||
break;
|
||||
case "fu":
|
||||
difficulty = "fu";
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
turret_set_difficulty( turrets[ index ], difficulty );
|
||||
}
|
||||
}
|
||||
init_turret_difficulty_settings();
|
||||
turrets = getentarray( "misc_turret", "classname" );
|
||||
|
||||
for ( index = 0; index < turrets.size; index++ )
|
||||
{
|
||||
if ( isdefined( turrets[index].script_skilloverride ) )
|
||||
{
|
||||
switch ( turrets[index].script_skilloverride )
|
||||
{
|
||||
case "easy":
|
||||
difficulty = "easy";
|
||||
break;
|
||||
case "medium":
|
||||
difficulty = "medium";
|
||||
break;
|
||||
case "hard":
|
||||
difficulty = "hard";
|
||||
break;
|
||||
case "fu":
|
||||
difficulty = "fu";
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
turret_set_difficulty( turrets[index], difficulty );
|
||||
}
|
||||
}
|
||||
|
||||
init_turret_difficulty_settings() //checked matches cerberus output
|
||||
init_turret_difficulty_settings()
|
||||
{
|
||||
level.mgturretsettings[ "easy" ][ "convergenceTime" ] = 2.5;
|
||||
level.mgturretsettings[ "easy" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "easy" ][ "accuracy" ] = 0.38;
|
||||
level.mgturretsettings[ "easy" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "easy" ][ "playerSpread" ] = 0.5;
|
||||
level.mgturretsettings[ "medium" ][ "convergenceTime" ] = 1.5;
|
||||
level.mgturretsettings[ "medium" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "medium" ][ "accuracy" ] = 0.38;
|
||||
level.mgturretsettings[ "medium" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "medium" ][ "playerSpread" ] = 0.5;
|
||||
level.mgturretsettings[ "hard" ][ "convergenceTime" ] = 0.8;
|
||||
level.mgturretsettings[ "hard" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "hard" ][ "accuracy" ] = 0.38;
|
||||
level.mgturretsettings[ "hard" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "hard" ][ "playerSpread" ] = 0.5;
|
||||
level.mgturretsettings[ "fu" ][ "convergenceTime" ] = 0.4;
|
||||
level.mgturretsettings[ "fu" ][ "suppressionTime" ] = 3;
|
||||
level.mgturretsettings[ "fu" ][ "accuracy" ] = 0.38;
|
||||
level.mgturretsettings[ "fu" ][ "aiSpread" ] = 2;
|
||||
level.mgturretsettings[ "fu" ][ "playerSpread" ] = 0.5;
|
||||
level.mgturretsettings["easy"]["convergenceTime"] = 2.5;
|
||||
level.mgturretsettings["easy"]["suppressionTime"] = 3.0;
|
||||
level.mgturretsettings["easy"]["accuracy"] = 0.38;
|
||||
level.mgturretsettings["easy"]["aiSpread"] = 2;
|
||||
level.mgturretsettings["easy"]["playerSpread"] = 0.5;
|
||||
level.mgturretsettings["medium"]["convergenceTime"] = 1.5;
|
||||
level.mgturretsettings["medium"]["suppressionTime"] = 3.0;
|
||||
level.mgturretsettings["medium"]["accuracy"] = 0.38;
|
||||
level.mgturretsettings["medium"]["aiSpread"] = 2;
|
||||
level.mgturretsettings["medium"]["playerSpread"] = 0.5;
|
||||
level.mgturretsettings["hard"]["convergenceTime"] = 0.8;
|
||||
level.mgturretsettings["hard"]["suppressionTime"] = 3.0;
|
||||
level.mgturretsettings["hard"]["accuracy"] = 0.38;
|
||||
level.mgturretsettings["hard"]["aiSpread"] = 2;
|
||||
level.mgturretsettings["hard"]["playerSpread"] = 0.5;
|
||||
level.mgturretsettings["fu"]["convergenceTime"] = 0.4;
|
||||
level.mgturretsettings["fu"]["suppressionTime"] = 3.0;
|
||||
level.mgturretsettings["fu"]["accuracy"] = 0.38;
|
||||
level.mgturretsettings["fu"]["aiSpread"] = 2;
|
||||
level.mgturretsettings["fu"]["playerSpread"] = 0.5;
|
||||
}
|
||||
|
||||
turret_set_difficulty( turret, difficulty ) //checked matches cerberus output
|
||||
turret_set_difficulty( turret, difficulty )
|
||||
{
|
||||
turret.convergencetime = level.mgturretsettings[ difficulty ][ "convergenceTime" ];
|
||||
turret.suppressiontime = level.mgturretsettings[ difficulty ][ "suppressionTime" ];
|
||||
turret.accuracy = level.mgturretsettings[ difficulty ][ "accuracy" ];
|
||||
turret.aispread = level.mgturretsettings[ difficulty ][ "aiSpread" ];
|
||||
turret.playerspread = level.mgturretsettings[ difficulty ][ "playerSpread" ];
|
||||
turret.convergencetime = level.mgturretsettings[difficulty]["convergenceTime"];
|
||||
turret.suppressiontime = level.mgturretsettings[difficulty]["suppressionTime"];
|
||||
turret.accuracy = level.mgturretsettings[difficulty]["accuracy"];
|
||||
turret.aispread = level.mgturretsettings[difficulty]["aiSpread"];
|
||||
turret.playerspread = level.mgturretsettings[difficulty]["playerSpread"];
|
||||
}
|
||||
|
||||
turret_suppression_fire( targets ) //checked matches beta dump
|
||||
turret_suppression_fire( targets )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_suppression_fire" );
|
||||
if ( !isDefined( self.suppresionfire ) )
|
||||
{
|
||||
self.suppresionfire = 1;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
while ( self.suppresionfire )
|
||||
{
|
||||
self settargetentity( targets[ randomint( targets.size ) ] );
|
||||
wait ( 2 + randomfloat( 2 ) );
|
||||
}
|
||||
self cleartargetentity();
|
||||
while ( !self.suppresionfire )
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "stop_suppression_fire" );
|
||||
|
||||
if ( !isdefined( self.suppresionfire ) )
|
||||
self.suppresionfire = 1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while ( self.suppresionfire )
|
||||
{
|
||||
self settargetentity( targets[randomint( targets.size )] );
|
||||
wait( 2 + randomfloat( 2 ) );
|
||||
}
|
||||
|
||||
self cleartargetentity();
|
||||
|
||||
while ( !self.suppresionfire )
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
burst_fire_settings( setting ) //checked changed to match cerberus output
|
||||
burst_fire_settings( setting )
|
||||
{
|
||||
if ( setting == "delay" )
|
||||
{
|
||||
return 0.2;
|
||||
}
|
||||
else if ( setting == "delay_range" )
|
||||
{
|
||||
return 0.5;
|
||||
}
|
||||
else if ( setting == "burst" )
|
||||
{
|
||||
return 0.5;
|
||||
}
|
||||
else if ( setting == "burst_range" )
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
if ( setting == "delay" )
|
||||
return 0.2;
|
||||
else if ( setting == "delay_range" )
|
||||
return 0.5;
|
||||
else if ( setting == "burst" )
|
||||
return 0.5;
|
||||
else if ( setting == "burst_range" )
|
||||
return 4;
|
||||
}
|
||||
|
||||
burst_fire( turret, manual_target ) //checked matches cerberus output
|
||||
burst_fire( turret, manual_target )
|
||||
{
|
||||
turret endon( "death" );
|
||||
turret endon( "stopfiring" );
|
||||
self endon( "stop_using_built_in_burst_fire" );
|
||||
if ( isDefined( turret.script_delay_min ) )
|
||||
{
|
||||
turret_delay = turret.script_delay_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay = burst_fire_settings( "delay" );
|
||||
}
|
||||
if ( isDefined( turret.script_delay_max ) )
|
||||
{
|
||||
turret_delay_range = turret.script_delay_max - turret_delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay_range = burst_fire_settings( "delay_range" );
|
||||
}
|
||||
if ( isDefined( turret.script_burst_min ) )
|
||||
{
|
||||
turret_burst = turret.script_burst_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst = burst_fire_settings( "burst" );
|
||||
}
|
||||
if ( isDefined( turret.script_burst_max ) )
|
||||
{
|
||||
turret_burst_range = turret.script_burst_max - turret_burst;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst_range = burst_fire_settings( "burst_range" );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
turret startfiring();
|
||||
if ( isDefined( manual_target ) )
|
||||
{
|
||||
turret thread random_spread( manual_target );
|
||||
}
|
||||
turret do_shoot();
|
||||
wait ( turret_burst + randomfloat( turret_burst_range ) );
|
||||
turret stopshootturret();
|
||||
turret stopfiring();
|
||||
wait ( turret_delay + randomfloat( turret_delay_range ) );
|
||||
}
|
||||
turret endon( "death" );
|
||||
turret endon( "stopfiring" );
|
||||
self endon( "stop_using_built_in_burst_fire" );
|
||||
|
||||
if ( isdefined( turret.script_delay_min ) )
|
||||
turret_delay = turret.script_delay_min;
|
||||
else
|
||||
turret_delay = burst_fire_settings( "delay" );
|
||||
|
||||
if ( isdefined( turret.script_delay_max ) )
|
||||
turret_delay_range = turret.script_delay_max - turret_delay;
|
||||
else
|
||||
turret_delay_range = burst_fire_settings( "delay_range" );
|
||||
|
||||
if ( isdefined( turret.script_burst_min ) )
|
||||
turret_burst = turret.script_burst_min;
|
||||
else
|
||||
turret_burst = burst_fire_settings( "burst" );
|
||||
|
||||
if ( isdefined( turret.script_burst_max ) )
|
||||
turret_burst_range = turret.script_burst_max - turret_burst;
|
||||
else
|
||||
turret_burst_range = burst_fire_settings( "burst_range" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
turret startfiring();
|
||||
|
||||
if ( isdefined( manual_target ) )
|
||||
turret thread random_spread( manual_target );
|
||||
|
||||
turret do_shoot();
|
||||
wait( turret_burst + randomfloat( turret_burst_range ) );
|
||||
turret stopshootturret();
|
||||
turret stopfiring();
|
||||
wait( turret_delay + randomfloat( turret_delay_range ) );
|
||||
}
|
||||
}
|
||||
|
||||
burst_fire_unmanned() //checked changed at own discretion
|
||||
burst_fire_unmanned()
|
||||
{
|
||||
self notify( "stop_burst_fire_unmanned" );
|
||||
self endon( "stop_burst_fire_unmanned" );
|
||||
self endon( "death" );
|
||||
self endon( "remote_start" );
|
||||
level endon( "game_ended" );
|
||||
if ( is_true( self.controlled ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.script_delay_min ) )
|
||||
{
|
||||
turret_delay = self.script_delay_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay = burst_fire_settings( "delay" );
|
||||
}
|
||||
if ( isDefined( self.script_delay_max ) )
|
||||
{
|
||||
turret_delay_range = self.script_delay_max - turret_delay;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_delay_range = burst_fire_settings( "delay_range" );
|
||||
}
|
||||
if ( isDefined( self.script_burst_min ) )
|
||||
{
|
||||
turret_burst = self.script_burst_min;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst = burst_fire_settings( "burst" );
|
||||
}
|
||||
if ( isDefined( self.script_burst_max ) )
|
||||
{
|
||||
turret_burst_range = self.script_burst_max - turret_burst;
|
||||
}
|
||||
else
|
||||
{
|
||||
turret_burst_range = burst_fire_settings( "burst_range" );
|
||||
}
|
||||
pauseuntiltime = getTime();
|
||||
turretstate = "start";
|
||||
self.script_shooting = 0;
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( self.manual_targets ) )
|
||||
{
|
||||
self cleartargetentity();
|
||||
self settargetentity( self.manual_targets[ randomint( self.manual_targets.size ) ] );
|
||||
}
|
||||
duration = ( pauseuntiltime - getTime() ) * 0.001;
|
||||
if ( self isfiringturret() && duration <= 0 )
|
||||
{
|
||||
if ( turretstate != "fire" )
|
||||
{
|
||||
turretstate = "fire";
|
||||
self playsound( "mpl_turret_alert" );
|
||||
self thread do_shoot();
|
||||
self.script_shooting = 1;
|
||||
}
|
||||
duration = turret_burst + randomfloat( turret_burst_range );
|
||||
self thread turret_timer( duration );
|
||||
self waittill( "turretstatechange" );
|
||||
self.script_shooting = 0;
|
||||
duration = turret_delay + randomfloat( turret_delay_range );
|
||||
pauseuntiltime = getTime() + int( duration * 1000 );
|
||||
}
|
||||
else if ( turretstate != "aim" )
|
||||
{
|
||||
turretstate = "aim";
|
||||
}
|
||||
self thread turret_timer( duration );
|
||||
self waittill( "turretstatechange" );
|
||||
}
|
||||
self notify( "stop_burst_fire_unmanned" );
|
||||
self endon( "stop_burst_fire_unmanned" );
|
||||
self endon( "death" );
|
||||
self endon( "remote_start" );
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( isdefined( self.controlled ) && self.controlled )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.script_delay_min ) )
|
||||
turret_delay = self.script_delay_min;
|
||||
else
|
||||
turret_delay = burst_fire_settings( "delay" );
|
||||
|
||||
if ( isdefined( self.script_delay_max ) )
|
||||
turret_delay_range = self.script_delay_max - turret_delay;
|
||||
else
|
||||
turret_delay_range = burst_fire_settings( "delay_range" );
|
||||
|
||||
if ( isdefined( self.script_burst_min ) )
|
||||
turret_burst = self.script_burst_min;
|
||||
else
|
||||
turret_burst = burst_fire_settings( "burst" );
|
||||
|
||||
if ( isdefined( self.script_burst_max ) )
|
||||
turret_burst_range = self.script_burst_max - turret_burst;
|
||||
else
|
||||
turret_burst_range = burst_fire_settings( "burst_range" );
|
||||
|
||||
pauseuntiltime = gettime();
|
||||
turretstate = "start";
|
||||
self.script_shooting = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( self.manual_targets ) )
|
||||
{
|
||||
self cleartargetentity();
|
||||
self settargetentity( self.manual_targets[randomint( self.manual_targets.size )] );
|
||||
}
|
||||
|
||||
duration = ( pauseuntiltime - gettime() ) * 0.001;
|
||||
|
||||
if ( self isfiringturret() && duration <= 0 )
|
||||
{
|
||||
if ( turretstate != "fire" )
|
||||
{
|
||||
turretstate = "fire";
|
||||
self playsound( "mpl_turret_alert" );
|
||||
self thread do_shoot();
|
||||
self.script_shooting = 1;
|
||||
}
|
||||
|
||||
duration = turret_burst + randomfloat( turret_burst_range );
|
||||
self thread turret_timer( duration );
|
||||
|
||||
self waittill( "turretstatechange" );
|
||||
|
||||
self.script_shooting = 0;
|
||||
duration = turret_delay + randomfloat( turret_delay_range );
|
||||
pauseuntiltime = gettime() + int( duration * 1000 );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( turretstate != "aim" )
|
||||
turretstate = "aim";
|
||||
|
||||
self thread turret_timer( duration );
|
||||
|
||||
self waittill( "turretstatechange" );
|
||||
}
|
||||
}
|
||||
|
||||
do_shoot() //checked matches cerberus output
|
||||
do_shoot()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "turretstatechange" );
|
||||
for ( ;; )
|
||||
{
|
||||
self shootturret();
|
||||
wait 0.112;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "turretstatechange" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self shootturret();
|
||||
wait 0.112;
|
||||
}
|
||||
}
|
||||
|
||||
turret_timer( duration ) //checked matches cerberus output
|
||||
turret_timer( duration )
|
||||
{
|
||||
if ( duration <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "turretstatechange" );
|
||||
wait duration;
|
||||
if ( isDefined( self ) )
|
||||
{
|
||||
self notify( "turretstatechange" );
|
||||
}
|
||||
if ( duration <= 0 )
|
||||
return;
|
||||
|
||||
self endon( "turretstatechange" );
|
||||
wait( duration );
|
||||
|
||||
if ( isdefined( self ) )
|
||||
self notify( "turretstatechange" );
|
||||
}
|
||||
|
||||
random_spread( ent ) //checked matches cerberus output
|
||||
random_spread( ent )
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "stop random_spread" );
|
||||
self endon( "stop random_spread" );
|
||||
self endon( "stopfiring" );
|
||||
self settargetentity( ent );
|
||||
self.manual_target = ent;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isplayer( ent ) )
|
||||
{
|
||||
ent.origin = self.manual_target getorigin();
|
||||
}
|
||||
else
|
||||
{
|
||||
ent.origin = self.manual_target.origin;
|
||||
}
|
||||
ent.origin += ( 20 - randomfloat( 40 ), 20 - randomfloat( 40 ), 20 - randomfloat( 60 ) );
|
||||
wait 0.2;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self notify( "stop random_spread" );
|
||||
self endon( "stop random_spread" );
|
||||
self endon( "stopfiring" );
|
||||
self settargetentity( ent );
|
||||
self.manual_target = ent;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( isplayer( ent ) )
|
||||
ent.origin = self.manual_target getorigin();
|
||||
else
|
||||
ent.origin = self.manual_target.origin;
|
||||
|
||||
ent.origin += ( 20 - randomfloat( 40 ), 20 - randomfloat( 40 ), 20 - randomfloat( 60 ) );
|
||||
wait 0.2;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,30 +1,28 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
|
||||
music_init() //checked matches cerberus output
|
||||
music_init()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( level.clientscripts );
|
||||
assert( level.clientscripts );
|
||||
#/
|
||||
*/
|
||||
level.musicstate = "";
|
||||
registerclientsys( "musicCmd" );
|
||||
level.musicstate = "";
|
||||
registerclientsys( "musicCmd" );
|
||||
}
|
||||
|
||||
setmusicstate( state, player ) //checked changed to match cerberus output
|
||||
setmusicstate( state, player )
|
||||
{
|
||||
if ( isDefined( level.musicstate ) )
|
||||
{
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
setclientsysstate( "musicCmd", state, player );
|
||||
return;
|
||||
}
|
||||
else if ( level.musicstate != state )
|
||||
{
|
||||
setclientsysstate( "musicCmd", state );
|
||||
}
|
||||
}
|
||||
level.musicstate = state;
|
||||
if ( isdefined( level.musicstate ) )
|
||||
{
|
||||
if ( isdefined( player ) )
|
||||
{
|
||||
setclientsysstate( "musicCmd", state, player );
|
||||
return;
|
||||
}
|
||||
else if ( level.musicstate != state )
|
||||
setclientsysstate( "musicCmd", state );
|
||||
}
|
||||
|
||||
level.musicstate = state;
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
pcserver() //checked matches cerberus output
|
||||
pcserver()
|
||||
{
|
||||
pcserverupdateplaylist();
|
||||
pcserverupdateplaylist();
|
||||
}
|
||||
|
@ -1,393 +1,331 @@
|
||||
#include maps/mp/gametypes/_hud_message;
|
||||
#include maps/mp/gametypes/_rank;
|
||||
#include maps/mp/gametypes/_persistence;
|
||||
#include maps/mp/_medals;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_medals;
|
||||
#include maps\mp\gametypes\_persistence;
|
||||
#include maps\mp\gametypes\_rank;
|
||||
#include maps\mp\gametypes\_hud_message;
|
||||
|
||||
init()
|
||||
{
|
||||
level.contractsettings = spawnstruct();
|
||||
level.contractsettings.waittime = 4,2;
|
||||
level.killstreaksettings = spawnstruct();
|
||||
level.killstreaksettings.waittime = 3;
|
||||
level.ranksettings = spawnstruct();
|
||||
level.ranksettings.waittime = 3;
|
||||
level.startmessage = spawnstruct();
|
||||
level.startmessagedefaultduration = 2;
|
||||
level.endmessagedefaultduration = 2;
|
||||
level.challengesettings = spawnstruct();
|
||||
level.challengesettings.waittime = 3;
|
||||
level.teammessage = spawnstruct();
|
||||
level.teammessage.waittime = 3;
|
||||
level.regulargamemessages = spawnstruct();
|
||||
level.regulargamemessages.waittime = 6;
|
||||
level.wagersettings = spawnstruct();
|
||||
level.wagersettings.waittime = 3;
|
||||
level.momentumnotifywaittime = 0;
|
||||
level.momentumnotifywaitlasttime = 0;
|
||||
level.teammessagequeuemax = 8;
|
||||
precachestring( &"KILLSTREAK_DESTROYED_UAV" );
|
||||
precachestring( &"KILLSTREAK_DESTROYED_COUNTERUAV" );
|
||||
precachestring( &"KILLSTREAK_DESTROYED_REMOTE_MORTAR" );
|
||||
precachestring( &"KILLSTREAK_MP40_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_M220_TOW_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_MINIGUN_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_M202_FLASH_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_M32_INBOUND" );
|
||||
precachestring( &"MP_CAPTURED_THE_FLAG" );
|
||||
precachestring( &"MP_KILLED_FLAG_CARRIER" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_DROPPED" );
|
||||
precachestring( &"MP_ENEMY_FLAG_DROPPED" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_RETURNED" );
|
||||
precachestring( &"MP_ENEMY_FLAG_RETURNED" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_TAKEN" );
|
||||
precachestring( &"MP_ENEMY_FLAG_TAKEN" );
|
||||
precachestring( &"MP_ENEMY_FLAG_CAPTURED" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_CAPTURED" );
|
||||
precachestring( &"MP_EXPLOSIVES_BLOWUP_BY" );
|
||||
precachestring( &"MP_EXPLOSIVES_DEFUSED_BY" );
|
||||
precachestring( &"MP_EXPLOSIVES_PLANTED_BY" );
|
||||
precachestring( &"MP_HQ_DESTROYED_BY" );
|
||||
precachestring( &"KILLSTREAK_DESTROYED_HELICOPTER" );
|
||||
level.contractsettings = spawnstruct();
|
||||
level.contractsettings.waittime = 4.2;
|
||||
level.killstreaksettings = spawnstruct();
|
||||
level.killstreaksettings.waittime = 3;
|
||||
level.ranksettings = spawnstruct();
|
||||
level.ranksettings.waittime = 3;
|
||||
level.startmessage = spawnstruct();
|
||||
level.startmessagedefaultduration = 2.0;
|
||||
level.endmessagedefaultduration = 2.0;
|
||||
level.challengesettings = spawnstruct();
|
||||
level.challengesettings.waittime = 3;
|
||||
level.teammessage = spawnstruct();
|
||||
level.teammessage.waittime = 3;
|
||||
level.regulargamemessages = spawnstruct();
|
||||
level.regulargamemessages.waittime = 6;
|
||||
level.wagersettings = spawnstruct();
|
||||
level.wagersettings.waittime = 3;
|
||||
level.momentumnotifywaittime = 0;
|
||||
level.momentumnotifywaitlasttime = 0;
|
||||
level.teammessagequeuemax = 8;
|
||||
precachestring( &"KILLSTREAK_DESTROYED_UAV" );
|
||||
precachestring( &"KILLSTREAK_DESTROYED_COUNTERUAV" );
|
||||
precachestring( &"KILLSTREAK_DESTROYED_REMOTE_MORTAR" );
|
||||
precachestring( &"KILLSTREAK_MP40_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_M220_TOW_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_MINIGUN_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_M202_FLASH_INBOUND" );
|
||||
precachestring( &"KILLSTREAK_M32_INBOUND" );
|
||||
precachestring( &"MP_CAPTURED_THE_FLAG" );
|
||||
precachestring( &"MP_KILLED_FLAG_CARRIER" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_DROPPED" );
|
||||
precachestring( &"MP_ENEMY_FLAG_DROPPED" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_RETURNED" );
|
||||
precachestring( &"MP_ENEMY_FLAG_RETURNED" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_TAKEN" );
|
||||
precachestring( &"MP_ENEMY_FLAG_TAKEN" );
|
||||
precachestring( &"MP_ENEMY_FLAG_CAPTURED" );
|
||||
precachestring( &"MP_FRIENDLY_FLAG_CAPTURED" );
|
||||
precachestring( &"MP_EXPLOSIVES_BLOWUP_BY" );
|
||||
precachestring( &"MP_EXPLOSIVES_DEFUSED_BY" );
|
||||
precachestring( &"MP_EXPLOSIVES_PLANTED_BY" );
|
||||
precachestring( &"MP_HQ_DESTROYED_BY" );
|
||||
precachestring( &"KILLSTREAK_DESTROYED_HELICOPTER" );
|
||||
/#
|
||||
level thread popupsfromconsole();
|
||||
level thread popupsfromconsole();
|
||||
#/
|
||||
level thread onplayerconnect();
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
popupsfromconsole()
|
||||
{
|
||||
/#
|
||||
while ( 1 )
|
||||
{
|
||||
timeout = getdvarintdefault( "scr_popuptime", 1 );
|
||||
if ( timeout == 0 )
|
||||
{
|
||||
timeout = 1;
|
||||
}
|
||||
wait timeout;
|
||||
medal = getdvarintdefault( "scr_popupmedal", 0 );
|
||||
challenge = getdvarintdefault( "scr_popupchallenge", 0 );
|
||||
rank = getdvarintdefault( "scr_popuprank", 0 );
|
||||
gun = getdvarintdefault( "scr_popupgun", 0 );
|
||||
contractpass = getdvarintdefault( "scr_popupcontractpass", 0 );
|
||||
contractfail = getdvarintdefault( "scr_popupcontractfail", 0 );
|
||||
gamemodemsg = getdvarintdefault( "scr_gamemodeslideout", 0 );
|
||||
teammsg = getdvarintdefault( "scr_teamslideout", 0 );
|
||||
challengeindex = getdvarintdefault( "scr_challengeIndex", 1 );
|
||||
i = 0;
|
||||
while ( i < medal )
|
||||
{
|
||||
level.players[ 0 ] maps/mp/_medals::codecallback_medal( 4 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < challenge )
|
||||
{
|
||||
level.players[ 0 ] maps/mp/gametypes/_persistence::codecallback_challengecomplete( 2500, 1, 84, 3, 0, 0, 851 );
|
||||
level.players[ 0 ] maps/mp/gametypes/_persistence::codecallback_challengecomplete( 500, 1, 22, 2, 0, 0, 533 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < rank )
|
||||
{
|
||||
level.players[ 0 ] maps/mp/gametypes/_rank::codecallback_rankup( 4, 0, 0 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < gun )
|
||||
{
|
||||
level.players[ 0 ] maps/mp/gametypes/_persistence::codecallback_gunchallengecomplete( 0, 20, 25, 0 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < contractpass )
|
||||
{
|
||||
level.players[ 0 ] maps/mp/gametypes/_persistence::addcontracttoqueue( 12, 1 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < contractfail )
|
||||
{
|
||||
level.players[ 0 ] maps/mp/gametypes/_persistence::addcontracttoqueue( 12, 0 );
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < teammsg )
|
||||
{
|
||||
player = level.players[ 0 ];
|
||||
if ( isDefined( level.players[ 1 ] ) )
|
||||
{
|
||||
player = level.players[ 1 ];
|
||||
}
|
||||
level.players[ 0 ] displayteammessagetoall( &"KILLSTREAK_DESTROYED_HELICOPTER", player );
|
||||
i++;
|
||||
}
|
||||
reset = getdvarintdefault( "scr_popupreset", 1 );
|
||||
if ( reset )
|
||||
{
|
||||
if ( medal )
|
||||
{
|
||||
setdvar( "scr_popupmedal", 0 );
|
||||
}
|
||||
if ( challenge )
|
||||
{
|
||||
setdvar( "scr_popupchallenge", 0 );
|
||||
}
|
||||
if ( gun )
|
||||
{
|
||||
setdvar( "scr_popupgun", 0 );
|
||||
}
|
||||
if ( rank )
|
||||
{
|
||||
setdvar( "scr_popuprank", 0 );
|
||||
}
|
||||
if ( contractpass )
|
||||
{
|
||||
setdvar( "scr_popupcontractpass", 0 );
|
||||
}
|
||||
if ( contractfail )
|
||||
{
|
||||
setdvar( "scr_popupcontractfail", 0 );
|
||||
}
|
||||
if ( gamemodemsg )
|
||||
{
|
||||
setdvar( "scr_gamemodeslideout", 0 );
|
||||
}
|
||||
if ( teammsg )
|
||||
{
|
||||
setdvar( "scr_teamslideout", 0 );
|
||||
}
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
timeout = getdvarintdefault( "scr_popuptime", 1.0 );
|
||||
|
||||
if ( timeout == 0 )
|
||||
timeout = 1;
|
||||
|
||||
wait( timeout );
|
||||
medal = getdvarintdefault( "scr_popupmedal", 0 );
|
||||
challenge = getdvarintdefault( "scr_popupchallenge", 0 );
|
||||
rank = getdvarintdefault( "scr_popuprank", 0 );
|
||||
gun = getdvarintdefault( "scr_popupgun", 0 );
|
||||
contractpass = getdvarintdefault( "scr_popupcontractpass", 0 );
|
||||
contractfail = getdvarintdefault( "scr_popupcontractfail", 0 );
|
||||
gamemodemsg = getdvarintdefault( "scr_gamemodeslideout", 0 );
|
||||
teammsg = getdvarintdefault( "scr_teamslideout", 0 );
|
||||
challengeindex = getdvarintdefault( "scr_challengeIndex", 1 );
|
||||
|
||||
for ( i = 0; i < medal; i++ )
|
||||
level.players[0] maps\mp\_medals::codecallback_medal( 4 );
|
||||
|
||||
for ( i = 0; i < challenge; i++ )
|
||||
{
|
||||
level.players[0] maps\mp\gametypes\_persistence::codecallback_challengecomplete( 2500, 1, 84, 3, 0, 0, 851 );
|
||||
level.players[0] maps\mp\gametypes\_persistence::codecallback_challengecomplete( 500, 1, 22, 2, 0, 0, 533 );
|
||||
}
|
||||
|
||||
for ( i = 0; i < rank; i++ )
|
||||
level.players[0] maps\mp\gametypes\_rank::codecallback_rankup( 4, 0, 0 );
|
||||
|
||||
for ( i = 0; i < gun; i++ )
|
||||
level.players[0] maps\mp\gametypes\_persistence::codecallback_gunchallengecomplete( 0, 20, 25, 0 );
|
||||
|
||||
for ( i = 0; i < contractpass; i++ )
|
||||
level.players[0] maps\mp\gametypes\_persistence::addcontracttoqueue( 12, 1 );
|
||||
|
||||
for ( i = 0; i < contractfail; i++ )
|
||||
level.players[0] maps\mp\gametypes\_persistence::addcontracttoqueue( 12, 0 );
|
||||
|
||||
for ( i = 0; i < teammsg; i++ )
|
||||
{
|
||||
player = level.players[0];
|
||||
|
||||
if ( isdefined( level.players[1] ) )
|
||||
player = level.players[1];
|
||||
|
||||
level.players[0] displayteammessagetoall( &"KILLSTREAK_DESTROYED_HELICOPTER", player );
|
||||
}
|
||||
|
||||
reset = getdvarintdefault( "scr_popupreset", 1 );
|
||||
|
||||
if ( reset )
|
||||
{
|
||||
if ( medal )
|
||||
setdvar( "scr_popupmedal", 0 );
|
||||
|
||||
if ( challenge )
|
||||
setdvar( "scr_popupchallenge", 0 );
|
||||
|
||||
if ( gun )
|
||||
setdvar( "scr_popupgun", 0 );
|
||||
|
||||
if ( rank )
|
||||
setdvar( "scr_popuprank", 0 );
|
||||
|
||||
if ( contractpass )
|
||||
setdvar( "scr_popupcontractpass", 0 );
|
||||
|
||||
if ( contractfail )
|
||||
setdvar( "scr_popupcontractfail", 0 );
|
||||
|
||||
if ( gamemodemsg )
|
||||
setdvar( "scr_gamemodeslideout", 0 );
|
||||
|
||||
if ( teammsg )
|
||||
setdvar( "scr_teamslideout", 0 );
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
displaykillstreakteammessagetoall( killstreak, player )
|
||||
{
|
||||
if ( !isDefined( level.killstreaks[ killstreak ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( level.killstreaks[ killstreak ].inboundtext ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
message = level.killstreaks[ killstreak ].inboundtext;
|
||||
self displayteammessagetoall( message, player );
|
||||
if ( !isdefined( level.killstreaks[killstreak] ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( level.killstreaks[killstreak].inboundtext ) )
|
||||
return;
|
||||
|
||||
message = level.killstreaks[killstreak].inboundtext;
|
||||
self displayteammessagetoall( message, player );
|
||||
}
|
||||
|
||||
shoulddisplayteammessages()
|
||||
{
|
||||
if ( level.hardcoremode == 1 || level.splitscreen == 1 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( level.hardcoremode == 1 || level.splitscreen == 1 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
displayteammessagetoall( message, player )
|
||||
{
|
||||
if ( !shoulddisplayteammessages() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
cur_player = level.players[ i ];
|
||||
if ( cur_player isempjammed() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else size = cur_player.teammessagequeue.size;
|
||||
if ( size >= level.teammessagequeuemax )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
cur_player.teammessagequeue[ size ] = spawnstruct();
|
||||
cur_player.teammessagequeue[ size ].message = message;
|
||||
cur_player.teammessagequeue[ size ].player = player;
|
||||
cur_player notify( "received teammessage" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !shoulddisplayteammessages() )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
cur_player = level.players[i];
|
||||
|
||||
if ( cur_player isempjammed() )
|
||||
continue;
|
||||
|
||||
size = cur_player.teammessagequeue.size;
|
||||
|
||||
if ( size >= level.teammessagequeuemax )
|
||||
continue;
|
||||
|
||||
cur_player.teammessagequeue[size] = spawnstruct();
|
||||
cur_player.teammessagequeue[size].message = message;
|
||||
cur_player.teammessagequeue[size].player = player;
|
||||
cur_player notify( "received teammessage" );
|
||||
}
|
||||
}
|
||||
|
||||
displayteammessagetoteam( message, player, team )
|
||||
{
|
||||
if ( !shoulddisplayteammessages() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
cur_player = level.players[ i ];
|
||||
if ( cur_player.team != team )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( cur_player isempjammed() )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else size = cur_player.teammessagequeue.size;
|
||||
if ( size >= level.teammessagequeuemax )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
cur_player.teammessagequeue[ size ] = spawnstruct();
|
||||
cur_player.teammessagequeue[ size ].message = message;
|
||||
cur_player.teammessagequeue[ size ].player = player;
|
||||
cur_player notify( "received teammessage" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !shoulddisplayteammessages() )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
cur_player = level.players[i];
|
||||
|
||||
if ( cur_player.team != team )
|
||||
continue;
|
||||
|
||||
if ( cur_player isempjammed() )
|
||||
continue;
|
||||
|
||||
size = cur_player.teammessagequeue.size;
|
||||
|
||||
if ( size >= level.teammessagequeuemax )
|
||||
continue;
|
||||
|
||||
cur_player.teammessagequeue[size] = spawnstruct();
|
||||
cur_player.teammessagequeue[size].message = message;
|
||||
cur_player.teammessagequeue[size].player = player;
|
||||
cur_player notify( "received teammessage" );
|
||||
}
|
||||
}
|
||||
|
||||
displayteammessagewaiter()
|
||||
{
|
||||
if ( !shoulddisplayteammessages() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self.teammessagequeue = [];
|
||||
for ( ;; )
|
||||
{
|
||||
if ( self.teammessagequeue.size == 0 )
|
||||
{
|
||||
self waittill( "received teammessage" );
|
||||
}
|
||||
if ( self.teammessagequeue.size > 0 )
|
||||
{
|
||||
nextnotifydata = self.teammessagequeue[ 0 ];
|
||||
arrayremoveindex( self.teammessagequeue, 0, 0 );
|
||||
if ( !isDefined( nextnotifydata.player ) || !isplayer( nextnotifydata.player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self isempjammed() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self luinotifyevent( &"player_callout", 2, nextnotifydata.message, nextnotifydata.player.entnum );
|
||||
}
|
||||
wait level.teammessage.waittime;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !shoulddisplayteammessages() )
|
||||
return;
|
||||
|
||||
self endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self.teammessagequeue = [];
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( self.teammessagequeue.size == 0 )
|
||||
self waittill( "received teammessage" );
|
||||
|
||||
if ( self.teammessagequeue.size > 0 )
|
||||
{
|
||||
nextnotifydata = self.teammessagequeue[0];
|
||||
arrayremoveindex( self.teammessagequeue, 0, 0 );
|
||||
|
||||
if ( !isdefined( nextnotifydata.player ) || !isplayer( nextnotifydata.player ) )
|
||||
continue;
|
||||
|
||||
if ( self isempjammed() )
|
||||
continue;
|
||||
|
||||
self luinotifyevent( &"player_callout", 2, nextnotifydata.message, nextnotifydata.player.entnum );
|
||||
}
|
||||
|
||||
wait( level.teammessage.waittime );
|
||||
}
|
||||
}
|
||||
|
||||
displaypopupswaiter()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.ranknotifyqueue = [];
|
||||
if ( !isDefined( self.pers[ "challengeNotifyQueue" ] ) )
|
||||
{
|
||||
self.pers[ "challengeNotifyQueue" ] = [];
|
||||
}
|
||||
if ( !isDefined( self.pers[ "contractNotifyQueue" ] ) )
|
||||
{
|
||||
self.pers[ "contractNotifyQueue" ] = [];
|
||||
}
|
||||
self.messagenotifyqueue = [];
|
||||
self.startmessagenotifyqueue = [];
|
||||
self.wagernotifyqueue = [];
|
||||
while ( !level.gameended )
|
||||
{
|
||||
if ( self.startmessagenotifyqueue.size == 0 && self.messagenotifyqueue.size == 0 )
|
||||
{
|
||||
self waittill( "received award" );
|
||||
}
|
||||
waittillframeend;
|
||||
if ( level.gameended )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.startmessagenotifyqueue.size > 0 )
|
||||
{
|
||||
nextnotifydata = self.startmessagenotifyqueue[ 0 ];
|
||||
arrayremoveindex( self.startmessagenotifyqueue, 0, 0 );
|
||||
if ( isDefined( nextnotifydata.duration ) )
|
||||
{
|
||||
duration = nextnotifydata.duration;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration = level.startmessagedefaultduration;
|
||||
}
|
||||
self maps/mp/gametypes/_hud_message::shownotifymessage( nextnotifydata, duration );
|
||||
wait duration;
|
||||
continue;
|
||||
}
|
||||
else if ( self.messagenotifyqueue.size > 0 )
|
||||
{
|
||||
nextnotifydata = self.messagenotifyqueue[ 0 ];
|
||||
arrayremoveindex( self.messagenotifyqueue, 0, 0 );
|
||||
if ( isDefined( nextnotifydata.duration ) )
|
||||
{
|
||||
duration = nextnotifydata.duration;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration = level.regulargamemessages.waittime;
|
||||
}
|
||||
self maps/mp/gametypes/_hud_message::shownotifymessage( nextnotifydata, duration );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self.ranknotifyqueue = [];
|
||||
|
||||
if ( !isdefined( self.pers["challengeNotifyQueue"] ) )
|
||||
self.pers["challengeNotifyQueue"] = [];
|
||||
|
||||
if ( !isdefined( self.pers["contractNotifyQueue"] ) )
|
||||
self.pers["contractNotifyQueue"] = [];
|
||||
|
||||
self.messagenotifyqueue = [];
|
||||
self.startmessagenotifyqueue = [];
|
||||
self.wagernotifyqueue = [];
|
||||
|
||||
while ( !level.gameended )
|
||||
{
|
||||
if ( self.startmessagenotifyqueue.size == 0 && self.messagenotifyqueue.size == 0 )
|
||||
self waittill( "received award" );
|
||||
|
||||
waittillframeend;
|
||||
|
||||
if ( level.gameended )
|
||||
break;
|
||||
|
||||
if ( self.startmessagenotifyqueue.size > 0 )
|
||||
{
|
||||
nextnotifydata = self.startmessagenotifyqueue[0];
|
||||
arrayremoveindex( self.startmessagenotifyqueue, 0, 0 );
|
||||
|
||||
if ( isdefined( nextnotifydata.duration ) )
|
||||
duration = nextnotifydata.duration;
|
||||
else
|
||||
duration = level.startmessagedefaultduration;
|
||||
|
||||
self maps\mp\gametypes\_hud_message::shownotifymessage( nextnotifydata, duration );
|
||||
wait( duration );
|
||||
}
|
||||
else if ( self.messagenotifyqueue.size > 0 )
|
||||
{
|
||||
nextnotifydata = self.messagenotifyqueue[0];
|
||||
arrayremoveindex( self.messagenotifyqueue, 0, 0 );
|
||||
|
||||
if ( isdefined( nextnotifydata.duration ) )
|
||||
duration = nextnotifydata.duration;
|
||||
else
|
||||
duration = level.regulargamemessages.waittime;
|
||||
|
||||
self maps\mp\gametypes\_hud_message::shownotifymessage( nextnotifydata, duration );
|
||||
}
|
||||
else
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player.resetgameoverhudrequired = 0;
|
||||
player thread displaypopupswaiter();
|
||||
if ( !level.hardcoremode )
|
||||
{
|
||||
player thread displayteammessagewaiter();
|
||||
}
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player.resetgameoverhudrequired = 0;
|
||||
player thread displaypopupswaiter();
|
||||
|
||||
if ( !level.hardcoremode )
|
||||
player thread displayteammessagewaiter();
|
||||
}
|
||||
}
|
||||
|
||||
milestonenotify( index, itemindex, type, tier )
|
||||
{
|
||||
level.globalchallenges++;
|
||||
if ( !isDefined( type ) )
|
||||
{
|
||||
type = "global";
|
||||
}
|
||||
size = self.pers[ "challengeNotifyQueue" ].size;
|
||||
self.pers[ "challengeNotifyQueue" ][ size ] = [];
|
||||
self.pers[ "challengeNotifyQueue" ][ size ][ "tier" ] = tier;
|
||||
self.pers[ "challengeNotifyQueue" ][ size ][ "index" ] = index;
|
||||
self.pers[ "challengeNotifyQueue" ][ size ][ "itemIndex" ] = itemindex;
|
||||
self.pers[ "challengeNotifyQueue" ][ size ][ "type" ] = type;
|
||||
self notify( "received award" );
|
||||
level.globalchallenges++;
|
||||
|
||||
if ( !isdefined( type ) )
|
||||
type = "global";
|
||||
|
||||
size = self.pers["challengeNotifyQueue"].size;
|
||||
self.pers["challengeNotifyQueue"][size] = [];
|
||||
self.pers["challengeNotifyQueue"][size]["tier"] = tier;
|
||||
self.pers["challengeNotifyQueue"][size]["index"] = index;
|
||||
self.pers["challengeNotifyQueue"][size]["itemIndex"] = itemindex;
|
||||
self.pers["challengeNotifyQueue"][size]["type"] = type;
|
||||
self notify( "received award" );
|
||||
}
|
||||
|
@ -1,240 +1,251 @@
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
|
||||
init()
|
||||
{
|
||||
precacheshader( "gfx_fxt_fx_screen_droplets_02" );
|
||||
precacherumble( "proximity_grenade" );
|
||||
precacheitem( "proximity_grenade_aoe_mp" );
|
||||
level._effect[ "prox_grenade_friendly_default" ] = loadfx( "weapon/grenade/fx_prox_grenade_scan_grn" );
|
||||
level._effect[ "prox_grenade_friendly_warning" ] = loadfx( "weapon/grenade/fx_prox_grenade_wrn_grn" );
|
||||
level._effect[ "prox_grenade_enemy_default" ] = loadfx( "weapon/grenade/fx_prox_grenade_scan_red" );
|
||||
level._effect[ "prox_grenade_enemy_warning" ] = loadfx( "weapon/grenade/fx_prox_grenade_wrn_red" );
|
||||
level._effect[ "prox_grenade_player_shock" ] = loadfx( "weapon/grenade/fx_prox_grenade_impact_player_spwner" );
|
||||
level.proximitygrenadedetectionradius = weapons_get_dvar_int( "scr_proximityGrenadeDetectionRadius", "150" );
|
||||
level.proximitygrenadegraceperiod = weapons_get_dvar( "scr_proximityGrenadeGracePeriod", 0,1 );
|
||||
level.proximitygrenadedamageradius = weapons_get_dvar_int( "scr_proximityGrenadeDamageRadius", "200" );
|
||||
level.proximitygrenadedotdamageamount = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmount", "1" );
|
||||
level.proximitygrenadedotdamageamounthardcore = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmountHardcore", "1" );
|
||||
level.proximitygrenadedotdamagetime = weapons_get_dvar( "scr_proximityGrenadeDOTDamageTime", 0,15 );
|
||||
level.proximitygrenadedotdamageinstances = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageInstances", "4" );
|
||||
level.proximitygrenademaxinstances = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances", "3" );
|
||||
level.proximitygrenadeeffectdebug = weapons_get_dvar_int( "scr_proximityGrenadeEffectDebug", "0" );
|
||||
level.proximitygrenadeactivationtime = weapons_get_dvar( "scr_proximityGrenadeActivationTime", 0,1 );
|
||||
level.poisonfxduration = 6;
|
||||
precacheshader( "gfx_fxt_fx_screen_droplets_02" );
|
||||
precacherumble( "proximity_grenade" );
|
||||
precacheitem( "proximity_grenade_aoe_mp" );
|
||||
level._effect["prox_grenade_friendly_default"] = loadfx( "weapon/grenade/fx_prox_grenade_scan_grn" );
|
||||
level._effect["prox_grenade_friendly_warning"] = loadfx( "weapon/grenade/fx_prox_grenade_wrn_grn" );
|
||||
level._effect["prox_grenade_enemy_default"] = loadfx( "weapon/grenade/fx_prox_grenade_scan_red" );
|
||||
level._effect["prox_grenade_enemy_warning"] = loadfx( "weapon/grenade/fx_prox_grenade_wrn_red" );
|
||||
level._effect["prox_grenade_player_shock"] = loadfx( "weapon/grenade/fx_prox_grenade_impact_player_spwner" );
|
||||
level.proximitygrenadedetectionradius = weapons_get_dvar_int( "scr_proximityGrenadeDetectionRadius", "150" );
|
||||
level.proximitygrenadegraceperiod = weapons_get_dvar( "scr_proximityGrenadeGracePeriod", 0.1 );
|
||||
level.proximitygrenadedamageradius = weapons_get_dvar_int( "scr_proximityGrenadeDamageRadius", "200" );
|
||||
level.proximitygrenadedotdamageamount = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmount", "1" );
|
||||
level.proximitygrenadedotdamageamounthardcore = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmountHardcore", "1" );
|
||||
level.proximitygrenadedotdamagetime = weapons_get_dvar( "scr_proximityGrenadeDOTDamageTime", 0.15 );
|
||||
level.proximitygrenadedotdamageinstances = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageInstances", "4" );
|
||||
level.proximitygrenademaxinstances = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances", "3" );
|
||||
level.proximitygrenadeeffectdebug = weapons_get_dvar_int( "scr_proximityGrenadeEffectDebug", "0" );
|
||||
level.proximitygrenadeactivationtime = weapons_get_dvar( "scr_proximityGrenadeActivationTime", 0.1 );
|
||||
level.poisonfxduration = 6;
|
||||
/#
|
||||
level thread updatedvars();
|
||||
level thread updatedvars();
|
||||
#/
|
||||
}
|
||||
|
||||
register()
|
||||
{
|
||||
registerclientfield( "toplayer", "tazered", 1000, 1, "int" );
|
||||
registerclientfield( "toplayer", "tazered", 1000, 1, "int" );
|
||||
}
|
||||
|
||||
updatedvars()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level.proximitygrenadedetectionradius = weapons_get_dvar_int( "scr_proximityGrenadeDetectionRadius", level.proximitygrenadedetectionradius );
|
||||
level.proximitygrenadegraceperiod = weapons_get_dvar( "scr_proximityGrenadeGracePeriod", level.proximitygrenadegraceperiod );
|
||||
level.proximitygrenadedamageradius = weapons_get_dvar_int( "scr_proximityGrenadeDamageRadius", level.proximitygrenadedamageradius );
|
||||
level.proximitygrenadedotdamageamount = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmount", level.proximitygrenadedotdamageamount );
|
||||
level.proximitygrenadedotdamageamounthardcore = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmountHardcore", level.proximitygrenadedotdamageamounthardcore );
|
||||
level.proximitygrenadedotdamagetime = weapons_get_dvar( "scr_proximityGrenadeDOTDamageTime", level.proximitygrenadedotdamagetime );
|
||||
level.proximitygrenadedotdamageinstances = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageInstances", level.proximitygrenadedotdamageinstances );
|
||||
level.proximitygrenademaxinstances = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances", level.proximitygrenademaxinstances );
|
||||
level.proximitygrenadeeffectdebug = weapons_get_dvar_int( "scr_proximityGrenadeEffectDebug", level.proximitygrenadeeffectdebug );
|
||||
level.proximitygrenadeactivationtime = weapons_get_dvar( "scr_proximityGrenadeActivationTime", level.proximitygrenadeactivationtime );
|
||||
wait 1;
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
level.proximitygrenadedetectionradius = weapons_get_dvar_int( "scr_proximityGrenadeDetectionRadius", level.proximitygrenadedetectionradius );
|
||||
level.proximitygrenadegraceperiod = weapons_get_dvar( "scr_proximityGrenadeGracePeriod", level.proximitygrenadegraceperiod );
|
||||
level.proximitygrenadedamageradius = weapons_get_dvar_int( "scr_proximityGrenadeDamageRadius", level.proximitygrenadedamageradius );
|
||||
level.proximitygrenadedotdamageamount = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmount", level.proximitygrenadedotdamageamount );
|
||||
level.proximitygrenadedotdamageamounthardcore = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmountHardcore", level.proximitygrenadedotdamageamounthardcore );
|
||||
level.proximitygrenadedotdamagetime = weapons_get_dvar( "scr_proximityGrenadeDOTDamageTime", level.proximitygrenadedotdamagetime );
|
||||
level.proximitygrenadedotdamageinstances = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageInstances", level.proximitygrenadedotdamageinstances );
|
||||
level.proximitygrenademaxinstances = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances", level.proximitygrenademaxinstances );
|
||||
level.proximitygrenadeeffectdebug = weapons_get_dvar_int( "scr_proximityGrenadeEffectDebug", level.proximitygrenadeeffectdebug );
|
||||
level.proximitygrenadeactivationtime = weapons_get_dvar( "scr_proximityGrenadeActivationTime", level.proximitygrenadeactivationtime );
|
||||
wait 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
createproximitygrenadewatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createproximityweaponobjectwatcher( "proximity_grenade", "proximity_grenade_mp", self.team );
|
||||
watcher.watchforfire = 1;
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.headicon = 0;
|
||||
watcher.reconmodel = "t6_wpn_taser_mine_world_detect";
|
||||
watcher.activatefx = 1;
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher.ignoredirection = 1;
|
||||
watcher.immediatedetonation = 1;
|
||||
watcher.detectiongraceperiod = level.proximitygrenadegraceperiod;
|
||||
watcher.detonateradius = level.proximitygrenadedetectionradius;
|
||||
watcher.stun = maps/mp/gametypes/_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 1;
|
||||
watcher.detonate = ::proximitydetonate;
|
||||
watcher.activationdelay = level.proximitygrenadeactivationtime;
|
||||
watcher.onspawn = ::onspawnproximitygrenadeweaponobject;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createproximityweaponobjectwatcher( "proximity_grenade", "proximity_grenade_mp", self.team );
|
||||
watcher.watchforfire = 1;
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.headicon = 0;
|
||||
watcher.reconmodel = "t6_wpn_taser_mine_world_detect";
|
||||
watcher.activatefx = 1;
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher.ignoredirection = 1;
|
||||
watcher.immediatedetonation = 1;
|
||||
watcher.detectiongraceperiod = level.proximitygrenadegraceperiod;
|
||||
watcher.detonateradius = level.proximitygrenadedetectionradius;
|
||||
watcher.stun = maps\mp\gametypes\_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 1;
|
||||
watcher.detonate = ::proximitydetonate;
|
||||
watcher.activationdelay = level.proximitygrenadeactivationtime;
|
||||
watcher.onspawn = ::onspawnproximitygrenadeweaponobject;
|
||||
}
|
||||
|
||||
onspawnproximitygrenadeweaponobject( watcher, owner )
|
||||
{
|
||||
self thread setupkillcament();
|
||||
owner addweaponstat( "proximity_grenade_mp", "used", 1 );
|
||||
onspawnproximityweaponobject( watcher, owner );
|
||||
self thread setupkillcament();
|
||||
owner addweaponstat( "proximity_grenade_mp", "used", 1 );
|
||||
onspawnproximityweaponobject( watcher, owner );
|
||||
}
|
||||
|
||||
setupkillcament()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittillnotmoving();
|
||||
self.killcament = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 8 ) );
|
||||
self thread cleanupkillcamentondeath();
|
||||
self endon( "death" );
|
||||
self waittillnotmoving();
|
||||
self.killcament = spawn( "script_model", self.origin + vectorscale( ( 0, 0, 1 ), 8.0 ) );
|
||||
self thread cleanupkillcamentondeath();
|
||||
}
|
||||
|
||||
cleanupkillcamentondeath()
|
||||
{
|
||||
self waittill( "death" );
|
||||
self.killcament deleteaftertime( 3 + ( level.proximitygrenadedotdamagetime * level.proximitygrenadedotdamageinstances ) );
|
||||
self waittill( "death" );
|
||||
|
||||
self.killcament deleteaftertime( 3 + level.proximitygrenadedotdamagetime * level.proximitygrenadedotdamageinstances );
|
||||
}
|
||||
|
||||
proximitydetonate( attacker, weaponname )
|
||||
{
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedexplosive( weaponname );
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_proxy", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
}
|
||||
maps/mp/gametypes/_weaponobjects::weapondetonate( attacker, weaponname );
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
if ( isdefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedexplosive( weaponname );
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_proxy", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
maps\mp\gametypes\_weaponobjects::weapondetonate( attacker, weaponname );
|
||||
}
|
||||
|
||||
proximitygrenadedamageplayer( eattacker, einflictor )
|
||||
{
|
||||
if ( !self hasperk( "specialty_proximityprotection" ) )
|
||||
{
|
||||
if ( !level.proximitygrenadeeffectdebug )
|
||||
{
|
||||
self thread damageplayerinradius( einflictor.origin, eattacker, einflictor );
|
||||
}
|
||||
}
|
||||
if ( !self hasperk( "specialty_proximityprotection" ) )
|
||||
{
|
||||
if ( !level.proximitygrenadeeffectdebug )
|
||||
self thread damageplayerinradius( einflictor.origin, eattacker, einflictor );
|
||||
}
|
||||
}
|
||||
|
||||
watchproximitygrenadehitplayer( owner )
|
||||
{
|
||||
self endon( "death" );
|
||||
self setowner( owner );
|
||||
self setteam( owner.team );
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "grenade_bounce", pos, normal, ent, surface );
|
||||
if ( isDefined( ent ) && isplayer( ent ) && surface != "riotshield" )
|
||||
{
|
||||
if ( level.teambased && ent.team == self.owner.team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
self proximitydetonate( self.owner, undefined );
|
||||
return;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self setowner( owner );
|
||||
self setteam( owner.team );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "grenade_bounce", pos, normal, ent, surface );
|
||||
|
||||
if ( isdefined( ent ) && isplayer( ent ) && surface != "riotshield" )
|
||||
{
|
||||
if ( level.teambased && ent.team == self.owner.team )
|
||||
continue;
|
||||
|
||||
self proximitydetonate( self.owner, undefined );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
performhudeffects( position, distancetogrenade )
|
||||
{
|
||||
forwardvec = vectornormalize( anglesToForward( self.angles ) );
|
||||
rightvec = vectornormalize( anglesToRight( self.angles ) );
|
||||
explosionvec = vectornormalize( position - self.origin );
|
||||
fdot = vectordot( explosionvec, forwardvec );
|
||||
rdot = vectordot( explosionvec, rightvec );
|
||||
fangle = acos( fdot );
|
||||
rangle = acos( rdot );
|
||||
forwardvec = vectornormalize( anglestoforward( self.angles ) );
|
||||
rightvec = vectornormalize( anglestoright( self.angles ) );
|
||||
explosionvec = vectornormalize( position - self.origin );
|
||||
fdot = vectordot( explosionvec, forwardvec );
|
||||
rdot = vectordot( explosionvec, rightvec );
|
||||
fangle = acos( fdot );
|
||||
rangle = acos( rdot );
|
||||
}
|
||||
|
||||
damageplayerinradius( position, owner, einflictor )
|
||||
{
|
||||
self notify( "proximityGrenadeDamageStart" );
|
||||
self endon( "proximityGrenadeDamageStart" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
self thread watch_death();
|
||||
if ( !isDefined( einflictor.killcament ) )
|
||||
{
|
||||
killcament = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 8 ) );
|
||||
killcament deleteaftertime( 3 + ( level.proximitygrenadedotdamagetime * level.proximitygrenadedotdamageinstances ) );
|
||||
killcament.soundmod = "taser_spike";
|
||||
}
|
||||
else
|
||||
{
|
||||
killcament = einflictor.killcament;
|
||||
killcament.soundmod = "taser_spike";
|
||||
}
|
||||
damage = level.proximitygrenadedotdamageamount;
|
||||
playfxontag( level._effect[ "prox_grenade_player_shock" ], self, "J_SpineUpper" );
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
damage = level.proximitygrenadedotdamageamounthardcore;
|
||||
}
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
shellshock_duration = 1,5;
|
||||
self shellshock( "proximity_grenade", shellshock_duration, 0 );
|
||||
self setclientfieldtoplayer( "tazered", 1 );
|
||||
}
|
||||
self playrumbleonentity( "proximity_grenade" );
|
||||
self playsound( "wpn_taser_mine_zap" );
|
||||
self setclientuivisibilityflag( "hud_visible", 0 );
|
||||
i = 0;
|
||||
while ( i < level.proximitygrenadedotdamageinstances )
|
||||
{
|
||||
wait level.proximitygrenadedotdamagetime;
|
||||
self notify( "proximityGrenadeDamageStart" );
|
||||
self endon( "proximityGrenadeDamageStart" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
self thread watch_death();
|
||||
|
||||
if ( !isdefined( einflictor.killcament ) )
|
||||
{
|
||||
killcament = spawn( "script_model", self.origin + vectorscale( ( 0, 0, 1 ), 8.0 ) );
|
||||
killcament deleteaftertime( 3 + level.proximitygrenadedotdamagetime * level.proximitygrenadedotdamageinstances );
|
||||
killcament.soundmod = "taser_spike";
|
||||
}
|
||||
else
|
||||
{
|
||||
killcament = einflictor.killcament;
|
||||
killcament.soundmod = "taser_spike";
|
||||
}
|
||||
|
||||
damage = level.proximitygrenadedotdamageamount;
|
||||
playfxontag( level._effect["prox_grenade_player_shock"], self, "J_SpineUpper" );
|
||||
|
||||
if ( level.hardcoremode )
|
||||
damage = level.proximitygrenadedotdamageamounthardcore;
|
||||
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
shellshock_duration = 1.5;
|
||||
self shellshock( "proximity_grenade", shellshock_duration, 0 );
|
||||
self setclientfieldtoplayer( "tazered", 1 );
|
||||
}
|
||||
|
||||
self playrumbleonentity( "proximity_grenade" );
|
||||
self playsound( "wpn_taser_mine_zap" );
|
||||
self setclientuivisibilityflag( "hud_visible", 0 );
|
||||
|
||||
for ( i = 0; i < level.proximitygrenadedotdamageinstances; i++ )
|
||||
{
|
||||
wait( level.proximitygrenadedotdamagetime );
|
||||
/#
|
||||
assert( isDefined( owner ) );
|
||||
assert( isdefined( owner ) );
|
||||
#/
|
||||
/#
|
||||
assert( isDefined( killcament ) );
|
||||
assert( isdefined( killcament ) );
|
||||
#/
|
||||
self dodamage( damage, position, owner, killcament, "none", "MOD_GAS", 0, "proximity_grenade_aoe_mp" );
|
||||
i++;
|
||||
}
|
||||
wait 0,85;
|
||||
self shellshock( "proximity_grenade_exit", 0,6, 0 );
|
||||
self setclientuivisibilityflag( "hud_visible", 1 );
|
||||
self setclientfieldtoplayer( "tazered", 0 );
|
||||
self dodamage( damage, position, owner, killcament, "none", "MOD_GAS", 0, "proximity_grenade_aoe_mp" );
|
||||
}
|
||||
|
||||
wait 0.85;
|
||||
self shellshock( "proximity_grenade_exit", 0.6, 0 );
|
||||
self setclientuivisibilityflag( "hud_visible", 1 );
|
||||
self setclientfieldtoplayer( "tazered", 0 );
|
||||
}
|
||||
|
||||
deleteentonownerdeath( owner )
|
||||
{
|
||||
self thread deleteentontimeout();
|
||||
self thread deleteentaftertime();
|
||||
self endon( "delete" );
|
||||
owner waittill( "death" );
|
||||
self notify( "deleteSound" );
|
||||
self thread deleteentontimeout();
|
||||
self thread deleteentaftertime();
|
||||
self endon( "delete" );
|
||||
|
||||
owner waittill( "death" );
|
||||
|
||||
self notify( "deleteSound" );
|
||||
}
|
||||
|
||||
deleteentaftertime()
|
||||
{
|
||||
self endon( "delete" );
|
||||
wait 10;
|
||||
self notify( "deleteSound" );
|
||||
self endon( "delete" );
|
||||
wait 10.0;
|
||||
self notify( "deleteSound" );
|
||||
}
|
||||
|
||||
deleteentontimeout()
|
||||
{
|
||||
self endon( "delete" );
|
||||
self waittill( "deleteSound" );
|
||||
self delete();
|
||||
self endon( "delete" );
|
||||
|
||||
self waittill( "deleteSound" );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
watch_death()
|
||||
{
|
||||
self waittill( "death" );
|
||||
self stoprumble( "proximity_grenade" );
|
||||
self setblur( 0, 0 );
|
||||
self setclientuivisibilityflag( "hud_visible", 1 );
|
||||
self setclientfieldtoplayer( "tazered", 0 );
|
||||
self waittill( "death" );
|
||||
|
||||
self stoprumble( "proximity_grenade" );
|
||||
self setblur( 0, 0 );
|
||||
self setclientuivisibilityflag( "hud_visible", 1 );
|
||||
self setclientfieldtoplayer( "tazered", 0 );
|
||||
}
|
||||
|
@ -1,491 +1,459 @@
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/killstreaks/_killstreak_weapons;
|
||||
#include maps/mp/killstreaks/_killstreaks;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\killstreaks\_killstreaks;
|
||||
#include maps\mp\killstreaks\_killstreak_weapons;
|
||||
#include maps\mp\_scoreevents;
|
||||
|
||||
#using_animtree( "mp_riotshield" );
|
||||
#using_animtree("mp_riotshield");
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !isDefined( level.riotshield_name ) )
|
||||
{
|
||||
level.riotshield_name = "riotshield_mp";
|
||||
if ( isDefined( level.is_zombie_level ) && level.is_zombie_level )
|
||||
{
|
||||
level.riotshield_name = "riotshield_zm";
|
||||
}
|
||||
}
|
||||
level.deployedshieldmodel = "t6_wpn_shield_carry_world";
|
||||
level.stowedshieldmodel = "t6_wpn_shield_stow_world";
|
||||
level.carriedshieldmodel = "t6_wpn_shield_carry_world";
|
||||
level.detectshieldmodel = "t6_wpn_shield_carry_world_detect";
|
||||
if ( isDefined( level.is_zombie_level ) && level.is_zombie_level )
|
||||
{
|
||||
level.deployedshieldmodel = "t6_wpn_zmb_shield_world";
|
||||
level.stowedshieldmodel = "t6_wpn_zmb_shield_stow";
|
||||
level.carriedshieldmodel = "t6_wpn_zmb_shield_world";
|
||||
}
|
||||
precachemodel( level.stowedshieldmodel );
|
||||
precachemodel( level.carriedshieldmodel );
|
||||
precachemodel( level.detectshieldmodel );
|
||||
level.riotshielddestroyanim = %o_riot_stand_destroyed;
|
||||
level.riotshielddeployanim = %o_riot_stand_deploy;
|
||||
level.riotshieldshotanimfront = %o_riot_stand_shot;
|
||||
level.riotshieldshotanimback = %o_riot_stand_shot_back;
|
||||
level.riotshieldmeleeanimfront = %o_riot_stand_melee_front;
|
||||
level.riotshieldmeleeanimback = %o_riot_stand_melee_back;
|
||||
loadfx( "weapon/riotshield/fx_riotshield_depoly_lights" );
|
||||
loadfx( "weapon/riotshield/fx_riotshield_depoly_dust" );
|
||||
level.riotshield_placement_zoffset = 26;
|
||||
if ( !isdefined( level.riotshield_name ) )
|
||||
{
|
||||
level.riotshield_name = "riotshield_mp";
|
||||
|
||||
if ( isdefined( level.is_zombie_level ) && level.is_zombie_level )
|
||||
level.riotshield_name = "riotshield_zm";
|
||||
}
|
||||
|
||||
level.deployedshieldmodel = "t6_wpn_shield_carry_world";
|
||||
level.stowedshieldmodel = "t6_wpn_shield_stow_world";
|
||||
level.carriedshieldmodel = "t6_wpn_shield_carry_world";
|
||||
level.detectshieldmodel = "t6_wpn_shield_carry_world_detect";
|
||||
|
||||
if ( isdefined( level.is_zombie_level ) && level.is_zombie_level )
|
||||
{
|
||||
level.deployedshieldmodel = "t6_wpn_zmb_shield_world";
|
||||
level.stowedshieldmodel = "t6_wpn_zmb_shield_stow";
|
||||
level.carriedshieldmodel = "t6_wpn_zmb_shield_world";
|
||||
}
|
||||
|
||||
precachemodel( level.stowedshieldmodel );
|
||||
precachemodel( level.carriedshieldmodel );
|
||||
precachemodel( level.detectshieldmodel );
|
||||
level.riotshielddestroyanim = %o_riot_stand_destroyed;
|
||||
level.riotshielddeployanim = %o_riot_stand_deploy;
|
||||
level.riotshieldshotanimfront = %o_riot_stand_shot;
|
||||
level.riotshieldshotanimback = %o_riot_stand_shot_back;
|
||||
level.riotshieldmeleeanimfront = %o_riot_stand_melee_front;
|
||||
level.riotshieldmeleeanimback = %o_riot_stand_melee_back;
|
||||
loadfx( "weapon/riotshield/fx_riotshield_depoly_lights" );
|
||||
loadfx( "weapon/riotshield/fx_riotshield_depoly_dust" );
|
||||
level.riotshield_placement_zoffset = 26;
|
||||
}
|
||||
|
||||
register()
|
||||
{
|
||||
registerclientfield( "scriptmover", "riotshield_state", 1, 2, "int" );
|
||||
registerclientfield( "scriptmover", "riotshield_state", 1, 2, "int" );
|
||||
}
|
||||
|
||||
watchpregameclasschange()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "track_riot_shield" );
|
||||
self waittill( "changed_class" );
|
||||
if ( level.ingraceperiod && !self.hasdonecombat )
|
||||
{
|
||||
self clearstowedweapon();
|
||||
self refreshshieldattachment();
|
||||
self thread trackriotshield();
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "track_riot_shield" );
|
||||
|
||||
self waittill( "changed_class" );
|
||||
|
||||
if ( level.ingraceperiod && !self.hasdonecombat )
|
||||
{
|
||||
self clearstowedweapon();
|
||||
self refreshshieldattachment();
|
||||
self thread trackriotshield();
|
||||
}
|
||||
}
|
||||
|
||||
watchriotshieldpickup()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "track_riot_shield" );
|
||||
self notify( "watch_riotshield_pickup" );
|
||||
self endon( "watch_riotshield_pickup" );
|
||||
self waittill( "pickup_riotshield" );
|
||||
self endon( "weapon_change" );
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "track_riot_shield" );
|
||||
self notify( "watch_riotshield_pickup" );
|
||||
self endon( "watch_riotshield_pickup" );
|
||||
|
||||
self waittill( "pickup_riotshield" );
|
||||
|
||||
self endon( "weapon_change" );
|
||||
/#
|
||||
println( "Picked up riotshield, expecting weapon_change notify..." );
|
||||
println( "Picked up riotshield, expecting weapon_change notify..." );
|
||||
#/
|
||||
wait 0,5;
|
||||
wait 0.5;
|
||||
/#
|
||||
println( "picked up shield but didn't change weapons, attach it!" );
|
||||
println( "picked up shield but didn't change weapons, attach it!" );
|
||||
#/
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
self refreshshieldattachment();
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
self refreshshieldattachment();
|
||||
}
|
||||
|
||||
trackriotshield()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self notify( "track_riot_shield" );
|
||||
self endon( "track_riot_shield" );
|
||||
self thread watchpregameclasschange();
|
||||
self waittill( "weapon_change", newweapon );
|
||||
self refreshshieldattachment();
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
self.lastnonshieldweapon = "none";
|
||||
while ( 1 )
|
||||
{
|
||||
self thread watchriotshieldpickup();
|
||||
currentweapon = self getcurrentweapon();
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
refresh_attach = 0;
|
||||
self waittill( "weapon_change", newweapon );
|
||||
if ( newweapon == level.riotshield_name )
|
||||
{
|
||||
refresh_attach = 1;
|
||||
if ( isDefined( self.riotshieldentity ) )
|
||||
{
|
||||
self notify( "destroy_riotshield" );
|
||||
}
|
||||
if ( self.hasriotshield )
|
||||
{
|
||||
if ( isDefined( self.riotshieldtakeweapon ) )
|
||||
{
|
||||
self takeweapon( self.riotshieldtakeweapon );
|
||||
self.riotshieldtakeweapon = undefined;
|
||||
}
|
||||
}
|
||||
if ( isvalidnonshieldweapon( currentweapon ) )
|
||||
{
|
||||
self.lastnonshieldweapon = currentweapon;
|
||||
}
|
||||
}
|
||||
if ( self.hasriotshield || refresh_attach == 1 )
|
||||
{
|
||||
self refreshshieldattachment();
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self notify( "track_riot_shield" );
|
||||
self endon( "track_riot_shield" );
|
||||
self thread watchpregameclasschange();
|
||||
|
||||
self waittill( "weapon_change", newweapon );
|
||||
|
||||
self refreshshieldattachment();
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
self.lastnonshieldweapon = "none";
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self thread watchriotshieldpickup();
|
||||
currentweapon = self getcurrentweapon();
|
||||
self.hasriotshield = self hasweapon( level.riotshield_name );
|
||||
self.hasriotshieldequipped = self getcurrentweapon() == level.riotshield_name;
|
||||
refresh_attach = 0;
|
||||
|
||||
self waittill( "weapon_change", newweapon );
|
||||
|
||||
if ( newweapon == level.riotshield_name )
|
||||
{
|
||||
refresh_attach = 1;
|
||||
|
||||
if ( isdefined( self.riotshieldentity ) )
|
||||
self notify( "destroy_riotshield" );
|
||||
|
||||
if ( self.hasriotshield )
|
||||
{
|
||||
if ( isdefined( self.riotshieldtakeweapon ) )
|
||||
{
|
||||
self takeweapon( self.riotshieldtakeweapon );
|
||||
self.riotshieldtakeweapon = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isvalidnonshieldweapon( currentweapon ) )
|
||||
self.lastnonshieldweapon = currentweapon;
|
||||
}
|
||||
|
||||
if ( self.hasriotshield || refresh_attach == 1 )
|
||||
self refreshshieldattachment();
|
||||
}
|
||||
}
|
||||
|
||||
isvalidnonshieldweapon( weapon )
|
||||
{
|
||||
if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapon ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( maps/mp/killstreaks/_killstreak_weapons::isgameplayweapon( weapon ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( weapon == "none" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isweaponequipment( weapon ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapon ) )
|
||||
return false;
|
||||
|
||||
if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) )
|
||||
return false;
|
||||
|
||||
if ( maps\mp\killstreaks\_killstreak_weapons::isgameplayweapon( weapon ) )
|
||||
return false;
|
||||
|
||||
if ( weapon == "none" )
|
||||
return false;
|
||||
|
||||
if ( isweaponequipment( weapon ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
startriotshielddeploy()
|
||||
{
|
||||
self notify( "start_riotshield_deploy" );
|
||||
self thread watchriotshielddeploy();
|
||||
self notify( "start_riotshield_deploy" );
|
||||
self thread watchriotshielddeploy();
|
||||
}
|
||||
|
||||
resetreconmodelvisibility( owner )
|
||||
{
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self setinvisibletoall();
|
||||
self setforcenocull();
|
||||
if ( !isDefined( owner ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
if ( level.players[ i ] hasperk( "specialty_showenemyequipment" ) )
|
||||
{
|
||||
if ( level.players[ i ].team == "spectator" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
isenemy = 1;
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( level.players[ i ].team == owner.team )
|
||||
{
|
||||
isenemy = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.players[ i ] == owner )
|
||||
{
|
||||
isenemy = 0;
|
||||
}
|
||||
}
|
||||
if ( isenemy )
|
||||
{
|
||||
self setvisibletoplayer( level.players[ i ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
self setinvisibletoall();
|
||||
self setforcenocull();
|
||||
|
||||
if ( !isdefined( owner ) )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
if ( level.players[i] hasperk( "specialty_showenemyequipment" ) )
|
||||
{
|
||||
if ( level.players[i].team == "spectator" )
|
||||
continue;
|
||||
|
||||
isenemy = 1;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( level.players[i].team == owner.team )
|
||||
isenemy = 0;
|
||||
}
|
||||
else if ( level.players[i] == owner )
|
||||
isenemy = 0;
|
||||
|
||||
if ( isenemy )
|
||||
self setvisibletoplayer( level.players[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resetreconmodelonevent( eventname, owner )
|
||||
{
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( eventname, newowner );
|
||||
if ( isDefined( newowner ) )
|
||||
{
|
||||
owner = newowner;
|
||||
}
|
||||
self resetreconmodelvisibility( owner );
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
level waittill( eventname, newowner );
|
||||
|
||||
if ( isdefined( newowner ) )
|
||||
owner = newowner;
|
||||
|
||||
self resetreconmodelvisibility( owner );
|
||||
}
|
||||
}
|
||||
|
||||
attachreconmodel( modelname, owner )
|
||||
{
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
reconmodel = spawn( "script_model", self.origin );
|
||||
reconmodel.angles = self.angles;
|
||||
reconmodel setmodel( modelname );
|
||||
reconmodel.model_name = modelname;
|
||||
reconmodel linkto( self );
|
||||
reconmodel setcontents( 0 );
|
||||
reconmodel resetreconmodelvisibility( owner );
|
||||
reconmodel thread resetreconmodelonevent( "joined_team", owner );
|
||||
reconmodel thread resetreconmodelonevent( "player_spawned", owner );
|
||||
self.reconmodel = reconmodel;
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
reconmodel = spawn( "script_model", self.origin );
|
||||
reconmodel.angles = self.angles;
|
||||
reconmodel setmodel( modelname );
|
||||
reconmodel.model_name = modelname;
|
||||
reconmodel linkto( self );
|
||||
reconmodel setcontents( 0 );
|
||||
reconmodel resetreconmodelvisibility( owner );
|
||||
reconmodel thread resetreconmodelonevent( "joined_team", owner );
|
||||
reconmodel thread resetreconmodelonevent( "player_spawned", owner );
|
||||
self.reconmodel = reconmodel;
|
||||
}
|
||||
|
||||
spawnriotshieldcover( origin, angles )
|
||||
{
|
||||
shield_ent = spawn( "script_model", origin, 1 );
|
||||
shield_ent.targetname = "riotshield_mp";
|
||||
shield_ent.angles = angles;
|
||||
shield_ent setmodel( level.deployedshieldmodel );
|
||||
shield_ent setowner( self );
|
||||
shield_ent.owner = self;
|
||||
shield_ent.team = self.team;
|
||||
shield_ent setteam( self.team );
|
||||
shield_ent attachreconmodel( level.detectshieldmodel, self );
|
||||
shield_ent useanimtree( -1 );
|
||||
shield_ent setscriptmoverflag( 0 );
|
||||
shield_ent disconnectpaths();
|
||||
return shield_ent;
|
||||
shield_ent = spawn( "script_model", origin, 1 );
|
||||
shield_ent.targetname = "riotshield_mp";
|
||||
shield_ent.angles = angles;
|
||||
shield_ent setmodel( level.deployedshieldmodel );
|
||||
shield_ent setowner( self );
|
||||
shield_ent.owner = self;
|
||||
shield_ent.team = self.team;
|
||||
shield_ent setteam( self.team );
|
||||
shield_ent attachreconmodel( level.detectshieldmodel, self );
|
||||
shield_ent useanimtree( -1 );
|
||||
shield_ent setscriptmoverflag( 0 );
|
||||
shield_ent disconnectpaths();
|
||||
return shield_ent;
|
||||
}
|
||||
|
||||
watchriotshielddeploy()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
self waittill( "deploy_riotshield", deploy_attempt );
|
||||
self setheldweaponmodel( 0 );
|
||||
self setplacementhint( 1 );
|
||||
placement_hint = 0;
|
||||
if ( deploy_attempt )
|
||||
{
|
||||
placement = self canplaceriotshield( "deploy_riotshield" );
|
||||
if ( placement[ "result" ] )
|
||||
{
|
||||
self.hasdonecombat = 1;
|
||||
zoffset = level.riotshield_placement_zoffset;
|
||||
shield_ent = self spawnriotshieldcover( placement[ "origin" ] + ( 0, 0, zoffset ), placement[ "angles" ] );
|
||||
item_ent = deployriotshield( self, shield_ent );
|
||||
primaries = self getweaponslistprimaries();
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "start_riotshield_deploy" );
|
||||
|
||||
self waittill( "deploy_riotshield", deploy_attempt );
|
||||
|
||||
self setheldweaponmodel( 0 );
|
||||
self setplacementhint( 1 );
|
||||
placement_hint = 0;
|
||||
|
||||
if ( deploy_attempt )
|
||||
{
|
||||
placement = self canplaceriotshield( "deploy_riotshield" );
|
||||
|
||||
if ( placement["result"] )
|
||||
{
|
||||
self.hasdonecombat = 1;
|
||||
zoffset = level.riotshield_placement_zoffset;
|
||||
shield_ent = self spawnriotshieldcover( placement["origin"] + ( 0, 0, zoffset ), placement["angles"] );
|
||||
item_ent = deployriotshield( self, shield_ent );
|
||||
primaries = self getweaponslistprimaries();
|
||||
/#
|
||||
assert( isDefined( item_ent ) );
|
||||
assert( !isDefined( self.riotshieldretrievetrigger ) );
|
||||
assert( !isDefined( self.riotshieldentity ) );
|
||||
if ( level.gametype != "shrp" )
|
||||
{
|
||||
assert( primaries.size > 0 );
|
||||
assert( isdefined( item_ent ) );
|
||||
assert( !isdefined( self.riotshieldretrievetrigger ) );
|
||||
assert( !isdefined( self.riotshieldentity ) );
|
||||
|
||||
if ( level.gametype != "shrp" )
|
||||
{
|
||||
/#
|
||||
assert( primaries.size > 0 );
|
||||
#/
|
||||
}
|
||||
shield_ent setclientfield( "riotshield_state", 1 );
|
||||
shield_ent.reconmodel setclientfield( "riotshield_state", 1 );
|
||||
if ( level.gametype != "shrp" )
|
||||
{
|
||||
if ( self.lastnonshieldweapon != "none" && self hasweapon( self.lastnonshieldweapon ) )
|
||||
{
|
||||
self switchtoweapon( self.lastnonshieldweapon );
|
||||
}
|
||||
else
|
||||
{
|
||||
self switchtoweapon( primaries[ 0 ] );
|
||||
}
|
||||
}
|
||||
if ( !self hasweapon( "knife_held_mp" ) )
|
||||
{
|
||||
self giveweapon( "knife_held_mp" );
|
||||
self.riotshieldtakeweapon = "knife_held_mp";
|
||||
}
|
||||
self.riotshieldretrievetrigger = item_ent;
|
||||
self.riotshieldentity = shield_ent;
|
||||
self thread watchdeployedriotshieldents();
|
||||
self thread deleteshieldontriggerdeath( self.riotshieldretrievetrigger );
|
||||
self thread deleteshieldonplayerdeathordisconnect( shield_ent );
|
||||
self.riotshieldentity thread watchdeployedriotshielddamage();
|
||||
level notify( "riotshield_planted" );
|
||||
}
|
||||
else
|
||||
{
|
||||
placement_hint = 1;
|
||||
clip_max_ammo = weaponclipsize( level.riotshield_name );
|
||||
self setweaponammoclip( level.riotshield_name, clip_max_ammo );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
placement_hint = 1;
|
||||
}
|
||||
if ( placement_hint )
|
||||
{
|
||||
self setriotshieldfailhint();
|
||||
}
|
||||
}
|
||||
#/
|
||||
shield_ent setclientfield( "riotshield_state", 1 );
|
||||
shield_ent.reconmodel setclientfield( "riotshield_state", 1 );
|
||||
|
||||
if ( level.gametype != "shrp" )
|
||||
{
|
||||
if ( self.lastnonshieldweapon != "none" && self hasweapon( self.lastnonshieldweapon ) )
|
||||
self switchtoweapon( self.lastnonshieldweapon );
|
||||
else
|
||||
self switchtoweapon( primaries[0] );
|
||||
}
|
||||
|
||||
if ( !self hasweapon( "knife_held_mp" ) )
|
||||
{
|
||||
self giveweapon( "knife_held_mp" );
|
||||
self.riotshieldtakeweapon = "knife_held_mp";
|
||||
}
|
||||
|
||||
self.riotshieldretrievetrigger = item_ent;
|
||||
self.riotshieldentity = shield_ent;
|
||||
self thread watchdeployedriotshieldents();
|
||||
self thread deleteshieldontriggerdeath( self.riotshieldretrievetrigger );
|
||||
self thread deleteshieldonplayerdeathordisconnect( shield_ent );
|
||||
self.riotshieldentity thread watchdeployedriotshielddamage();
|
||||
level notify( "riotshield_planted", self );
|
||||
}
|
||||
else
|
||||
{
|
||||
placement_hint = 1;
|
||||
clip_max_ammo = weaponclipsize( level.riotshield_name );
|
||||
self setweaponammoclip( level.riotshield_name, clip_max_ammo );
|
||||
}
|
||||
}
|
||||
else
|
||||
placement_hint = 1;
|
||||
|
||||
if ( placement_hint )
|
||||
self setriotshieldfailhint();
|
||||
}
|
||||
|
||||
riotshielddistancetest( origin )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( origin ) );
|
||||
assert( isdefined( origin ) );
|
||||
#/
|
||||
min_dist_squared = getDvarFloat( "riotshield_deploy_limit_radius" );
|
||||
min_dist_squared *= min_dist_squared;
|
||||
i = 0;
|
||||
while ( i < level.players.size )
|
||||
{
|
||||
if ( isDefined( level.players[ i ].riotshieldentity ) )
|
||||
{
|
||||
dist_squared = distancesquared( level.players[ i ].riotshieldentity.origin, origin );
|
||||
if ( min_dist_squared > dist_squared )
|
||||
{
|
||||
min_dist_squared = getdvarfloat( "riotshield_deploy_limit_radius" );
|
||||
min_dist_squared *= min_dist_squared;
|
||||
|
||||
for ( i = 0; i < level.players.size; i++ )
|
||||
{
|
||||
if ( isdefined( level.players[i].riotshieldentity ) )
|
||||
{
|
||||
dist_squared = distancesquared( level.players[i].riotshieldentity.origin, origin );
|
||||
|
||||
if ( min_dist_squared > dist_squared )
|
||||
{
|
||||
/#
|
||||
println( "Shield placement denied! Failed distance check to other riotshields." );
|
||||
println( "Shield placement denied! Failed distance check to other riotshields." );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
watchdeployedriotshieldents()
|
||||
{
|
||||
/#
|
||||
assert( isDefined( self.riotshieldretrievetrigger ) );
|
||||
assert( isDefined( self.riotshieldentity ) );
|
||||
assert( isdefined( self.riotshieldretrievetrigger ) );
|
||||
assert( isdefined( self.riotshieldentity ) );
|
||||
#/
|
||||
self waittill( "destroy_riotshield" );
|
||||
if ( isDefined( self.riotshieldretrievetrigger ) )
|
||||
{
|
||||
self.riotshieldretrievetrigger delete();
|
||||
}
|
||||
if ( isDefined( self.riotshieldentity ) )
|
||||
{
|
||||
if ( isDefined( self.riotshieldentity.reconmodel ) )
|
||||
{
|
||||
self.riotshieldentity.reconmodel delete();
|
||||
}
|
||||
self.riotshieldentity connectpaths();
|
||||
self.riotshieldentity delete();
|
||||
}
|
||||
self waittill( "destroy_riotshield" );
|
||||
|
||||
if ( isdefined( self.riotshieldretrievetrigger ) )
|
||||
self.riotshieldretrievetrigger delete();
|
||||
|
||||
if ( isdefined( self.riotshieldentity ) )
|
||||
{
|
||||
if ( isdefined( self.riotshieldentity.reconmodel ) )
|
||||
self.riotshieldentity.reconmodel delete();
|
||||
|
||||
self.riotshieldentity connectpaths();
|
||||
self.riotshieldentity delete();
|
||||
}
|
||||
}
|
||||
|
||||
watchdeployedriotshielddamage()
|
||||
{
|
||||
self endon( "death" );
|
||||
damagemax = getDvarInt( "riotshield_deployed_health" );
|
||||
self.damagetaken = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
while ( !isDefined( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
self endon( "death" );
|
||||
damagemax = getdvarint( "riotshield_deployed_health" );
|
||||
self.damagetaken = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
|
||||
if ( !isdefined( attacker ) )
|
||||
continue;
|
||||
/#
|
||||
if ( isDefined( self.owner ) )
|
||||
{
|
||||
assert( isDefined( self.owner.team ) );
|
||||
}
|
||||
assert( isdefined( self.owner ) && isdefined( self.owner.team ) );
|
||||
#/
|
||||
while ( isplayer( attacker ) )
|
||||
{
|
||||
while ( level.teambased && attacker.team == self.owner.team && attacker != self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( type == "MOD_MELEE" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_melee_damage_scale" );
|
||||
}
|
||||
else if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_bullet_damage_scale" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type != "MOD_GRENADE" && type != "MOD_GRENADE_SPLASH" && type != "MOD_EXPLOSIVE" && type != "MOD_EXPLOSIVE_SPLASH" || type == "MOD_PROJECTILE" && type == "MOD_PROJECTILE_SPLASH" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_explosive_damage_scale" );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type == "MOD_IMPACT" )
|
||||
{
|
||||
damage *= getDvarFloat( "riotshield_projectile_damage_scale" );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type == "MOD_CRUSH" )
|
||||
{
|
||||
damage = damagemax;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.damagetaken += damage;
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
self thread damagethendestroyriotshield( attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
if ( isplayer( attacker ) )
|
||||
{
|
||||
if ( level.teambased && attacker.team == self.owner.team && attacker != self.owner )
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( type == "MOD_MELEE" )
|
||||
damage *= getdvarfloat( "riotshield_melee_damage_scale" );
|
||||
else if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" )
|
||||
damage *= getdvarfloat( "riotshield_bullet_damage_scale" );
|
||||
else if ( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_EXPLOSIVE" || type == "MOD_EXPLOSIVE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH" )
|
||||
damage *= getdvarfloat( "riotshield_explosive_damage_scale" );
|
||||
else if ( type == "MOD_IMPACT" )
|
||||
damage *= getdvarfloat( "riotshield_projectile_damage_scale" );
|
||||
else if ( type == "MOD_CRUSH" )
|
||||
damage = damagemax;
|
||||
|
||||
self.damagetaken += damage;
|
||||
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
self thread damagethendestroyriotshield( attacker, weaponname );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
damagethendestroyriotshield( attacker, weaponname )
|
||||
{
|
||||
self notify( "damageThenDestroyRiotshield" );
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.owner.riotshieldretrievetrigger ) )
|
||||
{
|
||||
self.owner.riotshieldretrievetrigger delete();
|
||||
}
|
||||
if ( isDefined( self.reconmodel ) )
|
||||
{
|
||||
self.reconmodel delete();
|
||||
}
|
||||
self connectpaths();
|
||||
self.owner.riotshieldentity = undefined;
|
||||
self notsolid();
|
||||
self setclientfield( "riotshield_state", 2 );
|
||||
if ( isDefined( attacker ) && isDefined( weaponname ) && attacker != self.owner && isplayer( attacker ) )
|
||||
{
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_shield", attacker, self.owner, weaponname );
|
||||
}
|
||||
wait getDvarFloat( "riotshield_destroyed_cleanup_time" );
|
||||
self delete();
|
||||
self notify( "damageThenDestroyRiotshield" );
|
||||
self endon( "death" );
|
||||
|
||||
if ( isdefined( self.owner.riotshieldretrievetrigger ) )
|
||||
self.owner.riotshieldretrievetrigger delete();
|
||||
|
||||
if ( isdefined( self.reconmodel ) )
|
||||
self.reconmodel delete();
|
||||
|
||||
self connectpaths();
|
||||
self.owner.riotshieldentity = undefined;
|
||||
self notsolid();
|
||||
self setclientfield( "riotshield_state", 2 );
|
||||
|
||||
if ( isdefined( attacker ) && isdefined( weaponname ) && attacker != self.owner && isplayer( attacker ) )
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_shield", attacker, self.owner, weaponname );
|
||||
|
||||
wait( getdvarfloat( "riotshield_destroyed_cleanup_time" ) );
|
||||
self delete();
|
||||
}
|
||||
|
||||
deleteshieldontriggerdeath( shield_trigger )
|
||||
{
|
||||
shield_trigger waittill_any( "trigger", "death" );
|
||||
self notify( "destroy_riotshield" );
|
||||
shield_trigger waittill_any( "trigger", "death" );
|
||||
self notify( "destroy_riotshield" );
|
||||
}
|
||||
|
||||
deleteshieldonplayerdeathordisconnect( shield_ent )
|
||||
{
|
||||
shield_ent endon( "death" );
|
||||
shield_ent endon( "damageThenDestroyRiotshield" );
|
||||
self waittill_any( "death", "disconnect", "remove_planted_weapons" );
|
||||
shield_ent thread damagethendestroyriotshield();
|
||||
shield_ent endon( "death" );
|
||||
shield_ent endon( "damageThenDestroyRiotshield" );
|
||||
self waittill_any( "death", "disconnect", "remove_planted_weapons" );
|
||||
shield_ent thread damagethendestroyriotshield();
|
||||
}
|
||||
|
||||
watchriotshieldstuckentitydeath( grenade, owner )
|
||||
{
|
||||
grenade endon( "death" );
|
||||
self waittill_any( "damageThenDestroyRiotshield", "death", "disconnect", "weapon_change", "deploy_riotshield" );
|
||||
grenade detonate( owner );
|
||||
grenade endon( "death" );
|
||||
self waittill_any( "damageThenDestroyRiotshield", "death", "disconnect", "weapon_change", "deploy_riotshield" );
|
||||
grenade detonate( owner );
|
||||
}
|
||||
|
@ -1,46 +1,49 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/killstreaks/_emp;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\killstreaks\_emp;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level._effect[ "satchel_charge_enemy_light" ] = loadfx( "weapon/c4/fx_c4_light_red" );
|
||||
level._effect[ "satchel_charge_friendly_light" ] = loadfx( "weapon/c4/fx_c4_light_green" );
|
||||
level._effect["satchel_charge_enemy_light"] = loadfx( "weapon/c4/fx_c4_light_red" );
|
||||
level._effect["satchel_charge_friendly_light"] = loadfx( "weapon/c4/fx_c4_light_green" );
|
||||
}
|
||||
|
||||
createsatchelwatcher() //checked matches cerberus output
|
||||
createsatchelwatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "satchel_charge", "satchel_charge_mp", self.team );
|
||||
watcher.altdetonate = 1;
|
||||
watcher.watchforfire = 1;
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.headicon = 1;
|
||||
watcher.detonate = ::satcheldetonate;
|
||||
watcher.stun = maps/mp/gametypes/_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 1;
|
||||
watcher.altweapon = "satchel_charge_detonator_mp";
|
||||
watcher.reconmodel = "t6_wpn_c4_world_detect";
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createuseweaponobjectwatcher( "satchel_charge", "satchel_charge_mp", self.team );
|
||||
watcher.altdetonate = 1;
|
||||
watcher.watchforfire = 1;
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.headicon = 1;
|
||||
watcher.detonate = ::satcheldetonate;
|
||||
watcher.stun = maps\mp\gametypes\_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 1;
|
||||
watcher.altweapon = "satchel_charge_detonator_mp";
|
||||
watcher.reconmodel = "t6_wpn_c4_world_detect";
|
||||
watcher.ownergetsassist = 1;
|
||||
}
|
||||
|
||||
satcheldetonate( attacker, weaponname ) //checked matches cerberus output
|
||||
satcheldetonate( attacker, weaponname )
|
||||
{
|
||||
from_emp = maps/mp/killstreaks/_emp::isempkillstreakweapon( weaponname );
|
||||
if ( !isDefined( from_emp ) || !from_emp )
|
||||
{
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedexplosive( weaponname );
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_c4", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
}
|
||||
maps/mp/gametypes/_weaponobjects::weapondetonate( attacker, weaponname );
|
||||
from_emp = maps\mp\killstreaks\_emp::isempkillstreakweapon( weaponname );
|
||||
|
||||
if ( !isdefined( from_emp ) || !from_emp )
|
||||
{
|
||||
if ( isdefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedexplosive( weaponname );
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_c4", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
maps\mp\gametypes\_weaponobjects::weapondetonate( attacker, weaponname );
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,219 +1,193 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/killstreaks/_emp;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\killstreaks\_emp;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\gametypes\_globallogic_player;
|
||||
#include maps\mp\gametypes\_damagefeedback;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level._effect[ "scrambler_enemy_light" ] = loadfx( "misc/fx_equip_light_red" );
|
||||
level._effect[ "scrambler_friendly_light" ] = loadfx( "misc/fx_equip_light_green" );
|
||||
level.scramblerweapon = "scrambler_mp";
|
||||
level.scramblerlength = 30;
|
||||
level.scramblerouterradiussq = 1000000;
|
||||
level.scramblerinnerradiussq = 360000;
|
||||
level._effect["scrambler_enemy_light"] = loadfx( "misc/fx_equip_light_red" );
|
||||
level._effect["scrambler_friendly_light"] = loadfx( "misc/fx_equip_light_green" );
|
||||
level.scramblerweapon = "scrambler_mp";
|
||||
level.scramblerlength = 30.0;
|
||||
level.scramblerouterradiussq = 1000000;
|
||||
level.scramblerinnerradiussq = 360000;
|
||||
}
|
||||
|
||||
createscramblerwatcher() //checked matches cerberus output
|
||||
createscramblerwatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "scrambler", "scrambler_mp", self.team );
|
||||
watcher.onspawn = ::onspawnscrambler;
|
||||
watcher.detonate = ::scramblerdetonate;
|
||||
watcher.stun = maps/mp/gametypes/_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 5;
|
||||
watcher.reconmodel = "t5_weapon_scrambler_world_detect";
|
||||
watcher.hackable = 1;
|
||||
watcher.ondamage = ::watchscramblerdamage;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createuseweaponobjectwatcher( "scrambler", "scrambler_mp", self.team );
|
||||
watcher.onspawn = ::onspawnscrambler;
|
||||
watcher.detonate = ::scramblerdetonate;
|
||||
watcher.stun = maps\mp\gametypes\_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 5;
|
||||
watcher.reconmodel = "t5_weapon_scrambler_world_detect";
|
||||
watcher.hackable = 1;
|
||||
watcher.ondamage = ::watchscramblerdamage;
|
||||
}
|
||||
|
||||
onspawnscrambler( watcher, player ) //checked matches cerberus output
|
||||
onspawnscrambler( watcher, player )
|
||||
{
|
||||
player endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self thread maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
player.scrambler = self;
|
||||
self setowner( player );
|
||||
self setteam( player.team );
|
||||
self.owner = player;
|
||||
self setclientflag( 3 );
|
||||
if ( !self maps/mp/_utility::ishacked() )
|
||||
{
|
||||
player addweaponstat( "scrambler_mp", "used", 1 );
|
||||
}
|
||||
self thread watchshutdown( player );
|
||||
level notify( "scrambler_spawn" );
|
||||
player endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self thread maps\mp\gametypes\_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
player.scrambler = self;
|
||||
self setowner( player );
|
||||
self setteam( player.team );
|
||||
self.owner = player;
|
||||
self setclientflag( 3 );
|
||||
|
||||
if ( !self maps\mp\_utility::ishacked() )
|
||||
player addweaponstat( "scrambler_mp", "used", 1 );
|
||||
|
||||
self thread watchshutdown( player );
|
||||
level notify( "scrambler_spawn" );
|
||||
}
|
||||
|
||||
scramblerdetonate( attacker, weaponname ) //checked matches cerberus output
|
||||
scramblerdetonate( attacker, weaponname )
|
||||
{
|
||||
from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname );
|
||||
if ( !from_emp )
|
||||
{
|
||||
playfx( level._equipment_explode_fx, self.origin );
|
||||
}
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment( weaponname );
|
||||
}
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self delete();
|
||||
from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname );
|
||||
|
||||
if ( !from_emp )
|
||||
playfx( level._equipment_explode_fx, self.origin );
|
||||
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
attacker maps\mp\_challenges::destroyedequipment( weaponname );
|
||||
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self delete();
|
||||
}
|
||||
|
||||
watchshutdown( player ) //checked matches cerberus output
|
||||
watchshutdown( player )
|
||||
{
|
||||
self waittill_any( "death", "hacked" );
|
||||
level notify( "scrambler_death" );
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
player.scrambler = undefined;
|
||||
}
|
||||
self waittill_any( "death", "hacked" );
|
||||
level notify( "scrambler_death" );
|
||||
|
||||
if ( isdefined( player ) )
|
||||
player.scrambler = undefined;
|
||||
}
|
||||
|
||||
destroyent() //checked matches cerberus output
|
||||
destroyent()
|
||||
{
|
||||
self delete();
|
||||
self delete();
|
||||
}
|
||||
|
||||
watchscramblerdamage( watcher ) //checked changed to match beta dump
|
||||
watchscramblerdamage( watcher )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 100;
|
||||
if ( !self maps/mp/_utility::ishacked() )
|
||||
{
|
||||
self.damagetaken = 0;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
if ( !isDefined( attacker ) || !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( level.teambased && attacker.team == self.owner.team && attacker != self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
switch( weaponname )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
case "flash_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
{
|
||||
self thread maps/mp/gametypes/_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
}
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
else if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weaponname = "";
|
||||
}
|
||||
if ( isplayer( attacker ) && level.teambased && isDefined( attacker.team ) && self.owner.team == attacker.team && attacker != self.owner )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( type == "MOD_MELEE" )
|
||||
{
|
||||
self.damagetaken = damagemax;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damagetaken += damage;
|
||||
}
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0, attacker, weaponname );
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 100;
|
||||
|
||||
if ( !self maps\mp\_utility::ishacked() )
|
||||
self.damagetaken = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
|
||||
if ( !isdefined( attacker ) || !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( level.teambased && attacker.team == self.owner.team && attacker != self.owner )
|
||||
continue;
|
||||
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
switch ( weaponname )
|
||||
{
|
||||
case "flash_grenade_mp":
|
||||
case "concussion_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
self thread maps\mp\gametypes\_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
else if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
weaponname = "";
|
||||
|
||||
if ( isplayer( attacker ) && level.teambased && isdefined( attacker.team ) && self.owner.team == attacker.team && attacker != self.owner )
|
||||
continue;
|
||||
|
||||
if ( type == "MOD_MELEE" )
|
||||
self.damagetaken = damagemax;
|
||||
else
|
||||
self.damagetaken += damage;
|
||||
|
||||
if ( self.damagetaken >= damagemax )
|
||||
watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0.0, attacker, weaponname );
|
||||
}
|
||||
}
|
||||
|
||||
ownersameteam( owner1, owner2 ) //checked matches cerberus output
|
||||
ownersameteam( owner1, owner2 )
|
||||
{
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( owner1 ) || !isDefined( owner2 ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( owner1.team ) || !isDefined( owner2.team ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return owner1.team == owner2.team;
|
||||
if ( !level.teambased )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( owner1 ) || !isdefined( owner2 ) )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( owner1.team ) || !isdefined( owner2.team ) )
|
||||
return 0;
|
||||
|
||||
return owner1.team == owner2.team;
|
||||
}
|
||||
|
||||
checkscramblerstun() //checked partially changed to match cerberus output see info.md
|
||||
checkscramblerstun()
|
||||
{
|
||||
scramblers = getentarray( "grenade", "classname" );
|
||||
if ( isDefined( self.name ) && self.name == "scrambler_mp" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < scramblers.size )
|
||||
{
|
||||
scrambler = scramblers[ i ];
|
||||
if ( !isalive( scrambler ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( scrambler.name ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( scrambler.name != "scrambler_mp" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( ownersameteam( self.owner, scrambler.owner ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
flattenedselforigin = ( self.origin[ 0 ], self.origin[ 1 ], 0 );
|
||||
flattenedscramblerorigin = ( scrambler.origin[ 0 ], scrambler.origin[ 1 ], 0 );
|
||||
if ( distancesquared( flattenedselforigin, flattenedscramblerorigin ) < level.scramblerouterradiussq )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
scramblers = getentarray( "grenade", "classname" );
|
||||
|
||||
if ( isdefined( self.name ) && self.name == "scrambler_mp" )
|
||||
return false;
|
||||
|
||||
for ( i = 0; i < scramblers.size; i++ )
|
||||
{
|
||||
scrambler = scramblers[i];
|
||||
|
||||
if ( !isalive( scrambler ) )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( scrambler.name ) )
|
||||
continue;
|
||||
|
||||
if ( scrambler.name != "scrambler_mp" )
|
||||
continue;
|
||||
|
||||
if ( ownersameteam( self.owner, scrambler.owner ) )
|
||||
continue;
|
||||
|
||||
flattenedselforigin = ( self.origin[0], self.origin[1], 0 );
|
||||
flattenedscramblerorigin = ( scrambler.origin[0], scrambler.origin[1], 0 );
|
||||
|
||||
if ( distancesquared( flattenedselforigin, flattenedscramblerorigin ) < level.scramblerouterradiussq )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1,342 +1,291 @@
|
||||
#include maps/mp/_script_gen;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\_script_gen;
|
||||
|
||||
script_gen_dump_checksaved()
|
||||
{
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
if ( !isDefined( level.script_gen_dump2[ signatures[ i ] ] ) )
|
||||
{
|
||||
level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Signature unmatched( removed feature ): " + signatures[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
{
|
||||
if ( !isdefined( level.script_gen_dump2[signatures[i]] ) )
|
||||
{
|
||||
level.script_gen_dump[signatures[i]] = undefined;
|
||||
level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "Signature unmatched( removed feature ): " + signatures[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
script_gen_dump()
|
||||
{
|
||||
/#
|
||||
script_gen_dump_checksaved();
|
||||
if ( !level.script_gen_dump_reasons.size )
|
||||
{
|
||||
flag_set( "scriptgen_done" );
|
||||
return;
|
||||
}
|
||||
firstrun = 0;
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( "^3Dumping scriptgen dump for these reasons" );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
i = 0;
|
||||
while ( i < level.script_gen_dump_reasons.size )
|
||||
{
|
||||
if ( issubstr( level.script_gen_dump_reasons[ i ], "nowrite" ) )
|
||||
{
|
||||
substr = getsubstr( level.script_gen_dump_reasons[ i ], 15 );
|
||||
println( ( i + ". ) " ) + substr );
|
||||
}
|
||||
else
|
||||
{
|
||||
println( ( i + ". ) " ) + level.script_gen_dump_reasons[ i ] );
|
||||
}
|
||||
if ( level.script_gen_dump_reasons[ i ] == "First run" )
|
||||
{
|
||||
firstrun = 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
if ( firstrun )
|
||||
{
|
||||
println( "for First Run make sure you delete all of the vehicle precache script calls, createart calls, createfx calls( most commonly placed in maps\\" + level.script + "_fx.gsc ) " );
|
||||
println( " " );
|
||||
println( "replace:" );
|
||||
println( "maps\\_load::main( 1 );" );
|
||||
println( " " );
|
||||
println( "with( don't forget to add this file to P4 ):" );
|
||||
println( "maps\\scriptgen\\" + level.script + "_scriptgen::main();" );
|
||||
println( " " );
|
||||
}
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
println( "^2 / \\ / \\ / \\" );
|
||||
println( "^2scroll up" );
|
||||
println( "^2 / \\ / \\ / \\" );
|
||||
println( " " );
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
filename = "scriptgen/" + level.script + "_scriptgen.gsc";
|
||||
csvfilename = "zone_source/" + level.script + ".csv";
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
file = openfile( filename, "write" );
|
||||
}
|
||||
else
|
||||
{
|
||||
file = 0;
|
||||
}
|
||||
assert( file != -1, "File not writeable( check it and and restart the map ): " + filename );
|
||||
script_gen_dumpprintln( file, "// script generated script do not write your own script here it will go away if you do." );
|
||||
script_gen_dumpprintln( file, "main()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump = [];" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[ signatures[ i ] ], "nowrite" ) )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\t" + level.script_gen_dump[ signatures[ i ] ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[ signatures[ i ] ], "nowrite" ) )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + """ + signatures[ i ] + """ + " ] = " + """ + signatures[ i ] + """ + ";" );
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + """ + signatures[ i ] + """ + " ] = " + ""nowrite"" + ";" );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
script_gen_dumpprintln( file, "" );
|
||||
keys1 = undefined;
|
||||
keys2 = undefined;
|
||||
if ( isDefined( level.sg_precacheanims ) )
|
||||
{
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
}
|
||||
while ( isDefined( keys1 ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < keys1.size )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tanim_precach_" + keys1[ i ] + "();" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
script_gen_dumpprintln( file, "\tmaps\\_load::main( 1, " + level.bcsvgened + ", 1 );" );
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
if ( isDefined( level.sg_precacheanims ) )
|
||||
{
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
}
|
||||
while ( isDefined( keys1 ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < keys1.size )
|
||||
{
|
||||
script_gen_dumpprintln( file, "#using_animtree( "" + keys1[ i ] + "" );" );
|
||||
script_gen_dumpprintln( file, "anim_precach_" + keys1[ i ] + "()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_animtree[ "" + keys1[ i ] + "" ] = #animtree;" );
|
||||
keys2 = getarraykeys( level.sg_precacheanims[ keys1[ i ] ] );
|
||||
while ( isDefined( keys2 ) )
|
||||
{
|
||||
j = 0;
|
||||
while ( j < keys2.size )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_anim[ "" + keys2[ j ] + "" ] = %" + keys2[ j ] + ";" );
|
||||
j++;
|
||||
}
|
||||
}
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
saved = closefile( file );
|
||||
}
|
||||
else
|
||||
{
|
||||
saved = 1;
|
||||
}
|
||||
if ( level.bcsvgened )
|
||||
{
|
||||
csvfile = openfile( csvfilename, "write" );
|
||||
}
|
||||
else
|
||||
{
|
||||
csvfile = 0;
|
||||
}
|
||||
assert( csvfile != -1, "File not writeable( check it and and restart the map ): " + csvfilename );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
i = 0;
|
||||
while ( i < signatures.size )
|
||||
{
|
||||
script_gen_csvdumpprintln( csvfile, signatures[ i ] );
|
||||
i++;
|
||||
}
|
||||
if ( level.bcsvgened )
|
||||
{
|
||||
csvfilesaved = closefile( csvfile );
|
||||
}
|
||||
else
|
||||
{
|
||||
csvfilesaved = 1;
|
||||
}
|
||||
assert( csvfilesaved == 1, "csv not saved( see above message? ): " + csvfilename );
|
||||
assert( saved == 1, "map not saved( see above message? ): " + filename );
|
||||
script_gen_dump_checksaved();
|
||||
|
||||
if ( !level.script_gen_dump_reasons.size )
|
||||
{
|
||||
flag_set( "scriptgen_done" );
|
||||
return;
|
||||
}
|
||||
|
||||
firstrun = 0;
|
||||
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( " " );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( "^3Dumping scriptgen dump for these reasons" );
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
|
||||
for ( i = 0; i < level.script_gen_dump_reasons.size; i++ )
|
||||
{
|
||||
if ( issubstr( level.script_gen_dump_reasons[i], "nowrite" ) )
|
||||
{
|
||||
substr = getsubstr( level.script_gen_dump_reasons[i], 15 );
|
||||
println( i + ". ) " + substr );
|
||||
}
|
||||
else
|
||||
println( i + ". ) " + level.script_gen_dump_reasons[i] );
|
||||
|
||||
if ( level.script_gen_dump_reasons[i] == "First run" )
|
||||
firstrun = 1;
|
||||
}
|
||||
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
|
||||
if ( firstrun )
|
||||
{
|
||||
println( "for First Run make sure you delete all of the vehicle precache script calls, createart calls, createfx calls( most commonly placed in maps\" + level.script + "_fx.gsc ) " );
|
||||
println( " " );
|
||||
println( "replace:" );
|
||||
println( "maps\_load::main( 1 );" );
|
||||
println( " " );
|
||||
println( "with( don't forget to add this file to P4 ):" );
|
||||
println( "maps\scriptgen\" + level.script + "_scriptgen::main();" );
|
||||
println( " " );
|
||||
}
|
||||
|
||||
println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " );
|
||||
println( " " );
|
||||
println( "^2 / \ / \ / \" );
|
||||
println( "^2scroll up" );
|
||||
println( "^2 / \ / \ / \" );
|
||||
println( " " );
|
||||
}
|
||||
else
|
||||
return;
|
||||
|
||||
filename = "scriptgen/" + level.script + "_scriptgen.gsc";
|
||||
csvfilename = "zone_source/" + level.script + ".csv";
|
||||
|
||||
if ( level.bscriptgened )
|
||||
file = openfile( filename, "write" );
|
||||
else
|
||||
file = 0;
|
||||
|
||||
assert( file != -1, "File not writeable( check it and and restart the map ): " + filename );
|
||||
script_gen_dumpprintln( file, "// script generated script do not write your own script here it will go away if you do." );
|
||||
script_gen_dumpprintln( file, "main()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump = [];" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[signatures[i]], "nowrite" ) )
|
||||
script_gen_dumpprintln( file, "\t" + level.script_gen_dump[signatures[i]] );
|
||||
}
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
{
|
||||
if ( !issubstr( level.script_gen_dump[signatures[i]], "nowrite" ) )
|
||||
{
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + "\"" + signatures[i] + "\"" + " ] = " + "\"" + signatures[i] + "\"" + ";" );
|
||||
continue;
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + "\"" + signatures[i] + "\"" + " ] = " + "\"nowrite\"" + ";" );
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "" );
|
||||
keys1 = undefined;
|
||||
keys2 = undefined;
|
||||
|
||||
if ( isdefined( level.sg_precacheanims ) )
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
|
||||
if ( isdefined( keys1 ) )
|
||||
{
|
||||
for ( i = 0; i < keys1.size; i++ )
|
||||
script_gen_dumpprintln( file, "\tanim_precach_" + keys1[i] + "();" );
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "\tmaps\_load::main( 1, " + level.bcsvgened + ", 1 );" );
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
|
||||
if ( isdefined( level.sg_precacheanims ) )
|
||||
keys1 = getarraykeys( level.sg_precacheanims );
|
||||
|
||||
if ( isdefined( keys1 ) )
|
||||
{
|
||||
for ( i = 0; i < keys1.size; i++ )
|
||||
{
|
||||
script_gen_dumpprintln( file, "#using_animtree( \"" + keys1[i] + "\" );" );
|
||||
script_gen_dumpprintln( file, "anim_precach_" + keys1[i] + "()" );
|
||||
script_gen_dumpprintln( file, "{" );
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_animtree[ \"" + keys1[i] + "\" ] = #animtree;" );
|
||||
keys2 = getarraykeys( level.sg_precacheanims[keys1[i]] );
|
||||
|
||||
if ( isdefined( keys2 ) )
|
||||
{
|
||||
for ( j = 0; j < keys2.size; j++ )
|
||||
script_gen_dumpprintln( file, "\tlevel.sg_anim[ \"" + keys2[j] + "\" ] = %" + keys2[j] + ";" );
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, "}" );
|
||||
script_gen_dumpprintln( file, "" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( level.bscriptgened )
|
||||
saved = closefile( file );
|
||||
else
|
||||
saved = 1;
|
||||
|
||||
if ( level.bcsvgened )
|
||||
csvfile = openfile( csvfilename, "write" );
|
||||
else
|
||||
csvfile = 0;
|
||||
|
||||
assert( csvfile != -1, "File not writeable( check it and and restart the map ): " + csvfilename );
|
||||
signatures = getarraykeys( level.script_gen_dump );
|
||||
|
||||
for ( i = 0; i < signatures.size; i++ )
|
||||
script_gen_csvdumpprintln( csvfile, signatures[i] );
|
||||
|
||||
if ( level.bcsvgened )
|
||||
csvfilesaved = closefile( csvfile );
|
||||
else
|
||||
csvfilesaved = 1;
|
||||
|
||||
assert( csvfilesaved == 1, "csv not saved( see above message? ): " + csvfilename );
|
||||
assert( saved == 1, "map not saved( see above message? ): " + filename );
|
||||
#/
|
||||
/#
|
||||
assert( !level.bscriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" );
|
||||
assert( !level.bscriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" );
|
||||
#/
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
if ( level.bscriptgened )
|
||||
{
|
||||
/#
|
||||
assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" );
|
||||
assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" );
|
||||
#/
|
||||
}
|
||||
flag_set( "scriptgen_done" );
|
||||
}
|
||||
|
||||
flag_set( "scriptgen_done" );
|
||||
}
|
||||
|
||||
script_gen_csvdumpprintln( file, signature )
|
||||
{
|
||||
prefix = undefined;
|
||||
writtenprefix = undefined;
|
||||
path = "";
|
||||
extension = "";
|
||||
if ( issubstr( signature, "ignore" ) )
|
||||
{
|
||||
prefix = "ignore";
|
||||
}
|
||||
else if ( issubstr( signature, "col_map_sp" ) )
|
||||
{
|
||||
prefix = "col_map_sp";
|
||||
}
|
||||
else if ( issubstr( signature, "gfx_map" ) )
|
||||
{
|
||||
prefix = "gfx_map";
|
||||
}
|
||||
else if ( issubstr( signature, "rawfile" ) )
|
||||
{
|
||||
prefix = "rawfile";
|
||||
}
|
||||
else if ( issubstr( signature, "sound" ) )
|
||||
{
|
||||
prefix = "sound";
|
||||
}
|
||||
else if ( issubstr( signature, "xmodel" ) )
|
||||
{
|
||||
prefix = "xmodel";
|
||||
}
|
||||
else if ( issubstr( signature, "xanim" ) )
|
||||
{
|
||||
prefix = "xanim";
|
||||
}
|
||||
else if ( issubstr( signature, "item" ) )
|
||||
{
|
||||
prefix = "item";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else if ( issubstr( signature, "fx" ) )
|
||||
{
|
||||
prefix = "fx";
|
||||
}
|
||||
else if ( issubstr( signature, "menu" ) )
|
||||
{
|
||||
prefix = "menu";
|
||||
writtenprefix = "menufile";
|
||||
path = "ui / scriptmenus/";
|
||||
extension = ".menu";
|
||||
}
|
||||
else if ( issubstr( signature, "rumble" ) )
|
||||
{
|
||||
prefix = "rumble";
|
||||
writtenprefix = "rawfile";
|
||||
path = "rumble/";
|
||||
}
|
||||
else if ( issubstr( signature, "shader" ) )
|
||||
{
|
||||
prefix = "shader";
|
||||
writtenprefix = "material";
|
||||
}
|
||||
else if ( issubstr( signature, "shock" ) )
|
||||
{
|
||||
prefix = "shock";
|
||||
writtenprefix = "rawfile";
|
||||
extension = ".shock";
|
||||
path = "shock/";
|
||||
}
|
||||
else if ( issubstr( signature, "string" ) )
|
||||
{
|
||||
prefix = "string";
|
||||
prefix = undefined;
|
||||
writtenprefix = undefined;
|
||||
path = "";
|
||||
extension = "";
|
||||
|
||||
if ( issubstr( signature, "ignore" ) )
|
||||
prefix = "ignore";
|
||||
else if ( issubstr( signature, "col_map_sp" ) )
|
||||
prefix = "col_map_sp";
|
||||
else if ( issubstr( signature, "gfx_map" ) )
|
||||
prefix = "gfx_map";
|
||||
else if ( issubstr( signature, "rawfile" ) )
|
||||
prefix = "rawfile";
|
||||
else if ( issubstr( signature, "sound" ) )
|
||||
prefix = "sound";
|
||||
else if ( issubstr( signature, "xmodel" ) )
|
||||
prefix = "xmodel";
|
||||
else if ( issubstr( signature, "xanim" ) )
|
||||
prefix = "xanim";
|
||||
else if ( issubstr( signature, "item" ) )
|
||||
{
|
||||
prefix = "item";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else if ( issubstr( signature, "fx" ) )
|
||||
prefix = "fx";
|
||||
else if ( issubstr( signature, "menu" ) )
|
||||
{
|
||||
prefix = "menu";
|
||||
writtenprefix = "menufile";
|
||||
path = "ui / scriptmenus/";
|
||||
extension = ".menu";
|
||||
}
|
||||
else if ( issubstr( signature, "rumble" ) )
|
||||
{
|
||||
prefix = "rumble";
|
||||
writtenprefix = "rawfile";
|
||||
path = "rumble/";
|
||||
}
|
||||
else if ( issubstr( signature, "shader" ) )
|
||||
{
|
||||
prefix = "shader";
|
||||
writtenprefix = "material";
|
||||
}
|
||||
else if ( issubstr( signature, "shock" ) )
|
||||
{
|
||||
prefix = "shock";
|
||||
writtenprefix = "rawfile";
|
||||
extension = ".shock";
|
||||
path = "shock/";
|
||||
}
|
||||
else if ( issubstr( signature, "string" ) )
|
||||
{
|
||||
prefix = "string";
|
||||
/#
|
||||
assertmsg( "string not yet supported by scriptgen" );
|
||||
assertmsg( "string not yet supported by scriptgen" );
|
||||
#/
|
||||
}
|
||||
else if ( issubstr( signature, "turret" ) )
|
||||
{
|
||||
prefix = "turret";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( signature, "vehicle" ) )
|
||||
{
|
||||
prefix = "vehicle";
|
||||
writtenprefix = "rawfile";
|
||||
path = "vehicles/";
|
||||
}
|
||||
}
|
||||
if ( !isDefined( prefix ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( writtenprefix ) )
|
||||
{
|
||||
string = ( prefix + ", " ) + getsubstr( signature, prefix.size + 1, signature.size );
|
||||
}
|
||||
else
|
||||
{
|
||||
string = ( writtenprefix + ", " ) + path + getsubstr( signature, prefix.size + 1, signature.size ) + extension;
|
||||
}
|
||||
}
|
||||
else if ( issubstr( signature, "turret" ) )
|
||||
{
|
||||
prefix = "turret";
|
||||
writtenprefix = "weapon";
|
||||
path = "sp/";
|
||||
}
|
||||
else if ( issubstr( signature, "vehicle" ) )
|
||||
{
|
||||
prefix = "vehicle";
|
||||
writtenprefix = "rawfile";
|
||||
path = "vehicles/";
|
||||
}
|
||||
|
||||
if ( !isdefined( prefix ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( writtenprefix ) )
|
||||
string = prefix + ", " + getsubstr( signature, prefix.size + 1, signature.size );
|
||||
else
|
||||
string = writtenprefix + ", " + path + getsubstr( signature, prefix.size + 1, signature.size ) + extension;
|
||||
/#
|
||||
if ( file == -1 || !level.bcsvgened )
|
||||
{
|
||||
println( string );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintln( file, string );
|
||||
if ( file == -1 || !level.bcsvgened )
|
||||
println( string );
|
||||
else
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
script_gen_dumpprintln( file, string )
|
||||
{
|
||||
/#
|
||||
if ( file == -1 || !level.bscriptgened )
|
||||
{
|
||||
println( string );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintln( file, string );
|
||||
if ( file == -1 || !level.bscriptgened )
|
||||
println( string );
|
||||
else
|
||||
fprintln( file, string );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
@ -1,218 +1,207 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/killstreaks/_emp;
|
||||
#include maps/mp/_hacker_tool;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\_hacker_tool;
|
||||
#include maps\mp\killstreaks\_emp;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_globallogic_player;
|
||||
#include maps\mp\gametypes\_damagefeedback;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.isplayertrackedfunc = ::isplayertracked;
|
||||
level.isplayertrackedfunc = ::isplayertracked;
|
||||
}
|
||||
|
||||
createsensorgrenadewatcher() //checked matches cerberus output
|
||||
createsensorgrenadewatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "sensor_grenade", "sensor_grenade_mp", self.team );
|
||||
watcher.headicon = 0;
|
||||
watcher.onspawn = ::onspawnsensorgrenade;
|
||||
watcher.detonate = ::sensorgrenadedestroyed;
|
||||
watcher.stun = maps/mp/gametypes/_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 0;
|
||||
watcher.reconmodel = "t6_wpn_motion_sensor_world_detect";
|
||||
watcher.ondamage = ::watchsensorgrenadedamage;
|
||||
watcher.enemydestroy = 1;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createuseweaponobjectwatcher( "sensor_grenade", "sensor_grenade_mp", self.team );
|
||||
watcher.headicon = 0;
|
||||
watcher.onspawn = ::onspawnsensorgrenade;
|
||||
watcher.detonate = ::sensorgrenadedestroyed;
|
||||
watcher.stun = maps\mp\gametypes\_weaponobjects::weaponstun;
|
||||
watcher.stuntime = 0;
|
||||
watcher.reconmodel = "t6_wpn_motion_sensor_world_detect";
|
||||
watcher.ondamage = ::watchsensorgrenadedamage;
|
||||
watcher.enemydestroy = 1;
|
||||
}
|
||||
|
||||
onspawnsensorgrenade( watcher, player ) //checked matches cerberus output
|
||||
onspawnsensorgrenade( watcher, player )
|
||||
{
|
||||
self endon( "death" );
|
||||
self thread maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
self setowner( player );
|
||||
self setteam( player.team );
|
||||
self.owner = player;
|
||||
self playloopsound( "fly_sensor_nade_lp" );
|
||||
self maps/mp/_hacker_tool::registerwithhackertool( level.equipmenthackertoolradius, level.equipmenthackertooltimems );
|
||||
player addweaponstat( "sensor_grenade_mp", "used", 1 );
|
||||
self thread watchforstationary( player );
|
||||
self thread watchforexplode( player );
|
||||
self endon( "death" );
|
||||
self thread maps\mp\gametypes\_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
self setowner( player );
|
||||
self setteam( player.team );
|
||||
self.owner = player;
|
||||
self playloopsound( "fly_sensor_nade_lp" );
|
||||
self maps\mp\_hacker_tool::registerwithhackertool( level.equipmenthackertoolradius, level.equipmenthackertooltimems );
|
||||
player addweaponstat( "sensor_grenade_mp", "used", 1 );
|
||||
self thread watchforstationary( player );
|
||||
self thread watchforexplode( player );
|
||||
}
|
||||
|
||||
watchforstationary( owner ) //checked matches cerberus output
|
||||
watchforstationary( owner )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self endon( "explode" );
|
||||
owner endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
self waittill( "stationary" );
|
||||
checkfortracking( self.origin );
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self endon( "explode" );
|
||||
owner endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
|
||||
self waittill( "stationary" );
|
||||
|
||||
checkfortracking( self.origin );
|
||||
}
|
||||
|
||||
watchforexplode( owner ) //checked matches cerberus output
|
||||
watchforexplode( owner )
|
||||
{
|
||||
self endon( "hacked" );
|
||||
self endon( "delete" );
|
||||
owner endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
self waittill( "explode", origin );
|
||||
checkfortracking( origin + ( 0, 0, 1 ) );
|
||||
self endon( "hacked" );
|
||||
self endon( "delete" );
|
||||
owner endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
|
||||
self waittill( "explode", origin );
|
||||
|
||||
checkfortracking( origin + ( 0, 0, 1 ) );
|
||||
}
|
||||
|
||||
checkfortracking( origin ) //checked changed to match cerberus output
|
||||
checkfortracking( origin )
|
||||
{
|
||||
if ( isDefined( self.owner ) == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = level.players;
|
||||
foreach ( player in level.players )
|
||||
{
|
||||
if ( player isenemyplayer( self.owner ) )
|
||||
{
|
||||
if ( !player hasperk( "specialty_nomotionsensor" ) )
|
||||
{
|
||||
if ( distancesquared( player.origin, origin ) < 562500 )
|
||||
{
|
||||
trace = bullettrace( origin, player.origin + vectorScale( ( 0, 0, 1 ), 12 ), 0, player );
|
||||
if ( trace[ "fraction" ] == 1 )
|
||||
{
|
||||
self.owner tracksensorgrenadevictim( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isdefined( self.owner ) == 0 )
|
||||
return;
|
||||
|
||||
players = level.players;
|
||||
|
||||
foreach ( player in level.players )
|
||||
{
|
||||
if ( player isenemyplayer( self.owner ) )
|
||||
{
|
||||
if ( !player hasperk( "specialty_nomotionsensor" ) )
|
||||
{
|
||||
if ( distancesquared( player.origin, origin ) < 562500 )
|
||||
{
|
||||
trace = bullettrace( origin, player.origin + vectorscale( ( 0, 0, 1 ), 12.0 ), 0, player );
|
||||
|
||||
if ( trace["fraction"] == 1 )
|
||||
self.owner tracksensorgrenadevictim( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tracksensorgrenadevictim( victim ) //checked matches cerberus output
|
||||
tracksensorgrenadevictim( victim )
|
||||
{
|
||||
if ( !isDefined( self.sensorgrenadedata ) )
|
||||
{
|
||||
self.sensorgrenadedata = [];
|
||||
}
|
||||
if ( !isDefined( self.sensorgrenadedata[ victim.clientid ] ) )
|
||||
{
|
||||
self.sensorgrenadedata[ victim.clientid ] = getTime();
|
||||
}
|
||||
if ( !isdefined( self.sensorgrenadedata ) )
|
||||
self.sensorgrenadedata = [];
|
||||
|
||||
if ( !isdefined( self.sensorgrenadedata[victim.clientid] ) )
|
||||
self.sensorgrenadedata[victim.clientid] = gettime();
|
||||
}
|
||||
|
||||
isplayertracked( player, time ) //checked matches cerberus output
|
||||
isplayertracked( player, time )
|
||||
{
|
||||
playertracked = 0;
|
||||
if ( isDefined( self.sensorgrenadedata ) && isDefined( self.sensorgrenadedata[ player.clientid ] ) )
|
||||
{
|
||||
if ( ( self.sensorgrenadedata[ player.clientid ] + 10000 ) > time )
|
||||
{
|
||||
playertracked = 1;
|
||||
}
|
||||
}
|
||||
return playertracked;
|
||||
playertracked = 0;
|
||||
|
||||
if ( isdefined( self.sensorgrenadedata ) && isdefined( self.sensorgrenadedata[player.clientid] ) )
|
||||
{
|
||||
if ( self.sensorgrenadedata[player.clientid] + 10000 > time )
|
||||
playertracked = 1;
|
||||
}
|
||||
|
||||
return playertracked;
|
||||
}
|
||||
|
||||
sensorgrenadedestroyed( attacker, weaponname ) //checked matches cerberus output
|
||||
sensorgrenadedestroyed( attacker, weaponname )
|
||||
{
|
||||
from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname );
|
||||
if ( !from_emp )
|
||||
{
|
||||
playfx( level._equipment_explode_fx, self.origin );
|
||||
}
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment( weaponname );
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_motion_sensor", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self delete();
|
||||
from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname );
|
||||
|
||||
if ( !from_emp )
|
||||
playfx( level._equipment_explode_fx, self.origin );
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
{
|
||||
if ( self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedequipment( weaponname );
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_motion_sensor", attacker, self.owner, weaponname );
|
||||
}
|
||||
}
|
||||
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self delete();
|
||||
}
|
||||
|
||||
watchsensorgrenadedamage( watcher ) //checked changed to match beta dump
|
||||
watchsensorgrenadedamage( watcher )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 1;
|
||||
if ( !self maps/mp/_utility::ishacked() )
|
||||
{
|
||||
self.damagetaken = 0;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
if ( !isDefined( attacker ) || !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( level.teambased && isplayer( attacker ) )
|
||||
{
|
||||
if ( !level.hardcoremode && self.owner.team == attacker.pers[ "team" ] && self.owner != attacker )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
switch( weaponname )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
case "flash_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
{
|
||||
self thread maps/mp/gametypes/_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
}
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weaponname = "";
|
||||
}
|
||||
if ( type == "MOD_MELEE" )
|
||||
{
|
||||
self.damagetaken = damagemax;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damagetaken += damage;
|
||||
}
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0, attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 1;
|
||||
|
||||
if ( !self maps\mp\_utility::ishacked() )
|
||||
self.damagetaken = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.maxhealth = 100000;
|
||||
self.health = self.maxhealth;
|
||||
|
||||
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
|
||||
if ( !isdefined( attacker ) || !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( level.teambased && isplayer( attacker ) )
|
||||
{
|
||||
if ( !level.hardcoremode && self.owner.team == attacker.pers["team"] && self.owner != attacker )
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
switch ( weaponname )
|
||||
{
|
||||
case "flash_grenade_mp":
|
||||
case "concussion_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
self thread maps\mp\gametypes\_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
else if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
weaponname = "";
|
||||
|
||||
if ( type == "MOD_MELEE" )
|
||||
self.damagetaken = damagemax;
|
||||
else
|
||||
self.damagetaken += damage;
|
||||
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0.0, attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,61 +1,66 @@
|
||||
//includes match cerberus output
|
||||
#include maps/mp/killstreaks/_dogs;
|
||||
#include maps/mp/killstreaks/_airsupport;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\killstreaks\_airsupport;
|
||||
#include maps\mp\killstreaks\_dogs;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.willypetedamageradius = 300;
|
||||
level.willypetedamageheight = 128;
|
||||
level.sound_smoke_start = "wpn_smoke_hiss_start";
|
||||
level.sound_smoke_loop = "wpn_smoke_hiss_lp";
|
||||
level.sound_smoke_stop = "wpn_smoke_hiss_end";
|
||||
level.smokesoundduration = 8;
|
||||
level.fx_smokegrenade_single = "smoke_center_mp";
|
||||
precacheitem( level.fx_smokegrenade_single );
|
||||
level.willypetedamageradius = 300;
|
||||
level.willypetedamageheight = 128;
|
||||
level.sound_smoke_start = "wpn_smoke_hiss_start";
|
||||
level.sound_smoke_loop = "wpn_smoke_hiss_lp";
|
||||
level.sound_smoke_stop = "wpn_smoke_hiss_end";
|
||||
level.smokesoundduration = 8;
|
||||
level.fx_smokegrenade_single = "smoke_center_mp";
|
||||
precacheitem( level.fx_smokegrenade_single );
|
||||
}
|
||||
|
||||
watchsmokegrenadedetonation( owner ) //checked matches cerberus output
|
||||
watchsmokegrenadedetonation( owner )
|
||||
{
|
||||
owner addweaponstat( "willy_pete_mp", "used", 1 );
|
||||
self waittill( "explode", position, surface );
|
||||
if ( !isDefined( level.water_duds ) || level.water_duds == 1 )
|
||||
{
|
||||
if ( isDefined( surface ) && surface == "water" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
onefoot = vectorScale( ( 0, 0, 1 ), 12 );
|
||||
startpos = position + onefoot;
|
||||
ent = spawntimedfx( level.fx_smokegrenade_single, position, ( 0, 0, 1 ), 12 );
|
||||
ent thread blocksight();
|
||||
if ( isDefined( owner ) )
|
||||
{
|
||||
owner.smokegrenadetime = getTime();
|
||||
owner.smokegrenadeposition = position;
|
||||
}
|
||||
thread playsmokesound( position, level.smokesoundduration, level.sound_smoke_start, level.sound_smoke_stop, level.sound_smoke_loop );
|
||||
damageeffectarea( owner, startpos, level.willypetedamageradius, level.willypetedamageheight, undefined );
|
||||
owner addweaponstat( "willy_pete_mp", "used", 1 );
|
||||
|
||||
self waittill( "explode", position, surface );
|
||||
|
||||
if ( !isdefined( level.water_duds ) || level.water_duds == 1 )
|
||||
{
|
||||
if ( isdefined( surface ) && surface == "water" )
|
||||
return;
|
||||
}
|
||||
|
||||
onefoot = vectorscale( ( 0, 0, 1 ), 12.0 );
|
||||
startpos = position + onefoot;
|
||||
ent = spawntimedfx( level.fx_smokegrenade_single, position, ( 0, 0, 1 ), 12 );
|
||||
ent thread blocksight();
|
||||
|
||||
if ( isdefined( owner ) )
|
||||
{
|
||||
owner.smokegrenadetime = gettime();
|
||||
owner.smokegrenadeposition = position;
|
||||
}
|
||||
|
||||
thread playsmokesound( position, level.smokesoundduration, level.sound_smoke_start, level.sound_smoke_stop, level.sound_smoke_loop );
|
||||
damageeffectarea( owner, startpos, level.willypetedamageradius, level.willypetedamageheight, undefined );
|
||||
}
|
||||
|
||||
damageeffectarea( owner, position, radius, height, killcament ) //checked matches cerberus output
|
||||
damageeffectarea( owner, position, radius, height, killcament )
|
||||
{
|
||||
effectarea = spawn( "trigger_radius", position, 0, radius, height );
|
||||
owner thread maps/mp/killstreaks/_dogs::flash_dogs( effectarea );
|
||||
effectarea delete();
|
||||
effectarea = spawn( "trigger_radius", position, 0, radius, height );
|
||||
owner thread maps\mp\killstreaks\_dogs::flash_dogs( effectarea );
|
||||
effectarea delete();
|
||||
}
|
||||
|
||||
blocksight() //checked matches cerberus output
|
||||
blocksight()
|
||||
{
|
||||
self endon( "death" );
|
||||
radius = 64;
|
||||
fxblocksight( self, radius );
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0.75;
|
||||
radius = clamp( radius * 1.5, 10, 150 );
|
||||
fxblocksight( self, radius );
|
||||
}
|
||||
self endon( "death" );
|
||||
radius = 64;
|
||||
fxblocksight( self, radius );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.75;
|
||||
radius = clamp( radius * 1.5, 10, 150 );
|
||||
fxblocksight( self, radius );
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,15 @@
|
||||
//checked includes match cerberus output
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
|
||||
loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" );
|
||||
}
|
||||
|
||||
watch_bolt_detonation( owner ) //checked matches cerberus output
|
||||
watch_bolt_detonation( owner )
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -1,566 +1,517 @@
|
||||
#include maps/mp/gametypes/_battlechatter_mp;
|
||||
#include maps/mp/killstreaks/_dogs;
|
||||
#include maps/mp/killstreaks/_airsupport;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\killstreaks\_airsupport;
|
||||
#include maps\mp\killstreaks\_dogs;
|
||||
#include maps\mp\gametypes\_battlechatter_mp;
|
||||
|
||||
init()
|
||||
{
|
||||
level.tabuninitialgasshockduration = weapons_get_dvar_int( "scr_tabunInitialGasShockDuration", "7" );
|
||||
level.tabunwalkingasshockduration = weapons_get_dvar_int( "scr_tabunWalkInGasShockDuration", "4" );
|
||||
level.tabungasshockradius = weapons_get_dvar_int( "scr_tabun_shock_radius", "185" );
|
||||
level.tabungasshockheight = weapons_get_dvar_int( "scr_tabun_shock_height", "20" );
|
||||
level.tabungaspoisonradius = weapons_get_dvar_int( "scr_tabun_effect_radius", "185" );
|
||||
level.tabungaspoisonheight = weapons_get_dvar_int( "scr_tabun_shock_height", "20" );
|
||||
level.tabungasduration = weapons_get_dvar_int( "scr_tabunGasDuration", "8" );
|
||||
level.poisonduration = weapons_get_dvar_int( "scr_poisonDuration", "8" );
|
||||
level.poisondamage = weapons_get_dvar_int( "scr_poisonDamage", "13" );
|
||||
level.poisondamagehardcore = weapons_get_dvar_int( "scr_poisonDamageHardcore", "5" );
|
||||
level.fx_tabun_0 = "tabun_tiny_mp";
|
||||
level.fx_tabun_1 = "tabun_small_mp";
|
||||
level.fx_tabun_2 = "tabun_medium_mp";
|
||||
level.fx_tabun_3 = "tabun_large_mp";
|
||||
level.fx_tabun_single = "tabun_center_mp";
|
||||
precacheitem( level.fx_tabun_0 );
|
||||
precacheitem( level.fx_tabun_1 );
|
||||
precacheitem( level.fx_tabun_2 );
|
||||
precacheitem( level.fx_tabun_3 );
|
||||
precacheitem( level.fx_tabun_single );
|
||||
level.fx_tabun_radius0 = weapons_get_dvar_int( "scr_fx_tabun_radius0", 55 );
|
||||
level.fx_tabun_radius1 = weapons_get_dvar_int( "scr_fx_tabun_radius1", 55 );
|
||||
level.fx_tabun_radius2 = weapons_get_dvar_int( "scr_fx_tabun_radius2", 50 );
|
||||
level.fx_tabun_radius3 = weapons_get_dvar_int( "scr_fx_tabun_radius3", 25 );
|
||||
level.sound_tabun_start = "wpn_gas_hiss_start";
|
||||
level.sound_tabun_loop = "wpn_gas_hiss_lp";
|
||||
level.sound_tabun_stop = "wpn_gas_hiss_end";
|
||||
level.sound_shock_tabun_start = "";
|
||||
level.sound_shock_tabun_loop = "";
|
||||
level.sound_shock_tabun_stop = "";
|
||||
level.tabuninitialgasshockduration = weapons_get_dvar_int( "scr_tabunInitialGasShockDuration", "7" );
|
||||
level.tabunwalkingasshockduration = weapons_get_dvar_int( "scr_tabunWalkInGasShockDuration", "4" );
|
||||
level.tabungasshockradius = weapons_get_dvar_int( "scr_tabun_shock_radius", "185" );
|
||||
level.tabungasshockheight = weapons_get_dvar_int( "scr_tabun_shock_height", "20" );
|
||||
level.tabungaspoisonradius = weapons_get_dvar_int( "scr_tabun_effect_radius", "185" );
|
||||
level.tabungaspoisonheight = weapons_get_dvar_int( "scr_tabun_shock_height", "20" );
|
||||
level.tabungasduration = weapons_get_dvar_int( "scr_tabunGasDuration", "8" );
|
||||
level.poisonduration = weapons_get_dvar_int( "scr_poisonDuration", "8" );
|
||||
level.poisondamage = weapons_get_dvar_int( "scr_poisonDamage", "13" );
|
||||
level.poisondamagehardcore = weapons_get_dvar_int( "scr_poisonDamageHardcore", "5" );
|
||||
level.fx_tabun_0 = "tabun_tiny_mp";
|
||||
level.fx_tabun_1 = "tabun_small_mp";
|
||||
level.fx_tabun_2 = "tabun_medium_mp";
|
||||
level.fx_tabun_3 = "tabun_large_mp";
|
||||
level.fx_tabun_single = "tabun_center_mp";
|
||||
precacheitem( level.fx_tabun_0 );
|
||||
precacheitem( level.fx_tabun_1 );
|
||||
precacheitem( level.fx_tabun_2 );
|
||||
precacheitem( level.fx_tabun_3 );
|
||||
precacheitem( level.fx_tabun_single );
|
||||
level.fx_tabun_radius0 = weapons_get_dvar_int( "scr_fx_tabun_radius0", 55 );
|
||||
level.fx_tabun_radius1 = weapons_get_dvar_int( "scr_fx_tabun_radius1", 55 );
|
||||
level.fx_tabun_radius2 = weapons_get_dvar_int( "scr_fx_tabun_radius2", 50 );
|
||||
level.fx_tabun_radius3 = weapons_get_dvar_int( "scr_fx_tabun_radius3", 25 );
|
||||
level.sound_tabun_start = "wpn_gas_hiss_start";
|
||||
level.sound_tabun_loop = "wpn_gas_hiss_lp";
|
||||
level.sound_tabun_stop = "wpn_gas_hiss_end";
|
||||
level.sound_shock_tabun_start = "";
|
||||
level.sound_shock_tabun_loop = "";
|
||||
level.sound_shock_tabun_stop = "";
|
||||
/#
|
||||
level thread checkdvarupdates();
|
||||
level thread checkdvarupdates();
|
||||
#/
|
||||
}
|
||||
|
||||
checkdvarupdates()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level.tabungaspoisonradius = weapons_get_dvar_int( "scr_tabun_effect_radius", level.tabungaspoisonradius );
|
||||
level.tabungaspoisonheight = weapons_get_dvar_int( "scr_tabun_shock_height", level.tabungaspoisonheight );
|
||||
level.tabungasshockradius = weapons_get_dvar_int( "scr_tabun_shock_radius", level.tabungasshockradius );
|
||||
level.tabungasshockheight = weapons_get_dvar_int( "scr_tabun_shock_height", level.tabungasshockheight );
|
||||
level.tabuninitialgasshockduration = weapons_get_dvar_int( "scr_tabunInitialGasShockDuration", level.tabuninitialgasshockduration );
|
||||
level.tabunwalkingasshockduration = weapons_get_dvar_int( "scr_tabunWalkInGasShockDuration", level.tabunwalkingasshockduration );
|
||||
level.tabungasduration = weapons_get_dvar_int( "scr_tabunGasDuration", level.tabungasduration );
|
||||
level.poisonduration = weapons_get_dvar_int( "scr_poisonDuration", level.poisonduration );
|
||||
level.poisondamage = weapons_get_dvar_int( "scr_poisonDamage", level.poisondamage );
|
||||
level.poisondamagehardcore = weapons_get_dvar_int( "scr_poisonDamageHardcore", level.poisondamagehardcore );
|
||||
level.fx_tabun_radius0 = weapons_get_dvar_int( "scr_fx_tabun_radius0", level.fx_tabun_radius0 );
|
||||
level.fx_tabun_radius1 = weapons_get_dvar_int( "scr_fx_tabun_radius1", level.fx_tabun_radius1 );
|
||||
level.fx_tabun_radius2 = weapons_get_dvar_int( "scr_fx_tabun_radius2", level.fx_tabun_radius2 );
|
||||
level.fx_tabun_radius3 = weapons_get_dvar_int( "scr_fx_tabun_radius3", level.fx_tabun_radius3 );
|
||||
wait 1;
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
level.tabungaspoisonradius = weapons_get_dvar_int( "scr_tabun_effect_radius", level.tabungaspoisonradius );
|
||||
level.tabungaspoisonheight = weapons_get_dvar_int( "scr_tabun_shock_height", level.tabungaspoisonheight );
|
||||
level.tabungasshockradius = weapons_get_dvar_int( "scr_tabun_shock_radius", level.tabungasshockradius );
|
||||
level.tabungasshockheight = weapons_get_dvar_int( "scr_tabun_shock_height", level.tabungasshockheight );
|
||||
level.tabuninitialgasshockduration = weapons_get_dvar_int( "scr_tabunInitialGasShockDuration", level.tabuninitialgasshockduration );
|
||||
level.tabunwalkingasshockduration = weapons_get_dvar_int( "scr_tabunWalkInGasShockDuration", level.tabunwalkingasshockduration );
|
||||
level.tabungasduration = weapons_get_dvar_int( "scr_tabunGasDuration", level.tabungasduration );
|
||||
level.poisonduration = weapons_get_dvar_int( "scr_poisonDuration", level.poisonduration );
|
||||
level.poisondamage = weapons_get_dvar_int( "scr_poisonDamage", level.poisondamage );
|
||||
level.poisondamagehardcore = weapons_get_dvar_int( "scr_poisonDamageHardcore", level.poisondamagehardcore );
|
||||
level.fx_tabun_radius0 = weapons_get_dvar_int( "scr_fx_tabun_radius0", level.fx_tabun_radius0 );
|
||||
level.fx_tabun_radius1 = weapons_get_dvar_int( "scr_fx_tabun_radius1", level.fx_tabun_radius1 );
|
||||
level.fx_tabun_radius2 = weapons_get_dvar_int( "scr_fx_tabun_radius2", level.fx_tabun_radius2 );
|
||||
level.fx_tabun_radius3 = weapons_get_dvar_int( "scr_fx_tabun_radius3", level.fx_tabun_radius3 );
|
||||
wait 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
watchtabungrenadedetonation( owner )
|
||||
{
|
||||
self waittill( "explode", position, surface );
|
||||
if ( !isDefined( level.water_duds ) || level.water_duds == 1 )
|
||||
{
|
||||
if ( isDefined( surface ) && surface == "water" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( weapons_get_dvar_int( "scr_enable_new_tabun", 1 ) )
|
||||
{
|
||||
generatelocations( position, owner );
|
||||
}
|
||||
else
|
||||
{
|
||||
singlelocation( position, owner );
|
||||
}
|
||||
self waittill( "explode", position, surface );
|
||||
|
||||
if ( !isdefined( level.water_duds ) || level.water_duds == 1 )
|
||||
{
|
||||
if ( isdefined( surface ) && surface == "water" )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( weapons_get_dvar_int( "scr_enable_new_tabun", 1 ) )
|
||||
generatelocations( position, owner );
|
||||
else
|
||||
singlelocation( position, owner );
|
||||
}
|
||||
|
||||
damageeffectarea( owner, position, radius, height, killcament )
|
||||
{
|
||||
shockeffectarea = spawn( "trigger_radius", position, 0, radius, height );
|
||||
gaseffectarea = spawn( "trigger_radius", position, 0, radius, height );
|
||||
shockeffectarea = spawn( "trigger_radius", position, 0, radius, height );
|
||||
gaseffectarea = spawn( "trigger_radius", position, 0, radius, height );
|
||||
/#
|
||||
if ( getDvarInt( "scr_draw_triggers" ) )
|
||||
{
|
||||
level thread drawcylinder( position, radius, height, undefined, "tabun_draw_cylinder_stop" );
|
||||
if ( getdvarint( "scr_draw_triggers" ) )
|
||||
level thread drawcylinder( position, radius, height, undefined, "tabun_draw_cylinder_stop" );
|
||||
#/
|
||||
}
|
||||
owner thread maps/mp/killstreaks/_dogs::flash_dogs( shockeffectarea );
|
||||
owner thread maps/mp/killstreaks/_dogs::flash_dogs( gaseffectarea );
|
||||
loopwaittime = 0,5;
|
||||
durationoftabun = level.tabungasduration;
|
||||
while ( durationoftabun > 0 )
|
||||
{
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( players[ i ] != owner )
|
||||
{
|
||||
if ( !isDefined( owner ) || !isDefined( owner.team ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.teambased && players[ i ].team == owner.team )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( players[ i ].inpoisonarea ) || players[ i ].inpoisonarea == 0 )
|
||||
{
|
||||
if ( players[ i ] istouching( gaseffectarea ) && players[ i ].sessionstate == "playing" )
|
||||
{
|
||||
if ( !players[ i ] hasperk( "specialty_proximityprotection" ) )
|
||||
{
|
||||
trace = bullettrace( position, players[ i ].origin + vectorScale( ( 0, 0, 0 ), 12 ), 0, players[ i ] );
|
||||
if ( trace[ "fraction" ] == 1 )
|
||||
{
|
||||
players[ i ].lastpoisonedby = owner;
|
||||
players[ i ] thread damageinpoisonarea( shockeffectarea, killcament, trace, position );
|
||||
}
|
||||
}
|
||||
players[ i ] thread maps/mp/gametypes/_battlechatter_mp::incomingspecialgrenadetracking( "gas" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait loopwaittime;
|
||||
durationoftabun -= loopwaittime;
|
||||
}
|
||||
if ( level.tabungasduration < level.poisonduration )
|
||||
{
|
||||
wait ( level.poisonduration - level.tabungasduration );
|
||||
}
|
||||
shockeffectarea delete();
|
||||
gaseffectarea delete();
|
||||
owner thread maps\mp\killstreaks\_dogs::flash_dogs( shockeffectarea );
|
||||
owner thread maps\mp\killstreaks\_dogs::flash_dogs( gaseffectarea );
|
||||
loopwaittime = 0.5;
|
||||
|
||||
for ( durationoftabun = level.tabungasduration; durationoftabun > 0; durationoftabun -= loopwaittime )
|
||||
{
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( players[i] != owner )
|
||||
{
|
||||
if ( !isdefined( owner ) || !isdefined( owner.team ) )
|
||||
continue;
|
||||
|
||||
if ( level.teambased && players[i].team == owner.team )
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isdefined( players[i].inpoisonarea ) || players[i].inpoisonarea == 0 )
|
||||
{
|
||||
if ( players[i] istouching( gaseffectarea ) && players[i].sessionstate == "playing" )
|
||||
{
|
||||
if ( !players[i] hasperk( "specialty_proximityprotection" ) )
|
||||
{
|
||||
trace = bullettrace( position, players[i].origin + vectorscale( ( 0, 0, 1 ), 12.0 ), 0, players[i] );
|
||||
|
||||
if ( trace["fraction"] == 1 )
|
||||
{
|
||||
players[i].lastpoisonedby = owner;
|
||||
players[i] thread damageinpoisonarea( shockeffectarea, killcament, trace, position );
|
||||
}
|
||||
}
|
||||
|
||||
players[i] thread maps\mp\gametypes\_battlechatter_mp::incomingspecialgrenadetracking( "gas" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wait( loopwaittime );
|
||||
}
|
||||
|
||||
if ( level.tabungasduration < level.poisonduration )
|
||||
wait( level.poisonduration - level.tabungasduration );
|
||||
|
||||
shockeffectarea delete();
|
||||
gaseffectarea delete();
|
||||
/#
|
||||
if ( getDvarInt( "scr_draw_triggers" ) )
|
||||
{
|
||||
level notify( "tabun_draw_cylinder_stop" );
|
||||
if ( getdvarint( "scr_draw_triggers" ) )
|
||||
level notify( "tabun_draw_cylinder_stop" );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
damageinpoisonarea( gaseffectarea, killcament, trace, position )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self thread watch_death();
|
||||
self.inpoisonarea = 1;
|
||||
self startpoisoning();
|
||||
tabunshocksound = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
tabunshocksound thread deleteentonownerdeath( self );
|
||||
tabunshocksound.origin = position;
|
||||
tabunshocksound playsound( level.sound_shock_tabun_start );
|
||||
tabunshocksound playloopsound( level.sound_shock_tabun_loop );
|
||||
timer = 0;
|
||||
while ( trace[ "fraction" ] == 1 && isDefined( gaseffectarea ) && self istouching( gaseffectarea ) && self.sessionstate == "playing" && isDefined( self.lastpoisonedby ) )
|
||||
{
|
||||
damage = level.poisondamage;
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
damage = level.poisondamagehardcore;
|
||||
}
|
||||
self dodamage( damage, gaseffectarea.origin, self.lastpoisonedby, killcament, "none", "MOD_GAS", 0, "tabun_gas_mp" );
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
switch( timer )
|
||||
{
|
||||
case 0:
|
||||
self shellshock( "tabun_gas_mp", 1 );
|
||||
break;
|
||||
timer++;
|
||||
continue;
|
||||
case 1:
|
||||
self shellshock( "tabun_gas_nokick_mp", 1 );
|
||||
break;
|
||||
timer++;
|
||||
continue;
|
||||
default:
|
||||
}
|
||||
timer++;
|
||||
if ( timer >= 2 )
|
||||
{
|
||||
timer = 0;
|
||||
}
|
||||
self hide_hud();
|
||||
}
|
||||
wait 1;
|
||||
trace = bullettrace( position, self.origin + vectorScale( ( 0, 0, 0 ), 12 ), 0, self );
|
||||
}
|
||||
tabunshocksound stoploopsound( 0,5 );
|
||||
wait 0,5;
|
||||
thread playsoundinspace( level.sound_shock_tabun_stop, position );
|
||||
wait 0,5;
|
||||
tabunshocksound notify( "delete" );
|
||||
tabunshocksound delete();
|
||||
self show_hud();
|
||||
self stoppoisoning();
|
||||
self.inpoisonarea = 0;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self thread watch_death();
|
||||
self.inpoisonarea = 1;
|
||||
self startpoisoning();
|
||||
tabunshocksound = spawn( "script_origin", ( 0, 0, 1 ) );
|
||||
tabunshocksound thread deleteentonownerdeath( self );
|
||||
tabunshocksound.origin = position;
|
||||
tabunshocksound playsound( level.sound_shock_tabun_start );
|
||||
tabunshocksound playloopsound( level.sound_shock_tabun_loop );
|
||||
timer = 0;
|
||||
|
||||
while ( trace["fraction"] == 1 && isdefined( gaseffectarea ) && self istouching( gaseffectarea ) && self.sessionstate == "playing" && isdefined( self.lastpoisonedby ) )
|
||||
{
|
||||
damage = level.poisondamage;
|
||||
|
||||
if ( level.hardcoremode )
|
||||
damage = level.poisondamagehardcore;
|
||||
|
||||
self dodamage( damage, gaseffectarea.origin, self.lastpoisonedby, killcament, "none", "MOD_GAS", 0, "tabun_gas_mp" );
|
||||
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
switch ( timer )
|
||||
{
|
||||
case "0":
|
||||
self shellshock( "tabun_gas_mp", 1.0 );
|
||||
break;
|
||||
case "1":
|
||||
self shellshock( "tabun_gas_nokick_mp", 1.0 );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
timer++;
|
||||
|
||||
if ( timer >= 2 )
|
||||
timer = 0;
|
||||
|
||||
self hide_hud();
|
||||
}
|
||||
|
||||
wait 1.0;
|
||||
trace = bullettrace( position, self.origin + vectorscale( ( 0, 0, 1 ), 12.0 ), 0, self );
|
||||
}
|
||||
|
||||
tabunshocksound stoploopsound( 0.5 );
|
||||
wait 0.5;
|
||||
thread playsoundinspace( level.sound_shock_tabun_stop, position );
|
||||
wait 0.5;
|
||||
tabunshocksound notify( "delete" );
|
||||
tabunshocksound delete();
|
||||
self show_hud();
|
||||
self stoppoisoning();
|
||||
self.inpoisonarea = 0;
|
||||
}
|
||||
|
||||
deleteentonownerdeath( owner )
|
||||
{
|
||||
self endon( "delete" );
|
||||
owner waittill( "death" );
|
||||
self delete();
|
||||
self endon( "delete" );
|
||||
|
||||
owner waittill( "death" );
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
watch_death()
|
||||
{
|
||||
self waittill( "death" );
|
||||
self show_hud();
|
||||
self waittill( "death" );
|
||||
|
||||
self show_hud();
|
||||
}
|
||||
|
||||
hide_hud()
|
||||
{
|
||||
self setclientuivisibilityflag( "hud_visible", 0 );
|
||||
self setclientuivisibilityflag( "hud_visible", 0 );
|
||||
}
|
||||
|
||||
show_hud()
|
||||
{
|
||||
self setclientuivisibilityflag( "hud_visible", 1 );
|
||||
self setclientuivisibilityflag( "hud_visible", 1 );
|
||||
}
|
||||
|
||||
weapons_get_dvar_int( dvar, def )
|
||||
{
|
||||
return int( weapons_get_dvar( dvar, def ) );
|
||||
return int( weapons_get_dvar( dvar, def ) );
|
||||
}
|
||||
|
||||
weapons_get_dvar( dvar, def )
|
||||
{
|
||||
if ( getDvar( dvar ) != "" )
|
||||
{
|
||||
return getDvarFloat( dvar );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( dvar, def );
|
||||
return def;
|
||||
}
|
||||
if ( getdvar( dvar ) != "" )
|
||||
return getdvarfloat( dvar );
|
||||
else
|
||||
{
|
||||
setdvar( dvar, def );
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
generatelocations( position, owner )
|
||||
{
|
||||
onefoot = vectorScale( ( 0, 0, 0 ), 12 );
|
||||
startpos = position + onefoot;
|
||||
onefoot = vectorscale( ( 0, 0, 1 ), 12.0 );
|
||||
startpos = position + onefoot;
|
||||
/#
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
black = vectorScale( ( 0, 0, 0 ), 0,2 );
|
||||
debugstar( startpos, 2000, black );
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
black = vectorscale( ( 1, 1, 1 ), 0.2 );
|
||||
debugstar( startpos, 2000, black );
|
||||
}
|
||||
#/
|
||||
}
|
||||
spawnalllocs( owner, startpos );
|
||||
spawnalllocs( owner, startpos );
|
||||
}
|
||||
|
||||
singlelocation( position, owner )
|
||||
{
|
||||
spawntimedfx( level.fx_tabun_single, position );
|
||||
killcament = spawn( "script_model", position + vectorScale( ( 0, 0, 0 ), 60 ) );
|
||||
killcament deleteaftertime( 15 );
|
||||
killcament.starttime = getTime();
|
||||
damageeffectarea( owner, position, level.tabungaspoisonradius, level.tabungaspoisonheight, killcament );
|
||||
spawntimedfx( level.fx_tabun_single, position );
|
||||
killcament = spawn( "script_model", position + vectorscale( ( 0, 0, 1 ), 60.0 ) );
|
||||
killcament deleteaftertime( 15.0 );
|
||||
killcament.starttime = gettime();
|
||||
damageeffectarea( owner, position, level.tabungaspoisonradius, level.tabungaspoisonheight, killcament );
|
||||
}
|
||||
|
||||
hitpos( start, end, color )
|
||||
{
|
||||
trace = bullettrace( start, end, 0, undefined );
|
||||
trace = bullettrace( start, end, 0, undefined );
|
||||
/#
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
debugstar( trace[ "position" ], 2000, color );
|
||||
}
|
||||
thread debug_line( start, trace[ "position" ], color, 80 );
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
|
||||
if ( level.tabun_debug )
|
||||
debugstar( trace["position"], 2000, color );
|
||||
|
||||
thread debug_line( start, trace["position"], color, 80 );
|
||||
#/
|
||||
return trace[ "position" ];
|
||||
return trace["position"];
|
||||
}
|
||||
|
||||
spawnalllocs( owner, startpos )
|
||||
{
|
||||
defaultdistance = weapons_get_dvar_int( "scr_defaultDistanceTabun", 220 );
|
||||
cos45 = 0,707;
|
||||
negcos45 = -0,707;
|
||||
red = ( 0,9, 0,2, 0,2 );
|
||||
blue = ( 0,2, 0,2, 0,9 );
|
||||
green = ( 0,2, 0,9, 0,2 );
|
||||
white = vectorScale( ( 0, 0, 0 ), 0,9 );
|
||||
north = startpos + ( defaultdistance, 0, 0 );
|
||||
south = startpos - ( defaultdistance, 0, 0 );
|
||||
east = startpos + ( 0, defaultdistance, 0 );
|
||||
west = startpos - ( 0, defaultdistance, 0 );
|
||||
nw = startpos + ( cos45 * defaultdistance, negcos45 * defaultdistance, 0 );
|
||||
ne = startpos + ( cos45 * defaultdistance, cos45 * defaultdistance, 0 );
|
||||
sw = startpos + ( negcos45 * defaultdistance, negcos45 * defaultdistance, 0 );
|
||||
se = startpos + ( negcos45 * defaultdistance, cos45 * defaultdistance, 0 );
|
||||
locations = [];
|
||||
locations[ "color" ] = [];
|
||||
locations[ "loc" ] = [];
|
||||
locations[ "tracePos" ] = [];
|
||||
locations[ "distSqrd" ] = [];
|
||||
locations[ "fxtoplay" ] = [];
|
||||
locations[ "radius" ] = [];
|
||||
locations[ "color" ][ 0 ] = red;
|
||||
locations[ "color" ][ 1 ] = red;
|
||||
locations[ "color" ][ 2 ] = blue;
|
||||
locations[ "color" ][ 3 ] = blue;
|
||||
locations[ "color" ][ 4 ] = green;
|
||||
locations[ "color" ][ 5 ] = green;
|
||||
locations[ "color" ][ 6 ] = white;
|
||||
locations[ "color" ][ 7 ] = white;
|
||||
locations[ "point" ][ 0 ] = north;
|
||||
locations[ "point" ][ 1 ] = ne;
|
||||
locations[ "point" ][ 2 ] = east;
|
||||
locations[ "point" ][ 3 ] = se;
|
||||
locations[ "point" ][ 4 ] = south;
|
||||
locations[ "point" ][ 5 ] = sw;
|
||||
locations[ "point" ][ 6 ] = west;
|
||||
locations[ "point" ][ 7 ] = nw;
|
||||
count = 0;
|
||||
while ( count < 8 )
|
||||
{
|
||||
trace = hitpos( startpos, locations[ "point" ][ count ], locations[ "color" ][ count ] );
|
||||
locations[ "tracePos" ][ count ] = trace;
|
||||
locations[ "loc" ][ count ] = ( startpos / 2 ) + ( trace / 2 );
|
||||
locations[ "loc" ][ count ] -= vectorScale( ( 0, 0, 0 ), 12 );
|
||||
locations[ "distSqrd" ][ count ] = distancesquared( startpos, trace );
|
||||
count++;
|
||||
}
|
||||
centroid = getcentroid( locations );
|
||||
killcament = spawn( "script_model", centroid + vectorScale( ( 0, 0, 0 ), 60 ) );
|
||||
killcament deleteaftertime( 15 );
|
||||
killcament.starttime = getTime();
|
||||
center = getcenter( locations );
|
||||
i = 0;
|
||||
while ( i < 8 )
|
||||
{
|
||||
fxtoplay = setuptabunfx( owner, locations, i );
|
||||
switch( fxtoplay )
|
||||
{
|
||||
case 0:
|
||||
locations[ "fxtoplay" ][ i ] = level.fx_tabun_0;
|
||||
locations[ "radius" ][ i ] = level.fx_tabun_radius0;
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case 1:
|
||||
locations[ "fxtoplay" ][ i ] = level.fx_tabun_1;
|
||||
locations[ "radius" ][ i ] = level.fx_tabun_radius1;
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case 2:
|
||||
locations[ "fxtoplay" ][ i ] = level.fx_tabun_2;
|
||||
locations[ "radius" ][ i ] = level.fx_tabun_radius2;
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
case 3:
|
||||
locations[ "fxtoplay" ][ i ] = level.fx_tabun_3;
|
||||
locations[ "radius" ][ i ] = level.fx_tabun_radius3;
|
||||
break;
|
||||
i++;
|
||||
continue;
|
||||
default:
|
||||
locations[ "radius" ][ i ] = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
singleeffect = 1;
|
||||
freepassused = 0;
|
||||
i = 0;
|
||||
while ( i < 8 )
|
||||
{
|
||||
if ( locations[ "radius" ][ i ] != level.fx_tabun_radius0 )
|
||||
{
|
||||
if ( freepassused == 0 && locations[ "radius" ][ i ] == level.fx_tabun_radius1 )
|
||||
{
|
||||
freepassused = 1;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
singleeffect = 0;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
onefoot = vectorScale( ( 0, 0, 0 ), 12 );
|
||||
startpos -= onefoot;
|
||||
thread playtabunsound( startpos );
|
||||
if ( singleeffect == 1 )
|
||||
{
|
||||
singlelocation( startpos, owner );
|
||||
}
|
||||
else
|
||||
{
|
||||
spawntimedfx( level.fx_tabun_3, startpos );
|
||||
count = 0;
|
||||
while ( count < 8 )
|
||||
{
|
||||
if ( isDefined( locations[ "fxtoplay" ][ count ] ) )
|
||||
{
|
||||
spawntimedfx( locations[ "fxtoplay" ][ count ], locations[ "loc" ][ count ] );
|
||||
thread damageeffectarea( owner, locations[ "loc" ][ count ], locations[ "radius" ][ count ], locations[ "radius" ][ count ], killcament );
|
||||
}
|
||||
count++;
|
||||
}
|
||||
}
|
||||
defaultdistance = weapons_get_dvar_int( "scr_defaultDistanceTabun", 220 );
|
||||
cos45 = 0.707;
|
||||
negcos45 = -0.707;
|
||||
red = ( 0.9, 0.2, 0.2 );
|
||||
blue = ( 0.2, 0.2, 0.9 );
|
||||
green = ( 0.2, 0.9, 0.2 );
|
||||
white = vectorscale( ( 1, 1, 1 ), 0.9 );
|
||||
north = startpos + ( defaultdistance, 0, 0 );
|
||||
south = startpos - ( defaultdistance, 0, 0 );
|
||||
east = startpos + ( 0, defaultdistance, 0 );
|
||||
west = startpos - ( 0, defaultdistance, 0 );
|
||||
nw = startpos + ( cos45 * defaultdistance, negcos45 * defaultdistance, 0 );
|
||||
ne = startpos + ( cos45 * defaultdistance, cos45 * defaultdistance, 0 );
|
||||
sw = startpos + ( negcos45 * defaultdistance, negcos45 * defaultdistance, 0 );
|
||||
se = startpos + ( negcos45 * defaultdistance, cos45 * defaultdistance, 0 );
|
||||
locations = [];
|
||||
locations["color"] = [];
|
||||
locations["loc"] = [];
|
||||
locations["tracePos"] = [];
|
||||
locations["distSqrd"] = [];
|
||||
locations["fxtoplay"] = [];
|
||||
locations["radius"] = [];
|
||||
locations["color"][0] = red;
|
||||
locations["color"][1] = red;
|
||||
locations["color"][2] = blue;
|
||||
locations["color"][3] = blue;
|
||||
locations["color"][4] = green;
|
||||
locations["color"][5] = green;
|
||||
locations["color"][6] = white;
|
||||
locations["color"][7] = white;
|
||||
locations["point"][0] = north;
|
||||
locations["point"][1] = ne;
|
||||
locations["point"][2] = east;
|
||||
locations["point"][3] = se;
|
||||
locations["point"][4] = south;
|
||||
locations["point"][5] = sw;
|
||||
locations["point"][6] = west;
|
||||
locations["point"][7] = nw;
|
||||
|
||||
for ( count = 0; count < 8; count++ )
|
||||
{
|
||||
trace = hitpos( startpos, locations["point"][count], locations["color"][count] );
|
||||
locations["tracePos"][count] = trace;
|
||||
locations["loc"][count] = startpos / 2 + trace / 2;
|
||||
locations["loc"][count] -= vectorscale( ( 0, 0, 1 ), 12.0 );
|
||||
locations["distSqrd"][count] = distancesquared( startpos, trace );
|
||||
}
|
||||
|
||||
centroid = getcentroid( locations );
|
||||
killcament = spawn( "script_model", centroid + vectorscale( ( 0, 0, 1 ), 60.0 ) );
|
||||
killcament deleteaftertime( 15.0 );
|
||||
killcament.starttime = gettime();
|
||||
center = getcenter( locations );
|
||||
|
||||
for ( i = 0; i < 8; i++ )
|
||||
{
|
||||
fxtoplay = setuptabunfx( owner, locations, i );
|
||||
|
||||
switch ( fxtoplay )
|
||||
{
|
||||
case "0":
|
||||
locations["fxtoplay"][i] = level.fx_tabun_0;
|
||||
locations["radius"][i] = level.fx_tabun_radius0;
|
||||
continue;
|
||||
case "1":
|
||||
locations["fxtoplay"][i] = level.fx_tabun_1;
|
||||
locations["radius"][i] = level.fx_tabun_radius1;
|
||||
continue;
|
||||
case "2":
|
||||
locations["fxtoplay"][i] = level.fx_tabun_2;
|
||||
locations["radius"][i] = level.fx_tabun_radius2;
|
||||
continue;
|
||||
case "3":
|
||||
locations["fxtoplay"][i] = level.fx_tabun_3;
|
||||
locations["radius"][i] = level.fx_tabun_radius3;
|
||||
continue;
|
||||
default:
|
||||
locations["fxtoplay"][i] = undefined;
|
||||
locations["radius"][i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
singleeffect = 1;
|
||||
freepassused = 0;
|
||||
|
||||
for ( i = 0; i < 8; i++ )
|
||||
{
|
||||
if ( locations["radius"][i] != level.fx_tabun_radius0 )
|
||||
{
|
||||
if ( freepassused == 0 && locations["radius"][i] == level.fx_tabun_radius1 )
|
||||
{
|
||||
freepassused = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
singleeffect = 0;
|
||||
}
|
||||
}
|
||||
|
||||
onefoot = vectorscale( ( 0, 0, 1 ), 12.0 );
|
||||
startpos -= onefoot;
|
||||
thread playtabunsound( startpos );
|
||||
|
||||
if ( singleeffect == 1 )
|
||||
singlelocation( startpos, owner );
|
||||
else
|
||||
{
|
||||
spawntimedfx( level.fx_tabun_3, startpos );
|
||||
|
||||
for ( count = 0; count < 8; count++ )
|
||||
{
|
||||
if ( isdefined( locations["fxtoplay"][count] ) )
|
||||
{
|
||||
spawntimedfx( locations["fxtoplay"][count], locations["loc"][count] );
|
||||
thread damageeffectarea( owner, locations["loc"][count], locations["radius"][count], locations["radius"][count], killcament );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
playtabunsound( position )
|
||||
{
|
||||
tabunsound = spawn( "script_origin", ( 0, 0, 0 ) );
|
||||
tabunsound.origin = position;
|
||||
tabunsound playsound( level.sound_tabun_start );
|
||||
tabunsound playloopsound( level.sound_tabun_loop );
|
||||
wait level.tabungasduration;
|
||||
thread playsoundinspace( level.sound_tabun_stop, position );
|
||||
tabunsound stoploopsound( 0,5 );
|
||||
wait 0,5;
|
||||
tabunsound delete();
|
||||
tabunsound = spawn( "script_origin", ( 0, 0, 1 ) );
|
||||
tabunsound.origin = position;
|
||||
tabunsound playsound( level.sound_tabun_start );
|
||||
tabunsound playloopsound( level.sound_tabun_loop );
|
||||
wait( level.tabungasduration );
|
||||
thread playsoundinspace( level.sound_tabun_stop, position );
|
||||
tabunsound stoploopsound( 0.5 );
|
||||
wait 0.5;
|
||||
tabunsound delete();
|
||||
}
|
||||
|
||||
setuptabunfx( owner, locations, count )
|
||||
{
|
||||
fxtoplay = undefined;
|
||||
previous = count - 1;
|
||||
if ( previous < 0 )
|
||||
{
|
||||
previous += locations[ "loc" ].size;
|
||||
}
|
||||
next = count + 1;
|
||||
if ( next >= locations[ "loc" ].size )
|
||||
{
|
||||
next -= locations[ "loc" ].size;
|
||||
}
|
||||
effect0dist = level.fx_tabun_radius0 * level.fx_tabun_radius0;
|
||||
effect1dist = level.fx_tabun_radius1 * level.fx_tabun_radius1;
|
||||
effect2dist = level.fx_tabun_radius2 * level.fx_tabun_radius2;
|
||||
effect3dist = level.fx_tabun_radius3 * level.fx_tabun_radius3;
|
||||
effect4dist = level.fx_tabun_radius3;
|
||||
fxtoplay = -1;
|
||||
if ( locations[ "distSqrd" ][ count ] > effect0dist && locations[ "distSqrd" ][ previous ] > effect1dist && locations[ "distSqrd" ][ next ] > effect1dist )
|
||||
{
|
||||
fxtoplay = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( locations[ "distSqrd" ][ count ] > effect1dist && locations[ "distSqrd" ][ previous ] > effect2dist && locations[ "distSqrd" ][ next ] > effect2dist )
|
||||
{
|
||||
fxtoplay = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( locations[ "distSqrd" ][ count ] > effect2dist && locations[ "distSqrd" ][ previous ] > effect3dist && locations[ "distSqrd" ][ next ] > effect3dist )
|
||||
{
|
||||
fxtoplay = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( locations[ "distSqrd" ][ count ] > effect3dist && locations[ "distSqrd" ][ previous ] > effect4dist && locations[ "distSqrd" ][ next ] > effect4dist )
|
||||
{
|
||||
fxtoplay = 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return fxtoplay;
|
||||
fxtoplay = undefined;
|
||||
previous = count - 1;
|
||||
|
||||
if ( previous < 0 )
|
||||
previous += locations["loc"].size;
|
||||
|
||||
next = count + 1;
|
||||
|
||||
if ( next >= locations["loc"].size )
|
||||
next -= locations["loc"].size;
|
||||
|
||||
effect0dist = level.fx_tabun_radius0 * level.fx_tabun_radius0;
|
||||
effect1dist = level.fx_tabun_radius1 * level.fx_tabun_radius1;
|
||||
effect2dist = level.fx_tabun_radius2 * level.fx_tabun_radius2;
|
||||
effect3dist = level.fx_tabun_radius3 * level.fx_tabun_radius3;
|
||||
effect4dist = level.fx_tabun_radius3;
|
||||
fxtoplay = -1;
|
||||
|
||||
if ( locations["distSqrd"][count] > effect0dist && locations["distSqrd"][previous] > effect1dist && locations["distSqrd"][next] > effect1dist )
|
||||
fxtoplay = 0;
|
||||
else if ( locations["distSqrd"][count] > effect1dist && locations["distSqrd"][previous] > effect2dist && locations["distSqrd"][next] > effect2dist )
|
||||
fxtoplay = 1;
|
||||
else if ( locations["distSqrd"][count] > effect2dist && locations["distSqrd"][previous] > effect3dist && locations["distSqrd"][next] > effect3dist )
|
||||
fxtoplay = 2;
|
||||
else if ( locations["distSqrd"][count] > effect3dist && locations["distSqrd"][previous] > effect4dist && locations["distSqrd"][next] > effect4dist )
|
||||
fxtoplay = 3;
|
||||
|
||||
return fxtoplay;
|
||||
}
|
||||
|
||||
getcentroid( locations )
|
||||
{
|
||||
centroid = ( 0, 0, 0 );
|
||||
i = 0;
|
||||
while ( i < locations[ "loc" ].size )
|
||||
{
|
||||
centroid += locations[ "loc" ][ i ] / locations[ "loc" ].size;
|
||||
i++;
|
||||
}
|
||||
centroid = ( 0, 0, 0 );
|
||||
|
||||
for ( i = 0; i < locations["loc"].size; i++ )
|
||||
centroid += locations["loc"][i] / locations["loc"].size;
|
||||
/#
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
purple = ( 0,9, 0,2, 0,9 );
|
||||
debugstar( centroid, 2000, purple );
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
purple = ( 0.9, 0.2, 0.9 );
|
||||
debugstar( centroid, 2000, purple );
|
||||
}
|
||||
#/
|
||||
}
|
||||
return centroid;
|
||||
return centroid;
|
||||
}
|
||||
|
||||
getcenter( locations )
|
||||
{
|
||||
center = ( 0, 0, 0 );
|
||||
curx = locations[ "tracePos" ][ 0 ][ 0 ];
|
||||
cury = locations[ "tracePos" ][ 0 ][ 1 ];
|
||||
minx = curx;
|
||||
maxx = curx;
|
||||
miny = cury;
|
||||
maxy = cury;
|
||||
i = 1;
|
||||
while ( i < locations[ "tracePos" ].size )
|
||||
{
|
||||
curx = locations[ "tracePos" ][ i ][ 0 ];
|
||||
cury = locations[ "tracePos" ][ i ][ 1 ];
|
||||
if ( curx > maxx )
|
||||
{
|
||||
maxx = curx;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( curx < minx )
|
||||
{
|
||||
minx = curx;
|
||||
}
|
||||
}
|
||||
if ( cury > maxy )
|
||||
{
|
||||
maxy = cury;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( cury < miny )
|
||||
{
|
||||
miny = cury;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
avgx = ( maxx + minx ) / 2;
|
||||
avgy = ( maxy + miny ) / 2;
|
||||
center = ( avgx, avgy, locations[ "tracePos" ][ 0 ][ 2 ] );
|
||||
center = ( 0, 0, 0 );
|
||||
curx = locations["tracePos"][0][0];
|
||||
cury = locations["tracePos"][0][1];
|
||||
minx = curx;
|
||||
maxx = curx;
|
||||
miny = cury;
|
||||
maxy = cury;
|
||||
|
||||
for ( i = 1; i < locations["tracePos"].size; i++ )
|
||||
{
|
||||
curx = locations["tracePos"][i][0];
|
||||
cury = locations["tracePos"][i][1];
|
||||
|
||||
if ( curx > maxx )
|
||||
maxx = curx;
|
||||
else if ( curx < minx )
|
||||
minx = curx;
|
||||
|
||||
if ( cury > maxy )
|
||||
{
|
||||
maxy = cury;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( cury < miny )
|
||||
miny = cury;
|
||||
}
|
||||
|
||||
avgx = ( maxx + minx ) / 2;
|
||||
avgy = ( maxy + miny ) / 2;
|
||||
center = ( avgx, avgy, locations["tracePos"][0][2] );
|
||||
/#
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
cyan = ( 0,2, 0,9, 0,9 );
|
||||
debugstar( center, 2000, cyan );
|
||||
level.tabun_debug = getdvarintdefault( "scr_tabun_debug", 0 );
|
||||
|
||||
if ( level.tabun_debug )
|
||||
{
|
||||
cyan = ( 0.2, 0.9, 0.9 );
|
||||
debugstar( center, 2000, cyan );
|
||||
}
|
||||
#/
|
||||
}
|
||||
return center;
|
||||
return center;
|
||||
}
|
||||
|
@ -1,408 +1,385 @@
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/_hacker_tool;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes/_globallogic_audio;
|
||||
#include maps/mp/gametypes/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_hud_util;
|
||||
#include maps\mp\gametypes\_globallogic_audio;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\_hacker_tool;
|
||||
#include maps\mp\gametypes\_globallogic_player;
|
||||
#include maps\mp\gametypes\_damagefeedback;
|
||||
|
||||
init()
|
||||
{
|
||||
level.tacticalinsertionweapon = "tactical_insertion_mp";
|
||||
precachemodel( "t6_wpn_tac_insert_world" );
|
||||
loadfx( "misc/fx_equip_tac_insert_light_grn" );
|
||||
loadfx( "misc/fx_equip_tac_insert_light_red" );
|
||||
level._effect[ "tacticalInsertionFizzle" ] = loadfx( "misc/fx_equip_tac_insert_exp" );
|
||||
maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "item_destroyed", 1 );
|
||||
level.tacticalinsertionweapon = "tactical_insertion_mp";
|
||||
precachemodel( "t6_wpn_tac_insert_world" );
|
||||
loadfx( "misc/fx_equip_tac_insert_light_grn" );
|
||||
loadfx( "misc/fx_equip_tac_insert_light_red" );
|
||||
level._effect["tacticalInsertionFizzle"] = loadfx( "misc/fx_equip_tac_insert_exp" );
|
||||
maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "item_destroyed", 1 );
|
||||
}
|
||||
|
||||
istacspawntouchingcrates( origin, angles )
|
||||
{
|
||||
crate_ents = getentarray( "care_package", "script_noteworthy" );
|
||||
mins = ( -17, -17, -40 );
|
||||
maxs = ( 17, 17, 40 );
|
||||
i = 0;
|
||||
while ( i < crate_ents.size )
|
||||
{
|
||||
if ( crate_ents[ i ] istouchingvolume( origin + vectorScale( ( 0, 0, 1 ), 40 ), mins, maxs ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
crate_ents = getentarray( "care_package", "script_noteworthy" );
|
||||
mins = ( -17, -17, -40 );
|
||||
maxs = ( 17, 17, 40 );
|
||||
|
||||
for ( i = 0; i < crate_ents.size; i++ )
|
||||
{
|
||||
if ( crate_ents[i] istouchingvolume( origin + vectorscale( ( 0, 0, 1 ), 40.0 ), mins, maxs ) )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
overridespawn( ispredictedspawn )
|
||||
{
|
||||
if ( !isDefined( self.tacticalinsertion ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
origin = self.tacticalinsertion.origin;
|
||||
angles = self.tacticalinsertion.angles;
|
||||
team = self.tacticalinsertion.team;
|
||||
if ( !ispredictedspawn )
|
||||
{
|
||||
self.tacticalinsertion destroy_tactical_insertion();
|
||||
}
|
||||
if ( team != self.team )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( istacspawntouchingcrates( origin ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !ispredictedspawn )
|
||||
{
|
||||
self.tacticalinsertiontime = getTime();
|
||||
self spawn( origin, angles, "tactical insertion" );
|
||||
self setspawnclientflag( "SCDFL_DISABLE_LOGGING" );
|
||||
self addweaponstat( "tactical_insertion_mp", "used", 1 );
|
||||
}
|
||||
return 1;
|
||||
if ( !isdefined( self.tacticalinsertion ) )
|
||||
return false;
|
||||
|
||||
origin = self.tacticalinsertion.origin;
|
||||
angles = self.tacticalinsertion.angles;
|
||||
team = self.tacticalinsertion.team;
|
||||
|
||||
if ( !ispredictedspawn )
|
||||
self.tacticalinsertion destroy_tactical_insertion();
|
||||
|
||||
if ( team != self.team )
|
||||
return false;
|
||||
|
||||
if ( istacspawntouchingcrates( origin ) )
|
||||
return false;
|
||||
|
||||
if ( !ispredictedspawn )
|
||||
{
|
||||
self.tacticalinsertiontime = gettime();
|
||||
self spawn( origin, angles, "tactical insertion" );
|
||||
self setspawnclientflag( "SCDFL_DISABLE_LOGGING" );
|
||||
self addweaponstat( "tactical_insertion_mp", "used", 1 );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
waitanddelete( time )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait 0,05;
|
||||
self delete();
|
||||
self endon( "death" );
|
||||
wait 0.05;
|
||||
self delete();
|
||||
}
|
||||
|
||||
watch( player )
|
||||
{
|
||||
if ( isDefined( player.tacticalinsertion ) )
|
||||
{
|
||||
player.tacticalinsertion destroy_tactical_insertion();
|
||||
}
|
||||
player thread spawntacticalinsertion();
|
||||
self waitanddelete( 0,05 );
|
||||
if ( isdefined( player.tacticalinsertion ) )
|
||||
player.tacticalinsertion destroy_tactical_insertion();
|
||||
|
||||
player thread spawntacticalinsertion();
|
||||
self waitanddelete( 0.05 );
|
||||
}
|
||||
|
||||
watchusetrigger( trigger, callback, playersoundonuse, npcsoundonuse )
|
||||
{
|
||||
self endon( "delete" );
|
||||
while ( 1 )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
while ( !isalive( player ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( !player isonground() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.triggerteamignore ) && player.team == trigger.triggerteamignore )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() )
|
||||
{
|
||||
if ( isDefined( playersoundonuse ) )
|
||||
{
|
||||
player playlocalsound( playersoundonuse );
|
||||
}
|
||||
if ( isDefined( npcsoundonuse ) )
|
||||
{
|
||||
player playsound( npcsoundonuse );
|
||||
}
|
||||
self thread [[ callback ]]( player );
|
||||
}
|
||||
}
|
||||
self endon( "delete" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
trigger waittill( "trigger", player );
|
||||
|
||||
if ( !isalive( player ) )
|
||||
continue;
|
||||
|
||||
if ( !player isonground() )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.triggerteamignore ) && player.team == trigger.triggerteamignore )
|
||||
continue;
|
||||
|
||||
if ( isdefined( trigger.claimedby ) && player != trigger.claimedby )
|
||||
continue;
|
||||
|
||||
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() )
|
||||
{
|
||||
if ( isdefined( playersoundonuse ) )
|
||||
player playlocalsound( playersoundonuse );
|
||||
|
||||
if ( isdefined( npcsoundonuse ) )
|
||||
player playsound( npcsoundonuse );
|
||||
|
||||
self thread [[ callback ]]( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
watchdisconnect()
|
||||
{
|
||||
self.tacticalinsertion endon( "delete" );
|
||||
self waittill( "disconnect" );
|
||||
self.tacticalinsertion thread destroy_tactical_insertion();
|
||||
self.tacticalinsertion endon( "delete" );
|
||||
|
||||
self waittill( "disconnect" );
|
||||
|
||||
self.tacticalinsertion thread destroy_tactical_insertion();
|
||||
}
|
||||
|
||||
destroy_tactical_insertion( attacker )
|
||||
{
|
||||
self.owner.tacticalinsertion = undefined;
|
||||
self notify( "delete" );
|
||||
self.owner notify( "tactical_insertion_destroyed" );
|
||||
self.friendlytrigger delete();
|
||||
self.enemytrigger delete();
|
||||
if ( isDefined( attacker ) && isDefined( attacker.pers[ "team" ] ) && isDefined( self.owner ) && isDefined( self.owner.pers[ "team" ] ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( attacker.pers[ "team" ] != self.owner.pers[ "team" ] )
|
||||
{
|
||||
attacker notify( "destroyed_explosive" );
|
||||
attacker maps/mp/_challenges::destroyedequipment();
|
||||
attacker maps/mp/_challenges::destroyedtacticalinsert();
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_tac_insert", attacker );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( attacker != self.owner )
|
||||
{
|
||||
attacker notify( "destroyed_explosive" );
|
||||
attacker maps/mp/_challenges::destroyedequipment();
|
||||
attacker maps/mp/_challenges::destroyedtacticalinsert();
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_tac_insert", attacker );
|
||||
}
|
||||
}
|
||||
}
|
||||
self delete();
|
||||
self.owner.tacticalinsertion = undefined;
|
||||
self notify( "delete" );
|
||||
self.owner notify( "tactical_insertion_destroyed" );
|
||||
self.friendlytrigger delete();
|
||||
self.enemytrigger delete();
|
||||
|
||||
if ( isdefined( attacker ) && isdefined( attacker.pers["team"] ) && isdefined( self.owner ) && isdefined( self.owner.pers["team"] ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( attacker.pers["team"] != self.owner.pers["team"] )
|
||||
{
|
||||
attacker notify( "destroyed_explosive" );
|
||||
attacker maps\mp\_challenges::destroyedequipment();
|
||||
attacker maps\mp\_challenges::destroyedtacticalinsert();
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_tac_insert", attacker );
|
||||
}
|
||||
}
|
||||
else if ( attacker != self.owner )
|
||||
{
|
||||
attacker notify( "destroyed_explosive" );
|
||||
attacker maps\mp\_challenges::destroyedequipment();
|
||||
attacker maps\mp\_challenges::destroyedtacticalinsert();
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_tac_insert", attacker );
|
||||
}
|
||||
}
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
fizzle( attacker )
|
||||
{
|
||||
if ( isDefined( self.fizzle ) && self.fizzle )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.fizzle = 1;
|
||||
playfx( level._effect[ "tacticalInsertionFizzle" ], self.origin );
|
||||
self playsound( "dst_tac_insert_break" );
|
||||
if ( isDefined( attacker ) && attacker != self.owner )
|
||||
{
|
||||
self.owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "tact_destroyed", "item_destroyed" );
|
||||
}
|
||||
self destroy_tactical_insertion( attacker );
|
||||
if ( isdefined( self.fizzle ) && self.fizzle )
|
||||
return;
|
||||
|
||||
self.fizzle = 1;
|
||||
playfx( level._effect["tacticalInsertionFizzle"], self.origin );
|
||||
self playsound( "dst_tac_insert_break" );
|
||||
|
||||
if ( isdefined( attacker ) && attacker != self.owner )
|
||||
self.owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "tact_destroyed", "item_destroyed" );
|
||||
|
||||
self destroy_tactical_insertion( attacker );
|
||||
}
|
||||
|
||||
pickup( attacker )
|
||||
{
|
||||
player = self.owner;
|
||||
self destroy_tactical_insertion();
|
||||
player giveweapon( level.tacticalinsertionweapon );
|
||||
player setweaponammoclip( level.tacticalinsertionweapon, 1 );
|
||||
player = self.owner;
|
||||
self destroy_tactical_insertion();
|
||||
player giveweapon( level.tacticalinsertionweapon );
|
||||
player setweaponammoclip( level.tacticalinsertionweapon, 1 );
|
||||
}
|
||||
|
||||
spawntacticalinsertion()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self.tacticalinsertion = spawn( "script_model", self.origin + ( 0, 0, 1 ) );
|
||||
self.tacticalinsertion setmodel( "t6_wpn_tac_insert_world" );
|
||||
self.tacticalinsertion.origin = self.origin + ( 0, 0, 1 );
|
||||
self.tacticalinsertion.angles = self.angles;
|
||||
self.tacticalinsertion.team = self.team;
|
||||
self.tacticalinsertion setteam( self.team );
|
||||
self.tacticalinsertion.owner = self;
|
||||
self.tacticalinsertion setowner( self );
|
||||
self.tacticalinsertion setweapon( level.tacticalinsertionweapon );
|
||||
self.tacticalinsertion thread maps/mp/gametypes/_weaponobjects::attachreconmodel( "t6_wpn_tac_insert_detect", self );
|
||||
self.tacticalinsertion endon( "delete" );
|
||||
self.tacticalinsertion maps/mp/_hacker_tool::registerwithhackertool( level.equipmenthackertoolradius, level.equipmenthackertooltimems );
|
||||
triggerheight = 64;
|
||||
triggerradius = 128;
|
||||
self.tacticalinsertion.friendlytrigger = spawn( "trigger_radius_use", self.tacticalinsertion.origin + vectorScale( ( 0, 0, 1 ), 3 ) );
|
||||
self.tacticalinsertion.friendlytrigger setcursorhint( "HINT_NOICON", self.tacticalinsertion );
|
||||
self.tacticalinsertion.friendlytrigger sethintstring( &"MP_TACTICAL_INSERTION_PICKUP" );
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.tacticalinsertion.friendlytrigger setteamfortrigger( self.team );
|
||||
self.tacticalinsertion.friendlytrigger.triggerteam = self.team;
|
||||
}
|
||||
self clientclaimtrigger( self.tacticalinsertion.friendlytrigger );
|
||||
self.tacticalinsertion.friendlytrigger.claimedby = self;
|
||||
self.tacticalinsertion.enemytrigger = spawn( "trigger_radius_use", self.tacticalinsertion.origin + vectorScale( ( 0, 0, 1 ), 3 ) );
|
||||
self.tacticalinsertion.enemytrigger setcursorhint( "HINT_NOICON", self.tacticalinsertion );
|
||||
self.tacticalinsertion.enemytrigger sethintstring( &"MP_TACTICAL_INSERTION_DESTROY" );
|
||||
self.tacticalinsertion.enemytrigger setinvisibletoplayer( self );
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.tacticalinsertion.enemytrigger setexcludeteamfortrigger( self.team );
|
||||
self.tacticalinsertion.enemytrigger.triggerteamignore = self.team;
|
||||
}
|
||||
self.tacticalinsertion setclientflag( 2 );
|
||||
self thread watchdisconnect();
|
||||
watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcherbyweapon( level.tacticalinsertionweapon );
|
||||
self.tacticalinsertion thread watchusetrigger( self.tacticalinsertion.friendlytrigger, ::pickup, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
self.tacticalinsertion thread watchusetrigger( self.tacticalinsertion.enemytrigger, ::fizzle );
|
||||
if ( isDefined( self.tacticalinsertioncount ) )
|
||||
{
|
||||
self.tacticalinsertioncount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.tacticalinsertioncount = 1;
|
||||
}
|
||||
self.tacticalinsertion setcandamage( 1 );
|
||||
self.tacticalinsertion.health = 1;
|
||||
while ( 1 )
|
||||
{
|
||||
self.tacticalinsertion waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
while ( level.teambased && isDefined( attacker ) && isplayer( attacker ) && attacker.team == self.team && attacker != self )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( attacker != self )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment( weaponname );
|
||||
attacker maps/mp/_challenges::destroyedtacticalinsert();
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_tac_insert", attacker );
|
||||
}
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
switch( weaponname )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
case "flash_grenade_mp":
|
||||
if ( level.teambased && self.tacticalinsertion.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.teambased && self.tacticalinsertion.owner != attacker )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( isDefined( attacker ) && attacker != self )
|
||||
{
|
||||
self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "tact_destroyed", "item_destroyed" );
|
||||
}
|
||||
self.tacticalinsertion thread fizzle();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
self.tacticalinsertion = spawn( "script_model", self.origin + ( 0, 0, 1 ) );
|
||||
self.tacticalinsertion setmodel( "t6_wpn_tac_insert_world" );
|
||||
self.tacticalinsertion.origin = self.origin + ( 0, 0, 1 );
|
||||
self.tacticalinsertion.angles = self.angles;
|
||||
self.tacticalinsertion.team = self.team;
|
||||
self.tacticalinsertion setteam( self.team );
|
||||
self.tacticalinsertion.owner = self;
|
||||
self.tacticalinsertion setowner( self );
|
||||
self.tacticalinsertion setweapon( level.tacticalinsertionweapon );
|
||||
self.tacticalinsertion thread maps\mp\gametypes\_weaponobjects::attachreconmodel( "t6_wpn_tac_insert_detect", self );
|
||||
self.tacticalinsertion endon( "delete" );
|
||||
self.tacticalinsertion maps\mp\_hacker_tool::registerwithhackertool( level.equipmenthackertoolradius, level.equipmenthackertooltimems );
|
||||
triggerheight = 64;
|
||||
triggerradius = 128;
|
||||
self.tacticalinsertion.friendlytrigger = spawn( "trigger_radius_use", self.tacticalinsertion.origin + vectorscale( ( 0, 0, 1 ), 3.0 ) );
|
||||
self.tacticalinsertion.friendlytrigger setcursorhint( "HINT_NOICON", self.tacticalinsertion );
|
||||
self.tacticalinsertion.friendlytrigger sethintstring( &"MP_TACTICAL_INSERTION_PICKUP" );
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.tacticalinsertion.friendlytrigger setteamfortrigger( self.team );
|
||||
self.tacticalinsertion.friendlytrigger.triggerteam = self.team;
|
||||
}
|
||||
|
||||
self clientclaimtrigger( self.tacticalinsertion.friendlytrigger );
|
||||
self.tacticalinsertion.friendlytrigger.claimedby = self;
|
||||
self.tacticalinsertion.enemytrigger = spawn( "trigger_radius_use", self.tacticalinsertion.origin + vectorscale( ( 0, 0, 1 ), 3.0 ) );
|
||||
self.tacticalinsertion.enemytrigger setcursorhint( "HINT_NOICON", self.tacticalinsertion );
|
||||
self.tacticalinsertion.enemytrigger sethintstring( &"MP_TACTICAL_INSERTION_DESTROY" );
|
||||
self.tacticalinsertion.enemytrigger setinvisibletoplayer( self );
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
self.tacticalinsertion.enemytrigger setexcludeteamfortrigger( self.team );
|
||||
self.tacticalinsertion.enemytrigger.triggerteamignore = self.team;
|
||||
}
|
||||
|
||||
self.tacticalinsertion setclientflag( 2 );
|
||||
self thread watchdisconnect();
|
||||
watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcherbyweapon( level.tacticalinsertionweapon );
|
||||
self.tacticalinsertion thread watchusetrigger( self.tacticalinsertion.friendlytrigger, ::pickup, watcher.pickupsoundplayer, watcher.pickupsound );
|
||||
self.tacticalinsertion thread watchusetrigger( self.tacticalinsertion.enemytrigger, ::fizzle );
|
||||
|
||||
if ( isdefined( self.tacticalinsertioncount ) )
|
||||
self.tacticalinsertioncount++;
|
||||
else
|
||||
self.tacticalinsertioncount = 1;
|
||||
|
||||
self.tacticalinsertion setcandamage( 1 );
|
||||
self.tacticalinsertion.health = 1;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.tacticalinsertion waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags );
|
||||
|
||||
if ( level.teambased && ( !isdefined( attacker ) || !isplayer( attacker ) || attacker.team == self.team ) && attacker != self )
|
||||
continue;
|
||||
|
||||
if ( attacker != self )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedequipment( weaponname );
|
||||
attacker maps\mp\_challenges::destroyedtacticalinsert();
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_tac_insert", attacker );
|
||||
}
|
||||
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
switch ( weaponname )
|
||||
{
|
||||
case "flash_grenade_mp":
|
||||
case "concussion_grenade_mp":
|
||||
if ( level.teambased && self.tacticalinsertion.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
else if ( !level.teambased && self.tacticalinsertion.owner != attacker )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( attacker ) && attacker != self )
|
||||
self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "tact_destroyed", "item_destroyed" );
|
||||
|
||||
self.tacticalinsertion thread fizzle();
|
||||
}
|
||||
}
|
||||
|
||||
cancel_button_think()
|
||||
{
|
||||
if ( !isDefined( self.tacticalinsertion ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
text = cancel_text_create();
|
||||
self thread cancel_button_press();
|
||||
event = self waittill_any_return( "tactical_insertion_destroyed", "disconnect", "end_killcam", "abort_killcam", "tactical_insertion_canceled", "spawned" );
|
||||
if ( event == "tactical_insertion_canceled" )
|
||||
{
|
||||
self.tacticalinsertion destroy_tactical_insertion();
|
||||
}
|
||||
if ( isDefined( text ) )
|
||||
{
|
||||
text destroy();
|
||||
}
|
||||
if ( !isdefined( self.tacticalinsertion ) )
|
||||
return;
|
||||
|
||||
text = cancel_text_create();
|
||||
self thread cancel_button_press();
|
||||
event = self waittill_any_return( "tactical_insertion_destroyed", "disconnect", "end_killcam", "abort_killcam", "tactical_insertion_canceled", "spawned" );
|
||||
|
||||
if ( event == "tactical_insertion_canceled" )
|
||||
self.tacticalinsertion destroy_tactical_insertion();
|
||||
|
||||
if ( isdefined( text ) )
|
||||
text destroy();
|
||||
}
|
||||
|
||||
canceltackinsertionbutton()
|
||||
{
|
||||
if ( level.console )
|
||||
{
|
||||
return self changeseatbuttonpressed();
|
||||
}
|
||||
else
|
||||
{
|
||||
return self jumpbuttonpressed();
|
||||
}
|
||||
if ( level.console )
|
||||
return self changeseatbuttonpressed();
|
||||
else
|
||||
return self jumpbuttonpressed();
|
||||
}
|
||||
|
||||
cancel_button_press()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_killcam" );
|
||||
self endon( "abort_killcam" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0,05;
|
||||
if ( self canceltackinsertionbutton() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self notify( "tactical_insertion_canceled" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "end_killcam" );
|
||||
self endon( "abort_killcam" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( self canceltackinsertionbutton() )
|
||||
break;
|
||||
}
|
||||
|
||||
self notify( "tactical_insertion_canceled" );
|
||||
}
|
||||
|
||||
cancel_text_create()
|
||||
{
|
||||
text = newclienthudelem( self );
|
||||
text.archived = 0;
|
||||
text.y = -100;
|
||||
text.alignx = "center";
|
||||
text.aligny = "middle";
|
||||
text.horzalign = "center";
|
||||
text.vertalign = "bottom";
|
||||
text.sort = 10;
|
||||
text.font = "small";
|
||||
text.foreground = 1;
|
||||
text.hidewheninmenu = 1;
|
||||
if ( self issplitscreen() )
|
||||
{
|
||||
text.y = -80;
|
||||
text.fontscale = 1,2;
|
||||
}
|
||||
else
|
||||
{
|
||||
text.fontscale = 1,6;
|
||||
}
|
||||
text settext( &"PLATFORM_PRESS_TO_CANCEL_TACTICAL_INSERTION" );
|
||||
text.alpha = 1;
|
||||
return text;
|
||||
text = newclienthudelem( self );
|
||||
text.archived = 0;
|
||||
text.y = -100;
|
||||
text.alignx = "center";
|
||||
text.aligny = "middle";
|
||||
text.horzalign = "center";
|
||||
text.vertalign = "bottom";
|
||||
text.sort = 10;
|
||||
text.font = "small";
|
||||
text.foreground = 1;
|
||||
text.hidewheninmenu = 1;
|
||||
|
||||
if ( self issplitscreen() )
|
||||
{
|
||||
text.y = -80;
|
||||
text.fontscale = 1.2;
|
||||
}
|
||||
else
|
||||
text.fontscale = 1.6;
|
||||
|
||||
text settext( &"PLATFORM_PRESS_TO_CANCEL_TACTICAL_INSERTION" );
|
||||
text.alpha = 1;
|
||||
return text;
|
||||
}
|
||||
|
||||
gettacticalinsertions()
|
||||
{
|
||||
tac_inserts = [];
|
||||
_a393 = level.players;
|
||||
_k393 = getFirstArrayKey( _a393 );
|
||||
while ( isDefined( _k393 ) )
|
||||
{
|
||||
player = _a393[ _k393 ];
|
||||
if ( isDefined( player.tacticalinsertion ) )
|
||||
{
|
||||
tac_inserts[ tac_inserts.size ] = player.tacticalinsertion;
|
||||
}
|
||||
_k393 = getNextArrayKey( _a393, _k393 );
|
||||
}
|
||||
return tac_inserts;
|
||||
tac_inserts = [];
|
||||
|
||||
foreach ( player in level.players )
|
||||
{
|
||||
if ( isdefined( player.tacticalinsertion ) )
|
||||
tac_inserts[tac_inserts.size] = player.tacticalinsertion;
|
||||
}
|
||||
|
||||
return tac_inserts;
|
||||
}
|
||||
|
||||
tacticalinsertiondestroyedbytrophysystem( attacker, trophysystem )
|
||||
{
|
||||
owner = self.owner;
|
||||
if ( isDefined( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment( trophysystem.name );
|
||||
attacker maps/mp/_challenges::destroyedtacticalinsert();
|
||||
}
|
||||
self thread fizzle();
|
||||
if ( isDefined( owner ) )
|
||||
{
|
||||
owner endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
wait 0,05;
|
||||
owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "tact_destroyed", "item_destroyed" );
|
||||
}
|
||||
owner = self.owner;
|
||||
|
||||
if ( isdefined( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedequipment( trophysystem.name );
|
||||
attacker maps\mp\_challenges::destroyedtacticalinsert();
|
||||
}
|
||||
|
||||
self thread fizzle();
|
||||
|
||||
if ( isdefined( owner ) )
|
||||
{
|
||||
owner endon( "death" );
|
||||
owner endon( "disconnect" );
|
||||
wait 0.05;
|
||||
owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "tact_destroyed", "item_destroyed" );
|
||||
}
|
||||
}
|
||||
|
@ -1,175 +1,188 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_perplayer;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\_perplayer;
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
level.tearradius = 170;
|
||||
level.tearheight = 128;
|
||||
level.teargasfillduration = 7;
|
||||
level.teargasduration = 23;
|
||||
level.tearsufferingduration = 3;
|
||||
level.teargrenadetimer = 4;
|
||||
precacheshellshock( "teargas" );
|
||||
fgmonitor = maps/mp/gametypes/_perplayer::init( "tear_grenade_monitor", ::startmonitoringtearusage, ::stopmonitoringtearusage );
|
||||
maps/mp/gametypes/_perplayer::enable( fgmonitor );
|
||||
level.tearradius = 170;
|
||||
level.tearheight = 128;
|
||||
level.teargasfillduration = 7;
|
||||
level.teargasduration = 23;
|
||||
level.tearsufferingduration = 3;
|
||||
level.teargrenadetimer = 4;
|
||||
precacheshellshock( "teargas" );
|
||||
fgmonitor = maps\mp\gametypes\_perplayer::init( "tear_grenade_monitor", ::startmonitoringtearusage, ::stopmonitoringtearusage );
|
||||
maps\mp\gametypes\_perplayer::enable( fgmonitor );
|
||||
}
|
||||
|
||||
startmonitoringtearusage() //checked matches cerberus output
|
||||
startmonitoringtearusage()
|
||||
{
|
||||
self thread monitortearusage();
|
||||
self thread monitortearusage();
|
||||
}
|
||||
|
||||
stopmonitoringtearusage( disconnected ) //checked matches cerberus output
|
||||
stopmonitoringtearusage( disconnected )
|
||||
{
|
||||
self notify( "stop_monitoring_tear_usage" );
|
||||
self notify( "stop_monitoring_tear_usage" );
|
||||
}
|
||||
|
||||
monitortearusage() //checked changed to match cerberus output
|
||||
monitortearusage()
|
||||
{
|
||||
self endon( "stop_monitoring_tear_usage" );
|
||||
wait 0.05;
|
||||
if ( !self hasweapon( "tear_grenade_mp" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
prevammo = self getammocount( "tear_grenade_mp" );
|
||||
while ( 1 )
|
||||
{
|
||||
ammo = self getammocount( "tear_grenade_mp" );
|
||||
if ( ammo < prevammo )
|
||||
{
|
||||
num = prevammo - ammo;
|
||||
for ( i = 0; i < num; i++ )
|
||||
{
|
||||
grenades = getentarray( "grenade", "classname" );
|
||||
bestdist = undefined;
|
||||
bestg = undefined;
|
||||
for ( g = 0; g < grenades.size; g++ )
|
||||
{
|
||||
if ( !isDefined( grenades[ g ].teargrenade ) )
|
||||
{
|
||||
dist = distance( grenades[ g ].origin, self.origin + vectorScale( ( 0, 0, 1 ), 48 ) );
|
||||
if ( !isDefined( bestdist ) || dist < bestdist )
|
||||
{
|
||||
bestdist = dist;
|
||||
bestg = g;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( bestdist ) )
|
||||
{
|
||||
grenades[ bestg ].teargrenade = 1;
|
||||
grenades[ bestg ] thread teargrenade_think( self.team );
|
||||
}
|
||||
}
|
||||
}
|
||||
prevammo = ammo;
|
||||
wait 0.05;
|
||||
}
|
||||
self endon( "stop_monitoring_tear_usage" );
|
||||
wait 0.05;
|
||||
|
||||
if ( !self hasweapon( "tear_grenade_mp" ) )
|
||||
return;
|
||||
|
||||
prevammo = self getammocount( "tear_grenade_mp" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
ammo = self getammocount( "tear_grenade_mp" );
|
||||
|
||||
if ( ammo < prevammo )
|
||||
{
|
||||
num = prevammo - ammo;
|
||||
/#
|
||||
|
||||
#/
|
||||
for ( i = 0; i < num; i++ )
|
||||
{
|
||||
grenades = getentarray( "grenade", "classname" );
|
||||
bestdist = undefined;
|
||||
bestg = undefined;
|
||||
|
||||
for ( g = 0; g < grenades.size; g++ )
|
||||
{
|
||||
if ( !isdefined( grenades[g].teargrenade ) )
|
||||
{
|
||||
dist = distance( grenades[g].origin, self.origin + vectorscale( ( 0, 0, 1 ), 48.0 ) );
|
||||
|
||||
if ( !isdefined( bestdist ) || dist < bestdist )
|
||||
{
|
||||
bestdist = dist;
|
||||
bestg = g;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( bestdist ) )
|
||||
{
|
||||
grenades[bestg].teargrenade = 1;
|
||||
grenades[bestg] thread teargrenade_think( self.team );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
prevammo = ammo;
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
teargrenade_think( team ) //checked matches cerberus output
|
||||
teargrenade_think( team )
|
||||
{
|
||||
wait level.teargrenadetimer;
|
||||
ent = spawnstruct();
|
||||
ent thread tear( self.origin );
|
||||
wait( level.teargrenadetimer );
|
||||
ent = spawnstruct();
|
||||
ent thread tear( self.origin );
|
||||
}
|
||||
|
||||
tear( pos ) //checked changed to match beta dump
|
||||
tear( pos )
|
||||
{
|
||||
trig = spawn( "trigger_radius", pos, 0, level.tearradius, level.tearheight );
|
||||
starttime = getTime();
|
||||
self thread teartimer();
|
||||
self endon( "tear_timeout" );
|
||||
while ( 1 )
|
||||
{
|
||||
trig waittill( "trigger", player );
|
||||
if ( player.sessionstate != "playing" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
time = ( getTime() - starttime ) / 1000;
|
||||
currad = level.tearradius;
|
||||
curheight = level.tearheight;
|
||||
if ( time < level.teargasfillduration )
|
||||
{
|
||||
currad = currad * ( time / level.teargasfillduration );
|
||||
curheight = curheight * ( time / level.teargasfillduration );
|
||||
}
|
||||
offset = ( player.origin + vectorScale( ( 0, 0, 1 ), 32 ) ) - pos;
|
||||
offset2d = ( offset[ 0 ], offset[ 1 ], 0 );
|
||||
if ( lengthsquared( offset2d ) > ( currad * currad ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( ( player.origin[ 2 ] - pos[ 2 ] ) > curheight )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
player.teargasstarttime = getTime();
|
||||
if ( !isDefined( player.teargassuffering ) )
|
||||
{
|
||||
player thread teargassuffering();
|
||||
}
|
||||
}
|
||||
trig = spawn( "trigger_radius", pos, 0, level.tearradius, level.tearheight );
|
||||
starttime = gettime();
|
||||
self thread teartimer();
|
||||
self endon( "tear_timeout" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
trig waittill( "trigger", player );
|
||||
|
||||
if ( player.sessionstate != "playing" )
|
||||
continue;
|
||||
|
||||
time = ( gettime() - starttime ) / 1000;
|
||||
currad = level.tearradius;
|
||||
curheight = level.tearheight;
|
||||
|
||||
if ( time < level.teargasfillduration )
|
||||
{
|
||||
currad *= time / level.teargasfillduration;
|
||||
curheight *= time / level.teargasfillduration;
|
||||
}
|
||||
|
||||
offset = player.origin + vectorscale( ( 0, 0, 1 ), 32.0 ) - pos;
|
||||
offset2d = ( offset[0], offset[1], 0 );
|
||||
|
||||
if ( lengthsquared( offset2d ) > currad * currad )
|
||||
continue;
|
||||
|
||||
if ( player.origin[2] - pos[2] > curheight )
|
||||
continue;
|
||||
|
||||
player.teargasstarttime = gettime();
|
||||
|
||||
if ( !isdefined( player.teargassuffering ) )
|
||||
player thread teargassuffering();
|
||||
}
|
||||
}
|
||||
|
||||
teartimer() //checked matches cerberus output
|
||||
teartimer()
|
||||
{
|
||||
wait level.teargasduration;
|
||||
self notify( "tear_timeout" );
|
||||
wait( level.teargasduration );
|
||||
self notify( "tear_timeout" );
|
||||
}
|
||||
|
||||
teargassuffering() //checked changed to match cerberus output
|
||||
teargassuffering()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self.teargassuffering = 1;
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
self shellshock( "teargas", 60 );
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
if ( ( getTime() - self.teargasstarttime ) > ( level.tearsufferingduration * 1000 ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
self shellshock( "teargas", 1 );
|
||||
if ( self mayapplyscreeneffect() )
|
||||
{
|
||||
self.teargassuffering = undefined;
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
self.teargassuffering = 1;
|
||||
|
||||
if ( self mayapplyscreeneffect() )
|
||||
self shellshock( "teargas", 60 );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
if ( gettime() - self.teargasstarttime > level.tearsufferingduration * 1000 )
|
||||
break;
|
||||
|
||||
wait 1;
|
||||
}
|
||||
|
||||
self shellshock( "teargas", 1 );
|
||||
|
||||
if ( self mayapplyscreeneffect() )
|
||||
self.teargassuffering = undefined;
|
||||
}
|
||||
|
||||
drawcylinder( pos, rad, height ) //checked changed to match beta dump
|
||||
drawcylinder( pos, rad, height )
|
||||
{
|
||||
time = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
currad = rad;
|
||||
curheight = height;
|
||||
if ( time < level.teargasfillduration )
|
||||
{
|
||||
currad = currad * ( time / level.teargasfillduration );
|
||||
curheight = curheight * ( time / level.teargasfillduration );
|
||||
}
|
||||
for ( r = 0; r < 20; r++ )
|
||||
{
|
||||
theta = ( r / 20 ) * 360;
|
||||
theta2 = ( ( r + 1 ) / 20 ) * 360;
|
||||
line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) );
|
||||
line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) );
|
||||
line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) );
|
||||
}
|
||||
time += 0.05;
|
||||
if ( time > level.teargasduration )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
time = 0;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
currad = rad;
|
||||
curheight = height;
|
||||
|
||||
if ( time < level.teargasfillduration )
|
||||
{
|
||||
currad *= time / level.teargasfillduration;
|
||||
curheight *= time / level.teargasfillduration;
|
||||
}
|
||||
|
||||
for ( r = 0; r < 20; r++ )
|
||||
{
|
||||
theta = r / 20 * 360;
|
||||
theta2 = ( r + 1 ) / 20 * 360;
|
||||
line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) );
|
||||
line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) );
|
||||
line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) );
|
||||
}
|
||||
|
||||
time += 0.05;
|
||||
|
||||
if ( time > level.teargasduration )
|
||||
break;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
@ -1,127 +1,101 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
loadtreadfx( vehicle ) //checked matches cerberus output
|
||||
loadtreadfx( vehicle )
|
||||
{
|
||||
treadfx = vehicle.treadfxnamearray;
|
||||
if ( isDefined( treadfx ) )
|
||||
{
|
||||
vehicle.treadfx = [];
|
||||
if ( isDefined( treadfx[ "asphalt" ] ) && treadfx[ "asphalt" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "asphalt" ] = loadfx( treadfx[ "asphalt" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "bark" ] ) && treadfx[ "bark" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "bark" ] = loadfx( treadfx[ "bark" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "brick" ] ) && treadfx[ "brick" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "brick" ] = loadfx( treadfx[ "brick" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "carpet" ] ) && treadfx[ "carpet" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "carpet" ] = loadfx( treadfx[ "carpet" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "ceramic" ] ) && treadfx[ "ceramic" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "ceramic" ] = loadfx( treadfx[ "ceramic" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "cloth" ] ) && treadfx[ "cloth" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "cloth" ] = loadfx( treadfx[ "cloth" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "concrete" ] ) && treadfx[ "concrete" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "concrete" ] = loadfx( treadfx[ "concrete" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "cushion" ] ) && treadfx[ "cushion" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "cushion" ] = loadfx( treadfx[ "cushion" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "none" ] ) && treadfx[ "none" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "none" ] = loadfx( treadfx[ "none" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "dirt" ] ) && treadfx[ "dirt" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "dirt" ] = loadfx( treadfx[ "dirt" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "flesh" ] ) && treadfx[ "flesh" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "flesh" ] = loadfx( treadfx[ "flesh" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "foliage" ] ) && treadfx[ "foliage" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "foliage" ] = loadfx( treadfx[ "foliage" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "fruit" ] ) && treadfx[ "fruit" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "fruit" ] = loadfx( treadfx[ "fruit" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "glass" ] ) && treadfx[ "glass" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "glass" ] = loadfx( treadfx[ "glass" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "grass" ] ) && treadfx[ "grass" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "grass" ] = loadfx( treadfx[ "grass" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "gravel" ] ) && treadfx[ "gravel" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "gravel" ] = loadfx( treadfx[ "gravel" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "metal" ] ) && treadfx[ "metal" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "metal" ] = loadfx( treadfx[ "metal" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "mud" ] ) && treadfx[ "mud" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "mud" ] = loadfx( treadfx[ "mud" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "paintedmetal" ] ) && treadfx[ "paintedmetal" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "paintedmetal" ] = loadfx( treadfx[ "paintedmetal" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "paper" ] ) && treadfx[ "paper" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "paper" ] = loadfx( treadfx[ "paper" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "plaster" ] ) && treadfx[ "plaster" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "plaster" ] = loadfx( treadfx[ "plaster" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "plastic" ] ) && treadfx[ "plastic" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "plastic" ] = loadfx( treadfx[ "plastic" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "rock" ] ) && treadfx[ "rock" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "rock" ] = loadfx( treadfx[ "rock" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "rubber" ] ) && treadfx[ "rubber" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "rubber" ] = loadfx( treadfx[ "rubber" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "sand" ] ) && treadfx[ "sand" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "sand" ] = loadfx( treadfx[ "sand" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "water" ] ) && treadfx[ "water" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "water" ] = loadfx( treadfx[ "water" ] );
|
||||
}
|
||||
if ( isDefined( treadfx[ "wood" ] ) && treadfx[ "wood" ] != "" )
|
||||
{
|
||||
vehicle.treadfx[ "wood" ] = loadfx( treadfx[ "wood" ] );
|
||||
}
|
||||
}
|
||||
treadfx = vehicle.treadfxnamearray;
|
||||
|
||||
if ( isdefined( treadfx ) )
|
||||
{
|
||||
vehicle.treadfx = [];
|
||||
|
||||
if ( isdefined( treadfx["asphalt"] ) && treadfx["asphalt"] != "" )
|
||||
vehicle.treadfx["asphalt"] = loadfx( treadfx["asphalt"] );
|
||||
|
||||
if ( isdefined( treadfx["bark"] ) && treadfx["bark"] != "" )
|
||||
vehicle.treadfx["bark"] = loadfx( treadfx["bark"] );
|
||||
|
||||
if ( isdefined( treadfx["brick"] ) && treadfx["brick"] != "" )
|
||||
vehicle.treadfx["brick"] = loadfx( treadfx["brick"] );
|
||||
|
||||
if ( isdefined( treadfx["carpet"] ) && treadfx["carpet"] != "" )
|
||||
vehicle.treadfx["carpet"] = loadfx( treadfx["carpet"] );
|
||||
|
||||
if ( isdefined( treadfx["ceramic"] ) && treadfx["ceramic"] != "" )
|
||||
vehicle.treadfx["ceramic"] = loadfx( treadfx["ceramic"] );
|
||||
|
||||
if ( isdefined( treadfx["cloth"] ) && treadfx["cloth"] != "" )
|
||||
vehicle.treadfx["cloth"] = loadfx( treadfx["cloth"] );
|
||||
|
||||
if ( isdefined( treadfx["concrete"] ) && treadfx["concrete"] != "" )
|
||||
vehicle.treadfx["concrete"] = loadfx( treadfx["concrete"] );
|
||||
|
||||
if ( isdefined( treadfx["cushion"] ) && treadfx["cushion"] != "" )
|
||||
vehicle.treadfx["cushion"] = loadfx( treadfx["cushion"] );
|
||||
|
||||
if ( isdefined( treadfx["none"] ) && treadfx["none"] != "" )
|
||||
vehicle.treadfx["none"] = loadfx( treadfx["none"] );
|
||||
|
||||
if ( isdefined( treadfx["dirt"] ) && treadfx["dirt"] != "" )
|
||||
vehicle.treadfx["dirt"] = loadfx( treadfx["dirt"] );
|
||||
|
||||
if ( isdefined( treadfx["flesh"] ) && treadfx["flesh"] != "" )
|
||||
vehicle.treadfx["flesh"] = loadfx( treadfx["flesh"] );
|
||||
|
||||
if ( isdefined( treadfx["foliage"] ) && treadfx["foliage"] != "" )
|
||||
vehicle.treadfx["foliage"] = loadfx( treadfx["foliage"] );
|
||||
|
||||
if ( isdefined( treadfx["fruit"] ) && treadfx["fruit"] != "" )
|
||||
vehicle.treadfx["fruit"] = loadfx( treadfx["fruit"] );
|
||||
|
||||
if ( isdefined( treadfx["glass"] ) && treadfx["glass"] != "" )
|
||||
vehicle.treadfx["glass"] = loadfx( treadfx["glass"] );
|
||||
|
||||
if ( isdefined( treadfx["grass"] ) && treadfx["grass"] != "" )
|
||||
vehicle.treadfx["grass"] = loadfx( treadfx["grass"] );
|
||||
|
||||
if ( isdefined( treadfx["gravel"] ) && treadfx["gravel"] != "" )
|
||||
vehicle.treadfx["gravel"] = loadfx( treadfx["gravel"] );
|
||||
|
||||
if ( isdefined( treadfx["metal"] ) && treadfx["metal"] != "" )
|
||||
vehicle.treadfx["metal"] = loadfx( treadfx["metal"] );
|
||||
|
||||
if ( isdefined( treadfx["mud"] ) && treadfx["mud"] != "" )
|
||||
vehicle.treadfx["mud"] = loadfx( treadfx["mud"] );
|
||||
|
||||
if ( isdefined( treadfx["paintedmetal"] ) && treadfx["paintedmetal"] != "" )
|
||||
vehicle.treadfx["paintedmetal"] = loadfx( treadfx["paintedmetal"] );
|
||||
|
||||
if ( isdefined( treadfx["paper"] ) && treadfx["paper"] != "" )
|
||||
vehicle.treadfx["paper"] = loadfx( treadfx["paper"] );
|
||||
|
||||
if ( isdefined( treadfx["plaster"] ) && treadfx["plaster"] != "" )
|
||||
vehicle.treadfx["plaster"] = loadfx( treadfx["plaster"] );
|
||||
|
||||
if ( isdefined( treadfx["plastic"] ) && treadfx["plastic"] != "" )
|
||||
vehicle.treadfx["plastic"] = loadfx( treadfx["plastic"] );
|
||||
|
||||
if ( isdefined( treadfx["rock"] ) && treadfx["rock"] != "" )
|
||||
vehicle.treadfx["rock"] = loadfx( treadfx["rock"] );
|
||||
|
||||
if ( isdefined( treadfx["rubber"] ) && treadfx["rubber"] != "" )
|
||||
vehicle.treadfx["rubber"] = loadfx( treadfx["rubber"] );
|
||||
|
||||
if ( isdefined( treadfx["sand"] ) && treadfx["sand"] != "" )
|
||||
vehicle.treadfx["sand"] = loadfx( treadfx["sand"] );
|
||||
|
||||
if ( isdefined( treadfx["water"] ) && treadfx["water"] != "" )
|
||||
vehicle.treadfx["water"] = loadfx( treadfx["water"] );
|
||||
|
||||
if ( isdefined( treadfx["wood"] ) && treadfx["wood"] != "" )
|
||||
vehicle.treadfx["wood"] = loadfx( treadfx["wood"] );
|
||||
}
|
||||
}
|
||||
|
||||
preloadtreadfx( vehicle ) //checked changed to match cerberus output
|
||||
preloadtreadfx( vehicle )
|
||||
{
|
||||
treadfx = getvehicletreadfxarray( vehicle );
|
||||
for ( i = 0; i < treadfx.size; i++ )
|
||||
{
|
||||
loadfx( treadfx[ i ] );
|
||||
}
|
||||
}
|
||||
treadfx = getvehicletreadfxarray( vehicle );
|
||||
|
||||
for ( i = 0; i < treadfx.size; i++ )
|
||||
loadfx( treadfx[i] );
|
||||
}
|
||||
|
@ -1,379 +1,342 @@
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/killstreaks/_emp;
|
||||
#include maps/mp/_tacticalinsertion;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes/_globallogic_audio;
|
||||
#include maps/mp/gametypes/_weaponobjects;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\_utility;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\gametypes\_weaponobjects;
|
||||
#include maps\mp\gametypes\_globallogic_audio;
|
||||
#include maps\mp\_challenges;
|
||||
#include maps\mp\_scoreevents;
|
||||
#include maps\mp\_tacticalinsertion;
|
||||
#include maps\mp\killstreaks\_emp;
|
||||
#include maps\mp\gametypes\_globallogic_player;
|
||||
#include maps\mp\gametypes\_damagefeedback;
|
||||
|
||||
#using_animtree( "mp_trophy_system" );
|
||||
#using_animtree("mp_trophy_system");
|
||||
|
||||
init()
|
||||
{
|
||||
precachemodel( "t6_wpn_trophy_system_world" );
|
||||
level.trophylongflashfx = loadfx( "weapon/trophy_system/fx_trophy_flash_lng" );
|
||||
level.trophydetonationfx = loadfx( "weapon/trophy_system/fx_trophy_radius_detonation" );
|
||||
level._effect[ "fx_trophy_friendly_light" ] = loadfx( "weapon/trophy_system/fx_trophy_light_friendly" );
|
||||
level._effect[ "fx_trophy_enemy_light" ] = loadfx( "weapon/trophy_system/fx_trophy_light_enemy" );
|
||||
level._effect[ "fx_trophy_deploy_impact" ] = loadfx( "weapon/trophy_system/fx_trophy_deploy_impact" );
|
||||
trophydeployanim = %o_trophy_deploy;
|
||||
trophyspinanim = %o_trophy_spin;
|
||||
precachemodel( "t6_wpn_trophy_system_world" );
|
||||
level.trophylongflashfx = loadfx( "weapon/trophy_system/fx_trophy_flash_lng" );
|
||||
level.trophydetonationfx = loadfx( "weapon/trophy_system/fx_trophy_radius_detonation" );
|
||||
level._effect["fx_trophy_friendly_light"] = loadfx( "weapon/trophy_system/fx_trophy_light_friendly" );
|
||||
level._effect["fx_trophy_enemy_light"] = loadfx( "weapon/trophy_system/fx_trophy_light_enemy" );
|
||||
level._effect["fx_trophy_deploy_impact"] = loadfx( "weapon/trophy_system/fx_trophy_deploy_impact" );
|
||||
trophydeployanim = %o_trophy_deploy;
|
||||
trophyspinanim = %o_trophy_spin;
|
||||
}
|
||||
|
||||
register()
|
||||
{
|
||||
registerclientfield( "missile", "trophy_system_state", 1, 2, "int" );
|
||||
registerclientfield( "scriptmover", "trophy_system_state", 1, 2, "int" );
|
||||
registerclientfield( "missile", "trophy_system_state", 1, 2, "int" );
|
||||
registerclientfield( "scriptmover", "trophy_system_state", 1, 2, "int" );
|
||||
}
|
||||
|
||||
createtrophysystemwatcher()
|
||||
{
|
||||
watcher = self maps/mp/gametypes/_weaponobjects::createuseweaponobjectwatcher( "trophy_system", "trophy_system_mp", self.team );
|
||||
watcher.detonate = ::trophysystemdetonate;
|
||||
watcher.activatesound = "wpn_claymore_alert";
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.reconmodel = "t6_wpn_trophy_system_world_detect";
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher.ignoredirection = 1;
|
||||
watcher.activationdelay = 0,1;
|
||||
watcher.headicon = 1;
|
||||
watcher.enemydestroy = 1;
|
||||
watcher.onspawn = ::ontrophysystemspawn;
|
||||
watcher.ondamage = ::watchtrophysystemdamage;
|
||||
watcher.ondestroyed = ::ontrophysystemsmashed;
|
||||
watcher.stun = ::weaponstun;
|
||||
watcher.stuntime = 1;
|
||||
watcher = self maps\mp\gametypes\_weaponobjects::createuseweaponobjectwatcher( "trophy_system", "trophy_system_mp", self.team );
|
||||
watcher.detonate = ::trophysystemdetonate;
|
||||
watcher.activatesound = "wpn_claymore_alert";
|
||||
watcher.hackable = 1;
|
||||
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
||||
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
||||
watcher.reconmodel = "t6_wpn_trophy_system_world_detect";
|
||||
watcher.ownergetsassist = 1;
|
||||
watcher.ignoredirection = 1;
|
||||
watcher.activationdelay = 0.1;
|
||||
watcher.headicon = 1;
|
||||
watcher.enemydestroy = 1;
|
||||
watcher.onspawn = ::ontrophysystemspawn;
|
||||
watcher.ondamage = ::watchtrophysystemdamage;
|
||||
watcher.ondestroyed = ::ontrophysystemsmashed;
|
||||
watcher.stun = ::weaponstun;
|
||||
watcher.stuntime = 1;
|
||||
}
|
||||
|
||||
ontrophysystemspawn( watcher, player )
|
||||
{
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self maps/mp/gametypes/_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
player addweaponstat( "trophy_system_mp", "used", 1 );
|
||||
self.ammo = 2;
|
||||
self thread trophyactive( player );
|
||||
self thread trophywatchhack();
|
||||
self setclientfield( "trophy_system_state", 1 );
|
||||
self playloopsound( "wpn_trophy_spin", 0,25 );
|
||||
if ( isDefined( watcher.reconmodel ) )
|
||||
{
|
||||
self thread setreconmodeldeployed();
|
||||
}
|
||||
player endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
level endon( "game_ended" );
|
||||
self maps\mp\gametypes\_weaponobjects::onspawnuseweaponobject( watcher, player );
|
||||
player addweaponstat( "trophy_system_mp", "used", 1 );
|
||||
self.ammo = 2;
|
||||
self thread trophyactive( player );
|
||||
self thread trophywatchhack();
|
||||
self setclientfield( "trophy_system_state", 1 );
|
||||
self playloopsound( "wpn_trophy_spin", 0.25 );
|
||||
|
||||
if ( isdefined( watcher.reconmodel ) )
|
||||
self thread setreconmodeldeployed();
|
||||
}
|
||||
|
||||
setreconmodeldeployed()
|
||||
{
|
||||
self endon( "death" );
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( self.reconmodelentity ) )
|
||||
{
|
||||
self.reconmodelentity setclientfield( "trophy_system_state", 1 );
|
||||
return;
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ( isdefined( self.reconmodelentity ) )
|
||||
{
|
||||
self.reconmodelentity setclientfield( "trophy_system_state", 1 );
|
||||
return;
|
||||
}
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
}
|
||||
|
||||
trophywatchhack()
|
||||
{
|
||||
self endon( "death" );
|
||||
self waittill( "hacked", player );
|
||||
wait 0,05;
|
||||
self thread trophyactive( player );
|
||||
self endon( "death" );
|
||||
|
||||
self waittill( "hacked", player );
|
||||
|
||||
wait 0.05;
|
||||
self thread trophyactive( player );
|
||||
}
|
||||
|
||||
ontrophysystemsmashed( attacker )
|
||||
{
|
||||
playfx( level._effect[ "tacticalInsertionFizzle" ], self.origin );
|
||||
self playsound( "dst_tac_insert_break" );
|
||||
self.owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" );
|
||||
if ( isDefined( attacker ) && self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment();
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_trophy_system", attacker, self.owner );
|
||||
}
|
||||
self delete();
|
||||
playfx( level._effect["tacticalInsertionFizzle"], self.origin );
|
||||
self playsound( "dst_tac_insert_break" );
|
||||
self.owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" );
|
||||
|
||||
if ( isdefined( attacker ) && self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedequipment();
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_trophy_system", attacker, self.owner );
|
||||
}
|
||||
|
||||
self delete();
|
||||
}
|
||||
|
||||
trophyactive( owner )
|
||||
{
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
while ( 1 )
|
||||
{
|
||||
tac_inserts = maps/mp/_tacticalinsertion::gettacticalinsertions();
|
||||
while ( level.missileentities.size < 1 || tac_inserts.size < 1 && isDefined( self.disabled ) )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
index = 0;
|
||||
while ( index < level.missileentities.size )
|
||||
{
|
||||
wait 0,05;
|
||||
grenade = level.missileentities[ index ];
|
||||
if ( !isDefined( grenade ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( grenade == self )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( isDefined( grenade.weaponname ) )
|
||||
{
|
||||
switch( grenade.weaponname )
|
||||
{
|
||||
case "claymore_mp":
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( isDefined( grenade.name ) && grenade.name == "tactical_insertion_mp" )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else switch( grenade.model )
|
||||
{
|
||||
case "t6_wpn_grenade_supply_projectile":
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( grenade.owner ) )
|
||||
{
|
||||
grenade.owner = getmissileowner( grenade );
|
||||
}
|
||||
if ( isDefined( grenade.owner ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( grenade.owner.team == owner.team )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else }
|
||||
else if ( grenade.owner == owner )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenadedistancesquared = distancesquared( grenade.origin, self.origin );
|
||||
if ( grenadedistancesquared < 262144 )
|
||||
{
|
||||
if ( bullettracepassed( grenade.origin, self.origin + vectorScale( ( 0, 0, 1 ), 29 ), 0, self ) )
|
||||
{
|
||||
playfx( level.trophylongflashfx, self.origin + vectorScale( ( 0, 0, 1 ), 15 ), grenade.origin - self.origin, anglesToUp( self.angles ) );
|
||||
owner thread projectileexplode( grenade, self );
|
||||
index--;
|
||||
owner endon( "disconnect" );
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
|
||||
self playsound( "wpn_trophy_alert" );
|
||||
self.ammo--;
|
||||
while ( true )
|
||||
{
|
||||
tac_inserts = maps\mp\_tacticalinsertion::gettacticalinsertions();
|
||||
|
||||
if ( self.ammo <= 0 )
|
||||
{
|
||||
self thread trophysystemdetonate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
index = 0;
|
||||
while ( index < tac_inserts.size )
|
||||
{
|
||||
wait 0,05;
|
||||
tac_insert = tac_inserts[ index ];
|
||||
if ( !isDefined( tac_insert ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else if ( isDefined( tac_insert.owner ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( tac_insert.owner.team == owner.team )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else }
|
||||
else if ( tac_insert.owner == owner )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
grenadedistancesquared = distancesquared( tac_insert.origin, self.origin );
|
||||
if ( grenadedistancesquared < 262144 )
|
||||
{
|
||||
if ( bullettracepassed( tac_insert.origin, self.origin + vectorScale( ( 0, 0, 1 ), 29 ), 0, tac_insert ) )
|
||||
{
|
||||
playfx( level.trophylongflashfx, self.origin + vectorScale( ( 0, 0, 1 ), 15 ), tac_insert.origin - self.origin, anglesToUp( self.angles ) );
|
||||
owner thread trophydestroytacinsert( tac_insert, self );
|
||||
index--;
|
||||
if ( level.missileentities.size < 1 && tac_inserts.size < 1 || isdefined( self.disabled ) )
|
||||
{
|
||||
wait 0.05;
|
||||
continue;
|
||||
}
|
||||
|
||||
self playsound( "wpn_trophy_alert" );
|
||||
self.ammo--;
|
||||
for ( index = 0; index < level.missileentities.size; index++ )
|
||||
{
|
||||
wait 0.05;
|
||||
grenade = level.missileentities[index];
|
||||
|
||||
if ( self.ammo <= 0 )
|
||||
{
|
||||
self thread trophysystemdetonate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !isdefined( grenade ) )
|
||||
continue;
|
||||
|
||||
if ( grenade == self )
|
||||
continue;
|
||||
|
||||
if ( isdefined( grenade.weaponname ) )
|
||||
{
|
||||
switch ( grenade.weaponname )
|
||||
{
|
||||
case "claymore_mp":
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( grenade.name ) && grenade.name == "tactical_insertion_mp" )
|
||||
continue;
|
||||
|
||||
switch ( grenade.model )
|
||||
{
|
||||
case "t6_wpn_grenade_supply_projectile":
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( !isdefined( grenade.owner ) )
|
||||
grenade.owner = getmissileowner( grenade );
|
||||
|
||||
if ( isdefined( grenade.owner ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( grenade.owner.team == owner.team )
|
||||
continue;
|
||||
}
|
||||
else if ( grenade.owner == owner )
|
||||
continue;
|
||||
|
||||
grenadedistancesquared = distancesquared( grenade.origin, self.origin );
|
||||
|
||||
if ( grenadedistancesquared < 262144 )
|
||||
{
|
||||
if ( bullettracepassed( grenade.origin, self.origin + vectorscale( ( 0, 0, 1 ), 29.0 ), 0, self ) )
|
||||
{
|
||||
playfx( level.trophylongflashfx, self.origin + vectorscale( ( 0, 0, 1 ), 15.0 ), grenade.origin - self.origin, anglestoup( self.angles ) );
|
||||
owner thread projectileexplode( grenade, self );
|
||||
index--;
|
||||
self playsound( "wpn_trophy_alert" );
|
||||
self.ammo--;
|
||||
|
||||
if ( self.ammo <= 0 )
|
||||
self thread trophysystemdetonate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( index = 0; index < tac_inserts.size; index++ )
|
||||
{
|
||||
wait 0.05;
|
||||
tac_insert = tac_inserts[index];
|
||||
|
||||
if ( !isdefined( tac_insert ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( tac_insert.owner ) )
|
||||
{
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( tac_insert.owner.team == owner.team )
|
||||
continue;
|
||||
}
|
||||
else if ( tac_insert.owner == owner )
|
||||
continue;
|
||||
|
||||
grenadedistancesquared = distancesquared( tac_insert.origin, self.origin );
|
||||
|
||||
if ( grenadedistancesquared < 262144 )
|
||||
{
|
||||
if ( bullettracepassed( tac_insert.origin, self.origin + vectorscale( ( 0, 0, 1 ), 29.0 ), 0, tac_insert ) )
|
||||
{
|
||||
playfx( level.trophylongflashfx, self.origin + vectorscale( ( 0, 0, 1 ), 15.0 ), tac_insert.origin - self.origin, anglestoup( self.angles ) );
|
||||
owner thread trophydestroytacinsert( tac_insert, self );
|
||||
index--;
|
||||
self playsound( "wpn_trophy_alert" );
|
||||
self.ammo--;
|
||||
|
||||
if ( self.ammo <= 0 )
|
||||
self thread trophysystemdetonate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
projectileexplode( projectile, trophy )
|
||||
{
|
||||
self endon( "death" );
|
||||
projposition = projectile.origin;
|
||||
playfx( level.trophydetonationfx, projposition );
|
||||
projectile delete();
|
||||
trophy radiusdamage( projposition, 128, 105, 10, self );
|
||||
maps/mp/_scoreevents::processscoreevent( "trophy_defense", self );
|
||||
self addplayerstat( "destroy_explosive_with_trophy", 1 );
|
||||
self addweaponstat( "trophy_system_mp", "CombatRecordStat", 1 );
|
||||
self endon( "death" );
|
||||
projposition = projectile.origin;
|
||||
playfx( level.trophydetonationfx, projposition );
|
||||
projectile delete();
|
||||
trophy radiusdamage( projposition, 128, 105, 10, self );
|
||||
maps\mp\_scoreevents::processscoreevent( "trophy_defense", self );
|
||||
self addplayerstat( "destroy_explosive_with_trophy", 1 );
|
||||
self addweaponstat( "trophy_system_mp", "CombatRecordStat", 1 );
|
||||
}
|
||||
|
||||
trophydestroytacinsert( tacinsert, trophy )
|
||||
{
|
||||
self endon( "death" );
|
||||
tacpos = tacinsert.origin;
|
||||
playfx( level.trophydetonationfx, tacinsert.origin );
|
||||
tacinsert thread maps/mp/_tacticalinsertion::tacticalinsertiondestroyedbytrophysystem( self, trophy );
|
||||
trophy radiusdamage( tacpos, 128, 105, 10, self );
|
||||
maps/mp/_scoreevents::processscoreevent( "trophy_defense", self );
|
||||
self addplayerstat( "destroy_explosive_with_trophy", 1 );
|
||||
self addweaponstat( "trophy_system_mp", "CombatRecordStat", 1 );
|
||||
self endon( "death" );
|
||||
tacpos = tacinsert.origin;
|
||||
playfx( level.trophydetonationfx, tacinsert.origin );
|
||||
tacinsert thread maps\mp\_tacticalinsertion::tacticalinsertiondestroyedbytrophysystem( self, trophy );
|
||||
trophy radiusdamage( tacpos, 128, 105, 10, self );
|
||||
maps\mp\_scoreevents::processscoreevent( "trophy_defense", self );
|
||||
self addplayerstat( "destroy_explosive_with_trophy", 1 );
|
||||
self addweaponstat( "trophy_system_mp", "CombatRecordStat", 1 );
|
||||
}
|
||||
|
||||
trophysystemdetonate( attacker, weaponname )
|
||||
{
|
||||
from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname );
|
||||
if ( !from_emp )
|
||||
{
|
||||
playfx( level._equipment_explode_fx_lg, self.origin );
|
||||
}
|
||||
if ( isDefined( attacker ) && self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps/mp/_challenges::destroyedequipment( weaponname );
|
||||
maps/mp/_scoreevents::processscoreevent( "destroyed_trophy_system", attacker, self.owner, weaponname );
|
||||
}
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self delete();
|
||||
from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname );
|
||||
|
||||
if ( !from_emp )
|
||||
playfx( level._equipment_explode_fx_lg, self.origin );
|
||||
|
||||
if ( isdefined( attacker ) && self.owner isenemyplayer( attacker ) )
|
||||
{
|
||||
attacker maps\mp\_challenges::destroyedequipment( weaponname );
|
||||
maps\mp\_scoreevents::processscoreevent( "destroyed_trophy_system", attacker, self.owner, weaponname );
|
||||
}
|
||||
|
||||
playsoundatposition( "dst_equipment_destroy", self.origin );
|
||||
self delete();
|
||||
}
|
||||
|
||||
watchtrophysystemdamage( watcher )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 20;
|
||||
if ( !self maps/mp/_utility::ishacked() )
|
||||
{
|
||||
self.damagetaken = 0;
|
||||
}
|
||||
self.maxhealth = 10000;
|
||||
self.health = self.maxhealth;
|
||||
self setmaxhealth( self.maxhealth );
|
||||
attacker = undefined;
|
||||
for ( ;; )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags );
|
||||
while ( !isplayer( attacker ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
while ( level.teambased )
|
||||
{
|
||||
while ( !level.hardcoremode && self.owner.team == attacker.pers[ "team" ] && self.owner != attacker )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( isDefined( weaponname ) )
|
||||
{
|
||||
switch( weaponname )
|
||||
{
|
||||
case "concussion_grenade_mp":
|
||||
case "flash_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
{
|
||||
self thread maps/mp/gametypes/_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
}
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
{
|
||||
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weaponname = "";
|
||||
}
|
||||
if ( type == "MOD_MELEE" )
|
||||
{
|
||||
self.damagetaken = damagemax;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.damagetaken += damage;
|
||||
}
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0,05, attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "hacked" );
|
||||
self setcandamage( 1 );
|
||||
damagemax = 20;
|
||||
|
||||
if ( !self maps\mp\_utility::ishacked() )
|
||||
self.damagetaken = 0;
|
||||
|
||||
self.maxhealth = 10000;
|
||||
self.health = self.maxhealth;
|
||||
self setmaxhealth( self.maxhealth );
|
||||
attacker = undefined;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags );
|
||||
|
||||
if ( !isplayer( attacker ) )
|
||||
continue;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
if ( !level.hardcoremode && self.owner.team == attacker.pers["team"] && self.owner != attacker )
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( isdefined( weaponname ) )
|
||||
{
|
||||
switch ( weaponname )
|
||||
{
|
||||
case "flash_grenade_mp":
|
||||
case "concussion_grenade_mp":
|
||||
if ( watcher.stuntime > 0 )
|
||||
self thread maps\mp\gametypes\_weaponobjects::stunstart( watcher, watcher.stuntime );
|
||||
|
||||
if ( level.teambased && self.owner.team != attacker.team )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
else if ( !level.teambased && self.owner != attacker )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
}
|
||||
|
||||
continue;
|
||||
case "emp_grenade_mp":
|
||||
damage = damagemax;
|
||||
default:
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) )
|
||||
attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
weaponname = "";
|
||||
|
||||
if ( type == "MOD_MELEE" )
|
||||
self.damagetaken = damagemax;
|
||||
else
|
||||
self.damagetaken += damage;
|
||||
|
||||
if ( self.damagetaken >= damagemax )
|
||||
{
|
||||
watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0.05, attacker, weaponname );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,106 +1,105 @@
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isDefined( self.enemy ) );
|
||||
assert( isdefined( self.enemy ) );
|
||||
#/
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isplayer( self.enemy ) )
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
}
|
||||
|
||||
combatidle()
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
idleanims = [];
|
||||
idleanims[ 0 ] = "combat_attackidle";
|
||||
idleanims[ 1 ] = "combat_attackidle_bark";
|
||||
idleanims[ 2 ] = "combat_attackidle_growl";
|
||||
idleanim = random( idleanims );
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstate( idleanim );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
idleanims = [];
|
||||
idleanims[0] = "combat_attackidle";
|
||||
idleanims[1] = "combat_attackidle_bark";
|
||||
idleanims[2] = "combat_attackidle_growl";
|
||||
idleanim = random( idleanims );
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstate( idleanim );
|
||||
self maps\mp\animscripts\shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
}
|
||||
|
||||
meleebiteattackplayer( player )
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas", 0 );
|
||||
self setanimstate( "combat_attack_player_close_range" );
|
||||
wait 0,35;
|
||||
if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" )
|
||||
{
|
||||
self meleewithoffset( vectorScale( ( 0, 0, -1 ), 9 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
self melee();
|
||||
}
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( 1,2, "done" );
|
||||
self animmode( "gravity", 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstate( "combat_attack_run" );
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas", 0 );
|
||||
self setanimstate( "combat_attack_player_close_range" );
|
||||
wait 0.35;
|
||||
|
||||
if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" )
|
||||
self meleewithoffset( vectorscale( ( 0, 0, -1 ), 9.0 ) );
|
||||
else
|
||||
self melee();
|
||||
|
||||
self maps\mp\animscripts\shared::donotetracksfortime( 1.2, "done" );
|
||||
self animmode( "gravity", 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1.2 + randomfloat( 0.4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstate( "combat_attack_run" );
|
||||
self maps\mp\animscripts\shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks( note, player )
|
||||
{
|
||||
if ( note == "dog_melee" )
|
||||
{
|
||||
self melee( anglesToForward( self.angles ) );
|
||||
}
|
||||
if ( note == "dog_melee" )
|
||||
self melee( anglestoforward( self.angles ) );
|
||||
}
|
||||
|
||||
use_low_attack()
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
if ( self.enemy getstance() == "prone" )
|
||||
{
|
||||
attack_height = self.origin[ 2 ] + 16;
|
||||
if ( self.enemy.origin[ 2 ] < attack_height )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
if ( self.enemy getstance() == "prone" )
|
||||
{
|
||||
attack_height = self.origin[2] + 16;
|
||||
|
||||
if ( self.enemy.origin[2] < attack_height )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1,62 +1,64 @@
|
||||
#include maps/mp/animscripts/dog_combat;
|
||||
#include maps/mp/animscripts/dog_move;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\animscripts\shared;
|
||||
#include maps\mp\animscripts\utility;
|
||||
#include maps\mp\animscripts\dog_move;
|
||||
#include maps\mp\animscripts\dog_combat;
|
||||
|
||||
main()
|
||||
{
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps/mp/animscripts/dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
anim_get_dvar_int( "dog_force_walk", 0 );
|
||||
anim_get_dvar_int( "dog_force_run", 0 );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "run";
|
||||
set_anim_playback_rate();
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416,82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "dog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
if ( !isDefined( level.dog_hits_before_kill ) )
|
||||
{
|
||||
level.dog_hits_before_kill = 1;
|
||||
}
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps\mp\animscripts\dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
anim_get_dvar_int( "dog_force_walk", 0 );
|
||||
anim_get_dvar_int( "dog_force_run", 0 );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "run";
|
||||
set_anim_playback_rate();
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416.82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "dog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
|
||||
if ( !isdefined( level.dog_hits_before_kill ) )
|
||||
level.dog_hits_before_kill = 1;
|
||||
}
|
||||
|
||||
set_anim_playback_rate()
|
||||
{
|
||||
self.animplaybackrate = 0,9 + randomfloat( 0,2 );
|
||||
self.moveplaybackrate = 1;
|
||||
self.animplaybackrate = 0.9 + randomfloat( 0.2 );
|
||||
self.moveplaybackrate = 1;
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self.meleeattackdist = 0;
|
||||
if ( self maps/mp/animscripts/dog_combat::use_low_attack() )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
self endon( "death" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self.meleeattackdist = 0;
|
||||
|
||||
if ( self maps\mp\animscripts\dog_combat::use_low_attack() )
|
||||
self.meleeattackdist = 64;
|
||||
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,100 +1,88 @@
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
|
||||
bot_conf_think() //checked matches cerberus output
|
||||
bot_conf_think()
|
||||
{
|
||||
time = getTime();
|
||||
if ( time < self.bot.update_objective )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
goal = self getgoal( "conf_dogtag" );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
if ( !conf_tag_in_radius( goal, 64 ) )
|
||||
{
|
||||
self cancelgoal( "conf_dogtag" );
|
||||
}
|
||||
}
|
||||
conf_get_tag_in_sight();
|
||||
time = gettime();
|
||||
|
||||
if ( time < self.bot.update_objective )
|
||||
return;
|
||||
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
goal = self getgoal( "conf_dogtag" );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
if ( !conf_tag_in_radius( goal, 64 ) )
|
||||
self cancelgoal( "conf_dogtag" );
|
||||
}
|
||||
|
||||
conf_get_tag_in_sight();
|
||||
}
|
||||
|
||||
conf_get_tag_in_sight() //checked partially changed to match cerberus output did not use foreach see github for more info
|
||||
conf_get_tag_in_sight()
|
||||
{
|
||||
angles = self getplayerangles();
|
||||
forward = anglesToForward( angles );
|
||||
forward = vectornormalize( forward );
|
||||
closest = 999999;
|
||||
tags = level.dogtags;
|
||||
i = 0;
|
||||
while ( i < tags.size )
|
||||
{
|
||||
if ( is_true( tags[ i ].unreachable ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
distsq = distancesquared( tags[ i ].curorigin, self.origin );
|
||||
if ( distsq > closest )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
delta = tags[ i ].curorigin - self.origin;
|
||||
delta = vectornormalize( delta );
|
||||
dot = vectordot( forward, delta );
|
||||
if ( dot < self.bot.fov && distsq > 40000 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( dot > self.bot.fov && distsq > 1440000 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
nearest = getnearestnode( tags[ i ].curorigin );
|
||||
if ( !isDefined( nearest ) )
|
||||
{
|
||||
tags[ i ].unreachable = 1;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( ( tags[ i ].curorigin[ 2 ] - nearest.origin[ 2 ] ) > 18 )
|
||||
{
|
||||
tags[ i ].unreachable = 1;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( tags[ i ].unreachable ) && !findpath( self.origin, tags[ i ].curorigin, tags[ i ], 0, 1 ) )
|
||||
{
|
||||
tags[ i ].unreachable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
tags[ i ].unreachable = 0;
|
||||
}
|
||||
closest = distsq;
|
||||
closetag = tags[ i ];
|
||||
i++;
|
||||
}
|
||||
if ( isDefined( closetag ) )
|
||||
{
|
||||
self addgoal( closetag.curorigin, 16, 3, "conf_dogtag" );
|
||||
}
|
||||
angles = self getplayerangles();
|
||||
forward = anglestoforward( angles );
|
||||
forward = vectornormalize( forward );
|
||||
closest = 999999;
|
||||
|
||||
foreach ( tag in level.dogtags )
|
||||
{
|
||||
if ( is_true( tag.unreachable ) )
|
||||
continue;
|
||||
|
||||
distsq = distancesquared( tag.curorigin, self.origin );
|
||||
|
||||
if ( distsq > closest )
|
||||
continue;
|
||||
|
||||
delta = tag.curorigin - self.origin;
|
||||
delta = vectornormalize( delta );
|
||||
dot = vectordot( forward, delta );
|
||||
|
||||
if ( dot < self.bot.fov && distsq > 40000 )
|
||||
continue;
|
||||
|
||||
if ( dot > self.bot.fov && distsq > 1440000 )
|
||||
continue;
|
||||
|
||||
nearest = getnearestnode( tag.curorigin );
|
||||
|
||||
if ( !isdefined( nearest ) )
|
||||
{
|
||||
tag.unreachable = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( tag.curorigin[2] - nearest.origin[2] > 18 )
|
||||
{
|
||||
tag.unreachable = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( !isdefined( tag.unreachable ) && !findpath( self.origin, tag.curorigin, tag, 0, 1 ) )
|
||||
tag.unreachable = 1;
|
||||
else
|
||||
tag.unreachable = 0;
|
||||
|
||||
closest = distsq;
|
||||
closetag = tag;
|
||||
}
|
||||
|
||||
if ( isdefined( closetag ) )
|
||||
self addgoal( closetag.curorigin, 16, 3, "conf_dogtag" );
|
||||
}
|
||||
|
||||
conf_tag_in_radius( origin, radius ) //checked changed to match cerberus output
|
||||
conf_tag_in_radius( origin, radius )
|
||||
{
|
||||
foreach ( tag in level.dogtags )
|
||||
{
|
||||
if ( distancesquared( origin, tag.curorigin ) < radius * radius )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
foreach ( tag in level.dogtags )
|
||||
{
|
||||
if ( distancesquared( origin, tag.curorigin ) < radius * radius )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,383 +1,362 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_gameobjects;
|
||||
#include maps/mp/bots/_bot_combat;
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes/ctf;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\ctf;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\bots\_bot;
|
||||
#include maps\mp\bots\_bot_combat;
|
||||
#include maps\mp\gametypes\_gameobjects;
|
||||
|
||||
bot_ctf_think() //checked changed to match cerberus output changed at own discretion
|
||||
bot_ctf_think()
|
||||
{
|
||||
time = getTime();
|
||||
if ( time < self.bot.update_objective )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
if ( maps/mp/bots/_bot::bot_get_difficulty() != "easy" )
|
||||
{
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
if ( flag_mine ishome() && distancesquared( self.origin, flag_mine.curorigin ) < 262144 )
|
||||
{
|
||||
nodes = getnodesinradius( flag_mine.curorigin, 256, 0, 64, "any", 8 );
|
||||
node = random( nodes );
|
||||
if ( cointoss() )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( node.origin );
|
||||
}
|
||||
if ( cointoss() )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_toss_frag( node.origin );
|
||||
}
|
||||
if ( cointoss() )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_toss_flash( node.origin );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( bot_should_patrol_flag() )
|
||||
{
|
||||
bot_patrol_flag();
|
||||
return;
|
||||
}
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
if ( !bot_ctf_defend() )
|
||||
{
|
||||
bot_ctf_capture();
|
||||
}
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
if ( ctf_has_flag( flag_enemy ) && self issprinting() && distancesquared( self.origin, home_mine ) < 36864 )
|
||||
{
|
||||
if ( bot_dot_product( home_mine ) > 0.9 )
|
||||
{
|
||||
self bot_dive_to_prone( "stand" );
|
||||
}
|
||||
}
|
||||
else if ( !flag_mine ishome() && !isDefined( flag_mine.carrier ) )
|
||||
{
|
||||
if ( self issprinting() && distancesquared( self.origin, flag_mine.curorigin ) < 36864 )
|
||||
{
|
||||
if ( bot_dot_product( flag_mine.curorigin ) > 0.9 )
|
||||
{
|
||||
self bot_dive_to_prone( "stand" );
|
||||
}
|
||||
}
|
||||
}
|
||||
time = gettime();
|
||||
|
||||
if ( time < self.bot.update_objective )
|
||||
return;
|
||||
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
|
||||
if ( maps\mp\bots\_bot::bot_get_difficulty() != "easy" )
|
||||
{
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
|
||||
if ( flag_mine ishome() && distancesquared( self.origin, flag_mine.curorigin ) < 262144 )
|
||||
{
|
||||
nodes = getnodesinradius( flag_mine.curorigin, 256, 0, 64, "any", 8 );
|
||||
node = random( nodes );
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( cointoss() ? flag_mine.curorigin : node.origin );
|
||||
self maps\mp\bots\_bot_combat::bot_combat_toss_frag( cointoss() ? flag_mine.curorigin : node.origin );
|
||||
self maps\mp\bots\_bot_combat::bot_combat_toss_flash( cointoss() ? flag_mine.curorigin : node.origin );
|
||||
}
|
||||
}
|
||||
|
||||
if ( bot_should_patrol_flag() )
|
||||
{
|
||||
bot_patrol_flag();
|
||||
return;
|
||||
}
|
||||
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
|
||||
if ( !bot_ctf_defend() )
|
||||
bot_ctf_capture();
|
||||
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
|
||||
if ( ctf_has_flag( flag_enemy ) && self issprinting() && distancesquared( self.origin, home_mine ) < 36864 )
|
||||
{
|
||||
if ( bot_dot_product( home_mine ) > 0.9 )
|
||||
self bot_dive_to_prone( "stand" );
|
||||
}
|
||||
else if ( !flag_mine ishome() && !isdefined( flag_mine.carrier ) )
|
||||
{
|
||||
if ( self issprinting() && distancesquared( self.origin, flag_mine.curorigin ) < 36864 )
|
||||
{
|
||||
if ( bot_dot_product( flag_mine.curorigin ) > 0.9 )
|
||||
self bot_dive_to_prone( "stand" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bot_should_patrol_flag() //checked matches cerberus output
|
||||
bot_should_patrol_flag()
|
||||
{
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
if ( self hasgoal( "ctf_flag" ) && !self atgoal( "ctf_flag" ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( ctf_has_flag( flag_enemy ) )
|
||||
{
|
||||
if ( !flag_mine ishome() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( !flag_mine ishome() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distancesquared( self.origin, flag_enemy.curorigin ) < 262144 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( bot_get_friends().size && self maps/mp/bots/_bot::bot_friend_goal_in_radius( "ctf_flag_patrol", home_mine, 1024 ) == 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
|
||||
if ( self hasgoal( "ctf_flag" ) && !self atgoal( "ctf_flag" ) )
|
||||
return false;
|
||||
|
||||
if ( ctf_has_flag( flag_enemy ) )
|
||||
{
|
||||
if ( !flag_mine ishome() )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( !flag_mine ishome() )
|
||||
return false;
|
||||
|
||||
if ( distancesquared( self.origin, flag_enemy.curorigin ) < 262144 )
|
||||
return false;
|
||||
|
||||
if ( bot_get_friends().size && self maps\mp\bots\_bot::bot_friend_goal_in_radius( "ctf_flag_patrol", home_mine, 1024 ) == 0 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ctf_get_flag( team ) //checked changed to match cerberus output
|
||||
ctf_get_flag( team )
|
||||
{
|
||||
foreach ( f in level.flags )
|
||||
{
|
||||
if ( f maps/mp/gametypes/_gameobjects::getownerteam() == team )
|
||||
{
|
||||
return f;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
foreach ( f in level.flags )
|
||||
{
|
||||
if ( f maps\mp\gametypes\_gameobjects::getownerteam() == team )
|
||||
return f;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
ctf_flag_get_home() //checked matches cerberus output
|
||||
ctf_flag_get_home()
|
||||
{
|
||||
return self.trigger.baseorigin;
|
||||
return self.trigger.baseorigin;
|
||||
}
|
||||
|
||||
ctf_has_flag( flag ) //checked changed at own discretion
|
||||
ctf_has_flag( flag )
|
||||
{
|
||||
if ( isDefined( flag.carrier ) && flag.carrier == self )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
return isdefined( flag.carrier ) && flag.carrier == self;
|
||||
}
|
||||
|
||||
bot_ctf_capture() //checked changed to match cerberus output
|
||||
bot_ctf_capture()
|
||||
{
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
home_enemy = flag_enemy ctf_flag_get_home();
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
if ( ctf_has_flag( flag_enemy ) )
|
||||
{
|
||||
self addgoal( home_mine, 16, 4, "ctf_flag" );
|
||||
}
|
||||
else if ( isDefined( flag_enemy.carrier ) )
|
||||
{
|
||||
if ( self atgoal( "ctf_flag" ) )
|
||||
{
|
||||
self cancelgoal( "ctf_flag" );
|
||||
}
|
||||
goal = self getgoal( "ctf_flag" );
|
||||
if ( isDefined( goal ) && distancesquared( goal, flag_enemy.carrier.origin ) < 589824 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
nodes = getnodesinradius( flag_enemy.carrier.origin, 512, 64, 256, "any", 8 );
|
||||
if ( nodes.size )
|
||||
{
|
||||
self addgoal( random( nodes ), 16, 3, "ctf_flag" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self addgoal( flag_enemy.carrier.origin, 16, 3, "ctf_flag" );
|
||||
}
|
||||
}
|
||||
else if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "ctf_flag", flag_enemy.curorigin, 16 ) <= 1 )
|
||||
{
|
||||
self addgoal( flag_enemy.curorigin, 16, 3, "ctf_flag" );
|
||||
}
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
home_enemy = flag_enemy ctf_flag_get_home();
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
|
||||
if ( ctf_has_flag( flag_enemy ) )
|
||||
self addgoal( home_mine, 16, 4, "ctf_flag" );
|
||||
else if ( isdefined( flag_enemy.carrier ) )
|
||||
{
|
||||
if ( self atgoal( "ctf_flag" ) )
|
||||
self cancelgoal( "ctf_flag" );
|
||||
|
||||
goal = self getgoal( "ctf_flag" );
|
||||
|
||||
if ( isdefined( goal ) && distancesquared( goal, flag_enemy.carrier.origin ) < 589824 )
|
||||
return;
|
||||
|
||||
nodes = getnodesinradius( flag_enemy.carrier.origin, 512, 64, 256, "any", 8 );
|
||||
|
||||
if ( nodes.size )
|
||||
self addgoal( random( nodes ), 16, 3, "ctf_flag" );
|
||||
else
|
||||
self addgoal( flag_enemy.carrier.origin, 16, 3, "ctf_flag" );
|
||||
}
|
||||
else if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "ctf_flag", flag_enemy.curorigin, 16 ) <= 1 )
|
||||
self addgoal( flag_enemy.curorigin, 16, 3, "ctf_flag" );
|
||||
}
|
||||
|
||||
bot_ctf_defend() //checked changed to match cerberus output
|
||||
bot_ctf_defend()
|
||||
{
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
home_enemy = flag_enemy ctf_flag_get_home();
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
if ( flag_mine ishome() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( ctf_has_flag( flag_enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( flag_mine.carrier ) )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "ctf_flag", flag_mine.curorigin, 16 ) <= 1 )
|
||||
{
|
||||
return self bot_ctf_add_goal( flag_mine.curorigin, 4, "ctf_flag" );
|
||||
}
|
||||
}
|
||||
else if ( !flag_enemy ishome() || distance2dsquared( self.origin, home_enemy ) > 250000 )
|
||||
{
|
||||
return self bot_ctf_add_goal( flag_mine.curorigin, 4, "ctf_flag" );
|
||||
}
|
||||
else if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "ctf_flag", home_enemy, 16 ) <= 1 )
|
||||
{
|
||||
self addgoal( home_enemy, 16, 4, "ctf_flag" );
|
||||
}
|
||||
return 1;
|
||||
flag_enemy = ctf_get_flag( getotherteam( self.team ) );
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
home_enemy = flag_enemy ctf_flag_get_home();
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
|
||||
if ( flag_mine ishome() )
|
||||
return 0;
|
||||
|
||||
if ( ctf_has_flag( flag_enemy ) )
|
||||
return 0;
|
||||
|
||||
if ( !isdefined( flag_mine.carrier ) )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "ctf_flag", flag_mine.curorigin, 16 ) <= 1 )
|
||||
return self bot_ctf_add_goal( flag_mine.curorigin, 4, "ctf_flag" );
|
||||
}
|
||||
else if ( !flag_enemy ishome() || distance2dsquared( self.origin, home_enemy ) > 250000 )
|
||||
return self bot_ctf_add_goal( flag_mine.curorigin, 4, "ctf_flag" );
|
||||
else if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "ctf_flag", home_enemy, 16 ) <= 1 )
|
||||
self addgoal( home_enemy, 16, 4, "ctf_flag" );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
bot_ctf_add_goal( origin, goal_priority, goal_name ) //checked matches cerberus output
|
||||
bot_ctf_add_goal( origin, goal_priority, goal_name )
|
||||
{
|
||||
goal = undefined;
|
||||
if ( findpath( self.origin, origin, undefined, 0, 1 ) )
|
||||
{
|
||||
goal = origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
node = bot_ctf_random_visible_node( origin );
|
||||
if ( isDefined( node ) )
|
||||
{
|
||||
if ( findpath( self.origin, node.origin, undefined, 0, 1 ) )
|
||||
{
|
||||
goal = node;
|
||||
self.bot.update_objective += randomintrange( 3000, 5000 );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 16, goal_priority, goal_name );
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
goal = undefined;
|
||||
|
||||
if ( findpath( self.origin, origin, undefined, 0, 1 ) )
|
||||
goal = origin;
|
||||
else
|
||||
{
|
||||
node = bot_ctf_random_visible_node( origin );
|
||||
|
||||
if ( isdefined( node ) )
|
||||
{
|
||||
if ( findpath( self.origin, node.origin, undefined, 0, 1 ) )
|
||||
{
|
||||
goal = node;
|
||||
self.bot.update_objective += randomintrange( 3000, 5000 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 16, goal_priority, goal_name );
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_get_look_at() //checked matches cerberus output
|
||||
bot_get_look_at()
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
enemies = self maps/mp/bots/_bot::bot_get_enemies( 0 );
|
||||
if ( enemies.size )
|
||||
{
|
||||
enemy = random( enemies );
|
||||
}
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
return home_mine;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
enemies = self maps\mp\bots\_bot::bot_get_enemies( 0 );
|
||||
|
||||
if ( enemies.size )
|
||||
enemy = random( enemies );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
home_mine = flag_mine ctf_flag_get_home();
|
||||
return home_mine;
|
||||
}
|
||||
|
||||
bot_patrol_flag() //checked changed to match cerberus output
|
||||
bot_patrol_flag()
|
||||
{
|
||||
self cancelgoal( "ctf_flag" );
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
if ( self atgoal( "ctf_flag_patrol" ) )
|
||||
{
|
||||
node = getnearestnode( self.origin );
|
||||
if ( !isDefined( node ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
return;
|
||||
}
|
||||
if ( node.type == "Path" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setstance( "stand" );
|
||||
}
|
||||
if ( getTime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
{
|
||||
z = randomintrange( 16, 60 );
|
||||
}
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorScale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self.bot.update_lookat = getTime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
goal = self getgoal( "ctf_flag_patrol" );
|
||||
nearest = base_nearest_node( flag_mine );
|
||||
mine = getnearestnode( goal );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
}
|
||||
if ( getTime() > self.bot.update_objective_patrol )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
nearest = base_nearest_node( flag_mine );
|
||||
if ( self hasgoal( "ctf_flag_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "ctf_flag_patrol" );
|
||||
if ( distancesquared( self.origin, goal ) < 65536 )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
self lookat( origin );
|
||||
}
|
||||
if ( distancesquared( self.origin, goal ) < 16384 )
|
||||
{
|
||||
self.bot.update_objective_patrol = getTime() + randomintrange( 3000, 6000 );
|
||||
}
|
||||
mine = getnearestnode( goal );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( getTime() < self.bot.update_objective_patrol )
|
||||
{
|
||||
return;
|
||||
}
|
||||
nodes = getvisiblenodes( nearest );
|
||||
/*
|
||||
self cancelgoal( "ctf_flag" );
|
||||
flag_mine = ctf_get_flag( self.team );
|
||||
|
||||
if ( self atgoal( "ctf_flag_patrol" ) )
|
||||
{
|
||||
node = getnearestnode( self.origin );
|
||||
|
||||
if ( !isdefined( node ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( node.type == "Path" )
|
||||
self setstance( "crouch" );
|
||||
else
|
||||
self setstance( "stand" );
|
||||
|
||||
if ( gettime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
z = randomintrange( 16, 60 );
|
||||
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorscale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self.bot.update_lookat = gettime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
|
||||
goal = self getgoal( "ctf_flag_patrol" );
|
||||
nearest = base_nearest_node( flag_mine );
|
||||
mine = getnearestnode( goal );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
}
|
||||
|
||||
if ( gettime() > self.bot.update_objective_patrol )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
nearest = base_nearest_node( flag_mine );
|
||||
|
||||
if ( self hasgoal( "ctf_flag_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "ctf_flag_patrol" );
|
||||
|
||||
if ( distancesquared( self.origin, goal ) < 65536 )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
self lookat( origin );
|
||||
}
|
||||
|
||||
if ( distancesquared( self.origin, goal ) < 16384 )
|
||||
self.bot.update_objective_patrol = gettime() + randomintrange( 3000, 6000 );
|
||||
|
||||
mine = getnearestnode( goal );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "ctf_flag_patrol" );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( gettime() < self.bot.update_objective_patrol )
|
||||
return;
|
||||
|
||||
nodes = getvisiblenodes( nearest );
|
||||
/#
|
||||
assert( nodes.size );
|
||||
assert( nodes.size );
|
||||
#/
|
||||
*/
|
||||
for ( i = randomint(nodes.size); i < nodes.size; i++ )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "ctf_flag_patrol", nodes[ i ].origin, 256 ) == 0 )
|
||||
{
|
||||
self addgoal( nodes[ i ], 24, 3, "ctf_flag_patrol" );
|
||||
self.bot.update_objective_patrol = getTime() + randomintrange( 3000, 6000 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
for ( i = randomint( nodes.size ); i < nodes.size; i++ )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "ctf_flag_patrol", nodes[i].origin, 256 ) == 0 )
|
||||
{
|
||||
self addgoal( nodes[i], 24, 3, "ctf_flag_patrol" );
|
||||
self.bot.update_objective_patrol = gettime() + randomintrange( 3000, 6000 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
base_nearest_node( flag ) //checked matches cerberus output
|
||||
base_nearest_node( flag )
|
||||
{
|
||||
home = flag ctf_flag_get_home();
|
||||
nodes = getnodesinradiussorted( home, 256, 0 );
|
||||
/*
|
||||
home = flag ctf_flag_get_home();
|
||||
nodes = getnodesinradiussorted( home, 256, 0 );
|
||||
/#
|
||||
assert( nodes.size );
|
||||
assert( nodes.size );
|
||||
#/
|
||||
*/
|
||||
return nodes[ 0 ];
|
||||
return nodes[0];
|
||||
}
|
||||
|
||||
bot_ctf_random_visible_node( origin ) //checked changed to match cerberus output
|
||||
bot_ctf_random_visible_node( origin )
|
||||
{
|
||||
nodes = getnodesinradius( origin, 384, 0, 256 );
|
||||
nearest = maps/mp/bots/_bot_combat::bot_nearest_node( origin );
|
||||
if ( isDefined( nearest ) && nodes.size )
|
||||
{
|
||||
current = randomintrange( 0, nodes.size );
|
||||
for ( i = 0; i < nodes.size; i++ )
|
||||
{
|
||||
current = ( current + 1 ) % nodes.size;
|
||||
if ( nodesvisible( nodes[ current ], nearest ) )
|
||||
{
|
||||
return nodes[ current ];
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
nodes = getnodesinradius( origin, 384, 0, 256 );
|
||||
nearest = maps\mp\bots\_bot_combat::bot_nearest_node( origin );
|
||||
|
||||
if ( isdefined( nearest ) && nodes.size )
|
||||
{
|
||||
current = randomintrange( 0, nodes.size );
|
||||
|
||||
for ( i = 0; i < nodes.size; i++ )
|
||||
{
|
||||
current = ( current + 1 ) % nodes.size;
|
||||
|
||||
if ( nodesvisible( nodes[current], nearest ) )
|
||||
return nodes[current];
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,331 +1,333 @@
|
||||
//checked changed includes to match cerberus output
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/bots/_bot_combat;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes/dem;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\dem;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\bots\_bot_combat;
|
||||
#include maps\mp\bots\_bot;
|
||||
|
||||
bot_dem_think() //checked changed to match cerberus output
|
||||
bot_dem_think()
|
||||
{
|
||||
if ( !isDefined( level.bombzones[ 0 ].dem_nodes ) )
|
||||
{
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
zone.dem_nodes = [];
|
||||
zone.dem_nodes = getnodesinradius( zone.trigger.origin, 1024, 64, 128, "Path" );
|
||||
}
|
||||
}
|
||||
if ( self.team == game[ "attackers" ] )
|
||||
{
|
||||
bot_dem_attack_think();
|
||||
}
|
||||
else
|
||||
{
|
||||
bot_dem_defend_think();
|
||||
}
|
||||
if ( !isdefined( level.bombzones[0].dem_nodes ) )
|
||||
{
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
zone.dem_nodes = [];
|
||||
zone.dem_nodes = getnodesinradius( zone.trigger.origin, 1024, 64, 128, "Path" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( self.team == game["attackers"] )
|
||||
bot_dem_attack_think();
|
||||
else
|
||||
bot_dem_defend_think();
|
||||
}
|
||||
|
||||
bot_dem_attack_think() //checked partially changed to match cerberus output changed at own discretion
|
||||
bot_dem_attack_think()
|
||||
{
|
||||
zones = dem_get_alive_zones();
|
||||
if ( !zones.size )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.goal_flag ) )
|
||||
{
|
||||
zones = array_randomize( zones );
|
||||
foreach ( zone in zones )
|
||||
{
|
||||
if ( zones.size == 1 || is_true( zone.bombplanted ) && !is_true( zone.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
}
|
||||
if ( randomint( 100 ) < 50 )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( isDefined( self.goal_flag ) )
|
||||
{
|
||||
if ( is_true( self.goal_flag.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = undefined;
|
||||
self cancelgoal( "dem_guard" );
|
||||
self cancelgoal( "bomb" );
|
||||
}
|
||||
else if ( is_true( self.goal_flag.bombplanted ) )
|
||||
{
|
||||
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
||||
}
|
||||
else if ( self bot_dem_friend_interacting( self.goal_flag.trigger.origin ) )
|
||||
{
|
||||
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
self bot_dem_attack( self.goal_flag );
|
||||
}
|
||||
}
|
||||
zones = dem_get_alive_zones();
|
||||
|
||||
if ( !zones.size )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.goal_flag ) )
|
||||
{
|
||||
zones = array_randomize( zones );
|
||||
|
||||
foreach ( zone in zones )
|
||||
{
|
||||
if ( zones.size == 1 || is_true( zone.bombplanted ) && !is_true( zone.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( randomint( 100 ) < 50 )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( self.goal_flag ) )
|
||||
{
|
||||
if ( is_true( self.goal_flag.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = undefined;
|
||||
self cancelgoal( "dem_guard" );
|
||||
self cancelgoal( "bomb" );
|
||||
}
|
||||
else if ( is_true( self.goal_flag.bombplanted ) )
|
||||
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
||||
else if ( self bot_dem_friend_interacting( self.goal_flag.trigger.origin ) )
|
||||
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
||||
else
|
||||
self bot_dem_attack( self.goal_flag );
|
||||
}
|
||||
}
|
||||
|
||||
bot_dem_defend_think() //checked partially changed to match cerberus output changed at own discretion
|
||||
bot_dem_defend_think()
|
||||
{
|
||||
zones = dem_get_alive_zones();
|
||||
if ( !zones.size )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.goal_flag ) )
|
||||
{
|
||||
zones = array_randomize( zones );
|
||||
foreach ( zone in zones )
|
||||
{
|
||||
if ( zones.size == 1 || is_true( zone.bombplanted ) && !is_true( zone.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
}
|
||||
if ( randomint( 100 ) < 50 )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( isDefined( self.goal_flag ) )
|
||||
{
|
||||
if ( is_true( self.goal_flag.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = undefined;
|
||||
self cancelgoal( "dem_guard" );
|
||||
self cancelgoal( "bomb" );
|
||||
}
|
||||
else if ( is_true( self.goal_flag.bombplanted ) && !self bot_dem_friend_interacting( self.goal_flag.trigger.origin ) )
|
||||
{
|
||||
self bot_dem_defuse( self.goal_flag );
|
||||
}
|
||||
else
|
||||
{
|
||||
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
||||
}
|
||||
}
|
||||
zones = dem_get_alive_zones();
|
||||
|
||||
if ( !zones.size )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.goal_flag ) )
|
||||
{
|
||||
zones = array_randomize( zones );
|
||||
|
||||
foreach ( zone in zones )
|
||||
{
|
||||
if ( zones.size == 1 || is_true( zone.bombplanted ) && !is_true( zone.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( randomint( 100 ) < 50 )
|
||||
{
|
||||
self.goal_flag = zone;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isdefined( self.goal_flag ) )
|
||||
{
|
||||
if ( is_true( self.goal_flag.bombexploded ) )
|
||||
{
|
||||
self.goal_flag = undefined;
|
||||
self cancelgoal( "dem_guard" );
|
||||
self cancelgoal( "bomb" );
|
||||
}
|
||||
else if ( is_true( self.goal_flag.bombplanted ) && !self bot_dem_friend_interacting( self.goal_flag.trigger.origin ) )
|
||||
self bot_dem_defuse( self.goal_flag );
|
||||
else
|
||||
self bot_dem_guard( self.goal_flag, self.goal_flag.dem_nodes, self.goal_flag.trigger.origin );
|
||||
}
|
||||
}
|
||||
|
||||
bot_dem_attack( zone ) //checked changed to match cerberus output
|
||||
bot_dem_attack( zone )
|
||||
{
|
||||
self cancelgoal( "dem_guard" );
|
||||
if ( !self hasgoal( "bomb" ) )
|
||||
{
|
||||
self.bomb_goal = self dem_get_bomb_goal( zone.visuals[ 0 ] );
|
||||
if ( isDefined( self.bomb_goal ) )
|
||||
{
|
||||
self addgoal( self.bomb_goal, 48, 2, "bomb" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( !self atgoal( "bomb" ) )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( self.bomb_goal ) )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( self.bomb_goal ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( self.bomb_goal );
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
||||
self setstance( "prone" );
|
||||
self pressusebutton( level.planttime + 1 );
|
||||
wait 0.5;
|
||||
if ( is_true( self.isplanting ) )
|
||||
{
|
||||
wait ( level.planttime + 1 );
|
||||
}
|
||||
self pressusebutton( 0 );
|
||||
defenders = self bot_get_enemies();
|
||||
foreach ( defender in defenders )
|
||||
{
|
||||
if ( defender is_bot() )
|
||||
{
|
||||
defender.goal_flag = undefined;
|
||||
}
|
||||
}
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "bomb" );
|
||||
self setstance( "stand" );
|
||||
self cancelgoal( "dem_guard" );
|
||||
|
||||
if ( !self hasgoal( "bomb" ) )
|
||||
{
|
||||
self.bomb_goal = self dem_get_bomb_goal( zone.visuals[0] );
|
||||
|
||||
if ( isdefined( self.bomb_goal ) )
|
||||
self addgoal( self.bomb_goal, 48, 2, "bomb" );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !self atgoal( "bomb" ) )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_smoke( self.bomb_goal ) )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( self.bomb_goal ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( self.bomb_goal );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
||||
self setstance( "prone" );
|
||||
self pressusebutton( level.planttime + 1 );
|
||||
wait 0.5;
|
||||
|
||||
if ( is_true( self.isplanting ) )
|
||||
wait( level.planttime + 1 );
|
||||
|
||||
self pressusebutton( 0 );
|
||||
defenders = self bot_get_enemies();
|
||||
|
||||
foreach ( defender in defenders )
|
||||
{
|
||||
if ( defender is_bot() )
|
||||
defender.goal_flag = undefined;
|
||||
}
|
||||
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "bomb" );
|
||||
self setstance( "stand" );
|
||||
}
|
||||
|
||||
bot_dem_guard( zone, nodes, origin ) //checked matches cerberus output
|
||||
bot_dem_guard( zone, nodes, origin )
|
||||
{
|
||||
self cancelgoal( "bomb" );
|
||||
enemy = self bot_dem_enemy_interacting( origin );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( enemy.origin );
|
||||
self addgoal( enemy.origin, 128, 3, "dem_guard" );
|
||||
return;
|
||||
}
|
||||
enemy = self bot_dem_enemy_nearby( origin );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( enemy.origin );
|
||||
self addgoal( enemy.origin, 128, 3, "dem_guard" );
|
||||
return;
|
||||
}
|
||||
if ( self hasgoal( "dem_guard" ) && !self atgoal( "dem_guard" ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
return;
|
||||
}
|
||||
node = random( nodes );
|
||||
self addgoal( node, 24, 2, "dem_guard" );
|
||||
self cancelgoal( "bomb" );
|
||||
enemy = self bot_dem_enemy_interacting( origin );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( enemy.origin );
|
||||
self addgoal( enemy.origin, 128, 3, "dem_guard" );
|
||||
return;
|
||||
}
|
||||
|
||||
enemy = self bot_dem_enemy_nearby( origin );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( enemy.origin );
|
||||
self addgoal( enemy.origin, 128, 3, "dem_guard" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self hasgoal( "dem_guard" ) && !self atgoal( "dem_guard" ) )
|
||||
{
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
return;
|
||||
}
|
||||
|
||||
node = random( nodes );
|
||||
self addgoal( node, 24, 2, "dem_guard" );
|
||||
}
|
||||
|
||||
bot_dem_defuse( zone ) //checked matches cerberus output
|
||||
bot_dem_defuse( zone )
|
||||
{
|
||||
self cancelgoal( "dem_guard" );
|
||||
if ( !self hasgoal( "bomb" ) )
|
||||
{
|
||||
self.bomb_goal = self dem_get_bomb_goal( zone.visuals[ 0 ] );
|
||||
if ( isDefined( self.bomb_goal ) )
|
||||
{
|
||||
self addgoal( self.bomb_goal, 48, 2, "bomb" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( !self atgoal( "bomb" ) )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( self.bomb_goal ) )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( self.bomb_goal ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( self.bomb_goal );
|
||||
}
|
||||
}
|
||||
if ( ( self.goal_flag.detonatetime - getTime() ) < 12000 )
|
||||
{
|
||||
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
||||
if ( cointoss() )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setstance( "prone" );
|
||||
}
|
||||
self pressusebutton( level.defusetime + 1 );
|
||||
wait 0.5;
|
||||
if ( is_true( self.isdefusing ) )
|
||||
{
|
||||
wait ( level.defusetime + 1 );
|
||||
}
|
||||
self pressusebutton( 0 );
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "bomb" );
|
||||
self setstance( "stand" );
|
||||
self cancelgoal( "dem_guard" );
|
||||
|
||||
if ( !self hasgoal( "bomb" ) )
|
||||
{
|
||||
self.bomb_goal = self dem_get_bomb_goal( zone.visuals[0] );
|
||||
|
||||
if ( isdefined( self.bomb_goal ) )
|
||||
self addgoal( self.bomb_goal, 48, 2, "bomb" );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !self atgoal( "bomb" ) )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_smoke( self.bomb_goal ) )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( self.bomb_goal ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( self.bomb_goal );
|
||||
}
|
||||
|
||||
if ( self.goal_flag.detonatetime - gettime() < 12000 )
|
||||
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
self addgoal( self.bomb_goal, 48, 4, "bomb" );
|
||||
|
||||
if ( cointoss() )
|
||||
self setstance( "crouch" );
|
||||
else
|
||||
self setstance( "prone" );
|
||||
|
||||
self pressusebutton( level.defusetime + 1 );
|
||||
wait 0.5;
|
||||
|
||||
if ( is_true( self.isdefusing ) )
|
||||
wait( level.defusetime + 1 );
|
||||
|
||||
self pressusebutton( 0 );
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "bomb" );
|
||||
self setstance( "stand" );
|
||||
}
|
||||
|
||||
bot_dem_enemy_interacting( origin ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
bot_dem_enemy_interacting( origin )
|
||||
{
|
||||
enemies = maps/mp/bots/_bot::bot_get_enemies();
|
||||
foreach ( enemy in enemies )
|
||||
{
|
||||
if ( distancesquared( enemy.origin, origin ) > 65536 )
|
||||
{
|
||||
}
|
||||
else if ( is_true( enemy.isdefusing ) || is_true( enemy.isplanting ) )
|
||||
{
|
||||
return enemy;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
enemies = maps\mp\bots\_bot::bot_get_enemies();
|
||||
|
||||
foreach ( enemy in enemies )
|
||||
{
|
||||
if ( distancesquared( enemy.origin, origin ) > 65536 )
|
||||
continue;
|
||||
|
||||
if ( is_true( enemy.isdefusing ) || is_true( enemy.isplanting ) )
|
||||
return enemy;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
bot_dem_friend_interacting( origin ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
bot_dem_friend_interacting( origin )
|
||||
{
|
||||
friends = maps/mp/bots/_bot::bot_get_friends();
|
||||
foreach ( friend in friends )
|
||||
{
|
||||
if ( distancesquared( friend.origin, origin ) > 65536 )
|
||||
{
|
||||
}
|
||||
else if ( is_true( friend.isdefusing ) || is_true( friend.isplanting ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
friends = maps\mp\bots\_bot::bot_get_friends();
|
||||
|
||||
foreach ( friend in friends )
|
||||
{
|
||||
if ( distancesquared( friend.origin, origin ) > 65536 )
|
||||
continue;
|
||||
|
||||
if ( is_true( friend.isdefusing ) || is_true( friend.isplanting ) )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_dem_enemy_nearby( origin ) //checked matches cerberus output
|
||||
bot_dem_enemy_nearby( origin )
|
||||
{
|
||||
enemy = maps/mp/bots/_bot::bot_get_closest_enemy( origin, 1 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
if ( distancesquared( enemy.origin, origin ) < 1048576 )
|
||||
{
|
||||
return enemy;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
enemy = maps\mp\bots\_bot::bot_get_closest_enemy( origin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
if ( distancesquared( enemy.origin, origin ) < 1048576 )
|
||||
return enemy;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
dem_get_alive_zones() //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
dem_get_alive_zones()
|
||||
{
|
||||
zones = [];
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( is_true( zone.bombexploded ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
zones[ zones.size ] = zone;
|
||||
}
|
||||
}
|
||||
return zones;
|
||||
zones = [];
|
||||
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( is_true( zone.bombexploded ) )
|
||||
continue;
|
||||
|
||||
zones[zones.size] = zone;
|
||||
}
|
||||
|
||||
return zones;
|
||||
}
|
||||
|
||||
dem_get_bomb_goal( ent ) //checked changed to match cerberus output
|
||||
dem_get_bomb_goal( ent )
|
||||
{
|
||||
if ( !isDefined( ent.bot_goals ) )
|
||||
{
|
||||
goals = [];
|
||||
ent.bot_goals = [];
|
||||
dir = anglesToForward( ent.angles );
|
||||
dir = vectorScale( dir, 32 );
|
||||
goals[ 0 ] = ent.origin + dir;
|
||||
goals[ 1 ] = ent.origin - dir;
|
||||
dir = anglesToRight( ent.angles );
|
||||
dir = vectorScale( dir, 48 );
|
||||
goals[ 2 ] = ent.origin + dir;
|
||||
goals[ 3 ] = ent.origin - dir;
|
||||
foreach ( goal in goals )
|
||||
{
|
||||
start = goal + vectorScale( ( 0, 0, 1 ), 128 );
|
||||
trace = bullettrace( start, goal, 0, undefined );
|
||||
ent.bot_goals[ ent.bot_goals.size ] = trace[ "position" ];
|
||||
}
|
||||
}
|
||||
goals = array_randomize( ent.bot_goals );
|
||||
foreach ( goal in goals )
|
||||
{
|
||||
if ( findpath( self.origin, goal, 0 ) )
|
||||
{
|
||||
return goal;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
if ( !isdefined( ent.bot_goals ) )
|
||||
{
|
||||
goals = [];
|
||||
ent.bot_goals = [];
|
||||
dir = anglestoforward( ent.angles );
|
||||
dir = vectorscale( dir, 32 );
|
||||
goals[0] = ent.origin + dir;
|
||||
goals[1] = ent.origin - dir;
|
||||
dir = anglestoright( ent.angles );
|
||||
dir = vectorscale( dir, 48 );
|
||||
goals[2] = ent.origin + dir;
|
||||
goals[3] = ent.origin - dir;
|
||||
|
||||
foreach ( goal in goals )
|
||||
{
|
||||
start = goal + vectorscale( ( 0, 0, 1 ), 128.0 );
|
||||
trace = bullettrace( start, goal, 0, undefined );
|
||||
ent.bot_goals[ent.bot_goals.size] = trace["position"];
|
||||
}
|
||||
}
|
||||
|
||||
goals = array_randomize( ent.bot_goals );
|
||||
|
||||
foreach ( goal in goals )
|
||||
{
|
||||
if ( findpath( self.origin, goal, 0 ) )
|
||||
return goal;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
@ -1,463 +1,432 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/bots/_bot_combat;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes/dom;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\dom;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\bots\_bot_combat;
|
||||
#include maps\mp\bots\_bot;
|
||||
|
||||
bot_dom_think() //checked changed to match cerberus output
|
||||
bot_dom_think()
|
||||
{
|
||||
time = getTime();
|
||||
if ( time < self.bot.update_objective )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
if ( self bot_is_capturing_flag() )
|
||||
{
|
||||
flag = self dom_get_closest_flag();
|
||||
self bot_capture_flag( flag );
|
||||
return;
|
||||
}
|
||||
flag = self dom_get_closest_flag();
|
||||
if ( flag getflagteam() != self.team && distance2dsquared( self.origin, flag.origin ) < 147456 && !bot_has_flag_goal( flag ) )
|
||||
{
|
||||
self bot_move_to_flag( flag );
|
||||
return;
|
||||
}
|
||||
flag = dom_get_weighted_flag( "neutral" );
|
||||
if ( !isDefined( flag ) )
|
||||
{
|
||||
flag = dom_get_best_flag( self.team );
|
||||
}
|
||||
if ( dom_has_two_flags( self.team ) )
|
||||
{
|
||||
flag = dom_get_best_flag( self.team );
|
||||
}
|
||||
if ( !isDefined( flag ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !bot_has_flag_goal( flag ) && !self bot_goal_is_enemy_flag() )
|
||||
{
|
||||
self bot_move_to_flag( flag );
|
||||
}
|
||||
else if ( !dom_is_game_start() )
|
||||
{
|
||||
self bot_flag_grenade( flag );
|
||||
}
|
||||
if ( distancesquared( self.origin, flag.origin ) < ( flag.radius * flag.radius ) && self istouching( flag.useobj.trigger ) )
|
||||
{
|
||||
self bot_capture_flag( flag );
|
||||
}
|
||||
time = gettime();
|
||||
|
||||
if ( time < self.bot.update_objective )
|
||||
return;
|
||||
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
|
||||
if ( self bot_is_capturing_flag() )
|
||||
{
|
||||
flag = self dom_get_closest_flag();
|
||||
self bot_capture_flag( flag );
|
||||
return;
|
||||
}
|
||||
|
||||
flag = self dom_get_closest_flag();
|
||||
|
||||
if ( flag getflagteam() != self.team && distance2dsquared( self.origin, flag.origin ) < 147456 && !bot_has_flag_goal( flag ) )
|
||||
{
|
||||
self bot_move_to_flag( flag );
|
||||
return;
|
||||
}
|
||||
|
||||
flag = dom_get_weighted_flag( "neutral" );
|
||||
|
||||
if ( !isdefined( flag ) )
|
||||
flag = dom_get_best_flag( self.team );
|
||||
|
||||
if ( dom_has_two_flags( self.team ) )
|
||||
flag = dom_get_best_flag( self.team );
|
||||
|
||||
if ( !isdefined( flag ) )
|
||||
return;
|
||||
|
||||
if ( !bot_has_flag_goal( flag ) && !self bot_goal_is_enemy_flag() )
|
||||
self bot_move_to_flag( flag );
|
||||
else
|
||||
{
|
||||
if ( !dom_is_game_start() )
|
||||
self bot_flag_grenade( flag );
|
||||
|
||||
if ( distancesquared( self.origin, flag.origin ) < flag.radius * flag.radius && self istouching( flag.useobj.trigger ) )
|
||||
self bot_capture_flag( flag );
|
||||
}
|
||||
}
|
||||
|
||||
bot_move_to_flag( flag ) //checked matches cerberus output
|
||||
bot_move_to_flag( flag )
|
||||
{
|
||||
if ( level.script == "mp_frostbite" )
|
||||
{
|
||||
nodes = getnodesinradius( flag.origin, flag.radius, 0, 32 );
|
||||
}
|
||||
else
|
||||
{
|
||||
nodes = getnodesinradius( flag.origin, flag.radius, 0 );
|
||||
}
|
||||
/*
|
||||
if ( level.script == "mp_frostbite" )
|
||||
nodes = getnodesinradius( flag.origin, flag.radius, 0, 32 );
|
||||
else
|
||||
nodes = getnodesinradius( flag.origin, flag.radius, 0 );
|
||||
/#
|
||||
assert( nodes.size );
|
||||
assert( nodes.size );
|
||||
#/
|
||||
*/
|
||||
node = random( nodes );
|
||||
self addgoal( node, 24, 3, "dom_flag" );
|
||||
node = random( nodes );
|
||||
self addgoal( node, 24, 3, "dom_flag" );
|
||||
}
|
||||
|
||||
bot_is_capturing_flag() //checked matches cerberus output
|
||||
bot_is_capturing_flag()
|
||||
{
|
||||
return self atgoal( "dom_flag" );
|
||||
return self atgoal( "dom_flag" );
|
||||
}
|
||||
|
||||
bot_has_flag_goal( flag ) //checked matches cerberus output
|
||||
bot_has_flag_goal( flag )
|
||||
{
|
||||
origin = self getgoal( "dom_flag" );
|
||||
if ( isDefined( origin ) )
|
||||
{
|
||||
if ( distancesquared( flag.origin, origin ) < ( flag.radius * flag.radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
origin = self getgoal( "dom_flag" );
|
||||
|
||||
if ( isdefined( origin ) )
|
||||
{
|
||||
if ( distancesquared( flag.origin, origin ) < flag.radius * flag.radius )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_has_no_goal() //checked matches cerberus output
|
||||
bot_has_no_goal()
|
||||
{
|
||||
origin = self getgoal( "dom_flag" );
|
||||
if ( isDefined( origin ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
origin = self getgoal( "dom_flag" );
|
||||
|
||||
if ( isdefined( origin ) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bot_goal_is_enemy_flag() //checked changed to match cerberus output
|
||||
bot_goal_is_enemy_flag()
|
||||
{
|
||||
origin = self getgoal( "dom_flag" );
|
||||
if ( isDefined( origin ) )
|
||||
{
|
||||
foreach(flag in level.flags)
|
||||
{
|
||||
if ( distancesquared( flag.origin, origin ) < ( flag.radius * flag.radius ) )
|
||||
{
|
||||
if ( flag getflagteam() != self.team || dom_is_flag_contested( flag ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
origin = self getgoal( "dom_flag" );
|
||||
|
||||
if ( isdefined( origin ) )
|
||||
{
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( distancesquared( flag.origin, origin ) < flag.radius * flag.radius )
|
||||
{
|
||||
if ( flag getflagteam() != self.team || dom_is_flag_contested( flag ) )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_flag_grenade( flag ) //checked matches cerberus output
|
||||
bot_flag_grenade( flag )
|
||||
{
|
||||
if ( flag getflagteam() != self.team )
|
||||
{
|
||||
if ( bot_tactical_insertion( flag ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( flag.origin );
|
||||
}
|
||||
if ( !dom_is_flag_contested( flag ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( flag.origin ) )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_tactical( flag.origin ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( flag.origin );
|
||||
}
|
||||
}
|
||||
if ( flag getflagteam() != self.team )
|
||||
{
|
||||
if ( bot_tactical_insertion( flag ) )
|
||||
return;
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_smoke( flag.origin );
|
||||
}
|
||||
|
||||
if ( !dom_is_flag_contested( flag ) )
|
||||
return;
|
||||
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( flag.origin ) )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_tactical( flag.origin ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( flag.origin );
|
||||
}
|
||||
}
|
||||
|
||||
bot_get_look_at( flag ) //checked matches cerberus output
|
||||
bot_get_look_at( flag )
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 0 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
spawn = random( level.spawn_all );
|
||||
node = getvisiblenode( self.origin, spawn.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
return flag.origin;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 0 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
spawn = random( level.spawn_all );
|
||||
node = getvisiblenode( self.origin, spawn.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
|
||||
return flag.origin;
|
||||
}
|
||||
|
||||
bot_capture_flag( flag ) //checked changed to match cerberus output
|
||||
bot_capture_flag( flag )
|
||||
{
|
||||
time = getTime();
|
||||
if ( flag getflagteam() != self.team )
|
||||
{
|
||||
if ( self getstance() == "prone" )
|
||||
{
|
||||
self addgoal( self.origin, 24, 4, "dom_flag" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self addgoal( self.origin, 24, 3, "dom_flag" );
|
||||
}
|
||||
if ( time > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at( flag );
|
||||
z = 20;
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
{
|
||||
z = randomintrange( 16, 60 );
|
||||
}
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
self.bot.update_lookat = time + randomintrange( 1500, 3000 );
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorScale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self maps/mp/bots/_bot_combat::bot_combat_toss_frag( self.origin );
|
||||
self maps/mp/bots/_bot_combat::bot_combat_toss_flash( self.origin );
|
||||
if ( !dom_is_game_start() )
|
||||
{
|
||||
weapon = self getcurrentweapon();
|
||||
if ( weapon == "riotshield_mp" || weapon == "minigun_mp" )
|
||||
{
|
||||
if ( cointoss() )
|
||||
{
|
||||
self addgoal( self.origin, 24, 4, "dom_flag" );
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
}
|
||||
else if ( cointoss() && !bot_friend_in_radius( self.origin, 384 ) )
|
||||
{
|
||||
self addgoal( self.origin, 24, 4, "dom_flag" );
|
||||
wait randomfloatrange( 0.5, 1 );
|
||||
self setstance( "prone" );
|
||||
self.bot.update_lookat += 5000;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( !dom_is_game_start() )
|
||||
{
|
||||
if ( self getstance() == "stand" )
|
||||
{
|
||||
wait randomfloatrange( 0.5, 1 );
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "dom_flag" );
|
||||
if ( self getstance() == "crouch" )
|
||||
{
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
else if ( self getstance() == "prone" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
time = gettime();
|
||||
|
||||
if ( flag getflagteam() != self.team )
|
||||
{
|
||||
if ( self getstance() == "prone" )
|
||||
self addgoal( self.origin, 24, 4, "dom_flag" );
|
||||
else
|
||||
self addgoal( self.origin, 24, 3, "dom_flag" );
|
||||
|
||||
if ( time > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at( flag );
|
||||
z = 20;
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
z = randomintrange( 16, 60 );
|
||||
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
self.bot.update_lookat = time + randomintrange( 1500, 3000 );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorscale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self maps\mp\bots\_bot_combat::bot_combat_toss_frag( self.origin );
|
||||
self maps\mp\bots\_bot_combat::bot_combat_toss_flash( self.origin );
|
||||
|
||||
if ( !dom_is_game_start() )
|
||||
{
|
||||
weapon = self getcurrentweapon();
|
||||
|
||||
if ( weapon == "riotshield_mp" || weapon == "minigun_mp" )
|
||||
{
|
||||
if ( cointoss() )
|
||||
{
|
||||
self addgoal( self.origin, 24, 4, "dom_flag" );
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
}
|
||||
else if ( cointoss() && !bot_friend_in_radius( self.origin, 384 ) )
|
||||
{
|
||||
self addgoal( self.origin, 24, 4, "dom_flag" );
|
||||
wait( randomfloatrange( 0.5, 1 ) );
|
||||
self setstance( "prone" );
|
||||
self.bot.update_lookat += 5000;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( !dom_is_game_start() )
|
||||
{
|
||||
if ( self getstance() == "stand" )
|
||||
{
|
||||
wait( randomfloatrange( 0.5, 1 ) );
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "dom_flag" );
|
||||
|
||||
if ( self getstance() == "crouch" )
|
||||
{
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
else if ( self getstance() == "prone" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dom_is_game_start() //checked changed to match cerberus output
|
||||
dom_is_game_start()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.flags ) );
|
||||
assert( isdefined( level.flags ) );
|
||||
#/
|
||||
*/
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( flag getflagteam() != "neutral" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( flag getflagteam() != "neutral" )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
dom_get_closest_flag() //checked matches cerberus output
|
||||
dom_get_closest_flag()
|
||||
{
|
||||
flags = arraysort( level.flags, self.origin );
|
||||
return flags[ 0 ];
|
||||
flags = arraysort( level.flags, self.origin );
|
||||
return flags[0];
|
||||
}
|
||||
|
||||
dom_get_weighted_flag( owner ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
dom_get_weighted_flag( owner )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.flags ) );
|
||||
assert( isdefined( level.flags ) );
|
||||
#/
|
||||
*/
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( isDefined( owner ) && flag getflagteam() != owner )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
d = distancesquared( self.origin, flag.origin );
|
||||
if ( distsq != 9999999 && d < distsq || randomint( 100 ) < 70 && randomint( 100 ) > 70 )
|
||||
{
|
||||
best = flag;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
}
|
||||
return best;
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( isdefined( owner ) && flag getflagteam() != owner )
|
||||
continue;
|
||||
|
||||
d = distancesquared( self.origin, flag.origin );
|
||||
|
||||
if ( distsq == 9999999 || d < distsq && randomint( 100 ) < 70 || randomint( 100 ) > 70 )
|
||||
{
|
||||
best = flag;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
dom_get_weighted_enemy_flag( team ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
dom_get_weighted_enemy_flag( team )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.flags ) );
|
||||
assert( isdefined( level.flags ) );
|
||||
#/
|
||||
*/
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( flag getflagteam() == team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
d = distancesquared( self.origin, flag.origin );
|
||||
if ( distsq != 9999999 && d < distsq || randomint( 100 ) < 80 && randomint( 100 ) > 80 )
|
||||
{
|
||||
best = flag;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
}
|
||||
return best;
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( flag getflagteam() == team )
|
||||
continue;
|
||||
|
||||
d = distancesquared( self.origin, flag.origin );
|
||||
|
||||
if ( distsq == 9999999 || d < distsq && randomint( 100 ) < 80 || randomint( 100 ) > 80 )
|
||||
{
|
||||
best = flag;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
dom_is_flag_contested( flag ) //checked changed at own discretion
|
||||
dom_is_flag_contested( flag )
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( flag.origin, 0 );
|
||||
if ( isDefined( enemy ) && distancesquared( enemy.origin, flag.origin ) < 147456 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( flag.origin, 0 );
|
||||
return isdefined( enemy ) && distancesquared( enemy.origin, flag.origin ) < 147456;
|
||||
}
|
||||
|
||||
dom_has_two_flags( team ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
dom_has_two_flags( team )
|
||||
{
|
||||
count = 0;
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( dom_is_flag_contested( flag ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( flag getflagteam() == team )
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return count >= 2;
|
||||
count = 0;
|
||||
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( dom_is_flag_contested( flag ) )
|
||||
continue;
|
||||
|
||||
if ( flag getflagteam() == team )
|
||||
count++;
|
||||
}
|
||||
|
||||
return count >= 2;
|
||||
}
|
||||
|
||||
dom_get_weighted_contested_flag( team ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
dom_get_weighted_contested_flag( team )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.flags ) );
|
||||
assert( isdefined( level.flags ) );
|
||||
#/
|
||||
*/
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( !dom_is_flag_contested( flag ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
d = distancesquared( self.origin, flag.origin );
|
||||
if ( distsq != 9999999 && d < distsq || randomint( 100 ) < 80 && randomint( 100 ) > 80 )
|
||||
{
|
||||
best = flag;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
}
|
||||
return best;
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
|
||||
foreach ( flag in level.flags )
|
||||
{
|
||||
if ( !dom_is_flag_contested( flag ) )
|
||||
continue;
|
||||
|
||||
d = distancesquared( self.origin, flag.origin );
|
||||
|
||||
if ( distsq == 9999999 || d < distsq && randomint( 100 ) < 80 || randomint( 100 ) > 80 )
|
||||
{
|
||||
best = flag;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
dom_get_random_flag( owner ) //checked changed to match cerberus output
|
||||
dom_get_random_flag( owner )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.flags ) );
|
||||
assert( isdefined( level.flags ) );
|
||||
#/
|
||||
*/
|
||||
flagindex = randomintrange( 0, level.flags.size );
|
||||
if ( !isDefined( owner ) )
|
||||
{
|
||||
return level.flags[ flagindex ];
|
||||
}
|
||||
for ( i = 0; i < level.flags.size; i++ )
|
||||
{
|
||||
if ( level.flags[ flagindex ] getflagteam() == owner )
|
||||
{
|
||||
return level.flags[ flagindex ];
|
||||
}
|
||||
flagindex = ( flagindex + 1 ) % level.flags.size;
|
||||
}
|
||||
return undefined;
|
||||
flagindex = randomintrange( 0, level.flags.size );
|
||||
|
||||
if ( !isdefined( owner ) )
|
||||
return level.flags[flagindex];
|
||||
|
||||
for ( i = 0; i < level.flags.size; i++ )
|
||||
{
|
||||
if ( level.flags[flagindex] getflagteam() == owner )
|
||||
return level.flags[flagindex];
|
||||
|
||||
flagindex = ( flagindex + 1 ) % level.flags.size;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
dom_get_best_flag( team ) //checked matches cerberus output
|
||||
dom_get_best_flag( team )
|
||||
{
|
||||
flag1 = dom_get_weighted_enemy_flag( team );
|
||||
flag2 = dom_get_weighted_contested_flag( team );
|
||||
if ( !isDefined( flag1 ) )
|
||||
{
|
||||
return flag2;
|
||||
}
|
||||
if ( !isDefined( flag2 ) )
|
||||
{
|
||||
return flag1;
|
||||
}
|
||||
offchance = randomint( 100 ) > 80;
|
||||
if ( distancesquared( self.origin, flag1.origin ) < distancesquared( self.origin, flag2.origin ) )
|
||||
{
|
||||
if ( !offchance )
|
||||
{
|
||||
return flag1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return flag2;
|
||||
}
|
||||
}
|
||||
if ( !offchance )
|
||||
{
|
||||
return flag2;
|
||||
}
|
||||
else
|
||||
{
|
||||
return flag1;
|
||||
}
|
||||
flag1 = dom_get_weighted_enemy_flag( team );
|
||||
flag2 = dom_get_weighted_contested_flag( team );
|
||||
|
||||
if ( !isdefined( flag1 ) )
|
||||
return flag2;
|
||||
|
||||
if ( !isdefined( flag2 ) )
|
||||
return flag1;
|
||||
|
||||
offchance = randomint( 100 ) > 80;
|
||||
|
||||
if ( distancesquared( self.origin, flag1.origin ) < distancesquared( self.origin, flag2.origin ) )
|
||||
{
|
||||
if ( !offchance )
|
||||
return flag1;
|
||||
else
|
||||
return flag2;
|
||||
}
|
||||
|
||||
if ( !offchance )
|
||||
return flag2;
|
||||
else
|
||||
return flag1;
|
||||
}
|
||||
|
||||
bot_tactical_insertion( flag ) //checked matches cerberus output
|
||||
bot_tactical_insertion( flag )
|
||||
{
|
||||
if ( self getweaponammostock( "tactical_insertion_mp" ) <= 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
dist = self getlookaheaddist();
|
||||
dir = self getlookaheaddir();
|
||||
if ( !isDefined( dist ) || !isDefined( dir ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
node = bot_nearest_node( flag.origin );
|
||||
mine = bot_nearest_node( self.origin );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, node ) )
|
||||
{
|
||||
origin = self.origin + vectorScale( dir, dist );
|
||||
next = bot_nearest_node( origin );
|
||||
if ( next isdangerous( self.team ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( next ) && nodesvisible( next, node ) )
|
||||
{
|
||||
return bot_combat_tactical_insertion( self.origin );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if ( self getweaponammostock( "tactical_insertion_mp" ) <= 0 )
|
||||
return 0;
|
||||
|
||||
dist = self getlookaheaddist();
|
||||
dir = self getlookaheaddir();
|
||||
|
||||
if ( !isdefined( dist ) || !isdefined( dir ) )
|
||||
return 0;
|
||||
|
||||
node = bot_nearest_node( flag.origin );
|
||||
mine = bot_nearest_node( self.origin );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, node ) )
|
||||
{
|
||||
origin = self.origin + vectorscale( dir, dist );
|
||||
next = bot_nearest_node( origin );
|
||||
|
||||
if ( next isdangerous( self.team ) )
|
||||
return 0;
|
||||
|
||||
if ( isdefined( next ) && nodesvisible( next, node ) )
|
||||
return bot_combat_tactical_insertion( self.origin );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,179 +1,177 @@
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes/ctf;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\ctf;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\bots\_bot;
|
||||
|
||||
bot_hack_tank_get_goal_origin( tank ) //checked changed to match cerberus output
|
||||
bot_hack_tank_get_goal_origin( tank )
|
||||
{
|
||||
nodes = getnodesinradiussorted( tank.origin, 256, 0, 64, "Path" );
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
dir = vectornormalize( node.origin - tank.origin );
|
||||
dir = vectorScale( dir, 32 );
|
||||
goal = tank.origin + dir;
|
||||
if ( findpath( self.origin, goal, 0 ) )
|
||||
{
|
||||
return goal;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
nodes = getnodesinradiussorted( tank.origin, 256, 0, 64, "Path" );
|
||||
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
dir = vectornormalize( node.origin - tank.origin );
|
||||
dir = vectorscale( dir, 32 );
|
||||
goal = tank.origin + dir;
|
||||
|
||||
if ( findpath( self.origin, goal, 0 ) )
|
||||
return goal;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
bot_hack_has_goal( tank ) //checked matches cerberus output
|
||||
bot_hack_has_goal( tank )
|
||||
{
|
||||
goal = self getgoal( "hack" );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
if ( distancesquared( goal, tank.origin ) < 16384 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
goal = self getgoal( "hack" );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
if ( distancesquared( goal, tank.origin ) < 16384 )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_hack_at_goal() //checked changed to match cerberus output
|
||||
bot_hack_at_goal()
|
||||
{
|
||||
if ( self atgoal( "hack" ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
goal = self getgoal( "hack" );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
tanks = getentarray( "talon", "targetname" );
|
||||
tanks = arraysort( tanks, self.origin );
|
||||
foreach ( tank in tanks )
|
||||
{
|
||||
if ( distancesquared( goal, tank.origin ) < 16384 )
|
||||
{
|
||||
if ( isDefined( tank.trigger ) && self istouching( tank.trigger ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
if ( self atgoal( "hack" ) )
|
||||
return true;
|
||||
|
||||
goal = self getgoal( "hack" );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
tanks = getentarray( "talon", "targetname" );
|
||||
tanks = arraysort( tanks, self.origin );
|
||||
|
||||
foreach ( tank in tanks )
|
||||
{
|
||||
if ( distancesquared( goal, tank.origin ) < 16384 )
|
||||
{
|
||||
if ( isdefined( tank.trigger ) && self istouching( tank.trigger ) )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_hack_goal_pregame( tanks ) //checked partially changed to match cerberus output did not use foreach see github for more info
|
||||
bot_hack_goal_pregame( tanks )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < tanks.size )
|
||||
{
|
||||
if ( isDefined( tanks[ i ].owner ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( isDefined( tanks[ i ].team ) && tanks[ i ].team == self.team )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
goal = self bot_hack_tank_get_goal_origin( tanks[ i ] );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
if ( self addgoal( goal, 24, 2, "hack" ) )
|
||||
{
|
||||
self.goal_flag = tanks[ i ];
|
||||
return;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
foreach ( tank in tanks )
|
||||
{
|
||||
if ( isdefined( tank.owner ) )
|
||||
continue;
|
||||
|
||||
if ( isdefined( tank.team ) && tank.team == self.team )
|
||||
continue;
|
||||
|
||||
goal = self bot_hack_tank_get_goal_origin( tank );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
if ( self addgoal( goal, 24, 2, "hack" ) )
|
||||
{
|
||||
self.goal_flag = tank;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bot_hack_think() //checked partially changed to match cerberus output did not us foreach see github for more info
|
||||
bot_hack_think()
|
||||
{
|
||||
if ( bot_hack_at_goal() )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self addgoal( self.origin, 24, 4, "hack" );
|
||||
self pressusebutton( level.drone_hack_time + 1 );
|
||||
wait ( level.drone_hack_time + 1 );
|
||||
self setstance( "stand" );
|
||||
self cancelgoal( "hack" );
|
||||
}
|
||||
tanks = getentarray( "talon", "targetname" );
|
||||
tanks = arraysort( tanks, self.origin );
|
||||
if ( !is_true( level.drones_spawned ) )
|
||||
{
|
||||
self bot_hack_goal_pregame( tanks );
|
||||
}
|
||||
i = 0;
|
||||
while ( i < tanks.size )
|
||||
{
|
||||
if ( isDefined( tanks[ i ].owner ) && tanks[ i ].owner == self )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( tanks[ i ].owner ) )
|
||||
{
|
||||
if ( self bot_hack_has_goal( tanks[ i ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
goal = self bot_hack_tank_get_goal_origin( tanks[ i ] );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 24, 2, "hack" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( tanks[ i ].isstunned && distancesquared( self.origin, tanks[ i ].origin ) < 262144 )
|
||||
{
|
||||
goal = self bot_hack_tank_get_goal_origin( tanks[ i ] );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 24, 3, "hack" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !maps/mp/bots/_bot::bot_vehicle_weapon_ammo( "emp_grenade_mp" ) )
|
||||
{
|
||||
ammo = getentarray( "weapon_scavenger_item_hack_mp", "classname" );
|
||||
ammo = arraysort( ammo, self.origin );
|
||||
foreach ( bag in ammo )
|
||||
{
|
||||
if ( findpath( self.origin, bag.origin, 0 ) )
|
||||
{
|
||||
self addgoal( bag.origin, 24, 2, "hack" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < tanks.size )
|
||||
{
|
||||
if ( isDefined( tanks[ i ].owner ) && tanks[ i ].owner == self )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( tanks[ i ].isstunned )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( self throwgrenade( "emp_grenade_mp", tanks[ i ].origin ) )
|
||||
{
|
||||
self waittill( "grenade_fire" );
|
||||
goal = self bot_hack_tank_get_goal_origin( tanks[ i ] );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 24, 3, "hack" );
|
||||
wait 0.5;
|
||||
return;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if ( bot_hack_at_goal() )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self addgoal( self.origin, 24, 4, "hack" );
|
||||
self pressusebutton( level.drone_hack_time + 1 );
|
||||
wait( level.drone_hack_time + 1 );
|
||||
self setstance( "stand" );
|
||||
self cancelgoal( "hack" );
|
||||
}
|
||||
|
||||
tanks = getentarray( "talon", "targetname" );
|
||||
tanks = arraysort( tanks, self.origin );
|
||||
|
||||
if ( !is_true( level.drones_spawned ) )
|
||||
self bot_hack_goal_pregame( tanks );
|
||||
else
|
||||
{
|
||||
foreach ( tank in tanks )
|
||||
{
|
||||
if ( isdefined( tank.owner ) && tank.owner == self )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( tank.owner ) )
|
||||
{
|
||||
if ( self bot_hack_has_goal( tank ) )
|
||||
return;
|
||||
|
||||
goal = self bot_hack_tank_get_goal_origin( tank );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 24, 2, "hack" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( tank.isstunned && distancesquared( self.origin, tank.origin ) < 262144 )
|
||||
{
|
||||
goal = self bot_hack_tank_get_goal_origin( tank );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 24, 3, "hack" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !maps\mp\bots\_bot::bot_vehicle_weapon_ammo( "emp_grenade_mp" ) )
|
||||
{
|
||||
ammo = getentarray( "weapon_scavenger_item_hack_mp", "classname" );
|
||||
ammo = arraysort( ammo, self.origin );
|
||||
|
||||
foreach ( bag in ammo )
|
||||
{
|
||||
if ( findpath( self.origin, bag.origin, 0 ) )
|
||||
{
|
||||
self addgoal( bag.origin, 24, 2, "hack" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ( tank in tanks )
|
||||
{
|
||||
if ( isdefined( tank.owner ) && tank.owner == self )
|
||||
continue;
|
||||
|
||||
if ( tank.isstunned )
|
||||
continue;
|
||||
|
||||
if ( self throwgrenade( "emp_grenade_mp", tank.origin ) )
|
||||
{
|
||||
self waittill( "grenade_fire" );
|
||||
|
||||
goal = self bot_hack_tank_get_goal_origin( tank );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
self addgoal( goal, 24, 3, "hack" );
|
||||
wait 0.5;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,362 +1,362 @@
|
||||
//checked includes changed to match cerberus output
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/bots/_bot_combat;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes/koth;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\koth;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\bots\_bot_combat;
|
||||
#include maps\mp\bots\_bot;
|
||||
|
||||
bot_hq_think() //checked changed to match cerberus output
|
||||
bot_hq_think()
|
||||
{
|
||||
time = getTime();
|
||||
if ( time < self.bot.update_objective )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
if ( bot_should_patrol_hq() )
|
||||
{
|
||||
self bot_patrol_hq();
|
||||
}
|
||||
else if ( !bot_has_hq_goal() )
|
||||
{
|
||||
self bot_move_to_hq();
|
||||
}
|
||||
if ( self bot_is_capturing_hq() )
|
||||
{
|
||||
self bot_capture_hq();
|
||||
}
|
||||
bot_hq_tactical_insertion();
|
||||
bot_hq_grenade();
|
||||
if ( !bot_is_capturing_hq() && !self atgoal( "hq_patrol" ) )
|
||||
{
|
||||
mine = getnearestnode( self.origin );
|
||||
node = hq_nearest_node();
|
||||
if ( isDefined( mine ) && nodesvisible( mine, node ) )
|
||||
{
|
||||
self lookat( level.radio.baseorigin + vectorScale( ( 0, 0, 1 ), 30 ) );
|
||||
}
|
||||
}
|
||||
time = gettime();
|
||||
|
||||
if ( time < self.bot.update_objective )
|
||||
return;
|
||||
|
||||
self.bot.update_objective = time + randomintrange( 500, 1500 );
|
||||
|
||||
if ( bot_should_patrol_hq() )
|
||||
self bot_patrol_hq();
|
||||
else if ( !bot_has_hq_goal() )
|
||||
self bot_move_to_hq();
|
||||
|
||||
if ( self bot_is_capturing_hq() )
|
||||
self bot_capture_hq();
|
||||
|
||||
bot_hq_tactical_insertion();
|
||||
bot_hq_grenade();
|
||||
|
||||
if ( !bot_is_capturing_hq() && !self atgoal( "hq_patrol" ) )
|
||||
{
|
||||
mine = getnearestnode( self.origin );
|
||||
node = hq_nearest_node();
|
||||
|
||||
if ( isdefined( mine ) && nodesvisible( mine, node ) )
|
||||
self lookat( level.radio.baseorigin + vectorscale( ( 0, 0, 1 ), 30.0 ) );
|
||||
}
|
||||
}
|
||||
|
||||
bot_has_hq_goal() //checked changed to match cerberus output
|
||||
bot_has_hq_goal()
|
||||
{
|
||||
origin = self getgoal( "hq_radio" );
|
||||
if ( isDefined( origin ) )
|
||||
{
|
||||
foreach ( node in level.radio.nodes )
|
||||
{
|
||||
if ( distancesquared( origin, node.origin ) < 4096 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
origin = self getgoal( "hq_radio" );
|
||||
|
||||
if ( isdefined( origin ) )
|
||||
{
|
||||
foreach ( node in level.radio.nodes )
|
||||
{
|
||||
if ( distancesquared( origin, node.origin ) < 4096 )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_is_capturing_hq() //checked matches cerberus output
|
||||
bot_is_capturing_hq()
|
||||
{
|
||||
return self atgoal( "hq_radio" );
|
||||
return self atgoal( "hq_radio" );
|
||||
}
|
||||
|
||||
bot_should_patrol_hq() //checked matches cerberus output
|
||||
bot_should_patrol_hq()
|
||||
{
|
||||
if ( level.radio.gameobject.ownerteam == "neutral" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.radio.gameobject.ownerteam != self.team )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( hq_is_contested() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if ( level.radio.gameobject.ownerteam == "neutral" )
|
||||
return false;
|
||||
|
||||
if ( level.radio.gameobject.ownerteam != self.team )
|
||||
return false;
|
||||
|
||||
if ( hq_is_contested() )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bot_patrol_hq() //checked changed to match cerberus output
|
||||
bot_patrol_hq()
|
||||
{
|
||||
self cancelgoal( "hq_radio" );
|
||||
if ( self atgoal( "hq_patrol" ) )
|
||||
{
|
||||
node = getnearestnode( self.origin );
|
||||
if ( node.type == "Path" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setstance( "stand" );
|
||||
}
|
||||
if ( getTime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
{
|
||||
z = randomintrange( 16, 60 );
|
||||
}
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorScale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self.bot.update_lookat = getTime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
goal = self getgoal( "hq_patrol" );
|
||||
nearest = hq_nearest_node();
|
||||
mine = getnearestnode( goal );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_patrol" );
|
||||
}
|
||||
if ( getTime() > self.bot.update_objective_patrol )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_patrol" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
nearest = hq_nearest_node();
|
||||
if ( self hasgoal( "hq_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "hq_patrol" );
|
||||
if ( distancesquared( self.origin, goal ) < 65536 )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
self lookat( origin );
|
||||
}
|
||||
if ( distancesquared( self.origin, goal ) < 16384 )
|
||||
{
|
||||
self.bot.update_objective_patrol = getTime() + randomintrange( 3000, 6000 );
|
||||
}
|
||||
mine = getnearestnode( goal );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_patrol" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
nodes = getvisiblenodes( nearest );
|
||||
/*
|
||||
self cancelgoal( "hq_radio" );
|
||||
|
||||
if ( self atgoal( "hq_patrol" ) )
|
||||
{
|
||||
node = getnearestnode( self.origin );
|
||||
|
||||
if ( node.type == "Path" )
|
||||
self setstance( "crouch" );
|
||||
else
|
||||
self setstance( "stand" );
|
||||
|
||||
if ( gettime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
z = randomintrange( 16, 60 );
|
||||
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorscale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self.bot.update_lookat = gettime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
|
||||
goal = self getgoal( "hq_patrol" );
|
||||
nearest = hq_nearest_node();
|
||||
mine = getnearestnode( goal );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_patrol" );
|
||||
}
|
||||
|
||||
if ( gettime() > self.bot.update_objective_patrol )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_patrol" );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
nearest = hq_nearest_node();
|
||||
|
||||
if ( self hasgoal( "hq_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "hq_patrol" );
|
||||
|
||||
if ( distancesquared( self.origin, goal ) < 65536 )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
self lookat( origin );
|
||||
}
|
||||
|
||||
if ( distancesquared( self.origin, goal ) < 16384 )
|
||||
self.bot.update_objective_patrol = gettime() + randomintrange( 3000, 6000 );
|
||||
|
||||
mine = getnearestnode( goal );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, nearest ) )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_patrol" );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
nodes = getvisiblenodes( nearest );
|
||||
/#
|
||||
assert( nodes.size );
|
||||
assert( nodes.size );
|
||||
#/
|
||||
*/
|
||||
for ( i = randomint( nodes.size ); i < nodes.size; i++ )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "hq_radio", nodes[ i ].origin, 128 ) == 0 )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "hq_patrol", nodes[ i ].origin, 256 ) == 0 )
|
||||
{
|
||||
self addgoal( nodes[ i ], 24, 3, "hq_patrol" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
for ( i = randomint( nodes.size ); i < nodes.size; i++ )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "hq_radio", nodes[i].origin, 128 ) == 0 )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "hq_patrol", nodes[i].origin, 256 ) == 0 )
|
||||
{
|
||||
self addgoal( nodes[i], 24, 3, "hq_patrol" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bot_move_to_hq() //checked changed to match cerberus output
|
||||
bot_move_to_hq()
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_radio" );
|
||||
self cancelgoal( "hq_patrol" );
|
||||
if ( self getstance() == "prone" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
}
|
||||
if ( self getstance() == "crouch" )
|
||||
{
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
nodes = array_randomize( level.radio.nodes );
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "hq_radio", node.origin, 64 ) == 0 )
|
||||
{
|
||||
self addgoal( node, 24, 3, "hq_radio" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
self addgoal( random( nodes ), 24, 3, "hq_radio" );
|
||||
self clearlookat();
|
||||
self cancelgoal( "hq_radio" );
|
||||
self cancelgoal( "hq_patrol" );
|
||||
|
||||
if ( self getstance() == "prone" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
}
|
||||
|
||||
if ( self getstance() == "crouch" )
|
||||
{
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
|
||||
nodes = array_randomize( level.radio.nodes );
|
||||
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "hq_radio", node.origin, 64 ) == 0 )
|
||||
{
|
||||
self addgoal( node, 24, 3, "hq_radio" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
self addgoal( random( nodes ), 24, 3, "hq_radio" );
|
||||
}
|
||||
|
||||
bot_get_look_at() //checked matches cerberus output
|
||||
bot_get_look_at()
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
enemies = self maps/mp/bots/_bot::bot_get_enemies( 0 );
|
||||
if ( enemies.size )
|
||||
{
|
||||
enemy = random( enemies );
|
||||
}
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
spawn = random( level.spawnpoints );
|
||||
node = getvisiblenode( self.origin, spawn.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
return level.radio.baseorigin;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
enemies = self maps\mp\bots\_bot::bot_get_enemies( 0 );
|
||||
|
||||
if ( enemies.size )
|
||||
enemy = random( enemies );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
spawn = random( level.spawnpoints );
|
||||
node = getvisiblenode( self.origin, spawn.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
|
||||
return level.radio.baseorigin;
|
||||
}
|
||||
|
||||
bot_capture_hq() //checked matches cerberus output
|
||||
bot_capture_hq()
|
||||
{
|
||||
self addgoal( self.origin, 24, 3, "hq_radio" );
|
||||
self setstance( "crouch" );
|
||||
if ( getTime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
{
|
||||
z = randomintrange( 16, 60 );
|
||||
}
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorScale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self.bot.update_lookat = getTime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
self addgoal( self.origin, 24, 3, "hq_radio" );
|
||||
self setstance( "crouch" );
|
||||
|
||||
if ( gettime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
z = randomintrange( 16, 60 );
|
||||
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorscale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
self.bot.update_lookat = gettime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
}
|
||||
|
||||
any_other_team_touching( skip_team ) //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
any_other_team_touching( skip_team )
|
||||
{
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( team == skip_team )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.radio.gameobject.numtouching[ team ] )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( team == skip_team )
|
||||
continue;
|
||||
|
||||
if ( level.radio.gameobject.numtouching[team] )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
is_hq_contested( skip_team ) //checked matches cerberus output
|
||||
is_hq_contested( skip_team )
|
||||
{
|
||||
if ( any_other_team_touching( skip_team ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( level.radio.baseorigin, 1 );
|
||||
if ( isDefined( enemy ) && distancesquared( enemy.origin, level.radio.baseorigin ) < 262144 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( any_other_team_touching( skip_team ) )
|
||||
return true;
|
||||
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( level.radio.baseorigin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) && distancesquared( enemy.origin, level.radio.baseorigin ) < 262144 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_hq_grenade() //checked matches cerberus output
|
||||
bot_hq_grenade()
|
||||
{
|
||||
enemies = bot_get_enemies();
|
||||
if ( !enemies.size )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self atgoal( "hq_patrol" ) || self atgoal( "hq_radio" ) )
|
||||
{
|
||||
if ( self getweaponammostock( "proximity_grenade_mp" ) > 0 )
|
||||
{
|
||||
origin = bot_get_look_at();
|
||||
if ( self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !is_hq_contested( self.team ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( level.radio.baseorigin );
|
||||
return;
|
||||
}
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( level.radio.baseorigin, 0 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
origin = enemy.origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
origin = level.radio.baseorigin;
|
||||
}
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = ( 0, dir[ 1 ], 0 );
|
||||
origin += vectorScale( dir, 128 );
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( origin ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_tactical( origin );
|
||||
}
|
||||
enemies = bot_get_enemies();
|
||||
|
||||
if ( !enemies.size )
|
||||
return;
|
||||
|
||||
if ( self atgoal( "hq_patrol" ) || self atgoal( "hq_radio" ) )
|
||||
{
|
||||
if ( self getweaponammostock( "proximity_grenade_mp" ) > 0 )
|
||||
{
|
||||
origin = bot_get_look_at();
|
||||
|
||||
if ( self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin ) )
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !is_hq_contested( self.team ) )
|
||||
{
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_smoke( level.radio.baseorigin );
|
||||
return;
|
||||
}
|
||||
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( level.radio.baseorigin, 0 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
origin = enemy.origin;
|
||||
else
|
||||
origin = level.radio.baseorigin;
|
||||
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = ( 0, dir[1], 0 );
|
||||
origin += vectorscale( dir, 128 );
|
||||
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( origin ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_tactical( origin );
|
||||
}
|
||||
|
||||
bot_hq_tactical_insertion() //checked matches cerberus output
|
||||
bot_hq_tactical_insertion()
|
||||
{
|
||||
if ( !self hasweapon( "tactical_insertion_mp" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
dist = self getlookaheaddist();
|
||||
dir = self getlookaheaddir();
|
||||
if ( !isDefined( dist ) || !isDefined( dir ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
node = hq_nearest_node();
|
||||
mine = getnearestnode( self.origin );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, node ) )
|
||||
{
|
||||
origin = self.origin + vectorScale( dir, dist );
|
||||
next = getnearestnode( origin );
|
||||
if ( isDefined( next ) && nodesvisible( next, node ) )
|
||||
{
|
||||
bot_combat_tactical_insertion( self.origin );
|
||||
}
|
||||
}
|
||||
if ( !self hasweapon( "tactical_insertion_mp" ) )
|
||||
return;
|
||||
|
||||
dist = self getlookaheaddist();
|
||||
dir = self getlookaheaddir();
|
||||
|
||||
if ( !isdefined( dist ) || !isdefined( dir ) )
|
||||
return;
|
||||
|
||||
node = hq_nearest_node();
|
||||
mine = getnearestnode( self.origin );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, node ) )
|
||||
{
|
||||
origin = self.origin + vectorscale( dir, dist );
|
||||
next = getnearestnode( origin );
|
||||
|
||||
if ( isdefined( next ) && nodesvisible( next, node ) )
|
||||
bot_combat_tactical_insertion( self.origin );
|
||||
}
|
||||
}
|
||||
|
||||
hq_nearest_node() //checked matches cerberus output
|
||||
hq_nearest_node()
|
||||
{
|
||||
return random( level.radio.nodes );
|
||||
return random( level.radio.nodes );
|
||||
}
|
||||
|
||||
hq_is_contested() //checked changed at own discretion
|
||||
hq_is_contested()
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( level.radio.baseorigin, 0 );
|
||||
if ( isDefined( enemy ) && distancesquared( enemy.origin, level.radio.baseorigin ) < ( level.radio.node_radius * level.radio.node_radius ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( level.radio.baseorigin, 0 );
|
||||
return isdefined( enemy ) && distancesquared( enemy.origin, level.radio.baseorigin ) < level.radio.node_radius * level.radio.node_radius;
|
||||
}
|
||||
|
||||
|
@ -1,298 +1,290 @@
|
||||
#include maps/mp/bots/_bot_combat;
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/gametypes/koth;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include maps\mp\gametypes\koth;
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\bots\_bot;
|
||||
#include maps\mp\bots\_bot_combat;
|
||||
|
||||
bot_koth_think() //checked matches cerberus output
|
||||
bot_koth_think()
|
||||
{
|
||||
if ( !isDefined( level.zone.trig.goal_radius ) )
|
||||
{
|
||||
maxs = level.zone.trig getmaxs();
|
||||
maxs = level.zone.trig.origin + maxs;
|
||||
level.zone.trig.goal_radius = distance( level.zone.trig.origin, maxs );
|
||||
/*
|
||||
if ( !isdefined( level.zone.trig.goal_radius ) )
|
||||
{
|
||||
maxs = level.zone.trig getmaxs();
|
||||
maxs = level.zone.trig.origin + maxs;
|
||||
level.zone.trig.goal_radius = distance( level.zone.trig.origin, maxs );
|
||||
/#
|
||||
println( "distance: " + level.zone.trig.goal_radius );
|
||||
println( "distance: " + level.zone.trig.goal_radius );
|
||||
#/
|
||||
*/
|
||||
ground = bullettrace( level.zone.gameobject.curorigin, level.zone.gameobject.curorigin - vectorScale( ( 0, 0, 1 ), 1024 ), 0, undefined );
|
||||
level.zone.trig.goal = ground[ "position" ] + vectorScale( ( 0, 0, 1 ), 8 );
|
||||
}
|
||||
if ( !bot_has_hill_goal() )
|
||||
{
|
||||
self bot_move_to_hill();
|
||||
}
|
||||
if ( self bot_is_at_hill() )
|
||||
{
|
||||
self bot_capture_hill();
|
||||
}
|
||||
bot_hill_tactical_insertion();
|
||||
bot_hill_grenade();
|
||||
ground = bullettrace( level.zone.gameobject.curorigin, level.zone.gameobject.curorigin - vectorscale( ( 0, 0, 1 ), 1024.0 ), 0, undefined );
|
||||
level.zone.trig.goal = ground["position"] + vectorscale( ( 0, 0, 1 ), 8.0 );
|
||||
}
|
||||
|
||||
if ( !bot_has_hill_goal() )
|
||||
self bot_move_to_hill();
|
||||
|
||||
if ( self bot_is_at_hill() )
|
||||
self bot_capture_hill();
|
||||
|
||||
bot_hill_tactical_insertion();
|
||||
bot_hill_grenade();
|
||||
}
|
||||
|
||||
bot_has_hill_goal() //checked matches cerberus output
|
||||
bot_has_hill_goal()
|
||||
{
|
||||
origin = self getgoal( "koth_hill" );
|
||||
if ( isDefined( origin ) )
|
||||
{
|
||||
if ( distance2dsquared( level.zone.gameobject.curorigin, origin ) < level.zone.trig.goal_radius * level.zone.trig.goal_radius )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
origin = self getgoal( "koth_hill" );
|
||||
|
||||
if ( isdefined( origin ) )
|
||||
{
|
||||
if ( distance2dsquared( level.zone.gameobject.curorigin, origin ) < level.zone.trig.goal_radius * level.zone.trig.goal_radius )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_is_at_hill() //checked matches cerberus output
|
||||
bot_is_at_hill()
|
||||
{
|
||||
return self atgoal( "koth_hill" );
|
||||
return self atgoal( "koth_hill" );
|
||||
}
|
||||
|
||||
bot_move_to_hill() //checked changed to match cerberus output
|
||||
bot_move_to_hill()
|
||||
{
|
||||
if ( getTime() < ( self.bot.update_objective + 4000 ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self clearlookat();
|
||||
self cancelgoal( "koth_hill" );
|
||||
if ( self getstance() == "prone" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
}
|
||||
if ( self getstance() == "crouch" )
|
||||
{
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
nodes = getnodesinradiussorted( level.zone.trig.goal, level.zone.trig.goal_radius, 0, 128 );
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "koth_hill", node.origin, 64 ) == 0 )
|
||||
{
|
||||
if ( findpath( self.origin, node.origin, self, 0, 1 ) )
|
||||
{
|
||||
self addgoal( node, 24, 3, "koth_hill" );
|
||||
self.bot.update_objective = getTime();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( gettime() < self.bot.update_objective + 4000 )
|
||||
return;
|
||||
|
||||
self clearlookat();
|
||||
self cancelgoal( "koth_hill" );
|
||||
|
||||
if ( self getstance() == "prone" )
|
||||
{
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
}
|
||||
|
||||
if ( self getstance() == "crouch" )
|
||||
{
|
||||
self setstance( "stand" );
|
||||
wait 0.25;
|
||||
}
|
||||
|
||||
nodes = getnodesinradiussorted( level.zone.trig.goal, level.zone.trig.goal_radius, 0, 128 );
|
||||
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "koth_hill", node.origin, 64 ) == 0 )
|
||||
{
|
||||
if ( findpath( self.origin, node.origin, self, 0, 1 ) )
|
||||
{
|
||||
self addgoal( node, 24, 3, "koth_hill" );
|
||||
self.bot.update_objective = gettime();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bot_get_look_at() //checked matches cerberus output
|
||||
bot_get_look_at()
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 1024 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
enemies = self maps/mp/bots/_bot::bot_get_enemies( 0 );
|
||||
if ( enemies.size )
|
||||
{
|
||||
enemy = random( enemies );
|
||||
}
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 1024 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
spawn = random( level.spawnpoints );
|
||||
node = getvisiblenode( self.origin, spawn.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 1024 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
return level.zone.gameobject.curorigin;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 1024 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
enemies = self maps\mp\bots\_bot::bot_get_enemies( 0 );
|
||||
|
||||
if ( enemies.size )
|
||||
enemy = random( enemies );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 1024 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
spawn = random( level.spawnpoints );
|
||||
node = getvisiblenode( self.origin, spawn.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 1024 )
|
||||
return node.origin;
|
||||
|
||||
return level.zone.gameobject.curorigin;
|
||||
}
|
||||
|
||||
bot_capture_hill() //checked changed to match cerberus output
|
||||
bot_capture_hill()
|
||||
{
|
||||
self addgoal( self.origin, 24, 3, "koth_hill" );
|
||||
self setstance( "crouch" );
|
||||
if ( getTime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
{
|
||||
z = randomintrange( 16, 60 );
|
||||
}
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorScale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
if ( cointoss() && lengthsquared( self getvelocity() ) < 2 )
|
||||
{
|
||||
nodes = getnodesinradius( level.zone.trig.goal, level.zone.trig.goal_radius + 128, 0, 128 );
|
||||
for ( i = randomintrange( 0, nodes.size ); i < nodes.size; i++ )
|
||||
{
|
||||
node = nodes[ i ];
|
||||
if ( distancesquared( node.origin, self.origin ) > 1024 )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "koth_hill", node.origin, 128 ) == 0 )
|
||||
{
|
||||
if ( findpath( self.origin, node.origin, self, 0, 1 ) )
|
||||
{
|
||||
self addgoal( node, 24, 3, "koth_hill" );
|
||||
self.bot.update_objective = getTime();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.bot.update_lookat = getTime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
self addgoal( self.origin, 24, 3, "koth_hill" );
|
||||
self setstance( "crouch" );
|
||||
|
||||
if ( gettime() > self.bot.update_lookat )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
z = randomintrange( 16, 60 );
|
||||
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorscale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
|
||||
if ( cointoss() && lengthsquared( self getvelocity() ) < 2 )
|
||||
{
|
||||
nodes = getnodesinradius( level.zone.trig.goal, level.zone.trig.goal_radius + 128, 0, 128 );
|
||||
|
||||
for ( i = randomintrange( 0, nodes.size ); i < nodes.size; i++ )
|
||||
{
|
||||
node = nodes[i];
|
||||
|
||||
if ( distancesquared( node.origin, self.origin ) > 1024 )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "koth_hill", node.origin, 128 ) == 0 )
|
||||
{
|
||||
if ( findpath( self.origin, node.origin, self, 0, 1 ) )
|
||||
{
|
||||
self addgoal( node, 24, 3, "koth_hill" );
|
||||
self.bot.update_objective = gettime();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.bot.update_lookat = gettime() + randomintrange( 1500, 3000 );
|
||||
}
|
||||
}
|
||||
|
||||
any_other_team_touching( skip_team ) //checked partially changed to match cerberus output did not use foreach see github for more info
|
||||
any_other_team_touching( skip_team )
|
||||
{
|
||||
teams = getArrayKeys( level.teams );
|
||||
while ( i < teams.size )
|
||||
{
|
||||
if ( teams[ i ] == skip_team )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( level.zone.gameobject.numtouching[ teams[ i ] ] )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
if ( team == skip_team )
|
||||
continue;
|
||||
|
||||
if ( level.zone.gameobject.numtouching[team] )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
is_hill_contested( skip_team ) //checked matches cerberus output
|
||||
is_hill_contested( skip_team )
|
||||
{
|
||||
if ( any_other_team_touching( skip_team ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( level.zone.gameobject.curorigin, 1 );
|
||||
if ( isDefined( enemy ) && distancesquared( enemy.origin, level.zone.gameobject.curorigin ) < 262144 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if ( any_other_team_touching( skip_team ) )
|
||||
return true;
|
||||
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( level.zone.gameobject.curorigin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) && distancesquared( enemy.origin, level.zone.gameobject.curorigin ) < 262144 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bot_hill_grenade() //checked changed to match cerberus output
|
||||
bot_hill_grenade()
|
||||
{
|
||||
enemies = bot_get_enemies();
|
||||
if ( !enemies.size )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( self atgoal( "hill_patrol" ) || self atgoal( "koth_hill" ) )
|
||||
{
|
||||
if ( self getweaponammostock( "proximity_grenade_mp" ) > 0 )
|
||||
{
|
||||
origin = bot_get_look_at();
|
||||
if ( self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !is_hill_contested( self.team ) )
|
||||
{
|
||||
if ( !isDefined( level.next_smoke_time ) )
|
||||
{
|
||||
level.next_smoke_time = 0;
|
||||
}
|
||||
if ( getTime() > level.next_smoke_time )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot_combat::bot_combat_throw_smoke( level.zone.gameobject.curorigin ) )
|
||||
{
|
||||
level.next_smoke_time = getTime() + randomintrange( 60000, 120000 );
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( level.zone.gameobject.curorigin, 0 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
origin = enemy.origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
origin = level.zone.gameobject.curorigin;
|
||||
}
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = ( 0, dir[ 1 ], 0 );
|
||||
origin += vectorScale( dir, 128 );
|
||||
if ( maps/mp/bots/_bot::bot_get_difficulty() == "easy" )
|
||||
{
|
||||
if ( !isDefined( level.next_grenade_time ) )
|
||||
{
|
||||
level.next_grenade_time = 0;
|
||||
}
|
||||
if ( getTime() > level.next_grenade_time )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( origin ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_tactical( origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
level.next_grenade_time = getTime() + randomintrange( 60000, 120000 );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( origin ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_tactical( origin );
|
||||
}
|
||||
enemies = bot_get_enemies();
|
||||
|
||||
if ( !enemies.size )
|
||||
return;
|
||||
|
||||
if ( self atgoal( "hill_patrol" ) || self atgoal( "koth_hill" ) )
|
||||
{
|
||||
if ( self getweaponammostock( "proximity_grenade_mp" ) > 0 )
|
||||
{
|
||||
origin = bot_get_look_at();
|
||||
|
||||
if ( self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin ) )
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !is_hill_contested( self.team ) )
|
||||
{
|
||||
if ( !isdefined( level.next_smoke_time ) )
|
||||
level.next_smoke_time = 0;
|
||||
|
||||
if ( gettime() > level.next_smoke_time )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot_combat::bot_combat_throw_smoke( level.zone.gameobject.curorigin ) )
|
||||
level.next_smoke_time = gettime() + randomintrange( 60000, 120000 );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( level.zone.gameobject.curorigin, 0 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
origin = enemy.origin;
|
||||
else
|
||||
origin = level.zone.gameobject.curorigin;
|
||||
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = ( 0, dir[1], 0 );
|
||||
origin += vectorscale( dir, 128 );
|
||||
|
||||
if ( maps\mp\bots\_bot::bot_get_difficulty() == "easy" )
|
||||
{
|
||||
if ( !isdefined( level.next_grenade_time ) )
|
||||
level.next_grenade_time = 0;
|
||||
|
||||
if ( gettime() > level.next_grenade_time )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( origin ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_tactical( origin );
|
||||
else
|
||||
level.next_grenade_time = gettime() + randomintrange( 60000, 120000 );
|
||||
}
|
||||
}
|
||||
else if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( origin ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_tactical( origin );
|
||||
}
|
||||
|
||||
bot_hill_tactical_insertion() //checked matches cerberus output
|
||||
bot_hill_tactical_insertion()
|
||||
{
|
||||
if ( !self hasweapon( "tactical_insertion_mp" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
dist = self getlookaheaddist();
|
||||
dir = self getlookaheaddir();
|
||||
if ( !isDefined( dist ) || !isDefined( dir ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
node = hill_nearest_node();
|
||||
mine = getnearestnode( self.origin );
|
||||
if ( isDefined( mine ) && !nodesvisible( mine, node ) )
|
||||
{
|
||||
origin = self.origin + vectorScale( dir, dist );
|
||||
next = getnearestnode( origin );
|
||||
if ( isDefined( next ) && nodesvisible( next, node ) )
|
||||
{
|
||||
bot_combat_tactical_insertion( self.origin );
|
||||
}
|
||||
}
|
||||
if ( !self hasweapon( "tactical_insertion_mp" ) )
|
||||
return;
|
||||
|
||||
dist = self getlookaheaddist();
|
||||
dir = self getlookaheaddir();
|
||||
|
||||
if ( !isdefined( dist ) || !isdefined( dir ) )
|
||||
return;
|
||||
|
||||
node = hill_nearest_node();
|
||||
mine = getnearestnode( self.origin );
|
||||
|
||||
if ( isdefined( mine ) && !nodesvisible( mine, node ) )
|
||||
{
|
||||
origin = self.origin + vectorscale( dir, dist );
|
||||
next = getnearestnode( origin );
|
||||
|
||||
if ( isdefined( next ) && nodesvisible( next, node ) )
|
||||
bot_combat_tactical_insertion( self.origin );
|
||||
}
|
||||
}
|
||||
|
||||
hill_nearest_node() //checked matches cerberus output
|
||||
hill_nearest_node()
|
||||
{
|
||||
nodes = getnodesinradiussorted( level.zone.gameobject.curorigin, 256, 0 );
|
||||
/*
|
||||
nodes = getnodesinradiussorted( level.zone.gameobject.curorigin, 256, 0 );
|
||||
/#
|
||||
assert( nodes.size );
|
||||
assert( nodes.size );
|
||||
#/
|
||||
*/
|
||||
return nodes[ 0 ];
|
||||
return nodes[0];
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,442 +1,442 @@
|
||||
//changed includes to match cerberus output
|
||||
#include maps/mp/gametypes/_globallogic_utils;
|
||||
#include maps/mp/bots/_bot_combat;
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/gametypes/_gameobjects;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
#include common_scripts\utility;
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_gameobjects;
|
||||
#include maps\mp\bots\_bot;
|
||||
#include maps\mp\bots\_bot_combat;
|
||||
#include maps\mp\gametypes\_globallogic_utils;
|
||||
|
||||
bot_sd_think() //checked changed to match cerberus output
|
||||
bot_sd_think()
|
||||
{
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( !isDefined( zone.nearest_node ) )
|
||||
{
|
||||
nodes = getnodesinradiussorted( zone.trigger.origin, 256, 0 );
|
||||
/*
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( !isdefined( zone.nearest_node ) )
|
||||
{
|
||||
nodes = getnodesinradiussorted( zone.trigger.origin, 256, 0 );
|
||||
/#
|
||||
assert( nodes.size );
|
||||
assert( nodes.size );
|
||||
#/
|
||||
*/
|
||||
zone.nearest_node = nodes[ 0 ];
|
||||
}
|
||||
}
|
||||
zone = sd_get_planted_zone();
|
||||
if ( isDefined( zone ) )
|
||||
{
|
||||
self bot_sd_defender( zone, 1 );
|
||||
}
|
||||
else if ( self.team == game[ "attackers" ] )
|
||||
{
|
||||
if ( level.multibomb )
|
||||
{
|
||||
self.isbombcarrier = 1;
|
||||
}
|
||||
self bot_sd_attacker();
|
||||
}
|
||||
else
|
||||
{
|
||||
zone = random( level.bombzones );
|
||||
self bot_sd_defender( zone );
|
||||
}
|
||||
zone.nearest_node = nodes[0];
|
||||
}
|
||||
}
|
||||
|
||||
zone = sd_get_planted_zone();
|
||||
|
||||
if ( isdefined( zone ) )
|
||||
self bot_sd_defender( zone, 1 );
|
||||
else if ( self.team == game["attackers"] )
|
||||
{
|
||||
if ( level.multibomb )
|
||||
self.isbombcarrier = 1;
|
||||
|
||||
self bot_sd_attacker();
|
||||
}
|
||||
else
|
||||
{
|
||||
zone = random( level.bombzones );
|
||||
self bot_sd_defender( zone );
|
||||
}
|
||||
}
|
||||
|
||||
bot_sd_attacker() //checked changed to match cerberus output
|
||||
bot_sd_attacker()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
if ( !level.multibomb && !isDefined( level.sdbomb.carrier ) && !level.bombplanted )
|
||||
{
|
||||
self cancelgoal( "sd_protect_carrier" );
|
||||
if ( !level.sdbomb maps/mp/gametypes/_gameobjects::isobjectawayfromhome() )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot::bot_friend_goal_in_radius( "sd_pickup", level.sdbomb.curorigin, 64 ) )
|
||||
{
|
||||
self addgoal( level.sdbomb.curorigin, 16, 4, "sd_pickup" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self addgoal( level.sdbomb.curorigin, 16, 4, "sd_pickup" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self cancelgoal( "sd_pickup" );
|
||||
}
|
||||
if ( is_true( self.isbombcarrier ) )
|
||||
{
|
||||
goal = self getgoal( "sd_plant" );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
if ( distancesquared( self.origin, goal ) < 2304 )
|
||||
{
|
||||
self setstance( "prone" );
|
||||
wait 0.5;
|
||||
self pressusebutton( level.planttime + 1 );
|
||||
wait 0.5;
|
||||
if ( is_true( self.isplanting ) )
|
||||
{
|
||||
wait ( level.planttime + 1 );
|
||||
}
|
||||
self pressusebutton( 0 );
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "sd_plant" );
|
||||
self setstance( "stand" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if ( getTime() > self.bot[ "patrol_update" ] )
|
||||
{
|
||||
frac = sd_get_time_frac();
|
||||
if ( randomint( 100 ) < ( frac * 100 ) || frac > 0.85 )
|
||||
{
|
||||
zone = sd_get_closest_bomb();
|
||||
goal = sd_get_bomb_goal( zone.visuals[ 0 ] );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
if ( frac > 0.85 )
|
||||
{
|
||||
self addgoal( goal, 24, 4, "sd_plant" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self addgoal( goal, 24, 3, "sd_plant" );
|
||||
}
|
||||
}
|
||||
}
|
||||
self.bot[ "patrol_update" ] = getTime() + randomintrange( 2500, 5000 );
|
||||
}
|
||||
}
|
||||
else if ( isDefined( level.sdbomb.carrier ) && !isplayer( level.sdbomb.carrier ) )
|
||||
{
|
||||
if ( !isDefined( self.protectcarrier ) )
|
||||
{
|
||||
if ( randomint( 100 ) > 70 )
|
||||
{
|
||||
self.protectcarrier = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.protectcarrier = 0;
|
||||
}
|
||||
}
|
||||
if ( self.protectcarrier )
|
||||
{
|
||||
goal = level.sdbomb.carrier getgoal( "sd_plant" );
|
||||
if ( isDefined( goal ) )
|
||||
{
|
||||
nodes = getnodesinradiussorted( goal, 256, 0 );
|
||||
if ( isDefined( nodes ) && nodes.size > 0 && !isDefined( self getgoal( "sd_protect_carrier" ) ) )
|
||||
{
|
||||
self addgoal( nodes[ randomint( nodes.size ) ], 24, 3, "sd_protect_carrier" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( !level.multibomb && !isdefined( level.sdbomb.carrier ) && !level.bombplanted )
|
||||
{
|
||||
self cancelgoal( "sd_protect_carrier" );
|
||||
|
||||
if ( !level.sdbomb maps\mp\gametypes\_gameobjects::isobjectawayfromhome() )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot::bot_friend_goal_in_radius( "sd_pickup", level.sdbomb.curorigin, 64 ) )
|
||||
{
|
||||
self addgoal( level.sdbomb.curorigin, 16, 4, "sd_pickup" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self addgoal( level.sdbomb.curorigin, 16, 4, "sd_pickup" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
self cancelgoal( "sd_pickup" );
|
||||
|
||||
if ( is_true( self.isbombcarrier ) )
|
||||
{
|
||||
goal = self getgoal( "sd_plant" );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
if ( distancesquared( self.origin, goal ) < 2304 )
|
||||
{
|
||||
self setstance( "prone" );
|
||||
wait 0.5;
|
||||
self pressusebutton( level.planttime + 1 );
|
||||
wait 0.5;
|
||||
|
||||
if ( is_true( self.isplanting ) )
|
||||
wait( level.planttime + 1 );
|
||||
|
||||
self pressusebutton( 0 );
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "sd_plant" );
|
||||
self setstance( "stand" );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else if ( gettime() > self.bot["patrol_update"] )
|
||||
{
|
||||
frac = sd_get_time_frac();
|
||||
|
||||
if ( randomint( 100 ) < frac * 100 || frac > 0.85 )
|
||||
{
|
||||
zone = sd_get_closest_bomb();
|
||||
goal = sd_get_bomb_goal( zone.visuals[0] );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
if ( frac > 0.85 )
|
||||
self addgoal( goal, 24, 4, "sd_plant" );
|
||||
else
|
||||
self addgoal( goal, 24, 3, "sd_plant" );
|
||||
}
|
||||
}
|
||||
|
||||
self.bot["patrol_update"] = gettime() + randomintrange( 2500, 5000 );
|
||||
}
|
||||
}
|
||||
else if ( isdefined( level.sdbomb.carrier ) && !isplayer( level.sdbomb.carrier ) )
|
||||
{
|
||||
if ( !isdefined( self.protectcarrier ) )
|
||||
{
|
||||
if ( randomint( 100 ) > 70 )
|
||||
self.protectcarrier = 1;
|
||||
else
|
||||
self.protectcarrier = 0;
|
||||
}
|
||||
|
||||
if ( self.protectcarrier )
|
||||
{
|
||||
goal = level.sdbomb.carrier getgoal( "sd_plant" );
|
||||
|
||||
if ( isdefined( goal ) )
|
||||
{
|
||||
nodes = getnodesinradiussorted( goal, 256, 0 );
|
||||
|
||||
if ( isdefined( nodes ) && nodes.size > 0 && !isdefined( self getgoal( "sd_protect_carrier" ) ) )
|
||||
self addgoal( nodes[randomint( nodes.size )], 24, 3, "sd_protect_carrier" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bot_sd_defender( zone, isplanted ) //checked partially changed to match cerberus output did not use foreach see github for more info
|
||||
bot_sd_defender( zone, isplanted )
|
||||
{
|
||||
bot_sd_grenade();
|
||||
if ( isDefined( isplanted ) && isplanted && self hasgoal( "sd_defend" ) )
|
||||
{
|
||||
goal = self getgoal( "sd_defend" );
|
||||
planted = sd_get_planted_zone();
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( planted != zone && distance2d( goal, zone.nearest_node.origin ) < distance2d( goal, planted.nearest_node.origin ) )
|
||||
{
|
||||
self cancelgoal( "sd_defend" );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( self atgoal( "sd_defend" ) || self bot_need_to_defuse() )
|
||||
{
|
||||
bot_sd_defender_think( zone );
|
||||
if ( self hasgoal( "sd_defend" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( self hasgoal( "enemy_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "enemy_patrol" );
|
||||
closezone = sd_get_closest_bomb();
|
||||
if ( distancesquared( goal, closezone.nearest_node.origin ) < 262144 )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "sd_defend" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( self hasgoal( "sd_defend" ) )
|
||||
{
|
||||
self.bot[ "patrol_update" ] = getTime() + randomintrange( 2500, 5000 );
|
||||
return;
|
||||
}
|
||||
if ( self hasgoal( "enemy_patrol" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
nodes = getvisiblenodes( zone.nearest_node );
|
||||
best = undefined;
|
||||
highest = -100;
|
||||
i = 0;
|
||||
while ( i < nodes.size )
|
||||
{
|
||||
if ( node[ i ].type == "BAD NODE" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( !canclaimnode( node[ i ], self.team ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( distancesquared( node[ i ].origin, self.origin ) < 65536 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "sd_defend", node[ i ].origin, 256 ) > 0 )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
height = node[ i ].origin[ 2 ] - zone.nearest_node.origin[ 2 ];
|
||||
if ( is_true( isplanted ) )
|
||||
{
|
||||
dist = distance2d( node[ i ].origin, zone.nearest_node.origin );
|
||||
score = ( 10000 - dist ) + height;
|
||||
}
|
||||
else
|
||||
{
|
||||
score = height;
|
||||
}
|
||||
if ( score > highest )
|
||||
{
|
||||
highest = score;
|
||||
best = node;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !isDefined( best ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self addgoal( best, 24, 3, "sd_defend" );
|
||||
bot_sd_grenade();
|
||||
|
||||
if ( isdefined( isplanted ) && isplanted && self hasgoal( "sd_defend" ) )
|
||||
{
|
||||
goal = self getgoal( "sd_defend" );
|
||||
planted = sd_get_planted_zone();
|
||||
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( planted != zone && distance2d( goal, zone.nearest_node.origin ) < distance2d( goal, planted.nearest_node.origin ) )
|
||||
self cancelgoal( "sd_defend" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( self atgoal( "sd_defend" ) || self bot_need_to_defuse() )
|
||||
{
|
||||
bot_sd_defender_think( zone );
|
||||
|
||||
if ( self hasgoal( "sd_defend" ) )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self hasgoal( "enemy_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "enemy_patrol" );
|
||||
closezone = sd_get_closest_bomb();
|
||||
|
||||
if ( distancesquared( goal, closezone.nearest_node.origin ) < 262144 )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "sd_defend" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( self hasgoal( "sd_defend" ) )
|
||||
{
|
||||
self.bot["patrol_update"] = gettime() + randomintrange( 2500, 5000 );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self hasgoal( "enemy_patrol" ) )
|
||||
return;
|
||||
|
||||
nodes = getvisiblenodes( zone.nearest_node );
|
||||
best = undefined;
|
||||
highest = -100;
|
||||
|
||||
foreach ( node in nodes )
|
||||
{
|
||||
if ( node.type == "BAD NODE" )
|
||||
continue;
|
||||
|
||||
if ( !canclaimnode( node, self.team ) )
|
||||
continue;
|
||||
|
||||
if ( distancesquared( node.origin, self.origin ) < 65536 )
|
||||
continue;
|
||||
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "sd_defend", node.origin, 256 ) > 0 )
|
||||
continue;
|
||||
|
||||
height = node.origin[2] - zone.nearest_node.origin[2];
|
||||
|
||||
if ( isdefined( isplanted ) && isplanted )
|
||||
{
|
||||
dist = distance2d( node.origin, zone.nearest_node.origin );
|
||||
score = 10000 - dist + height;
|
||||
}
|
||||
else
|
||||
score = height;
|
||||
|
||||
if ( score > highest )
|
||||
{
|
||||
highest = score;
|
||||
best = node;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !isdefined( best ) )
|
||||
return;
|
||||
|
||||
self addgoal( best, 24, 3, "sd_defend" );
|
||||
}
|
||||
|
||||
bot_get_look_at() //checked matches cebrerus output
|
||||
bot_get_look_at()
|
||||
{
|
||||
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
enemies = self maps/mp/bots/_bot::bot_get_enemies( 0 );
|
||||
if ( enemies.size )
|
||||
{
|
||||
enemy = random( enemies );
|
||||
}
|
||||
if ( isDefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
}
|
||||
zone = sd_get_closest_bomb();
|
||||
node = getvisiblenode( self.origin, zone.nearest_node.origin );
|
||||
if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
{
|
||||
return node.origin;
|
||||
}
|
||||
forward = anglesToForward( self getplayerangles() );
|
||||
origin = self geteye() + ( forward * 1024 );
|
||||
return origin;
|
||||
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
enemies = self maps\mp\bots\_bot::bot_get_enemies( 0 );
|
||||
|
||||
if ( enemies.size )
|
||||
enemy = random( enemies );
|
||||
|
||||
if ( isdefined( enemy ) )
|
||||
{
|
||||
node = getvisiblenode( self.origin, enemy.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
}
|
||||
|
||||
zone = sd_get_closest_bomb();
|
||||
node = getvisiblenode( self.origin, zone.nearest_node.origin );
|
||||
|
||||
if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 16384 )
|
||||
return node.origin;
|
||||
|
||||
forward = anglestoforward( self getplayerangles() );
|
||||
origin = self geteye() + forward * 1024;
|
||||
return origin;
|
||||
}
|
||||
|
||||
bot_sd_defender_think( zone ) //checked matches cerberus output
|
||||
bot_sd_defender_think( zone )
|
||||
{
|
||||
if ( self bot_need_to_defuse() )
|
||||
{
|
||||
if ( self maps/mp/bots/_bot::bot_friend_goal_in_radius( "sd_defuse", level.sdbombmodel.origin, 16 ) > 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self clearlookat();
|
||||
goal = self getgoal( "sd_defuse" );
|
||||
if ( isDefined( goal ) && distancesquared( self.origin, goal ) < 2304 )
|
||||
{
|
||||
self setstance( "prone" );
|
||||
wait 0.5;
|
||||
self pressusebutton( level.defusetime + 1 );
|
||||
wait 0.5;
|
||||
if ( is_true( self.isdefusing ) )
|
||||
{
|
||||
wait ( level.defusetime + 1 );
|
||||
}
|
||||
self pressusebutton( 0 );
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "sd_defuse" );
|
||||
self setstance( "stand" );
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( goal ) && distance2dsquared( self.origin, level.sdbombmodel.origin ) < 1000000 )
|
||||
{
|
||||
self addgoal( level.sdbombmodel.origin, 24, 4, "sd_defuse" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( getTime() > self.bot[ "patrol_update" ] )
|
||||
{
|
||||
if ( cointoss() )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "sd_defend" );
|
||||
return;
|
||||
}
|
||||
self.bot[ "patrol_update" ] = getTime() + randomintrange( 2500, 5000 );
|
||||
}
|
||||
if ( self hasgoal( "enemy_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "enemy_patrol" );
|
||||
zone = sd_get_closest_bomb();
|
||||
if ( distancesquared( goal, zone.nearest_node.origin ) < 262144 )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "sd_defend" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( getTime() > self.bot[ "lookat_update" ] )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
{
|
||||
z = randomintrange( 16, 60 );
|
||||
}
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
self.bot[ "lookat_update" ] = getTime() + randomintrange( 1500, 3000 );
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorScale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity( origin );
|
||||
}
|
||||
if ( self bot_need_to_defuse() )
|
||||
{
|
||||
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "sd_defuse", level.sdbombmodel.origin, 16 ) > 0 )
|
||||
return;
|
||||
|
||||
self clearlookat();
|
||||
goal = self getgoal( "sd_defuse" );
|
||||
|
||||
if ( isdefined( goal ) && distancesquared( self.origin, goal ) < 2304 )
|
||||
{
|
||||
self setstance( "prone" );
|
||||
wait 0.5;
|
||||
self pressusebutton( level.defusetime + 1 );
|
||||
wait 0.5;
|
||||
|
||||
if ( is_true( self.isdefusing ) )
|
||||
wait( level.defusetime + 1 );
|
||||
|
||||
self pressusebutton( 0 );
|
||||
self setstance( "crouch" );
|
||||
wait 0.25;
|
||||
self cancelgoal( "sd_defuse" );
|
||||
self setstance( "stand" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !isdefined( goal ) && distance2dsquared( self.origin, level.sdbombmodel.origin ) < 1000000 )
|
||||
self addgoal( level.sdbombmodel.origin, 24, 4, "sd_defuse" );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( gettime() > self.bot["patrol_update"] )
|
||||
{
|
||||
if ( cointoss() )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "sd_defend" );
|
||||
return;
|
||||
}
|
||||
|
||||
self.bot["patrol_update"] = gettime() + randomintrange( 2500, 5000 );
|
||||
}
|
||||
|
||||
if ( self hasgoal( "enemy_patrol" ) )
|
||||
{
|
||||
goal = self getgoal( "enemy_patrol" );
|
||||
zone = sd_get_closest_bomb();
|
||||
|
||||
if ( distancesquared( goal, zone.nearest_node.origin ) < 262144 )
|
||||
{
|
||||
self clearlookat();
|
||||
self cancelgoal( "sd_defend" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( gettime() > self.bot["lookat_update"] )
|
||||
{
|
||||
origin = self bot_get_look_at();
|
||||
z = 20;
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||
z = randomintrange( 16, 60 );
|
||||
|
||||
self lookat( origin + ( 0, 0, z ) );
|
||||
self.bot["lookat_update"] = gettime() + randomintrange( 1500, 3000 );
|
||||
|
||||
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||
{
|
||||
dir = vectornormalize( self.origin - origin );
|
||||
dir = vectorscale( dir, 256 );
|
||||
origin += dir;
|
||||
}
|
||||
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||
}
|
||||
}
|
||||
|
||||
bot_need_to_defuse() //checked changed at own discretion
|
||||
bot_need_to_defuse()
|
||||
{
|
||||
if ( level.bombplanted && self.team == game[ "defenders" ] )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
return level.bombplanted && self.team == game["defenders"];
|
||||
}
|
||||
|
||||
sd_get_bomb_goal( ent ) //checked changed to match cerberus output
|
||||
sd_get_bomb_goal( ent )
|
||||
{
|
||||
goals = [];
|
||||
dir = anglesToForward( ent.angles );
|
||||
dir = vectorScale( dir, 32 );
|
||||
goals[ 0 ] = ent.origin + dir;
|
||||
goals[ 1 ] = ent.origin - dir;
|
||||
dir = anglesToRight( ent.angles );
|
||||
dir = vectorScale( dir, 48 );
|
||||
goals[ 2 ] = ent.origin + dir;
|
||||
goals[ 3 ] = ent.origin - dir;
|
||||
goals = array_randomize( goals );
|
||||
foreach ( goal in goals )
|
||||
{
|
||||
if ( findpath( self.origin, goal, 0 ) )
|
||||
{
|
||||
return goal;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
goals = [];
|
||||
dir = anglestoforward( ent.angles );
|
||||
dir = vectorscale( dir, 32 );
|
||||
goals[0] = ent.origin + dir;
|
||||
goals[1] = ent.origin - dir;
|
||||
dir = anglestoright( ent.angles );
|
||||
dir = vectorscale( dir, 48 );
|
||||
goals[2] = ent.origin + dir;
|
||||
goals[3] = ent.origin - dir;
|
||||
goals = array_randomize( goals );
|
||||
|
||||
foreach ( goal in goals )
|
||||
{
|
||||
if ( findpath( self.origin, goal, 0 ) )
|
||||
return goal;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
sd_get_time_frac() //checked matches cerberus output
|
||||
sd_get_time_frac()
|
||||
{
|
||||
remaining = maps/mp/gametypes/_globallogic_utils::gettimeremaining();
|
||||
end = ( level.timelimit * 60 ) * 1000;
|
||||
if ( end == 0 )
|
||||
{
|
||||
end = self.spawntime + 120000;
|
||||
remaining = end - getTime();
|
||||
}
|
||||
return 1 - ( remaining / end );
|
||||
remaining = maps\mp\gametypes\_globallogic_utils::gettimeremaining();
|
||||
end = level.timelimit * 60 * 1000;
|
||||
|
||||
if ( end == 0 )
|
||||
{
|
||||
end = self.spawntime + 120000;
|
||||
remaining = end - gettime();
|
||||
}
|
||||
|
||||
return 1 - remaining / end;
|
||||
}
|
||||
|
||||
sd_get_closest_bomb() //checked partially changed to match cerberus output did not use continue see github for more info
|
||||
sd_get_closest_bomb()
|
||||
{
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
d = distancesquared( self.origin, zone.curorigin );
|
||||
if ( !isDefined( best ) )
|
||||
{
|
||||
best = zone;
|
||||
distsq = d;
|
||||
}
|
||||
else if ( d < distsq )
|
||||
{
|
||||
best = zone;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
return best;
|
||||
best = undefined;
|
||||
distsq = 9999999;
|
||||
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
d = distancesquared( self.origin, zone.curorigin );
|
||||
|
||||
if ( !isdefined( best ) )
|
||||
{
|
||||
best = zone;
|
||||
distsq = d;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( d < distsq )
|
||||
{
|
||||
best = zone;
|
||||
distsq = d;
|
||||
}
|
||||
}
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
sd_get_planted_zone() //checked changed to match cerberus output
|
||||
sd_get_planted_zone()
|
||||
{
|
||||
if ( level.bombplanted )
|
||||
{
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( zone.interactteam == "none" )
|
||||
{
|
||||
return zone;
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
if ( level.bombplanted )
|
||||
{
|
||||
foreach ( zone in level.bombzones )
|
||||
{
|
||||
if ( zone.interactteam == "none" )
|
||||
return zone;
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
bot_sd_grenade() //checked changed to match cerberus output
|
||||
bot_sd_grenade()
|
||||
{
|
||||
enemies = bot_get_enemies();
|
||||
if ( !enemies.size )
|
||||
{
|
||||
return;
|
||||
}
|
||||
zone = sd_get_closest_bomb();
|
||||
foreach ( enemy in enemies )
|
||||
{
|
||||
if ( distancesquared( enemy.origin, zone.nearest_node.origin ) < 147456 )
|
||||
{
|
||||
if ( !self maps/mp/bots/_bot_combat::bot_combat_throw_lethal( enemy.origin ) )
|
||||
{
|
||||
self maps/mp/bots/_bot_combat::bot_combat_throw_tactical( enemy.origin );
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
enemies = bot_get_enemies();
|
||||
|
||||
if ( !enemies.size )
|
||||
return;
|
||||
|
||||
zone = sd_get_closest_bomb();
|
||||
|
||||
foreach ( enemy in enemies )
|
||||
{
|
||||
if ( distancesquared( enemy.origin, zone.nearest_node.origin ) < 147456 )
|
||||
{
|
||||
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( enemy.origin ) )
|
||||
self maps\mp\bots\_bot_combat::bot_combat_throw_tactical( enemy.origin );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,213 +1,204 @@
|
||||
#include maps/mp/gametypes/_hostmigration;
|
||||
#include maps/mp/gametypes/_globallogic_vehicle;
|
||||
#include maps/mp/gametypes/_globallogic_actor;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/gametypes/_globallogic;
|
||||
#include maps/mp/_audio;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
codecallback_startgametype() //checked matches cerberus output
|
||||
codecallback_startgametype()
|
||||
{
|
||||
if ( !isDefined( level.gametypestarted ) || !level.gametypestarted )
|
||||
{
|
||||
[[ level.callbackstartgametype ]]();
|
||||
level.gametypestarted = 1;
|
||||
}
|
||||
if ( !isdefined( level.gametypestarted ) || !level.gametypestarted )
|
||||
{
|
||||
[[ level.callbackstartgametype ]]();
|
||||
level.gametypestarted = 1;
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_finalizeinitialization() //checked matches cerberus output
|
||||
codecallback_finalizeinitialization()
|
||||
{
|
||||
maps/mp/_utility::callback( "on_finalize_initialization" );
|
||||
maps\mp\_utility::callback( "on_finalize_initialization" );
|
||||
}
|
||||
|
||||
codecallback_playerconnect() //checked matches cerberus output
|
||||
codecallback_playerconnect()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
self thread maps/mp/_audio::monitor_player_sprint();
|
||||
[[ level.callbackplayerconnect ]]();
|
||||
self endon( "disconnect" );
|
||||
self thread maps\mp\_audio::monitor_player_sprint();
|
||||
[[ level.callbackplayerconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_playerdisconnect() //checked matches cerberus output
|
||||
codecallback_playerdisconnect()
|
||||
{
|
||||
self notify( "disconnect" );
|
||||
level notify( "disconnect" );
|
||||
client_num = self getentitynumber();
|
||||
[[ level.callbackplayerdisconnect ]]();
|
||||
self notify( "disconnect" );
|
||||
level notify( "disconnect", self );
|
||||
client_num = self getentitynumber();
|
||||
[[ level.callbackplayerdisconnect ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigration() //checked matches cerberus output
|
||||
codecallback_hostmigration()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_HostMigration****" );
|
||||
println( "****CodeCallback_HostMigration****" );
|
||||
#/
|
||||
*/
|
||||
[[ level.callbackhostmigration ]]();
|
||||
[[ level.callbackhostmigration ]]();
|
||||
}
|
||||
|
||||
codecallback_hostmigrationsave() //checked matches cerberus output
|
||||
codecallback_hostmigrationsave()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_HostMigrationSave****" );
|
||||
println( "****CodeCallback_HostMigrationSave****" );
|
||||
#/
|
||||
*/
|
||||
[[ level.callbackhostmigrationsave ]]();
|
||||
[[ level.callbackhostmigrationsave ]]();
|
||||
}
|
||||
|
||||
codecallback_playermigrated() //checked matches cerberus output
|
||||
codecallback_playermigrated()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "****CodeCallback_PlayerMigrated****" );
|
||||
println( "****CodeCallback_PlayerMigrated****" );
|
||||
#/
|
||||
*/
|
||||
[[ level.callbackplayermigrated ]]();
|
||||
[[ level.callbackplayermigrated ]]();
|
||||
}
|
||||
|
||||
codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //checked matches cerberus output
|
||||
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 );
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
}
|
||||
|
||||
codecallback_playerkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) //checked matches cerberus output
|
||||
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 );
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) //checked matches cerberus output
|
||||
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 );
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration );
|
||||
}
|
||||
|
||||
codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) //checked matches cerberus output
|
||||
codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
[[ level.callbackplayermelee ]]( 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 ) //checked matches cerberus output
|
||||
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 );
|
||||
[[ level.callbackactordamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex );
|
||||
}
|
||||
|
||||
codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset ) //checked matches cerberus output
|
||||
codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset )
|
||||
{
|
||||
[[ level.callbackactorkilled ]]( 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 ) //checked matches cerberus output
|
||||
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 );
|
||||
[[ level.callbackvehicledamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname );
|
||||
}
|
||||
|
||||
codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset ) //checked matches cerberus output
|
||||
codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset )
|
||||
{
|
||||
[[ level.callbackvehicleradiusdamage ]]( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset );
|
||||
[[ level.callbackvehicleradiusdamage ]]( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset );
|
||||
}
|
||||
|
||||
codecallback_faceeventnotify( notify_msg, ent ) //checked matches cerberus output
|
||||
codecallback_faceeventnotify( notify_msg, ent )
|
||||
{
|
||||
if ( isDefined( ent ) && is_true( 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 ] );
|
||||
}
|
||||
}
|
||||
if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims )
|
||||
{
|
||||
if ( isdefined( level.face_event_handler ) && isdefined( level.face_event_handler.events[notify_msg] ) )
|
||||
ent sendfaceevent( level.face_event_handler.events[notify_msg] );
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_menuresponse( action, arg ) //checked matches cerberus output
|
||||
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" );
|
||||
if ( !isdefined( level.menuresponsequeue ) )
|
||||
{
|
||||
level.menuresponsequeue = [];
|
||||
level thread menuresponsequeuepump();
|
||||
}
|
||||
|
||||
index = level.menuresponsequeue.size;
|
||||
level.menuresponsequeue[index] = spawnstruct();
|
||||
level.menuresponsequeue[index].action = action;
|
||||
level.menuresponsequeue[index].arg = arg;
|
||||
level.menuresponsequeue[index].ent = self;
|
||||
level notify( "menuresponse_queue" );
|
||||
}
|
||||
|
||||
menuresponsequeuepump() //checked changed to match cerberus output
|
||||
menuresponsequeuepump()
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "menuresponse_queue" );
|
||||
level.menuresponsequeue[ 0 ].ent notify( "menuresponse", level.menuresponsequeue[0].action, level.menuresponsequeue[0].arg );
|
||||
arrayremoveindex( level.menuresponsequeue, 0, 0 );
|
||||
wait 0.05;
|
||||
}
|
||||
while ( true )
|
||||
{
|
||||
level waittill( "menuresponse_queue" );
|
||||
|
||||
level.menuresponsequeue[0].ent notify( "menuresponse", level.menuresponsequeue[0].action, level.menuresponsequeue[0].arg );
|
||||
arrayremoveindex( level.menuresponsequeue, 0, 0 );
|
||||
wait 0.05;
|
||||
|
||||
if ( !( level.menuresponsequeue.size > 0 ) )
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setupcallbacks() //checked matches cerberus output
|
||||
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.idflags_radius = 1;
|
||||
level.idflags_no_armor = 2;
|
||||
level.idflags_no_knockback = 4;
|
||||
level.idflags_penetration = 8;
|
||||
level.idflags_destructible_entity = 16;
|
||||
level.idflags_shield_explosive_impact = 32;
|
||||
level.idflags_shield_explosive_impact_huge = 64;
|
||||
level.idflags_shield_explosive_splash = 128;
|
||||
level.idflags_no_team_protection = 256;
|
||||
level.idflags_no_protection = 512;
|
||||
level.idflags_passthru = 1024;
|
||||
}
|
||||
|
||||
setdefaultcallbacks() //checked matches cerberus output
|
||||
setdefaultcallbacks()
|
||||
{
|
||||
level.callbackstartgametype = maps/mp/gametypes/_globallogic::callback_startgametype;
|
||||
level.callbackplayerconnect = maps/mp/gametypes/_globallogic_player::callback_playerconnect;
|
||||
level.callbackplayerdisconnect = maps/mp/gametypes/_globallogic_player::callback_playerdisconnect;
|
||||
level.callbackplayerdamage = maps/mp/gametypes/_globallogic_player::callback_playerdamage;
|
||||
level.callbackplayerkilled = maps/mp/gametypes/_globallogic_player::callback_playerkilled;
|
||||
level.callbackplayermelee = maps/mp/gametypes/_globallogic_player::callback_playermelee;
|
||||
level.callbackplayerlaststand = maps/mp/gametypes/_globallogic_player::callback_playerlaststand;
|
||||
level.callbackactordamage = maps/mp/gametypes/_globallogic_actor::callback_actordamage;
|
||||
level.callbackactorkilled = maps/mp/gametypes/_globallogic_actor::callback_actorkilled;
|
||||
level.callbackvehicledamage = maps/mp/gametypes/_globallogic_vehicle::callback_vehicledamage;
|
||||
level.callbackvehicleradiusdamage = maps/mp/gametypes/_globallogic_vehicle::callback_vehicleradiusdamage;
|
||||
level.callbackplayermigrated = maps/mp/gametypes/_globallogic_player::callback_playermigrated;
|
||||
level.callbackhostmigration = maps/mp/gametypes/_hostmigration::callback_hostmigration;
|
||||
level.callbackhostmigrationsave = maps/mp/gametypes/_hostmigration::callback_hostmigrationsave;
|
||||
level.callbackstartgametype = maps\mp\gametypes\_globallogic::callback_startgametype;
|
||||
level.callbackplayerconnect = maps\mp\gametypes\_globallogic_player::callback_playerconnect;
|
||||
level.callbackplayerdisconnect = maps\mp\gametypes\_globallogic_player::callback_playerdisconnect;
|
||||
level.callbackplayerdamage = maps\mp\gametypes\_globallogic_player::callback_playerdamage;
|
||||
level.callbackplayerkilled = maps\mp\gametypes\_globallogic_player::callback_playerkilled;
|
||||
level.callbackplayermelee = maps\mp\gametypes\_globallogic_player::callback_playermelee;
|
||||
level.callbackplayerlaststand = maps\mp\gametypes\_globallogic_player::callback_playerlaststand;
|
||||
level.callbackactordamage = maps\mp\gametypes\_globallogic_actor::callback_actordamage;
|
||||
level.callbackactorkilled = maps\mp\gametypes\_globallogic_actor::callback_actorkilled;
|
||||
level.callbackvehicledamage = maps\mp\gametypes\_globallogic_vehicle::callback_vehicledamage;
|
||||
level.callbackvehicleradiusdamage = maps\mp\gametypes\_globallogic_vehicle::callback_vehicleradiusdamage;
|
||||
level.callbackplayermigrated = maps\mp\gametypes\_globallogic_player::callback_playermigrated;
|
||||
level.callbackhostmigration = maps\mp\gametypes\_hostmigration::callback_hostmigration;
|
||||
level.callbackhostmigrationsave = maps\mp\gametypes\_hostmigration::callback_hostmigrationsave;
|
||||
}
|
||||
|
||||
abortlevel() //checked matches cerberus output
|
||||
abortlevel()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
println( "ERROR: Aborting level - gametype is not supported" );
|
||||
println( "ERROR: Aborting level - gametype is not supported" );
|
||||
#/
|
||||
*/
|
||||
level.callbackstartgametype = ::callbackvoid;
|
||||
level.callbackplayerconnect = ::callbackvoid;
|
||||
level.callbackplayerdisconnect = ::callbackvoid;
|
||||
level.callbackplayerdamage = ::callbackvoid;
|
||||
level.callbackplayerkilled = ::callbackvoid;
|
||||
level.callbackplayerlaststand = ::callbackvoid;
|
||||
level.callbackplayermelee = ::callbackvoid;
|
||||
level.callbackactordamage = ::callbackvoid;
|
||||
level.callbackactorkilled = ::callbackvoid;
|
||||
level.callbackvehicledamage = ::callbackvoid;
|
||||
setdvar( "g_gametype", "dm" );
|
||||
exitlevel( 0 );
|
||||
level.callbackstartgametype = ::callbackvoid;
|
||||
level.callbackplayerconnect = ::callbackvoid;
|
||||
level.callbackplayerdisconnect = ::callbackvoid;
|
||||
level.callbackplayerdamage = ::callbackvoid;
|
||||
level.callbackplayerkilled = ::callbackvoid;
|
||||
level.callbackplayerlaststand = ::callbackvoid;
|
||||
level.callbackplayermelee = ::callbackvoid;
|
||||
level.callbackactordamage = ::callbackvoid;
|
||||
level.callbackactorkilled = ::callbackvoid;
|
||||
level.callbackvehicledamage = ::callbackvoid;
|
||||
setdvar( "g_gametype", "dm" );
|
||||
exitlevel( 0 );
|
||||
}
|
||||
|
||||
codecallback_glasssmash( pos, dir ) //checked matches cerberus output
|
||||
codecallback_glasssmash( pos, dir )
|
||||
{
|
||||
level notify( "glass_smash" );
|
||||
level notify( "glass_smash", pos, dir );
|
||||
}
|
||||
|
||||
callbackvoid() //checked matches cerberus output
|
||||
callbackvoid()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,19 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.clientid = 0;
|
||||
level thread onplayerconnect();
|
||||
level.clientid = 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player.clientid = level.clientid;
|
||||
level.clientid++;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player.clientid = level.clientid;
|
||||
level.clientid++;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,160 +1,166 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
precacheshader( "damage_feedback" );
|
||||
precacheshader( "damage_feedback_flak" );
|
||||
precacheshader( "damage_feedback_tac" );
|
||||
level thread onplayerconnect();
|
||||
precacheshader( "damage_feedback" );
|
||||
precacheshader( "damage_feedback_flak" );
|
||||
precacheshader( "damage_feedback_tac" );
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
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;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player.hud_damagefeedback = newdamageindicatorhudelem( player );
|
||||
player.hud_damagefeedback.horzalign = "center";
|
||||
player.hud_damagefeedback.vertalign = "middle";
|
||||
player.hud_damagefeedback.x = -12;
|
||||
player.hud_damagefeedback.y = -12;
|
||||
player.hud_damagefeedback.alpha = 0;
|
||||
player.hud_damagefeedback.archived = 1;
|
||||
player.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
player.hitsoundtracker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
updatedamagefeedback( mod, inflictor, perkfeedback ) //checked matches cerberus output
|
||||
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 playlocalsound( "mpl_hit_alert" );
|
||||
break;
|
||||
case "heli":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_air" );
|
||||
break;
|
||||
case "hpm":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_hpm" );
|
||||
break;
|
||||
case "taser_spike":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_taser_spike" );
|
||||
break;
|
||||
case "dog":
|
||||
case "straferun":
|
||||
case "default_loud":
|
||||
self thread playhitsound( mod, "mpl_hit_heli_gunner" );
|
||||
break;
|
||||
default:
|
||||
self thread playhitsound( mod, "mpl_hit_alert_low" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self playlocalsound( "mpl_hit_alert_low" );
|
||||
}
|
||||
}
|
||||
if ( isDefined( perkfeedback ) )
|
||||
{
|
||||
switch( perkfeedback )
|
||||
{
|
||||
case "flakjacket":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 );
|
||||
break;
|
||||
case "tacticalMask":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else self.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
self.hud_damagefeedback.alpha = 1;
|
||||
self.hud_damagefeedback fadeovertime( 1 );
|
||||
self.hud_damagefeedback.alpha = 0;
|
||||
}
|
||||
if ( !isplayer( self ) || sessionmodeiszombiesgame() )
|
||||
return;
|
||||
|
||||
if ( isdefined( mod ) && mod != "MOD_CRUSH" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_HIT_BY_OBJECT" )
|
||||
{
|
||||
if ( isdefined( inflictor ) && isdefined( inflictor.soundmod ) )
|
||||
{
|
||||
switch ( inflictor.soundmod )
|
||||
{
|
||||
case "player":
|
||||
self playlocalsound( "mpl_hit_alert" );
|
||||
break;
|
||||
case "heli":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_air" );
|
||||
break;
|
||||
case "hpm":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_hpm" );
|
||||
break;
|
||||
case "taser_spike":
|
||||
self thread playhitsound( mod, "mpl_hit_alert_taser_spike" );
|
||||
break;
|
||||
case "straferun":
|
||||
case "dog":
|
||||
break;
|
||||
case "default_loud":
|
||||
self thread playhitsound( mod, "mpl_hit_heli_gunner" );
|
||||
break;
|
||||
default:
|
||||
self thread playhitsound( mod, "mpl_hit_alert_low" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
self playlocalsound( "mpl_hit_alert_low" );
|
||||
}
|
||||
|
||||
if ( isdefined( perkfeedback ) )
|
||||
{
|
||||
switch ( perkfeedback )
|
||||
{
|
||||
case "flakjacket":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 );
|
||||
break;
|
||||
case "tacticalMask":
|
||||
self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
self.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
|
||||
|
||||
self.hud_damagefeedback.alpha = 1;
|
||||
self.hud_damagefeedback fadeovertime( 1 );
|
||||
self.hud_damagefeedback.alpha = 0;
|
||||
}
|
||||
|
||||
playhitsound( mod, alert ) //checked matches cerberus output
|
||||
playhitsound( mod, alert )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
if ( self.hitsoundtracker )
|
||||
{
|
||||
self.hitsoundtracker = 0;
|
||||
self playlocalsound( alert );
|
||||
wait 0.05;
|
||||
self.hitsoundtracker = 1;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
if ( self.hitsoundtracker )
|
||||
{
|
||||
self.hitsoundtracker = 0;
|
||||
self playlocalsound( alert );
|
||||
wait 0.05;
|
||||
self.hitsoundtracker = 1;
|
||||
}
|
||||
}
|
||||
|
||||
updatespecialdamagefeedback( hitent ) //checked matches cerberus output
|
||||
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;
|
||||
}
|
||||
if ( !isplayer( self ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( hitent ) )
|
||||
return;
|
||||
|
||||
if ( !isplayer( hitent ) )
|
||||
return;
|
||||
|
||||
wait 0.05;
|
||||
|
||||
if ( !isdefined( self.directionalhitarray ) )
|
||||
{
|
||||
self.directionalhitarray = [];
|
||||
hitentnum = hitent getentitynumber();
|
||||
self.directionalhitarray[hitentnum] = 1;
|
||||
self thread sendhitspecialeventatframeend( hitent );
|
||||
}
|
||||
else
|
||||
{
|
||||
hitentnum = hitent getentitynumber();
|
||||
self.directionalhitarray[hitentnum] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
sendhitspecialeventatframeend( hitent ) //checked changed to match cerberus output
|
||||
sendhitspecialeventatframeend( hitent )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
enemyshit = 0;
|
||||
value = 1;
|
||||
entbitarray0 = 0;
|
||||
for ( i = 0; i < 32; i++ )
|
||||
{
|
||||
if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 )
|
||||
{
|
||||
entbitarray0 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
value *= 2;
|
||||
}
|
||||
entbitarray1 = 0;
|
||||
for ( i = 33; i < 64; i++ )
|
||||
{
|
||||
if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 )
|
||||
{
|
||||
entbitarray1 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
value *= 2;
|
||||
}
|
||||
if ( enemyshit )
|
||||
{
|
||||
self directionalhitindicator( entbitarray0, entbitarray1 );
|
||||
}
|
||||
self.directionalhitarray = undefined;
|
||||
entbitarray0 = 0;
|
||||
entbitarray1 = 0;
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
waittillframeend;
|
||||
enemyshit = 0;
|
||||
value = 1;
|
||||
entbitarray0 = 0;
|
||||
|
||||
for ( i = 0; i < 32; i++ )
|
||||
{
|
||||
if ( isdefined( self.directionalhitarray[i] ) && self.directionalhitarray[i] != 0 )
|
||||
{
|
||||
entbitarray0 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
|
||||
value *= 2;
|
||||
}
|
||||
|
||||
entbitarray1 = 0;
|
||||
|
||||
for ( i = 33; i < 64; i++ )
|
||||
{
|
||||
if ( isdefined( self.directionalhitarray[i] ) && self.directionalhitarray[i] != 0 )
|
||||
{
|
||||
entbitarray1 += value;
|
||||
enemyshit++;
|
||||
}
|
||||
|
||||
value *= 2;
|
||||
}
|
||||
|
||||
if ( enemyshit )
|
||||
self directionalhitindicator( entbitarray0, entbitarray1 );
|
||||
|
||||
self.directionalhitarray = undefined;
|
||||
entbitarray0 = 0;
|
||||
entbitarray1 = 0;
|
||||
}
|
||||
|
@ -1,102 +1,94 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_deathicons;
|
||||
#include maps/mp/gametypes/_globallogic_utils;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
if ( !isDefined( level.ragdoll_override ) )
|
||||
{
|
||||
level.ragdoll_override = ::ragdoll_override;
|
||||
}
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return;
|
||||
}
|
||||
precacheshader( "headicon_dead" );
|
||||
level thread onplayerconnect();
|
||||
if ( !isdefined( level.ragdoll_override ) )
|
||||
level.ragdoll_override = ::ragdoll_override;
|
||||
|
||||
if ( !level.teambased )
|
||||
return;
|
||||
|
||||
precacheshader( "headicon_dead" );
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player.selfdeathicons = [];
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player.selfdeathicons = [];
|
||||
}
|
||||
}
|
||||
|
||||
updatedeathiconsenabled() //checked matches cerberus output
|
||||
updatedeathiconsenabled()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
adddeathicon( entity, dyingplayer, team, timeout ) //checked matches cerberus output
|
||||
adddeathicon( entity, dyingplayer, team, timeout )
|
||||
{
|
||||
if ( !level.teambased )
|
||||
{
|
||||
return;
|
||||
}
|
||||
iconorg = entity.origin;
|
||||
dyingplayer endon( "spawned_player" );
|
||||
dyingplayer endon( "disconnect" );
|
||||
wait 0.05;
|
||||
maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed();
|
||||
/*
|
||||
if ( !level.teambased )
|
||||
return;
|
||||
|
||||
iconorg = entity.origin;
|
||||
dyingplayer endon( "spawned_player" );
|
||||
dyingplayer endon( "disconnect" );
|
||||
wait 0.05;
|
||||
maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed();
|
||||
/#
|
||||
assert( isDefined( level.teams[ team ] ) );
|
||||
assert( isdefined( level.teams[team] ) );
|
||||
#/
|
||||
*/
|
||||
if ( getDvar( "ui_hud_showdeathicons" ) == "0" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( level.hardcoremode )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.lastdeathicon ) )
|
||||
{
|
||||
self.lastdeathicon destroy();
|
||||
}
|
||||
newdeathicon = newteamhudelem( team );
|
||||
newdeathicon.x = iconorg[ 0 ];
|
||||
newdeathicon.y = iconorg[ 1 ];
|
||||
newdeathicon.z = iconorg[ 2 ] + 54;
|
||||
newdeathicon.alpha = 0.61;
|
||||
newdeathicon.archived = 1;
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
newdeathicon setshader( "headicon_dead", 14, 14 );
|
||||
}
|
||||
else
|
||||
{
|
||||
newdeathicon setshader( "headicon_dead", 7, 7 );
|
||||
}
|
||||
newdeathicon setwaypoint( 1 );
|
||||
self.lastdeathicon = newdeathicon;
|
||||
newdeathicon thread destroyslowly( timeout );
|
||||
|
||||
if ( getdvar( _hash_F83E8105 ) == "0" )
|
||||
return;
|
||||
|
||||
if ( level.hardcoremode )
|
||||
return;
|
||||
|
||||
if ( isdefined( self.lastdeathicon ) )
|
||||
self.lastdeathicon destroy();
|
||||
|
||||
newdeathicon = newteamhudelem( team );
|
||||
newdeathicon.x = iconorg[0];
|
||||
newdeathicon.y = iconorg[1];
|
||||
newdeathicon.z = iconorg[2] + 54;
|
||||
newdeathicon.alpha = 0.61;
|
||||
newdeathicon.archived = 1;
|
||||
|
||||
if ( level.splitscreen )
|
||||
newdeathicon setshader( "headicon_dead", 14, 14 );
|
||||
else
|
||||
newdeathicon setshader( "headicon_dead", 7, 7 );
|
||||
|
||||
newdeathicon setwaypoint( 1 );
|
||||
self.lastdeathicon = newdeathicon;
|
||||
newdeathicon thread destroyslowly( timeout );
|
||||
}
|
||||
|
||||
destroyslowly( timeout ) //checked matches cerberus output
|
||||
destroyslowly( timeout )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait timeout;
|
||||
self fadeovertime( 1 );
|
||||
self.alpha = 0;
|
||||
wait 1;
|
||||
self destroy();
|
||||
self endon( "death" );
|
||||
wait( timeout );
|
||||
self fadeovertime( 1.0 );
|
||||
self.alpha = 0;
|
||||
wait 1.0;
|
||||
self destroy();
|
||||
}
|
||||
|
||||
ragdoll_override( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body ) //checked matches cerberus output
|
||||
ragdoll_override( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body )
|
||||
{
|
||||
if ( smeansofdeath == "MOD_FALLING" && self isonground() == 1 )
|
||||
{
|
||||
body startragdoll();
|
||||
if ( !isDefined( self.switching_teams ) )
|
||||
{
|
||||
thread maps/mp/gametypes/_deathicons::adddeathicon( body, self, self.team, 5 );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if ( smeansofdeath == "MOD_FALLING" && self isonground() == 1 )
|
||||
{
|
||||
body startragdoll();
|
||||
|
||||
if ( !isdefined( self.switching_teams ) )
|
||||
thread maps\mp\gametypes\_deathicons::adddeathicon( body, self, self.team, 5.0 );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,580 +1,531 @@
|
||||
#include maps/mp/gametypes/_dev;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
dev_cac_init()
|
||||
{
|
||||
/#
|
||||
dev_cac_overlay = 0;
|
||||
dev_cac_camera_on = 0;
|
||||
level thread dev_cac_gdt_update_think();
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0,5;
|
||||
reset = 1;
|
||||
if ( getDvar( #"E6D8B517" ) != "" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
host = gethostplayer();
|
||||
if ( !isDefined( level.dev_cac_player ) )
|
||||
{
|
||||
level.dev_cac_player = host;
|
||||
}
|
||||
switch( getDvar( "devgui_dev_cac" ) )
|
||||
{
|
||||
case "":
|
||||
reset = 0;
|
||||
break;
|
||||
case "dpad_body":
|
||||
host thread dev_cac_dpad_think( "body", ::dev_cac_cycle_body, "" );
|
||||
break;
|
||||
case "dpad_head":
|
||||
host thread dev_cac_dpad_think( "head", ::dev_cac_cycle_head, "" );
|
||||
break;
|
||||
case "dpad_character":
|
||||
host thread dev_cac_dpad_think( "character", ::dev_cac_cycle_character, "" );
|
||||
break;
|
||||
case "next_player":
|
||||
dev_cac_cycle_player( 1 );
|
||||
break;
|
||||
case "prev_player":
|
||||
dev_cac_cycle_player( 0 );
|
||||
break;
|
||||
case "cac_overlay":
|
||||
level notify( "dev_cac_overlay_think" );
|
||||
if ( !dev_cac_overlay )
|
||||
{
|
||||
level thread dev_cac_overlay_think();
|
||||
}
|
||||
dev_cac_overlay = !dev_cac_overlay;
|
||||
break;
|
||||
case "best_bullet_armor":
|
||||
dev_cac_set_model_range( ::sort_greatest, "armor_bullet" );
|
||||
break;
|
||||
case "worst_bullet_armor":
|
||||
dev_cac_set_model_range( ::sort_least, "armor_bullet" );
|
||||
break;
|
||||
case "best_explosive_armor":
|
||||
dev_cac_set_model_range( ::sort_greatest, "armor_explosive" );
|
||||
break;
|
||||
case "worst_explosive_armor":
|
||||
dev_cac_set_model_range( ::sort_least, "armor_explosive" );
|
||||
break;
|
||||
case "best_mobility":
|
||||
dev_cac_set_model_range( ::sort_greatest, "mobility" );
|
||||
break;
|
||||
case "worst_mobility":
|
||||
dev_cac_set_model_range( ::sort_least, "mobility" );
|
||||
break;
|
||||
case "camera":
|
||||
dev_cac_camera_on = !dev_cac_camera_on;
|
||||
dev_cac_camera( dev_cac_camera_on );
|
||||
break;
|
||||
case "dpad_camo":
|
||||
host thread dev_cac_dpad_think( "camo", ::dev_cac_cycle_render_options, "camo" );
|
||||
break;
|
||||
case "dpad_meleecamo":
|
||||
host thread dev_cac_dpad_think( "meleecamo", ::dev_cac_cycle_render_options, "meleecamo" );
|
||||
break;
|
||||
case "dpad_lens":
|
||||
host thread dev_cac_dpad_think( "lens", ::dev_cac_cycle_render_options, "lens" );
|
||||
break;
|
||||
case "dpad_reticle":
|
||||
host thread dev_cac_dpad_think( "reticle", ::dev_cac_cycle_render_options, "reticle" );
|
||||
break;
|
||||
case "dpad_reticle_color":
|
||||
host thread dev_cac_dpad_think( "reticle color", ::dev_cac_cycle_render_options, "reticle_color" );
|
||||
break;
|
||||
case "dpad_emblem":
|
||||
host thread dev_cac_dpad_think( "emblem", ::dev_cac_cycle_render_options, "emblem" );
|
||||
break;
|
||||
case "dpad_tag":
|
||||
host thread dev_cac_dpad_think( "tag", ::dev_cac_cycle_render_options, "tag" );
|
||||
break;
|
||||
case "dpad_facepaint_pattern":
|
||||
host thread dev_cac_dpad_think( "facepaint pattern", ::dev_cac_cycle_render_options, "facepaint_pattern" );
|
||||
break;
|
||||
case "dpad_facepaint_color":
|
||||
host thread dev_cac_dpad_think( "facepaint color", ::dev_cac_cycle_render_options, "facepaint_color" );
|
||||
break;
|
||||
case "dpad_reset":
|
||||
host notify( "dev_cac_dpad_think" );
|
||||
break;
|
||||
}
|
||||
if ( reset )
|
||||
{
|
||||
setdvar( "devgui_dev_cac", "" );
|
||||
}
|
||||
}
|
||||
dev_cac_overlay = 0;
|
||||
dev_cac_camera_on = 0;
|
||||
level thread dev_cac_gdt_update_think();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.5;
|
||||
reset = 1;
|
||||
|
||||
if ( getdvar( _hash_E6D8B517 ) != "" )
|
||||
continue;
|
||||
|
||||
host = gethostplayer();
|
||||
|
||||
if ( !isdefined( level.dev_cac_player ) )
|
||||
level.dev_cac_player = host;
|
||||
|
||||
switch ( getdvar( "devgui_dev_cac" ) )
|
||||
{
|
||||
case "":
|
||||
reset = 0;
|
||||
break;
|
||||
case "dpad_body":
|
||||
host thread dev_cac_dpad_think( "body", ::dev_cac_cycle_body, "" );
|
||||
break;
|
||||
case "dpad_head":
|
||||
host thread dev_cac_dpad_think( "head", ::dev_cac_cycle_head, "" );
|
||||
break;
|
||||
case "dpad_character":
|
||||
host thread dev_cac_dpad_think( "character", ::dev_cac_cycle_character, "" );
|
||||
break;
|
||||
case "next_player":
|
||||
dev_cac_cycle_player( 1 );
|
||||
break;
|
||||
case "prev_player":
|
||||
dev_cac_cycle_player( 0 );
|
||||
break;
|
||||
case "cac_overlay":
|
||||
level notify( "dev_cac_overlay_think" );
|
||||
|
||||
if ( !dev_cac_overlay )
|
||||
level thread dev_cac_overlay_think();
|
||||
|
||||
dev_cac_overlay = !dev_cac_overlay;
|
||||
break;
|
||||
case "best_bullet_armor":
|
||||
dev_cac_set_model_range( ::sort_greatest, "armor_bullet" );
|
||||
break;
|
||||
case "worst_bullet_armor":
|
||||
dev_cac_set_model_range( ::sort_least, "armor_bullet" );
|
||||
break;
|
||||
case "best_explosive_armor":
|
||||
dev_cac_set_model_range( ::sort_greatest, "armor_explosive" );
|
||||
break;
|
||||
case "worst_explosive_armor":
|
||||
dev_cac_set_model_range( ::sort_least, "armor_explosive" );
|
||||
break;
|
||||
case "best_mobility":
|
||||
dev_cac_set_model_range( ::sort_greatest, "mobility" );
|
||||
break;
|
||||
case "worst_mobility":
|
||||
dev_cac_set_model_range( ::sort_least, "mobility" );
|
||||
break;
|
||||
case "camera":
|
||||
dev_cac_camera_on = !dev_cac_camera_on;
|
||||
dev_cac_camera( dev_cac_camera_on );
|
||||
break;
|
||||
case "dpad_camo":
|
||||
host thread dev_cac_dpad_think( "camo", ::dev_cac_cycle_render_options, "camo" );
|
||||
break;
|
||||
case "dpad_meleecamo":
|
||||
host thread dev_cac_dpad_think( "meleecamo", ::dev_cac_cycle_render_options, "meleecamo" );
|
||||
break;
|
||||
case "dpad_lens":
|
||||
host thread dev_cac_dpad_think( "lens", ::dev_cac_cycle_render_options, "lens" );
|
||||
break;
|
||||
case "dpad_reticle":
|
||||
host thread dev_cac_dpad_think( "reticle", ::dev_cac_cycle_render_options, "reticle" );
|
||||
break;
|
||||
case "dpad_reticle_color":
|
||||
host thread dev_cac_dpad_think( "reticle color", ::dev_cac_cycle_render_options, "reticle_color" );
|
||||
break;
|
||||
case "dpad_emblem":
|
||||
host thread dev_cac_dpad_think( "emblem", ::dev_cac_cycle_render_options, "emblem" );
|
||||
break;
|
||||
case "dpad_tag":
|
||||
host thread dev_cac_dpad_think( "tag", ::dev_cac_cycle_render_options, "tag" );
|
||||
break;
|
||||
case "dpad_facepaint_pattern":
|
||||
host thread dev_cac_dpad_think( "facepaint pattern", ::dev_cac_cycle_render_options, "facepaint_pattern" );
|
||||
break;
|
||||
case "dpad_facepaint_color":
|
||||
host thread dev_cac_dpad_think( "facepaint color", ::dev_cac_cycle_render_options, "facepaint_color" );
|
||||
break;
|
||||
case "dpad_reset":
|
||||
host notify( "dev_cac_dpad_think" );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( reset )
|
||||
setdvar( "devgui_dev_cac", "" );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
dev_cac_camera( on )
|
||||
{
|
||||
/#
|
||||
if ( on )
|
||||
{
|
||||
self setclientthirdperson( 1 );
|
||||
setdvar( "cg_thirdPersonAngle", "185" );
|
||||
setdvar( "cg_thirdPersonRange", "138" );
|
||||
setdvar( "cg_fov", "20" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setclientthirdperson( 0 );
|
||||
setdvar( "cg_fov", getDvar( "cg_fov_default" ) );
|
||||
if ( on )
|
||||
{
|
||||
self setclientthirdperson( 1 );
|
||||
setdvar( "cg_thirdPersonAngle", "185" );
|
||||
setdvar( "cg_thirdPersonRange", "138" );
|
||||
setdvar( "cg_fov", "20" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setclientthirdperson( 0 );
|
||||
setdvar( "cg_fov", getdvar( "cg_fov_default" ) );
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
dev_cac_dpad_think( part_name, cycle_function, tag )
|
||||
{
|
||||
/#
|
||||
self notify( "dev_cac_dpad_think" );
|
||||
self endon( "dev_cac_dpad_think" );
|
||||
self endon( "disconnect" );
|
||||
iprintln( "Previous " + part_name + " bound to D-Pad Left" );
|
||||
iprintln( "Next " + part_name + " bound to D-Pad Right" );
|
||||
dpad_left = 0;
|
||||
dpad_right = 0;
|
||||
level.dev_cac_player thread highlight_player();
|
||||
for ( ;; )
|
||||
{
|
||||
self setactionslot( 3, "" );
|
||||
self setactionslot( 4, "" );
|
||||
if ( !dpad_left && self buttonpressed( "DPAD_LEFT" ) )
|
||||
{
|
||||
[[ cycle_function ]]( 0, tag );
|
||||
dpad_left = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !self buttonpressed( "DPAD_LEFT" ) )
|
||||
{
|
||||
dpad_left = 0;
|
||||
}
|
||||
}
|
||||
if ( !dpad_right && self buttonpressed( "DPAD_RIGHT" ) )
|
||||
{
|
||||
[[ cycle_function ]]( 1, tag );
|
||||
dpad_right = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !self buttonpressed( "DPAD_RIGHT" ) )
|
||||
{
|
||||
dpad_right = 0;
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
self notify( "dev_cac_dpad_think" );
|
||||
self endon( "dev_cac_dpad_think" );
|
||||
self endon( "disconnect" );
|
||||
iprintln( "Previous " + part_name + " bound to D-Pad Left" );
|
||||
iprintln( "Next " + part_name + " bound to D-Pad Right" );
|
||||
dpad_left = 0;
|
||||
dpad_right = 0;
|
||||
level.dev_cac_player thread highlight_player();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self setactionslot( 3, "" );
|
||||
self setactionslot( 4, "" );
|
||||
|
||||
if ( !dpad_left && self buttonpressed( "DPAD_LEFT" ) )
|
||||
{
|
||||
[[ cycle_function ]]( 0, tag );
|
||||
dpad_left = 1;
|
||||
}
|
||||
else if ( !self buttonpressed( "DPAD_LEFT" ) )
|
||||
dpad_left = 0;
|
||||
|
||||
if ( !dpad_right && self buttonpressed( "DPAD_RIGHT" ) )
|
||||
{
|
||||
[[ cycle_function ]]( 1, tag );
|
||||
dpad_right = 1;
|
||||
}
|
||||
else if ( !self buttonpressed( "DPAD_RIGHT" ) )
|
||||
dpad_right = 0;
|
||||
|
||||
wait 0.05;
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
next_in_list( value, list )
|
||||
{
|
||||
/#
|
||||
if ( !isDefined( value ) )
|
||||
{
|
||||
return list[ 0 ];
|
||||
}
|
||||
i = 0;
|
||||
while ( i < list.size )
|
||||
{
|
||||
if ( value == list[ i ] )
|
||||
{
|
||||
if ( isDefined( list[ i + 1 ] ) )
|
||||
{
|
||||
value = list[ i + 1 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
value = list[ 0 ];
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
if ( !isdefined( value ) )
|
||||
return list[0];
|
||||
|
||||
for ( i = 0; i < list.size; i++ )
|
||||
{
|
||||
if ( value == list[i] )
|
||||
{
|
||||
if ( isdefined( list[i + 1] ) )
|
||||
value = list[i + 1];
|
||||
else
|
||||
value = list[0];
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
#/
|
||||
}
|
||||
|
||||
prev_in_list( value, list )
|
||||
{
|
||||
/#
|
||||
if ( !isDefined( value ) )
|
||||
{
|
||||
return list[ 0 ];
|
||||
}
|
||||
i = 0;
|
||||
while ( i < list.size )
|
||||
{
|
||||
if ( value == list[ i ] )
|
||||
{
|
||||
if ( isDefined( list[ i - 1 ] ) )
|
||||
{
|
||||
value = list[ i - 1 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
value = list[ list.size - 1 ];
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
if ( !isdefined( value ) )
|
||||
return list[0];
|
||||
|
||||
for ( i = 0; i < list.size; i++ )
|
||||
{
|
||||
if ( value == list[i] )
|
||||
{
|
||||
if ( isdefined( list[i - 1] ) )
|
||||
value = list[i - 1];
|
||||
else
|
||||
value = list[list.size - 1];
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_set_player_model()
|
||||
{
|
||||
/#
|
||||
self.tag_stowed_back = undefined;
|
||||
self.tag_stowed_hip = undefined;
|
||||
self.tag_stowed_back = undefined;
|
||||
self.tag_stowed_hip = undefined;
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_cycle_body( forward, tag )
|
||||
{
|
||||
/#
|
||||
if ( !dev_cac_player_valid() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player = level.dev_cac_player;
|
||||
keys = getarraykeys( level.cac_functions[ "set_body_model" ] );
|
||||
if ( forward )
|
||||
{
|
||||
player.cac_body_type = next_in_list( player.cac_body_type, keys );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.cac_body_type = prev_in_list( player.cac_body_type, keys );
|
||||
}
|
||||
player dev_cac_set_player_model();
|
||||
if ( !dev_cac_player_valid() )
|
||||
return;
|
||||
|
||||
player = level.dev_cac_player;
|
||||
keys = getarraykeys( level.cac_functions["set_body_model"] );
|
||||
|
||||
if ( forward )
|
||||
player.cac_body_type = next_in_list( player.cac_body_type, keys );
|
||||
else
|
||||
player.cac_body_type = prev_in_list( player.cac_body_type, keys );
|
||||
|
||||
player dev_cac_set_player_model();
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_cycle_head( forward, tag )
|
||||
{
|
||||
/#
|
||||
if ( !dev_cac_player_valid() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player = level.dev_cac_player;
|
||||
keys = getarraykeys( level.cac_functions[ "set_head_model" ] );
|
||||
if ( forward )
|
||||
{
|
||||
player.cac_head_type = next_in_list( player.cac_head_type, keys );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.cac_head_type = prev_in_list( player.cac_head_type, keys );
|
||||
}
|
||||
player.cac_hat_type = "none";
|
||||
player dev_cac_set_player_model();
|
||||
if ( !dev_cac_player_valid() )
|
||||
return;
|
||||
|
||||
player = level.dev_cac_player;
|
||||
keys = getarraykeys( level.cac_functions["set_head_model"] );
|
||||
|
||||
if ( forward )
|
||||
player.cac_head_type = next_in_list( player.cac_head_type, keys );
|
||||
else
|
||||
player.cac_head_type = prev_in_list( player.cac_head_type, keys );
|
||||
|
||||
player.cac_hat_type = "none";
|
||||
player dev_cac_set_player_model();
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_cycle_character( forward, tag )
|
||||
{
|
||||
/#
|
||||
if ( !dev_cac_player_valid() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player = level.dev_cac_player;
|
||||
keys = getarraykeys( level.cac_functions[ "set_body_model" ] );
|
||||
if ( forward )
|
||||
{
|
||||
player.cac_body_type = next_in_list( player.cac_body_type, keys );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.cac_body_type = prev_in_list( player.cac_body_type, keys );
|
||||
}
|
||||
player.cac_hat_type = "none";
|
||||
player dev_cac_set_player_model();
|
||||
if ( !dev_cac_player_valid() )
|
||||
return;
|
||||
|
||||
player = level.dev_cac_player;
|
||||
keys = getarraykeys( level.cac_functions["set_body_model"] );
|
||||
|
||||
if ( forward )
|
||||
player.cac_body_type = next_in_list( player.cac_body_type, keys );
|
||||
else
|
||||
player.cac_body_type = prev_in_list( player.cac_body_type, keys );
|
||||
|
||||
player.cac_hat_type = "none";
|
||||
player dev_cac_set_player_model();
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_cycle_render_options( forward, tag )
|
||||
{
|
||||
/#
|
||||
if ( !dev_cac_player_valid() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.dev_cac_player nextplayerrenderoption( tag, forward );
|
||||
if ( !dev_cac_player_valid() )
|
||||
return;
|
||||
|
||||
level.dev_cac_player nextplayerrenderoption( tag, forward );
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_player_valid()
|
||||
{
|
||||
/#
|
||||
if ( isDefined( level.dev_cac_player ) )
|
||||
{
|
||||
return level.dev_cac_player.sessionstate == "playing";
|
||||
return isdefined( level.dev_cac_player ) && level.dev_cac_player.sessionstate == "playing";
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
dev_cac_cycle_player( forward )
|
||||
{
|
||||
/#
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( forward )
|
||||
{
|
||||
level.dev_cac_player = next_in_list( level.dev_cac_player, players );
|
||||
}
|
||||
else
|
||||
{
|
||||
level.dev_cac_player = prev_in_list( level.dev_cac_player, players );
|
||||
}
|
||||
if ( dev_cac_player_valid() )
|
||||
{
|
||||
level.dev_cac_player thread highlight_player();
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
level.dev_cac_player = undefined;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( forward )
|
||||
level.dev_cac_player = next_in_list( level.dev_cac_player, players );
|
||||
else
|
||||
level.dev_cac_player = prev_in_list( level.dev_cac_player, players );
|
||||
|
||||
if ( dev_cac_player_valid() )
|
||||
{
|
||||
level.dev_cac_player thread highlight_player();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
level.dev_cac_player = undefined;
|
||||
#/
|
||||
}
|
||||
|
||||
highlight_player()
|
||||
{
|
||||
/#
|
||||
self sethighlighted( 1 );
|
||||
wait 1;
|
||||
self sethighlighted( 0 );
|
||||
self sethighlighted( 1 );
|
||||
wait 1.0;
|
||||
self sethighlighted( 0 );
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_overlay_think()
|
||||
{
|
||||
/#
|
||||
hud = dev_cac_overlay_create();
|
||||
level thread dev_cac_overlay_update( hud );
|
||||
level waittill( "dev_cac_overlay_think" );
|
||||
dev_cac_overlay_destroy( hud );
|
||||
hud = dev_cac_overlay_create();
|
||||
level thread dev_cac_overlay_update( hud );
|
||||
|
||||
level waittill( "dev_cac_overlay_think" );
|
||||
|
||||
dev_cac_overlay_destroy( hud );
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_overlay_update( hud )
|
||||
{
|
||||
/#
|
||||
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_overlay_destroy( hud )
|
||||
{
|
||||
/#
|
||||
i = 0;
|
||||
while ( i < hud.menu.size )
|
||||
{
|
||||
hud.menu[ i ] destroy();
|
||||
i++;
|
||||
}
|
||||
hud destroy();
|
||||
setdvar( "player_debugSprint", "0" );
|
||||
for ( i = 0; i < hud.menu.size; i++ )
|
||||
hud.menu[i] destroy();
|
||||
|
||||
hud destroy();
|
||||
setdvar( "player_debugSprint", "0" );
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_overlay_create()
|
||||
{
|
||||
/#
|
||||
x = -80;
|
||||
y = 140;
|
||||
menu_name = "dev_cac_debug";
|
||||
hud = maps/mp/gametypes/_dev::new_hud( menu_name, undefined, x, y, 1 );
|
||||
hud setshader( "white", 185, 285 );
|
||||
hud.alignx = "left";
|
||||
hud.aligny = "top";
|
||||
hud.sort = 10;
|
||||
hud.alpha = 0,6;
|
||||
hud.color = vectorScale( ( 0, 0, 0 ), 0,5 );
|
||||
x_offset = 100;
|
||||
hud.menu[ 0 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "NAME", x + 5, y + 10, 1,3 );
|
||||
hud.menu[ 1 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "MODELS", x + 5, y + 25, 1 );
|
||||
hud.menu[ 2 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Body:", x + 5, y + 35, 1 );
|
||||
hud.menu[ 3 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Head:", x + 5, y + 45, 1 );
|
||||
hud.menu[ 4 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 55, 1 );
|
||||
hud.menu[ 5 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "MOBILITY", x + 5, y + 70, 1 );
|
||||
hud.menu[ 6 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Body:", x + 5, y + 80, 1 );
|
||||
hud.menu[ 7 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 90, 1 );
|
||||
hud.menu[ 8 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Speed Scale:", x + 5, y + 100, 1 );
|
||||
hud.menu[ 9 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Sprint Duration:", x + 5, y + 110, 1 );
|
||||
hud.menu[ 10 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Sprint Cooldown:", x + 5, y + 120, 1 );
|
||||
hud.menu[ 11 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "ARMOR - BULLET", x + 5, y + 135, 1 );
|
||||
hud.menu[ 12 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Body:", x + 5, y + 145, 1 );
|
||||
hud.menu[ 13 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 155, 1 );
|
||||
hud.menu[ 14 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "ARMOR - EXPLOSIVE", x + 5, y + 170, 1 );
|
||||
hud.menu[ 15 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Body:", x + 5, y + 180, 1 );
|
||||
hud.menu[ 16 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 190, 1 );
|
||||
hud.menu[ 17 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "DAMAGE", x + 5, y + 205, 1 );
|
||||
hud.menu[ 18 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Type:", x + 5, y + 215, 1 );
|
||||
hud.menu[ 19 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Original:", x + 5, y + 225, 1 );
|
||||
hud.menu[ 20 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Final:", x + 5, y + 235, 1 );
|
||||
hud.menu[ 21 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Gain/Loss:", x + 5, y + 245, 1 );
|
||||
hud.menu[ 22 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Location:", x + 5, y + 255, 1 );
|
||||
hud.menu[ 23 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Weapon:", x + 5, y + 265, 1 );
|
||||
hud.menu[ 24 ] = maps/mp/gametypes/_dev::new_hud( menu_name, " Range:", x + 5, y + 275, 1 );
|
||||
x_offset = 65;
|
||||
hud.menu[ 25 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 35, 1 );
|
||||
hud.menu[ 26 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 45, 1 );
|
||||
hud.menu[ 27 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 55, 1 );
|
||||
x_offset = 100;
|
||||
hud.menu[ 28 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 80, 1 );
|
||||
hud.menu[ 29 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 90, 1 );
|
||||
hud.menu[ 30 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 100, 1 );
|
||||
hud.menu[ 31 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 110, 1 );
|
||||
hud.menu[ 32 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 120, 1 );
|
||||
hud.menu[ 33 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 145, 1 );
|
||||
hud.menu[ 34 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 155, 1 );
|
||||
hud.menu[ 35 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 180, 1 );
|
||||
hud.menu[ 36 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 190, 1 );
|
||||
x_offset = 65;
|
||||
hud.menu[ 37 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 215, 1 );
|
||||
hud.menu[ 38 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 225, 1 );
|
||||
hud.menu[ 39 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 235, 1 );
|
||||
hud.menu[ 40 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 245, 1 );
|
||||
hud.menu[ 41 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 255, 1 );
|
||||
hud.menu[ 42 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 265, 1 );
|
||||
hud.menu[ 43 ] = maps/mp/gametypes/_dev::new_hud( menu_name, "", x + x_offset, y + 275, 1 );
|
||||
return hud;
|
||||
x = -80;
|
||||
y = 140;
|
||||
menu_name = "dev_cac_debug";
|
||||
hud = maps\mp\gametypes\_dev::new_hud( menu_name, undefined, x, y, 1 );
|
||||
hud setshader( "white", 185, 285 );
|
||||
hud.alignx = "left";
|
||||
hud.aligny = "top";
|
||||
hud.sort = 10;
|
||||
hud.alpha = 0.6;
|
||||
hud.color = vectorscale( ( 0, 0, 1 ), 0.5 );
|
||||
x_offset = 100;
|
||||
hud.menu[0] = maps\mp\gametypes\_dev::new_hud( menu_name, "NAME", x + 5, y + 10, 1.3 );
|
||||
hud.menu[1] = maps\mp\gametypes\_dev::new_hud( menu_name, "MODELS", x + 5, y + 25, 1 );
|
||||
hud.menu[2] = maps\mp\gametypes\_dev::new_hud( menu_name, " Body:", x + 5, y + 35, 1 );
|
||||
hud.menu[3] = maps\mp\gametypes\_dev::new_hud( menu_name, " Head:", x + 5, y + 45, 1 );
|
||||
hud.menu[4] = maps\mp\gametypes\_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 55, 1 );
|
||||
hud.menu[5] = maps\mp\gametypes\_dev::new_hud( menu_name, "MOBILITY", x + 5, y + 70, 1 );
|
||||
hud.menu[6] = maps\mp\gametypes\_dev::new_hud( menu_name, " Body:", x + 5, y + 80, 1 );
|
||||
hud.menu[7] = maps\mp\gametypes\_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 90, 1 );
|
||||
hud.menu[8] = maps\mp\gametypes\_dev::new_hud( menu_name, " Speed Scale:", x + 5, y + 100, 1 );
|
||||
hud.menu[9] = maps\mp\gametypes\_dev::new_hud( menu_name, " Sprint Duration:", x + 5, y + 110, 1 );
|
||||
hud.menu[10] = maps\mp\gametypes\_dev::new_hud( menu_name, " Sprint Cooldown:", x + 5, y + 120, 1 );
|
||||
hud.menu[11] = maps\mp\gametypes\_dev::new_hud( menu_name, "ARMOR - BULLET", x + 5, y + 135, 1 );
|
||||
hud.menu[12] = maps\mp\gametypes\_dev::new_hud( menu_name, " Body:", x + 5, y + 145, 1 );
|
||||
hud.menu[13] = maps\mp\gametypes\_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 155, 1 );
|
||||
hud.menu[14] = maps\mp\gametypes\_dev::new_hud( menu_name, "ARMOR - EXPLOSIVE", x + 5, y + 170, 1 );
|
||||
hud.menu[15] = maps\mp\gametypes\_dev::new_hud( menu_name, " Body:", x + 5, y + 180, 1 );
|
||||
hud.menu[16] = maps\mp\gametypes\_dev::new_hud( menu_name, " Head Gear:", x + 5, y + 190, 1 );
|
||||
hud.menu[17] = maps\mp\gametypes\_dev::new_hud( menu_name, "DAMAGE", x + 5, y + 205, 1 );
|
||||
hud.menu[18] = maps\mp\gametypes\_dev::new_hud( menu_name, " Type:", x + 5, y + 215, 1 );
|
||||
hud.menu[19] = maps\mp\gametypes\_dev::new_hud( menu_name, " Original:", x + 5, y + 225, 1 );
|
||||
hud.menu[20] = maps\mp\gametypes\_dev::new_hud( menu_name, " Final:", x + 5, y + 235, 1 );
|
||||
hud.menu[21] = maps\mp\gametypes\_dev::new_hud( menu_name, " Gain/Loss:", x + 5, y + 245, 1 );
|
||||
hud.menu[22] = maps\mp\gametypes\_dev::new_hud( menu_name, " Location:", x + 5, y + 255, 1 );
|
||||
hud.menu[23] = maps\mp\gametypes\_dev::new_hud( menu_name, " Weapon:", x + 5, y + 265, 1 );
|
||||
hud.menu[24] = maps\mp\gametypes\_dev::new_hud( menu_name, " Range:", x + 5, y + 275, 1 );
|
||||
x_offset = 65;
|
||||
hud.menu[25] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 35, 1 );
|
||||
hud.menu[26] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 45, 1 );
|
||||
hud.menu[27] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 55, 1 );
|
||||
x_offset = 100;
|
||||
hud.menu[28] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 80, 1 );
|
||||
hud.menu[29] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 90, 1 );
|
||||
hud.menu[30] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 100, 1 );
|
||||
hud.menu[31] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 110, 1 );
|
||||
hud.menu[32] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 120, 1 );
|
||||
hud.menu[33] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 145, 1 );
|
||||
hud.menu[34] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 155, 1 );
|
||||
hud.menu[35] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 180, 1 );
|
||||
hud.menu[36] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 190, 1 );
|
||||
x_offset = 65;
|
||||
hud.menu[37] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 215, 1 );
|
||||
hud.menu[38] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 225, 1 );
|
||||
hud.menu[39] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 235, 1 );
|
||||
hud.menu[40] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 245, 1 );
|
||||
hud.menu[41] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 255, 1 );
|
||||
hud.menu[42] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 265, 1 );
|
||||
hud.menu[43] = maps\mp\gametypes\_dev::new_hud( menu_name, "", x + x_offset, y + 275, 1 );
|
||||
return hud;
|
||||
#/
|
||||
}
|
||||
|
||||
color( value )
|
||||
{
|
||||
/#
|
||||
r = 1;
|
||||
g = 1;
|
||||
b = 0;
|
||||
color = ( 0, 0, 0 );
|
||||
if ( value > 0 )
|
||||
{
|
||||
r -= value;
|
||||
}
|
||||
else
|
||||
{
|
||||
g += value;
|
||||
}
|
||||
c = ( r, g, b );
|
||||
return c;
|
||||
r = 1;
|
||||
g = 1;
|
||||
b = 0;
|
||||
color = ( 0, 0, 0 );
|
||||
|
||||
if ( value > 0 )
|
||||
r -= value;
|
||||
else
|
||||
g += value;
|
||||
|
||||
c = ( r, g, b );
|
||||
return c;
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_gdt_update_think()
|
||||
{
|
||||
/#
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "gdt_update", asset, keyvalue );
|
||||
keyvalue = strtok( keyvalue, "\\" );
|
||||
key = keyvalue[ 0 ];
|
||||
switch( key )
|
||||
{
|
||||
case "armorBullet":
|
||||
key = "armor_bullet";
|
||||
break;
|
||||
case "armorExplosive":
|
||||
key = "armor_explosive";
|
||||
break;
|
||||
case "moveSpeed":
|
||||
key = "mobility";
|
||||
break;
|
||||
case "sprintTimeTotal":
|
||||
key = "sprint_time_total";
|
||||
break;
|
||||
case "sprintTimeCooldown":
|
||||
key = "sprint_time_cooldown";
|
||||
break;
|
||||
default:
|
||||
key = undefined;
|
||||
break;
|
||||
}
|
||||
if ( !isDefined( key ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = float( keyvalue[ 1 ] );
|
||||
level.cac_attributes[ key ][ asset ] = value;
|
||||
players = get_players();
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "gdt_update", asset, keyvalue );
|
||||
|
||||
keyvalue = strtok( keyvalue, "\" );
|
||||
key = keyvalue[0];
|
||||
|
||||
switch ( key )
|
||||
{
|
||||
case "armorBullet":
|
||||
key = "armor_bullet";
|
||||
break;
|
||||
case "armorExplosive":
|
||||
key = "armor_explosive";
|
||||
break;
|
||||
case "moveSpeed":
|
||||
key = "mobility";
|
||||
break;
|
||||
case "sprintTimeTotal":
|
||||
key = "sprint_time_total";
|
||||
break;
|
||||
case "sprintTimeCooldown":
|
||||
key = "sprint_time_cooldown";
|
||||
break;
|
||||
default:
|
||||
key = undefined;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( !isdefined( key ) )
|
||||
continue;
|
||||
|
||||
value = float( keyvalue[1] );
|
||||
level.cac_attributes[key][asset] = value;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
sort_greatest( function, attribute, greatest )
|
||||
{
|
||||
/#
|
||||
keys = getarraykeys( level.cac_functions[ function ] );
|
||||
greatest = keys[ 0 ];
|
||||
i = 0;
|
||||
while ( i < keys.size )
|
||||
{
|
||||
if ( level.cac_attributes[ attribute ][ keys[ i ] ] > level.cac_attributes[ attribute ][ greatest ] )
|
||||
{
|
||||
greatest = keys[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return greatest;
|
||||
keys = getarraykeys( level.cac_functions[function] );
|
||||
greatest = keys[0];
|
||||
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
if ( level.cac_attributes[attribute][keys[i]] > level.cac_attributes[attribute][greatest] )
|
||||
greatest = keys[i];
|
||||
}
|
||||
|
||||
return greatest;
|
||||
#/
|
||||
}
|
||||
|
||||
sort_least( function, attribute, least )
|
||||
{
|
||||
/#
|
||||
keys = getarraykeys( level.cac_functions[ function ] );
|
||||
least = keys[ 0 ];
|
||||
i = 0;
|
||||
while ( i < keys.size )
|
||||
{
|
||||
if ( level.cac_attributes[ attribute ][ keys[ i ] ] < level.cac_attributes[ attribute ][ least ] )
|
||||
{
|
||||
least = keys[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return least;
|
||||
keys = getarraykeys( level.cac_functions[function] );
|
||||
least = keys[0];
|
||||
|
||||
for ( i = 0; i < keys.size; i++ )
|
||||
{
|
||||
if ( level.cac_attributes[attribute][keys[i]] < level.cac_attributes[attribute][least] )
|
||||
least = keys[i];
|
||||
}
|
||||
|
||||
return least;
|
||||
#/
|
||||
}
|
||||
|
||||
dev_cac_set_model_range( sort_function, attribute )
|
||||
{
|
||||
/#
|
||||
if ( !dev_cac_player_valid() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player = level.dev_cac_player;
|
||||
player.cac_body_type = [[ sort_function ]]( "set_body_model", attribute );
|
||||
player.cac_head_type = [[ sort_function ]]( "set_head_model", attribute );
|
||||
player.cac_hat_type = [[ sort_function ]]( "set_hat_model", attribute );
|
||||
player dev_cac_set_player_model();
|
||||
if ( !dev_cac_player_valid() )
|
||||
return;
|
||||
|
||||
player = level.dev_cac_player;
|
||||
player.cac_body_type = [[ sort_function ]]( "set_body_model", attribute );
|
||||
player.cac_head_type = [[ sort_function ]]( "set_head_model", attribute );
|
||||
player.cac_hat_type = [[ sort_function ]]( "set_hat_model", attribute );
|
||||
player dev_cac_set_player_model();
|
||||
#/
|
||||
}
|
||||
|
@ -1,109 +1,115 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
if ( level.createfx_enabled || sessionmodeiszombiesgame() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( getDvar( "scr_drawfriend" ) == "" )
|
||||
{
|
||||
setdvar( "scr_drawfriend", "0" );
|
||||
}
|
||||
level.drawfriend = getDvarInt( "scr_drawfriend" );
|
||||
/*
|
||||
if ( level.createfx_enabled || sessionmodeiszombiesgame() )
|
||||
return;
|
||||
|
||||
if ( getdvar( "scr_drawfriend" ) == "" )
|
||||
setdvar( "scr_drawfriend", "0" );
|
||||
|
||||
level.drawfriend = getdvarint( "scr_drawfriend" );
|
||||
/#
|
||||
assert( isDefined( game[ "headicon_allies" ] ), "Allied head icons are not defined. Check the team set for the level." );
|
||||
assert( isdefined( game["headicon_allies"] ), "Allied head icons are not defined. Check the team set for the level." );
|
||||
#/
|
||||
/#
|
||||
assert( isDefined( game[ "headicon_axis" ] ), "Axis head icons are not defined. Check the team set for the level." );
|
||||
assert( isdefined( game["headicon_axis"] ), "Axis head icons are not defined. Check the team set for the level." );
|
||||
#/
|
||||
*/
|
||||
precacheheadicon( game[ "headicon_allies" ] );
|
||||
precacheheadicon( game[ "headicon_axis" ] );
|
||||
level thread onplayerconnect();
|
||||
for ( ;; )
|
||||
{
|
||||
updatefriendiconsettings();
|
||||
wait 5;
|
||||
}
|
||||
precacheheadicon( game["headicon_allies"] );
|
||||
precacheheadicon( game["headicon_axis"] );
|
||||
level thread onplayerconnect();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
updatefriendiconsettings();
|
||||
wait 5;
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread showfriendicon();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread showfriendicon();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled() //checked matches cerberus output
|
||||
onplayerkilled()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self.headicon = "";
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
|
||||
self.headicon = "";
|
||||
}
|
||||
}
|
||||
|
||||
showfriendicon() //checked matches cerberus output
|
||||
showfriendicon()
|
||||
{
|
||||
if ( level.drawfriend )
|
||||
{
|
||||
team = self.pers[ "team" ];
|
||||
self.headicon = game[ "headicon_" + team ];
|
||||
self.headiconteam = team;
|
||||
}
|
||||
if ( level.drawfriend )
|
||||
{
|
||||
team = self.pers["team"];
|
||||
self.headicon = game["headicon_" + team];
|
||||
self.headiconteam = team;
|
||||
}
|
||||
}
|
||||
|
||||
updatefriendiconsettings() //checked matches cerberus output
|
||||
updatefriendiconsettings()
|
||||
{
|
||||
drawfriend = getDvarFloat( "scr_drawfriend" );
|
||||
if ( level.drawfriend != drawfriend )
|
||||
{
|
||||
level.drawfriend = drawfriend;
|
||||
updatefriendicons();
|
||||
}
|
||||
drawfriend = getdvarfloat( "scr_drawfriend" );
|
||||
|
||||
if ( level.drawfriend != drawfriend )
|
||||
{
|
||||
level.drawfriend = drawfriend;
|
||||
updatefriendicons();
|
||||
}
|
||||
}
|
||||
|
||||
updatefriendicons()
|
||||
{
|
||||
players = level.players;
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] != "spectator" && player.sessionstate == "playing" )
|
||||
{
|
||||
if ( level.drawfriend )
|
||||
{
|
||||
team = self.pers[ "team" ];
|
||||
self.headicon = game[ "headicon_" + team ];
|
||||
self.headiconteam = team;
|
||||
break;
|
||||
}
|
||||
players = level.players;
|
||||
for ( j = 0; i < players.size; j++ )
|
||||
{
|
||||
player = players[ j ];
|
||||
if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] != "spectator" && player.sessionstate == "playing" )
|
||||
{
|
||||
player.headicon = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
players = level.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
|
||||
if ( isdefined( player.pers["team"] ) && player.pers["team"] != "spectator" && player.sessionstate == "playing" )
|
||||
{
|
||||
if ( level.drawfriend )
|
||||
{
|
||||
team = self.pers["team"];
|
||||
self.headicon = game["headicon_" + team];
|
||||
self.headiconteam = team;
|
||||
continue;
|
||||
}
|
||||
|
||||
players = level.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
|
||||
if ( isdefined( player.pers["team"] ) && player.pers["team"] != "spectator" && player.sessionstate == "playing" )
|
||||
player.headicon = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,2 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
@ -1743,7 +1743,6 @@ endGame( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within r
|
||||
maps\mp\_music::setmusicstate( "SILENT" );
|
||||
maps\mp\_gamerep::gameRepUpdateInformationForRound();
|
||||
maps\mp\gametypes\_wager::finalizeWagerRound();
|
||||
maps\mp\gametypes\_gametype_variants::onRoundEnd();
|
||||
thread maps\mp\_challenges::roundEnd( winner );
|
||||
|
||||
if ( startNextRound( winner, endReasonText ) )
|
||||
|
@ -1,219 +1,180 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_weapons;
|
||||
#include maps/mp/_burnplayer;
|
||||
#include maps/mp/gametypes/_globallogic_utils;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output
|
||||
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 ) && !is_true( eattacker.candocombat ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = getTime();
|
||||
eattacker = maps/mp/gametypes/_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/_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 ( smeansofdeath == "MOD_BURNED" )
|
||||
{
|
||||
if ( sweapon == "none" )
|
||||
{
|
||||
self maps/mp/_burnplayer::walkedthroughflames();
|
||||
}
|
||||
if ( sweapon == "m2_flamethrower_mp" )
|
||||
{
|
||||
self maps/mp/_burnplayer::burnedwithflamethrower();
|
||||
}
|
||||
}
|
||||
if ( sweapon == "none" && isDefined( einflictor ) )
|
||||
{
|
||||
if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
{
|
||||
sweapon = "explodable_barrel_mp";
|
||||
}
|
||||
else if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
{
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
}
|
||||
if ( idflags & level.idflags_no_protection )
|
||||
{
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
eattacker.pers[ "participation" ]++;
|
||||
}
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers[ "team" ] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0,5 );
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
friendly = 1;
|
||||
}
|
||||
else if ( isDefined( eattacker ) && isDefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isDefined( self.script_owner ) && isDefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes/_weapons::checkhit( sweapon );
|
||||
}
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isDefined( einflictor ) && isDefined( einflictor.iscooked ) )
|
||||
{
|
||||
self.wascooked = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.wascooked = undefined;
|
||||
}
|
||||
if ( isDefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
self.lastdamagewasfromenemy = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
}
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
if ( isDefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( sweapon != "artillery_mp" && !isDefined( einflictor ) || !isai( einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( self.aiteam == "spectator" )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
return;
|
||||
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = gettime();
|
||||
eattacker = maps\mp\gametypes\_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\_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 ( smeansofdeath == "MOD_BURNED" )
|
||||
{
|
||||
if ( sweapon == "none" )
|
||||
self maps\mp\_burnplayer::walkedthroughflames();
|
||||
|
||||
if ( sweapon == "m2_flamethrower_mp" )
|
||||
self maps\mp\_burnplayer::burnedwithflamethrower();
|
||||
}
|
||||
|
||||
if ( sweapon == "none" && isdefined( einflictor ) )
|
||||
{
|
||||
if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
sweapon = "explodable_barrel_mp";
|
||||
else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
|
||||
if ( !( idflags & level.idflags_no_protection ) )
|
||||
{
|
||||
if ( isplayer( eattacker ) )
|
||||
eattacker.pers["participation"]++;
|
||||
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
|
||||
if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers["team"] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
return;
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
return;
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0.5 );
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isdefined( eattacker ) && isdefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isdefined( self.script_owner ) && isdefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) )
|
||||
eattacker thread maps\mp\gametypes\_weapons::checkhit( sweapon );
|
||||
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isdefined( einflictor ) && isdefined( einflictor.iscooked ) )
|
||||
self.wascooked = gettime();
|
||||
else
|
||||
self.wascooked = undefined;
|
||||
|
||||
self.lastdamagewasfromenemy = isdefined( eattacker ) && eattacker != self;
|
||||
self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex );
|
||||
}
|
||||
|
||||
if ( isdefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( sweapon != "artillery_mp" && ( !isdefined( einflictor ) || !isai( einflictor ) ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
eattacker thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/#
|
||||
if ( getDvarInt( "g_debugDamage" ) )
|
||||
{
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc );
|
||||
if ( getdvarint( "g_debugDamage" ) )
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = 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 + ";" + 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 + ";" + boneindex + "\n" );
|
||||
}
|
||||
}
|
||||
|
||||
callback_actorkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) //checked matches cerberus output
|
||||
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 );
|
||||
maps/mp/_scoreevents::processscoreevent( "killed_dog", attacker, self, sweapon );
|
||||
attacker maps/mp/_challenges::killeddog();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( isai( attacker ) && isdefined( attacker.script_owner ) )
|
||||
{
|
||||
if ( attacker.script_owner.team != self.aiteam )
|
||||
attacker = attacker.script_owner;
|
||||
}
|
||||
|
||||
if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) )
|
||||
attacker = attacker.owner;
|
||||
|
||||
if ( isdefined( attacker ) && isplayer( attacker ) )
|
||||
{
|
||||
if ( !level.teambased || self.aiteam != attacker.pers["team"] )
|
||||
{
|
||||
level.globalkillstreaksdestroyed++;
|
||||
attacker addweaponstat( "dogs_mp", "destroyed", 1 );
|
||||
maps\mp\_scoreevents::processscoreevent( "killed_dog", attacker, self, sweapon );
|
||||
attacker maps\mp\_challenges::killeddog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,297 +1,263 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_rank;
|
||||
#include maps/mp/killstreaks/_killstreaks;
|
||||
#include maps/mp/gametypes/_spawnlogic;
|
||||
#include maps/mp/gametypes/_globallogic_audio;
|
||||
#include maps/mp/gametypes/_globallogic_score;
|
||||
#include maps/mp/gametypes/_globallogic;
|
||||
#include maps/mp/gametypes/_globallogic_utils;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
getwinningteamfromloser( losing_team ) //checked changed to match cerberus output
|
||||
getwinningteamfromloser( losing_team )
|
||||
{
|
||||
if ( level.multiteam )
|
||||
{
|
||||
return "tie";
|
||||
}
|
||||
else if ( losing_team == "axis" )
|
||||
{
|
||||
return "allies";
|
||||
}
|
||||
return "axis";
|
||||
if ( level.multiteam )
|
||||
return "tie";
|
||||
else if ( losing_team == "axis" )
|
||||
return "allies";
|
||||
|
||||
return "axis";
|
||||
}
|
||||
|
||||
default_onforfeit( team ) //checked matches cerberus output
|
||||
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 ( level.multiteam )
|
||||
{
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "other_teams_forfeited" ] );
|
||||
endreason = game[ "strings" ][ "other_teams_forfeited" ];
|
||||
winner = team;
|
||||
}
|
||||
else if ( !isDefined( team ) )
|
||||
{
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "players_forfeited" ] );
|
||||
endreason = game[ "strings" ][ "players_forfeited" ];
|
||||
winner = level.players[ 0 ];
|
||||
}
|
||||
else if ( isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
endreason = game[ "strings" ][ team + "_forfeited" ];
|
||||
setdvar( "ui_text_endreason", endreason );
|
||||
winner = getwinningteamfromloser( team );
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
level.gameforfeited = 1;
|
||||
level notify( "forfeit in progress" );
|
||||
level endon( "forfeit in progress" );
|
||||
level endon( "abort forfeit" );
|
||||
forfeit_delay = 20.0;
|
||||
announcement( game["strings"]["opponent_forfeiting_in"], forfeit_delay, 0 );
|
||||
wait 10.0;
|
||||
announcement( game["strings"]["opponent_forfeiting_in"], 10.0, 0 );
|
||||
wait 10.0;
|
||||
endreason = &"";
|
||||
|
||||
if ( level.multiteam )
|
||||
{
|
||||
setdvar( "ui_text_endreason", game["strings"]["other_teams_forfeited"] );
|
||||
endreason = game["strings"]["other_teams_forfeited"];
|
||||
winner = team;
|
||||
}
|
||||
else if ( !isdefined( team ) )
|
||||
{
|
||||
setdvar( "ui_text_endreason", game["strings"]["players_forfeited"] );
|
||||
endreason = game["strings"]["players_forfeited"];
|
||||
winner = level.players[0];
|
||||
}
|
||||
else if ( isdefined( level.teams[team] ) )
|
||||
{
|
||||
endreason = game["strings"][team + "_forfeited"];
|
||||
setdvar( "ui_text_endreason", endreason );
|
||||
winner = getwinningteamfromloser( team );
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
assert( isDefined( team ), "Forfeited team is not defined" );
|
||||
assert( isdefined( team ), "Forfeited team is not defined" );
|
||||
#/
|
||||
/#
|
||||
assert( 0, "Forfeited team " + team + " is not allies or axis" );
|
||||
assert( 0, "Forfeited team " + team + " is not allies or axis" );
|
||||
#/
|
||||
*/
|
||||
winner = "tie";
|
||||
}
|
||||
level.forcedend = 1;
|
||||
if ( isplayer( winner ) )
|
||||
{
|
||||
logstring( "forfeit, win: " + winner getxuid() + "(" + winner.name + ")" );
|
||||
}
|
||||
else
|
||||
{
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "forfeit", winner );
|
||||
}
|
||||
thread maps/mp/gametypes/_globallogic::endgame( winner, endreason );
|
||||
winner = "tie";
|
||||
}
|
||||
|
||||
level.forcedend = 1;
|
||||
|
||||
if ( isplayer( winner ) )
|
||||
logstring( "forfeit, win: " + winner getxuid() + "(" + winner.name + ")" );
|
||||
else
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "forfeit", winner );
|
||||
|
||||
thread maps\mp\gametypes\_globallogic::endgame( winner, endreason );
|
||||
}
|
||||
|
||||
default_ondeadevent( team ) //checked changed to match cerberus output
|
||||
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/_globallogic_utils::logteamwinstring( "team eliminated", winner );
|
||||
thread maps/mp/gametypes/_globallogic::endgame( winner, eliminatedstring );
|
||||
}
|
||||
else
|
||||
{
|
||||
makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "tie" ] );
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "tie" ] );
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "tie" );
|
||||
if ( level.teambased )
|
||||
{
|
||||
thread maps/mp/gametypes/_globallogic::endgame( "tie", game[ "strings" ][ "tie" ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps/mp/gametypes/_globallogic::endgame( undefined, game[ "strings" ][ "tie" ] );
|
||||
}
|
||||
}
|
||||
if ( isdefined( level.teams[team] ) )
|
||||
{
|
||||
eliminatedstring = game["strings"][team + "_eliminated"];
|
||||
iprintln( eliminatedstring );
|
||||
makedvarserverinfo( "ui_text_endreason", eliminatedstring );
|
||||
setdvar( "ui_text_endreason", eliminatedstring );
|
||||
winner = getwinningteamfromloser( team );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "team eliminated", winner );
|
||||
thread maps\mp\gametypes\_globallogic::endgame( winner, eliminatedstring );
|
||||
}
|
||||
else
|
||||
{
|
||||
makedvarserverinfo( "ui_text_endreason", game["strings"]["tie"] );
|
||||
setdvar( "ui_text_endreason", game["strings"]["tie"] );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "tie" );
|
||||
|
||||
if ( level.teambased )
|
||||
thread maps\mp\gametypes\_globallogic::endgame( "tie", game["strings"]["tie"] );
|
||||
else
|
||||
thread maps\mp\gametypes\_globallogic::endgame( undefined, game["strings"]["tie"] );
|
||||
}
|
||||
}
|
||||
|
||||
default_onlastteamaliveevent( team ) //checked changed to match cerberus output
|
||||
default_onlastteamaliveevent( team )
|
||||
{
|
||||
if ( isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
eliminatedstring = game[ "strings" ][ "enemies_eliminated" ];
|
||||
iprintln( eliminatedstring );
|
||||
makedvarserverinfo( "ui_text_endreason", eliminatedstring );
|
||||
setdvar( "ui_text_endreason", eliminatedstring );
|
||||
winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "team eliminated", winner );
|
||||
thread maps/mp/gametypes/_globallogic::endgame( winner, eliminatedstring );
|
||||
}
|
||||
else
|
||||
{
|
||||
makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "tie" ] );
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "tie" ] );
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "tie" );
|
||||
if ( level.teambased )
|
||||
{
|
||||
thread maps/mp/gametypes/_globallogic::endgame( "tie", game[ "strings" ][ "tie" ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
thread maps/mp/gametypes/_globallogic::endgame( undefined, game[ "strings" ][ "tie" ] );
|
||||
}
|
||||
}
|
||||
if ( isdefined( level.teams[team] ) )
|
||||
{
|
||||
eliminatedstring = game["strings"]["enemies_eliminated"];
|
||||
iprintln( eliminatedstring );
|
||||
makedvarserverinfo( "ui_text_endreason", eliminatedstring );
|
||||
setdvar( "ui_text_endreason", eliminatedstring );
|
||||
winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "team eliminated", winner );
|
||||
thread maps\mp\gametypes\_globallogic::endgame( winner, eliminatedstring );
|
||||
}
|
||||
else
|
||||
{
|
||||
makedvarserverinfo( "ui_text_endreason", game["strings"]["tie"] );
|
||||
setdvar( "ui_text_endreason", game["strings"]["tie"] );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "tie" );
|
||||
|
||||
if ( level.teambased )
|
||||
thread maps\mp\gametypes\_globallogic::endgame( "tie", game["strings"]["tie"] );
|
||||
else
|
||||
thread maps\mp\gametypes\_globallogic::endgame( undefined, game["strings"]["tie"] );
|
||||
}
|
||||
}
|
||||
|
||||
default_onalivecountchange( team ) //checked matches cerberus output
|
||||
default_onalivecountchange( team )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
default_onroundendgame( winner ) //checked matches cerberus output
|
||||
default_onroundendgame( winner )
|
||||
{
|
||||
return winner;
|
||||
return winner;
|
||||
}
|
||||
|
||||
default_ononeleftevent( team ) //checked partially changed to match beta dump did not change while loop to for loop see github for more info
|
||||
default_ononeleftevent( team )
|
||||
{
|
||||
if ( !level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes/_globallogic_score::gethighestscoringplayer();
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
logstring( "last one alive, win: " + winner.name );
|
||||
}
|
||||
else
|
||||
{
|
||||
logstring( "last one alive, win: unknown" );
|
||||
}
|
||||
thread maps/mp/gametypes/_globallogic::endgame( winner, &"MP_ENEMIES_ELIMINATED" );
|
||||
}
|
||||
else
|
||||
{
|
||||
index = 0;
|
||||
while ( index < level.players.size )
|
||||
{
|
||||
player = level.players[ index ];
|
||||
if ( !isalive( player ) )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
if ( !isDefined( player.pers[ "team" ] ) || player.pers[ "team" ] != team )
|
||||
{
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
player maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sudden_death" );
|
||||
index++;
|
||||
}
|
||||
}
|
||||
if ( !level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes\_globallogic_score::gethighestscoringplayer();
|
||||
|
||||
if ( isdefined( winner ) )
|
||||
logstring( "last one alive, win: " + winner.name );
|
||||
else
|
||||
logstring( "last one alive, win: unknown" );
|
||||
|
||||
thread maps\mp\gametypes\_globallogic::endgame( winner, &"MP_ENEMIES_ELIMINATED" );
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( index = 0; index < level.players.size; index++ )
|
||||
{
|
||||
player = level.players[index];
|
||||
|
||||
if ( !isalive( player ) )
|
||||
continue;
|
||||
|
||||
if ( !isdefined( player.pers["team"] ) || player.pers["team"] != team )
|
||||
continue;
|
||||
|
||||
player maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "sudden_death" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
default_ontimelimit() //checked changed to match cerberus output
|
||||
default_ontimelimit()
|
||||
{
|
||||
winner = undefined;
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "time limit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps/mp/gametypes/_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/_globallogic::endgame( winner, game[ "strings" ][ "time_limit_reached" ] );
|
||||
winner = undefined;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "time limit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps\mp\gametypes\_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\_globallogic::endgame( winner, game["strings"]["time_limit_reached"] );
|
||||
}
|
||||
|
||||
default_onscorelimit() //checked changed to match cerberus output
|
||||
default_onscorelimit()
|
||||
{
|
||||
if ( !level.endgameonscorelimit )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
winner = undefined;
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "scorelimit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps/mp/gametypes/_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/_globallogic::endgame( winner, game[ "strings" ][ "score_limit_reached" ] );
|
||||
return 1;
|
||||
if ( !level.endgameonscorelimit )
|
||||
return false;
|
||||
|
||||
winner = undefined;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "scorelimit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps\mp\gametypes\_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\_globallogic::endgame( winner, game["strings"]["score_limit_reached"] );
|
||||
return true;
|
||||
}
|
||||
|
||||
default_onspawnspectator( origin, angles ) //checked matches cerberus output
|
||||
default_onspawnspectator( origin, angles )
|
||||
{
|
||||
if ( isDefined( origin ) && isDefined( angles ) )
|
||||
{
|
||||
self spawn( origin, angles );
|
||||
return;
|
||||
}
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
/*
|
||||
if ( isdefined( origin ) && isdefined( angles ) )
|
||||
{
|
||||
self spawn( origin, angles );
|
||||
return;
|
||||
}
|
||||
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
/#
|
||||
assert( spawnpoints.size, "There are no mp_global_intermission spawn points in the map. There must be at least one." );
|
||||
assert( spawnpoints.size, "There are no mp_global_intermission spawn points in the map. There must be at least one." );
|
||||
#/
|
||||
*/
|
||||
spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( spawnpoints );
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnpoints );
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
}
|
||||
|
||||
default_onspawnintermission() //checked matches cerberus output
|
||||
default_onspawnintermission()
|
||||
{
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
spawnpoint = spawnpoints[ 0 ];
|
||||
if ( isDefined( spawnpoint ) )
|
||||
{
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
spawnpointname = "mp_global_intermission";
|
||||
spawnpoints = getentarray( spawnpointname, "classname" );
|
||||
spawnpoint = spawnpoints[0];
|
||||
|
||||
if ( isdefined( spawnpoint ) )
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles );
|
||||
else
|
||||
{
|
||||
/#
|
||||
maps/mp/_utility::error( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" );
|
||||
maps\mp\_utility::error( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
default_gettimelimit() //checked matches cerberus output
|
||||
default_gettimelimit()
|
||||
{
|
||||
return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax );
|
||||
return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax );
|
||||
}
|
||||
|
||||
default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) //checked matches cerberus output
|
||||
default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon )
|
||||
{
|
||||
teamkill_penalty = 1;
|
||||
score = maps/mp/gametypes/_globallogic_score::_getplayerscore( attacker );
|
||||
if ( score == 0 )
|
||||
{
|
||||
teamkill_penalty = 2;
|
||||
}
|
||||
if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) )
|
||||
{
|
||||
teamkill_penalty *= maps/mp/killstreaks/_killstreaks::getkillstreakteamkillpenaltyscale( sweapon );
|
||||
}
|
||||
return teamkill_penalty;
|
||||
teamkill_penalty = 1;
|
||||
score = maps\mp\gametypes\_globallogic_score::_getplayerscore( attacker );
|
||||
|
||||
if ( score == 0 )
|
||||
teamkill_penalty = 2;
|
||||
|
||||
if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) )
|
||||
teamkill_penalty *= maps\mp\killstreaks\_killstreaks::getkillstreakteamkillpenaltyscale( sweapon );
|
||||
|
||||
return teamkill_penalty;
|
||||
}
|
||||
|
||||
default_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) //checked matches cerberus output
|
||||
default_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon )
|
||||
{
|
||||
return maps/mp/gametypes/_rank::getscoreinfovalue( "team_kill" );
|
||||
return maps\mp\gametypes\_rank::getscoreinfovalue( "team_kill" );
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,511 +1,471 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_globallogic_score;
|
||||
#include maps/mp/gametypes/_hostmigration;
|
||||
#include maps/mp/killstreaks/_killstreaks;
|
||||
#include maps/mp/gametypes/_hud_message;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
waittillslowprocessallowed() //checked matches cerberus output
|
||||
waittillslowprocessallowed()
|
||||
{
|
||||
while ( level.lastslowprocessframe == getTime() )
|
||||
{
|
||||
wait 0.05;
|
||||
}
|
||||
level.lastslowprocessframe = getTime();
|
||||
while ( level.lastslowprocessframe == gettime() )
|
||||
wait 0.05;
|
||||
|
||||
level.lastslowprocessframe = gettime();
|
||||
}
|
||||
|
||||
testmenu() //checked matches cerberus output
|
||||
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/_hud_message::notifymessage( notifydata );
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 10.0;
|
||||
notifydata = spawnstruct();
|
||||
notifydata.titletext = &"MP_CHALLENGE_COMPLETED";
|
||||
notifydata.notifytext = "wheee";
|
||||
notifydata.sound = "mp_challenge_complete";
|
||||
self thread maps\mp\gametypes\_hud_message::notifymessage( notifydata );
|
||||
}
|
||||
}
|
||||
|
||||
testshock() //checked changed to match cerberus output
|
||||
testshock()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
wait 3;
|
||||
numshots = randomint( 6 );
|
||||
for ( i = 0; i < numshots; i++ )
|
||||
{
|
||||
iprintlnbold( numshots );
|
||||
self shellshock( "frag_grenade_mp", 0,2 );
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
self endon( "death" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 3.0;
|
||||
numshots = randomint( 6 );
|
||||
|
||||
for ( i = 0; i < numshots; i++ )
|
||||
{
|
||||
iprintlnbold( numshots );
|
||||
self shellshock( "frag_grenade_mp", 0.2 );
|
||||
wait 0.1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
testhps() //checked matches cerberus output
|
||||
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";
|
||||
if ( self thread maps/mp/killstreaks/_killstreaks::givekillstreak( hp ) )
|
||||
{
|
||||
self playlocalsound( level.killstreaks[ hp ].informdialog );
|
||||
}
|
||||
wait 20;
|
||||
}
|
||||
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";
|
||||
|
||||
if ( self thread maps\mp\killstreaks\_killstreaks::givekillstreak( hp ) )
|
||||
self playlocalsound( level.killstreaks[hp].informdialog );
|
||||
|
||||
wait 20.0;
|
||||
}
|
||||
}
|
||||
|
||||
timeuntilroundend() //checked matches cerberus output
|
||||
timeuntilroundend()
|
||||
{
|
||||
if ( level.gameended )
|
||||
{
|
||||
timepassed = ( getTime() - level.gameendtime ) / 1000;
|
||||
timeremaining = level.postroundtime - timepassed;
|
||||
if ( timeremaining < 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return timeremaining;
|
||||
}
|
||||
if ( level.inovertime )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( level.timelimit <= 0 )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( !isDefined( level.starttime ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
timepassed = ( gettimepassed() - level.starttime ) / 1000;
|
||||
timeremaining = ( level.timelimit * 60 ) - timepassed;
|
||||
return timeremaining + level.postroundtime;
|
||||
if ( level.gameended )
|
||||
{
|
||||
timepassed = ( gettime() - level.gameendtime ) / 1000;
|
||||
timeremaining = level.postroundtime - timepassed;
|
||||
|
||||
if ( timeremaining < 0 )
|
||||
return 0;
|
||||
|
||||
return timeremaining;
|
||||
}
|
||||
|
||||
if ( level.inovertime )
|
||||
return undefined;
|
||||
|
||||
if ( level.timelimit <= 0 )
|
||||
return undefined;
|
||||
|
||||
if ( !isdefined( level.starttime ) )
|
||||
return undefined;
|
||||
|
||||
timepassed = ( gettimepassed() - level.starttime ) / 1000;
|
||||
timeremaining = level.timelimit * 60 - timepassed;
|
||||
return timeremaining + level.postroundtime;
|
||||
}
|
||||
|
||||
gettimeremaining() //checked matches cerberus output
|
||||
gettimeremaining()
|
||||
{
|
||||
return ( ( level.timelimit * 60 ) * 1000 ) - gettimepassed();
|
||||
return level.timelimit * 60 * 1000 - gettimepassed();
|
||||
}
|
||||
|
||||
registerpostroundevent( eventfunc ) //checked matches cerberus output
|
||||
registerpostroundevent( eventfunc )
|
||||
{
|
||||
if ( !isDefined( level.postroundevents ) )
|
||||
{
|
||||
level.postroundevents = [];
|
||||
}
|
||||
level.postroundevents[ level.postroundevents.size ] = eventfunc;
|
||||
if ( !isdefined( level.postroundevents ) )
|
||||
level.postroundevents = [];
|
||||
|
||||
level.postroundevents[level.postroundevents.size] = eventfunc;
|
||||
}
|
||||
|
||||
executepostroundevents() //checked changed to match cerberus output
|
||||
executepostroundevents()
|
||||
{
|
||||
if ( !isDefined( level.postroundevents ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
for ( i = 0; i < level.postroundevents.size; i++ )
|
||||
{
|
||||
[[ level.postroundevents[ i ] ]]();
|
||||
}
|
||||
if ( !isdefined( level.postroundevents ) )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < level.postroundevents.size; i++ )
|
||||
[[ level.postroundevents[i] ]]();
|
||||
}
|
||||
|
||||
getvalueinrange( value, minvalue, maxvalue ) //checked changed to match cerberus output
|
||||
getvalueinrange( value, minvalue, maxvalue )
|
||||
{
|
||||
if ( value > maxvalue )
|
||||
{
|
||||
return maxvalue;
|
||||
}
|
||||
else if ( value < minvalue )
|
||||
{
|
||||
return minvalue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return value;
|
||||
}
|
||||
if ( value > maxvalue )
|
||||
return maxvalue;
|
||||
else if ( value < minvalue )
|
||||
return minvalue;
|
||||
else
|
||||
return value;
|
||||
}
|
||||
|
||||
assertproperplacement() //checked partially changed to match cerberus output changed at own discretion
|
||||
assertproperplacement()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
numplayers = level.placement[ "all" ].size;
|
||||
if ( level.teambased )
|
||||
{
|
||||
for ( i = 0; i < numplayers - 1; i++ )
|
||||
{
|
||||
if ( level.placement[ "all" ][ i ].score < level.placement[ "all" ][ i + 1 ].score )
|
||||
{
|
||||
println( "^1Placement array:" );
|
||||
for ( i = 0; i < numplayers; i++ )
|
||||
{
|
||||
player = level.placement[ "all" ][ i ];
|
||||
println( "^1" + i + ". " + player.name + ": " + player.score );
|
||||
}
|
||||
assertmsg( "Placement array was not properly sorted" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( i = 0; i < numplayers - 1; i++ )
|
||||
{
|
||||
if ( level.placement[ "all" ][ i ].pointstowin < level.placement[ "all" ][ i + 1 ].pointstowin )
|
||||
{
|
||||
println( "^1Placement array:" );
|
||||
for ( i = 0; i < numplayers; i++ )
|
||||
{
|
||||
player = level.placement[ "all" ][ i ];
|
||||
println( "^1" + i + ". " + player.name + ": " + player.pointstowin );
|
||||
}
|
||||
assertmsg( "Placement array was not properly sorted" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#/
|
||||
*/
|
||||
}
|
||||
numplayers = level.placement["all"].size;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
for ( i = 0; i < numplayers - 1; i++ )
|
||||
{
|
||||
if ( level.placement["all"][i].score < level.placement["all"][i + 1].score )
|
||||
{
|
||||
println( "^1Placement array:" );
|
||||
|
||||
for ( i = 0; i < numplayers; i++ )
|
||||
{
|
||||
player = level.placement["all"][i];
|
||||
println( "^1" + i + ". " + player.name + ": " + player.score );
|
||||
}
|
||||
|
||||
isvalidclass( class ) //checked matches cerberus output
|
||||
{
|
||||
if ( level.oldschool || sessionmodeiszombiesgame() )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( !isDefined( class ) );
|
||||
assertmsg( "Placement array was not properly sorted" );
|
||||
#/
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( class ) )
|
||||
{
|
||||
return class != "";
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( i = 0; i < numplayers - 1; i++ )
|
||||
{
|
||||
if ( level.placement["all"][i].pointstowin < level.placement["all"][i + 1].pointstowin )
|
||||
{
|
||||
println( "^1Placement array:" );
|
||||
|
||||
playtickingsound( gametype_tick_sound ) //checked matches cerberus output
|
||||
{
|
||||
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/_hostmigration::waittillhostmigrationdone();
|
||||
}
|
||||
}
|
||||
for ( i = 0; i < numplayers; i++ )
|
||||
{
|
||||
player = level.placement["all"][i];
|
||||
println( "^1" + i + ". " + player.name + ": " + player.pointstowin );
|
||||
}
|
||||
|
||||
stoptickingsound() //checked matches cerberus output
|
||||
{
|
||||
self notify( "stop_ticking" );
|
||||
}
|
||||
|
||||
gametimer() //checked changed to match cerberus output
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
level waittill( "prematch_over" );
|
||||
level.starttime = getTime();
|
||||
level.discardtime = 0;
|
||||
if ( isDefined( game[ "roundMillisecondsAlreadyPassed" ] ) )
|
||||
{
|
||||
level.starttime -= game[ "roundMillisecondsAlreadyPassed" ];
|
||||
game["roundMillisecondsAlreadyPassed"] = undefined;
|
||||
}
|
||||
prevtime = getTime();
|
||||
while ( game[ "state" ] == "playing" )
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
{
|
||||
game[ "timepassed" ] += getTime() - prevtime;
|
||||
}
|
||||
prevtime = getTime();
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
gettimepassed() //checked matches cerberus output
|
||||
{
|
||||
if ( !isDefined( level.starttime ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( level.timerstopped )
|
||||
{
|
||||
return level.timerpausetime - level.starttime - level.discardtime;
|
||||
}
|
||||
else
|
||||
{
|
||||
return getTime() - level.starttime - level.discardtime;
|
||||
}
|
||||
}
|
||||
|
||||
pausetimer() //checked matches cerberus output
|
||||
{
|
||||
if ( level.timerstopped )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.timerstopped = 1;
|
||||
level.timerpausetime = getTime();
|
||||
}
|
||||
|
||||
resumetimer() //checked matches cerberus output
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level.timerstopped = 0;
|
||||
level.discardtime += getTime() - level.timerpausetime;
|
||||
}
|
||||
|
||||
getscoreremaining( team ) //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
assert( isDefined( team ) );
|
||||
}
|
||||
assertmsg( "Placement array was not properly sorted" );
|
||||
#/
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#/
|
||||
*/
|
||||
scorelimit = level.scorelimit;
|
||||
if ( isplayer( self ) )
|
||||
{
|
||||
return scorelimit - maps/mp/gametypes/_globallogic_score::_getplayerscore( self );
|
||||
}
|
||||
else
|
||||
{
|
||||
return scorelimit - getteamscore( team );
|
||||
}
|
||||
}
|
||||
|
||||
getteamscoreforround( team ) //checked matches cerberus output
|
||||
isvalidclass( class )
|
||||
{
|
||||
if ( level.roundscorecarry && isDefined( game[ "lastroundscore" ][ team ] ) )
|
||||
{
|
||||
return getteamscore( team ) - game[ "lastroundscore" ][ team ];
|
||||
}
|
||||
return getteamscore( team );
|
||||
}
|
||||
|
||||
getscoreperminute( team ) //checked matches cerberus output
|
||||
{
|
||||
/*
|
||||
if ( level.oldschool || sessionmodeiszombiesgame() )
|
||||
{
|
||||
/#
|
||||
if ( !isplayer( self ) )
|
||||
{
|
||||
assert( isDefined( team ) );
|
||||
}
|
||||
assert( !isdefined( class ) );
|
||||
#/
|
||||
*/
|
||||
scorelimit = level.scorelimit;
|
||||
timelimit = level.timelimit;
|
||||
minutespassed = ( gettimepassed() / 60000 ) + 0.0001;
|
||||
if ( isplayer( self ) )
|
||||
{
|
||||
return maps/mp/gametypes/_globallogic_score::_getplayerscore( self ) / minutespassed;
|
||||
}
|
||||
else
|
||||
{
|
||||
return getteamscoreforround( team ) / minutespassed;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
return isdefined( class ) && class != "";
|
||||
}
|
||||
|
||||
getestimatedtimeuntilscorelimit( team ) //checked matches cerberus output
|
||||
playtickingsound( gametype_tick_sound )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "stop_ticking" );
|
||||
level endon( "game_ended" );
|
||||
time = level.bombtimer;
|
||||
|
||||
while ( true )
|
||||
{
|
||||
self playsound( gametype_tick_sound );
|
||||
|
||||
if ( time > 10 )
|
||||
{
|
||||
time -= 1;
|
||||
wait 1;
|
||||
}
|
||||
else if ( time > 4 )
|
||||
{
|
||||
time -= 0.5;
|
||||
wait 0.5;
|
||||
}
|
||||
else if ( time > 1 )
|
||||
{
|
||||
time -= 0.4;
|
||||
wait 0.4;
|
||||
}
|
||||
else
|
||||
{
|
||||
time -= 0.3;
|
||||
wait 0.3;
|
||||
}
|
||||
|
||||
maps\mp\gametypes\_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"];
|
||||
game["roundMillisecondsAlreadyPassed"] = undefined;
|
||||
}
|
||||
|
||||
prevtime = gettime();
|
||||
|
||||
while ( game["state"] == "playing" )
|
||||
{
|
||||
if ( !level.timerstopped )
|
||||
game["timepassed"] += gettime() - prevtime;
|
||||
|
||||
prevtime = gettime();
|
||||
wait 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
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 ) );
|
||||
}
|
||||
assert( isplayer( self ) || isdefined( team ) );
|
||||
#/
|
||||
*/
|
||||
scoreperminute = self getscoreperminute( team );
|
||||
scoreremaining = self getscoreremaining( team );
|
||||
if ( !scoreperminute )
|
||||
{
|
||||
return 999999;
|
||||
}
|
||||
return scoreremaining / scoreperminute;
|
||||
scorelimit = level.scorelimit;
|
||||
|
||||
if ( isplayer( self ) )
|
||||
return scorelimit - maps\mp\gametypes\_globallogic_score::_getplayerscore( self );
|
||||
else
|
||||
return scorelimit - getteamscore( team );
|
||||
}
|
||||
|
||||
rumbler() //checked matches cerberus output
|
||||
getteamscoreforround( team )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0.1;
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
}
|
||||
if ( level.roundscorecarry && isdefined( game["lastroundscore"][team] ) )
|
||||
return getteamscore( team ) - game["lastroundscore"][team];
|
||||
|
||||
return getteamscore( team );
|
||||
}
|
||||
|
||||
waitfortimeornotify( time, notifyname ) //checked matches cerberus output
|
||||
getscoreperminute( team )
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait time;
|
||||
}
|
||||
|
||||
waitfortimeornotifynoartillery( time, notifyname ) //checked matches cerberus output
|
||||
{
|
||||
self endon( notifyname );
|
||||
wait time;
|
||||
while ( isDefined( level.artilleryinprogress ) )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( level.artilleryinprogress );
|
||||
assert( isplayer( self ) || isdefined( team ) );
|
||||
#/
|
||||
*/
|
||||
wait 0.25;
|
||||
}
|
||||
scorelimit = level.scorelimit;
|
||||
timelimit = level.timelimit;
|
||||
minutespassed = gettimepassed() / 60000 + 0.0001;
|
||||
|
||||
if ( isplayer( self ) )
|
||||
return maps\mp\gametypes\_globallogic_score::_getplayerscore( self ) / minutespassed;
|
||||
else
|
||||
return getteamscoreforround( team ) / minutespassed;
|
||||
}
|
||||
|
||||
isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) //checked changed to match cerberus output
|
||||
getestimatedtimeuntilscorelimit( team )
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) )
|
||||
{
|
||||
if ( isDefined( einflictor ) || !isDefined( einflictor.controlled ) || einflictor.controlled == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
gethitlocheight( shitloc ) //checked matches cerberus output
|
||||
{
|
||||
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 ) //checked changed to match cerberus output
|
||||
{
|
||||
/*
|
||||
/#
|
||||
for ( i = 0; i < 50; i++ )
|
||||
{
|
||||
line( start, end );
|
||||
wait 0.05;
|
||||
assert( isplayer( self ) || isdefined( team ) );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
scoreperminute = self getscoreperminute( team );
|
||||
scoreremaining = self getscoreremaining( team );
|
||||
|
||||
if ( !scoreperminute )
|
||||
return 999999;
|
||||
|
||||
return scoreremaining / scoreperminute;
|
||||
}
|
||||
|
||||
isexcluded( entity, entitylist ) //checked changed to match cerberus output
|
||||
rumbler()
|
||||
{
|
||||
for ( index = 0; index < entitylist.size; index++ )
|
||||
{
|
||||
if ( entity == entitylist[ index ] )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
self endon( "disconnect" );
|
||||
|
||||
while ( true )
|
||||
{
|
||||
wait 0.1;
|
||||
self playrumbleonentity( "damage_heavy" );
|
||||
}
|
||||
}
|
||||
|
||||
waitfortimeornotifies( desireddelay ) //checked matches cerberus output
|
||||
waitfortimeornotify( time, notifyname )
|
||||
{
|
||||
startedwaiting = getTime();
|
||||
waitedtime = ( getTime() - startedwaiting ) / 1000;
|
||||
if ( waitedtime < desireddelay )
|
||||
{
|
||||
wait ( desireddelay - waitedtime );
|
||||
return desireddelay;
|
||||
}
|
||||
else
|
||||
{
|
||||
return waitedtime;
|
||||
}
|
||||
self endon( notifyname );
|
||||
wait( time );
|
||||
}
|
||||
|
||||
logteamwinstring( wintype, winner ) //checked changed to match cerberus output
|
||||
waitfortimeornotifynoartillery( time, notifyname )
|
||||
{
|
||||
log_string = wintype;
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
log_string = ( log_string + ", win: " ) + winner;
|
||||
}
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
log_string = ( log_string + ", " ) + team + ": " + game[ "teamScores" ][ team ];
|
||||
}
|
||||
logstring( log_string );
|
||||
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 false;
|
||||
|
||||
switch ( smeansofdeath )
|
||||
{
|
||||
case "MOD_MELEE":
|
||||
case "MOD_BAYONET":
|
||||
return false;
|
||||
case "MOD_IMPACT":
|
||||
if ( sweapon != "knife_ballistic_mp" )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) )
|
||||
{
|
||||
if ( !isdefined( einflictor ) || !isdefined( einflictor.controlled ) || einflictor.controlled == 0 )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
gethitlocheight( shitloc )
|
||||
{
|
||||
switch ( shitloc )
|
||||
{
|
||||
case "neck":
|
||||
case "helmet":
|
||||
case "head":
|
||||
return 60;
|
||||
case "torso_upper":
|
||||
case "right_hand":
|
||||
case "right_arm_upper":
|
||||
case "right_arm_lower":
|
||||
case "left_hand":
|
||||
case "left_arm_upper":
|
||||
case "left_arm_lower":
|
||||
case "gun":
|
||||
return 48;
|
||||
case "torso_lower":
|
||||
return 40;
|
||||
case "right_leg_upper":
|
||||
case "left_leg_upper":
|
||||
return 32;
|
||||
case "right_leg_lower":
|
||||
case "left_leg_lower":
|
||||
return 10;
|
||||
case "right_foot":
|
||||
case "left_foot":
|
||||
return 5;
|
||||
}
|
||||
|
||||
return 48;
|
||||
}
|
||||
|
||||
debugline( start, end )
|
||||
{
|
||||
/#
|
||||
for ( i = 0; i < 50; i++ )
|
||||
{
|
||||
line( start, end );
|
||||
wait 0.05;
|
||||
}
|
||||
#/
|
||||
}
|
||||
|
||||
isexcluded( entity, entitylist )
|
||||
{
|
||||
for ( index = 0; index < entitylist.size; index++ )
|
||||
{
|
||||
if ( entity == entitylist[index] )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
log_string = log_string + ", " + team + ": " + game["teamScores"][team];
|
||||
|
||||
logstring( log_string );
|
||||
}
|
||||
|
@ -1,434 +1,364 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_damagefeedback;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/gametypes/_weapons;
|
||||
#include maps/mp/_vehicles;
|
||||
#include maps/mp/gametypes/_class;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
callback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname ) //checked partially changed to match cerberus output partially changed to match beta dump //changed at own discretion
|
||||
callback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname )
|
||||
{
|
||||
if ( level.idflags_radius & idflags )
|
||||
{
|
||||
idamage = maps/mp/gametypes/_class::cac_modified_vehicle_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor );
|
||||
}
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = getTime();
|
||||
if ( game[ "state" ] == "postgame" )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( eattacker ) && isplayer( eattacker ) && !is_true( 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" ];
|
||||
}
|
||||
else
|
||||
{
|
||||
team = self maps/mp/_vehicles::vehicle_get_occupant_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.hardcoremode && isDefined( self.owner ) && isDefined( eattacker.owner ) && self.owner == eattacker.owner )
|
||||
{
|
||||
return;
|
||||
}
|
||||
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/_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 ) && !isDefined( attacker_seat ) )
|
||||
{
|
||||
self.lastdamagewasfromenemy = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
}
|
||||
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/_globallogic_player::dodamagefeedback( sweapon, einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
{
|
||||
eattacker thread maps/mp/gametypes/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
if ( !( level.idflags_radius & idflags ) )
|
||||
idamage = maps\mp\gametypes\_class::cac_modified_vehicle_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor );
|
||||
|
||||
self.idflags = idflags;
|
||||
self.idflagstime = gettime();
|
||||
|
||||
if ( game["state"] == "postgame" )
|
||||
return;
|
||||
|
||||
if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat )
|
||||
return;
|
||||
|
||||
if ( !isdefined( vdir ) )
|
||||
idflags |= level.idflags_no_knockback;
|
||||
|
||||
friendly = 0;
|
||||
|
||||
if ( isdefined( self.maxhealth ) && self.health == self.maxhealth || !isdefined( self.attackers ) )
|
||||
{
|
||||
self.attackers = [];
|
||||
self.attackerdata = [];
|
||||
self.attackerdamage = [];
|
||||
}
|
||||
|
||||
if ( sweapon == "none" && isdefined( einflictor ) )
|
||||
{
|
||||
if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" )
|
||||
sweapon = "explodable_barrel_mp";
|
||||
else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) )
|
||||
sweapon = "destructible_car_mp";
|
||||
}
|
||||
|
||||
if ( !( idflags & level.idflags_no_protection ) )
|
||||
{
|
||||
if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" )
|
||||
{
|
||||
|
||||
}
|
||||
else if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_GRENADE" )
|
||||
{
|
||||
idamage *= getvehicleprojectilescalar( sweapon );
|
||||
idamage = int( idamage );
|
||||
|
||||
if ( idamage == 0 )
|
||||
return;
|
||||
}
|
||||
else if ( smeansofdeath == "MOD_GRENADE_SPLASH" )
|
||||
{
|
||||
idamage *= getvehicleunderneathsplashscalar( sweapon );
|
||||
idamage = int( idamage );
|
||||
|
||||
if ( idamage == 0 )
|
||||
return;
|
||||
}
|
||||
|
||||
idamage *= level.vehicledamagescalar;
|
||||
idamage = int( idamage );
|
||||
|
||||
if ( isplayer( eattacker ) )
|
||||
eattacker.pers["participation"]++;
|
||||
|
||||
prevhealthratio = self.health / self.maxhealth;
|
||||
|
||||
if ( isdefined( self.owner ) && isplayer( self.owner ) )
|
||||
team = self.owner.pers["team"];
|
||||
else
|
||||
team = self maps\mp\_vehicles::vehicle_get_occupant_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.hardcoremode && isdefined( self.owner ) && isdefined( eattacker.owner ) && self.owner == eattacker.owner )
|
||||
return;
|
||||
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\_weapons::checkhit( sweapon );
|
||||
|
||||
if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isdefined( einflictor.iscooked ) )
|
||||
self.wascooked = gettime();
|
||||
else
|
||||
self.wascooked = undefined;
|
||||
|
||||
attacker_seat = undefined;
|
||||
|
||||
if ( isdefined( eattacker ) )
|
||||
attacker_seat = self getoccupantseat( eattacker );
|
||||
|
||||
self.lastdamagewasfromenemy = isdefined( eattacker ) && !isdefined( attacker_seat );
|
||||
self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 );
|
||||
|
||||
if ( level.gametype == "hack" && sweapon != "emp_grenade_mp" )
|
||||
idamage = 0;
|
||||
}
|
||||
|
||||
if ( isdefined( eattacker ) && eattacker != self )
|
||||
{
|
||||
if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( sweapon, einflictor ) )
|
||||
{
|
||||
if ( idamage > 0 )
|
||||
eattacker thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/#
|
||||
if ( getDvarInt( "g_debugDamage" ) )
|
||||
{
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc );
|
||||
if ( getdvarint( "g_debugDamage" ) )
|
||||
println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = "";
|
||||
lpattackerteam = "";
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
lpattacknum = eattacker getentitynumber();
|
||||
lpattackguid = eattacker getguid();
|
||||
lpattackname = eattacker.name;
|
||||
lpattackerteam = eattacker.pers[ "team" ];
|
||||
}
|
||||
else
|
||||
{
|
||||
lpattacknum = -1;
|
||||
lpattackguid = "";
|
||||
lpattackname = "";
|
||||
lpattackerteam = "world";
|
||||
}
|
||||
logprint( "VD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" );
|
||||
}
|
||||
|
||||
if ( 1 )
|
||||
{
|
||||
lpselfnum = self getentitynumber();
|
||||
lpselfteam = "";
|
||||
lpattackerteam = "";
|
||||
|
||||
if ( isplayer( eattacker ) )
|
||||
{
|
||||
lpattacknum = eattacker getentitynumber();
|
||||
lpattackguid = eattacker getguid();
|
||||
lpattackname = eattacker.name;
|
||||
lpattackerteam = eattacker.pers["team"];
|
||||
}
|
||||
else
|
||||
{
|
||||
lpattacknum = -1;
|
||||
lpattackguid = "";
|
||||
lpattackname = "";
|
||||
lpattackerteam = "world";
|
||||
}
|
||||
|
||||
logprint( "VD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" );
|
||||
}
|
||||
}
|
||||
|
||||
callback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ) //checked changed to match beta dump
|
||||
callback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime )
|
||||
{
|
||||
idamage = maps/mp/gametypes/_class::cac_modified_vehicle_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor );
|
||||
finnerdamage = maps/mp/gametypes/_class::cac_modified_vehicle_damage( self, eattacker, finnerdamage, smeansofdeath, sweapon, einflictor );
|
||||
fouterdamage = maps/mp/gametypes/_class::cac_modified_vehicle_damage( self, eattacker, fouterdamage, smeansofdeath, sweapon, einflictor );
|
||||
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 = self maps/mp/_vehicles::vehicle_get_occupant_team();
|
||||
if ( level.teambased && isplayer( eattacker ) && occupant_team == eattacker.pers[ "team" ] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0,5 );
|
||||
if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
}
|
||||
friendly = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.hardcoremode && isDefined( self.owner ) && isDefined( eattacker.owner ) && self.owner == eattacker.owner )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( idamage < 1 )
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
}
|
||||
idamage = maps\mp\gametypes\_class::cac_modified_vehicle_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor );
|
||||
finnerdamage = maps\mp\gametypes\_class::cac_modified_vehicle_damage( self, eattacker, finnerdamage, smeansofdeath, sweapon, einflictor );
|
||||
fouterdamage = maps\mp\gametypes\_class::cac_modified_vehicle_damage( self, eattacker, fouterdamage, smeansofdeath, sweapon, einflictor );
|
||||
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 = self maps\mp\_vehicles::vehicle_get_occupant_team();
|
||||
|
||||
if ( level.teambased && isplayer( eattacker ) && occupant_team == eattacker.pers["team"] )
|
||||
{
|
||||
if ( level.friendlyfire == 0 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 1 )
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 2 )
|
||||
{
|
||||
if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) )
|
||||
return;
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
else if ( level.friendlyfire == 3 )
|
||||
{
|
||||
idamage = int( idamage * 0.5 );
|
||||
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self.lastdamagewasfromenemy = 0;
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
|
||||
friendly = 1;
|
||||
}
|
||||
else if ( !level.hardcoremode && isdefined( self.owner ) && isdefined( eattacker.owner ) && self.owner == eattacker.owner )
|
||||
return;
|
||||
else
|
||||
{
|
||||
if ( idamage < 1 )
|
||||
idamage = 1;
|
||||
|
||||
self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vehiclecrush() //checked matches cerberus output
|
||||
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" );
|
||||
self endon( "disconnect" );
|
||||
|
||||
if ( isdefined( level._effect ) && isdefined( level._effect["tanksquish"] ) )
|
||||
playfx( level._effect["tanksquish"], self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ) );
|
||||
|
||||
self playsound( "chr_crunch" );
|
||||
}
|
||||
|
||||
getvehicleprojectilescalar( sweapon ) //checked matches cerberus output
|
||||
getvehicleprojectilescalar( sweapon )
|
||||
{
|
||||
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
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
return scale;
|
||||
if ( sweapon == "remote_missile_missile_mp" )
|
||||
scale = 10.0;
|
||||
else if ( sweapon == "remote_mortar_missile_mp" )
|
||||
scale = 10.0;
|
||||
else if ( sweapon == "smaw_mp" )
|
||||
scale = 0.2;
|
||||
else if ( sweapon == "fhj18_mp" )
|
||||
scale = 0.2;
|
||||
else
|
||||
scale = 1;
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
getvehicleprojectilesplashscalar( sweapon ) //checked matches cerberus output
|
||||
getvehicleprojectilesplashscalar( sweapon )
|
||||
{
|
||||
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
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
return scale;
|
||||
if ( sweapon == "remote_missile_missile_mp" )
|
||||
scale = 10.0;
|
||||
else if ( sweapon == "remote_mortar_missile_mp" )
|
||||
scale = 4.0;
|
||||
else if ( sweapon == "chopper_minigun_mp" )
|
||||
scale = 0.5;
|
||||
else
|
||||
scale = 1;
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
getvehicleunderneathsplashscalar( sweapon ) //checked matches cerberus output
|
||||
getvehicleunderneathsplashscalar( sweapon )
|
||||
{
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
{
|
||||
scale = 10;
|
||||
scale *= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
return scale;
|
||||
if ( sweapon == "satchel_charge_mp" )
|
||||
{
|
||||
scale = 10.0;
|
||||
scale *= 3.0;
|
||||
}
|
||||
else
|
||||
scale = 1.0;
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
getvehiclebulletdamage( sweapon ) //checked matches cerberus output
|
||||
getvehiclebulletdamage( sweapon )
|
||||
{
|
||||
if ( issubstr( sweapon, "ptrs41_" ) )
|
||||
{
|
||||
idamage = 25;
|
||||
}
|
||||
else if ( issubstr( sweapon, "gunner" ) )
|
||||
{
|
||||
idamage = 5;
|
||||
}
|
||||
else if ( issubstr( sweapon, "mg42_bipod" ) || issubstr( sweapon, "30cal_bipod" ) )
|
||||
{
|
||||
idamage = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
idamage = 1;
|
||||
}
|
||||
return idamage;
|
||||
if ( issubstr( sweapon, "ptrs41_" ) )
|
||||
idamage = 25;
|
||||
else if ( issubstr( sweapon, "gunner" ) )
|
||||
idamage = 5;
|
||||
else if ( issubstr( sweapon, "mg42_bipod" ) || issubstr( sweapon, "30cal_bipod" ) )
|
||||
idamage = 5;
|
||||
else
|
||||
idamage = 1;
|
||||
|
||||
return idamage;
|
||||
}
|
||||
|
||||
allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) //checked matches cerberus output
|
||||
allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon )
|
||||
{
|
||||
if ( isDefined( self.allowfriendlyfiredamageoverride ) )
|
||||
{
|
||||
return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon );
|
||||
}
|
||||
vehicle = eattacker getvehicleoccupied();
|
||||
return 0;
|
||||
}
|
||||
if ( isdefined( self.allowfriendlyfiredamageoverride ) )
|
||||
return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon );
|
||||
|
||||
vehicle = eattacker getvehicleoccupied();
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,277 +1,279 @@
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
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();
|
||||
precacheshader( "overlay_low_health" );
|
||||
level.healthoverlaycutoff = 0.55;
|
||||
regentime = level.playerhealthregentime;
|
||||
level.playerhealth_regularregendelay = regentime * 1000;
|
||||
level.healthregendisabled = level.playerhealth_regularregendelay <= 0;
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerdisconnect();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onplayerspawned();
|
||||
player thread onplayerkilled();
|
||||
player thread onjoinedteam();
|
||||
player thread onjoinedspectators();
|
||||
player thread onplayerdisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam() //checked matches cerberus output
|
||||
onjoinedteam()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedspectators() //checked matches cerberus output
|
||||
onjoinedspectators()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned() //checked matches cerberus output
|
||||
onplayerspawned()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread playerhealthregen();
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled() //checked matches cerberus output
|
||||
onplayerkilled()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect() //checked matches cerberus output
|
||||
onplayerdisconnect()
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
self notify( "end_healthregen" );
|
||||
self waittill( "disconnect" );
|
||||
|
||||
self notify( "end_healthregen" );
|
||||
}
|
||||
|
||||
playerhealthregen() //checked changed to match cerberus output
|
||||
playerhealthregen()
|
||||
{
|
||||
self endon( "end_healthregen" );
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
/*
|
||||
self endon( "end_healthregen" );
|
||||
|
||||
if ( self.health <= 0 )
|
||||
{
|
||||
/#
|
||||
assert( !isalive( self ) );
|
||||
assert( !isalive( self ) );
|
||||
#/
|
||||
*/
|
||||
return;
|
||||
}
|
||||
maxhealth = self.health;
|
||||
oldhealth = maxhealth;
|
||||
player = self;
|
||||
health_add = 0;
|
||||
regenrate = 0.1;
|
||||
usetrueregen = 0;
|
||||
veryhurt = 0;
|
||||
player.breathingstoptime = -10000;
|
||||
thread playerbreathingsound( maxhealth * 0.35 );
|
||||
thread playerheartbeatsound( maxhealth * 0.35 );
|
||||
lastsoundtime_recover = 0;
|
||||
hurttime = 0;
|
||||
newhealth = 0;
|
||||
for ( ;; )
|
||||
{
|
||||
wait 0.05;
|
||||
if ( isDefined( player.regenrate ) )
|
||||
{
|
||||
regenrate = player.regenrate;
|
||||
usetrueregen = 1;
|
||||
}
|
||||
if ( player.health == maxhealth )
|
||||
{
|
||||
veryhurt = 0;
|
||||
self.atbrinkofdeath = 0;
|
||||
continue;
|
||||
}
|
||||
if ( player.health <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( is_true( player.laststand ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
wasveryhurt = veryhurt;
|
||||
ratio = player.health / maxhealth;
|
||||
if ( ratio <= level.healthoverlaycutoff )
|
||||
{
|
||||
veryhurt = 1;
|
||||
self.atbrinkofdeath = 1;
|
||||
if ( !wasveryhurt )
|
||||
{
|
||||
hurttime = getTime();
|
||||
}
|
||||
}
|
||||
if ( player.health >= oldhealth )
|
||||
{
|
||||
regentime = level.playerhealth_regularregendelay;
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
{
|
||||
regentime = int( regentime / getDvarFloat( "perk_healthRegenMultiplier" ) );
|
||||
}
|
||||
if ( ( getTime() - hurttime ) < regentime )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( level.healthregendisabled )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if ( ( getTime() - lastsoundtime_recover ) > regentime )
|
||||
{
|
||||
lastsoundtime_recover = getTime();
|
||||
self notify( "snd_breathing_better" );
|
||||
}
|
||||
if ( veryhurt )
|
||||
{
|
||||
newhealth = ratio;
|
||||
veryhurttime = 3000;
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
{
|
||||
veryhurttime = int( veryhurttime / getDvarFloat( "perk_healthRegenMultiplier" ) );
|
||||
}
|
||||
if ( getTime() > ( hurttime + veryhurttime ) )
|
||||
{
|
||||
newhealth += regenrate;
|
||||
}
|
||||
}
|
||||
else if ( usetrueregen )
|
||||
{
|
||||
newhealth = ratio + regenrate;
|
||||
}
|
||||
else
|
||||
{
|
||||
newhealth = 1;
|
||||
}
|
||||
if ( newhealth >= 1 )
|
||||
{
|
||||
self maps/mp/gametypes/_globallogic_player::resetattackerlist();
|
||||
newhealth = 1;
|
||||
}
|
||||
if ( newhealth <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
player setnormalhealth( newhealth );
|
||||
change = player.health - oldhealth;
|
||||
if ( change > 0 )
|
||||
{
|
||||
player decayplayerdamages( change );
|
||||
}
|
||||
oldhealth = player.health;
|
||||
continue;
|
||||
}
|
||||
oldhealth = player.health;
|
||||
health_add = 0;
|
||||
hurttime = getTime();
|
||||
player.breathingstoptime = hurttime + 6000;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
maxhealth = self.health;
|
||||
oldhealth = maxhealth;
|
||||
player = self;
|
||||
health_add = 0;
|
||||
regenrate = 0.1;
|
||||
usetrueregen = 0;
|
||||
veryhurt = 0;
|
||||
player.breathingstoptime = -10000;
|
||||
thread playerbreathingsound( maxhealth * 0.35 );
|
||||
thread playerheartbeatsound( maxhealth * 0.35 );
|
||||
lastsoundtime_recover = 0;
|
||||
hurttime = 0;
|
||||
newhealth = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
if ( isdefined( player.regenrate ) )
|
||||
{
|
||||
regenrate = player.regenrate;
|
||||
usetrueregen = 1;
|
||||
}
|
||||
|
||||
if ( player.health == maxhealth )
|
||||
{
|
||||
veryhurt = 0;
|
||||
self.atbrinkofdeath = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( player.health <= 0 )
|
||||
return;
|
||||
|
||||
if ( isdefined( player.laststand ) && player.laststand )
|
||||
continue;
|
||||
|
||||
wasveryhurt = veryhurt;
|
||||
ratio = player.health / maxhealth;
|
||||
|
||||
if ( ratio <= level.healthoverlaycutoff )
|
||||
{
|
||||
veryhurt = 1;
|
||||
self.atbrinkofdeath = 1;
|
||||
|
||||
if ( !wasveryhurt )
|
||||
hurttime = gettime();
|
||||
}
|
||||
|
||||
if ( player.health >= oldhealth )
|
||||
{
|
||||
regentime = level.playerhealth_regularregendelay;
|
||||
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
regentime = int( regentime / getdvarfloat( "perk_healthRegenMultiplier" ) );
|
||||
|
||||
if ( gettime() - hurttime < regentime )
|
||||
continue;
|
||||
|
||||
if ( level.healthregendisabled )
|
||||
continue;
|
||||
|
||||
if ( gettime() - lastsoundtime_recover > regentime )
|
||||
{
|
||||
lastsoundtime_recover = gettime();
|
||||
self notify( "snd_breathing_better" );
|
||||
}
|
||||
|
||||
if ( veryhurt )
|
||||
{
|
||||
newhealth = ratio;
|
||||
veryhurttime = 3000;
|
||||
|
||||
if ( player hasperk( "specialty_healthregen" ) )
|
||||
veryhurttime = int( veryhurttime / getdvarfloat( "perk_healthRegenMultiplier" ) );
|
||||
|
||||
if ( gettime() > hurttime + veryhurttime )
|
||||
newhealth += regenrate;
|
||||
}
|
||||
else if ( usetrueregen )
|
||||
newhealth = ratio + regenrate;
|
||||
else
|
||||
newhealth = 1;
|
||||
|
||||
if ( newhealth >= 1.0 )
|
||||
{
|
||||
self maps\mp\gametypes\_globallogic_player::resetattackerlist();
|
||||
newhealth = 1.0;
|
||||
}
|
||||
|
||||
if ( newhealth <= 0 )
|
||||
return;
|
||||
|
||||
player setnormalhealth( newhealth );
|
||||
change = player.health - oldhealth;
|
||||
|
||||
if ( change > 0 )
|
||||
player decayplayerdamages( change );
|
||||
|
||||
oldhealth = player.health;
|
||||
continue;
|
||||
}
|
||||
|
||||
oldhealth = player.health;
|
||||
health_add = 0;
|
||||
hurttime = gettime();
|
||||
player.breathingstoptime = hurttime + 6000;
|
||||
}
|
||||
}
|
||||
|
||||
decayplayerdamages( decay ) //checked partially changed to match cerberus output //continues in for loops bad see github for more info
|
||||
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;
|
||||
}
|
||||
self.attackerdamage[ i ].damage -= decay;
|
||||
if ( self.attackerdamage[ i ].damage < 0 )
|
||||
{
|
||||
self.attackerdamage[ i ].damage = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( !isdefined( self.attackerdamage ) )
|
||||
return;
|
||||
|
||||
for ( i = 0; i < self.attackerdamage.size; i++ )
|
||||
{
|
||||
if ( !isdefined( self.attackerdamage[i] ) || !isdefined( self.attackerdamage[i].damage ) )
|
||||
continue;
|
||||
|
||||
self.attackerdamage[i].damage -= decay;
|
||||
|
||||
if ( self.attackerdamage[i].damage < 0 )
|
||||
self.attackerdamage[i].damage = 0;
|
||||
}
|
||||
}
|
||||
|
||||
playerbreathingsound( healthcap ) //checked changed to match cerberus output
|
||||
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;
|
||||
}
|
||||
player notify( "snd_breathing_hurt" );
|
||||
wait 0.784;
|
||||
wait ( 0.1 + randomfloat( 0.8 ) );
|
||||
}
|
||||
self endon( "end_healthregen" );
|
||||
wait 2;
|
||||
player = self;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.2;
|
||||
|
||||
if ( player.health <= 0 )
|
||||
return;
|
||||
|
||||
if ( player.health >= healthcap )
|
||||
continue;
|
||||
|
||||
if ( level.healthregendisabled && gettime() > player.breathingstoptime )
|
||||
continue;
|
||||
|
||||
player notify( "snd_breathing_hurt" );
|
||||
wait 0.784;
|
||||
wait( 0.1 + randomfloat( 0.8 ) );
|
||||
}
|
||||
}
|
||||
|
||||
playerheartbeatsound( healthcap ) //checked changed to match cerberus output
|
||||
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;
|
||||
}
|
||||
player playlocalsound( "mpl_player_heartbeat" );
|
||||
wait self.hearbeatwait;
|
||||
if ( self.hearbeatwait <= 0.6 )
|
||||
{
|
||||
self.hearbeatwait += 0.1;
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "end_healthregen" );
|
||||
self.hearbeatwait = 0.2;
|
||||
wait 2;
|
||||
player = self;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 0.2;
|
||||
|
||||
if ( player.health <= 0 )
|
||||
return;
|
||||
|
||||
if ( player.health >= healthcap )
|
||||
{
|
||||
self.hearbeatwait = 0.3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( level.healthregendisabled && gettime() > player.breathingstoptime )
|
||||
{
|
||||
self.hearbeatwait = 0.3;
|
||||
continue;
|
||||
}
|
||||
|
||||
player playlocalsound( "mpl_player_heartbeat" );
|
||||
wait( self.hearbeatwait );
|
||||
|
||||
if ( self.hearbeatwait <= 0.6 )
|
||||
self.hearbeatwait += 0.1;
|
||||
}
|
||||
}
|
||||
|
@ -1,366 +1,351 @@
|
||||
#include maps/mp/gametypes/_hud;
|
||||
#include maps/mp/gametypes/_hud_util;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
debug_script_structs() //dev call did not check
|
||||
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." );
|
||||
if ( isdefined( level.struct ) )
|
||||
{
|
||||
println( "*** Num structs " + level.struct.size );
|
||||
println( "" );
|
||||
|
||||
for ( i = 0; i < level.struct.size; i++ )
|
||||
{
|
||||
struct = level.struct[i];
|
||||
|
||||
if ( isdefined( struct.targetname ) )
|
||||
{
|
||||
println( "---" + i + " : " + struct.targetname );
|
||||
continue;
|
||||
}
|
||||
|
||||
println( "---" + i + " : " + "NONE" );
|
||||
}
|
||||
}
|
||||
else
|
||||
println( "*** No structs defined." );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
|
||||
updatetimerpausedness() //checked matches cerberus output
|
||||
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;
|
||||
}
|
||||
shouldbestopped = isdefined( level.hostmigrationtimer );
|
||||
|
||||
if ( !level.timerstopped && shouldbestopped )
|
||||
{
|
||||
level.timerstopped = 1;
|
||||
level.timerpausetime = gettime();
|
||||
}
|
||||
else if ( level.timerstopped && !shouldbestopped )
|
||||
{
|
||||
level.timerstopped = 0;
|
||||
level.discardtime += gettime() - level.timerpausetime;
|
||||
}
|
||||
}
|
||||
|
||||
callback_hostmigrationsave() //checked matches cerberus output
|
||||
callback_hostmigrationsave()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
pausetimer() //checked matches cerberus output
|
||||
pausetimer()
|
||||
{
|
||||
level.migrationtimerpausetime = getTime();
|
||||
level.migrationtimerpausetime = gettime();
|
||||
}
|
||||
|
||||
resumetimer() //checked matches cerberus output
|
||||
resumetimer()
|
||||
{
|
||||
level.discardtime += getTime() - level.migrationtimerpausetime;
|
||||
level.discardtime += gettime() - level.migrationtimerpausetime;
|
||||
}
|
||||
|
||||
locktimer() //checked matches cerberus output
|
||||
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;
|
||||
}
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
currtime = gettime();
|
||||
wait 0.05;
|
||||
|
||||
if ( !level.timerstopped && isdefined( level.discardtime ) )
|
||||
level.discardtime += gettime() - currtime;
|
||||
}
|
||||
}
|
||||
|
||||
callback_hostmigration() //checked changed to match cerberus output
|
||||
callback_hostmigration()
|
||||
{
|
||||
setslowmotion( 1, 1, 0 );
|
||||
makedvarserverinfo( "ui_guncycle", 0 );
|
||||
level.hostmigrationreturnedplayercount = 0;
|
||||
if ( level.inprematchperiod )
|
||||
{
|
||||
level waittill( "prematch_over" );
|
||||
}
|
||||
if ( level.gameended )
|
||||
{
|
||||
/*
|
||||
setslowmotion( 1, 1, 0 );
|
||||
makedvarserverinfo( "ui_guncycle", 0 );
|
||||
level.hostmigrationreturnedplayercount = 0;
|
||||
|
||||
if ( level.inprematchperiod )
|
||||
level waittill( "prematch_over" );
|
||||
|
||||
if ( level.gameended )
|
||||
{
|
||||
/#
|
||||
println( "Migration starting at time " + getTime() + ", but game has ended, so no countdown." );
|
||||
println( "Migration starting at time " + gettime() + ", but game has ended, so no countdown." );
|
||||
#/
|
||||
*/
|
||||
return;
|
||||
}
|
||||
/*
|
||||
return;
|
||||
}
|
||||
|
||||
/#
|
||||
println( "Migration starting at time " + getTime() );
|
||||
println( "Migration starting at time " + gettime() );
|
||||
#/
|
||||
*/
|
||||
level.hostmigrationtimer = 1;
|
||||
sethostmigrationstatus( 1 );
|
||||
level notify( "host_migration_begin" );
|
||||
thread locktimer();
|
||||
players = level.players;
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
player thread hostmigrationtimerthink();
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
hostmigrationwait();
|
||||
level.hostmigrationtimer = undefined;
|
||||
sethostmigrationstatus( 0 );
|
||||
/*
|
||||
level.hostmigrationtimer = 1;
|
||||
sethostmigrationstatus( 1 );
|
||||
level notify( "host_migration_begin" );
|
||||
thread locktimer();
|
||||
players = level.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
player thread hostmigrationtimerthink();
|
||||
}
|
||||
|
||||
level endon( "host_migration_begin" );
|
||||
hostmigrationwait();
|
||||
level.hostmigrationtimer = undefined;
|
||||
sethostmigrationstatus( 0 );
|
||||
/#
|
||||
println( "Migration finished at time " + getTime() );
|
||||
println( "Migration finished at time " + gettime() );
|
||||
#/
|
||||
*/
|
||||
recordmatchbegin();
|
||||
level notify( "host_migration_end" );
|
||||
recordmatchbegin();
|
||||
level notify( "host_migration_end" );
|
||||
}
|
||||
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer ) //checked matches cerberus output
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer )
|
||||
{
|
||||
waittillframeend;
|
||||
visionsetnaked( "mpIntro", 0 );
|
||||
level endon( "match_start_timer_beginning" );
|
||||
while ( counttime > 0 && !level.gameended )
|
||||
{
|
||||
matchstarttimer thread maps/mp/gametypes/_hud::fontpulse( level );
|
||||
wait ( matchstarttimer.inframes * 0.05 );
|
||||
matchstarttimer setvalue( counttime );
|
||||
if ( counttime == 2 )
|
||||
{
|
||||
visionsetnaked( getDvar( "mapname" ), 3 );
|
||||
}
|
||||
counttime--;
|
||||
waittillframeend;
|
||||
visionsetnaked( "mpIntro", 0 );
|
||||
level endon( "match_start_timer_beginning" );
|
||||
|
||||
wait ( 1 - ( matchstarttimer.inframes * 0.05 ) );
|
||||
}
|
||||
while ( counttime > 0 && !level.gameended )
|
||||
{
|
||||
matchstarttimer thread maps\mp\gametypes\_hud::fontpulse( level );
|
||||
wait( matchstarttimer.inframes * 0.05 );
|
||||
matchstarttimer setvalue( counttime );
|
||||
|
||||
if ( counttime == 2 )
|
||||
visionsetnaked( getdvar( "mapname" ), 3.0 );
|
||||
|
||||
counttime--;
|
||||
wait( 1 - matchstarttimer.inframes * 0.05 );
|
||||
}
|
||||
}
|
||||
|
||||
matchstarttimerconsole( type, duration ) //checked matches cerberus output
|
||||
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/_hud::fontpulseinit();
|
||||
counttime = int( duration );
|
||||
if ( counttime >= 2 )
|
||||
{
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer );
|
||||
visionsetnaked( getDvar( "mapname" ), 3 );
|
||||
}
|
||||
else
|
||||
{
|
||||
visionsetnaked( "mpIntro", 0 );
|
||||
visionsetnaked( getDvar( "mapname" ), 1 );
|
||||
}
|
||||
matchstarttimer destroyelem();
|
||||
matchstarttext destroyelem();
|
||||
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\_hud::fontpulseinit();
|
||||
counttime = int( duration );
|
||||
|
||||
if ( counttime >= 2 )
|
||||
{
|
||||
matchstarttimerconsole_internal( counttime, matchstarttimer );
|
||||
visionsetnaked( getdvar( "mapname" ), 3.0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
visionsetnaked( "mpIntro", 0 );
|
||||
visionsetnaked( getdvar( "mapname" ), 1.0 );
|
||||
}
|
||||
|
||||
matchstarttimer destroyelem();
|
||||
matchstarttext destroyelem();
|
||||
}
|
||||
|
||||
hostmigrationwait() //checked matches cerberus output may need to check order of operations
|
||||
hostmigrationwait()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
if ( level.hostmigrationreturnedplayercount < ( ( level.players.size * 2 ) / 3 ) )
|
||||
{
|
||||
thread matchstarttimerconsole( "waiting_for_teams", 20 );
|
||||
hostmigrationwaitforplayers();
|
||||
}
|
||||
level notify( "host_migration_countdown_begin" );
|
||||
thread matchstarttimerconsole( "match_starting_in", 5 );
|
||||
wait 5;
|
||||
level endon( "game_ended" );
|
||||
|
||||
if ( level.hostmigrationreturnedplayercount < level.players.size * 2 / 3 )
|
||||
{
|
||||
thread matchstarttimerconsole( "waiting_for_teams", 20.0 );
|
||||
hostmigrationwaitforplayers();
|
||||
}
|
||||
|
||||
level notify( "host_migration_countdown_begin" );
|
||||
thread matchstarttimerconsole( "match_starting_in", 5.0 );
|
||||
wait 5;
|
||||
}
|
||||
|
||||
waittillhostmigrationcountdown() //checked matches cerberus output
|
||||
waittillhostmigrationcountdown()
|
||||
{
|
||||
level endon( "host_migration_end" );
|
||||
if ( !isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level waittill( "host_migration_countdown_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
|
||||
if ( !isdefined( level.hostmigrationtimer ) )
|
||||
return;
|
||||
|
||||
level waittill( "host_migration_countdown_begin" );
|
||||
}
|
||||
|
||||
hostmigrationwaitforplayers() //checked matches cerberus output
|
||||
hostmigrationwaitforplayers()
|
||||
{
|
||||
level endon( "hostmigration_enoughplayers" );
|
||||
wait 15;
|
||||
level endon( "hostmigration_enoughplayers" );
|
||||
wait 15;
|
||||
}
|
||||
|
||||
hostmigrationtimerthink_internal() //checked matches cerberus output
|
||||
hostmigrationtimerthink_internal()
|
||||
{
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
self.hostmigrationcontrolsfrozen = 0;
|
||||
while ( !isalive( self ) )
|
||||
{
|
||||
self waittill( "spawned" );
|
||||
}
|
||||
self.hostmigrationcontrolsfrozen = 1;
|
||||
self freezecontrols( 1 );
|
||||
level waittill( "host_migration_end" );
|
||||
level endon( "host_migration_begin" );
|
||||
level endon( "host_migration_end" );
|
||||
self.hostmigrationcontrolsfrozen = 0;
|
||||
|
||||
while ( !isalive( self ) )
|
||||
self waittill( "spawned" );
|
||||
|
||||
self.hostmigrationcontrolsfrozen = 1;
|
||||
self freezecontrols( 1 );
|
||||
|
||||
level waittill( "host_migration_end" );
|
||||
}
|
||||
|
||||
hostmigrationtimerthink() //checked matches cerberus output
|
||||
hostmigrationtimerthink()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
level endon( "host_migration_begin" );
|
||||
hostmigrationtimerthink_internal();
|
||||
if ( self.hostmigrationcontrolsfrozen )
|
||||
{
|
||||
self freezecontrols( 0 );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
level endon( "host_migration_begin" );
|
||||
hostmigrationtimerthink_internal();
|
||||
|
||||
if ( self.hostmigrationcontrolsfrozen )
|
||||
self freezecontrols( 0 );
|
||||
}
|
||||
|
||||
waittillhostmigrationdone() //checked matches cerberus output
|
||||
waittillhostmigrationdone()
|
||||
{
|
||||
if ( !isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
starttime = getTime();
|
||||
level waittill( "host_migration_end" );
|
||||
return getTime() - starttime;
|
||||
if ( !isdefined( level.hostmigrationtimer ) )
|
||||
return 0;
|
||||
|
||||
starttime = gettime();
|
||||
|
||||
level waittill( "host_migration_end" );
|
||||
|
||||
return gettime() - starttime;
|
||||
}
|
||||
|
||||
waittillhostmigrationstarts( duration ) //checked matches cerberus output
|
||||
waittillhostmigrationstarts( duration )
|
||||
{
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
level endon( "host_migration_begin" );
|
||||
wait duration;
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
return;
|
||||
|
||||
level endon( "host_migration_begin" );
|
||||
wait( duration );
|
||||
}
|
||||
|
||||
waitlongdurationwithhostmigrationpause( duration ) //checked matches cerberus output may need to check order of operations
|
||||
waitlongdurationwithhostmigrationpause( duration )
|
||||
{
|
||||
if ( duration == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
if ( duration == 0 )
|
||||
return;
|
||||
|
||||
/#
|
||||
assert( duration > 0 );
|
||||
assert( duration > 0 );
|
||||
#/
|
||||
*/
|
||||
starttime = getTime();
|
||||
endtime = getTime() + ( duration * 1000 );
|
||||
while ( getTime() < endtime )
|
||||
{
|
||||
waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 );
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
timepassed = waittillhostmigrationdone();
|
||||
endtime += timepassed;
|
||||
}
|
||||
}
|
||||
/*
|
||||
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 );
|
||||
if ( gettime() != endtime )
|
||||
println( "SCRIPT WARNING: gettime() = " + gettime() + " NOT EQUAL TO endtime = " + endtime );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
waittillhostmigrationdone();
|
||||
return getTime() - starttime;
|
||||
waittillhostmigrationdone();
|
||||
return gettime() - starttime;
|
||||
}
|
||||
|
||||
waitlongdurationwithhostmigrationpauseemp( duration ) //checked matches cerberus output may need to check order of operations
|
||||
waitlongdurationwithhostmigrationpauseemp( duration )
|
||||
{
|
||||
if ( duration == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
if ( duration == 0 )
|
||||
return;
|
||||
|
||||
/#
|
||||
assert( duration > 0 );
|
||||
assert( duration > 0 );
|
||||
#/
|
||||
*/
|
||||
starttime = getTime();
|
||||
empendtime = getTime() + ( duration * 1000 );
|
||||
level.empendtime = empendtime;
|
||||
while ( getTime() < empendtime )
|
||||
{
|
||||
waittillhostmigrationstarts( ( empendtime - getTime() ) / 1000 );
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
timepassed = waittillhostmigrationdone();
|
||||
if ( isDefined( empendtime ) )
|
||||
{
|
||||
empendtime += timepassed;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
starttime = gettime();
|
||||
empendtime = gettime() + duration * 1000;
|
||||
level.empendtime = empendtime;
|
||||
|
||||
while ( gettime() < empendtime )
|
||||
{
|
||||
waittillhostmigrationstarts( ( empendtime - gettime() ) / 1000 );
|
||||
|
||||
if ( isdefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
timepassed = waittillhostmigrationdone();
|
||||
|
||||
if ( isdefined( empendtime ) )
|
||||
empendtime += timepassed;
|
||||
}
|
||||
}
|
||||
|
||||
/#
|
||||
if ( getTime() != empendtime )
|
||||
{
|
||||
println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO empendtime = " + empendtime );
|
||||
if ( gettime() != empendtime )
|
||||
println( "SCRIPT WARNING: gettime() = " + gettime() + " NOT EQUAL TO empendtime = " + empendtime );
|
||||
#/
|
||||
}
|
||||
*/
|
||||
waittillhostmigrationdone();
|
||||
level.empendtime = undefined;
|
||||
return getTime() - starttime;
|
||||
waittillhostmigrationdone();
|
||||
level.empendtime = undefined;
|
||||
return gettime() - starttime;
|
||||
}
|
||||
|
||||
waitlongdurationwithgameendtimeupdate( duration ) //checked matches cerberus output may need to check order of operations
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
@ -1,173 +1,175 @@
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked changed to match cerberus output
|
||||
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;
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
level.hud[ team ] = spawnstruct();
|
||||
}
|
||||
level.primaryprogressbary = -61;
|
||||
level.primaryprogressbarx = 0;
|
||||
level.primaryprogressbarheight = 9;
|
||||
level.primaryprogressbarwidth = 120;
|
||||
level.primaryprogressbartexty = -75;
|
||||
level.primaryprogressbartextx = 0;
|
||||
level.primaryprogressbarfontsize = 1.4;
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.primaryprogressbarx = 20;
|
||||
level.primaryprogressbartextx = 20;
|
||||
level.primaryprogressbary = 15;
|
||||
level.primaryprogressbartexty = 0;
|
||||
level.primaryprogressbarheight = 2;
|
||||
}
|
||||
level.secondaryprogressbary = -85;
|
||||
level.secondaryprogressbarx = 0;
|
||||
level.secondaryprogressbarheight = 9;
|
||||
level.secondaryprogressbarwidth = 120;
|
||||
level.secondaryprogressbartexty = -100;
|
||||
level.secondaryprogressbartextx = 0;
|
||||
level.secondaryprogressbarfontsize = 1.4;
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.secondaryprogressbarx = 20;
|
||||
level.secondaryprogressbartextx = 20;
|
||||
level.secondaryprogressbary = 15;
|
||||
level.secondaryprogressbartexty = 0;
|
||||
level.secondaryprogressbarheight = 2;
|
||||
}
|
||||
level.teamprogressbary = 32;
|
||||
level.teamprogressbarheight = 14;
|
||||
level.teamprogressbarwidth = 192;
|
||||
level.teamprogressbartexty = 8;
|
||||
level.teamprogressbarfontsize = 1.65;
|
||||
setdvar( "ui_generic_status_bar", 0 );
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.lowertextyalign = "BOTTOM";
|
||||
level.lowertexty = -42;
|
||||
level.lowertextfontsize = 1.4;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.lowertextyalign = "CENTER";
|
||||
level.lowertexty = 40;
|
||||
level.lowertextfontsize = 1.4;
|
||||
}
|
||||
precacheshader( "progress_bar_bg" );
|
||||
precacheshader( "progress_bar_fg" );
|
||||
precacheshader( "progress_bar_fill" );
|
||||
precacheshader( "score_bar_bg" );
|
||||
level.uiparent = spawnstruct();
|
||||
level.uiparent.horzalign = "left";
|
||||
level.uiparent.vertalign = "top";
|
||||
level.uiparent.alignx = "left";
|
||||
level.uiparent.aligny = "top";
|
||||
level.uiparent.x = 0;
|
||||
level.uiparent.y = 0;
|
||||
level.uiparent.width = 0;
|
||||
level.uiparent.height = 0;
|
||||
level.uiparent.children = [];
|
||||
level.fontheight = 12;
|
||||
|
||||
foreach ( team in level.teams )
|
||||
level.hud[team] = spawnstruct();
|
||||
|
||||
level.primaryprogressbary = -61;
|
||||
level.primaryprogressbarx = 0;
|
||||
level.primaryprogressbarheight = 9;
|
||||
level.primaryprogressbarwidth = 120;
|
||||
level.primaryprogressbartexty = -75;
|
||||
level.primaryprogressbartextx = 0;
|
||||
level.primaryprogressbarfontsize = 1.4;
|
||||
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.primaryprogressbarx = 20;
|
||||
level.primaryprogressbartextx = 20;
|
||||
level.primaryprogressbary = 15;
|
||||
level.primaryprogressbartexty = 0;
|
||||
level.primaryprogressbarheight = 2;
|
||||
}
|
||||
|
||||
level.secondaryprogressbary = -85;
|
||||
level.secondaryprogressbarx = 0;
|
||||
level.secondaryprogressbarheight = 9;
|
||||
level.secondaryprogressbarwidth = 120;
|
||||
level.secondaryprogressbartexty = -100;
|
||||
level.secondaryprogressbartextx = 0;
|
||||
level.secondaryprogressbarfontsize = 1.4;
|
||||
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.secondaryprogressbarx = 20;
|
||||
level.secondaryprogressbartextx = 20;
|
||||
level.secondaryprogressbary = 15;
|
||||
level.secondaryprogressbartexty = 0;
|
||||
level.secondaryprogressbarheight = 2;
|
||||
}
|
||||
|
||||
level.teamprogressbary = 32;
|
||||
level.teamprogressbarheight = 14;
|
||||
level.teamprogressbarwidth = 192;
|
||||
level.teamprogressbartexty = 8;
|
||||
level.teamprogressbarfontsize = 1.65;
|
||||
setdvar( "ui_generic_status_bar", 0 );
|
||||
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.lowertextyalign = "BOTTOM";
|
||||
level.lowertexty = -42;
|
||||
level.lowertextfontsize = 1.4;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.lowertextyalign = "CENTER";
|
||||
level.lowertexty = 40;
|
||||
level.lowertextfontsize = 1.4;
|
||||
}
|
||||
}
|
||||
|
||||
fontpulseinit() //checked matches cerberus output
|
||||
fontpulseinit()
|
||||
{
|
||||
self.basefontscale = self.fontscale;
|
||||
self.maxfontscale = self.fontscale * 2;
|
||||
self.inframes = 1.5;
|
||||
self.outframes = 3;
|
||||
self.basefontscale = self.fontscale;
|
||||
self.maxfontscale = self.fontscale * 2;
|
||||
self.inframes = 1.5;
|
||||
self.outframes = 3;
|
||||
}
|
||||
|
||||
fontpulse( player ) //checked matches cerberus output
|
||||
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;
|
||||
}
|
||||
self notify( "fontPulse" );
|
||||
self endon( "fontPulse" );
|
||||
self endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
player endon( "joined_team" );
|
||||
player endon( "joined_spectators" );
|
||||
|
||||
if ( self.outframes == 0 )
|
||||
self.fontscale = 0.01;
|
||||
else
|
||||
self.fontscale = self.fontscale;
|
||||
|
||||
if ( self.inframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.inframes * 0.05 );
|
||||
self.fontscale = self.maxfontscale;
|
||||
wait( self.inframes * 0.05 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.fontscale = self.maxfontscale;
|
||||
self.alpha = 0;
|
||||
self fadeovertime( self.outframes * 0.05 );
|
||||
self.alpha = 1;
|
||||
}
|
||||
|
||||
if ( self.outframes > 0 )
|
||||
{
|
||||
self changefontscaleovertime( self.outframes * 0.05 );
|
||||
self.fontscale = self.basefontscale;
|
||||
}
|
||||
}
|
||||
|
||||
fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername ) //checked matches cerberus output
|
||||
fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername )
|
||||
{
|
||||
wait startwait;
|
||||
if ( !isDefined( self ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen = newclienthudelem( self );
|
||||
}
|
||||
self.blackscreen.x = 0;
|
||||
self.blackscreen.y = 0;
|
||||
self.blackscreen.horzalign = "fullscreen";
|
||||
self.blackscreen.vertalign = "fullscreen";
|
||||
self.blackscreen.foreground = 0;
|
||||
self.blackscreen.hidewhendead = 0;
|
||||
self.blackscreen.hidewheninmenu = 1;
|
||||
self.blackscreen.immunetodemogamehudsettings = 1;
|
||||
self.blackscreen.sort = 50;
|
||||
if ( isDefined( shadername ) )
|
||||
{
|
||||
self.blackscreen setshader( shadername, 640, 480 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.blackscreen setshader( "black", 640, 480 );
|
||||
}
|
||||
self.blackscreen.alpha = 0;
|
||||
if ( fadeintime > 0 )
|
||||
{
|
||||
self.blackscreen fadeovertime( fadeintime );
|
||||
}
|
||||
self.blackscreen.alpha = 1;
|
||||
wait fadeintime;
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait blackscreenwait;
|
||||
if ( !isDefined( self.blackscreen ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( fadeouttime > 0 )
|
||||
{
|
||||
self.blackscreen fadeovertime( fadeouttime );
|
||||
}
|
||||
self.blackscreen.alpha = 0;
|
||||
wait fadeouttime;
|
||||
if ( isDefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen destroy();
|
||||
self.blackscreen = undefined;
|
||||
}
|
||||
}
|
||||
wait( startwait );
|
||||
|
||||
if ( !isdefined( self ) )
|
||||
return;
|
||||
|
||||
if ( !isdefined( self.blackscreen ) )
|
||||
self.blackscreen = newclienthudelem( self );
|
||||
|
||||
self.blackscreen.x = 0;
|
||||
self.blackscreen.y = 0;
|
||||
self.blackscreen.horzalign = "fullscreen";
|
||||
self.blackscreen.vertalign = "fullscreen";
|
||||
self.blackscreen.foreground = 0;
|
||||
self.blackscreen.hidewhendead = 0;
|
||||
self.blackscreen.hidewheninmenu = 1;
|
||||
self.blackscreen.immunetodemogamehudsettings = 1;
|
||||
self.blackscreen.sort = 50;
|
||||
|
||||
if ( isdefined( shadername ) )
|
||||
self.blackscreen setshader( shadername, 640, 480 );
|
||||
else
|
||||
self.blackscreen setshader( "black", 640, 480 );
|
||||
|
||||
self.blackscreen.alpha = 0;
|
||||
|
||||
if ( fadeintime > 0 )
|
||||
self.blackscreen fadeovertime( fadeintime );
|
||||
|
||||
self.blackscreen.alpha = 1;
|
||||
wait( fadeintime );
|
||||
|
||||
if ( !isdefined( self.blackscreen ) )
|
||||
return;
|
||||
|
||||
wait( blackscreenwait );
|
||||
|
||||
if ( !isdefined( self.blackscreen ) )
|
||||
return;
|
||||
|
||||
if ( fadeouttime > 0 )
|
||||
self.blackscreen fadeovertime( fadeouttime );
|
||||
|
||||
self.blackscreen.alpha = 0;
|
||||
wait( fadeouttime );
|
||||
|
||||
if ( isdefined( self.blackscreen ) )
|
||||
{
|
||||
self.blackscreen destroy();
|
||||
self.blackscreen = undefined;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,167 +1,174 @@
|
||||
#include maps/mp/gametypes/_rank;
|
||||
#include maps/mp/gametypes/_globallogic;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked changed to match cerberus output
|
||||
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";
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
game[ "menu_changeclass_" + team ] = "changeclass";
|
||||
}
|
||||
game[ "menu_controls" ] = "ingame_controls";
|
||||
game[ "menu_options" ] = "ingame_options";
|
||||
game[ "menu_leavegame" ] = "popup_leavegame";
|
||||
precachemenu( game[ "menu_controls" ] );
|
||||
precachemenu( game[ "menu_options" ] );
|
||||
precachemenu( game[ "menu_leavegame" ] );
|
||||
precachemenu( "scoreboard" );
|
||||
precachemenu( "spectate" );
|
||||
precachemenu( game[ "menu_team" ] );
|
||||
precachemenu( game[ "menu_changeclass_allies" ] );
|
||||
precachemenu( game[ "menu_initteam_allies" ] );
|
||||
precachemenu( game[ "menu_changeclass_axis" ] );
|
||||
precachemenu( game[ "menu_class" ] );
|
||||
precachemenu( game[ "menu_changeclass" ] );
|
||||
precachemenu( game[ "menu_initteam_axis" ] );
|
||||
precachemenu( game[ "menu_changeclass_offline" ] );
|
||||
precachemenu( game[ "menu_changeclass_wager" ] );
|
||||
precachemenu( game[ "menu_changeclass_custom" ] );
|
||||
precachemenu( game[ "menu_changeclass_barebones" ] );
|
||||
precachemenu( game[ "menu_wager_side_bet" ] );
|
||||
precachemenu( game[ "menu_wager_side_bet_player" ] );
|
||||
precachestring( &"MP_HOST_ENDED_GAME" );
|
||||
precachestring( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
level thread onplayerconnect();
|
||||
precachestring( &"open_ingame_menu" );
|
||||
game["menu_team"] = "team_marinesopfor";
|
||||
game["menu_initteam_allies"] = "initteam_marines";
|
||||
game["menu_initteam_axis"] = "initteam_opfor";
|
||||
game["menu_class"] = "class";
|
||||
game["menu_changeclass"] = "changeclass";
|
||||
game["menu_changeclass_offline"] = "changeclass";
|
||||
game["menu_wager_side_bet"] = "sidebet";
|
||||
game["menu_wager_side_bet_player"] = "sidebet_player";
|
||||
game["menu_changeclass_wager"] = "changeclass_wager";
|
||||
game["menu_changeclass_custom"] = "changeclass_custom";
|
||||
game["menu_changeclass_barebones"] = "changeclass_barebones";
|
||||
|
||||
foreach ( team in level.teams )
|
||||
game["menu_changeclass_" + team] = "changeclass";
|
||||
|
||||
game["menu_controls"] = "ingame_controls";
|
||||
game["menu_options"] = "ingame_options";
|
||||
game["menu_leavegame"] = "popup_leavegame";
|
||||
precachemenu( game["menu_controls"] );
|
||||
precachemenu( game["menu_options"] );
|
||||
precachemenu( game["menu_leavegame"] );
|
||||
precachemenu( "scoreboard" );
|
||||
precachemenu( "spectate" );
|
||||
precachemenu( game["menu_team"] );
|
||||
precachemenu( game["menu_changeclass_allies"] );
|
||||
precachemenu( game["menu_initteam_allies"] );
|
||||
precachemenu( game["menu_changeclass_axis"] );
|
||||
precachemenu( game["menu_class"] );
|
||||
precachemenu( game["menu_changeclass"] );
|
||||
precachemenu( game["menu_initteam_axis"] );
|
||||
precachemenu( game["menu_changeclass_offline"] );
|
||||
precachemenu( game["menu_changeclass_wager"] );
|
||||
precachemenu( game["menu_changeclass_custom"] );
|
||||
precachemenu( game["menu_changeclass_barebones"] );
|
||||
precachemenu( game["menu_wager_side_bet"] );
|
||||
precachemenu( game["menu_wager_side_bet_player"] );
|
||||
precachestring( &"MP_HOST_ENDED_GAME" );
|
||||
precachestring( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
level thread onplayerconnect();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
player thread onmenuresponse();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connecting", player );
|
||||
|
||||
player thread onmenuresponse();
|
||||
}
|
||||
}
|
||||
|
||||
onmenuresponse() //checked changed to match cerberus output
|
||||
onmenuresponse()
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "menuresponse", menu, response );
|
||||
if ( response == "back" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
if ( level.console )
|
||||
{
|
||||
if ( menu == game[ "menu_changeclass" ] || menu == game[ "menu_changeclass_offline" ] || menu == game[ "menu_team" ] || menu == game[ "menu_controls" ] )
|
||||
{
|
||||
if ( isDefined( level.teams[ self.pers[ "team" ] ] ) )
|
||||
{
|
||||
self openmenu( game[ "menu_class" ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( response == "changeteam" && level.allow_teamchange == "1" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self openmenu( game[ "menu_team" ] );
|
||||
}
|
||||
if ( response == "changeclass_marines_splitscreen" )
|
||||
{
|
||||
self openmenu( "changeclass_marines_splitscreen" );
|
||||
}
|
||||
if ( response == "changeclass_opfor_splitscreen" )
|
||||
{
|
||||
self openmenu( "changeclass_opfor_splitscreen" );
|
||||
}
|
||||
if ( response == "endgame" )
|
||||
{
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.skipvote = 1;
|
||||
if ( !level.gameended )
|
||||
{
|
||||
level thread maps/mp/gametypes/_globallogic::forceend();
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( response == "killserverpc" )
|
||||
{
|
||||
level thread maps/mp/gametypes/_globallogic::killserverpc();
|
||||
continue;
|
||||
}
|
||||
if ( response == "endround" )
|
||||
{
|
||||
if ( !level.gameended )
|
||||
{
|
||||
self gamehistoryplayerquit();
|
||||
level thread maps/mp/gametypes/_globallogic::forceend();
|
||||
}
|
||||
else
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self iprintln( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( menu == game[ "menu_team" ] && level.allow_teamchange == "1" )
|
||||
{
|
||||
switch( response )
|
||||
{
|
||||
case "autoassign":
|
||||
self [[ level.autoassign ]]( 1 );
|
||||
break;
|
||||
case "spectator":
|
||||
self [[ level.spectator ]]();
|
||||
break;
|
||||
default:
|
||||
self [[ level.teammenu ]]( response );
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ( menu == game[ "menu_changeclass" ] || menu == game[ "menu_changeclass_offline" ] || menu == game[ "menu_changeclass_wager" ] || menu == game[ "menu_changeclass_custom" ] || menu == game[ "menu_changeclass_barebones" ] )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
if ( level.rankedmatch && issubstr( response, "custom" ) )
|
||||
{
|
||||
if ( self isitemlocked( maps/mp/gametypes/_rank::getitemindex( "feature_cac" ) ) )
|
||||
{
|
||||
kick( self getentitynumber() );
|
||||
}
|
||||
}
|
||||
self.selectedclass = 1;
|
||||
self [[ level.class ]]( response );
|
||||
continue;
|
||||
}
|
||||
if ( menu == "spectate" )
|
||||
{
|
||||
player = getplayerfromclientnum( int( response ) );
|
||||
if ( isDefined( player ) )
|
||||
{
|
||||
self setcurrentspectatorclient( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "menuresponse", menu, response );
|
||||
|
||||
if ( response == "back" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
|
||||
if ( level.console )
|
||||
{
|
||||
if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_team"] || menu == game["menu_controls"] )
|
||||
{
|
||||
if ( isdefined( level.teams[self.pers["team"]] ) )
|
||||
self openmenu( game["menu_class"] );
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( response == "changeteam" && level.allow_teamchange == "1" )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self openmenu( game["menu_team"] );
|
||||
}
|
||||
|
||||
if ( response == "changeclass_marines_splitscreen" )
|
||||
self openmenu( "changeclass_marines_splitscreen" );
|
||||
|
||||
if ( response == "changeclass_opfor_splitscreen" )
|
||||
self openmenu( "changeclass_opfor_splitscreen" );
|
||||
|
||||
if ( response == "endgame" )
|
||||
{
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.skipvote = 1;
|
||||
|
||||
if ( !level.gameended )
|
||||
level thread maps\mp\gametypes\_globallogic::forceend();
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( response == "killserverpc" )
|
||||
{
|
||||
level thread maps\mp\gametypes\_globallogic::killserverpc();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( response == "endround" )
|
||||
{
|
||||
if ( !level.gameended )
|
||||
{
|
||||
self gamehistoryplayerquit();
|
||||
level thread maps\mp\gametypes\_globallogic::forceend();
|
||||
}
|
||||
else
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
self iprintln( &"MP_HOST_ENDGAME_RESPONSE" );
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( menu == game["menu_team"] && level.allow_teamchange == "1" )
|
||||
{
|
||||
switch ( response )
|
||||
{
|
||||
case "autoassign":
|
||||
self [[ level.autoassign ]]( 1 );
|
||||
break;
|
||||
case "spectator":
|
||||
self [[ level.spectator ]]();
|
||||
break;
|
||||
default:
|
||||
self [[ level.teammenu ]]( response );
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_changeclass_wager"] || menu == game["menu_changeclass_custom"] || menu == game["menu_changeclass_barebones"] )
|
||||
{
|
||||
self closemenu();
|
||||
self closeingamemenu();
|
||||
|
||||
if ( level.rankedmatch && issubstr( response, "custom" ) )
|
||||
{
|
||||
if ( self isitemlocked( maps\mp\gametypes\_rank::getitemindex( "feature_cac" ) ) )
|
||||
kick( self getentitynumber() );
|
||||
}
|
||||
|
||||
self.selectedclass = 1;
|
||||
self [[ level.class ]]( response );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( menu == "spectate" )
|
||||
{
|
||||
player = getplayerfromclientnum( int( response ) );
|
||||
|
||||
if ( isdefined( player ) )
|
||||
self setcurrentspectatorclient( player );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,185 +1,156 @@
|
||||
//checked includes match cerberus output
|
||||
#include maps/mp/gametypes/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
precacheshader( "objpoint_default" );
|
||||
level.objpointnames = [];
|
||||
level.objpoints = [];
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
level.objpointsize = 15;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.objpointsize = 8;
|
||||
}
|
||||
level.objpoint_alpha_default = 0.5;
|
||||
level.objpointscale = 1;
|
||||
precacheshader( "objpoint_default" );
|
||||
level.objpointnames = [];
|
||||
level.objpoints = [];
|
||||
|
||||
if ( level.splitscreen )
|
||||
level.objpointsize = 15;
|
||||
else
|
||||
level.objpointsize = 8;
|
||||
|
||||
level.objpoint_alpha_default = 0.5;
|
||||
level.objpointscale = 1.0;
|
||||
}
|
||||
|
||||
createteamobjpoint( name, origin, team, shader, alpha, scale ) //checked matches cerberus output
|
||||
createteamobjpoint( name, origin, team, shader, alpha, scale )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( !isDefined( level.teams[ team ] ) )
|
||||
{
|
||||
assert( team == "all" );
|
||||
}
|
||||
assert( isdefined( level.teams[team] ) || team == "all" );
|
||||
#/
|
||||
*/
|
||||
objpoint = getobjpointbyname( name );
|
||||
if ( isDefined( objpoint ) )
|
||||
{
|
||||
deleteobjpoint( objpoint );
|
||||
}
|
||||
if ( !isDefined( shader ) )
|
||||
{
|
||||
shader = "objpoint_default";
|
||||
}
|
||||
if ( !isDefined( scale ) )
|
||||
{
|
||||
scale = 1;
|
||||
}
|
||||
if ( team != "all" )
|
||||
{
|
||||
objpoint = newteamhudelem( team );
|
||||
}
|
||||
else
|
||||
{
|
||||
objpoint = newhudelem();
|
||||
}
|
||||
objpoint.name = name;
|
||||
objpoint.x = origin[ 0 ];
|
||||
objpoint.y = origin[ 1 ];
|
||||
objpoint.z = origin[ 2 ];
|
||||
objpoint.team = team;
|
||||
objpoint.isflashing = 0;
|
||||
objpoint.isshown = 1;
|
||||
objpoint.fadewhentargeted = 1;
|
||||
objpoint.archived = 0;
|
||||
objpoint setshader( shader, level.objpointsize, level.objpointsize );
|
||||
objpoint setwaypoint( 1 );
|
||||
if ( isDefined( alpha ) )
|
||||
{
|
||||
objpoint.alpha = alpha;
|
||||
}
|
||||
else
|
||||
{
|
||||
objpoint.alpha = level.objpoint_alpha_default;
|
||||
}
|
||||
objpoint.basealpha = objpoint.alpha;
|
||||
objpoint.index = level.objpointnames.size;
|
||||
level.objpoints[ name ] = objpoint;
|
||||
level.objpointnames[ level.objpointnames.size ] = name;
|
||||
return objpoint;
|
||||
objpoint = getobjpointbyname( name );
|
||||
|
||||
if ( isdefined( objpoint ) )
|
||||
deleteobjpoint( objpoint );
|
||||
|
||||
if ( !isdefined( shader ) )
|
||||
shader = "objpoint_default";
|
||||
|
||||
if ( !isdefined( scale ) )
|
||||
scale = 1.0;
|
||||
|
||||
if ( team != "all" )
|
||||
objpoint = newteamhudelem( team );
|
||||
else
|
||||
objpoint = newhudelem();
|
||||
|
||||
objpoint.name = name;
|
||||
objpoint.x = origin[0];
|
||||
objpoint.y = origin[1];
|
||||
objpoint.z = origin[2];
|
||||
objpoint.team = team;
|
||||
objpoint.isflashing = 0;
|
||||
objpoint.isshown = 1;
|
||||
objpoint.fadewhentargeted = 1;
|
||||
objpoint.archived = 0;
|
||||
objpoint setshader( shader, level.objpointsize, level.objpointsize );
|
||||
objpoint setwaypoint( 1 );
|
||||
|
||||
if ( isdefined( alpha ) )
|
||||
objpoint.alpha = alpha;
|
||||
else
|
||||
objpoint.alpha = level.objpoint_alpha_default;
|
||||
|
||||
objpoint.basealpha = objpoint.alpha;
|
||||
objpoint.index = level.objpointnames.size;
|
||||
level.objpoints[name] = objpoint;
|
||||
level.objpointnames[level.objpointnames.size] = name;
|
||||
return objpoint;
|
||||
}
|
||||
|
||||
deleteobjpoint( oldobjpoint ) //checked changed to match cerberus output
|
||||
deleteobjpoint( oldobjpoint )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( level.objpoints.size == level.objpointnames.size );
|
||||
assert( level.objpoints.size == level.objpointnames.size );
|
||||
#/
|
||||
*/
|
||||
if ( level.objpoints.size == 1 )
|
||||
{
|
||||
/*
|
||||
|
||||
if ( level.objpoints.size == 1 )
|
||||
{
|
||||
/#
|
||||
assert( level.objpointnames[ 0 ] == oldobjpoint.name );
|
||||
assert( level.objpointnames[0] == oldobjpoint.name );
|
||||
#/
|
||||
/#
|
||||
assert( isDefined( level.objpoints[ oldobjpoint.name ] ) );
|
||||
assert( isdefined( level.objpoints[oldobjpoint.name] ) );
|
||||
#/
|
||||
*/
|
||||
level.objpoints = [];
|
||||
level.objpointnames = [];
|
||||
oldobjpoint destroy();
|
||||
return;
|
||||
}
|
||||
newindex = oldobjpoint.index;
|
||||
oldindex = level.objpointnames.size - 1;
|
||||
objpoint = getobjpointbyindex( oldindex );
|
||||
level.objpointnames[ newindex ] = objpoint.name;
|
||||
objpoint.index = newindex;
|
||||
level.objpointnames[oldindex] = undefined;
|
||||
level.objpoints[oldobjpoint.name] = undefined;
|
||||
oldobjpoint destroy();
|
||||
level.objpoints = [];
|
||||
level.objpointnames = [];
|
||||
oldobjpoint destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
newindex = oldobjpoint.index;
|
||||
oldindex = level.objpointnames.size - 1;
|
||||
objpoint = getobjpointbyindex( oldindex );
|
||||
level.objpointnames[newindex] = objpoint.name;
|
||||
objpoint.index = newindex;
|
||||
level.objpointnames[oldindex] = undefined;
|
||||
level.objpoints[oldobjpoint.name] = undefined;
|
||||
oldobjpoint destroy();
|
||||
}
|
||||
|
||||
updateorigin( origin ) //checked matches cerberus output
|
||||
updateorigin( origin )
|
||||
{
|
||||
if ( self.x != origin[ 0 ] )
|
||||
{
|
||||
self.x = origin[ 0 ];
|
||||
}
|
||||
if ( self.y != origin[ 1 ] )
|
||||
{
|
||||
self.y = origin[ 1 ];
|
||||
}
|
||||
if ( self.z != origin[ 2 ] )
|
||||
{
|
||||
self.z = origin[ 2 ];
|
||||
}
|
||||
if ( self.x != origin[0] )
|
||||
self.x = origin[0];
|
||||
|
||||
if ( self.y != origin[1] )
|
||||
self.y = origin[1];
|
||||
|
||||
if ( self.z != origin[2] )
|
||||
self.z = origin[2];
|
||||
}
|
||||
|
||||
setoriginbyname( name, origin ) //checked matches cerberus output
|
||||
setoriginbyname( name, origin )
|
||||
{
|
||||
objpoint = getobjpointbyname( name );
|
||||
objpoint updateorigin( origin );
|
||||
objpoint = getobjpointbyname( name );
|
||||
objpoint updateorigin( origin );
|
||||
}
|
||||
|
||||
getobjpointbyname( name ) //checked matches cerberus output
|
||||
getobjpointbyname( name )
|
||||
{
|
||||
if ( isDefined( level.objpoints[ name ] ) )
|
||||
{
|
||||
return level.objpoints[ name ];
|
||||
}
|
||||
else
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( isdefined( level.objpoints[name] ) )
|
||||
return level.objpoints[name];
|
||||
else
|
||||
return undefined;
|
||||
}
|
||||
|
||||
getobjpointbyindex( index ) //checked matches cerberus output
|
||||
getobjpointbyindex( index )
|
||||
{
|
||||
if ( isDefined( level.objpointnames[ index ] ) )
|
||||
{
|
||||
return level.objpoints[ level.objpointnames[ index ] ];
|
||||
}
|
||||
else
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
if ( isdefined( level.objpointnames[index] ) )
|
||||
return level.objpoints[level.objpointnames[index]];
|
||||
else
|
||||
return undefined;
|
||||
}
|
||||
|
||||
startflashing() //checked matches cerberus output
|
||||
startflashing()
|
||||
{
|
||||
self endon( "stop_flashing_thread" );
|
||||
if ( self.isflashing )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.isflashing = 1;
|
||||
while ( self.isflashing )
|
||||
{
|
||||
self fadeovertime( 0.75 );
|
||||
self.alpha = 0.35 * self.basealpha;
|
||||
wait 0.75;
|
||||
self fadeovertime( 0.75 );
|
||||
self.alpha = self.basealpha;
|
||||
wait 0.75;
|
||||
}
|
||||
self.alpha = self.basealpha;
|
||||
self endon( "stop_flashing_thread" );
|
||||
|
||||
if ( self.isflashing )
|
||||
return;
|
||||
|
||||
self.isflashing = 1;
|
||||
|
||||
while ( self.isflashing )
|
||||
{
|
||||
self fadeovertime( 0.75 );
|
||||
self.alpha = 0.35 * self.basealpha;
|
||||
wait 0.75;
|
||||
self fadeovertime( 0.75 );
|
||||
self.alpha = self.basealpha;
|
||||
wait 0.75;
|
||||
}
|
||||
|
||||
self.alpha = self.basealpha;
|
||||
}
|
||||
|
||||
stopflashing() //checked matches cerberus output
|
||||
stopflashing()
|
||||
{
|
||||
if ( !self.isflashing )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.isflashing = 0;
|
||||
}
|
||||
if ( !self.isflashing )
|
||||
return;
|
||||
|
||||
self.isflashing = 0;
|
||||
}
|
||||
|
@ -1,185 +1,178 @@
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init( id, playerbegincallback, playerendcallback ) //checked matches cerberus output
|
||||
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;
|
||||
precacheshader( "objpoint_default" );
|
||||
handler = spawnstruct();
|
||||
handler.id = id;
|
||||
handler.playerbegincallback = playerbegincallback;
|
||||
handler.playerendcallback = playerendcallback;
|
||||
handler.enabled = 0;
|
||||
handler.players = [];
|
||||
thread onplayerconnect( handler );
|
||||
level.handlerglobalflagval = 0;
|
||||
return handler;
|
||||
}
|
||||
|
||||
enable( handler ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug
|
||||
enable( handler )
|
||||
{
|
||||
if ( handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
handler.enabled = 1;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ].handlerflagval = level.handlerglobalflagval;
|
||||
}
|
||||
players = handler.players;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].handlerflagval != level.handlerglobalflagval )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( players[ i ].handlers[ handler.id ].ready )
|
||||
{
|
||||
players[ i ] handleplayer( handler );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
disable( handler ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug
|
||||
{
|
||||
if ( !handler.enabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
handler.enabled = 0;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
players[ i ].handlerflagval = level.handlerglobalflagval;
|
||||
}
|
||||
players = handler.players;
|
||||
i = 0;
|
||||
while ( i < players.size )
|
||||
{
|
||||
if ( players[ i ].handlerflagval != level.handlerglobalflagval )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if ( players[ i ].handlers[ handler.id ].ready )
|
||||
{
|
||||
players[ i ] unhandleplayer( handler, 0, 0 );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( handler.enabled )
|
||||
return;
|
||||
|
||||
handler.enabled = 1;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
players[i].handlerflagval = level.handlerglobalflagval;
|
||||
|
||||
players = handler.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i].handlerflagval != level.handlerglobalflagval )
|
||||
continue;
|
||||
|
||||
if ( players[i].handlers[handler.id].ready )
|
||||
players[i] handleplayer( handler );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerconnect( handler ) //checked matches cerberus output
|
||||
disable( 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 );
|
||||
}
|
||||
if ( !handler.enabled )
|
||||
return;
|
||||
|
||||
handler.enabled = 0;
|
||||
level.handlerglobalflagval++;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
players[i].handlerflagval = level.handlerglobalflagval;
|
||||
|
||||
players = handler.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
if ( players[i].handlerflagval != level.handlerglobalflagval )
|
||||
continue;
|
||||
|
||||
if ( players[i].handlers[handler.id].ready )
|
||||
players[i] unhandleplayer( handler, 0, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerdisconnect( handler ) //checked changed to match cerberus output
|
||||
onplayerconnect( handler )
|
||||
{
|
||||
self waittill( "disconnect" );
|
||||
newplayers = [];
|
||||
for ( i = 0; i < handler.players.size; i++ )
|
||||
{
|
||||
if ( handler.players[ i ] != self )
|
||||
{
|
||||
newplayers[ newplayers.size ] = handler.players[ i ];
|
||||
}
|
||||
}
|
||||
handler.players = newplayers;
|
||||
self thread unhandleplayer( handler, 1, 1 );
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
onjoinedteam( handler ) //checked matches cerberus output
|
||||
onplayerdisconnect( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
self waittill( "disconnect" );
|
||||
|
||||
newplayers = [];
|
||||
|
||||
for ( i = 0; i < handler.players.size; i++ )
|
||||
{
|
||||
if ( handler.players[i] != self )
|
||||
newplayers[newplayers.size] = handler.players[i];
|
||||
}
|
||||
|
||||
handler.players = newplayers;
|
||||
self thread unhandleplayer( handler, 1, 1 );
|
||||
}
|
||||
|
||||
onjoinedspectators( handler ) //checked matches cerberus output
|
||||
onjoinedteam( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_team" );
|
||||
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerspawned( handler ) //checked matches cerberus output
|
||||
onjoinedspectators( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
self thread handleplayer( handler );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "joined_spectators" );
|
||||
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
onplayerkilled( handler ) //checked matches cerberus output
|
||||
onplayerspawned( handler )
|
||||
{
|
||||
self endon( "disconnect" );
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
self thread handleplayer( handler );
|
||||
}
|
||||
}
|
||||
|
||||
handleplayer( handler ) //checked matches cerberus output
|
||||
onplayerkilled( 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 ]]();
|
||||
self endon( "disconnect" );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
self waittill( "killed_player" );
|
||||
|
||||
self thread unhandleplayer( handler, 1, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
unhandleplayer( handler, unsetready, disconnected ) //checked matches cerberus output
|
||||
handleplayer( handler )
|
||||
{
|
||||
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 );
|
||||
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 );
|
||||
}
|
||||
|
@ -1,480 +1,441 @@
|
||||
//checked includes changed to match cerberus output
|
||||
#include maps/mp/gametypes/_persistence;
|
||||
#include maps/mp/gametypes/_globallogic;
|
||||
#include maps/mp/bots/_bot;
|
||||
#include maps/mp/_popups;
|
||||
#include maps/mp/_scoreevents;
|
||||
#include maps/mp/_medals;
|
||||
#include maps/mp/_challenges;
|
||||
#include maps/mp/gametypes/_rank;
|
||||
#include maps/mp/gametypes/_class;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
init() //checked matches cerberus output
|
||||
init()
|
||||
{
|
||||
level.persistentdatainfo = [];
|
||||
level.maxrecentstats = 10;
|
||||
level.maxhitlocations = 19;
|
||||
maps/mp/gametypes/_class::init();
|
||||
maps/mp/gametypes/_rank::init();
|
||||
level thread maps/mp/_challenges::init();
|
||||
level thread maps/mp/_medals::init();
|
||||
level thread maps/mp/_scoreevents::init();
|
||||
maps/mp/_popups::init();
|
||||
level thread onplayerconnect();
|
||||
level thread initializestattracking();
|
||||
level thread uploadglobalstatcounters();
|
||||
level.persistentdatainfo = [];
|
||||
level.maxrecentstats = 10;
|
||||
level.maxhitlocations = 19;
|
||||
maps\mp\gametypes\_class::init();
|
||||
maps\mp\gametypes\_rank::init();
|
||||
level thread maps\mp\_challenges::init();
|
||||
level thread maps\mp\_medals::init();
|
||||
level thread maps\mp\_scoreevents::init();
|
||||
maps\mp\_popups::init();
|
||||
level thread onplayerconnect();
|
||||
level thread initializestattracking();
|
||||
level thread uploadglobalstatcounters();
|
||||
}
|
||||
|
||||
onplayerconnect() //checked matches cerberus output
|
||||
onplayerconnect()
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
player.enabletext = 1;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
level waittill( "connected", player );
|
||||
|
||||
player.enabletext = 1;
|
||||
}
|
||||
}
|
||||
|
||||
initializestattracking() //checked changed to match cerberus output
|
||||
initializestattracking()
|
||||
{
|
||||
level.globalexecutions = 0;
|
||||
level.globalchallenges = 0;
|
||||
level.globalsharepackages = 0;
|
||||
level.globalcontractsfailed = 0;
|
||||
level.globalcontractspassed = 0;
|
||||
level.globalcontractscppaid = 0;
|
||||
level.globalkillstreakscalled = 0;
|
||||
level.globalkillstreaksdestroyed = 0;
|
||||
level.globalkillstreaksdeathsfrom = 0;
|
||||
level.globallarryskilled = 0;
|
||||
level.globalbuzzkills = 0;
|
||||
level.globalrevives = 0;
|
||||
level.globalafterlifes = 0;
|
||||
level.globalcomebacks = 0;
|
||||
level.globalpaybacks = 0;
|
||||
level.globalbackstabs = 0;
|
||||
level.globalbankshots = 0;
|
||||
level.globalskewered = 0;
|
||||
level.globalteammedals = 0;
|
||||
level.globalfeetfallen = 0;
|
||||
level.globaldistancesprinted = 0;
|
||||
level.globaldembombsprotected = 0;
|
||||
level.globaldembombsdestroyed = 0;
|
||||
level.globalbombsdestroyed = 0;
|
||||
level.globalfraggrenadesfired = 0;
|
||||
level.globalsatchelchargefired = 0;
|
||||
level.globalshotsfired = 0;
|
||||
level.globalcrossbowfired = 0;
|
||||
level.globalcarsdestroyed = 0;
|
||||
level.globalbarrelsdestroyed = 0;
|
||||
level.globalbombsdestroyedbyteam = [];
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
level.globalbombsdestroyedbyteam[ team ] = 0;
|
||||
}
|
||||
level.globalexecutions = 0;
|
||||
level.globalchallenges = 0;
|
||||
level.globalsharepackages = 0;
|
||||
level.globalcontractsfailed = 0;
|
||||
level.globalcontractspassed = 0;
|
||||
level.globalcontractscppaid = 0;
|
||||
level.globalkillstreakscalled = 0;
|
||||
level.globalkillstreaksdestroyed = 0;
|
||||
level.globalkillstreaksdeathsfrom = 0;
|
||||
level.globallarryskilled = 0;
|
||||
level.globalbuzzkills = 0;
|
||||
level.globalrevives = 0;
|
||||
level.globalafterlifes = 0;
|
||||
level.globalcomebacks = 0;
|
||||
level.globalpaybacks = 0;
|
||||
level.globalbackstabs = 0;
|
||||
level.globalbankshots = 0;
|
||||
level.globalskewered = 0;
|
||||
level.globalteammedals = 0;
|
||||
level.globalfeetfallen = 0;
|
||||
level.globaldistancesprinted = 0;
|
||||
level.globaldembombsprotected = 0;
|
||||
level.globaldembombsdestroyed = 0;
|
||||
level.globalbombsdestroyed = 0;
|
||||
level.globalfraggrenadesfired = 0;
|
||||
level.globalsatchelchargefired = 0;
|
||||
level.globalshotsfired = 0;
|
||||
level.globalcrossbowfired = 0;
|
||||
level.globalcarsdestroyed = 0;
|
||||
level.globalbarrelsdestroyed = 0;
|
||||
level.globalbombsdestroyedbyteam = [];
|
||||
|
||||
foreach ( team in level.teams )
|
||||
level.globalbombsdestroyedbyteam[team] = 0;
|
||||
}
|
||||
|
||||
uploadglobalstatcounters() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info
|
||||
uploadglobalstatcounters()
|
||||
{
|
||||
level waittill( "game_ended" );
|
||||
if ( !level.rankedmatch && !level.wagermatch )
|
||||
{
|
||||
return;
|
||||
}
|
||||
totalkills = 0;
|
||||
totaldeaths = 0;
|
||||
totalassists = 0;
|
||||
totalheadshots = 0;
|
||||
totalsuicides = 0;
|
||||
totaltimeplayed = 0;
|
||||
totalflagscaptured = 0;
|
||||
totalflagsreturned = 0;
|
||||
totalhqsdestroyed = 0;
|
||||
totalhqscaptured = 0;
|
||||
totalsddefused = 0;
|
||||
totalsdplants = 0;
|
||||
totalhumiliations = 0;
|
||||
totalsabdestroyedbyteam = [];
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
totalsabdestroyedbyteam[ team ] = 0;
|
||||
}
|
||||
switch( level.gametype )
|
||||
{
|
||||
case "dem":
|
||||
bombzonesleft = 0;
|
||||
index = 0;
|
||||
while ( index < level.bombzones.size )
|
||||
{
|
||||
if ( !isDefined( level.bombzones[ index ].bombexploded ) || !level.bombzones[ index ].bombexploded )
|
||||
{
|
||||
level.globaldembombsprotected++;
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
level.globaldembombsdestroyed++;
|
||||
index++;
|
||||
}
|
||||
case "sab":
|
||||
foreach(team in level.teams)
|
||||
{
|
||||
totalsabdestroyedbyteam[ team ] = level.globalbombsdestroyedbyteam[ team ];
|
||||
}
|
||||
}
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
totaltimeplayed += min( player.timeplayed[ "total" ], level.timeplayedcap );
|
||||
}
|
||||
incrementcounter( "global_executions", level.globalexecutions );
|
||||
incrementcounter( "global_sharedpackagemedals", level.globalsharepackages );
|
||||
incrementcounter( "global_dem_bombsdestroyed", level.globaldembombsdestroyed );
|
||||
incrementcounter( "global_dem_bombsprotected", level.globaldembombsprotected );
|
||||
incrementcounter( "global_contracts_failed", level.globalcontractsfailed );
|
||||
incrementcounter( "global_killstreaks_called", level.globalkillstreakscalled );
|
||||
incrementcounter( "global_killstreaks_destroyed", level.globalkillstreaksdestroyed );
|
||||
incrementcounter( "global_killstreaks_deathsfrom", level.globalkillstreaksdeathsfrom );
|
||||
incrementcounter( "global_buzzkills", level.globalbuzzkills );
|
||||
incrementcounter( "global_revives", level.globalrevives );
|
||||
incrementcounter( "global_afterlifes", level.globalafterlifes );
|
||||
incrementcounter( "global_comebacks", level.globalcomebacks );
|
||||
incrementcounter( "global_paybacks", level.globalpaybacks );
|
||||
incrementcounter( "global_backstabs", level.globalbackstabs );
|
||||
incrementcounter( "global_bankshots", level.globalbankshots );
|
||||
incrementcounter( "global_skewered", level.globalskewered );
|
||||
incrementcounter( "global_teammedals", level.globalteammedals );
|
||||
incrementcounter( "global_fraggrenadesthrown", level.globalfraggrenadesfired );
|
||||
incrementcounter( "global_c4thrown", level.globalsatchelchargefired );
|
||||
incrementcounter( "global_shotsfired", level.globalshotsfired );
|
||||
incrementcounter( "global_crossbowfired", level.globalcrossbowfired );
|
||||
incrementcounter( "global_carsdestroyed", level.globalcarsdestroyed );
|
||||
incrementcounter( "global_barrelsdestroyed", level.globalbarrelsdestroyed );
|
||||
incrementcounter( "global_challenges_finished", level.globalchallenges );
|
||||
incrementcounter( "global_contractscppaid", level.globalcontractscppaid );
|
||||
incrementcounter( "global_distancesprinted100inches", int( level.globaldistancesprinted ) );
|
||||
incrementcounter( "global_combattraining_botskilled", level.globallarryskilled );
|
||||
incrementcounter( "global_distancefeetfallen", int( level.globalfeetfallen ) );
|
||||
incrementcounter( "global_minutes", int( totaltimeplayed / 60 ) );
|
||||
if ( !waslastround() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait 0.05;
|
||||
players = get_players();
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
totalkills += player.kills;
|
||||
totaldeaths += player.deaths;
|
||||
totalassists += player.assists;
|
||||
totalheadshots += player.headshots;
|
||||
totalsuicides += player.suicides;
|
||||
totalhumiliations += player.humiliated;
|
||||
totaltimeplayed += int( min( player.timeplayed[ "alive" ], level.timeplayedcap ) );
|
||||
switch( level.gametype )
|
||||
{
|
||||
case "ctf":
|
||||
totalflagscaptured += player.captures;
|
||||
totalflagsreturned += player.returns;
|
||||
break;
|
||||
case "koth":
|
||||
totalhqsdestroyed += player.destructions;
|
||||
totalhqscaptured += player.captures;
|
||||
break;
|
||||
case "sd":
|
||||
totalsddefused += player.defuses;
|
||||
totalsdplants += player.plants;
|
||||
break;
|
||||
case "sab":
|
||||
if ( isDefined( player.team ) && isDefined( level.teams[ player.team ] ) )
|
||||
{
|
||||
totalsabdestroyedbyteam[ player.team ] += player.destructions;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( maps/mp/bots/_bot::is_bot_ranked_match() )
|
||||
{
|
||||
incrementcounter( "global_combattraining_gamesplayed", 1 );
|
||||
}
|
||||
incrementcounter( "global_kills", totalkills );
|
||||
incrementcounter( "global_deaths", totaldeaths );
|
||||
incrementcounter( "global_assists", totalassists );
|
||||
incrementcounter( "global_headshots", totalheadshots );
|
||||
incrementcounter( "global_suicides", totalsuicides );
|
||||
incrementcounter( "global_games", 1 );
|
||||
incrementcounter( "global_ctf_flagscaptured", totalflagscaptured );
|
||||
incrementcounter( "global_ctf_flagsreturned", totalflagsreturned );
|
||||
incrementcounter( "global_hq_destroyed", totalhqsdestroyed );
|
||||
incrementcounter( "global_hq_captured", totalhqscaptured );
|
||||
incrementcounter( "global_snd_defuses", totalsddefused );
|
||||
incrementcounter( "global_snd_plants", totalsdplants );
|
||||
incrementcounter( "global_sab_destroyedbyops", totalsabdestroyedbyteam[ "allies" ] );
|
||||
incrementcounter( "global_sab_destroyedbycommunists", totalsabdestroyedbyteam[ "axis" ] );
|
||||
incrementcounter( "global_humiliations", totalhumiliations );
|
||||
if ( isDefined( game[ "wager_pot" ] ) )
|
||||
{
|
||||
incrementcounter( "global_wageredcp", game[ "wager_pot" ] );
|
||||
}
|
||||
level waittill( "game_ended" );
|
||||
|
||||
if ( !level.rankedmatch && !level.wagermatch )
|
||||
return;
|
||||
|
||||
totalkills = 0;
|
||||
totaldeaths = 0;
|
||||
totalassists = 0;
|
||||
totalheadshots = 0;
|
||||
totalsuicides = 0;
|
||||
totaltimeplayed = 0;
|
||||
totalflagscaptured = 0;
|
||||
totalflagsreturned = 0;
|
||||
totalhqsdestroyed = 0;
|
||||
totalhqscaptured = 0;
|
||||
totalsddefused = 0;
|
||||
totalsdplants = 0;
|
||||
totalhumiliations = 0;
|
||||
totalsabdestroyedbyteam = [];
|
||||
|
||||
foreach ( team in level.teams )
|
||||
totalsabdestroyedbyteam[team] = 0;
|
||||
|
||||
switch ( level.gametype )
|
||||
{
|
||||
case "dem":
|
||||
bombzonesleft = 0;
|
||||
|
||||
for ( index = 0; index < level.bombzones.size; index++ )
|
||||
{
|
||||
if ( !isdefined( level.bombzones[index].bombexploded ) || !level.bombzones[index].bombexploded )
|
||||
{
|
||||
level.globaldembombsprotected++;
|
||||
continue;
|
||||
}
|
||||
|
||||
level.globaldembombsdestroyed++;
|
||||
}
|
||||
|
||||
break;
|
||||
case "sab":
|
||||
foreach ( team in level.teams )
|
||||
totalsabdestroyedbyteam[team] = level.globalbombsdestroyedbyteam[team];
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
totaltimeplayed += min( player.timeplayed["total"], level.timeplayedcap );
|
||||
}
|
||||
|
||||
incrementcounter( "global_executions", level.globalexecutions );
|
||||
incrementcounter( "global_sharedpackagemedals", level.globalsharepackages );
|
||||
incrementcounter( "global_dem_bombsdestroyed", level.globaldembombsdestroyed );
|
||||
incrementcounter( "global_dem_bombsprotected", level.globaldembombsprotected );
|
||||
incrementcounter( "global_contracts_failed", level.globalcontractsfailed );
|
||||
incrementcounter( "global_killstreaks_called", level.globalkillstreakscalled );
|
||||
incrementcounter( "global_killstreaks_destroyed", level.globalkillstreaksdestroyed );
|
||||
incrementcounter( "global_killstreaks_deathsfrom", level.globalkillstreaksdeathsfrom );
|
||||
incrementcounter( "global_buzzkills", level.globalbuzzkills );
|
||||
incrementcounter( "global_revives", level.globalrevives );
|
||||
incrementcounter( "global_afterlifes", level.globalafterlifes );
|
||||
incrementcounter( "global_comebacks", level.globalcomebacks );
|
||||
incrementcounter( "global_paybacks", level.globalpaybacks );
|
||||
incrementcounter( "global_backstabs", level.globalbackstabs );
|
||||
incrementcounter( "global_bankshots", level.globalbankshots );
|
||||
incrementcounter( "global_skewered", level.globalskewered );
|
||||
incrementcounter( "global_teammedals", level.globalteammedals );
|
||||
incrementcounter( "global_fraggrenadesthrown", level.globalfraggrenadesfired );
|
||||
incrementcounter( "global_c4thrown", level.globalsatchelchargefired );
|
||||
incrementcounter( "global_shotsfired", level.globalshotsfired );
|
||||
incrementcounter( "global_crossbowfired", level.globalcrossbowfired );
|
||||
incrementcounter( "global_carsdestroyed", level.globalcarsdestroyed );
|
||||
incrementcounter( "global_barrelsdestroyed", level.globalbarrelsdestroyed );
|
||||
incrementcounter( "global_challenges_finished", level.globalchallenges );
|
||||
incrementcounter( "global_contractscppaid", level.globalcontractscppaid );
|
||||
incrementcounter( "global_distancesprinted100inches", int( level.globaldistancesprinted ) );
|
||||
incrementcounter( "global_combattraining_botskilled", level.globallarryskilled );
|
||||
incrementcounter( "global_distancefeetfallen", int( level.globalfeetfallen ) );
|
||||
incrementcounter( "global_minutes", int( totaltimeplayed / 60 ) );
|
||||
|
||||
if ( !waslastround() )
|
||||
return;
|
||||
|
||||
wait 0.05;
|
||||
players = get_players();
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
totalkills += player.kills;
|
||||
totaldeaths += player.deaths;
|
||||
totalassists += player.assists;
|
||||
totalheadshots += player.headshots;
|
||||
totalsuicides += player.suicides;
|
||||
totalhumiliations += player.humiliated;
|
||||
totaltimeplayed += int( min( player.timeplayed["alive"], level.timeplayedcap ) );
|
||||
|
||||
switch ( level.gametype )
|
||||
{
|
||||
case "ctf":
|
||||
totalflagscaptured += player.captures;
|
||||
totalflagsreturned += player.returns;
|
||||
continue;
|
||||
case "koth":
|
||||
totalhqsdestroyed += player.destructions;
|
||||
totalhqscaptured += player.captures;
|
||||
continue;
|
||||
case "sd":
|
||||
totalsddefused += player.defuses;
|
||||
totalsdplants += player.plants;
|
||||
continue;
|
||||
case "sab":
|
||||
if ( isdefined( player.team ) && isdefined( level.teams[player.team] ) )
|
||||
totalsabdestroyedbyteam[player.team] += player.destructions;
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( maps\mp\bots\_bot::is_bot_ranked_match() )
|
||||
incrementcounter( "global_combattraining_gamesplayed", 1 );
|
||||
|
||||
incrementcounter( "global_kills", totalkills );
|
||||
incrementcounter( "global_deaths", totaldeaths );
|
||||
incrementcounter( "global_assists", totalassists );
|
||||
incrementcounter( "global_headshots", totalheadshots );
|
||||
incrementcounter( "global_suicides", totalsuicides );
|
||||
incrementcounter( "global_games", 1 );
|
||||
incrementcounter( "global_ctf_flagscaptured", totalflagscaptured );
|
||||
incrementcounter( "global_ctf_flagsreturned", totalflagsreturned );
|
||||
incrementcounter( "global_hq_destroyed", totalhqsdestroyed );
|
||||
incrementcounter( "global_hq_captured", totalhqscaptured );
|
||||
incrementcounter( "global_snd_defuses", totalsddefused );
|
||||
incrementcounter( "global_snd_plants", totalsdplants );
|
||||
incrementcounter( "global_sab_destroyedbyops", totalsabdestroyedbyteam["allies"] );
|
||||
incrementcounter( "global_sab_destroyedbycommunists", totalsabdestroyedbyteam["axis"] );
|
||||
incrementcounter( "global_humiliations", totalhumiliations );
|
||||
|
||||
if ( isdefined( game["wager_pot"] ) )
|
||||
incrementcounter( "global_wageredcp", game["wager_pot"] );
|
||||
}
|
||||
|
||||
statgetwithgametype( dataname ) //checked matches cerberus output
|
||||
statgetwithgametype( dataname )
|
||||
{
|
||||
if ( is_true( level.nopersistence ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !level.onlinegame )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return self getdstat( "PlayerStatsByGameType", getgametypename(), dataname, "StatValue" );
|
||||
if ( isdefined( level.nopersistence ) && level.nopersistence )
|
||||
return 0;
|
||||
|
||||
if ( !level.onlinegame )
|
||||
return 0;
|
||||
|
||||
return self getdstat( "PlayerStatsByGameType", getgametypename(), dataname, "StatValue" );
|
||||
}
|
||||
|
||||
getgametypename() //checked matches cerberus output
|
||||
getgametypename()
|
||||
{
|
||||
if ( !isDefined( level.fullgametypename ) )
|
||||
{
|
||||
if ( is_true( level.hardcoremode ) && ispartygamemode() == 0 )
|
||||
{
|
||||
prefix = "HC";
|
||||
}
|
||||
else
|
||||
{
|
||||
prefix = "";
|
||||
}
|
||||
level.fullgametypename = tolower( prefix + level.gametype );
|
||||
}
|
||||
return level.fullgametypename;
|
||||
if ( !isdefined( level.fullgametypename ) )
|
||||
{
|
||||
if ( isdefined( level.hardcoremode ) && level.hardcoremode && ispartygamemode() == 0 )
|
||||
prefix = "HC";
|
||||
else
|
||||
prefix = "";
|
||||
|
||||
level.fullgametypename = tolower( prefix + level.gametype );
|
||||
}
|
||||
|
||||
return level.fullgametypename;
|
||||
}
|
||||
|
||||
ispartygamemode() //checked changed to match cerberus output
|
||||
ispartygamemode()
|
||||
{
|
||||
switch( level.gametype )
|
||||
{
|
||||
case "gun":
|
||||
case "oic":
|
||||
case "sas":
|
||||
case "shrp":
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
switch ( level.gametype )
|
||||
{
|
||||
case "shrp":
|
||||
case "sas":
|
||||
case "oic":
|
||||
case "gun":
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
isstatmodifiable( dataname ) //checked changed at own discretion
|
||||
isstatmodifiable( dataname )
|
||||
{
|
||||
if ( level.rankedmatch || level.wagermatch )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
return level.rankedmatch || level.wagermatch;
|
||||
}
|
||||
|
||||
statsetwithgametype( dataname, value, incvalue ) //checked matches cerberus output
|
||||
statsetwithgametype( dataname, value, incvalue )
|
||||
{
|
||||
if ( is_true( level.nopersistence ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isstatmodifiable( dataname ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( level.disablestattracking )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self setdstat( "PlayerStatsByGameType", getgametypename(), dataname, "StatValue", value );
|
||||
if ( isdefined( level.nopersistence ) && level.nopersistence )
|
||||
return 0;
|
||||
|
||||
if ( !isstatmodifiable( dataname ) )
|
||||
return;
|
||||
|
||||
if ( level.disablestattracking )
|
||||
return;
|
||||
|
||||
self setdstat( "PlayerStatsByGameType", getgametypename(), dataname, "StatValue", value );
|
||||
}
|
||||
|
||||
adjustrecentstats() //checked matches cerberus output
|
||||
adjustrecentstats()
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( getDvarInt( "scr_writeConfigStrings" ) == 1 || getDvarInt( "scr_hostmigrationtest" ) == 1 )
|
||||
{
|
||||
return;
|
||||
if ( getdvarint( "scr_writeConfigStrings" ) == 1 || getdvarint( "scr_hostmigrationtest" ) == 1 )
|
||||
return;
|
||||
#/
|
||||
}
|
||||
*/
|
||||
initializematchstats();
|
||||
initializematchstats();
|
||||
}
|
||||
|
||||
getrecentstat( isglobal, index, statname ) //checked changed to match cerberus output
|
||||
getrecentstat( isglobal, index, statname )
|
||||
{
|
||||
if ( level.wagermatch )
|
||||
{
|
||||
return self getdstat( "RecentEarnings", index, statname );
|
||||
}
|
||||
else if ( isglobal )
|
||||
{
|
||||
modename = maps/mp/gametypes/_globallogic::getcurrentgamemode();
|
||||
return self getdstat( "gameHistory", modename, "matchHistory", index, statname );
|
||||
}
|
||||
else
|
||||
{
|
||||
return self getdstat( "PlayerStatsByGameType", getgametypename(), "prevScores", index, statname );
|
||||
}
|
||||
if ( level.wagermatch )
|
||||
return self getdstat( "RecentEarnings", index, statname );
|
||||
else if ( isglobal )
|
||||
{
|
||||
modename = maps\mp\gametypes\_globallogic::getcurrentgamemode();
|
||||
return self getdstat( "gameHistory", modename, "matchHistory", index, statname );
|
||||
}
|
||||
else
|
||||
return self getdstat( "PlayerStatsByGameType", getgametypename(), "prevScores", index, statname );
|
||||
}
|
||||
|
||||
setrecentstat( isglobal, index, statname, value ) //checked matches cerberus output
|
||||
setrecentstat( isglobal, index, statname, value )
|
||||
{
|
||||
if ( is_true( level.nopersistence ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !level.onlinegame )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isstatmodifiable( statname ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( index < 0 || index > 9 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( level.wagermatch )
|
||||
{
|
||||
self setdstat( "RecentEarnings", index, statname, value );
|
||||
}
|
||||
else if ( isglobal )
|
||||
{
|
||||
modename = maps/mp/gametypes/_globallogic::getcurrentgamemode();
|
||||
self setdstat( "gameHistory", modename, "matchHistory", "" + index, statname, value );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self setdstat( "PlayerStatsByGameType", getgametypename(), "prevScores", index, statname, value );
|
||||
return;
|
||||
}
|
||||
if ( isdefined( level.nopersistence ) && level.nopersistence )
|
||||
return;
|
||||
|
||||
if ( !level.onlinegame )
|
||||
return;
|
||||
|
||||
if ( !isstatmodifiable( statname ) )
|
||||
return;
|
||||
|
||||
if ( index < 0 || index > 9 )
|
||||
return;
|
||||
|
||||
if ( level.wagermatch )
|
||||
self setdstat( "RecentEarnings", index, statname, value );
|
||||
else if ( isglobal )
|
||||
{
|
||||
modename = maps\mp\gametypes\_globallogic::getcurrentgamemode();
|
||||
self setdstat( "gameHistory", modename, "matchHistory", "" + index, statname, value );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self setdstat( "PlayerStatsByGameType", getgametypename(), "prevScores", index, statname, value );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
addrecentstat( isglobal, index, statname, value ) //checked matches cerberus output
|
||||
addrecentstat( isglobal, index, statname, value )
|
||||
{
|
||||
if ( is_true( level.nopersistence ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !level.onlinegame )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isstatmodifiable( statname ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
currstat = getrecentstat( isglobal, index, statname );
|
||||
setrecentstat( isglobal, index, statname, currstat + value );
|
||||
if ( isdefined( level.nopersistence ) && level.nopersistence )
|
||||
return;
|
||||
|
||||
if ( !level.onlinegame )
|
||||
return;
|
||||
|
||||
if ( !isstatmodifiable( statname ) )
|
||||
return;
|
||||
|
||||
currstat = getrecentstat( isglobal, index, statname );
|
||||
setrecentstat( isglobal, index, statname, currstat + value );
|
||||
}
|
||||
|
||||
setmatchhistorystat( statname, value ) //checked matches cerberus output
|
||||
setmatchhistorystat( statname, value )
|
||||
{
|
||||
modename = maps/mp/gametypes/_globallogic::getcurrentgamemode();
|
||||
historyindex = self getdstat( "gameHistory", modename, "currentMatchHistoryIndex" );
|
||||
setrecentstat( 1, historyindex, statname, value );
|
||||
modename = maps\mp\gametypes\_globallogic::getcurrentgamemode();
|
||||
historyindex = self getdstat( "gameHistory", modename, "currentMatchHistoryIndex" );
|
||||
setrecentstat( 1, historyindex, statname, value );
|
||||
}
|
||||
|
||||
addmatchhistorystat( statname, value ) //checked matches cerberus output
|
||||
addmatchhistorystat( statname, value )
|
||||
{
|
||||
modename = maps/mp/gametypes/_globallogic::getcurrentgamemode();
|
||||
historyindex = self getdstat( "gameHistory", modename, "currentMatchHistoryIndex" );
|
||||
addrecentstat( 1, historyindex, statname, value );
|
||||
modename = maps\mp\gametypes\_globallogic::getcurrentgamemode();
|
||||
historyindex = self getdstat( "gameHistory", modename, "currentMatchHistoryIndex" );
|
||||
addrecentstat( 1, historyindex, statname, value );
|
||||
}
|
||||
|
||||
initializematchstats() //checked matches cerberus output
|
||||
initializematchstats()
|
||||
{
|
||||
if ( is_true( level.nopersistence ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !level.onlinegame )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !level.rankedmatch && !level.wagermatch && !level.leaguematch )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self.pers[ "lastHighestScore" ] = self getdstat( "HighestStats", "highest_score" );
|
||||
currgametype = maps/mp/gametypes/_persistence::getgametypename();
|
||||
self gamehistorystartmatch( getgametypeenumfromname( currgametype, level.hardcoremode ) );
|
||||
if ( isdefined( level.nopersistence ) && level.nopersistence )
|
||||
return;
|
||||
|
||||
if ( !level.onlinegame )
|
||||
return;
|
||||
|
||||
if ( !( level.rankedmatch || level.wagermatch || level.leaguematch ) )
|
||||
return;
|
||||
|
||||
self.pers["lastHighestScore"] = self getdstat( "HighestStats", "highest_score" );
|
||||
currgametype = maps\mp\gametypes\_persistence::getgametypename();
|
||||
self gamehistorystartmatch( getgametypeenumfromname( currgametype, level.hardcoremode ) );
|
||||
}
|
||||
|
||||
setafteractionreportstat( statname, value, index ) //checked changed to match cerberus output
|
||||
setafteractionreportstat( statname, value, index )
|
||||
{
|
||||
if ( self is_bot() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
if ( self is_bot() )
|
||||
return;
|
||||
|
||||
/#
|
||||
if ( getDvarInt( "scr_writeConfigStrings" ) == 1 || getDvarInt( "scr_hostmigrationtest" ) == 1 )
|
||||
{
|
||||
return;
|
||||
if ( getdvarint( "scr_writeConfigStrings" ) == 1 || getdvarint( "scr_hostmigrationtest" ) == 1 )
|
||||
return;
|
||||
#/
|
||||
}
|
||||
*/
|
||||
if ( level.rankedmatch || level.wagermatch && level.leaguematch )
|
||||
{
|
||||
if ( isDefined( index ) )
|
||||
{
|
||||
self setdstat( "AfterActionReportStats", statname, index, value );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self setdstat( "AfterActionReportStats", statname, value );
|
||||
}
|
||||
}
|
||||
|
||||
if ( level.rankedmatch || level.wagermatch || level.leaguematch )
|
||||
{
|
||||
if ( isdefined( index ) )
|
||||
self setdstat( "AfterActionReportStats", statname, index, value );
|
||||
else
|
||||
self setdstat( "AfterActionReportStats", statname, value );
|
||||
}
|
||||
}
|
||||
|
||||
codecallback_challengecomplete( rewardxp, maxval, row, tablenumber, challengetype, itemindex, challengeindex ) //checked matches cerberus output
|
||||
codecallback_challengecomplete( rewardxp, maxval, row, tablenumber, challengetype, itemindex, challengeindex )
|
||||
{
|
||||
self luinotifyevent( &"challenge_complete", 7, challengeindex, itemindex, challengetype, tablenumber, row, maxval, rewardxp );
|
||||
self luinotifyeventtospectators( &"challenge_complete", 7, challengeindex, itemindex, challengetype, tablenumber, row, maxval, rewardxp );
|
||||
self luinotifyevent( &"challenge_complete", 7, challengeindex, itemindex, challengetype, tablenumber, row, maxval, rewardxp );
|
||||
self luinotifyeventtospectators( &"challenge_complete", 7, challengeindex, itemindex, challengetype, tablenumber, row, maxval, rewardxp );
|
||||
}
|
||||
|
||||
codecallback_gunchallengecomplete( rewardxp, attachmentindex, itemindex, rankid ) //checked matches cerberus output
|
||||
codecallback_gunchallengecomplete( rewardxp, attachmentindex, itemindex, rankid )
|
||||
{
|
||||
self luinotifyevent( &"gun_level_complete", 4, rankid, itemindex, attachmentindex, rewardxp );
|
||||
self luinotifyeventtospectators( &"gun_level_complete", 4, rankid, itemindex, attachmentindex, rewardxp );
|
||||
self luinotifyevent( &"gun_level_complete", 4, rankid, itemindex, attachmentindex, rewardxp );
|
||||
self luinotifyeventtospectators( &"gun_level_complete", 4, rankid, itemindex, attachmentindex, rewardxp );
|
||||
}
|
||||
|
||||
checkcontractexpirations() //checked matches cerberus output
|
||||
checkcontractexpirations()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
incrementcontracttimes( timeinc ) //checked matches cerberus output
|
||||
incrementcontracttimes( timeinc )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
addcontracttoqueue( index, passed ) //checked matches cerberus output
|
||||
addcontracttoqueue( index, passed )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uploadstatssoon() //checked matches cerberus output
|
||||
uploadstatssoon()
|
||||
{
|
||||
self notify( "upload_stats_soon" );
|
||||
self endon( "upload_stats_soon" );
|
||||
self endon( "disconnect" );
|
||||
wait 1;
|
||||
uploadstats( self );
|
||||
self notify( "upload_stats_soon" );
|
||||
self endon( "upload_stats_soon" );
|
||||
self endon( "disconnect" );
|
||||
wait 1;
|
||||
uploadstats( self );
|
||||
}
|
||||
|
||||
codecallback_onaddplayerstat( dataname, value ) //checked matches cerberus output
|
||||
codecallback_onaddplayerstat( dataname, value )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
codecallback_onaddweaponstat( weapname, dataname, value ) //checked matches cerberus output
|
||||
codecallback_onaddweaponstat( weapname, dataname, value )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
processcontractsonaddstat( stattype, dataname, value, weapname ) //checked matches cerberus output
|
||||
processcontractsonaddstat( stattype, dataname, value, weapname )
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,303 +1,281 @@
|
||||
//checked includes changed to match cerberus output
|
||||
#include maps/mp/gametypes/_globallogic_score;
|
||||
#include maps/mp/gametypes/_globallogic_utils;
|
||||
#include maps/mp/gametypes/_globallogic_ui;
|
||||
#include maps/mp/gametypes/_hud;
|
||||
#include maps/mp/gametypes/_globallogic_player;
|
||||
#include maps/mp/gametypes/_gameobjects;
|
||||
#include maps/mp/gametypes/_spawning;
|
||||
#include maps/mp/gametypes/_spawnlogic;
|
||||
#include maps/mp/gametypes/_callbacksetup;
|
||||
#include maps/mp/gametypes/_globallogic;
|
||||
#include maps/mp/gametypes/_hud_util;
|
||||
#include maps/mp/_utility;
|
||||
// T6 GSC SOURCE
|
||||
// Decompiled by https://github.com/xensik/gsc-tool
|
||||
|
||||
|
||||
main() //checked matches cerberus output
|
||||
main()
|
||||
{
|
||||
level.pregame = 1;
|
||||
/*
|
||||
level.pregame = 1;
|
||||
/#
|
||||
println( "Pregame main() level.pregame = " + level.pregame + "\n" );
|
||||
println( "Pregame main() level.pregame = " + level.pregame + "\n" );
|
||||
#/
|
||||
*/
|
||||
maps/mp/gametypes/_globallogic::init();
|
||||
maps/mp/gametypes/_callbacksetup::setupcallbacks();
|
||||
maps/mp/gametypes/_globallogic::setupcallbacks();
|
||||
registertimelimit( 0, 1440 );
|
||||
registerscorelimit( 0, 5000 );
|
||||
registerroundlimit( 0, 1 );
|
||||
registerroundwinlimit( 0, 0 );
|
||||
registernumlives( 0, 0 );
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level.onspawnplayer = ::onspawnplayer;
|
||||
level.onspawnplayerunified = ::onspawnplayerunified;
|
||||
level.onendgame = ::onendgame;
|
||||
level.ontimelimit = ::ontimelimit;
|
||||
game[ "dialog" ][ "gametype" ] = "pregame_start";
|
||||
game[ "dialog" ][ "offense_obj" ] = "generic_boost";
|
||||
game[ "dialog" ][ "defense_obj" ] = "generic_boost";
|
||||
setscoreboardcolumns( "score", "kills", "deaths", "kdratio", "assists" );
|
||||
if ( getDvar( "party_minplayers" ) == "" )
|
||||
{
|
||||
setdvar( "party_minplayers", 4 );
|
||||
}
|
||||
level.pregame_minplayers = getDvarInt( "party_minplayers" );
|
||||
setmatchtalkflag( "EveryoneHearsEveryone", 1 );
|
||||
maps\mp\gametypes\_globallogic::init();
|
||||
maps\mp\gametypes\_callbacksetup::setupcallbacks();
|
||||
maps\mp\gametypes\_globallogic::setupcallbacks();
|
||||
registertimelimit( 0, 1440 );
|
||||
registerscorelimit( 0, 5000 );
|
||||
registerroundlimit( 0, 1 );
|
||||
registerroundwinlimit( 0, 0 );
|
||||
registernumlives( 0, 0 );
|
||||
level.onstartgametype = ::onstartgametype;
|
||||
level.onspawnplayer = ::onspawnplayer;
|
||||
level.onspawnplayerunified = ::onspawnplayerunified;
|
||||
level.onendgame = ::onendgame;
|
||||
level.ontimelimit = ::ontimelimit;
|
||||
game["dialog"]["gametype"] = "pregame_start";
|
||||
game["dialog"]["offense_obj"] = "generic_boost";
|
||||
game["dialog"]["defense_obj"] = "generic_boost";
|
||||
setscoreboardcolumns( "score", "kills", "deaths", "kdratio", "assists" );
|
||||
|
||||
if ( getdvar( "party_minplayers" ) == "" )
|
||||
setdvar( "party_minplayers", 4 );
|
||||
|
||||
level.pregame_minplayers = getdvarint( "party_minplayers" );
|
||||
setmatchtalkflag( "EveryoneHearsEveryone", 1 );
|
||||
}
|
||||
|
||||
onstartgametype() //checked changed to match cerberus output
|
||||
onstartgametype()
|
||||
{
|
||||
setclientnamemode( "auto_change" );
|
||||
level.spawnmins = ( 0, 0, 0 );
|
||||
level.spawnmaxs = ( 0, 0, 0 );
|
||||
foreach(team in level.teams)
|
||||
{
|
||||
setobjectivetext( team, &"OBJECTIVES_PREGAME" );
|
||||
setobjectivehinttext( team, &"OBJECTIVES_PREGAME_HINT" );
|
||||
if ( level.splitscreen )
|
||||
{
|
||||
setobjectivescoretext( team, &"OBJECTIVES_PREGAME" );
|
||||
}
|
||||
else
|
||||
{
|
||||
setobjectivescoretext( team, &"OBJECTIVES_PREGAME_SCORE" );
|
||||
}
|
||||
maps/mp/gametypes/_spawnlogic::addspawnpoints( team, "mp_dm_spawn" );
|
||||
}
|
||||
maps/mp/gametypes/_spawning::updateallspawnpoints();
|
||||
level.mapcenter = maps/mp/gametypes/_spawnlogic::findboxcenter( level.spawnmins, level.spawnmaxs );
|
||||
setmapcenter( level.mapcenter );
|
||||
spawnpoint = maps/mp/gametypes/_spawnlogic::getrandomintermissionpoint();
|
||||
setdemointermissionpoint( spawnpoint.origin, spawnpoint.angles );
|
||||
level.usestartspawns = 0;
|
||||
level.teambased = 0;
|
||||
level.overrideteamscore = 1;
|
||||
level.rankenabled = 0;
|
||||
level.medalsenabled = 0;
|
||||
allowed = [];
|
||||
allowed[ 0 ] = "dm";
|
||||
maps/mp/gametypes/_gameobjects::main( allowed );
|
||||
maps/mp/gametypes/_spawning::create_map_placed_influencers();
|
||||
level.killcam = 0;
|
||||
level.finalkillcam = 0;
|
||||
level.killstreaksenabled = 0;
|
||||
startpregame();
|
||||
setclientnamemode( "auto_change" );
|
||||
level.spawnmins = ( 0, 0, 0 );
|
||||
level.spawnmaxs = ( 0, 0, 0 );
|
||||
|
||||
foreach ( team in level.teams )
|
||||
{
|
||||
setobjectivetext( team, &"OBJECTIVES_PREGAME" );
|
||||
setobjectivehinttext( team, &"OBJECTIVES_PREGAME_HINT" );
|
||||
|
||||
if ( level.splitscreen )
|
||||
setobjectivescoretext( team, &"OBJECTIVES_PREGAME" );
|
||||
else
|
||||
setobjectivescoretext( team, &"OBJECTIVES_PREGAME_SCORE" );
|
||||
|
||||
maps\mp\gametypes\_spawnlogic::addspawnpoints( team, "mp_dm_spawn" );
|
||||
}
|
||||
|
||||
maps\mp\gametypes\_spawning::updateallspawnpoints();
|
||||
level.mapcenter = maps\mp\gametypes\_spawnlogic::findboxcenter( level.spawnmins, level.spawnmaxs );
|
||||
setmapcenter( level.mapcenter );
|
||||
spawnpoint = maps\mp\gametypes\_spawnlogic::getrandomintermissionpoint();
|
||||
setdemointermissionpoint( spawnpoint.origin, spawnpoint.angles );
|
||||
level.usestartspawns = 0;
|
||||
level.teambased = 0;
|
||||
level.overrideteamscore = 1;
|
||||
level.rankenabled = 0;
|
||||
level.medalsenabled = 0;
|
||||
allowed[0] = "dm";
|
||||
maps\mp\gametypes\_gameobjects::main( allowed );
|
||||
maps\mp\gametypes\_spawning::create_map_placed_influencers();
|
||||
level.killcam = 0;
|
||||
level.finalkillcam = 0;
|
||||
level.killstreaksenabled = 0;
|
||||
startpregame();
|
||||
}
|
||||
|
||||
startpregame() //checked matches cerberus output
|
||||
startpregame()
|
||||
{
|
||||
game[ "strings" ][ "waiting_for_players" ] = &"MP_WAITING_FOR_X_PLAYERS";
|
||||
game[ "strings" ][ "pregame" ] = &"MP_PREGAME";
|
||||
game[ "strings" ][ "pregameover" ] = &"MP_MATCHSTARTING";
|
||||
game[ "strings" ][ "pregame_time_limit_reached" ] = &"MP_PREGAME_TIME_LIMIT";
|
||||
precachestring( game[ "strings" ][ "waiting_for_players" ] );
|
||||
precachestring( game[ "strings" ][ "pregame" ] );
|
||||
precachestring( game[ "strings" ][ "pregameover" ] );
|
||||
precachestring( game[ "strings" ][ "pregame_time_limit_reached" ] );
|
||||
thread pregamemain();
|
||||
game["strings"]["waiting_for_players"] = &"MP_WAITING_FOR_X_PLAYERS";
|
||||
game["strings"]["pregame"] = &"MP_PREGAME";
|
||||
game["strings"]["pregameover"] = &"MP_MATCHSTARTING";
|
||||
game["strings"]["pregame_time_limit_reached"] = &"MP_PREGAME_TIME_LIMIT";
|
||||
precachestring( game["strings"]["waiting_for_players"] );
|
||||
precachestring( game["strings"]["pregame"] );
|
||||
precachestring( game["strings"]["pregameover"] );
|
||||
precachestring( game["strings"]["pregame_time_limit_reached"] );
|
||||
thread pregamemain();
|
||||
}
|
||||
|
||||
onspawnplayerunified() //checked matches cerberus output
|
||||
onspawnplayerunified()
|
||||
{
|
||||
maps/mp/gametypes/_spawning::onspawnplayer_unified();
|
||||
maps\mp\gametypes\_spawning::onspawnplayer_unified();
|
||||
}
|
||||
|
||||
onspawnplayer( predictedspawn ) //checked matches cerberus output
|
||||
onspawnplayer( predictedspawn )
|
||||
{
|
||||
spawnpoints = maps/mp/gametypes/_spawnlogic::getteamspawnpoints( self.pers[ "team" ] );
|
||||
spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_dm( spawnpoints );
|
||||
if ( predictedspawn )
|
||||
{
|
||||
self predictspawnpoint( spawnpoint.origin, spawnpoint.angles );
|
||||
}
|
||||
else
|
||||
{
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles, "dm" );
|
||||
}
|
||||
spawnpoints = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( self.pers["team"] );
|
||||
spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_dm( spawnpoints );
|
||||
|
||||
if ( predictedspawn )
|
||||
self predictspawnpoint( spawnpoint.origin, spawnpoint.angles );
|
||||
else
|
||||
self spawn( spawnpoint.origin, spawnpoint.angles, "dm" );
|
||||
}
|
||||
|
||||
onplayerclasschange( response ) //checked matches cerberus output
|
||||
onplayerclasschange( response )
|
||||
{
|
||||
self.pregameclassresponse = response;
|
||||
self.pregameclassresponse = response;
|
||||
}
|
||||
|
||||
endpregame() //checked changed to match cerberus output
|
||||
endpregame()
|
||||
{
|
||||
level.pregame = 0;
|
||||
players = level.players;
|
||||
for ( index = 0; index < players.size; index++ )
|
||||
{
|
||||
player = players[ index ];
|
||||
player maps/mp/gametypes/_globallogic_player::freezeplayerforroundend();
|
||||
}
|
||||
setmatchtalkflag( "EveryoneHearsEveryone", 0 );
|
||||
level.pregameplayercount destroyelem();
|
||||
level.pregamesubtitle destroyelem();
|
||||
level.pregametitle destroyelem();
|
||||
level.pregame = 0;
|
||||
players = level.players;
|
||||
|
||||
for ( index = 0; index < players.size; index++ )
|
||||
{
|
||||
player = players[index];
|
||||
player maps\mp\gametypes\_globallogic_player::freezeplayerforroundend();
|
||||
}
|
||||
|
||||
setmatchtalkflag( "EveryoneHearsEveryone", 0 );
|
||||
level.pregameplayercount destroyelem();
|
||||
level.pregamesubtitle destroyelem();
|
||||
level.pregametitle destroyelem();
|
||||
}
|
||||
|
||||
getplayersneededcount() //checked changed to match cerberus output
|
||||
getplayersneededcount()
|
||||
{
|
||||
players = level.players;
|
||||
count = 0;
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
team = player.team;
|
||||
class = player.class;
|
||||
if ( team != "spectator" )
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return int( level.pregame_minplayers - count );
|
||||
players = level.players;
|
||||
count = 0;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
team = player.team;
|
||||
class = player.class;
|
||||
|
||||
if ( team != "spectator" )
|
||||
count++;
|
||||
}
|
||||
|
||||
return int( level.pregame_minplayers - count );
|
||||
}
|
||||
|
||||
saveplayerspregameinfo() //checked changed to match cerberus output
|
||||
saveplayerspregameinfo()
|
||||
{
|
||||
players = level.players;
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[ i ];
|
||||
team = player.team;
|
||||
class = player.pregameclassresponse;
|
||||
if ( isDefined( team ) && team != "" )
|
||||
{
|
||||
player setpregameteam( team );
|
||||
}
|
||||
if ( isDefined( class ) && class != "" )
|
||||
{
|
||||
player setpregameclass( class );
|
||||
}
|
||||
}
|
||||
players = level.players;
|
||||
|
||||
for ( i = 0; i < players.size; i++ )
|
||||
{
|
||||
player = players[i];
|
||||
team = player.team;
|
||||
class = player.pregameclassresponse;
|
||||
|
||||
if ( isdefined( team ) && team != "" )
|
||||
player setpregameteam( team );
|
||||
|
||||
if ( isdefined( class ) && class != "" )
|
||||
player setpregameclass( class );
|
||||
}
|
||||
}
|
||||
|
||||
pregamemain() //checked did not reference cerberus output used beta dump _pregame.gsc as a reference
|
||||
pregamemain()
|
||||
{
|
||||
level endon( "game_ended" );
|
||||
green = ( 0.6, 0.9, 0.6 );
|
||||
red = ( 0.7, 0.3, 0.2 );
|
||||
yellow = ( 1, 1, 0 );
|
||||
white = ( 1, 1, 1 );
|
||||
titlesize = 3;
|
||||
textsize = 2;
|
||||
iconsize = 70;
|
||||
spacing = 30;
|
||||
font = "objective";
|
||||
level.pregametitle = createserverfontstring( font, titlesize );
|
||||
level.pregametitle setpoint( "TOP", undefined, 0, 70 );
|
||||
level.pregametitle.glowalpha = 1;
|
||||
level.pregametitle.foreground = 1;
|
||||
level.pregametitle.hidewheninmenu = 1;
|
||||
level.pregametitle.archived = 0;
|
||||
level.pregametitle settext( game[ "strings" ][ "pregame" ] );
|
||||
level.pregametitle.color = red;
|
||||
level.pregamesubtitle = createserverfontstring( font, 2 );
|
||||
level.pregamesubtitle setparent( level.pregametitle );
|
||||
level.pregamesubtitle setpoint( "TOP", "BOTTOM", 0, 0 );
|
||||
level.pregamesubtitle.glowalpha = 1;
|
||||
level.pregamesubtitle.foreground = 0;
|
||||
level.pregamesubtitle.hidewheninmenu = 1;
|
||||
level.pregamesubtitle.archived = 1;
|
||||
level.pregamesubtitle settext( game[ "strings" ][ "waiting_for_players" ] );
|
||||
level.pregamesubtitle.color = green;
|
||||
level.pregameplayercount = createserverfontstring( font, 2.2 );
|
||||
level.pregameplayercount setparent( level.pregametitle );
|
||||
level.pregameplayercount setpoint( "TOP", "BOTTOM", -11, 0 );
|
||||
level.pregamesubtitle.glowalpha = 1;
|
||||
level.pregameplayercount.sort = 1001;
|
||||
level.pregameplayercount.foreground = 0;
|
||||
level.pregameplayercount.hidewheninmenu = 1;
|
||||
level.pregameplayercount.archived = 1;
|
||||
level.pregameplayercount.color = yellow;
|
||||
level.pregameplayercount maps/mp/gametypes/_hud::fontpulseinit();
|
||||
oldcount = -1;
|
||||
minplayers = getDvarInt( "party_minplayers" );
|
||||
for(;;)
|
||||
{
|
||||
wait( 1 );
|
||||
|
||||
//count = GetPlayersNeededCount();
|
||||
cur_playercount = getPlayers().size;
|
||||
amount_needed = minplayers - cur_playercount;
|
||||
if ( amount_needed <= 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
/*
|
||||
/#
|
||||
if ( GetDvarint( "scr_pregame_abort" ) > 0 )
|
||||
{
|
||||
SetDvar( "scr_pregame_abort", 0 );
|
||||
break;
|
||||
}
|
||||
level endon( "game_ended" );
|
||||
green = ( 0.6, 0.9, 0.6 );
|
||||
red = ( 0.7, 0.3, 0.2 );
|
||||
yellow = ( 1, 1, 0 );
|
||||
white = ( 1, 1, 1 );
|
||||
titlesize = 3.0;
|
||||
textsize = 2.0;
|
||||
iconsize = 70;
|
||||
spacing = 30;
|
||||
font = "objective";
|
||||
level.pregametitle = createserverfontstring( font, titlesize );
|
||||
level.pregametitle setpoint( "TOP", undefined, 0, 70 );
|
||||
level.pregametitle.glowalpha = 1;
|
||||
level.pregametitle.foreground = 1;
|
||||
level.pregametitle.hidewheninmenu = 1;
|
||||
level.pregametitle.archived = 0;
|
||||
level.pregametitle settext( game["strings"]["pregame"] );
|
||||
level.pregametitle.color = red;
|
||||
level.pregamesubtitle = createserverfontstring( font, 2.0 );
|
||||
level.pregamesubtitle setparent( level.pregametitle );
|
||||
level.pregamesubtitle setpoint( "TOP", "BOTTOM", 0, 0 );
|
||||
level.pregamesubtitle.glowalpha = 1;
|
||||
level.pregamesubtitle.foreground = 0;
|
||||
level.pregamesubtitle.hidewheninmenu = 1;
|
||||
level.pregamesubtitle.archived = 1;
|
||||
level.pregamesubtitle settext( game["strings"]["waiting_for_players"] );
|
||||
level.pregamesubtitle.color = green;
|
||||
level.pregameplayercount = createserverfontstring( font, 2.2 );
|
||||
level.pregameplayercount setparent( level.pregametitle );
|
||||
level.pregameplayercount setpoint( "TOP", "BOTTOM", -11, 0 );
|
||||
level.pregamesubtitle.glowalpha = 1;
|
||||
level.pregameplayercount.sort = 1001;
|
||||
level.pregameplayercount.foreground = 0;
|
||||
level.pregameplayercount.hidewheninmenu = 1;
|
||||
level.pregameplayercount.archived = 1;
|
||||
level.pregameplayercount.color = yellow;
|
||||
level.pregameplayercount maps\mp\gametypes\_hud::fontpulseinit();
|
||||
oldcount = -1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
wait 1;
|
||||
count = getplayersneededcount();
|
||||
|
||||
if ( 0 >= count )
|
||||
break;
|
||||
|
||||
/#
|
||||
if ( getdvarint( "scr_pregame_abort" ) > 0 )
|
||||
{
|
||||
setdvar( "scr_pregame_abort", 0 );
|
||||
break;
|
||||
}
|
||||
#/
|
||||
*/
|
||||
if ( oldcount != amount_needed )
|
||||
{
|
||||
level.pregamePlayerCount setValue( amount_needed );
|
||||
level.pregamePlayerCount thread maps\mp\gametypes\_hud::fontPulse( level );
|
||||
oldcount = amount_needed;
|
||||
}
|
||||
}
|
||||
level.pregameplayercount settext( "" );
|
||||
level.pregamesubtitle settext( game[ "strings" ][ "pregameover" ] );
|
||||
players = level.players;
|
||||
for ( index = 0; index < players.size; index++ )
|
||||
{
|
||||
player = players[ index ];
|
||||
player maps/mp/gametypes/_globallogic_player::freezeplayerforroundend();
|
||||
player maps/mp/gametypes/_globallogic_ui::freegameplayhudelems();
|
||||
}
|
||||
visionsetnaked( "mpIntro", 3 );
|
||||
wait 4;
|
||||
endpregame();
|
||||
//pregamestartgame();
|
||||
saveplayerspregameinfo();
|
||||
map_restart( 0 );
|
||||
|
||||
if ( oldcount != count )
|
||||
{
|
||||
level.pregameplayercount setvalue( count );
|
||||
level.pregameplayercount thread maps\mp\gametypes\_hud::fontpulse( level );
|
||||
oldcount = count;
|
||||
}
|
||||
}
|
||||
|
||||
level.pregameplayercount settext( "" );
|
||||
level.pregamesubtitle settext( game["strings"]["pregameover"] );
|
||||
players = level.players;
|
||||
|
||||
for ( index = 0; index < players.size; index++ )
|
||||
{
|
||||
player = players[index];
|
||||
player maps\mp\gametypes\_globallogic_player::freezeplayerforroundend();
|
||||
player maps\mp\gametypes\_globallogic_ui::freegameplayhudelems();
|
||||
}
|
||||
|
||||
visionsetnaked( "mpIntro", 3 );
|
||||
wait 4;
|
||||
endpregame();
|
||||
pregamestartgame();
|
||||
saveplayerspregameinfo();
|
||||
map_restart( 0 );
|
||||
}
|
||||
|
||||
onendgame( winner ) //checked matches cerberus output
|
||||
onendgame( winner )
|
||||
{
|
||||
endpregame();
|
||||
endpregame();
|
||||
}
|
||||
|
||||
ontimelimit() //checked changed to match cerberus output
|
||||
ontimelimit()
|
||||
{
|
||||
winner = undefined;
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps/mp/gametypes/_globallogic_utils::logteamwinstring( "time limit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps/mp/gametypes/_globallogic_score::gethighestscoringplayer();
|
||||
if ( isDefined( winner ) )
|
||||
{
|
||||
logstring( "time limit, win: " + winner.name );
|
||||
}
|
||||
else
|
||||
{
|
||||
logstring( "time limit, tie" );
|
||||
}
|
||||
}
|
||||
makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "pregame_time_limit_reached" ] );
|
||||
setdvar( "ui_text_endreason", game[ "strings" ][ "time_limit_reached" ] );
|
||||
thread maps/mp/gametypes/_globallogic::endgame( winner, game[ "strings" ][ "pregame_time_limit_reached" ] );
|
||||
winner = undefined;
|
||||
|
||||
if ( level.teambased )
|
||||
{
|
||||
winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "teamScores" );
|
||||
maps\mp\gametypes\_globallogic_utils::logteamwinstring( "time limit", winner );
|
||||
}
|
||||
else
|
||||
{
|
||||
winner = maps\mp\gametypes\_globallogic_score::gethighestscoringplayer();
|
||||
|
||||
if ( isdefined( winner ) )
|
||||
logstring( "time limit, win: " + winner.name );
|
||||
else
|
||||
logstring( "time limit, tie" );
|
||||
}
|
||||
|
||||
makedvarserverinfo( "ui_text_endreason", game["strings"]["pregame_time_limit_reached"] );
|
||||
setdvar( "ui_text_endreason", game["strings"]["time_limit_reached"] );
|
||||
thread maps\mp\gametypes\_globallogic::endgame( winner, game["strings"]["pregame_time_limit_reached"] );
|
||||
}
|
||||
|
||||
get_pregame_class() //checked matches cerberus output
|
||||
get_pregame_class()
|
||||
{
|
||||
pclass = self getpregameclass();
|
||||
if ( isDefined( pclass ) && pclass[ 0 ] != "" )
|
||||
{
|
||||
return pclass;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "smg_mp,0";
|
||||
}
|
||||
}
|
||||
pclass = self getpregameclass();
|
||||
|
||||
if ( isdefined( pclass ) && pclass[0] != "" )
|
||||
return pclass;
|
||||
else
|
||||
return "smg_mp,0";
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user