[MP] Added remaining MP GSCs.

This commit is contained in:
JezuzLizard
2022-03-08 06:51:12 -08:00
parent 0d8e9c835a
commit 8ccce7f949
217 changed files with 93508 additions and 100413 deletions

View File

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

View File

@ -0,0 +1,3 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 )
{
}

View File

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

View File

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

View File

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

View File

@ -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 shouldn’t 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 );
}
}
}
}
#/
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,7 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
init() //checked matches cerberus output
init()
{
}

View File

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

View File

@ -1,4 +1,7 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
init() //checked matches cerberus output
init()
{
}

View File

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

View File

@ -1,5 +1,7 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
pcserver() //checked matches cerberus output
pcserver()
{
pcserverupdateplaylist();
pcserverupdateplaylist();
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 )
{
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,2 @@
// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool

View File

@ -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 ) )

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 )
{
}
}

View File

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